/ Hex Artifact Content
Login

Artifact cbe8ddffbcec7ce86f7a800fe8fd10aee412c76c87e0dd3732a1682e68d74cd9:


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: 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  Src->fg.jointype
5130: 20 26 20 4a 54 5f 4c 45 46 54 29 20 0a 20 20 20   & JT_LEFT) .   
5140: 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
5150: 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72  rty(pTerm->pExpr
5160: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20  , EP_FromJoin). 
5170: 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70    && (pTerm->eOp
5180: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 29 0a  erator & WO_IS).
5190: 20 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 6e 6e    ){.    /* Cann
51a0: 6f 74 20 75 73 65 20 61 6e 20 49 53 20 74 65 72  ot use an IS ter
51b0: 6d 20 66 72 6f 6d 20 74 68 65 20 57 48 45 52 45  m from the WHERE
51c0: 20 63 6c 61 75 73 65 20 61 73 20 61 6e 20 69 6e   clause as an in
51d0: 64 65 78 20 64 72 69 76 65 72 20 66 6f 72 0a 20  dex driver for. 
51e0: 20 20 20 2a 2a 20 74 68 65 20 52 48 53 20 6f 66     ** the RHS of
51f0: 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 53 75   a LEFT JOIN. Su
5200: 63 68 20 61 20 74 65 72 6d 20 63 61 6e 20 6f 6e  ch a term can on
5210: 6c 79 20 62 65 20 75 73 65 64 20 69 66 20 69 74  ly be used if it
5220: 20 69 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20   is from.    ** 
5230: 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20  the ON clause.  
5240: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  */.    return 0;
5250: 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 54 65 72  .  }.  if( (pTer
5260: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
5270: 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20   notReady)!=0 ) 
5280: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
5290: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
52a0: 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 30  umn<0 ) return 0
52b0: 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d 3e  ;.  aff = pSrc->
52c0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d  pTab->aCol[pTerm
52d0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e  ->u.leftColumn].
52e0: 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20  affinity;.  if( 
52f0: 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66  !sqlite3IndexAff
5300: 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70  inityOk(pTerm->p
5310: 45 78 70 72 2c 20 61 66 66 29 20 29 20 72 65 74  Expr, aff) ) ret
5320: 75 72 6e 20 30 3b 0a 20 20 74 65 73 74 63 61 73  urn 0;.  testcas
5330: 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  e( pTerm->pExpr-
5340: 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20  >op==TK_IS );.  
5350: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
5360: 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  if...#ifndef SQL
5370: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
5380: 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 47  IC_INDEX./*.** G
5390: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
53a0: 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e  construct the In
53b0: 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 61  dex object for a
53c0: 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
53d0: 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74 20  x.** and to set 
53e0: 75 70 20 74 68 65 20 57 68 65 72 65 4c 65 76 65  up the WhereLeve
53f0: 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c 20  l object pLevel 
5400: 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 64 65  so that the code
5410: 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d 61   generator.** ma
5420: 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65 20 61  kes use of the a
5430: 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 0a  utomatic index..
5440: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
5450: 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69  onstructAutomati
5460: 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  cIndex(.  Parse 
5470: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
5480: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
5490: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
54a0: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
54b0: 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC,           /*
54c0: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
54d0: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
54e0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
54f0: 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63  ,  /* The FROM c
5500: 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 67 65  lause term to ge
5510: 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65 78  t the next index
5520: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
5530: 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20  tReady,         
5540: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72    /* Mask of cur
5550: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
5560: 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20  t available */. 
5570: 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
5580: 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  vel          /* 
5590: 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65 78 20  Write new index 
55a0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
55b0: 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20   nKeyCol;       
55c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
55d0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
55e0: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65 64   the constructed
55f0: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72   index */.  Wher
5600: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
5610: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
5620: 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
5630: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
5640: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43    WhereTerm *pWC
5650: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  End;          /*
5660: 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d   End of pWC->a[]
5670: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
5680: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
5690: 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73 63    /* Object desc
56a0: 72 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e 73  ribing the trans
56b0: 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ient index */.  
56c0: 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
56d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
56e0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
56f0: 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  t under construc
5700: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64  tion */.  int ad
5710: 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  drInit;         
5720: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
5730: 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c 69   of the initiali
5740: 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a 75  zation bypass ju
5750: 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  mp */.  Table *p
5760: 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20  Table;          
5770: 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
5780: 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 2a   being indexed *
5790: 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b  /.  int addrTop;
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57b0: 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69 6e  /* Top of the in
57c0: 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f  dex fill loop */
57d0: 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
57e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
57f0: 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
5800: 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63 6f  ng an index reco
5810: 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  rd */.  int n;  
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5830: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f      /* Column co
5840: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  unter */.  int i
5850: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5860: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
5870: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
5880: 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20 20  mxBitCol;       
5890: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
58a0: 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53 72  um column in pSr
58b0: 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20 20  c->colUsed */.  
58c0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
58e0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
58f0: 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  e to on a column
5900: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
5910: 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20  *pLoop;         
5920: 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f 62    /* The Loop ob
5930: 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ject */.  char *
5940: 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20  zNotUsed;       
5950: 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 73        /* Extra s
5960: 70 61 63 65 20 6f 6e 20 74 68 65 20 65 6e 64 20  pace on the end 
5970: 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20 42 69 74  of pIdx */.  Bit
5980: 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20 20  mask idxCols;   
5990: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d           /* Bitm
59a0: 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75 73  ap of columns us
59b0: 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67 20  ed for indexing 
59c0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74  */.  Bitmask ext
59d0: 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20  raCols;         
59e0: 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61 64   /* Bitmap of ad
59f0: 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73  ditional columns
5a00: 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57 61 72   */.  u8 sentWar
5a10: 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20 20 20 20  ning = 0;       
5a20: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 77    /* True if a w
5a30: 61 72 6e 6e 69 6e 67 20 68 61 73 20 62 65 65 6e  arnning has been
5a40: 20 69 73 73 75 65 64 20 2a 2f 0a 20 20 45 78 70   issued */.  Exp
5a50: 72 20 2a 70 50 61 72 74 69 61 6c 20 3d 20 30 3b  r *pPartial = 0;
5a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 74           /* Part
5a70: 69 61 6c 20 49 6e 64 65 78 20 45 78 70 72 65 73  ial Index Expres
5a80: 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43  sion */.  int iC
5a90: 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 20 20 20 20  ontinue = 0;    
5aa0: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
5ab0: 72 65 20 74 6f 20 73 6b 69 70 20 65 78 63 6c 75  re to skip exclu
5ac0: 64 65 64 20 72 6f 77 73 20 2a 2f 0a 20 20 73 74  ded rows */.  st
5ad0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
5ae0: 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a  m *pTabItem;  /*
5af0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
5b00: 6d 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20  m being indexed 
5b10: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 75  */.  int addrCou
5b20: 6e 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  nter = 0;       
5b30: 20 2f 2a 20 41 64 64 72 65 73 73 20 77 68 65 72   /* Address wher
5b40: 65 20 69 6e 74 65 67 65 72 20 63 6f 75 6e 74 65  e integer counte
5b50: 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  r is initialized
5b60: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61 73   */.  int regBas
5b70: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
5b80: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72 65    /* Array of re
5b90: 67 69 73 74 65 72 73 20 77 68 65 72 65 20 72 65  gisters where re
5ba0: 63 6f 72 64 20 69 73 20 61 73 73 65 6d 62 6c 65  cord is assemble
5bb0: 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  d */..  /* Gener
5bc0: 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69 70  ate code to skip
5bd0: 20 6f 76 65 72 20 74 68 65 20 63 72 65 61 74 69   over the creati
5be0: 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  on and initializ
5bf0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a  ation of the.  *
5c00: 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65  * transient inde
5c10: 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75 62  x on 2nd and sub
5c20: 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69 6f  sequent iteratio
5c30: 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  ns of the loop. 
5c40: 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  */.  v = pParse-
5c50: 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
5c60: 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64 72  ( v!=0 );.  addr
5c70: 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Init = sqlite3Vd
5c80: 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4f  beAddOp0(v, OP_O
5c90: 6e 63 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61  nce); VdbeCovera
5ca0: 67 65 28 76 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75  ge(v);..  /* Cou
5cb0: 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
5cc0: 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69   columns that wi
5cd0: 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  ll be added to t
5ce0: 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 61 6e  he index.  ** an
5cf0: 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63 68 20  d used to match 
5d00: 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
5d10: 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 6e 4b  straints */.  nK
5d20: 65 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61  eyCol = 0;.  pTa
5d30: 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61 62  ble = pSrc->pTab
5d40: 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57  ;.  pWCEnd = &pW
5d50: 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d  C->a[pWC->nTerm]
5d60: 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76  ;.  pLoop = pLev
5d70: 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 69 64  el->pWLoop;.  id
5d80: 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72  xCols = 0;.  for
5d90: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
5da0: 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
5db0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  rm++){.    Expr 
5dc0: 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
5dd0: 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72  pExpr;.    asser
5de0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
5df0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
5e00: 6f 6d 4a 6f 69 6e 29 20 20 20 20 2f 2a 20 70 72  omJoin)    /* pr
5e10: 65 72 65 71 20 61 6c 77 61 79 73 20 6e 6f 6e 2d  ereq always non-
5e20: 7a 65 72 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20  zero */.        
5e30: 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69 67 68   || pExpr->iRigh
5e40: 74 4a 6f 69 6e 54 61 62 6c 65 21 3d 70 53 72 63  tJoinTable!=pSrc
5e50: 2d 3e 69 43 75 72 73 6f 72 20 20 20 2f 2a 20 20  ->iCursor   /*  
5e60: 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 68   for the right-h
5e70: 61 6e 64 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  and   */.       
5e80: 20 20 7c 7c 20 70 4c 6f 6f 70 2d 3e 70 72 65 72    || pLoop->prer
5e90: 65 71 21 3d 30 20 29 3b 20 20 20 20 20 20 20 20  eq!=0 );        
5ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5eb0: 20 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46    table of a LEF
5ec0: 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 20 20 69 66  T JOIN */.    if
5ed0: 28 20 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 3d  ( pLoop->prereq=
5ee0: 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72  =0.     && (pTer
5ef0: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
5f00: 4d 5f 56 49 52 54 55 41 4c 29 3d 3d 30 0a 20 20  M_VIRTUAL)==0.  
5f10: 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
5f20: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
5f30: 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20 20 20  _FromJoin).     
5f40: 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
5f50: 54 61 62 6c 65 43 6f 6e 73 74 61 6e 74 28 70 45  TableConstant(pE
5f60: 78 70 72 2c 20 70 53 72 63 2d 3e 69 43 75 72 73  xpr, pSrc->iCurs
5f70: 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  or) ){.      pPa
5f80: 72 74 69 61 6c 20 3d 20 73 71 6c 69 74 65 33 45  rtial = sqlite3E
5f90: 78 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64  xprAnd(pParse->d
5fa0: 62 2c 20 70 50 61 72 74 69 61 6c 2c 0a 20 20 20  b, pPartial,.   
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
5fd0: 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
5fe0: 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30  se->db, pExpr, 0
5ff0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
6000: 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e  ( termCanDriveIn
6010: 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c  dex(pTerm, pSrc,
6020: 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20   notReady) ){.  
6030: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70      int iCol = p
6040: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
6050: 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  mn;.      Bitmas
6060: 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d  k cMask = iCol>=
6070: 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d  BMS ? MASKBIT(BM
6080: 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54 28 69  S-1) : MASKBIT(i
6090: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Col);.      test
60a0: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20  case( iCol==BMS 
60b0: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
60c0: 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e( iCol==BMS-1 )
60d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 65 6e  ;.      if( !sen
60e0: 74 57 61 72 6e 69 6e 67 20 29 7b 0a 20 20 20 20  tWarning ){.    
60f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
6100: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41  SQLITE_WARNING_A
6110: 55 54 4f 49 4e 44 45 58 2c 0a 20 20 20 20 20 20  UTOINDEX,.      
6120: 20 20 20 20 20 20 22 61 75 74 6f 6d 61 74 69 63        "automatic
6130: 20 69 6e 64 65 78 20 6f 6e 20 25 73 28 25 73 29   index on %s(%s)
6140: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
6150: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 54  ,.            pT
6160: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  able->aCol[iCol]
6170: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
6180: 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20 31   sentWarning = 1
6190: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
61a0: 69 66 28 20 28 69 64 78 43 6f 6c 73 20 26 20 63  if( (idxCols & c
61b0: 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
61c0: 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f      if( whereLoo
61d0: 70 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e  pResize(pParse->
61e0: 64 62 2c 20 70 4c 6f 6f 70 2c 20 6e 4b 65 79 43  db, pLoop, nKeyC
61f0: 6f 6c 2b 31 29 20 29 7b 0a 20 20 20 20 20 20 20  ol+1) ){.       
6200: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 75 74 6f     goto end_auto
6210: 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b 0a 20  _index_create;. 
6220: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6230: 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6e   pLoop->aLTerm[n
6240: 4b 65 79 43 6f 6c 2b 2b 5d 20 3d 20 70 54 65 72  KeyCol++] = pTer
6250: 6d 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f  m;.        idxCo
6260: 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20  ls |= cMask;.   
6270: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
6280: 20 61 73 73 65 72 74 28 20 6e 4b 65 79 43 6f 6c   assert( nKeyCol
6290: 3e 30 20 29 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 75  >0 );.  pLoop->u
62a0: 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 70 4c 6f  .btree.nEq = pLo
62b0: 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6e 4b 65  op->nLTerm = nKe
62c0: 79 43 6f 6c 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77  yCol;.  pLoop->w
62d0: 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43  sFlags = WHERE_C
62e0: 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52 45  OLUMN_EQ | WHERE
62f0: 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52  _IDX_ONLY | WHER
6300: 45 5f 49 4e 44 45 58 45 44 0a 20 20 20 20 20 20  E_INDEXED.      
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
6320: 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
6330: 58 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  X;..  /* Count t
6340: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64  he number of add
6350: 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
6360: 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65  needed to create
6370: 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67   a.  ** covering
6380: 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65   index.  A "cove
6390: 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61  ring index" is a
63a0: 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  n index that con
63b0: 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63  tains all.  ** c
63c0: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20  olumns that are 
63d0: 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75  needed by the qu
63e0: 65 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76  ery.  With a cov
63f0: 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65  ering index, the
6400: 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
6410: 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73  able never needs
6420: 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e   to be accessed.
6430: 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69    Automatic indi
6440: 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ces must.  ** be
6450: 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
6460: 78 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e  x because the in
6470: 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  dex will not be 
6480: 75 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20  updated if the. 
6490: 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62   ** original tab
64a0: 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74  le changes and t
64b0: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  he index and tab
64c0: 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62  le cannot both b
64d0: 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74  e used.  ** if t
64e0: 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79  hey go out of sy
64f0: 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61  nc..  */.  extra
6500: 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c  Cols = pSrc->col
6510: 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73  Used & (~idxCols
6520: 20 7c 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   | MASKBIT(BMS-1
6530: 29 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d  ));.  mxBitCol =
6540: 20 4d 49 4e 28 42 4d 53 2d 31 2c 70 54 61 62 6c   MIN(BMS-1,pTabl
6550: 65 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 74 65 73 74  e->nCol);.  test
6560: 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43  case( pTable->nC
6570: 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74  ol==BMS-1 );.  t
6580: 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d  estcase( pTable-
6590: 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a  >nCol==BMS-2 );.
65a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42    for(i=0; i<mxB
65b0: 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  itCol; i++){.   
65c0: 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26   if( extraCols &
65d0: 20 4d 41 53 4b 42 49 54 28 69 29 20 29 20 6e 4b   MASKBIT(i) ) nK
65e0: 65 79 43 6f 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 69  eyCol++;.  }.  i
65f0: 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  f( pSrc->colUsed
6600: 20 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   & MASKBIT(BMS-1
6610: 29 20 29 7b 0a 20 20 20 20 6e 4b 65 79 43 6f 6c  ) ){.    nKeyCol
6620: 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c   += pTable->nCol
6630: 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a   - BMS + 1;.  }.
6640: 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20  .  /* Construct 
6650: 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  the Index object
6660: 20 74 6f 20 64 65 73 63 72 69 62 65 20 74 68 69   to describe thi
6670: 73 20 69 6e 64 65 78 20 2a 2f 0a 20 20 70 49 64  s index */.  pId
6680: 78 20 3d 20 73 71 6c 69 74 65 33 41 6c 6c 6f 63  x = sqlite3Alloc
6690: 61 74 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 70  ateIndexObject(p
66a0: 50 61 72 73 65 2d 3e 64 62 2c 20 6e 4b 65 79 43  Parse->db, nKeyC
66b0: 6f 6c 2b 31 2c 20 30 2c 20 26 7a 4e 6f 74 55 73  ol+1, 0, &zNotUs
66c0: 65 64 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d  ed);.  if( pIdx=
66d0: 3d 30 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 75  =0 ) goto end_au
66e0: 74 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3b  to_index_create;
66f0: 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  .  pLoop->u.btre
6700: 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b  e.pIndex = pIdx;
6710: 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3d  .  pIdx->zName =
6720: 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a 20   "auto-index";. 
6730: 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20 3d 20   pIdx->pTable = 
6740: 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b  pTable;.  n = 0;
6750: 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a  .  idxCols = 0;.
6760: 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d    for(pTerm=pWC-
6770: 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64  >a; pTerm<pWCEnd
6780: 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
6790: 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
67a0: 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
67b0: 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a  c, notReady) ){.
67c0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
67d0: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
67e0: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d  lumn;.      Bitm
67f0: 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c  ask cMask = iCol
6800: 3e 3d 42 4d 53 20 3f 20 4d 41 53 4b 42 49 54 28  >=BMS ? MASKBIT(
6810: 42 4d 53 2d 31 29 20 3a 20 4d 41 53 4b 42 49 54  BMS-1) : MASKBIT
6820: 28 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 74 65  (iCol);.      te
6830: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
6840: 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
6850: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
6860: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69   );.      if( (i
6870: 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d  dxCols & cMask)=
6880: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  =0 ){.        Ex
6890: 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e  pr *pX = pTerm->
68a0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
68b0: 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b  dxCols |= cMask;
68c0: 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61  .        pIdx->a
68d0: 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65  iColumn[n] = pTe
68e0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
68f0: 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20  ;.        pColl 
6900: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
6910: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
6920: 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c  arse, pX->pLeft,
6930: 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20   pX->pRight);.  
6940: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f        pIdx->azCo
6950: 6c 6c 5b 6e 5d 20 3d 20 70 43 6f 6c 6c 20 3f 20  ll[n] = pColl ? 
6960: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 73  pColl->zName : s
6970: 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b  qlite3StrBINARY;
6980: 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  .        n++;.  
6990: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
69a0: 20 20 61 73 73 65 72 74 28 20 28 75 33 32 29 6e    assert( (u32)n
69b0: 3d 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  ==pLoop->u.btree
69c0: 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64  .nEq );..  /* Ad
69d0: 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c  d additional col
69e0: 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d  umns needed to m
69f0: 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ake the automati
6a00: 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a  c index into.  *
6a10: 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  * a covering ind
6a20: 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ex */.  for(i=0;
6a30: 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
6a40: 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
6a50: 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49 54 28 69  Cols & MASKBIT(i
6a60: 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d  ) ){.      pIdx-
6a70: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69  >aiColumn[n] = i
6a80: 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a  ;.      pIdx->az
6a90: 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65  Coll[n] = sqlite
6aa0: 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20  3StrBINARY;.    
6ab0: 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    n++;.    }.  }
6ac0: 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c  .  if( pSrc->col
6ad0: 55 73 65 64 20 26 20 4d 41 53 4b 42 49 54 28 42  Used & MASKBIT(B
6ae0: 4d 53 2d 31 29 20 29 7b 0a 20 20 20 20 66 6f 72  MS-1) ){.    for
6af0: 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54 61 62  (i=BMS-1; i<pTab
6b00: 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  le->nCol; i++){.
6b10: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
6b20: 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20  lumn[n] = i;.   
6b30: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
6b40: 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  n] = sqlite3StrB
6b50: 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 6e 2b 2b  INARY;.      n++
6b60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
6b70: 73 65 72 74 28 20 6e 3d 3d 6e 4b 65 79 43 6f 6c  sert( n==nKeyCol
6b80: 20 29 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f   );.  pIdx->aiCo
6b90: 6c 75 6d 6e 5b 6e 5d 20 3d 20 58 4e 5f 52 4f 57  lumn[n] = XN_ROW
6ba0: 49 44 3b 0a 20 20 70 49 64 78 2d 3e 61 7a 43 6f  ID;.  pIdx->azCo
6bb0: 6c 6c 5b 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53  ll[n] = sqlite3S
6bc0: 74 72 42 49 4e 41 52 59 3b 0a 0a 20 20 2f 2a 20  trBINARY;..  /* 
6bd0: 43 72 65 61 74 65 20 74 68 65 20 61 75 74 6f 6d  Create the autom
6be0: 61 74 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20  atic index */.  
6bf0: 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
6c00: 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20 20  iIdxCur>=0 );.  
6c10: 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
6c20: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
6c30: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
6c40: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
6c50: 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65  Autoindex, pLeve
6c60: 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 4b 65 79  l->iIdxCur, nKey
6c70: 43 6f 6c 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  Col+1);.  sqlite
6c80: 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66  3VdbeSetP4KeyInf
6c90: 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b  o(pParse, pIdx);
6ca0: 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28  .  VdbeComment((
6cb0: 76 2c 20 22 66 6f 72 20 25 73 22 2c 20 70 54 61  v, "for %s", pTa
6cc0: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20  ble->zName));.. 
6cd0: 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20 61 75 74   /* Fill the aut
6ce0: 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 77 69 74  omatic index wit
6cf0: 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 73  h content */.  s
6d00: 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50  qlite3ExprCacheP
6d10: 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 70  ush(pParse);.  p
6d20: 54 61 62 49 74 65 6d 20 3d 20 26 70 57 43 2d 3e  TabItem = &pWC->
6d30: 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
6d40: 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
6d50: 6d 5d 3b 0a 20 20 69 66 28 20 70 54 61 62 49 74  m];.  if( pTabIt
6d60: 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74  em->fg.viaCorout
6d70: 69 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ine ){.    int r
6d80: 65 67 59 69 65 6c 64 20 3d 20 70 54 61 62 49 74  egYield = pTabIt
6d90: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20  em->regReturn;. 
6da0: 20 20 20 61 64 64 72 43 6f 75 6e 74 65 72 20 3d     addrCounter =
6db0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6dc0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
6dd0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
6de0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6df0: 2c 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69  , OP_InitCorouti
6e00: 6e 65 2c 20 72 65 67 59 69 65 6c 64 2c 20 30 2c  ne, regYield, 0,
6e10: 20 70 54 61 62 49 74 65 6d 2d 3e 61 64 64 72 46   pTabItem->addrF
6e20: 69 6c 6c 53 75 62 29 3b 0a 20 20 20 20 61 64 64  illSub);.    add
6e30: 72 54 6f 70 20 3d 20 20 73 71 6c 69 74 65 33 56  rTop =  sqlite3V
6e40: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
6e50: 59 69 65 6c 64 2c 20 72 65 67 59 69 65 6c 64 29  Yield, regYield)
6e60: 3b 0a 20 20 20 20 56 64 62 65 43 6f 76 65 72 61  ;.    VdbeCovera
6e70: 67 65 28 76 29 3b 0a 20 20 20 20 56 64 62 65 43  ge(v);.    VdbeC
6e80: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74  omment((v, "next
6e90: 20 72 6f 77 20 6f 66 20 5c 22 25 73 5c 22 22 2c   row of \"%s\"",
6ea0: 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d   pTabItem->pTab-
6eb0: 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73  >zName));.  }els
6ec0: 65 7b 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d  e{.    addrTop =
6ed0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6ee0: 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c  p1(v, OP_Rewind,
6ef0: 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
6f00: 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
6f10: 76 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  v);.  }.  if( pP
6f20: 61 72 74 69 61 6c 20 29 7b 0a 20 20 20 20 69 43  artial ){.    iC
6f30: 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65  ontinue = sqlite
6f40: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
6f50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
6f60: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
6f70: 2c 20 70 50 61 72 74 69 61 6c 2c 20 69 43 6f 6e  , pPartial, iCon
6f80: 74 69 6e 75 65 2c 20 53 51 4c 49 54 45 5f 4a 55  tinue, SQLITE_JU
6f90: 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70  MPIFNULL);.    p
6fa0: 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  Loop->wsFlags |=
6fb0: 20 57 48 45 52 45 5f 50 41 52 54 49 41 4c 49 44   WHERE_PARTIALID
6fc0: 58 3b 0a 20 20 7d 0a 20 20 72 65 67 52 65 63 6f  X;.  }.  regReco
6fd0: 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  rd = sqlite3GetT
6fe0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
6ff0: 20 20 72 65 67 42 61 73 65 20 3d 20 73 71 6c 69    regBase = sqli
7000: 74 65 33 47 65 6e 65 72 61 74 65 49 6e 64 65 78  te3GenerateIndex
7010: 4b 65 79 28 0a 20 20 20 20 20 20 70 50 61 72 73  Key(.      pPars
7020: 65 2c 20 70 49 64 78 2c 20 70 4c 65 76 65 6c 2d  e, pIdx, pLevel-
7030: 3e 69 54 61 62 43 75 72 2c 20 72 65 67 52 65 63  >iTabCur, regRec
7040: 6f 72 64 2c 20 30 2c 20 30 2c 20 30 2c 20 30 0a  ord, 0, 0, 0, 0.
7050: 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64    );.  sqlite3Vd
7060: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
7070: 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c  dxInsert, pLevel
7080: 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65  ->iIdxCur, regRe
7090: 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
70a0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
70b0: 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
70c0: 53 55 4c 54 29 3b 0a 20 20 69 66 28 20 70 50 61  SULT);.  if( pPa
70d0: 72 74 69 61 6c 20 29 20 73 71 6c 69 74 65 33 56  rtial ) sqlite3V
70e0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
70f0: 76 2c 20 69 43 6f 6e 74 69 6e 75 65 29 3b 0a 20  v, iContinue);. 
7100: 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66   if( pTabItem->f
7110: 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29  g.viaCoroutine )
7120: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
7130: 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64  eChangeP2(v, add
7140: 72 43 6f 75 6e 74 65 72 2c 20 72 65 67 42 61 73  rCounter, regBas
7150: 65 2b 6e 29 3b 0a 20 20 20 20 74 65 73 74 63 61  e+n);.    testca
7160: 73 65 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  se( pParse->db->
7170: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
7180: 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43 6f 6c      translateCol
7190: 75 6d 6e 54 6f 43 6f 70 79 28 70 50 61 72 73 65  umnToCopy(pParse
71a0: 2c 20 61 64 64 72 54 6f 70 2c 20 70 4c 65 76 65  , addrTop, pLeve
71b0: 6c 2d 3e 69 54 61 62 43 75 72 2c 0a 20 20 20 20  l->iTabCur,.    
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71d0: 20 20 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e        pTabItem->
71e0: 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b 0a 20  regResult, 1);. 
71f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f     sqlite3VdbeGo
7200: 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a  to(v, addrTop);.
7210: 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e 66 67      pTabItem->fg
7220: 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d 20  .viaCoroutine = 
7230: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
7240: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7250: 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 4c  2(v, OP_Next, pL
7260: 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20 61  evel->iTabCur, a
7270: 64 64 72 54 6f 70 2b 31 29 3b 20 56 64 62 65 43  ddrTop+1); VdbeC
7280: 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d 0a  overage(v);.  }.
7290: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
72a0: 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
72b0: 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49  STMTSTATUS_AUTOI
72c0: 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33  NDEX);.  sqlite3
72d0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
72e0: 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69  addrTop);.  sqli
72f0: 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
7300: 67 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63  g(pParse, regRec
7310: 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ord);.  sqlite3E
7320: 78 70 72 43 61 63 68 65 50 6f 70 28 70 50 61 72  xprCachePop(pPar
7330: 73 65 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d  se);.  .  /* Jum
7340: 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70  p here when skip
7350: 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
7360: 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c  ization */.  sql
7370: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
7380: 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 0a  (v, addrInit);..
7390: 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f 63  end_auto_index_c
73a0: 72 65 61 74 65 3a 0a 20 20 73 71 6c 69 74 65 33  reate:.  sqlite3
73b0: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
73c0: 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 61 6c 29  e->db, pPartial)
73d0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
73e0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
73f0: 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 23 69  TIC_INDEX */..#i
7400: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7410: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
7420: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
7430: 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20 73 71  d populate an sq
7440: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
7450: 20 73 74 72 75 63 74 75 72 65 2e 20 49 74 20 69   structure. It i
7460: 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e  s the .** respon
7470: 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
7480: 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
7490: 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74 68 65  ally release the
74a0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 62 79   structure.** by
74b0: 20 70 61 73 73 69 6e 67 20 74 68 65 20 70 6f 69   passing the poi
74c0: 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 62 79  nter returned by
74d0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74   this function t
74e0: 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  o sqlite3_free()
74f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
7500: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
7510: 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66  allocateIndexInf
7520: 6f 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  o(.  Parse *pPar
7530: 73 65 2c 0a 20 20 57 68 65 72 65 43 6c 61 75 73  se,.  WhereClaus
7540: 65 20 2a 70 57 43 2c 0a 20 20 42 69 74 6d 61 73  e *pWC,.  Bitmas
7550: 6b 20 6d 55 6e 75 73 61 62 6c 65 2c 20 20 20 20  k mUnusable,    
7560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e            /* Ign
7570: 6f 72 65 20 74 65 72 6d 73 20 77 69 74 68 20 74  ore terms with t
7580: 68 65 73 65 20 70 72 65 72 65 71 73 20 2a 2f 0a  hese prereqs */.
7590: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
75a0: 5f 69 74 65 6d 20 2a 70 53 72 63 2c 0a 20 20 45  _item *pSrc,.  E
75b0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
75c0: 79 2c 0a 20 20 75 31 36 20 2a 70 6d 4e 6f 4f 6d  y,.  u16 *pmNoOm
75d0: 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
75e0: 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
75f0: 74 65 72 6d 73 20 6e 6f 74 20 74 6f 20 6f 6d 69  terms not to omi
7600: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  t */.){.  int i,
7610: 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   j;.  int nTerm;
7620: 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
7630: 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
7640: 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20  nt *pIdxCons;.  
7650: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
7660: 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70 49  ndex_orderby *pI
7670: 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74 72  dxOrderBy;.  str
7680: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
7690: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
76a0: 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68  ge *pUsage;.  Wh
76b0: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
76c0: 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a    int nOrderBy;.
76d0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
76e0: 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a  info *pIdxInfo;.
76f0: 20 20 75 31 36 20 6d 4e 6f 4f 6d 69 74 20 3d 20    u16 mNoOmit = 
7700: 30 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  0;..  /* Count t
7710: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73  he number of pos
7720: 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  sible WHERE clau
7730: 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72  se constraints r
7740: 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f  eferring.  ** to
7750: 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61   this virtual ta
7760: 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e  ble */.  for(i=n
7770: 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57  Term=0, pTerm=pW
7780: 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
7790: 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
77a0: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
77b0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20  ->leftCursor != 
77c0: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
77d0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
77e0: 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  ( pTerm->prereqR
77f0: 69 67 68 74 20 26 20 6d 55 6e 75 73 61 62 6c 65  ight & mUnusable
7800: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7810: 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65 72   assert( IsPower
7820: 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f 70  OfTwo(pTerm->eOp
7830: 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51 55  erator & ~WO_EQU
7840: 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63  IV) );.    testc
7850: 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
7860: 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b  rator & WO_IN );
7870: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
7880: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
7890: 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  & WO_ISNULL );. 
78a0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
78b0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
78c0: 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 74 65 73  WO_IS );.    tes
78d0: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
78e0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c  perator & WO_ALL
78f0: 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65   );.    if( (pTe
7900: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
7910: 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45  ~(WO_ISNULL|WO_E
7920: 51 55 49 56 7c 57 4f 5f 49 53 29 29 3d 3d 30 20  QUIV|WO_IS))==0 
7930: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7940: 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
7950: 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20  gs & TERM_VNULL 
7960: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7970: 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 75  assert( pTerm->u
7980: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d 28 2d 31  .leftColumn>=(-1
7990: 29 20 29 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b  ) );.    nTerm++
79a0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
79b0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
79c0: 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79  se contains only
79d0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
79e0: 63 75 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69  current .  ** vi
79f0: 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e  rtual table then
7a00: 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
7a10: 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72 42 79  for the aOrderBy
7a20: 20 70 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68   part of.  ** th
7a30: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
7a40: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  info structure..
7a50: 20 20 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20    */.  nOrderBy 
7a60: 3d 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  = 0;.  if( pOrde
7a70: 72 42 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  rBy ){.    int n
7a80: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
7a90: 70 72 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  pr;.    for(i=0;
7aa0: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
7ab0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
7ac0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
7ad0: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
7ae0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
7af0: 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69  LUMN || pExpr->i
7b00: 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75  Table!=pSrc->iCu
7b10: 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  rsor ) break;.  
7b20: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e    }.    if( i==n
7b30: 29 7b 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42  ){.      nOrderB
7b40: 79 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  y = n;.    }.  }
7b50: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
7b60: 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
7b70: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
7b80: 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f  .  */.  pIdxInfo
7b90: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7ba0: 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64  ocZero(pParse->d
7bb0: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49  b, sizeof(*pIdxI
7bc0: 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20  nfo).           
7bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7be0: 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43  + (sizeof(*pIdxC
7bf0: 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70  ons) + sizeof(*p
7c00: 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20  Usage))*nTerm.  
7c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c20: 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
7c30: 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a  f(*pIdxOrderBy)*
7c40: 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 69 66  nOrderBy );.  if
7c50: 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b  ( pIdxInfo==0 ){
7c60: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
7c70: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75  rMsg(pParse, "ou
7c80: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20  t of memory");. 
7c90: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
7ca0: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
7cb0: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e  e the structure.
7cc0: 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e    The sqlite3_in
7cd0: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
7ce0: 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a  re contains.  **
7cf0: 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61   many fields tha
7d00: 74 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 22  t are declared "
7d10: 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e  const" to preven
7d20: 74 20 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f  t xBestIndex fro
7d30: 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20  m.  ** changing 
7d40: 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74  them.  We have t
7d50: 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20  o do some funky 
7d60: 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72  casting in order
7d70: 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c   to.  ** initial
7d80: 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64 73  ize those fields
7d90: 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e  ..  */.  pIdxCon
7da0: 73 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  s = (struct sqli
7db0: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
7dc0: 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 5b  aint*)&pIdxInfo[
7dd0: 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72 42  1];.  pIdxOrderB
7de0: 79 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69  y = (struct sqli
7df0: 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62  te3_index_orderb
7e00: 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65  y*)&pIdxCons[nTe
7e10: 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d 20  rm];.  pUsage = 
7e20: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
7e30: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
7e40: 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64  _usage*)&pIdxOrd
7e50: 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a  erBy[nOrderBy];.
7e60: 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
7e70: 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20  fo->nConstraint 
7e80: 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e 74  = nTerm;.  *(int
7e90: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72  *)&pIdxInfo->nOr
7ea0: 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79  derBy = nOrderBy
7eb0: 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
7ec0: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
7ed0: 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
7ee0: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d  o->aConstraint =
7ef0: 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28 73   pIdxCons;.  *(s
7f00: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
7f10: 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70  dex_orderby**)&p
7f20: 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42  IdxInfo->aOrderB
7f30: 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79 3b  y = pIdxOrderBy;
7f40: 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69  .  *(struct sqli
7f50: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
7f60: 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49  aint_usage**)&pI
7f70: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
7f80: 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20  intUsage =.     
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 55                pU
7fd0: 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a  sage;..  for(i=j
7fe0: 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  =0, pTerm=pWC->a
7ff0: 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
8000: 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
8010: 20 20 20 75 38 20 6f 70 3b 0a 20 20 20 20 69 66     u8 op;.    if
8020: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
8030: 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75  sor != pSrc->iCu
8040: 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rsor ) continue;
8050: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
8060: 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6d 55  prereqRight & mU
8070: 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e 74 69 6e  nusable ) contin
8080: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
8090: 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70 54 65  IsPowerOfTwo(pTe
80a0: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
80b0: 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a 20 20  ~WO_EQUIV) );.  
80c0: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
80d0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
80e0: 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74  O_IN );.    test
80f0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
8100: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
8110: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
8120: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
8130: 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a   & WO_ISNULL );.
8140: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
8150: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
8160: 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20 20 69   WO_ALL );.    i
8170: 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
8180: 61 74 6f 72 20 26 20 7e 28 57 4f 5f 49 53 4e 55  ator & ~(WO_ISNU
8190: 4c 4c 7c 57 4f 5f 45 51 55 49 56 7c 57 4f 5f 49  LL|WO_EQUIV|WO_I
81a0: 53 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  S))==0 ) continu
81b0: 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
81c0: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
81d0: 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75  _VNULL ) continu
81e0: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
81f0: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
8200: 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20  mn>=(-1) );.    
8210: 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c  pIdxCons[j].iCol
8220: 75 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  umn = pTerm->u.l
8230: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70  eftColumn;.    p
8240: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d  IdxCons[j].iTerm
8250: 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20  Offset = i;.    
8260: 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d 3e  op = (u8)pTerm->
8270: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41  eOperator & WO_A
8280: 4c 4c 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d  LL;.    if( op==
8290: 57 4f 5f 49 4e 20 29 20 6f 70 20 3d 20 57 4f 5f  WO_IN ) op = WO_
82a0: 45 51 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d  EQ;.    if( op==
82b0: 57 4f 5f 4d 41 54 43 48 20 29 7b 0a 20 20 20 20  WO_MATCH ){.    
82c0: 20 20 6f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4d    op = pTerm->eM
82d0: 61 74 63 68 4f 70 3b 0a 20 20 20 20 7d 0a 20 20  atchOp;.    }.  
82e0: 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70    pIdxCons[j].op
82f0: 20 3d 20 6f 70 3b 0a 20 20 20 20 2f 2a 20 54 68   = op;.    /* Th
8300: 65 20 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d  e direct assignm
8310: 65 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76 69  ent in the previ
8320: 6f 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73  ous line is poss
8330: 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73  ible only becaus
8340: 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 57 4f 5f  e.    ** the WO_
8350: 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45   and SQLITE_INDE
8360: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63 6f  X_CONSTRAINT_ co
8370: 64 65 73 20 61 72 65 20 69 64 65 6e 74 69 63 61  des are identica
8380: 6c 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 66  l.  The.    ** f
8390: 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
83a0: 20 76 65 72 69 66 79 20 74 68 69 73 20 66 61 63   verify this fac
83b0: 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  t. */.    assert
83c0: 28 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f  ( WO_EQ==SQLITE_
83d0: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
83e0: 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _EQ );.    asser
83f0: 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45  t( WO_LT==SQLITE
8400: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
8410: 54 5f 4c 54 20 29 3b 0a 20 20 20 20 61 73 73 65  T_LT );.    asse
8420: 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54  rt( WO_LE==SQLIT
8430: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
8440: 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73  NT_LE );.    ass
8450: 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49  ert( WO_GT==SQLI
8460: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
8470: 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 61 73  INT_GT );.    as
8480: 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c  sert( WO_GE==SQL
8490: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
84a0: 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 61  AINT_GE );.    a
84b0: 73 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d  ssert( WO_MATCH=
84c0: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
84d0: 4e 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29  NSTRAINT_MATCH )
84e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
84f0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
8500: 20 28 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f   (WO_IN|WO_EQ|WO
8510: 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
8520: 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20  WO_GE|WO_MATCH) 
8530: 29 3b 0a 0a 20 20 20 20 69 66 28 20 6f 70 20 26  );..    if( op &
8540: 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f   (WO_LT|WO_LE|WO
8550: 5f 47 54 7c 57 4f 5f 47 45 29 0a 20 20 20 20 20  _GT|WO_GE).     
8560: 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  && sqlite3ExprIs
8570: 56 65 63 74 6f 72 28 70 54 65 72 6d 2d 3e 70 45  Vector(pTerm->pE
8580: 78 70 72 2d 3e 70 52 69 67 68 74 29 20 0a 20 20  xpr->pRight) .  
8590: 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69    ){.      if( i
85a0: 3c 31 36 20 29 20 6d 4e 6f 4f 6d 69 74 20 7c 3d  <16 ) mNoOmit |=
85b0: 20 28 31 20 3c 3c 20 69 29 3b 0a 20 20 20 20 20   (1 << i);.     
85c0: 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 4c 54 20 29   if( op==WO_LT )
85d0: 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20   pIdxCons[j].op 
85e0: 3d 20 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 69  = WO_LE;.      i
85f0: 66 28 20 6f 70 3d 3d 57 4f 5f 47 54 20 29 20 70  f( op==WO_GT ) p
8600: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20  IdxCons[j].op = 
8610: 57 4f 5f 47 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  WO_GE;.    }..  
8620: 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72    j++;.  }.  for
8630: 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
8640: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
8650: 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72   *pExpr = pOrder
8660: 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  By->a[i].pExpr;.
8670: 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
8680: 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  i].iColumn = pEx
8690: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
86a0: 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e   pIdxOrderBy[i].
86b0: 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79 2d  desc = pOrderBy-
86c0: 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
86d0: 0a 20 20 7d 0a 0a 20 20 2a 70 6d 4e 6f 4f 6d 69  .  }..  *pmNoOmi
86e0: 74 20 3d 20 6d 4e 6f 4f 6d 69 74 3b 0a 20 20 72  t = mNoOmit;.  r
86f0: 65 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a  eturn pIdxInfo;.
8700: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62  }../*.** The tab
8710: 6c 65 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65  le object refere
8720: 6e 63 65 20 70 61 73 73 65 64 20 61 73 20 74 68  nce passed as th
8730: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
8740: 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
8750: 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65 70 72 65  on.** must repre
8760: 73 65 6e 74 20 61 20 76 69 72 74 75 61 6c 20 74  sent a virtual t
8770: 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74  able. This funct
8780: 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  ion invokes the 
8790: 78 42 65 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20  xBestIndex().** 
87a0: 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69  method of the vi
87b0: 72 74 75 61 6c 20 74 61 62 6c 65 20 77 69 74 68  rtual table with
87c0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
87d0: 65 78 5f 69 6e 66 6f 20 6f 62 6a 65 63 74 20 74  ex_info object t
87e0: 68 61 74 0a 2a 2a 20 63 6f 6d 65 73 20 69 6e 20  hat.** comes in 
87f0: 61 73 20 74 68 65 20 33 72 64 20 61 72 67 75 6d  as the 3rd argum
8800: 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
8810: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tion..**.** If a
8820: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
8830: 70 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c 61  pParse is popula
8840: 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ted with an erro
8850: 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61 0a  r message and a.
8860: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75  ** non-zero valu
8870: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
8880: 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20 72  therwise, 0 is r
8890: 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
88a0: 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20 6f  output.** part o
88b0: 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  f the sqlite3_in
88c0: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
88d0: 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75 6c  re is left popul
88e0: 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74  ated..**.** Whet
88f0: 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65 72  her or not an er
8900: 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2c  ror is returned,
8910: 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   it is the respo
8920: 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
8930: 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  .** caller to ev
8940: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70 2d  entually free p-
8950: 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e 65  >idxStr if p->ne
8960: 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 69  edToFreeIdxStr i
8970: 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61 74  ndicates.** that
8980: 20 74 68 69 73 20 69 73 20 72 65 71 75 69 72 65   this is require
8990: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
89a0: 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28 50   vtabBestIndex(P
89b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
89c0: 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69 74  ble *pTab, sqlit
89d0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
89e0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74 61  ){.  sqlite3_vta
89f0: 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69 74  b *pVtab = sqlit
8a00: 65 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72  e3GetVTable(pPar
8a10: 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e 70  se->db, pTab)->p
8a20: 56 74 61 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Vtab;.  int rc;.
8a30: 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50  .  TRACE_IDX_INP
8a40: 55 54 53 28 70 29 3b 0a 20 20 72 63 20 3d 20 70  UTS(p);.  rc = p
8a50: 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78  Vtab->pModule->x
8a60: 42 65 73 74 49 6e 64 65 78 28 70 56 74 61 62 2c  BestIndex(pVtab,
8a70: 20 70 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58   p);.  TRACE_IDX
8a80: 5f 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a 20 20  _OUTPUTS(p);..  
8a90: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8aa0: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  K ){.    if( rc=
8ab0: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
8ac0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 6f  .      sqlite3Oo
8ad0: 6d 46 61 75 6c 74 28 70 50 61 72 73 65 2d 3e 64  mFault(pParse->d
8ae0: 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  b);.    }else if
8af0: 28 20 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ( !pVtab->zErrMs
8b00: 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
8b10: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8b20: 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  e, "%s", sqlite3
8b30: 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20  ErrStr(rc));.   
8b40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
8b50: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8b60: 61 72 73 65 2c 20 22 25 73 22 2c 20 70 56 74 61  arse, "%s", pVta
8b70: 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  b->zErrMsg);.   
8b80: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
8b90: 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72  _free(pVtab->zEr
8ba0: 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e  rMsg);.  pVtab->
8bb0: 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 23 69  zErrMsg = 0;..#i
8bc0: 66 20 30 0a 20 20 2f 2a 20 54 68 69 73 20 65 72  f 0.  /* This er
8bd0: 72 6f 72 20 69 73 20 6e 6f 77 20 63 61 75 67 68  ror is now caugh
8be0: 74 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  t by the caller.
8bf0: 0a 20 20 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  .  ** Search for
8c00: 20 22 78 42 65 73 74 49 6e 64 65 78 20 6d 61 6c   "xBestIndex mal
8c10: 66 75 6e 63 74 69 6f 6e 22 20 62 65 6c 6f 77 20  function" below 
8c20: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
8c30: 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20  p->nConstraint; 
8c40: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 70  i++){.    if( !p
8c50: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
8c60: 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61 43  .usable && p->aC
8c70: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
8c80: 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29 7b  ].argvIndex>0 ){
8c90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
8ca0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
8cb0: 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65            "table
8cc0: 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78 20   %s: xBestIndex 
8cd0: 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76 61  returned an inva
8ce0: 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62 2d  lid plan", pTab-
8cf0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  >zName);.    }. 
8d00: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
8d10: 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  urn pParse->nErr
8d20: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
8d30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
8d40: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
8d50: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
8d60: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
8d70: 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45  OR_STAT4./*.** E
8d80: 73 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 63 61  stimate the loca
8d90: 74 69 6f 6e 20 6f 66 20 61 20 70 61 72 74 69 63  tion of a partic
8da0: 75 6c 61 72 20 6b 65 79 20 61 6d 6f 6e 67 20 61  ular key among a
8db0: 6c 6c 20 6b 65 79 73 20 69 6e 20 61 6e 0a 2a 2a  ll keys in an.**
8dc0: 20 69 6e 64 65 78 2e 20 20 53 74 6f 72 65 20 74   index.  Store t
8dd0: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 53  he results in aS
8de0: 74 61 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  tat as follows:.
8df0: 2a 2a 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b 30  **.**    aStat[0
8e00: 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d 62  ]      Est. numb
8e10: 65 72 20 6f 66 20 72 6f 77 73 20 6c 65 73 73 20  er of rows less 
8e20: 74 68 61 6e 20 70 52 65 63 0a 2a 2a 20 20 20 20  than pRec.**    
8e30: 61 53 74 61 74 5b 31 5d 20 20 20 20 20 20 45 73  aStat[1]      Es
8e40: 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  t. number of row
8e50: 73 20 65 71 75 61 6c 20 74 6f 20 70 52 65 63 0a  s equal to pRec.
8e60: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
8e70: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 73 61   index of the sa
8e80: 6d 70 6c 65 20 74 68 61 74 20 69 73 20 74 68 65  mple that is the
8e90: 20 73 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65   smallest sample
8ea0: 20 74 68 61 74 0a 2a 2a 20 69 73 20 67 72 65 61   that.** is grea
8eb0: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
8ec0: 6c 20 74 6f 20 70 52 65 63 2e 20 4e 6f 74 65 20  l to pRec. Note 
8ed0: 74 68 61 74 20 74 68 69 73 20 69 6e 64 65 78 20  that this index 
8ee0: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 64 65 78 0a  is not an index.
8ef0: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 61 53 61 6d  ** into the aSam
8f00: 70 6c 65 5b 5d 20 61 72 72 61 79 20 2d 20 69 74  ple[] array - it
8f10: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 69 6e 74   is an index int
8f20: 6f 20 61 20 76 69 72 74 75 61 6c 20 73 65 74 20  o a virtual set 
8f30: 6f 66 20 73 61 6d 70 6c 65 73 0a 2a 2a 20 62 61  of samples.** ba
8f40: 73 65 64 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  sed on the conte
8f50: 6e 74 73 20 6f 66 20 61 53 61 6d 70 6c 65 5b 5d  nts of aSample[]
8f60: 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
8f70: 6f 66 20 66 69 65 6c 64 73 20 69 6e 20 72 65 63  of fields in rec
8f80: 6f 72 64 20 0a 2a 2a 20 70 52 65 63 2e 20 0a 2a  ord .** pRec. .*
8f90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
8fa0: 72 65 4b 65 79 53 74 61 74 73 28 0a 20 20 50 61  reKeyStats(.  Pa
8fb0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
8fc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
8fd0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
8fe0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
8ff0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
9000: 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 63 6f    /* Index to co
9010: 6e 73 69 64 65 72 20 64 6f 6d 61 69 6e 20 6f 66  nsider domain of
9020: 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
9030: 63 6f 72 64 20 2a 70 52 65 63 2c 20 20 20 20 20  cord *pRec,     
9040: 20 20 2f 2a 20 56 65 63 74 6f 72 20 6f 66 20 76    /* Vector of v
9050: 61 6c 75 65 73 20 74 6f 20 63 6f 6e 73 69 64 65  alues to conside
9060: 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64  r */.  int round
9070: 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Up,             
9080: 20 20 20 2f 2a 20 52 6f 75 6e 64 20 75 70 20 69     /* Round up i
9090: 66 20 74 72 75 65 2e 20 20 52 6f 75 6e 64 20 64  f true.  Round d
90a0: 6f 77 6e 20 69 66 20 66 61 6c 73 65 20 2a 2f 0a  own if false */.
90b0: 20 20 74 52 6f 77 63 6e 74 20 2a 61 53 74 61 74    tRowcnt *aStat
90c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
90d0: 20 4f 55 54 3a 20 73 74 61 74 73 20 77 72 69 74   OUT: stats writ
90e0: 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ten here */.){. 
90f0: 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53   IndexSample *aS
9100: 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53  ample = pIdx->aS
9110: 61 6d 70 6c 65 3b 0a 20 20 69 6e 74 20 69 43 6f  ample;.  int iCo
9120: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
9130: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
9140: 20 72 65 71 75 69 72 65 64 20 73 74 61 74 73 20   required stats 
9150: 69 6e 20 61 6e 45 71 5b 5d 20 65 74 63 2e 20 2a  in anEq[] etc. *
9160: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9180: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73  /* Index of firs
9190: 74 20 73 61 6d 70 6c 65 20 3e 3d 20 70 52 65 63  t sample >= pRec
91a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 61 6d 70 6c   */.  int iSampl
91b0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
91c0: 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61    /* Smallest sa
91d0: 6d 70 6c 65 20 6c 61 72 67 65 72 20 74 68 61 6e  mple larger than
91e0: 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70 52 65   or equal to pRe
91f0: 63 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 20  c */.  int iMin 
9200: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
9210: 20 20 20 2f 2a 20 53 6d 61 6c 6c 65 73 74 20 73     /* Smallest s
9220: 61 6d 70 6c 65 20 6e 6f 74 20 79 65 74 20 74 65  ample not yet te
9230: 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54  sted */.  int iT
9240: 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  est;            
9250: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 73 61        /* Next sa
9260: 6d 70 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a  mple to test */.
9270: 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20    int res;      
9280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9290: 20 52 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61   Result of compa
92a0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20  rison operation 
92b0: 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 3b  */.  int nField;
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69   /* Number of fi
92e0: 65 6c 64 73 20 69 6e 20 70 52 65 63 20 2a 2f 0a  elds in pRec */.
92f0: 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77 65 72    tRowcnt iLower
9300: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
9310: 20 61 6e 4c 74 5b 5d 20 2b 20 61 6e 45 71 5b 5d   anLt[] + anEq[]
9320: 20 6f 66 20 6c 61 72 67 65 73 74 20 73 61 6d 70   of largest samp
9330: 6c 65 20 70 52 65 63 20 69 73 20 3e 20 2a 2f 0a  le pRec is > */.
9340: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9350: 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50  DEBUG.  UNUSED_P
9360: 41 52 41 4d 45 54 45 52 28 20 70 50 61 72 73 65  ARAMETER( pParse
9370: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
9380: 65 72 74 28 20 70 52 65 63 21 3d 30 20 29 3b 0a  ert( pRec!=0 );.
9390: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
93a0: 6e 53 61 6d 70 6c 65 3e 30 20 29 3b 0a 20 20 61  nSample>0 );.  a
93b0: 73 73 65 72 74 28 20 70 52 65 63 2d 3e 6e 46 69  ssert( pRec->nFi
93c0: 65 6c 64 3e 30 20 26 26 20 70 52 65 63 2d 3e 6e  eld>0 && pRec->n
93d0: 46 69 65 6c 64 3c 3d 70 49 64 78 2d 3e 6e 53 61  Field<=pIdx->nSa
93e0: 6d 70 6c 65 43 6f 6c 20 29 3b 0a 0a 20 20 2f 2a  mpleCol );..  /*
93f0: 20 44 6f 20 61 20 62 69 6e 61 72 79 20 73 65 61   Do a binary sea
9400: 72 63 68 20 74 6f 20 66 69 6e 64 20 74 68 65 20  rch to find the 
9410: 66 69 72 73 74 20 73 61 6d 70 6c 65 20 67 72 65  first sample gre
9420: 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
9430: 61 6c 0a 20 20 2a 2a 20 74 6f 20 70 52 65 63 2e  al.  ** to pRec.
9440: 20 49 66 20 70 52 65 63 20 63 6f 6e 74 61 69 6e   If pRec contain
9450: 73 20 61 20 73 69 6e 67 6c 65 20 66 69 65 6c 64  s a single field
9460: 2c 20 74 68 65 20 73 65 74 20 6f 66 20 73 61 6d  , the set of sam
9470: 70 6c 65 73 20 74 6f 20 73 65 61 72 63 68 0a 20  ples to search. 
9480: 20 2a 2a 20 69 73 20 73 69 6d 70 6c 79 20 74 68   ** is simply th
9490: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
94a0: 79 2e 20 49 66 20 74 68 65 20 73 61 6d 70 6c 65  y. If the sample
94b0: 73 20 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 63  s in aSample[] c
94c0: 6f 6e 74 61 69 6e 20 6d 6f 72 65 0a 20 20 2a 2a  ontain more.  **
94d0: 20 74 68 61 6e 20 6f 6e 65 20 66 69 65 6c 64 73   than one fields
94e0: 2c 20 61 6c 6c 20 66 69 65 6c 64 73 20 66 6f 6c  , all fields fol
94f0: 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 72 73 74  lowing the first
9500: 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20   are ignored..  
9510: 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 52 65 63 20  **.  ** If pRec 
9520: 63 6f 6e 74 61 69 6e 73 20 4e 20 66 69 65 6c 64  contains N field
9530: 73 2c 20 77 68 65 72 65 20 4e 20 69 73 20 6d 6f  s, where N is mo
9540: 72 65 20 74 68 61 6e 20 6f 6e 65 2c 20 74 68 65  re than one, the
9550: 6e 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65  n as well as the
9560: 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 73 20 69 6e  .  ** samples in
9570: 20 61 53 61 6d 70 6c 65 5b 5d 20 28 74 72 75 6e   aSample[] (trun
9580: 63 61 74 65 64 20 74 6f 20 4e 20 66 69 65 6c 64  cated to N field
9590: 73 29 2c 20 74 68 65 20 73 65 61 72 63 68 20 61  s), the search a
95a0: 6c 73 6f 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20  lso has to.  ** 
95b0: 63 6f 6e 73 69 64 65 72 20 70 72 65 66 69 78 65  consider prefixe
95c0: 73 20 6f 66 20 74 68 6f 73 65 20 73 61 6d 70 6c  s of those sampl
95d0: 65 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  es. For example,
95e0: 20 69 66 20 74 68 65 20 73 65 74 20 6f 66 20 73   if the set of s
95f0: 61 6d 70 6c 65 73 0a 20 20 2a 2a 20 69 6e 20 61  amples.  ** in a
9600: 53 61 6d 70 6c 65 20 69 73 3a 0a 20 20 2a 2a 0a  Sample is:.  **.
9610: 20 20 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65    **     aSample
9620: 5b 30 5d 20 3d 20 28 61 2c 20 35 29 20 0a 20 20  [0] = (a, 5) .  
9630: 2a 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 31  **     aSample[1
9640: 5d 20 3d 20 28 61 2c 20 31 30 29 20 0a 20 20 2a  ] = (a, 10) .  *
9650: 2a 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 32 5d  *     aSample[2]
9660: 20 3d 20 28 62 2c 20 35 29 20 0a 20 20 2a 2a 20   = (b, 5) .  ** 
9670: 20 20 20 20 61 53 61 6d 70 6c 65 5b 33 5d 20 3d      aSample[3] =
9680: 20 28 63 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20   (c, 100) .  ** 
9690: 20 20 20 20 61 53 61 6d 70 6c 65 5b 34 5d 20 3d      aSample[4] =
96a0: 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20   (c, 105).  **. 
96b0: 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 73 65 61   ** Then the sea
96c0: 72 63 68 20 73 70 61 63 65 20 73 68 6f 75 6c 64  rch space should
96d0: 20 69 64 65 61 6c 6c 79 20 62 65 20 74 68 65 20   ideally be the 
96e0: 73 61 6d 70 6c 65 73 20 61 62 6f 76 65 20 61 6e  samples above an
96f0: 64 20 74 68 65 20 0a 20 20 2a 2a 20 75 6e 69 71  d the .  ** uniq
9700: 75 65 20 70 72 65 66 69 78 65 73 20 5b 61 5d 2c  ue prefixes [a],
9710: 20 5b 62 5d 20 61 6e 64 20 5b 63 5d 2e 20 42 75   [b] and [c]. Bu
9720: 74 20 73 69 6e 63 65 20 74 68 61 74 20 69 73 20  t since that is 
9730: 68 61 72 64 20 74 6f 20 6f 72 67 61 6e 69 7a 65  hard to organize
9740: 2c 20 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65  , .  ** the code
9750: 20 61 63 74 75 61 6c 6c 79 20 73 65 61 72 63 68   actually search
9760: 65 73 20 74 68 69 73 20 73 65 74 3a 0a 20 20 2a  es this set:.  *
9770: 2a 0a 20 20 2a 2a 20 20 20 20 20 30 3a 20 28 61  *.  **     0: (a
9780: 29 20 0a 20 20 2a 2a 20 20 20 20 20 31 3a 20 28  ) .  **     1: (
9790: 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20  a, 5) .  **     
97a0: 32 3a 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a  2: (a, 10) .  **
97b0: 20 20 20 20 20 33 3a 20 28 61 2c 20 31 30 29 20       3: (a, 10) 
97c0: 0a 20 20 2a 2a 20 20 20 20 20 34 3a 20 28 62 29  .  **     4: (b)
97d0: 20 0a 20 20 2a 2a 20 20 20 20 20 35 3a 20 28 62   .  **     5: (b
97e0: 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 36  , 5) .  **     6
97f0: 3a 20 28 63 29 20 0a 20 20 2a 2a 20 20 20 20 20  : (c) .  **     
9800: 37 3a 20 28 63 2c 20 31 30 30 29 20 0a 20 20 2a  7: (c, 100) .  *
9810: 2a 20 20 20 20 20 38 3a 20 28 63 2c 20 31 30 35  *     8: (c, 105
9820: 29 0a 20 20 2a 2a 20 20 20 20 20 39 3a 20 28 63  ).  **     9: (c
9830: 2c 20 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a  , 105).  **.  **
9840: 20 46 6f 72 20 65 61 63 68 20 73 61 6d 70 6c 65   For each sample
9850: 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c 65 5b   in the aSample[
9860: 5d 20 61 72 72 61 79 2c 20 4e 20 73 61 6d 70 6c  ] array, N sampl
9870: 65 73 20 61 72 65 20 70 72 65 73 65 6e 74 20 69  es are present i
9880: 6e 20 74 68 65 0a 20 20 2a 2a 20 65 66 66 65 63  n the.  ** effec
9890: 74 69 76 65 20 73 61 6d 70 6c 65 20 61 72 72 61  tive sample arra
98a0: 79 2e 20 49 6e 20 74 68 65 20 61 62 6f 76 65 2c  y. In the above,
98b0: 20 73 61 6d 70 6c 65 73 20 30 20 61 6e 64 20 31   samples 0 and 1
98c0: 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 0a 20   are based on . 
98d0: 20 2a 2a 20 73 61 6d 70 6c 65 20 61 53 61 6d 70   ** sample aSamp
98e0: 6c 65 5b 30 5d 2e 20 53 61 6d 70 6c 65 73 20 32  le[0]. Samples 2
98f0: 20 61 6e 64 20 33 20 6f 6e 20 61 53 61 6d 70 6c   and 3 on aSampl
9900: 65 5b 31 5d 20 65 74 63 2e 0a 20 20 2a 2a 0a 20  e[1] etc..  **. 
9910: 20 2a 2a 20 4f 66 74 65 6e 2c 20 73 61 6d 70 6c   ** Often, sampl
9920: 65 20 69 20 6f 66 20 65 61 63 68 20 62 6c 6f 63  e i of each bloc
9930: 6b 20 6f 66 20 4e 20 65 66 66 65 63 74 69 76 65  k of N effective
9940: 20 73 61 6d 70 6c 65 73 20 68 61 73 20 28 69 2b   samples has (i+
9950: 31 29 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2a 20  1) fields..  ** 
9960: 45 78 63 65 70 74 2c 20 65 61 63 68 20 73 61 6d  Except, each sam
9970: 70 6c 65 20 6d 61 79 20 62 65 20 65 78 74 65 6e  ple may be exten
9980: 64 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  ded to ensure th
9990: 61 74 20 69 74 20 69 73 20 67 72 65 61 74 65 72  at it is greater
99a0: 20 74 68 61 6e 20 6f 72 0a 20 20 2a 2a 20 65 71   than or.  ** eq
99b0: 75 61 6c 20 74 6f 20 74 68 65 20 70 72 65 76 69  ual to the previ
99c0: 6f 75 73 20 73 61 6d 70 6c 65 20 69 6e 20 74 68  ous sample in th
99d0: 65 20 61 72 72 61 79 2e 20 46 6f 72 20 65 78 61  e array. For exa
99e0: 6d 70 6c 65 2c 20 69 6e 20 74 68 65 20 61 62 6f  mple, in the abo
99f0: 76 65 2c 20 0a 20 20 2a 2a 20 73 61 6d 70 6c 65  ve, .  ** sample
9a00: 20 32 20 69 73 20 74 68 65 20 66 69 72 73 74 20   2 is the first 
9a10: 73 61 6d 70 6c 65 20 6f 66 20 61 20 62 6c 6f 63  sample of a bloc
9a20: 6b 20 6f 66 20 4e 20 73 61 6d 70 6c 65 73 2c 20  k of N samples, 
9a30: 73 6f 20 61 74 20 66 69 72 73 74 20 69 74 20 0a  so at first it .
9a40: 20 20 2a 2a 20 61 70 70 65 61 72 73 20 74 68 61    ** appears tha
9a50: 74 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 31  t it should be 1
9a60: 20 66 69 65 6c 64 20 69 6e 20 73 69 7a 65 2e 20   field in size. 
9a70: 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 77 6f  However, that wo
9a80: 75 6c 64 20 6d 61 6b 65 20 69 74 20 0a 20 20 2a  uld make it .  *
9a90: 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 73  * smaller than s
9aa0: 61 6d 70 6c 65 20 31 2c 20 73 6f 20 74 68 65 20  ample 1, so the 
9ab0: 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 77 6f  binary search wo
9ac0: 75 6c 64 20 6e 6f 74 20 77 6f 72 6b 2e 20 41 73  uld not work. As
9ad0: 20 61 20 72 65 73 75 6c 74 2c 20 0a 20 20 2a 2a   a result, .  **
9ae0: 20 69 74 20 69 73 20 65 78 74 65 6e 64 65 64 20   it is extended 
9af0: 74 6f 20 74 77 6f 20 66 69 65 6c 64 73 2e 20 54  to two fields. T
9b00: 68 65 20 64 75 70 6c 69 63 61 74 65 73 20 74 68  he duplicates th
9b10: 61 74 20 74 68 69 73 20 63 72 65 61 74 65 73 20  at this creates 
9b20: 64 6f 20 6e 6f 74 20 0a 20 20 2a 2a 20 63 61 75  do not .  ** cau
9b30: 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e  se any problems.
9b40: 0a 20 20 2a 2f 0a 20 20 6e 46 69 65 6c 64 20 3d  .  */.  nField =
9b50: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3b 0a 20   pRec->nField;. 
9b60: 20 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 53 61   iCol = 0;.  iSa
9b70: 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 6e 53 61  mple = pIdx->nSa
9b80: 6d 70 6c 65 20 2a 20 6e 46 69 65 6c 64 3b 0a 20  mple * nField;. 
9b90: 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20 69 53 61   do{.    int iSa
9ba0: 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mp;             
9bb0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
9bc0: 69 6e 20 61 53 61 6d 70 6c 65 5b 5d 20 6f 66 20  in aSample[] of 
9bd0: 74 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f 0a 20  test sample */. 
9be0: 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20     int n;       
9bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c00: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66 69   /* Number of fi
9c10: 65 6c 64 73 20 69 6e 20 74 65 73 74 20 73 61 6d  elds in test sam
9c20: 70 6c 65 20 2a 2f 0a 0a 20 20 20 20 69 54 65 73  ple */..    iTes
9c30: 74 20 3d 20 28 69 4d 69 6e 2b 69 53 61 6d 70 6c  t = (iMin+iSampl
9c40: 65 29 2f 32 3b 0a 20 20 20 20 69 53 61 6d 70 20  e)/2;.    iSamp 
9c50: 3d 20 69 54 65 73 74 20 2f 20 6e 46 69 65 6c 64  = iTest / nField
9c60: 3b 0a 20 20 20 20 69 66 28 20 69 53 61 6d 70 3e  ;.    if( iSamp>
9c70: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  0 ){.      /* Th
9c80: 65 20 70 72 6f 70 6f 73 65 64 20 65 66 66 65 63  e proposed effec
9c90: 74 69 76 65 20 73 61 6d 70 6c 65 20 69 73 20 61  tive sample is a
9ca0: 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c   prefix of sampl
9cb0: 65 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  e aSample[iSamp]
9cc0: 2e 0a 20 20 20 20 20 20 2a 2a 20 53 70 65 63 69  ..      ** Speci
9cd0: 66 69 63 61 6c 6c 79 2c 20 74 68 65 20 73 68 6f  fically, the sho
9ce0: 72 74 65 73 74 20 70 72 65 66 69 78 20 6f 66 20  rtest prefix of 
9cf0: 61 74 20 6c 65 61 73 74 20 28 31 20 2b 20 69 54  at least (1 + iT
9d00: 65 73 74 25 6e 46 69 65 6c 64 29 20 0a 20 20 20  est%nField) .   
9d10: 20 20 20 2a 2a 20 66 69 65 6c 64 73 20 74 68 61     ** fields tha
9d20: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
9d30: 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  n the previous e
9d40: 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c 65 2e  ffective sample.
9d50: 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 6e    */.      for(n
9d60: 3d 28 69 54 65 73 74 20 25 20 6e 46 69 65 6c 64  =(iTest % nField
9d70: 29 20 2b 20 31 3b 20 6e 3c 6e 46 69 65 6c 64 3b  ) + 1; n<nField;
9d80: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   n++){.        i
9d90: 66 28 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70  f( aSample[iSamp
9da0: 2d 31 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 21 3d 61  -1].anLt[n-1]!=a
9db0: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e  Sample[iSamp].an
9dc0: 4c 74 5b 6e 2d 31 5d 20 29 20 62 72 65 61 6b 3b  Lt[n-1] ) break;
9dd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
9de0: 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 69 54  se{.      n = iT
9df0: 65 73 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 0a  est + 1;.    }..
9e00: 20 20 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64      pRec->nField
9e10: 20 3d 20 6e 3b 0a 20 20 20 20 72 65 73 20 3d 20   = n;.    res = 
9e20: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
9e30: 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
9e40: 5b 69 53 61 6d 70 5d 2e 6e 2c 20 61 53 61 6d 70  [iSamp].n, aSamp
9e50: 6c 65 5b 69 53 61 6d 70 5d 2e 70 2c 20 70 52 65  le[iSamp].p, pRe
9e60: 63 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c  c);.    if( res<
9e70: 30 20 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65  0 ){.      iLowe
9e80: 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d  r = aSample[iSam
9e90: 70 5d 2e 61 6e 4c 74 5b 6e 2d 31 5d 20 2b 20 61  p].anLt[n-1] + a
9ea0: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e  Sample[iSamp].an
9eb0: 45 71 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69  Eq[n-1];.      i
9ec0: 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20  Min = iTest+1;. 
9ed0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73     }else if( res
9ee0: 3d 3d 30 20 26 26 20 6e 3c 6e 46 69 65 6c 64 20  ==0 && n<nField 
9ef0: 29 7b 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20  ){.      iLower 
9f00: 3d 20 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d  = aSample[iSamp]
9f10: 2e 61 6e 4c 74 5b 6e 2d 31 5d 3b 0a 20 20 20 20  .anLt[n-1];.    
9f20: 20 20 69 4d 69 6e 20 3d 20 69 54 65 73 74 2b 31    iMin = iTest+1
9f30: 3b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 2d 31  ;.      res = -1
9f40: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9f50: 20 20 20 69 53 61 6d 70 6c 65 20 3d 20 69 54 65     iSample = iTe
9f60: 73 74 3b 0a 20 20 20 20 20 20 69 43 6f 6c 20 3d  st;.      iCol =
9f70: 20 6e 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 77   n-1;.    }.  }w
9f80: 68 69 6c 65 28 20 72 65 73 20 26 26 20 69 4d 69  hile( res && iMi
9f90: 6e 3c 69 53 61 6d 70 6c 65 20 29 3b 0a 20 20 69  n<iSample );.  i
9fa0: 20 3d 20 69 53 61 6d 70 6c 65 20 2f 20 6e 46 69   = iSample / nFi
9fb0: 65 6c 64 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  eld;..#ifdef SQL
9fc0: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54  ITE_DEBUG.  /* T
9fd0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
9fe0: 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 63  ert statements c
9ff0: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 62 69  heck that the bi
a000: 6e 61 72 79 20 73 65 61 72 63 68 20 63 6f 64 65  nary search code
a010: 0a 20 20 2a 2a 20 61 62 6f 76 65 20 66 6f 75 6e  .  ** above foun
a020: 64 20 74 68 65 20 72 69 67 68 74 20 61 6e 73 77  d the right answ
a030: 65 72 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 73  er. This block s
a040: 65 72 76 65 73 20 6e 6f 20 70 75 72 70 6f 73 65  erves no purpose
a050: 20 6f 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 6e   other.  ** than
a060: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 61   to invoke the a
a070: 73 73 65 72 74 73 2e 20 20 2a 2f 0a 20 20 69 66  sserts.  */.  if
a080: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
a090: 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b  llocFailed==0 ){
a0a0: 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20  .    if( res==0 
a0b0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 28  ){.      /* If (
a0c0: 72 65 73 3d 3d 30 29 20 69 73 20 74 72 75 65 2c  res==0) is true,
a0d0: 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74 20   then pRec must 
a0e0: 62 65 20 65 71 75 61 6c 20 74 6f 20 73 61 6d 70  be equal to samp
a0f0: 6c 65 20 69 2e 20 2a 2f 0a 20 20 20 20 20 20 61  le i. */.      a
a100: 73 73 65 72 74 28 20 69 3c 70 49 64 78 2d 3e 6e  ssert( i<pIdx->n
a110: 53 61 6d 70 6c 65 20 29 3b 0a 20 20 20 20 20 20  Sample );.      
a120: 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46  assert( iCol==nF
a130: 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20 20 20  ield-1 );.      
a140: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  pRec->nField = n
a150: 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 61 73 73  Field;.      ass
a160: 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 56  ert( 0==sqlite3V
a170: 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
a180: 28 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61  (aSample[i].n, a
a190: 53 61 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65  Sample[i].p, pRe
a1a0: 63 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  c) .           |
a1b0: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
a1c0: 6c 6c 6f 63 46 61 69 6c 65 64 20 0a 20 20 20 20  llocFailed .    
a1d0: 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    );.    }else{.
a1e0: 20 20 20 20 20 20 2f 2a 20 55 6e 6c 65 73 73 20        /* Unless 
a1f0: 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i==pIdx->nSample
a200: 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
a210: 74 20 70 52 65 63 20 69 73 20 6c 61 72 67 65 72  t pRec is larger
a220: 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 61   than.      ** a
a230: 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e 20 74 68  ll samples in th
a240: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
a250: 79 2c 20 70 52 65 63 20 6d 75 73 74 20 62 65 20  y, pRec must be 
a260: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
a270: 0a 20 20 20 20 20 20 2a 2a 20 28 69 43 6f 6c 2b  .      ** (iCol+
a280: 31 29 20 66 69 65 6c 64 20 70 72 65 66 69 78 20  1) field prefix 
a290: 6f 66 20 73 61 6d 70 6c 65 20 69 2e 20 20 2a 2f  of sample i.  */
a2a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
a2b0: 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20  <=pIdx->nSample 
a2c0: 26 26 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 20  && i>=0 );.     
a2d0: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20   pRec->nField = 
a2e0: 69 43 6f 6c 2b 31 3b 0a 20 20 20 20 20 20 61 73  iCol+1;.      as
a2f0: 73 65 72 74 28 20 69 3d 3d 70 49 64 78 2d 3e 6e  sert( i==pIdx->n
a300: 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20 20  Sample .        
a310: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62     || sqlite3Vdb
a320: 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
a330: 53 61 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61  Sample[i].n, aSa
a340: 6d 70 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29  mple[i].p, pRec)
a350: 3e 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  >0.           ||
a360: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
a370: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20  locFailed );..  
a380: 20 20 20 20 2f 2a 20 69 66 20 69 3d 3d 30 20 61      /* if i==0 a
a390: 6e 64 20 69 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e  nd iCol==0, then
a3a0: 20 72 65 63 6f 72 64 20 70 52 65 63 20 69 73 20   record pRec is 
a3b0: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 61 6c 6c  smaller than all
a3c0: 20 73 61 6d 70 6c 65 73 0a 20 20 20 20 20 20 2a   samples.      *
a3d0: 2a 20 69 6e 20 74 68 65 20 61 53 61 6d 70 6c 65  * in the aSample
a3e0: 5b 5d 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77  [] array. Otherw
a3f0: 69 73 65 2c 20 69 66 20 28 69 43 6f 6c 3e 30 29  ise, if (iCol>0)
a400: 20 74 68 65 6e 20 70 52 65 63 20 6d 75 73 74 0a   then pRec must.
a410: 20 20 20 20 20 20 2a 2a 20 62 65 20 67 72 65 61        ** be grea
a420: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
a430: 6c 20 74 6f 20 74 68 65 20 28 69 43 6f 6c 29 20  l to the (iCol) 
a440: 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20  field prefix of 
a450: 73 61 6d 70 6c 65 20 69 2e 0a 20 20 20 20 20 20  sample i..      
a460: 2a 2a 20 49 66 20 28 69 3e 30 29 2c 20 74 68 65  ** If (i>0), the
a470: 6e 20 70 52 65 63 20 6d 75 73 74 20 61 6c 73 6f  n pRec must also
a480: 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
a490: 20 73 61 6d 70 6c 65 20 28 69 2d 31 29 2e 20 20   sample (i-1).  
a4a0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  */.      if( iCo
a4b0: 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  l>0 ){.        p
a4c0: 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43  Rec->nField = iC
a4d0: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ol;.        asse
a4e0: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 52  rt( sqlite3VdbeR
a4f0: 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
a500: 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70  mple[i].n, aSamp
a510: 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3c 3d  le[i].p, pRec)<=
a520: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  0.             |
a530: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
a540: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
a550: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
a560: 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  i>0 ){.        p
a570: 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46  Rec->nField = nF
a580: 69 65 6c 64 3b 0a 20 20 20 20 20 20 20 20 61 73  ield;.        as
a590: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
a5a0: 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61  eRecordCompare(a
a5b0: 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61  Sample[i-1].n, a
a5c0: 53 61 6d 70 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70  Sample[i-1].p, p
a5d0: 52 65 63 29 3c 30 0a 20 20 20 20 20 20 20 20 20  Rec)<0.         
a5e0: 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64      || pParse->d
a5f0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a600: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
a610: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69  .  }.#endif /* i
a620: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
a630: 47 20 2a 2f 0a 0a 20 20 69 66 28 20 72 65 73 3d  G */..  if( res=
a640: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 52 65 63  =0 ){.    /* Rec
a650: 6f 72 64 20 70 52 65 63 20 69 73 20 65 71 75 61  ord pRec is equa
a660: 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69 20 2a 2f  l to sample i */
a670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 43 6f  .    assert( iCo
a680: 6c 3d 3d 6e 46 69 65 6c 64 2d 31 20 29 3b 0a 20  l==nField-1 );. 
a690: 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 61 53     aStat[0] = aS
a6a0: 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43  ample[i].anLt[iC
a6b0: 6f 6c 5d 3b 0a 20 20 20 20 61 53 74 61 74 5b 31  ol];.    aStat[1
a6c0: 5d 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61  ] = aSample[i].a
a6d0: 6e 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c  nEq[iCol];.  }el
a6e0: 73 65 7b 0a 20 20 20 20 2f 2a 20 41 74 20 74 68  se{.    /* At th
a6f0: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 28 69  is point, the (i
a700: 43 6f 6c 2b 31 29 20 66 69 65 6c 64 20 70 72 65  Col+1) field pre
a710: 66 69 78 20 6f 66 20 61 53 61 6d 70 6c 65 5b 69  fix of aSample[i
a720: 5d 20 69 73 20 74 68 65 20 66 69 72 73 74 20 0a  ] is the first .
a730: 20 20 20 20 2a 2a 20 73 61 6d 70 6c 65 20 74 68      ** sample th
a740: 61 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  at is greater th
a750: 61 6e 20 70 52 65 63 2e 20 4f 72 2c 20 69 66 20  an pRec. Or, if 
a760: 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i==pIdx->nSample
a770: 20 74 68 65 6e 20 70 52 65 63 0a 20 20 20 20 2a   then pRec.    *
a780: 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  * is larger than
a790: 20 61 6c 6c 20 73 61 6d 70 6c 65 73 20 69 6e 20   all samples in 
a7a0: 74 68 65 20 61 72 72 61 79 2e 20 2a 2f 0a 20 20  the array. */.  
a7b0: 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65 72    tRowcnt iUpper
a7c0: 2c 20 69 47 61 70 3b 0a 20 20 20 20 69 66 28 20  , iGap;.    if( 
a7d0: 69 3e 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i>=pIdx->nSample
a7e0: 20 29 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72   ){.      iUpper
a7f0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
a800: 54 6f 49 6e 74 28 70 49 64 78 2d 3e 61 69 52 6f  ToInt(pIdx->aiRo
a810: 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20 20  wLogEst[0]);.   
a820: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 55   }else{.      iU
a830: 70 70 65 72 20 3d 20 61 53 61 6d 70 6c 65 5b 69  pper = aSample[i
a840: 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20  ].anLt[iCol];.  
a850: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 4c 6f    }..    if( iLo
a860: 77 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20  wer>=iUpper ){. 
a870: 20 20 20 20 20 69 47 61 70 20 3d 20 30 3b 0a 20       iGap = 0;. 
a880: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a890: 69 47 61 70 20 3d 20 69 55 70 70 65 72 20 2d 20  iGap = iUpper - 
a8a0: 69 4c 6f 77 65 72 3b 0a 20 20 20 20 7d 0a 20 20  iLower;.    }.  
a8b0: 20 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b    if( roundUp ){
a8c0: 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 28 69  .      iGap = (i
a8d0: 47 61 70 2a 32 29 2f 33 3b 0a 20 20 20 20 7d 65  Gap*2)/3;.    }e
a8e0: 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20  lse{.      iGap 
a8f0: 3d 20 69 47 61 70 2f 33 3b 0a 20 20 20 20 7d 0a  = iGap/3;.    }.
a900: 20 20 20 20 61 53 74 61 74 5b 30 5d 20 3d 20 69      aStat[0] = i
a910: 4c 6f 77 65 72 20 2b 20 69 47 61 70 3b 0a 20 20  Lower + iGap;.  
a920: 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 70 49 64    aStat[1] = pId
a930: 78 2d 3e 61 41 76 67 45 71 5b 6e 46 69 65 6c 64  x->aAvgEq[nField
a940: 2d 31 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  -1];.  }..  /* R
a950: 65 73 74 6f 72 65 20 74 68 65 20 70 52 65 63 2d  estore the pRec-
a960: 3e 6e 46 69 65 6c 64 20 76 61 6c 75 65 20 62 65  >nField value be
a970: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
a980: 20 2a 2f 0a 20 20 70 52 65 63 2d 3e 6e 46 69 65   */.  pRec->nFie
a990: 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a 20 20 72  ld = nField;.  r
a9a0: 65 74 75 72 6e 20 69 3b 0a 7d 0a 23 65 6e 64 69  eturn i;.}.#endi
a9b0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
a9c0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
a9d0: 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69  4 */../*.** If i
a9e0: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 70  t is not NULL, p
a9f0: 54 65 72 6d 20 69 73 20 61 20 74 65 72 6d 20 74  Term is a term t
aa00: 68 61 74 20 70 72 6f 76 69 64 65 73 20 61 6e 20  hat provides an 
aa10: 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 0a 2a  upper or lower.*
aa20: 2a 20 62 6f 75 6e 64 20 6f 6e 20 61 20 72 61 6e  * bound on a ran
aa30: 67 65 20 73 63 61 6e 2e 20 57 69 74 68 6f 75 74  ge scan. Without
aa40: 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 70 54 65   considering pTe
aa50: 72 6d 2c 20 69 74 20 69 73 20 65 73 74 69 6d 61  rm, it is estima
aa60: 74 65 64 20 0a 2a 2a 20 74 68 61 74 20 74 68 65  ted .** that the
aa70: 20 73 63 61 6e 20 77 69 6c 6c 20 76 69 73 69 74   scan will visit
aa80: 20 6e 4e 65 77 20 72 6f 77 73 2e 20 54 68 69 73   nNew rows. This
aa90: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
aaa0: 73 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  s the number.** 
aab0: 65 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20  estimated to be 
aac0: 76 69 73 69 74 65 64 20 61 66 74 65 72 20 74 61  visited after ta
aad0: 6b 69 6e 67 20 70 54 65 72 6d 20 69 6e 74 6f 20  king pTerm into 
aae0: 61 63 63 6f 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49  account..**.** I
aaf0: 66 20 74 68 65 20 75 73 65 72 20 65 78 70 6c 69  f the user expli
ab00: 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20  citly specified 
ab10: 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76  a likelihood() v
ab20: 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 74 65  alue for this te
ab30: 72 6d 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20  rm,.** then the 
ab40: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
ab50: 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6d  the likelihood m
ab60: 75 6c 74 69 70 6c 69 65 64 20 62 79 20 74 68 65  ultiplied by the
ab70: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 69 6e   number of.** in
ab80: 70 75 74 20 72 6f 77 73 2e 20 4f 74 68 65 72 77  put rows. Otherw
ab90: 69 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ise, this functi
aba0: 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  on assumes that 
abb0: 61 6e 20 22 49 53 20 4e 4f 54 20 4e 55 4c 4c 22  an "IS NOT NULL"
abc0: 20 74 65 72 6d 0a 2a 2a 20 68 61 73 20 61 20 6c   term.** has a l
abd0: 69 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 35  ikelihood of 0.5
abe0: 30 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72  0, and any other
abf0: 20 74 65 72 6d 20 61 20 6c 69 6b 65 6c 69 68 6f   term a likeliho
ac00: 6f 64 20 6f 66 20 30 2e 32 35 2e 0a 2a 2f 0a 73  od of 0.25..*/.s
ac10: 74 61 74 69 63 20 4c 6f 67 45 73 74 20 77 68 65  tatic LogEst whe
ac20: 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28 57 68  reRangeAdjust(Wh
ac30: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
ac40: 4c 6f 67 45 73 74 20 6e 4e 65 77 29 7b 0a 20 20  LogEst nNew){.  
ac50: 4c 6f 67 45 73 74 20 6e 52 65 74 20 3d 20 6e 4e  LogEst nRet = nN
ac60: 65 77 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20  ew;.  if( pTerm 
ac70: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
ac80: 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29  ->truthProb<=0 )
ac90: 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2b 3d 20  {.      nRet += 
aca0: 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
acb0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
acc0: 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
acd0: 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30  & TERM_VNULL)==0
ace0: 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 74 20 2d   ){.      nRet -
acf0: 3d 20 32 30 3b 20 20 20 20 20 20 20 20 61 73 73  = 20;        ass
ad00: 65 72 74 28 20 32 30 3d 3d 73 71 6c 69 74 65 33  ert( 20==sqlite3
ad10: 4c 6f 67 45 73 74 28 34 29 20 29 3b 0a 20 20 20  LogEst(4) );.   
ad20: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
ad30: 6e 52 65 74 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66  nRet;.}...#ifdef
ad40: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
ad50: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a  TAT3_OR_STAT4./*
ad60: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
ad70: 66 66 69 6e 69 74 79 20 66 6f 72 20 61 20 73 69  ffinity for a si
ad80: 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  ngle column of a
ad90: 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 63 68 61 72  n index..*/.char
ada0: 20 73 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c   sqlite3IndexCol
adb0: 75 6d 6e 41 66 66 69 6e 69 74 79 28 73 71 6c 69  umnAffinity(sqli
adc0: 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a  te3 *db, Index *
add0: 70 49 64 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b  pIdx, int iCol){
ade0: 0a 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e  .  assert( iCol>
adf0: 3d 30 20 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d  =0 && iCol<pIdx-
ae00: 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66  >nColumn );.  if
ae10: 28 20 21 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66  ( !pIdx->zColAff
ae20: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
ae30: 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
ae40: 53 74 72 28 64 62 2c 20 70 49 64 78 29 3d 3d 30  Str(db, pIdx)==0
ae50: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
ae60: 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20  _AFF_BLOB;.  }. 
ae70: 20 72 65 74 75 72 6e 20 70 49 64 78 2d 3e 7a 43   return pIdx->zC
ae80: 6f 6c 41 66 66 5b 69 43 6f 6c 5d 3b 0a 7d 0a 23  olAff[iCol];.}.#
ae90: 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53  endif...#ifdef S
aea0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
aeb0: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 20 0a  T3_OR_STAT4./* .
aec0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
aed0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 65 73   is called to es
aee0: 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
aef0: 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65  r of rows visite
af00: 64 20 62 79 20 61 0a 2a 2a 20 72 61 6e 67 65 2d  d by a.** range-
af10: 73 63 61 6e 20 6f 6e 20 61 20 73 6b 69 70 2d 73  scan on a skip-s
af20: 63 61 6e 20 69 6e 64 65 78 2e 20 46 6f 72 20 65  can index. For e
af30: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
af40: 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20  CREATE INDEX i1 
af50: 4f 4e 20 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a  ON t1(a, b, c);.
af60: 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
af70: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 3f 20  OM t1 WHERE a=? 
af80: 41 4e 44 20 63 20 42 45 54 57 45 45 4e 20 3f 20  AND c BETWEEN ? 
af90: 41 4e 44 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c  AND ?;.**.** Val
afa0: 75 65 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69  ue pLoop->nOut i
afb0: 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74 20  s currently set 
afc0: 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  to the estimated
afd0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
afe0: 0a 2a 2a 20 76 69 73 69 74 65 64 20 66 6f 72 20  .** visited for 
aff0: 73 63 61 6e 6e 69 6e 67 20 28 61 3d 3f 20 41 4e  scanning (a=? AN
b000: 44 20 62 3d 3f 29 2e 20 54 68 69 73 20 66 75 6e  D b=?). This fun
b010: 63 74 69 6f 6e 20 72 65 64 75 63 65 73 20 74 68  ction reduces th
b020: 61 74 20 65 73 74 69 6d 61 74 65 20 0a 2a 2a 20  at estimate .** 
b030: 62 79 20 73 6f 6d 65 20 66 61 63 74 6f 72 20 74  by some factor t
b040: 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68  o account for th
b050: 65 20 28 63 20 42 45 54 57 45 45 4e 20 3f 20 41  e (c BETWEEN ? A
b060: 4e 44 20 3f 29 20 65 78 70 72 65 73 73 69 6f 6e  ND ?) expression
b070: 20 62 61 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65   based.** on the
b080: 20 73 74 61 74 34 20 64 61 74 61 20 66 6f 72 20   stat4 data for 
b090: 74 68 65 20 69 6e 64 65 78 2e 20 74 68 69 73 20  the index. this 
b0a0: 73 63 61 6e 20 77 69 6c 6c 20 62 65 20 70 65 66  scan will be pef
b0b0: 6f 72 6d 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a  ormed multiple .
b0c0: 2a 2a 20 74 69 6d 65 73 20 28 6f 6e 63 65 20 66  ** times (once f
b0d0: 6f 72 20 65 61 63 68 20 28 61 2c 62 29 20 63 6f  or each (a,b) co
b0e0: 6d 62 69 6e 61 74 69 6f 6e 20 74 68 61 74 20 6d  mbination that m
b0f0: 61 74 63 68 65 73 20 61 3d 3f 29 20 69 73 20 64  atches a=?) is d
b100: 65 61 6c 74 20 77 69 74 68 20 0a 2a 2a 20 62 79  ealt with .** by
b110: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
b120: 2a 2a 20 49 74 20 64 6f 65 73 20 74 68 69 73 20  ** It does this 
b130: 62 79 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  by scanning thro
b140: 75 67 68 20 61 6c 6c 20 73 74 61 74 34 20 73 61  ugh all stat4 sa
b150: 6d 70 6c 65 73 2c 20 63 6f 6d 70 61 72 69 6e 67  mples, comparing
b160: 20 76 61 6c 75 65 73 0a 2a 2a 20 65 78 74 72 61   values.** extra
b170: 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72  cted from pLower
b180: 20 61 6e 64 20 70 55 70 70 65 72 20 77 69 74 68   and pUpper with
b190: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
b1a0: 6e 67 20 63 6f 6c 75 6d 6e 20 69 6e 20 65 61 63  ng column in eac
b1b0: 68 0a 2a 2a 20 73 61 6d 70 6c 65 2e 20 49 66 20  h.** sample. If 
b1c0: 4c 20 61 6e 64 20 55 20 61 72 65 20 74 68 65 20  L and U are the 
b1d0: 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d 70 6c 65  number of sample
b1e0: 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 6c 65  s found to be le
b1f0: 73 73 20 74 68 61 6e 20 6f 72 0a 2a 2a 20 65 71  ss than or.** eq
b200: 75 61 6c 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ual to the value
b210: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
b220: 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70 70   pLower and pUpp
b230: 65 72 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c  er respectively,
b240: 20 61 6e 64 0a 2a 2a 20 4e 20 69 73 20 74 68 65   and.** N is the
b250: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
b260: 20 73 61 6d 70 6c 65 73 2c 20 74 68 65 20 70 4c   samples, the pL
b270: 6f 6f 70 2d 3e 6e 4f 75 74 20 76 61 6c 75 65 20  oop->nOut value 
b280: 69 73 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61  is adjusted.** a
b290: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
b2a0: 20 20 20 6e 4f 75 74 20 3d 20 6e 4f 75 74 20 2a     nOut = nOut *
b2b0: 20 28 20 6d 69 6e 28 55 20 2d 20 4c 2c 20 31 29   ( min(U - L, 1)
b2c0: 20 2f 20 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20   / N ).**.** If 
b2d0: 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 2c 20  pLower is NULL, 
b2e0: 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f  or a value canno
b2f0: 74 20 62 65 20 65 78 74 72 61 63 74 65 64 20 66  t be extracted f
b300: 72 6f 6d 20 74 68 65 20 74 65 72 6d 2c 20 4c 20  rom the term, L 
b310: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 7a 65 72  is.** set to zer
b320: 6f 2e 20 49 66 20 70 55 70 70 65 72 20 69 73 20  o. If pUpper is 
b330: 4e 55 4c 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65  NULL, or a value
b340: 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61   cannot be extra
b350: 63 74 65 64 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a  cted from it,.**
b360: 20 55 20 69 73 20 73 65 74 20 74 6f 20 4e 2e 0a   U is set to N..
b370: 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
b380: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  this function se
b390: 74 73 20 2a 70 62 44 6f 6e 65 20 74 6f 20 31 20  ts *pbDone to 1 
b3a0: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
b3b0: 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66  . However,.** if
b3c0: 20 6e 6f 20 76 61 6c 75 65 20 63 61 6e 20 62 65   no value can be
b3d0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
b3e0: 65 69 74 68 65 72 20 70 4c 6f 77 65 72 20 6f 72  either pLower or
b3f0: 20 70 55 70 70 65 72 20 28 61 6e 64 20 73 6f 20   pUpper (and so 
b400: 74 68 65 0a 2a 2a 20 65 73 74 69 6d 61 74 65 20  the.** estimate 
b410: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
b420: 20 72 6f 77 73 20 64 65 6c 69 76 65 72 65 64 20   rows delivered 
b430: 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65  remains unchange
b440: 64 29 2c 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69  d), *pbDone.** i
b450: 73 20 6c 65 66 74 20 61 73 20 69 73 2e 0a 2a 2a  s left as is..**
b460: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
b470: 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74  occurs, an SQLit
b480: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
b490: 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
b4a0: 69 73 65 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  ise, .** SQLITE_
b4b0: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
b4c0: 74 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70  t whereRangeSkip
b4d0: 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65  ScanEst(.  Parse
b4e0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
b4f0: 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64  /* Parsing & cod
b500: 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e  e generating con
b510: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54  text */.  WhereT
b520: 65 72 6d 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f  erm *pLower,   /
b530: 2a 20 4c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e  * Lower bound on
b540: 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20   the range. ex: 
b550: 22 78 3e 31 32 33 22 20 4d 69 67 68 74 20 62 65  "x>123" Might be
b560: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65   NULL */.  Where
b570: 54 65 72 6d 20 2a 70 55 70 70 65 72 2c 20 20 20  Term *pUpper,   
b580: 2f 2a 20 55 70 70 65 72 20 62 6f 75 6e 64 20 6f  /* Upper bound o
b590: 6e 20 74 68 65 20 72 61 6e 67 65 2e 20 65 78 3a  n the range. ex:
b5a0: 20 22 78 3c 34 35 35 22 20 4d 69 67 68 74 20 62   "x<455" Might b
b5b0: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72  e NULL */.  Wher
b5c0: 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20  eLoop *pLoop,   
b5d0: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 2e   /* Update the .
b5e0: 6e 4f 75 74 20 76 61 6c 75 65 20 6f 66 20 74 68  nOut value of th
b5f0: 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  is loop */.  int
b600: 20 2a 70 62 44 6f 6e 65 20 20 20 20 20 20 20 20   *pbDone        
b610: 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65    /* Set to true
b620: 20 69 66 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   if at least one
b630: 20 65 78 70 72 2e 20 76 61 6c 75 65 20 65 78 74   expr. value ext
b640: 72 61 63 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 49  racted */.){.  I
b650: 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d  ndex *p = pLoop-
b660: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
b670: 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f  .  int nEq = pLo
b680: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
b690: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
b6a0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
b6b0: 6e 74 20 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a  nt nLower = -1;.
b6c0: 20 20 69 6e 74 20 6e 55 70 70 65 72 20 3d 20 70    int nUpper = p
b6d0: 2d 3e 6e 53 61 6d 70 6c 65 2b 31 3b 0a 20 20 69  ->nSample+1;.  i
b6e0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
b6f0: 4b 3b 0a 20 20 75 38 20 61 66 66 20 3d 20 73 71  K;.  u8 aff = sq
b700: 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e  lite3IndexColumn
b710: 41 66 66 69 6e 69 74 79 28 64 62 2c 20 70 2c 20  Affinity(db, p, 
b720: 6e 45 71 29 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  nEq);.  CollSeq 
b730: 2a 70 43 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c  *pColl;.  .  sql
b740: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 31 20 3d  ite3_value *p1 =
b750: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
b760: 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20  Value extracted 
b770: 66 72 6f 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a 20  from pLower */. 
b780: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
b790: 70 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  p2 = 0;         
b7a0: 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63   /* Value extrac
b7b0: 74 65 64 20 66 72 6f 6d 20 70 55 70 70 65 72 20  ted from pUpper 
b7c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
b7d0: 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 20 20 20  ue *pVal = 0;   
b7e0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 65 78       /* Value ex
b7f0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 72 65 63  tracted from rec
b800: 6f 72 64 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20  ord */..  pColl 
b810: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  = sqlite3LocateC
b820: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
b830: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a  ->azColl[nEq]);.
b840: 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a    if( pLower ){.
b850: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
b860: 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78  Stat4ValueFromEx
b870: 70 72 28 70 50 61 72 73 65 2c 20 70 4c 6f 77 65  pr(pParse, pLowe
b880: 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
b890: 2c 20 61 66 66 2c 20 26 70 31 29 3b 0a 20 20 20  , aff, &p1);.   
b8a0: 20 6e 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 7d   nLower = 0;.  }
b8b0: 0a 20 20 69 66 28 20 70 55 70 70 65 72 20 26 26  .  if( pUpper &&
b8c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
b8d0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
b8e0: 65 33 53 74 61 74 34 56 61 6c 75 65 46 72 6f 6d  e3Stat4ValueFrom
b8f0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 55 70  Expr(pParse, pUp
b900: 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  per->pExpr->pRig
b910: 68 74 2c 20 61 66 66 2c 20 26 70 32 29 3b 0a 20  ht, aff, &p2);. 
b920: 20 20 20 6e 55 70 70 65 72 20 3d 20 70 32 20 3f     nUpper = p2 ?
b930: 20 30 20 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b   0 : p->nSample;
b940: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 31 20 7c  .  }..  if( p1 |
b950: 7c 20 70 32 20 29 7b 0a 20 20 20 20 69 6e 74 20  | p2 ){.    int 
b960: 69 3b 0a 20 20 20 20 69 6e 74 20 6e 44 69 66 66  i;.    int nDiff
b970: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  ;.    for(i=0; r
b980: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
b990: 69 3c 70 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b  i<p->nSample; i+
b9a0: 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  +){.      rc = s
b9b0: 71 6c 69 74 65 33 53 74 61 74 34 43 6f 6c 75 6d  qlite3Stat4Colum
b9c0: 6e 28 64 62 2c 20 70 2d 3e 61 53 61 6d 70 6c 65  n(db, p->aSample
b9d0: 5b 69 5d 2e 70 2c 20 70 2d 3e 61 53 61 6d 70 6c  [i].p, p->aSampl
b9e0: 65 5b 69 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70 56  e[i].n, nEq, &pV
b9f0: 61 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  al);.      if( r
ba00: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
ba10: 70 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  p1 ){.        in
ba20: 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d  t res = sqlite3M
ba30: 65 6d 43 6f 6d 70 61 72 65 28 70 31 2c 20 70 56  emCompare(p1, pV
ba40: 61 6c 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20  al, pColl);.    
ba50: 20 20 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29      if( res>=0 )
ba60: 20 6e 4c 6f 77 65 72 2b 2b 3b 0a 20 20 20 20 20   nLower++;.     
ba70: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
ba80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 32  =SQLITE_OK && p2
ba90: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
baa0: 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d  res = sqlite3Mem
bab0: 43 6f 6d 70 61 72 65 28 70 32 2c 20 70 56 61 6c  Compare(p2, pVal
bac0: 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  , pColl);.      
bad0: 20 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e    if( res>=0 ) n
bae0: 55 70 70 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d  Upper++;.      }
baf0: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 44 69 66 66  .    }.    nDiff
bb00: 20 3d 20 28 6e 55 70 70 65 72 20 2d 20 6e 4c 6f   = (nUpper - nLo
bb10: 77 65 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 44  wer);.    if( nD
bb20: 69 66 66 3c 3d 30 20 29 20 6e 44 69 66 66 20 3d  iff<=0 ) nDiff =
bb30: 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74   1;..    /* If t
bb40: 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e 20  here is both an 
bb50: 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20  upper and lower 
bb60: 62 6f 75 6e 64 20 73 70 65 63 69 66 69 65 64 2c  bound specified,
bb70: 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a   and the .    **
bb80: 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 69 6e 64   comparisons ind
bb90: 69 63 61 74 65 20 74 68 61 74 20 74 68 65 79 20  icate that they 
bba0: 61 72 65 20 63 6c 6f 73 65 20 74 6f 67 65 74 68  are close togeth
bbb0: 65 72 2c 20 75 73 65 20 74 68 65 20 66 61 6c 6c  er, use the fall
bbc0: 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6d 65 74 68  back.    ** meth
bbd0: 6f 64 20 28 61 73 73 75 6d 65 20 74 68 61 74 20  od (assume that 
bbe0: 74 68 65 20 73 63 61 6e 20 76 69 73 69 74 73 20  the scan visits 
bbf0: 31 2f 36 34 20 6f 66 20 74 68 65 20 72 6f 77 73  1/64 of the rows
bc00: 29 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67  ) for estimating
bc10: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62  .    ** the numb
bc20: 65 72 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74  er of rows visit
bc30: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65  ed. Otherwise, e
bc40: 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
bc50: 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 2a  er of rows.    *
bc60: 2a 20 75 73 69 6e 67 20 74 68 65 20 6d 65 74 68  * using the meth
bc70: 6f 64 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  od described in 
bc80: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
bc90: 6e 74 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63  nt for this func
bca0: 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  tion. */.    if(
bcb0: 20 6e 44 69 66 66 21 3d 31 20 7c 7c 20 70 55 70   nDiff!=1 || pUp
bcc0: 70 65 72 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65 72  per==0 || pLower
bcd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
bce0: 20 6e 41 64 6a 75 73 74 20 3d 20 28 73 71 6c 69   nAdjust = (sqli
bcf0: 74 65 33 4c 6f 67 45 73 74 28 70 2d 3e 6e 53 61  te3LogEst(p->nSa
bd00: 6d 70 6c 65 29 20 2d 20 73 71 6c 69 74 65 33 4c  mple) - sqlite3L
bd10: 6f 67 45 73 74 28 6e 44 69 66 66 29 29 3b 0a 20  ogEst(nDiff));. 
bd20: 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74       pLoop->nOut
bd30: 20 2d 3d 20 6e 41 64 6a 75 73 74 3b 0a 20 20 20   -= nAdjust;.   
bd40: 20 20 20 2a 70 62 44 6f 6e 65 20 3d 20 31 3b 0a     *pbDone = 1;.
bd50: 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
bd60: 28 30 78 31 30 2c 20 28 22 72 61 6e 67 65 20 73  (0x10, ("range s
bd70: 6b 69 70 2d 73 63 61 6e 20 72 65 67 69 6f 6e 73  kip-scan regions
bd80: 3a 20 25 75 2e 2e 25 75 20 20 61 64 6a 75 73 74  : %u..%u  adjust
bd90: 3d 25 64 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20  =%d est=%d\n",. 
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdb0: 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 77 65 72            nLower
bdc0: 2c 20 6e 55 70 70 65 72 2c 20 6e 41 64 6a 75 73  , nUpper, nAdjus
bdd0: 74 2a 2d 31 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  t*-1, pLoop->nOu
bde0: 74 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65  t));.    }..  }e
bdf0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
be00: 20 2a 70 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20   *pbDone==0 );. 
be10: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c   }..  sqlite3Val
be20: 75 65 46 72 65 65 28 70 31 29 3b 0a 20 20 73 71  ueFree(p1);.  sq
be30: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
be40: 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  2);.  sqlite3Val
be50: 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20  ueFree(pVal);.. 
be60: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
be70: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
be80: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
be90: 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  TAT4 */../*.** T
bea0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
beb0: 75 73 65 64 20 74 6f 20 65 73 74 69 6d 61 74 65  used to estimate
bec0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
bed0: 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
bee0: 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 73   visited.** by s
bef0: 63 61 6e 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78  canning an index
bf00: 20 66 6f 72 20 61 20 72 61 6e 67 65 20 6f 66 20   for a range of 
bf10: 76 61 6c 75 65 73 2e 20 54 68 65 20 72 61 6e 67  values. The rang
bf20: 65 20 6d 61 79 20 68 61 76 65 20 61 6e 20 75 70  e may have an up
bf30: 70 65 72 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20  per.** bound, a 
bf40: 6c 6f 77 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20  lower bound, or 
bf50: 62 6f 74 68 2e 20 54 68 65 20 57 48 45 52 45 20  both. The WHERE 
bf60: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61  clause terms tha
bf70: 74 20 73 65 74 20 74 68 65 20 75 70 70 65 72 0a  t set the upper.
bf80: 2a 2a 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75  ** and lower bou
bf90: 6e 64 73 20 61 72 65 20 72 65 70 72 65 73 65 6e  nds are represen
bfa0: 74 65 64 20 62 79 20 70 4c 6f 77 65 72 20 61 6e  ted by pLower an
bfb0: 64 20 70 55 70 70 65 72 20 72 65 73 70 65 63 74  d pUpper respect
bfc0: 69 76 65 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78  ively. For.** ex
bfd0: 61 6d 70 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20  ample, assuming 
bfe0: 74 68 61 74 20 69 6e 64 65 78 20 70 20 69 73 20  that index p is 
bff0: 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20  on t1(a):.**.** 
c000: 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48    ... FROM t1 WH
c010: 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20 61 20  ERE a > ? AND a 
c020: 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20  < ? ....**      
c030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 5f                |_
c040: 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a  ____|   |_____|.
c050: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
c060: 20 20 20 20 20 20 20 20 20 7c 20 20 20 20 20 20           |      
c070: 20 20 20 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20     |.**         
c080: 20 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 77              pLow
c090: 65 72 20 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a  er    pUpper.**.
c0a0: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20  ** If either of 
c0b0: 74 68 65 20 75 70 70 65 72 20 6f 72 20 6c 6f 77  the upper or low
c0c0: 65 72 20 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20  er bound is not 
c0d0: 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55  present, then NU
c0e0: 4c 4c 20 69 73 20 70 61 73 73 65 64 20 69 6e 0a  LL is passed in.
c0f0: 2a 2a 20 70 6c 61 63 65 20 6f 66 20 74 68 65 20  ** place of the 
c100: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68  corresponding Wh
c110: 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54  ereTerm..**.** T
c120: 68 65 20 76 61 6c 75 65 20 69 6e 20 28 70 42 75  he value in (pBu
c130: 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
c140: 74 72 65 65 2e 6e 45 71 29 20 69 73 20 74 68 65  tree.nEq) is the
c150: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
c160: 6e 64 65 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73  ndex.** column s
c170: 75 62 6a 65 63 74 20 74 6f 20 74 68 65 20 72 61  ubject to the ra
c180: 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  nge constraint. 
c190: 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c 79  Or, equivalently
c1a0: 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  , the number of.
c1b0: 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  ** equality cons
c1c0: 74 72 61 69 6e 74 73 20 6f 70 74 69 6d 69 7a 65  traints optimize
c1d0: 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73 65  d by the propose
c1e0: 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f  d index scan. Fo
c1f0: 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73  r example,.** as
c200: 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69  suming index p i
c210: 73 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20 61  s on t1(a, b), a
c220: 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65 72 79  nd the SQL query
c230: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e   is:.**.**   ...
c240: 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
c250: 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41   = ? AND b > ? A
c260: 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a  ND b < ? ....**.
c270: 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73  ** then nEq is s
c280: 65 74 20 74 6f 20 31 20 28 61 73 20 74 68 65 20  et to 1 (as the 
c290: 72 61 6e 67 65 20 72 65 73 74 72 69 63 74 65 64  range restricted
c2a0: 20 63 6f 6c 75 6d 6e 2c 20 62 2c 20 69 73 20 74   column, b, is t
c2b0: 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65  he second .** le
c2c0: 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f  ft-most column o
c2d0: 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f 72  f the index). Or
c2e0: 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20 69  , if the query i
c2f0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46  s:.**.**   ... F
c300: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3e  ROM t1 WHERE a >
c310: 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e   ? AND a < ? ...
c320: 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20  .**.** then nEq 
c330: 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a  is set to 0..**.
c340: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  ** When this fun
c350: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
c360: 20 2a 70 6e 4f 75 74 20 69 73 20 73 65 74 20 74   *pnOut is set t
c370: 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4c 6f 67  o the sqlite3Log
c380: 45 73 74 28 29 20 6f 66 20 74 68 65 0a 2a 2a 20  Est() of the.** 
c390: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
c3a0: 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 73 63  hat the index sc
c3b0: 61 6e 20 69 73 20 65 78 70 65 63 74 65 64 20 74  an is expected t
c3c0: 6f 20 76 69 73 69 74 20 77 69 74 68 6f 75 74 20  o visit without 
c3d0: 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 69 6e 67 20  .** considering 
c3e0: 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  the range constr
c3f0: 61 69 6e 74 73 2e 20 49 66 20 6e 45 71 20 69 73  aints. If nEq is
c400: 20 30 2c 20 74 68 65 6e 20 2a 70 6e 4f 75 74 20   0, then *pnOut 
c410: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
c420: 20 0a 2a 2a 20 72 6f 77 73 20 69 6e 20 74 68 65   .** rows in the
c430: 20 69 6e 64 65 78 2e 20 41 73 73 75 6d 69 6e 67   index. Assuming
c440: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
c450: 2c 20 2a 70 6e 4f 75 74 20 69 73 20 61 64 6a 75  , *pnOut is adju
c460: 73 74 65 64 20 28 72 65 64 75 63 65 64 29 0a 2a  sted (reduced).*
c470: 2a 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  * to account for
c480: 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6e 73 74   the range const
c490: 72 61 69 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e  raints pLower an
c4a0: 64 20 70 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a  d pUpper..** .**
c4b0: 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20   In the absence 
c4c0: 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74 34 20  of sqlite_stat4 
c4d0: 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72  ANALYZE data, or
c4e0: 20 69 66 20 73 75 63 68 20 64 61 74 61 20 63 61   if such data ca
c4f0: 6e 6e 6f 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c  nnot be.** used,
c500: 20 61 20 73 69 6e 67 6c 65 20 72 61 6e 67 65 20   a single range 
c510: 69 6e 65 71 75 61 6c 69 74 79 20 72 65 64 75 63  inequality reduc
c520: 65 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70  es the search sp
c530: 61 63 65 20 62 79 20 61 20 66 61 63 74 6f 72 20  ace by a factor 
c540: 6f 66 20 34 2e 20 0a 2a 2a 20 61 6e 64 20 61 20  of 4. .** and a 
c550: 70 61 69 72 20 6f 66 20 63 6f 6e 73 74 72 61 69  pair of constrai
c560: 6e 74 73 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f  nts (x>? AND x<?
c570: 29 20 72 65 64 75 63 65 73 20 74 68 65 20 65 78  ) reduces the ex
c580: 70 65 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  pected number of
c590: 0a 2a 2a 20 72 6f 77 73 20 76 69 73 69 74 65 64  .** rows visited
c5a0: 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20   by a factor of 
c5b0: 36 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  64..*/.static in
c5c0: 74 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e  t whereRangeScan
c5d0: 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Est(.  Parse *pP
c5e0: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
c5f0: 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65  arsing & code ge
c600: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
c610: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42   */.  WhereLoopB
c620: 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
c630: 2c 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ,.  WhereTerm *p
c640: 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65  Lower,   /* Lowe
c650: 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72  r bound on the r
c660: 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33  ange. ex: "x>123
c670: 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20  " Might be NULL 
c680: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
c690: 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70  pUpper,   /* Upp
c6a0: 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
c6b0: 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35  range. ex: "x<45
c6c0: 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  5" Might be NULL
c6d0: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
c6e0: 2a 70 4c 6f 6f 70 20 20 20 20 20 2f 2a 20 4d 6f  *pLoop     /* Mo
c6f0: 64 69 66 79 20 74 68 65 20 2e 6e 4f 75 74 20 61  dify the .nOut a
c700: 6e 64 20 6d 61 79 62 65 20 2e 72 52 75 6e 20 66  nd maybe .rRun f
c710: 69 65 6c 64 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ields */.){.  in
c720: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c730: 3b 0a 20 20 69 6e 74 20 6e 4f 75 74 20 3d 20 70  ;.  int nOut = p
c740: 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f  Loop->nOut;.  Lo
c750: 67 45 73 74 20 6e 4e 65 77 3b 0a 0a 23 69 66 64  gEst nNew;..#ifd
c760: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c770: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
c780: 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f    Index *p = pLo
c790: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
c7a0: 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  ex;.  int nEq = 
c7b0: 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
c7c0: 45 71 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 53  Eq;..  if( p->nS
c7d0: 61 6d 70 6c 65 3e 30 20 26 26 20 6e 45 71 3c 70  ample>0 && nEq<p
c7e0: 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 20 29 7b 0a  ->nSampleCol ){.
c7f0: 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 70 42 75      if( nEq==pBu
c800: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
c810: 20 29 7b 0a 20 20 20 20 20 20 55 6e 70 61 63 6b   ){.      Unpack
c820: 65 64 52 65 63 6f 72 64 20 2a 70 52 65 63 20 3d  edRecord *pRec =
c830: 20 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b   pBuilder->pRec;
c840: 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 61  .      tRowcnt a
c850: 5b 32 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  [2];.      int n
c860: 42 74 6d 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Btm = pLoop->u.b
c870: 74 72 65 65 2e 6e 42 74 6d 3b 0a 20 20 20 20 20  tree.nBtm;.     
c880: 20 69 6e 74 20 6e 54 6f 70 20 3d 20 70 4c 6f 6f   int nTop = pLoo
c890: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 3b  p->u.btree.nTop;
c8a0: 0a 0a 20 20 20 20 20 20 2f 2a 20 56 61 72 69 61  ..      /* Varia
c8b0: 62 6c 65 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20  ble iLower will 
c8c0: 62 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73  be set to the es
c8d0: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
c8e0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
c8f0: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e  .      ** the in
c900: 64 65 78 20 74 68 61 74 20 61 72 65 20 6c 65 73  dex that are les
c910: 73 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72  s than the lower
c920: 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61   bound of the ra
c930: 6e 67 65 20 71 75 65 72 79 2e 20 54 68 65 0a 20  nge query. The. 
c940: 20 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f       ** lower bo
c950: 75 6e 64 20 62 65 69 6e 67 20 74 68 65 20 63 6f  und being the co
c960: 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24  ncatenation of $
c970: 50 20 61 6e 64 20 24 4c 2c 20 77 68 65 72 65 20  P and $L, where 
c980: 24 50 20 69 73 20 74 68 65 0a 20 20 20 20 20 20  $P is the.      
c990: 2a 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66 6f  ** key-prefix fo
c9a0: 72 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71 20  rmed by the nEq 
c9b0: 76 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20 61  values matched a
c9c0: 67 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20 6c  gainst the nEq l
c9d0: 65 66 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a  eft-most.      *
c9e0: 2a 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  * columns of the
c9f0: 20 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69   index, and $L i
ca00: 73 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  s the value in p
ca10: 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a  Lower..      **.
ca20: 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20        ** Or, if 
ca30: 70 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f  pLower is NULL o
ca40: 72 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65  r $L cannot be e
ca50: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74  xtracted from it
ca60: 20 28 62 65 63 61 75 73 65 20 69 74 0a 20 20 20   (because it.   
ca70: 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73     ** is not a s
ca80: 69 6d 70 6c 65 20 76 61 72 69 61 62 6c 65 20 6f  imple variable o
ca90: 72 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 29  r literal value)
caa0: 2c 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e  , the lower boun
cab0: 64 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  d of the.      *
cac0: 2a 20 72 61 6e 67 65 20 69 73 20 24 50 2e 20 44  * range is $P. D
cad0: 75 65 20 74 6f 20 61 20 71 75 69 72 6b 20 69 6e  ue to a quirk in
cae0: 20 74 68 65 20 77 61 79 20 77 68 65 72 65 4b 65   the way whereKe
caf0: 79 53 74 61 74 73 28 29 20 77 6f 72 6b 73 2c 20  yStats() works, 
cb00: 65 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 66  even.      ** if
cb10: 20 24 4c 20 69 73 20 61 76 61 69 6c 61 62 6c 65   $L is available
cb20: 2c 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28  , whereKeyStats(
cb30: 29 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  ) is called for 
cb40: 62 6f 74 68 20 28 24 50 29 20 61 6e 64 20 0a 20  both ($P) and . 
cb50: 20 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20       ** ($P:$L) 
cb60: 61 6e 64 20 74 68 65 20 6c 61 72 67 65 72 20 6f  and the larger o
cb70: 66 20 74 68 65 20 74 77 6f 20 72 65 74 75 72 6e  f the two return
cb80: 65 64 20 76 61 6c 75 65 73 20 69 73 20 75 73 65  ed values is use
cb90: 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
cba0: 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20    ** Similarly, 
cbb0: 69 55 70 70 65 72 20 69 73 20 74 6f 20 62 65 20  iUpper is to be 
cbc0: 73 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d  set to the estim
cbd0: 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
cbe0: 72 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20  r of rows.      
cbf0: 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ** less than the
cc00: 20 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20   upper bound of 
cc10: 74 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e  the range query.
cc20: 20 57 68 65 72 65 20 74 68 65 20 75 70 70 65 72   Where the upper
cc30: 20 62 6f 75 6e 64 0a 20 20 20 20 20 20 2a 2a 20   bound.      ** 
cc40: 69 73 20 65 69 74 68 65 72 20 28 24 50 29 20 6f  is either ($P) o
cc50: 72 20 28 24 50 3a 24 55 29 2e 20 41 67 61 69 6e  r ($P:$U). Again
cc60: 2c 20 65 76 65 6e 20 69 66 20 24 55 20 69 73 20  , even if $U is 
cc70: 61 76 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20  available, both 
cc80: 76 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20  values.      ** 
cc90: 6f 66 20 69 55 70 70 65 72 20 61 72 65 20 72 65  of iUpper are re
cca0: 71 75 65 73 74 65 64 20 6f 66 20 77 68 65 72 65  quested of where
ccb0: 4b 65 79 53 74 61 74 73 28 29 20 61 6e 64 20 74  KeyStats() and t
ccc0: 68 65 20 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e  he smaller used.
ccd0: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
cce0: 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
ccf0: 20 72 6f 77 73 20 62 65 74 77 65 65 6e 20 74 68   rows between th
cd00: 65 20 74 77 6f 20 62 6f 75 6e 64 73 20 69 73 20  e two bounds is 
cd10: 74 68 65 6e 20 6a 75 73 74 20 69 55 70 70 65 72  then just iUpper
cd20: 2d 69 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a  -iLower..      *
cd30: 2f 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20  /.      tRowcnt 
cd40: 69 4c 6f 77 65 72 3b 20 20 20 20 20 2f 2a 20 52  iLower;     /* R
cd50: 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68  ows less than th
cd60: 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f  e lower bound */
cd70: 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69  .      tRowcnt i
cd80: 55 70 70 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f  Upper;     /* Ro
cd90: 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ws less than the
cda0: 20 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a   upper bound */.
cdb0: 20 20 20 20 20 20 69 6e 74 20 69 4c 77 72 49 64        int iLwrId
cdc0: 78 20 3d 20 2d 32 3b 20 20 20 2f 2a 20 61 53 61  x = -2;   /* aSa
cdd0: 6d 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 6c  mple[] for the l
cde0: 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20  ower bound */.  
cdf0: 20 20 20 20 69 6e 74 20 69 55 70 72 49 64 78 20      int iUprIdx 
ce00: 3d 20 2d 31 3b 20 20 20 2f 2a 20 61 53 61 6d 70  = -1;   /* aSamp
ce10: 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 75 70 70  le[] for the upp
ce20: 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 0a 20 20 20  er bound */..   
ce30: 20 20 20 69 66 28 20 70 52 65 63 20 29 7b 0a 20     if( pRec ){. 
ce40: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
ce50: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 21 3d 70   pRec->nField!=p
ce60: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
ce70: 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20 70 52  id );.        pR
ce80: 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 42 75  ec->nField = pBu
ce90: 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64  ilder->nRecValid
cea0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ceb0: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 4c 6f  /* Determine iLo
cec0: 77 65 72 20 61 6e 64 20 69 55 70 70 65 72 20 75  wer and iUpper u
ced0: 73 69 6e 67 20 28 24 50 29 20 6f 6e 6c 79 2e 20  sing ($P) only. 
cee0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71  */.      if( nEq
cef0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
cf00: 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  Lower = 0;.     
cf10: 20 20 20 69 55 70 70 65 72 20 3d 20 70 2d 3e 6e     iUpper = p->n
cf20: 52 6f 77 45 73 74 30 3b 0a 20 20 20 20 20 20 7d  RowEst0;.      }
cf30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
cf40: 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 6c 6c   Note: this call
cf50: 20 63 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d 69   could be optimi
cf60: 7a 65 64 20 61 77 61 79 20 2d 20 73 69 6e 63 65  zed away - since
cf70: 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 73   the same values
cf80: 20 6d 75 73 74 20 0a 20 20 20 20 20 20 20 20 2a   must .        *
cf90: 2a 20 68 61 76 65 20 62 65 65 6e 20 72 65 71 75  * have been requ
cfa0: 65 73 74 65 64 20 77 68 65 6e 20 74 65 73 74 69  ested when testi
cfb0: 6e 67 20 6b 65 79 20 24 50 20 69 6e 20 77 68 65  ng key $P in whe
cfc0: 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 29  reEqualScanEst()
cfd0: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68  .  */.        wh
cfe0: 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61 72  ereKeyStats(pPar
cff0: 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c 20  se, p, pRec, 0, 
d000: 61 29 3b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77  a);.        iLow
d010: 65 72 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20  er = a[0];.     
d020: 20 20 20 69 55 70 70 65 72 20 3d 20 61 5b 30 5d     iUpper = a[0]
d030: 20 2b 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d   + a[1];.      }
d040: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
d050: 70 4c 6f 77 65 72 3d 3d 30 20 7c 7c 20 28 70 4c  pLower==0 || (pL
d060: 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20  ower->eOperator 
d070: 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 29  & (WO_GT|WO_GE))
d080: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  !=0 );.      ass
d090: 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c  ert( pUpper==0 |
d0a0: 7c 20 28 70 55 70 70 65 72 2d 3e 65 4f 70 65 72  | (pUpper->eOper
d0b0: 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f  ator & (WO_LT|WO
d0c0: 5f 4c 45 29 29 21 3d 30 20 29 3b 0a 20 20 20 20  _LE))!=0 );.    
d0d0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 6f    assert( p->aSo
d0e0: 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
d0f0: 20 20 20 20 69 66 28 20 70 2d 3e 61 53 6f 72 74      if( p->aSort
d100: 4f 72 64 65 72 5b 6e 45 71 5d 20 29 7b 0a 20 20  Order[nEq] ){.  
d110: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c        /* The rol
d120: 65 73 20 6f 66 20 70 4c 6f 77 65 72 20 61 6e 64  es of pLower and
d130: 20 70 55 70 70 65 72 20 61 72 65 20 73 77 61 70   pUpper are swap
d140: 70 65 64 20 66 6f 72 20 61 20 44 45 53 43 20 69  ped for a DESC i
d150: 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20  ndex */.        
d160: 53 57 41 50 28 57 68 65 72 65 54 65 72 6d 2a 2c  SWAP(WhereTerm*,
d170: 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 29   pLower, pUpper)
d180: 3b 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 69  ;.        SWAP(i
d190: 6e 74 2c 20 6e 42 74 6d 2c 20 6e 54 6f 70 29 3b  nt, nBtm, nTop);
d1a0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
d1b0: 2f 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  /* If possible, 
d1c0: 69 6d 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69  improve on the i
d1d0: 4c 6f 77 65 72 20 65 73 74 69 6d 61 74 65 20 75  Lower estimate u
d1e0: 73 69 6e 67 20 28 24 50 3a 24 4c 29 2e 20 2a 2f  sing ($P:$L). */
d1f0: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 77 65  .      if( pLowe
d200: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  r ){.        int
d210: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
d220: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 73         /* Values
d230: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
d240: 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 20  pExpr */.       
d250: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
d260: 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52  Lower->pExpr->pR
d270: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63  ight;.        rc
d280: 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50   = sqlite3Stat4P
d290: 72 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61  robeSetValue(pPa
d2a0: 72 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70  rse, p, &pRec, p
d2b0: 45 78 70 72 2c 20 6e 42 74 6d 2c 20 6e 45 71 2c  Expr, nBtm, nEq,
d2c0: 20 26 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66   &n);.        if
d2d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d2e0: 26 26 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  && n ){.        
d2f0: 20 20 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a    tRowcnt iNew;.
d300: 20 20 20 20 20 20 20 20 20 20 75 31 36 20 6d 61            u16 ma
d310: 73 6b 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f 4c 45  sk = WO_GT|WO_LE
d320: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
d330: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
d340: 72 53 69 7a 65 28 70 45 78 70 72 29 3e 6e 20 29  rSize(pExpr)>n )
d350: 20 6d 61 73 6b 20 3d 20 28 57 4f 5f 4c 45 7c 57   mask = (WO_LE|W
d360: 4f 5f 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 20  O_LT);.         
d370: 20 69 4c 77 72 49 64 78 20 3d 20 77 68 65 72 65   iLwrIdx = where
d380: 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
d390: 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b   p, pRec, 0, a);
d3a0: 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20  .          iNew 
d3b0: 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65  = a[0] + ((pLowe
d3c0: 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6d  r->eOperator & m
d3d0: 61 73 6b 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29  ask) ? a[1] : 0)
d3e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
d3f0: 69 4e 65 77 3e 69 4c 6f 77 65 72 20 29 20 69 4c  iNew>iLower ) iL
d400: 6f 77 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20  ower = iNew;.   
d410: 20 20 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20         nOut--;. 
d420: 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20           pLower 
d430: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
d440: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
d450: 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d   If possible, im
d460: 70 72 6f 76 65 20 6f 6e 20 74 68 65 20 69 55 70  prove on the iUp
d470: 70 65 72 20 65 73 74 69 6d 61 74 65 20 75 73 69  per estimate usi
d480: 6e 67 20 28 24 50 3a 24 55 29 2e 20 2a 2f 0a 20  ng ($P:$U). */. 
d490: 20 20 20 20 20 69 66 28 20 70 55 70 70 65 72 20       if( pUpper 
d4a0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
d4b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d4c0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 65       /* Values e
d4d0: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45  xtracted from pE
d4e0: 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45  xpr */.        E
d4f0: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 55 70  xpr *pExpr = pUp
d500: 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  per->pExpr->pRig
d510: 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ht;.        rc =
d520: 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f   sqlite3Stat4Pro
d530: 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72 73  beSetValue(pPars
d540: 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78  e, p, &pRec, pEx
d550: 70 72 2c 20 6e 54 6f 70 2c 20 6e 45 71 2c 20 26  pr, nTop, nEq, &
d560: 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n);.        if( 
d570: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
d580: 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   n ){.          
d590: 74 52 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20  tRowcnt iNew;.  
d5a0: 20 20 20 20 20 20 20 20 75 31 36 20 6d 61 73 6b          u16 mask
d5b0: 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f 4c 45 3b 0a   = WO_GT|WO_LE;.
d5c0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
d5d0: 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
d5e0: 69 7a 65 28 70 45 78 70 72 29 3e 6e 20 29 20 6d  ize(pExpr)>n ) m
d5f0: 61 73 6b 20 3d 20 28 57 4f 5f 4c 45 7c 57 4f 5f  ask = (WO_LE|WO_
d600: 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  LT);.          i
d610: 55 70 72 49 64 78 20 3d 20 77 68 65 72 65 4b 65  UprIdx = whereKe
d620: 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20 70  yStats(pParse, p
d630: 2c 20 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a 20  , pRec, 1, a);. 
d640: 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20           iNew = 
d650: 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65 72 2d  a[0] + ((pUpper-
d660: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6d 61 73  >eOperator & mas
d670: 6b 29 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a  k) ? a[1] : 0);.
d680: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e            if( iN
d690: 65 77 3c 69 55 70 70 65 72 20 29 20 69 55 70 70  ew<iUpper ) iUpp
d6a0: 65 72 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20  er = iNew;.     
d6b0: 20 20 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20       nOut--;.   
d6c0: 20 20 20 20 20 20 20 70 55 70 70 65 72 20 3d 20         pUpper = 
d6d0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
d6e0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 42 75 69     }..      pBui
d6f0: 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 70 52 65  lder->pRec = pRe
d700: 63 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  c;.      if( rc=
d710: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d720: 20 20 20 20 20 20 69 66 28 20 69 55 70 70 65 72        if( iUpper
d730: 3e 69 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20  >iLower ){.     
d740: 20 20 20 20 20 6e 4e 65 77 20 3d 20 73 71 6c 69       nNew = sqli
d750: 74 65 33 4c 6f 67 45 73 74 28 69 55 70 70 65 72  te3LogEst(iUpper
d760: 20 2d 20 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20   - iLower);.    
d770: 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
d780: 20 20 49 66 20 62 6f 74 68 20 69 55 70 70 65 72    If both iUpper
d790: 20 61 6e 64 20 69 4c 6f 77 65 72 20 61 72 65 20   and iLower are 
d7a0: 64 65 72 69 76 65 64 20 66 72 6f 6d 20 74 68 65  derived from the
d7b0: 20 73 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20   same.          
d7c0: 2a 2a 20 73 61 6d 70 6c 65 2c 20 74 68 65 6e 20  ** sample, then 
d7d0: 61 73 73 75 6d 65 20 74 68 65 79 20 61 72 65 20  assume they are 
d7e0: 34 78 20 6d 6f 72 65 20 73 65 6c 65 63 74 69 76  4x more selectiv
d7f0: 65 2e 20 20 54 68 69 73 20 62 72 69 6e 67 73 0a  e.  This brings.
d800: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
d810: 20 65 73 74 69 6d 61 74 65 64 20 73 65 6c 65 63   estimated selec
d820: 74 69 76 69 74 79 20 6d 6f 72 65 20 69 6e 20 6c  tivity more in l
d830: 69 6e 65 20 77 69 74 68 20 77 68 61 74 20 69 74  ine with what it
d840: 20 77 6f 75 6c 64 20 62 65 0a 20 20 20 20 20 20   would be.      
d850: 20 20 20 20 2a 2a 20 69 66 20 65 73 74 69 6d 61      ** if estima
d860: 74 65 64 20 77 69 74 68 6f 75 74 20 74 68 65 20  ted without the 
d870: 75 73 65 20 6f 66 20 53 54 41 54 33 2f 34 20 74  use of STAT3/4 t
d880: 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  ables. */.      
d890: 20 20 20 20 69 66 28 20 69 4c 77 72 49 64 78 3d      if( iLwrIdx=
d8a0: 3d 69 55 70 72 49 64 78 20 29 20 6e 4e 65 77 20  =iUprIdx ) nNew 
d8b0: 2d 3d 20 32 30 3b 20 20 61 73 73 65 72 74 28 20  -= 20;  assert( 
d8c0: 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73  20==sqlite3LogEs
d8d0: 74 28 34 29 20 29 3b 0a 20 20 20 20 20 20 20 20  t(4) );.        
d8e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
d8f0: 20 6e 4e 65 77 20 3d 20 31 30 3b 20 20 20 20 20   nNew = 10;     
d900: 20 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73     assert( 10==s
d910: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20  qlite3LogEst(2) 
d920: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
d930: 20 20 20 20 20 69 66 28 20 6e 4e 65 77 3c 6e 4f       if( nNew<nO
d940: 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ut ){.          
d950: 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20  nOut = nNew;.   
d960: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 57       }.        W
d970: 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 20  HERETRACE(0x10, 
d980: 28 22 53 54 41 54 34 20 72 61 6e 67 65 20 73 63  ("STAT4 range sc
d990: 61 6e 3a 20 25 75 2e 2e 25 75 20 20 65 73 74 3d  an: %u..%u  est=
d9a0: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
d9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9c0: 20 20 28 75 33 32 29 69 4c 6f 77 65 72 2c 20 28    (u32)iLower, (
d9d0: 75 33 32 29 69 55 70 70 65 72 2c 20 6e 4f 75 74  u32)iUpper, nOut
d9e0: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
d9f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
da00: 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20   bDone = 0;.    
da10: 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67    rc = whereRang
da20: 65 53 6b 69 70 53 63 61 6e 45 73 74 28 70 50 61  eSkipScanEst(pPa
da30: 72 73 65 2c 20 70 4c 6f 77 65 72 2c 20 70 55 70  rse, pLower, pUp
da40: 70 65 72 2c 20 70 4c 6f 6f 70 2c 20 26 62 44 6f  per, pLoop, &bDo
da50: 6e 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62  ne);.      if( b
da60: 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 72 63  Done ) return rc
da70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
da80: 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
da90: 45 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20 20  ETER(pParse);.  
daa0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
dab0: 28 70 42 75 69 6c 64 65 72 29 3b 0a 20 20 61 73  (pBuilder);.  as
dac0: 73 65 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20  sert( pLower || 
dad0: 70 55 70 70 65 72 20 29 3b 0a 23 65 6e 64 69 66  pUpper );.#endif
dae0: 0a 20 20 61 73 73 65 72 74 28 20 70 55 70 70 65  .  assert( pUppe
daf0: 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65 72 2d  r==0 || (pUpper-
db00: 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
db10: 56 4e 55 4c 4c 29 3d 3d 30 20 29 3b 0a 20 20 6e  VNULL)==0 );.  n
db20: 4e 65 77 20 3d 20 77 68 65 72 65 52 61 6e 67 65  New = whereRange
db30: 41 64 6a 75 73 74 28 70 4c 6f 77 65 72 2c 20 6e  Adjust(pLower, n
db40: 4f 75 74 29 3b 0a 20 20 6e 4e 65 77 20 3d 20 77  Out);.  nNew = w
db50: 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74 28  hereRangeAdjust(
db60: 70 55 70 70 65 72 2c 20 6e 4e 65 77 29 3b 0a 0a  pUpper, nNew);..
db70: 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66 20    /* TUNING: If 
db80: 74 68 65 72 65 20 69 73 20 62 6f 74 68 20 61 6e  there is both an
db90: 20 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72   upper and lower
dba0: 20 6c 69 6d 69 74 20 61 6e 64 20 6e 65 69 74 68   limit and neith
dbb0: 65 72 20 6c 69 6d 69 74 0a 20 20 2a 2a 20 68 61  er limit.  ** ha
dbc0: 73 20 61 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e  s an application
dbd0: 2d 64 65 66 69 6e 65 64 20 6c 69 6b 65 6c 69 68  -defined likelih
dbe0: 6f 6f 64 28 29 2c 20 61 73 73 75 6d 65 20 74 68  ood(), assume th
dbf0: 65 20 72 61 6e 67 65 20 69 73 0a 20 20 2a 2a 20  e range is.  ** 
dc00: 72 65 64 75 63 65 64 20 62 79 20 61 6e 20 61 64  reduced by an ad
dc10: 64 69 74 69 6f 6e 61 6c 20 37 35 25 2e 20 54 68  ditional 75%. Th
dc20: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 2c 20 62  is means that, b
dc30: 79 20 64 65 66 61 75 6c 74 2c 20 61 6e 20 6f 70  y default, an op
dc40: 65 6e 2d 65 6e 64 65 64 0a 20 20 2a 2a 20 72 61  en-ended.  ** ra
dc50: 6e 67 65 20 71 75 65 72 79 20 28 65 2e 67 2e 20  nge query (e.g. 
dc60: 63 6f 6c 20 3e 20 3f 29 20 69 73 20 61 73 73 75  col > ?) is assu
dc70: 6d 65 64 20 74 6f 20 6d 61 74 63 68 20 31 2f 34  med to match 1/4
dc80: 20 6f 66 20 74 68 65 20 72 6f 77 73 20 69 6e 20   of the rows in 
dc90: 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 2e 20  the.  ** index. 
dca0: 57 68 69 6c 65 20 61 20 63 6c 6f 73 65 64 20 72  While a closed r
dcb0: 61 6e 67 65 20 28 65 2e 67 2e 20 63 6f 6c 20 42  ange (e.g. col B
dcc0: 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f 29 20  ETWEEN ? AND ?) 
dcd0: 69 73 20 65 73 74 69 6d 61 74 65 64 20 74 6f 0a  is estimated to.
dce0: 20 20 2a 2a 20 6d 61 74 63 68 20 31 2f 36 34 20    ** match 1/64 
dcf0: 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 2a 2f  of the index. */
dd00: 20 0a 20 20 69 66 28 20 70 4c 6f 77 65 72 20 26   .  if( pLower &
dd10: 26 20 70 4c 6f 77 65 72 2d 3e 74 72 75 74 68 50  & pLower->truthP
dd20: 72 6f 62 3e 30 20 26 26 20 70 55 70 70 65 72 20  rob>0 && pUpper 
dd30: 26 26 20 70 55 70 70 65 72 2d 3e 74 72 75 74 68  && pUpper->truth
dd40: 50 72 6f 62 3e 30 20 29 7b 0a 20 20 20 20 6e 4e  Prob>0 ){.    nN
dd50: 65 77 20 2d 3d 20 32 30 3b 0a 20 20 7d 0a 0a 20  ew -= 20;.  }.. 
dd60: 20 6e 4f 75 74 20 2d 3d 20 28 70 4c 6f 77 65 72   nOut -= (pLower
dd70: 21 3d 30 29 20 2b 20 28 70 55 70 70 65 72 21 3d  !=0) + (pUpper!=
dd80: 30 29 3b 0a 20 20 69 66 28 20 6e 4e 65 77 3c 31  0);.  if( nNew<1
dd90: 30 20 29 20 6e 4e 65 77 20 3d 20 31 30 3b 0a 20  0 ) nNew = 10;. 
dda0: 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29   if( nNew<nOut )
ddb0: 20 6e 4f 75 74 20 3d 20 6e 4e 65 77 3b 0a 23 69   nOut = nNew;.#i
ddc0: 66 20 64 65 66 69 6e 65 64 28 57 48 45 52 45 54  f defined(WHERET
ddd0: 52 41 43 45 5f 45 4e 41 42 4c 45 44 29 0a 20 20  RACE_ENABLED).  
dde0: 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e  if( pLoop->nOut>
ddf0: 6e 4f 75 74 20 29 7b 0a 20 20 20 20 57 48 45 52  nOut ){.    WHER
de00: 45 54 52 41 43 45 28 30 78 31 30 2c 28 22 52 61  ETRACE(0x10,("Ra
de10: 6e 67 65 20 73 63 61 6e 20 6c 6f 77 65 72 73 20  nge scan lowers 
de20: 6e 4f 75 74 20 66 72 6f 6d 20 25 64 20 74 6f 20  nOut from %d to 
de30: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
de40: 20 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f 70             pLoop
de50: 2d 3e 6e 4f 75 74 2c 20 6e 4f 75 74 29 29 3b 0a  ->nOut, nOut));.
de60: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 4c 6f    }.#endif.  pLo
de70: 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67 45  op->nOut = (LogE
de80: 73 74 29 6e 4f 75 74 3b 0a 20 20 72 65 74 75 72  st)nOut;.  retur
de90: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
dea0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
deb0: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a  AT3_OR_STAT4./*.
dec0: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
ded0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
dee0: 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
def0: 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  rned based on.**
df00: 20 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e   an equality con
df10: 73 74 72 61 69 6e 74 20 78 3d 56 41 4c 55 45 20  straint x=VALUE 
df20: 61 6e 64 20 77 68 65 72 65 20 74 68 61 74 20 56  and where that V
df30: 41 4c 55 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a  ALUE occurs in.*
df40: 2a 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d 20  * the histogram 
df50: 64 61 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79  data.  This only
df60: 20 77 6f 72 6b 73 20 77 68 65 6e 20 78 20 69 73   works when x is
df70: 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a   the left-most.*
df80: 2a 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69  * column of an i
df90: 6e 64 65 78 20 61 6e 64 20 73 71 6c 69 74 65 5f  ndex and sqlite_
dfa0: 73 74 61 74 33 20 68 69 73 74 6f 67 72 61 6d 20  stat3 histogram 
dfb0: 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c  data is availabl
dfc0: 65 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 69 6e  e.** for that in
dfd0: 64 65 78 2e 20 20 57 68 65 6e 20 70 45 78 70 72  dex.  When pExpr
dfe0: 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
dff0: 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  s the constraint
e000: 20 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c   is.** "x IS NUL
e010: 4c 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 78  L" instead of "x
e020: 3d 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57  =VALUE"..**.** W
e030: 72 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74  rite the estimat
e040: 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74  ed row count int
e050: 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74  o *pnRow and ret
e060: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a  urn SQLITE_OK. .
e070: 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20  ** If unable to 
e080: 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65  make an estimate
e090: 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75  , leave *pnRow u
e0a0: 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74  nchanged and ret
e0b0: 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e  urn.** non-zero.
e0c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
e0d0: 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20  ine can fail if 
e0e0: 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20  it is unable to 
e0f0: 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67  load a collating
e100: 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71   sequence.** req
e110: 75 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67  uired for string
e120: 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20   comparison, or 
e130: 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c  if unable to all
e140: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  ocate memory.** 
e150: 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72  for a UTF conver
e160: 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f  sion required fo
e170: 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54  r comparison.  T
e180: 68 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72  he error is stor
e190: 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61  ed.** in the pPa
e1a0: 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
e1b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
e1c0: 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 0a  reEqualScanEst(.
e1d0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
e1e0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
e1f0: 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74  g & code generat
e200: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
e210: 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65   WhereLoopBuilde
e220: 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45  r *pBuilder,.  E
e230: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
e240: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
e250: 6e 20 66 6f 72 20 56 41 4c 55 45 20 69 6e 20 74  n for VALUE in t
e260: 68 65 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74  he x=VALUE const
e270: 72 61 69 6e 74 20 2a 2f 0a 20 20 74 52 6f 77 63  raint */.  tRowc
e280: 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20  nt *pnRow       
e290: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76  /* Write the rev
e2a0: 69 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74  ised row estimat
e2b0: 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49  e here */.){.  I
e2c0: 6e 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64  ndex *p = pBuild
e2d0: 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
e2e0: 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20  e.pIndex;.  int 
e2f0: 6e 45 71 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nEq = pBuilder->
e300: 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
e310: 71 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  q;.  UnpackedRec
e320: 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75 69  ord *pRec = pBui
e330: 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 69 6e  lder->pRec;.  in
e340: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
e350: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75          /* Subfu
e360: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f  nction return co
e370: 64 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  de */.  tRowcnt 
e380: 61 5b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  a[2];           
e390: 20 20 2f 2a 20 53 74 61 74 69 73 74 69 63 73 20    /* Statistics 
e3a0: 2a 2f 0a 20 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20  */.  int bOk;.. 
e3b0: 20 61 73 73 65 72 74 28 20 6e 45 71 3e 3d 31 20   assert( nEq>=1 
e3c0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 71  );.  assert( nEq
e3d0: 3c 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a  <=p->nColumn );.
e3e0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61    assert( p->aSa
e3f0: 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  mple!=0 );.  ass
e400: 65 72 74 28 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e  ert( p->nSample>
e410: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
e420: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
e430: 69 64 3c 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20  id<nEq );..  /* 
e440: 49 66 20 76 61 6c 75 65 73 20 61 72 65 20 6e 6f  If values are no
e450: 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  t available for 
e460: 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68  all fields of th
e470: 65 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c  e index to the l
e480: 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73  eft.  ** of this
e490: 20 6f 6e 65 2c 20 6e 6f 20 65 73 74 69 6d 61 74   one, no estimat
e4a0: 65 20 63 61 6e 20 62 65 20 6d 61 64 65 2e 20 52  e can be made. R
e4b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
e4c0: 46 4f 55 4e 44 2e 20 2a 2f 0a 20 20 69 66 28 20  FOUND. */.  if( 
e4d0: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
e4e0: 6c 69 64 3c 28 6e 45 71 2d 31 29 20 29 7b 0a 20  lid<(nEq-1) ){. 
e4f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e500: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a  _NOTFOUND;.  }..
e510: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 6e 20    /* This is an 
e520: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c  optimization onl
e530: 79 2e 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73  y. The call to s
e540: 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
e550: 53 65 74 56 61 6c 75 65 28 29 0a 20 20 2a 2a 20  SetValue().  ** 
e560: 62 65 6c 6f 77 20 77 6f 75 6c 64 20 72 65 74 75  below would retu
e570: 72 6e 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  rn the same valu
e580: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e 45 71  e.  */.  if( nEq
e590: 3e 3d 70 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  >=p->nColumn ){.
e5a0: 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a      *pnRow = 1;.
e5b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e5c0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  E_OK;.  }..  rc 
e5d0: 3d 20 73 71 6c 69 74 65 33 53 74 61 74 34 50 72  = sqlite3Stat4Pr
e5e0: 6f 62 65 53 65 74 56 61 6c 75 65 28 70 50 61 72  obeSetValue(pPar
e5f0: 73 65 2c 20 70 2c 20 26 70 52 65 63 2c 20 70 45  se, p, &pRec, pE
e600: 78 70 72 2c 20 31 2c 20 6e 45 71 2d 31 2c 20 26  xpr, 1, nEq-1, &
e610: 62 4f 6b 29 3b 0a 20 20 70 42 75 69 6c 64 65 72  bOk);.  pBuilder
e620: 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20  ->pRec = pRec;. 
e630: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e640: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
e650: 20 20 69 66 28 20 62 4f 6b 3d 3d 30 20 29 20 72    if( bOk==0 ) r
e660: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
e670: 46 4f 55 4e 44 3b 0a 20 20 70 42 75 69 6c 64 65  FOUND;.  pBuilde
e680: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e  r->nRecValid = n
e690: 45 71 3b 0a 0a 20 20 77 68 65 72 65 4b 65 79 53  Eq;..  whereKeyS
e6a0: 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
e6b0: 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 57  pRec, 0, a);.  W
e6c0: 48 45 52 45 54 52 41 43 45 28 30 78 31 30 2c 28  HERETRACE(0x10,(
e6d0: 22 65 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72  "equality scan r
e6e0: 65 67 69 6f 6e 73 20 25 73 28 25 64 29 3a 20 25  egions %s(%d): %
e6f0: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
e700: 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d           p->zNam
e710: 65 2c 20 6e 45 71 2d 31 2c 20 28 69 6e 74 29 61  e, nEq-1, (int)a
e720: 5b 31 5d 29 29 3b 0a 20 20 2a 70 6e 52 6f 77 20  [1]));.  *pnRow 
e730: 3d 20 61 5b 31 5d 3b 0a 20 20 0a 20 20 72 65 74  = a[1];.  .  ret
e740: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
e750: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
e760: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
e770: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
e780: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
e790: 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45  OR_STAT4./*.** E
e7a0: 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
e7b0: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
e7c0: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
e7d0: 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20   based on.** an 
e7e0: 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 68  IN constraint wh
e7f0: 65 72 65 20 74 68 65 20 72 69 67 68 74 2d 68 61  ere the right-ha
e800: 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  nd side of the I
e810: 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73  N operator.** is
e820: 20 61 20 6c 69 73 74 20 6f 66 20 76 61 6c 75 65   a list of value
e830: 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  s.  Example:.**.
e840: 2a 2a 20 20 20 20 20 20 20 20 57 48 45 52 45 20  **        WHERE 
e850: 78 20 49 4e 20 28 31 2c 32 2c 33 2c 34 29 0a 2a  x IN (1,2,3,4).*
e860: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65  *.** Write the e
e870: 73 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75  stimated row cou
e880: 6e 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61  nt into *pnRow a
e890: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
e8a0: 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62  _OK. .** If unab
e8b0: 6c 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73  le to make an es
e8c0: 74 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70  timate, leave *p
e8d0: 6e 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61  nRow unchanged a
e8e0: 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  nd return.** non
e8f0: 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  -zero..**.** Thi
e900: 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61  s routine can fa
e910: 69 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61 62  il if it is unab
e920: 6c 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c  le to load a col
e930: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a  lating sequence.
e940: 2a 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  ** required for 
e950: 73 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f  string compariso
e960: 6e 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20  n, or if unable 
e970: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
e980: 72 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20  ry.** for a UTF 
e990: 63 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69  conversion requi
e9a0: 72 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73  red for comparis
e9b0: 6f 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69  on.  The error i
e9c0: 73 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74  s stored.** in t
e9d0: 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
e9e0: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
e9f0: 6e 74 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73  nt whereInScanEs
ea00: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
ea10: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
ea20: 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65  sing & code gene
ea30: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
ea40: 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  /.  WhereLoopBui
ea50: 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a  lder *pBuilder,.
ea60: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
ea70: 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61  t,     /* The va
ea80: 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74 68 65 20  lue list on the 
ea90: 52 48 53 20 6f 66 20 22 78 20 49 4e 20 28 76 31  RHS of "x IN (v1
eaa0: 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a  ,v2,v3,...)" */.
eab0: 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e 52 6f 77    tRowcnt *pnRow
eac0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
ead0: 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77 20  the revised row 
eae0: 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a 2f  estimate here */
eaf0: 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d  .){.  Index *p =
eb00: 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
eb10: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
eb20: 0a 20 20 69 36 34 20 6e 52 6f 77 30 20 3d 20 73  .  i64 nRow0 = s
eb30: 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e  qlite3LogEstToIn
eb40: 74 28 70 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  t(p->aiRowLogEst
eb50: 5b 30 5d 29 3b 0a 20 20 69 6e 74 20 6e 52 65 63  [0]);.  int nRec
eb60: 56 61 6c 69 64 20 3d 20 70 42 75 69 6c 64 65 72  Valid = pBuilder
eb70: 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20 69  ->nRecValid;.  i
eb80: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
eb90: 4b 3b 20 20 20 20 20 2f 2a 20 53 75 62 66 75 6e  K;     /* Subfun
eba0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64  ction return cod
ebb0: 65 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e  e */.  tRowcnt n
ebc0: 45 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Est;           /
ebd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * Number of rows
ebe0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 65   for a single te
ebf0: 72 6d 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20  rm */.  tRowcnt 
ec00: 6e 52 6f 77 45 73 74 20 3d 20 30 3b 20 20 20 20  nRowEst = 0;    
ec10: 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20  /* New estimate 
ec20: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
ec30: 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 69   rows */.  int i
ec40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ec50: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
ec60: 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
ec70: 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29   p->aSample!=0 )
ec80: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d  ;.  for(i=0; rc=
ec90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
eca0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
ecb0: 2b 29 7b 0a 20 20 20 20 6e 45 73 74 20 3d 20 6e  +){.    nEst = n
ecc0: 52 6f 77 30 3b 0a 20 20 20 20 72 63 20 3d 20 77  Row0;.    rc = w
ecd0: 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
ece0: 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
ecf0: 72 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  r, pList->a[i].p
ed00: 45 78 70 72 2c 20 26 6e 45 73 74 29 3b 0a 20 20  Expr, &nEst);.  
ed10: 20 20 6e 52 6f 77 45 73 74 20 2b 3d 20 6e 45 73    nRowEst += nEs
ed20: 74 3b 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d  t;.    pBuilder-
ed30: 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65  >nRecValid = nRe
ed40: 63 56 61 6c 69 64 3b 0a 20 20 7d 0a 0a 20 20 69  cValid;.  }..  i
ed50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
ed60: 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77   ){.    if( nRow
ed70: 45 73 74 20 3e 20 6e 52 6f 77 30 20 29 20 6e 52  Est > nRow0 ) nR
ed80: 6f 77 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20  owEst = nRow0;. 
ed90: 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77     *pnRow = nRow
eda0: 45 73 74 3b 0a 20 20 20 20 57 48 45 52 45 54 52  Est;.    WHERETR
edb0: 41 43 45 28 30 78 31 30 2c 28 22 49 4e 20 72 6f  ACE(0x10,("IN ro
edc0: 77 20 65 73 74 69 6d 61 74 65 3a 20 65 73 74 3d  w estimate: est=
edd0: 25 64 5c 6e 22 2c 20 6e 52 6f 77 45 73 74 29 29  %d\n", nRowEst))
ede0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
edf0: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
ee00: 6c 69 64 3d 3d 6e 52 65 63 56 61 6c 69 64 20 29  lid==nRecValid )
ee10: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
ee20: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
ee30: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
ee40: 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 0a 23 69 66  R_STAT4 */...#if
ee50: 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
ee60: 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69  NABLED./*.** Pri
ee70: 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  nt the content o
ee80: 66 20 61 20 57 68 65 72 65 54 65 72 6d 20 6f 62  f a WhereTerm ob
ee90: 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ject.*/.static v
eea0: 6f 69 64 20 77 68 65 72 65 54 65 72 6d 50 72 69  oid whereTermPri
eeb0: 6e 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70 54  nt(WhereTerm *pT
eec0: 65 72 6d 2c 20 69 6e 74 20 69 54 65 72 6d 29 7b  erm, int iTerm){
eed0: 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20  .  if( pTerm==0 
eee0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  ){.    sqlite3De
eef0: 62 75 67 50 72 69 6e 74 66 28 22 54 45 52 4d 2d  bugPrintf("TERM-
ef00: 25 2d 33 64 20 4e 55 4c 4c 5c 6e 22 2c 20 69 54  %-3d NULL\n", iT
ef10: 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  erm);.  }else{. 
ef20: 20 20 20 63 68 61 72 20 7a 54 79 70 65 5b 34 5d     char zType[4]
ef30: 3b 0a 20 20 20 20 63 68 61 72 20 7a 4c 65 66 74  ;.    char zLeft
ef40: 5b 35 30 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  [50];.    memcpy
ef50: 28 7a 54 79 70 65 2c 20 22 2e 2e 2e 22 2c 20 34  (zType, "...", 4
ef60: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
ef70: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
ef80: 5f 56 49 52 54 55 41 4c 20 29 20 7a 54 79 70 65  _VIRTUAL ) zType
ef90: 5b 30 5d 20 3d 20 27 56 27 3b 0a 20 20 20 20 69  [0] = 'V';.    i
efa0: 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
efb0: 74 6f 72 20 26 20 57 4f 5f 45 51 55 49 56 20 20  tor & WO_EQUIV  
efc0: 29 20 7a 54 79 70 65 5b 31 5d 20 3d 20 27 45 27  ) zType[1] = 'E'
efd0: 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72 48 61  ;.    if( ExprHa
efe0: 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
eff0: 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
f000: 6f 69 6e 29 20 29 20 7a 54 79 70 65 5b 32 5d 20  oin) ) zType[2] 
f010: 3d 20 27 4c 27 3b 0a 20 20 20 20 69 66 28 20 70  = 'L';.    if( p
f020: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
f030: 26 20 57 4f 5f 53 49 4e 47 4c 45 20 29 7b 0a 20  & WO_SINGLE ){. 
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: 7b 25 64 3a 25 64 7d 22 2c 0a 20 20 20 20 20 20  {%d:%d}",.      
f080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f090: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
f0a0: 6f 72 2c 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  or, pTerm->u.lef
f0b0: 74 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 7d 65  tColumn);.    }e
f0c0: 6c 73 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e  lse if( (pTerm->
f0d0: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4f  eOperator & WO_O
f0e0: 52 29 21 3d 30 20 26 26 20 70 54 65 72 6d 2d 3e  R)!=0 && pTerm->
f0f0: 75 2e 70 4f 72 49 6e 66 6f 21 3d 30 20 29 7b 0a  u.pOrInfo!=0 ){.
f100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
f110: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c  printf(sizeof(zL
f120: 65 66 74 29 2c 7a 4c 65 66 74 2c 22 69 6e 64 65  eft),zLeft,"inde
f130: 78 61 62 6c 65 3d 30 78 25 6c 6c 64 22 2c 20 0a  xable=0x%lld", .
f140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f150: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e         pTerm->u.
f160: 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
f170: 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  le);.    }else{.
f180: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
f190: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c  printf(sizeof(zL
f1a0: 65 66 74 29 2c 7a 4c 65 66 74 2c 22 6c 65 66 74  eft),zLeft,"left
f1b0: 3d 25 64 22 2c 20 70 54 65 72 6d 2d 3e 6c 65 66  =%d", pTerm->lef
f1c0: 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 7d 0a  tCursor);.    }.
f1d0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
f1e0: 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22  Printf(.       "
f1f0: 54 45 52 4d 2d 25 2d 33 64 20 25 70 20 25 73 20  TERM-%-3d %p %s 
f200: 25 2d 31 32 73 20 70 72 6f 62 3d 25 2d 33 64 20  %-12s prob=%-3d 
f210: 6f 70 3d 30 78 25 30 33 78 20 77 74 46 6c 61 67  op=0x%03x wtFlag
f220: 73 3d 30 78 25 30 34 78 22 2c 0a 20 20 20 20 20  s=0x%04x",.     
f230: 20 20 69 54 65 72 6d 2c 20 70 54 65 72 6d 2c 20    iTerm, pTerm, 
f240: 7a 54 79 70 65 2c 20 7a 4c 65 66 74 2c 20 70 54  zType, zLeft, pT
f250: 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 2c 0a  erm->truthProb,.
f260: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f         pTerm->eO
f270: 70 65 72 61 74 6f 72 2c 20 70 54 65 72 6d 2d 3e  perator, pTerm->
f280: 77 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  wtFlags);.    if
f290: 28 20 70 54 65 72 6d 2d 3e 69 46 69 65 6c 64 20  ( pTerm->iField 
f2a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f2b0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 69 46  DebugPrintf(" iF
f2c0: 69 65 6c 64 3d 25 64 5c 6e 22 2c 20 70 54 65 72  ield=%d\n", pTer
f2d0: 6d 2d 3e 69 46 69 65 6c 64 29 3b 0a 20 20 20 20  m->iField);.    
f2e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
f2f0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
f300: 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20  "\n");.    }.   
f310: 20 73 71 6c 69 74 65 33 54 72 65 65 56 69 65 77   sqlite3TreeView
f320: 45 78 70 72 28 30 2c 20 70 54 65 72 6d 2d 3e 70  Expr(0, pTerm->p
f330: 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  Expr, 0);.  }.}.
f340: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 57  #endif..#ifdef W
f350: 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
f360: 44 0a 2f 2a 0a 2a 2a 20 53 68 6f 77 20 74 68 65  D./*.** Show the
f370: 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e   complete conten
f380: 74 20 6f 66 20 61 20 57 68 65 72 65 43 6c 61 75  t of a WhereClau
f390: 73 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  se.*/.void sqlit
f3a0: 65 33 57 68 65 72 65 43 6c 61 75 73 65 50 72 69  e3WhereClausePri
f3b0: 6e 74 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a  nt(WhereClause *
f3c0: 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  pWC){.  int i;. 
f3d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 43 2d   for(i=0; i<pWC-
f3e0: 3e 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20  >nTerm; i++){.  
f3f0: 20 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74    whereTermPrint
f400: 28 26 70 57 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b  (&pWC->a[i], i);
f410: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
f420: 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
f430: 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50  _ENABLED./*.** P
f440: 72 69 6e 74 20 61 20 57 68 65 72 65 4c 6f 6f 70  rint a WhereLoop
f450: 20 6f 62 6a 65 63 74 20 66 6f 72 20 64 65 62 75   object for debu
f460: 67 67 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a  gging purposes.*
f470: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
f480: 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 57 68 65  ereLoopPrint(Whe
f490: 72 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65  reLoop *p, Where
f4a0: 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20  Clause *pWC){.  
f4b0: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
f4c0: 6f 20 3d 20 70 57 43 2d 3e 70 57 49 6e 66 6f 3b  o = pWC->pWInfo;
f4d0: 0a 20 20 69 6e 74 20 6e 62 20 3d 20 31 2b 28 70  .  int nb = 1+(p
f4e0: 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
f4f0: 3e 6e 53 72 63 2b 33 29 2f 34 3b 0a 20 20 73 74  >nSrc+3)/4;.  st
f500: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
f510: 6d 20 2a 70 49 74 65 6d 20 3d 20 70 57 49 6e 66  m *pItem = pWInf
f520: 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b  o->pTabList->a +
f530: 20 70 2d 3e 69 54 61 62 3b 0a 20 20 54 61 62 6c   p->iTab;.  Tabl
f540: 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d  e *pTab = pItem-
f550: 3e 70 54 61 62 3b 0a 20 20 42 69 74 6d 61 73 6b  >pTab;.  Bitmask
f560: 20 6d 41 6c 6c 20 3d 20 28 28 28 42 69 74 6d 61   mAll = (((Bitma
f570: 73 6b 29 31 29 3c 3c 28 6e 62 2a 34 29 29 20 2d  sk)1)<<(nb*4)) -
f580: 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62   1;.  sqlite3Deb
f590: 75 67 50 72 69 6e 74 66 28 22 25 63 25 32 64 2e  ugPrintf("%c%2d.
f5a0: 25 30 2a 6c 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20  %0*llx.%0*llx", 
f5b0: 70 2d 3e 63 49 64 2c 0a 20 20 20 20 20 20 20 20  p->cId,.        
f5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
f5d0: 69 54 61 62 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73  iTab, nb, p->mas
f5e0: 6b 53 65 6c 66 2c 20 6e 62 2c 20 70 2d 3e 70 72  kSelf, nb, p->pr
f5f0: 65 72 65 71 20 26 20 6d 41 6c 6c 29 3b 0a 20 20  ereq & mAll);.  
f600: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
f610: 74 66 28 22 20 25 31 32 73 22 2c 0a 20 20 20 20  tf(" %12s",.    
f620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f630: 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f   pItem->zAlias ?
f640: 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a   pItem->zAlias :
f650: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
f660: 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
f670: 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
f680: 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20  TABLE)==0 ){.   
f690: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
f6a0: 6d 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 75  me;.    if( p->u
f6b0: 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 26 26  .btree.pIndex &&
f6c0: 20 28 7a 4e 61 6d 65 20 3d 20 70 2d 3e 75 2e 62   (zName = p->u.b
f6d0: 74 72 65 65 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61  tree.pIndex->zNa
f6e0: 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)!=0 ){.      
f6f0: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 4e 61 6d  if( strncmp(zNam
f700: 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69  e, "sqlite_autoi
f710: 6e 64 65 78 5f 22 2c 20 31 37 29 3d 3d 30 20 29  ndex_", 17)==0 )
f720: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 20  {.        int i 
f730: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
f740: 30 28 7a 4e 61 6d 65 29 20 2d 20 31 3b 0a 20 20  0(zName) - 1;.  
f750: 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4e 61        while( zNa
f760: 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20 69 2d 2d  me[i]!='_' ) i--
f770: 3b 0a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  ;.        zName 
f780: 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += i;.      }.  
f790: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
f7a0: 50 72 69 6e 74 66 28 22 2e 25 2d 31 36 73 20 25  Printf(".%-16s %
f7b0: 32 64 22 2c 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75  2d", zName, p->u
f7c0: 2e 62 74 72 65 65 2e 6e 45 71 29 3b 0a 20 20 20  .btree.nEq);.   
f7d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
f7e0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
f7f0: 28 22 25 32 30 73 22 2c 22 22 29 3b 0a 20 20 20  ("%20s","");.   
f800: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
f810: 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28  char *z;.    if(
f820: 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74   p->u.vtab.idxSt
f830: 72 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73  r ){.      z = s
f840: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
f850: 28 25 64 2c 5c 22 25 73 5c 22 2c 25 78 29 22 2c  (%d,\"%s\",%x)",
f860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f870: 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75   p->u.vtab.idxNu
f880: 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78  m, p->u.vtab.idx
f890: 53 74 72 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f  Str, p->u.vtab.o
f8a0: 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 65  mitMask);.    }e
f8b0: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73  lse{.      z = s
f8c0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
f8d0: 28 25 64 2c 25 78 29 22 2c 20 70 2d 3e 75 2e 76  (%d,%x)", p->u.v
f8e0: 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75  tab.idxNum, p->u
f8f0: 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b  .vtab.omitMask);
f900: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
f910: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
f920: 25 2d 31 39 73 22 2c 20 7a 29 3b 0a 20 20 20 20  %-19s", z);.    
f930: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
f940: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 77 73  .  }.  if( p->ws
f950: 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4b  Flags & WHERE_SK
f960: 49 50 53 43 41 4e 20 29 7b 0a 20 20 20 20 73 71  IPSCAN ){.    sq
f970: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
f980: 28 22 20 66 20 25 30 35 78 20 25 64 2d 25 64 22  (" f %05x %d-%d"
f990: 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d  , p->wsFlags, p-
f9a0: 3e 6e 4c 54 65 72 6d 2c 70 2d 3e 6e 53 6b 69 70  >nLTerm,p->nSkip
f9b0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
f9c0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
f9d0: 74 66 28 22 20 66 20 25 30 35 78 20 4e 20 25 64  tf(" f %05x N %d
f9e0: 22 2c 20 70 2d 3e 77 73 46 6c 61 67 73 2c 20 70  ", p->wsFlags, p
f9f0: 2d 3e 6e 4c 54 65 72 6d 29 3b 0a 20 20 7d 0a 20  ->nLTerm);.  }. 
fa00: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
fa10: 6e 74 66 28 22 20 63 6f 73 74 20 25 64 2c 25 64  ntf(" cost %d,%d
fa20: 2c 25 64 5c 6e 22 2c 20 70 2d 3e 72 53 65 74 75  ,%d\n", p->rSetu
fa30: 70 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e  p, p->rRun, p->n
fa40: 4f 75 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  Out);.  if( p->n
fa50: 4c 54 65 72 6d 20 26 26 20 28 73 71 6c 69 74 65  LTerm && (sqlite
fa60: 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
fa70: 31 30 30 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  100)!=0 ){.    i
fa80: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
fa90: 30 3b 20 69 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20  0; i<p->nLTerm; 
faa0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 65 72  i++){.      wher
fab0: 65 54 65 72 6d 50 72 69 6e 74 28 70 2d 3e 61 4c  eTermPrint(p->aL
fac0: 54 65 72 6d 5b 69 5d 2c 20 69 29 3b 0a 20 20 20  Term[i], i);.   
fad0: 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
fae0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 62  ./*.** Convert b
faf0: 75 6c 6b 20 6d 65 6d 6f 72 79 20 69 6e 74 6f 20  ulk memory into 
fb00: 61 20 76 61 6c 69 64 20 57 68 65 72 65 4c 6f 6f  a valid WhereLoo
fb10: 70 20 74 68 61 74 20 63 61 6e 20 62 65 20 70 61  p that can be pa
fb20: 73 73 65 64 0a 2a 2a 20 74 6f 20 77 68 65 72 65  ssed.** to where
fb30: 4c 6f 6f 70 43 6c 65 61 72 20 68 61 72 6d 6c 65  LoopClear harmle
fb40: 73 73 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ssly..*/.static 
fb50: 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 49 6e  void whereLoopIn
fb60: 69 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  it(WhereLoop *p)
fb70: 7b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20  {.  p->aLTerm = 
fb80: 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 3b 0a  p->aLTermSpace;.
fb90: 20 20 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b    p->nLTerm = 0;
fba0: 0a 20 20 70 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41  .  p->nLSlot = A
fbb0: 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 4c 54 65  rraySize(p->aLTe
fbc0: 72 6d 53 70 61 63 65 29 3b 0a 20 20 70 2d 3e 77  rmSpace);.  p->w
fbd0: 73 46 6c 61 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f  sFlags = 0;.}../
fbe0: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 57  *.** Clear the W
fbf0: 68 65 72 65 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e  hereLoop.u union
fc00: 2e 20 20 4c 65 61 76 65 20 57 68 65 72 65 4c 6f  .  Leave WhereLo
fc10: 6f 70 2e 70 4c 54 65 72 6d 20 69 6e 74 61 63 74  op.pLTerm intact
fc20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
fc30: 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55   whereLoopClearU
fc40: 6e 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  nion(sqlite3 *db
fc50: 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b  , WhereLoop *p){
fc60: 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67  .  if( p->wsFlag
fc70: 73 20 26 20 28 57 48 45 52 45 5f 56 49 52 54 55  s & (WHERE_VIRTU
fc80: 41 4c 54 41 42 4c 45 7c 57 48 45 52 45 5f 41 55  ALTABLE|WHERE_AU
fc90: 54 4f 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20  TO_INDEX) ){.   
fca0: 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73   if( (p->wsFlags
fcb0: 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
fcc0: 54 41 42 4c 45 29 21 3d 30 20 26 26 20 70 2d 3e  TABLE)!=0 && p->
fcd0: 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
fce0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
fcf0: 5f 66 72 65 65 28 70 2d 3e 75 2e 76 74 61 62 2e  _free(p->u.vtab.
fd00: 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20 20 70  idxStr);.      p
fd10: 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65  ->u.vtab.needFre
fd20: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  e = 0;.      p->
fd30: 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20  u.vtab.idxStr = 
fd40: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
fd50: 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
fd60: 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
fd70: 21 3d 30 20 26 26 20 70 2d 3e 75 2e 62 74 72 65  !=0 && p->u.btre
fd80: 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20  e.pIndex!=0 ){. 
fd90: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
fda0: 65 65 28 64 62 2c 20 70 2d 3e 75 2e 62 74 72 65  ee(db, p->u.btre
fdb0: 65 2e 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66  e.pIndex->zColAf
fdc0: 66 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  f);.      sqlite
fdd0: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 2d  3DbFreeNN(db, p-
fde0: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 29  >u.btree.pIndex)
fdf0: 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 62 74 72  ;.      p->u.btr
fe00: 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
fe10: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
fe20: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 69 6e 74  * Deallocate int
fe30: 65 72 6e 61 6c 20 6d 65 6d 6f 72 79 20 75 73 65  ernal memory use
fe40: 64 20 62 79 20 61 20 57 68 65 72 65 4c 6f 6f 70  d by a WhereLoop
fe50: 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
fe60: 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
fe70: 43 6c 65 61 72 28 73 71 6c 69 74 65 33 20 2a 64  Clear(sqlite3 *d
fe80: 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29  b, WhereLoop *p)
fe90: 7b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72  {.  if( p->aLTer
fea0: 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63  m!=p->aLTermSpac
feb0: 65 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  e ) sqlite3DbFre
fec0: 65 4e 4e 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72  eNN(db, p->aLTer
fed0: 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43  m);.  whereLoopC
fee0: 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c 20 70 29  learUnion(db, p)
fef0: 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
ff00: 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  t(p);.}../*.** I
ff10: 6e 63 72 65 61 73 65 20 74 68 65 20 6d 65 6d 6f  ncrease the memo
ff20: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f  ry allocation fo
ff30: 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  r pLoop->aLTerm[
ff40: 5d 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74  ] to be at least
ff50: 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   n..*/.static in
ff60: 74 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  t whereLoopResiz
ff70: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  e(sqlite3 *db, W
ff80: 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74  hereLoop *p, int
ff90: 20 6e 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d   n){.  WhereTerm
ffa0: 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69 66 28 20   **paNew;.  if( 
ffb0: 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72  p->nLSlot>=n ) r
ffc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ffd0: 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26 7e 37 3b  .  n = (n+7)&~7;
ffe0: 0a 20 20 70 61 4e 65 77 20 3d 20 73 71 6c 69 74  .  paNew = sqlit
fff0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
10000 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c  db, sizeof(p->aL
10010 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69  Term[0])*n);.  i
10020 66 28 20 70 61 4e 65 77 3d 3d 30 20 29 20 72 65  f( paNew==0 ) re
10030 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
10040 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 63 70 79  M_BKPT;.  memcpy
10050 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c 54 65 72  (paNew, p->aLTer
10060 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54  m, sizeof(p->aLT
10070 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f  erm[0])*p->nLSlo
10080 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4c 54  t);.  if( p->aLT
10090 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72 6d 53 70  erm!=p->aLTermSp
100a0 61 63 65 20 29 20 73 71 6c 69 74 65 33 44 62 46  ace ) sqlite3DbF
100b0 72 65 65 4e 4e 28 64 62 2c 20 70 2d 3e 61 4c 54  reeNN(db, p->aLT
100c0 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65 72  erm);.  p->aLTer
100d0 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d 3e  m = paNew;.  p->
100e0 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72 65  nLSlot = n;.  re
100f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10100 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65  }../*.** Transfe
10110 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74  r content from t
10120 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70 20  he second pLoop 
10130 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74 2e 0a  into the first..
10140 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
10150 65 72 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c 69  ereLoopXfer(sqli
10160 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
10170 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c 6f  op *pTo, WhereLo
10180 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 77 68  op *pFrom){.  wh
10190 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f  ereLoopClearUnio
101a0 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20 69 66  n(db, pTo);.  if
101b0 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
101c0 65 28 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f 6d  e(db, pTo, pFrom
101d0 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a 20 20 20  ->nLTerm) ){.   
101e0 20 6d 65 6d 73 65 74 28 26 70 54 6f 2d 3e 75 2c   memset(&pTo->u,
101f0 20 30 2c 20 73 69 7a 65 6f 66 28 70 54 6f 2d 3e   0, sizeof(pTo->
10200 75 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  u));.    return 
10210 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
10220 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28  T;.  }.  memcpy(
10230 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45 52  pTo, pFrom, WHER
10240 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29 3b  E_LOOP_XFER_SZ);
10250 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61  .  memcpy(pTo->a
10260 4c 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c  LTerm, pFrom->aL
10270 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72  Term, pTo->nLTer
10280 6d 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c  m*sizeof(pTo->aL
10290 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66 28  Term[0]));.  if(
102a0 20 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20   pFrom->wsFlags 
102b0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
102c0 41 42 4c 45 20 29 7b 0a 20 20 20 20 70 46 72 6f  ABLE ){.    pFro
102d0 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  m->u.vtab.needFr
102e0 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  ee = 0;.  }else 
102f0 69 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46 6c  if( (pFrom->wsFl
10300 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
10310 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20 20  _INDEX)!=0 ){.  
10320 20 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65 65    pFrom->u.btree
10330 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d  .pIndex = 0;.  }
10340 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10350 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
10360 6c 65 74 65 20 61 20 57 68 65 72 65 4c 6f 6f 70  lete a WhereLoop
10370 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74 69   object.*/.stati
10380 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70  c void whereLoop
10390 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a  Delete(sqlite3 *
103a0 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  db, WhereLoop *p
103b0 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c  ){.  whereLoopCl
103c0 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73 71  ear(db, p);.  sq
103d0 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62  lite3DbFreeNN(db
103e0 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  , p);.}../*.** F
103f0 72 65 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20  ree a WhereInfo 
10400 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61  structure.*/.sta
10410 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e  tic void whereIn
10420 66 6f 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a  foFree(sqlite3 *
10430 64 62 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  db, WhereInfo *p
10440 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c  WInfo){.  if( AL
10450 57 41 59 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a  WAYS(pWInfo) ){.
10460 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
10470 6f 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f  or(i=0; i<pWInfo
10480 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a  ->nLevel; i++){.
10490 20 20 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c        WhereLevel
104a0 20 2a 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e   *pLevel = &pWIn
104b0 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  fo->a[i];.      
104c0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f  if( pLevel->pWLo
104d0 6f 70 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70  op && (pLevel->p
104e0 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  WLoop->wsFlags &
104f0 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 29 20   WHERE_IN_ABLE) 
10500 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
10510 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65  e3DbFree(db, pLe
10520 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
10530 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
10540 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65  }.    sqlite3Whe
10550 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70  reClauseClear(&p
10560 57 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20  WInfo->sWC);.   
10570 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e   while( pWInfo->
10580 70 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20 20 20  pLoops ){.      
10590 57 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70  WhereLoop *p = p
105a0 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20  WInfo->pLoops;. 
105b0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f       pWInfo->pLo
105c0 6f 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f  ops = p->pNextLo
105d0 6f 70 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  op;.      whereL
105e0 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29  oopDelete(db, p)
105f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
10600 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20  te3DbFreeNN(db, 
10610 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWInfo);.  }.}..
10620 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
10630 45 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20  E if all of the 
10640 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
10650 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  ue:.**.**   (1) 
10660 20 58 20 68 61 73 20 74 68 65 20 73 61 6d 65 20   X has the same 
10670 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68  or lower cost th
10680 61 74 20 59 0a 2a 2a 20 20 20 28 32 29 20 20 58  at Y.**   (2)  X
10690 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62   is a proper sub
106a0 73 65 74 20 6f 66 20 59 0a 2a 2a 20 20 20 28 33  set of Y.**   (3
106b0 29 20 20 58 20 73 6b 69 70 73 20 61 74 20 6c 65  )  X skips at le
106c0 61 73 74 20 61 73 20 6d 61 6e 79 20 63 6f 6c 75  ast as many colu
106d0 6d 6e 73 20 61 73 20 59 0a 2a 2a 0a 2a 2a 20 42  mns as Y.**.** B
106e0 79 20 22 70 72 6f 70 65 72 20 73 75 62 73 65 74  y "proper subset
106f0 22 20 77 65 20 6d 65 61 6e 20 74 68 61 74 20 58  " we mean that X
10700 20 75 73 65 73 20 66 65 77 65 72 20 57 48 45 52   uses fewer WHER
10710 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 0a 2a  E clause terms.*
10720 2a 20 74 68 61 6e 20 59 20 61 6e 64 20 74 68 61  * than Y and tha
10730 74 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c  t every WHERE cl
10740 61 75 73 65 20 74 65 72 6d 20 75 73 65 64 20 62  ause term used b
10750 79 20 58 20 69 73 20 61 6c 73 6f 20 75 73 65 64  y X is also used
10760 0a 2a 2a 20 62 79 20 59 2e 0a 2a 2a 0a 2a 2a 20  .** by Y..**.** 
10770 49 66 20 58 20 69 73 20 61 20 70 72 6f 70 65 72  If X is a proper
10780 20 73 75 62 73 65 74 20 6f 66 20 59 20 74 68 65   subset of Y the
10790 6e 20 59 20 69 73 20 61 20 62 65 74 74 65 72 20  n Y is a better 
107a0 63 68 6f 69 63 65 20 61 6e 64 20 6f 75 67 68 74  choice and ought
107b0 0a 2a 2a 20 74 6f 20 68 61 76 65 20 61 20 6c 6f  .** to have a lo
107c0 77 65 72 20 63 6f 73 74 2e 20 20 54 68 69 73 20  wer cost.  This 
107d0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
107e0 54 52 55 45 20 77 68 65 6e 20 74 68 61 74 20 63  TRUE when that c
107f0 6f 73 74 20 0a 2a 2a 20 72 65 6c 61 74 69 6f 6e  ost .** relation
10800 73 68 69 70 20 69 73 20 69 6e 76 65 72 74 65 64  ship is inverted
10810 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
10820 20 61 64 6a 75 73 74 65 64 2e 20 20 54 68 65 20   adjusted.  The 
10830 74 68 69 72 64 20 72 75 6c 65 0a 2a 2a 20 77 61  third rule.** wa
10840 73 20 61 64 64 65 64 20 62 65 63 61 75 73 65 20  s added because 
10850 69 66 20 58 20 75 73 65 73 20 73 6b 69 70 2d 73  if X uses skip-s
10860 63 61 6e 20 6c 65 73 73 20 74 68 61 6e 20 59 20  can less than Y 
10870 69 74 20 73 74 69 6c 6c 20 6d 69 67 68 74 0a 2a  it still might.*
10880 2a 20 64 65 73 65 72 76 65 20 61 20 6c 6f 77 65  * deserve a lowe
10890 72 20 63 6f 73 74 20 65 76 65 6e 20 69 66 20 69  r cost even if i
108a0 74 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75  t is a proper su
108b0 62 73 65 74 20 6f 66 20 59 2e 0a 2a 2f 0a 73 74  bset of Y..*/.st
108c0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
108d0 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72 53  opCheaperProperS
108e0 75 62 73 65 74 28 0a 20 20 63 6f 6e 73 74 20 57  ubset(.  const W
108f0 68 65 72 65 4c 6f 6f 70 20 2a 70 58 2c 20 20 20  hereLoop *pX,   
10900 20 20 20 20 2f 2a 20 46 69 72 73 74 20 57 68 65      /* First Whe
10910 72 65 4c 6f 6f 70 20 74 6f 20 63 6f 6d 70 61 72  reLoop to compar
10920 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 57 68 65  e */.  const Whe
10930 72 65 4c 6f 6f 70 20 2a 70 59 20 20 20 20 20 20  reLoop *pY      
10940 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 61 67 61    /* Compare aga
10950 69 6e 73 74 20 74 68 69 73 20 57 68 65 72 65 4c  inst this WhereL
10960 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  oop */.){.  int 
10970 69 2c 20 6a 3b 0a 20 20 69 66 28 20 70 58 2d 3e  i, j;.  if( pX->
10980 6e 4c 54 65 72 6d 2d 70 58 2d 3e 6e 53 6b 69 70  nLTerm-pX->nSkip
10990 20 3e 3d 20 70 59 2d 3e 6e 4c 54 65 72 6d 2d 70   >= pY->nLTerm-p
109a0 59 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20  Y->nSkip ){.    
109b0 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 58 20 69  return 0; /* X i
109c0 73 20 6e 6f 74 20 61 20 73 75 62 73 65 74 20 6f  s not a subset o
109d0 66 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  f Y */.  }.  if(
109e0 20 70 59 2d 3e 6e 53 6b 69 70 20 3e 20 70 58 2d   pY->nSkip > pX-
109f0 3e 6e 53 6b 69 70 20 29 20 72 65 74 75 72 6e 20  >nSkip ) return 
10a00 30 3b 0a 20 20 69 66 28 20 70 58 2d 3e 72 52 75  0;.  if( pX->rRu
10a10 6e 20 3e 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b  n >= pY->rRun ){
10a20 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 72 52 75  .    if( pX->rRu
10a30 6e 20 3e 20 70 59 2d 3e 72 52 75 6e 20 29 20 72  n > pY->rRun ) r
10a40 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58  eturn 0;    /* X
10a50 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e   costs more than
10a60 20 59 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 58   Y */.    if( pX
10a70 2d 3e 6e 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75  ->nOut > pY->nOu
10a80 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
10a90 20 2f 2a 20 58 20 63 6f 73 74 73 20 6d 6f 72 65   /* X costs more
10aa0 20 74 68 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20   than Y */.  }. 
10ab0 20 66 6f 72 28 69 3d 70 58 2d 3e 6e 4c 54 65 72   for(i=pX->nLTer
10ac0 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  m-1; i>=0; i--){
10ad0 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 61 4c 54  .    if( pX->aLT
10ae0 65 72 6d 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74  erm[i]==0 ) cont
10af0 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  inue;.    for(j=
10b00 70 59 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e  pY->nLTerm-1; j>
10b10 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20  =0; j--){.      
10b20 69 66 28 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a  if( pY->aLTerm[j
10b30 5d 3d 3d 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d  ]==pX->aLTerm[i]
10b40 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
10b50 20 20 20 20 69 66 28 20 6a 3c 30 20 29 20 72 65      if( j<0 ) re
10b60 74 75 72 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f  turn 0;  /* X no
10b70 74 20 61 20 73 75 62 73 65 74 20 6f 66 20 59 20  t a subset of Y 
10b80 73 69 6e 63 65 20 74 65 72 6d 20 58 5b 69 5d 20  since term X[i] 
10b90 6e 6f 74 20 75 73 65 64 20 62 79 20 59 20 2a 2f  not used by Y */
10ba0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
10bb0 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 64 69 74 69    /* All conditi
10bc0 6f 6e 73 20 6d 65 65 74 20 2a 2f 0a 7d 0a 0a 2f  ons meet */.}../
10bd0 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 61 64 6a 75  *.** Try to adju
10be0 73 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20 57  st the cost of W
10bf0 68 65 72 65 4c 6f 6f 70 20 70 54 65 6d 70 6c 61  hereLoop pTempla
10c00 74 65 20 75 70 77 61 72 64 73 20 6f 72 20 64 6f  te upwards or do
10c10 77 6e 77 61 72 64 73 20 73 6f 0a 2a 2a 20 74 68  wnwards so.** th
10c20 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20  at:.**.**   (1) 
10c30 70 54 65 6d 70 6c 61 74 65 20 63 6f 73 74 73 20  pTemplate costs 
10c40 6c 65 73 73 20 74 68 61 6e 20 61 6e 79 20 6f 74  less than any ot
10c50 68 65 72 20 57 68 65 72 65 4c 6f 6f 70 73 20 74  her WhereLoops t
10c60 68 61 74 20 61 72 65 20 61 20 70 72 6f 70 65 72  hat are a proper
10c70 0a 2a 2a 20 20 20 20 20 20 20 73 75 62 73 65 74  .**       subset
10c80 20 6f 66 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a   of pTemplate.**
10c90 0a 2a 2a 20 20 20 28 32 29 20 70 54 65 6d 70 6c  .**   (2) pTempl
10ca0 61 74 65 20 63 6f 73 74 73 20 6d 6f 72 65 20 74  ate costs more t
10cb0 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20 57 68  han any other Wh
10cc0 65 72 65 4c 6f 6f 70 73 20 66 6f 72 20 77 68 69  ereLoops for whi
10cd0 63 68 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 20  ch pTemplate.** 
10ce0 20 20 20 20 20 20 69 73 20 61 20 70 72 6f 70 65        is a prope
10cf0 72 20 73 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  r subset..**.** 
10d00 54 6f 20 73 61 79 20 22 57 68 65 72 65 4c 6f 6f  To say "WhereLoo
10d10 70 20 58 20 69 73 20 61 20 70 72 6f 70 65 72 20  p X is a proper 
10d20 73 75 62 73 65 74 20 6f 66 20 59 22 20 6d 65 61  subset of Y" mea
10d30 6e 73 20 74 68 61 74 20 58 20 75 73 65 73 20 66  ns that X uses f
10d40 65 77 65 72 0a 2a 2a 20 57 48 45 52 45 20 63 6c  ewer.** WHERE cl
10d50 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 6e 20  ause terms than 
10d60 59 20 61 6e 64 20 74 68 61 74 20 65 76 65 72 79  Y and that every
10d70 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
10d80 72 6d 20 75 73 65 64 20 62 79 20 58 20 69 73 0a  rm used by X is.
10d90 2a 2a 20 61 6c 73 6f 20 75 73 65 64 20 62 79 20  ** also used by 
10da0 59 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  Y..*/.static voi
10db0 64 20 77 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73  d whereLoopAdjus
10dc0 74 43 6f 73 74 28 63 6f 6e 73 74 20 57 68 65 72  tCost(const Wher
10dd0 65 4c 6f 6f 70 20 2a 70 2c 20 57 68 65 72 65 4c  eLoop *p, WhereL
10de0 6f 6f 70 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b  oop *pTemplate){
10df0 0a 20 20 69 66 28 20 28 70 54 65 6d 70 6c 61 74  .  if( (pTemplat
10e00 65 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  e->wsFlags & WHE
10e10 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20 29  RE_INDEXED)==0 )
10e20 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 3b   return;.  for(;
10e30 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f   p; p=p->pNextLo
10e40 6f 70 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  op){.    if( p->
10e50 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d  iTab!=pTemplate-
10e60 3e 69 54 61 62 20 29 20 63 6f 6e 74 69 6e 75 65  >iTab ) continue
10e70 3b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 77 73  ;.    if( (p->ws
10e80 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
10e90 44 45 58 45 44 29 3d 3d 30 20 29 20 63 6f 6e 74  DEXED)==0 ) cont
10ea0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 77 68  inue;.    if( wh
10eb0 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72  ereLoopCheaperPr
10ec0 6f 70 65 72 53 75 62 73 65 74 28 70 2c 20 70 54  operSubset(p, pT
10ed0 65 6d 70 6c 61 74 65 29 20 29 7b 0a 20 20 20 20  emplate) ){.    
10ee0 20 20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d    /* Adjust pTem
10ef0 70 6c 61 74 65 20 63 6f 73 74 20 64 6f 77 6e 77  plate cost downw
10f00 61 72 64 20 73 6f 20 74 68 61 74 20 69 74 20 69  ard so that it i
10f10 73 20 63 68 65 61 70 65 72 20 74 68 61 6e 20 69  s cheaper than i
10f20 74 73 20 0a 20 20 20 20 20 20 2a 2a 20 73 75 62  ts .      ** sub
10f30 73 65 74 20 70 2e 20 2a 2f 0a 20 20 20 20 20 20  set p. */.      
10f40 57 48 45 52 45 54 52 41 43 45 28 30 78 38 30 2c  WHERETRACE(0x80,
10f50 28 22 73 75 62 73 65 74 20 63 6f 73 74 20 61 64  ("subset cost ad
10f60 6a 75 73 74 6d 65 6e 74 20 25 64 2c 25 64 20 74  justment %d,%d t
10f70 6f 20 25 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20  o %d,%d\n",.    
10f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f90 20 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52     pTemplate->rR
10fa0 75 6e 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e  un, pTemplate->n
10fb0 4f 75 74 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d  Out, p->rRun, p-
10fc0 3e 6e 4f 75 74 2d 31 29 29 3b 0a 20 20 20 20 20  >nOut-1));.     
10fd0 20 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e   pTemplate->rRun
10fe0 20 3d 20 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20   = p->rRun;.    
10ff0 20 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75    pTemplate->nOu
11000 74 20 3d 20 70 2d 3e 6e 4f 75 74 20 2d 20 31 3b  t = p->nOut - 1;
11010 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77  .    }else if( w
11020 68 65 72 65 4c 6f 6f 70 43 68 65 61 70 65 72 50  hereLoopCheaperP
11030 72 6f 70 65 72 53 75 62 73 65 74 28 70 54 65 6d  roperSubset(pTem
11040 70 6c 61 74 65 2c 20 70 29 20 29 7b 0a 20 20 20  plate, p) ){.   
11050 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65     /* Adjust pTe
11060 6d 70 6c 61 74 65 20 63 6f 73 74 20 75 70 77 61  mplate cost upwa
11070 72 64 20 73 6f 20 74 68 61 74 20 69 74 20 69 73  rd so that it is
11080 20 63 6f 73 74 6c 69 65 72 20 74 68 61 6e 20 70   costlier than p
11090 20 73 69 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20   since.      ** 
110a0 70 54 65 6d 70 6c 61 74 65 20 69 73 20 61 20 70  pTemplate is a p
110b0 72 6f 70 65 72 20 73 75 62 73 65 74 20 6f 66 20  roper subset of 
110c0 70 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45  p */.      WHERE
110d0 54 52 41 43 45 28 30 78 38 30 2c 28 22 73 75 62  TRACE(0x80,("sub
110e0 73 65 74 20 63 6f 73 74 20 61 64 6a 75 73 74 6d  set cost adjustm
110f0 65 6e 74 20 25 64 2c 25 64 20 74 6f 20 25 64 2c  ent %d,%d to %d,
11100 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
11110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54                pT
11120 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70  emplate->rRun, p
11130 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20  Template->nOut, 
11140 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74  p->rRun, p->nOut
11150 2b 31 29 29 3b 0a 20 20 20 20 20 20 70 54 65 6d  +1));.      pTem
11160 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d  plate->rRun = p-
11170 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54 65  >rRun;.      pTe
11180 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70  mplate->nOut = p
11190 2d 3e 6e 4f 75 74 20 2b 20 31 3b 0a 20 20 20 20  ->nOut + 1;.    
111a0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  }.  }.}../*.** S
111b0 65 61 72 63 68 20 74 68 65 20 6c 69 73 74 20 6f  earch the list o
111c0 66 20 57 68 65 72 65 4c 6f 6f 70 73 20 69 6e 20  f WhereLoops in 
111d0 2a 70 70 50 72 65 76 20 6c 6f 6f 6b 69 6e 67 20  *ppPrev looking 
111e0 66 6f 72 20 6f 6e 65 20 74 68 61 74 20 63 61 6e  for one that can
111f0 20 62 65 0a 2a 2a 20 72 65 70 6c 61 63 65 64 20   be.** replaced 
11200 62 79 20 70 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a  by pTemplate..**
11210 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  .** Return NULL 
11220 69 66 20 70 54 65 6d 70 6c 61 74 65 20 64 6f 65  if pTemplate doe
11230 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 6f 6e 20  s not belong on 
11240 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6c 69  the WhereLoop li
11250 73 74 2e 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  st..** In other 
11260 77 6f 72 64 73 20 69 66 20 70 54 65 6d 70 6c 61  words if pTempla
11270 74 65 20 6f 75 67 68 74 20 74 6f 20 62 65 20 64  te ought to be d
11280 72 6f 70 70 65 64 20 66 72 6f 6d 20 66 75 72 74  ropped from furt
11290 68 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f  her consideratio
112a0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 58 20 69  n..**.** If pX i
112b0 73 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 74 68  s a WhereLoop th
112c0 61 74 20 70 54 65 6d 70 6c 61 74 65 20 63 61 6e  at pTemplate can
112d0 20 72 65 70 6c 61 63 65 2c 20 74 68 65 6e 20 72   replace, then r
112e0 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e  eturn the.** lin
112f0 6b 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  k that points to
11300 20 70 58 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54   pX..**.** If pT
11310 65 6d 70 6c 61 74 65 20 63 61 6e 6e 6f 74 20 72  emplate cannot r
11320 65 70 6c 61 63 65 20 61 6e 79 20 65 78 69 73 74  eplace any exist
11330 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ing element of t
11340 68 65 20 6c 69 73 74 20 62 75 74 20 6e 65 65 64  he list but need
11350 73 0a 2a 2a 20 74 6f 20 62 65 20 61 64 64 65 64  s.** to be added
11360 20 74 6f 20 74 68 65 20 6c 69 73 74 20 61 73 20   to the list as 
11370 61 20 6e 65 77 20 65 6e 74 72 79 2c 20 74 68 65  a new entry, the
11380 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  n return a point
11390 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 74 61 69  er to the.** tai
113a0 6c 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a  l of the list..*
113b0 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 4c 6f  /.static WhereLo
113c0 6f 70 20 2a 2a 77 68 65 72 65 4c 6f 6f 70 46 69  op **whereLoopFi
113d0 6e 64 4c 65 73 73 65 72 28 0a 20 20 57 68 65 72  ndLesser(.  Wher
113e0 65 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 0a  eLoop **ppPrev,.
113f0 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f    const WhereLoo
11400 70 20 2a 70 54 65 6d 70 6c 61 74 65 0a 29 7b 0a  p *pTemplate.){.
11410 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a    WhereLoop *p;.
11420 20 20 66 6f 72 28 70 3d 28 2a 70 70 50 72 65 76    for(p=(*ppPrev
11430 29 3b 20 70 3b 20 70 70 50 72 65 76 3d 26 70 2d  ); p; ppPrev=&p-
11440 3e 70 4e 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70  >pNextLoop, p=*p
11450 70 50 72 65 76 29 7b 0a 20 20 20 20 69 66 28 20  pPrev){.    if( 
11460 70 2d 3e 69 54 61 62 21 3d 70 54 65 6d 70 6c 61  p->iTab!=pTempla
11470 74 65 2d 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69  te->iTab || p->i
11480 53 6f 72 74 49 64 78 21 3d 70 54 65 6d 70 6c 61  SortIdx!=pTempla
11490 74 65 2d 3e 69 53 6f 72 74 49 64 78 20 29 7b 0a  te->iSortIdx ){.
114a0 20 20 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68        /* If eith
114b0 65 72 20 74 68 65 20 69 54 61 62 20 6f 72 20 69  er the iTab or i
114c0 53 6f 72 74 49 64 78 20 76 61 6c 75 65 73 20 66  SortIdx values f
114d0 6f 72 20 74 77 6f 20 57 68 65 72 65 4c 6f 6f 70  or two WhereLoop
114e0 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 0a 20   are different. 
114f0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 6f       ** then tho
11500 73 65 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65  se WhereLoops ne
11510 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64 65  ed to be conside
11520 72 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20  red separately. 
11530 20 4e 65 69 74 68 65 72 20 69 73 0a 20 20 20 20   Neither is.    
11540 20 20 2a 2a 20 61 20 63 61 6e 64 69 64 61 74 65    ** a candidate
11550 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68 65 20   to replace the 
11560 6f 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  other. */.      
11570 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
11580 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20 63 75      /* In the cu
11590 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61  rrent implementa
115a0 74 69 6f 6e 2c 20 74 68 65 20 72 53 65 74 75 70  tion, the rSetup
115b0 20 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72   value is either
115c0 20 7a 65 72 6f 0a 20 20 20 20 2a 2a 20 6f 72 20   zero.    ** or 
115d0 74 68 65 20 63 6f 73 74 20 6f 66 20 62 75 69 6c  the cost of buil
115e0 64 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69  ding an automati
115f0 63 20 69 6e 64 65 78 20 28 4e 6c 6f 67 4e 29 20  c index (NlogN) 
11600 61 6e 64 20 74 68 65 20 4e 6c 6f 67 4e 0a 20 20  and the NlogN.  
11610 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65    ** is the same
11620 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 6c 65 20   for compatible 
11630 57 68 65 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20  WhereLoops. */. 
11640 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53     assert( p->rS
11650 65 74 75 70 3d 3d 30 20 7c 7c 20 70 54 65 6d 70  etup==0 || pTemp
11660 6c 61 74 65 2d 3e 72 53 65 74 75 70 3d 3d 30 20  late->rSetup==0 
11670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11680 20 20 7c 7c 20 70 2d 3e 72 53 65 74 75 70 3d 3d    || p->rSetup==
11690 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
116a0 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 77 68 65  p );..    /* whe
116b0 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28 29  reLoopAddBtree()
116c0 20 61 6c 77 61 79 73 20 67 65 6e 65 72 61 74 65   always generate
116d0 73 20 61 6e 64 20 69 6e 73 65 72 74 73 20 74 68  s and inserts th
116e0 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
116f0 78 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 66 69  x.    ** case fi
11700 72 73 74 2e 20 20 48 65 6e 63 65 20 63 6f 6d 70  rst.  Hence comp
11710 61 74 69 62 6c 65 20 63 61 6e 64 69 64 61 74 65  atible candidate
11720 20 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 76 65   WhereLoops neve
11730 72 20 68 61 76 65 20 61 20 6c 61 72 67 65 72 0a  r have a larger.
11740 20 20 20 20 2a 2a 20 72 53 65 74 75 70 2e 20 43      ** rSetup. C
11750 61 6c 6c 20 74 68 69 73 20 53 45 54 55 50 2d 49  all this SETUP-I
11760 4e 56 41 52 49 41 4e 54 20 2a 2f 0a 20 20 20 20  NVARIANT */.    
11770 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
11780 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53  p>=pTemplate->rS
11790 65 74 75 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  etup );..    /* 
117a0 41 6e 79 20 6c 6f 6f 70 20 75 73 69 6e 67 20 61  Any loop using a
117b0 6e 20 61 70 70 6c 69 61 74 69 6f 6e 2d 64 65 66  n appliation-def
117c0 69 6e 65 64 20 69 6e 64 65 78 20 28 6f 72 20 50  ined index (or P
117d0 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 0a 20 20  RIMARY KEY or.  
117e0 20 20 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73    ** UNIQUE cons
117f0 74 72 61 69 6e 74 29 20 77 69 74 68 20 6f 6e 65  traint) with one
11800 20 6f 72 20 6d 6f 72 65 20 3d 3d 20 63 6f 6e 73   or more == cons
11810 74 72 61 69 6e 74 73 20 69 73 20 62 65 74 74 65  traints is bette
11820 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 61 6e  r.    ** than an
11830 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
11840 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 61  . Unless it is a
11850 20 73 6b 69 70 2d 73 63 61 6e 2e 20 2a 2f 0a 20   skip-scan. */. 
11860 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61     if( (p->wsFla
11870 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f  gs & WHERE_AUTO_
11880 49 4e 44 45 58 29 21 3d 30 0a 20 20 20 20 20 26  INDEX)!=0.     &
11890 26 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 53  & (pTemplate->nS
118a0 6b 69 70 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  kip)==0.     && 
118b0 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c  (pTemplate->wsFl
118c0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
118d0 58 45 44 29 21 3d 30 0a 20 20 20 20 20 26 26 20  XED)!=0.     && 
118e0 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c  (pTemplate->wsFl
118f0 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
11900 4d 4e 5f 45 51 29 21 3d 30 0a 20 20 20 20 20 26  MN_EQ)!=0.     &
11910 26 20 28 70 2d 3e 70 72 65 72 65 71 20 26 20 70  & (p->prereq & p
11920 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
11930 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  )==pTemplate->pr
11940 65 72 65 71 0a 20 20 20 20 29 7b 0a 20 20 20 20  ereq.    ){.    
11950 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
11960 20 20 20 20 2f 2a 20 49 66 20 65 78 69 73 74 69      /* If existi
11970 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 70 20 69  ng WhereLoop p i
11980 73 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 54  s better than pT
11990 65 6d 70 6c 61 74 65 2c 20 70 54 65 6d 70 6c 61  emplate, pTempla
119a0 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a  te can be.    **
119b0 20 64 69 73 63 61 72 64 65 64 2e 20 20 57 68 65   discarded.  Whe
119c0 72 65 4c 6f 6f 70 20 70 20 69 73 20 62 65 74 74  reLoop p is bett
119d0 65 72 20 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20  er if:.    **   
119e0 28 31 29 20 20 70 20 68 61 73 20 6e 6f 20 6d 6f  (1)  p has no mo
119f0 72 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  re dependencies 
11a00 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20  than pTemplate, 
11a10 61 6e 64 0a 20 20 20 20 2a 2a 20 20 20 28 32 29  and.    **   (2)
11a20 20 20 70 20 68 61 73 20 61 6e 20 65 71 75 61 6c    p has an equal
11a30 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74   or lower cost t
11a40 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 0a 20 20  han pTemplate.  
11a50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 2d    */.    if( (p-
11a60 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70 6c  >prereq & pTempl
11a70 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70 2d  ate->prereq)==p-
11a80 3e 70 72 65 72 65 71 20 20 20 20 2f 2a 20 28 31  >prereq    /* (1
11a90 29 20 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d  )  */.     && p-
11aa0 3e 72 53 65 74 75 70 3c 3d 70 54 65 6d 70 6c 61  >rSetup<=pTempla
11ab0 74 65 2d 3e 72 53 65 74 75 70 20 20 20 20 20 20  te->rSetup      
11ac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
11ad0 32 61 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70  2a) */.     && p
11ae0 2d 3e 72 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74  ->rRun<=pTemplat
11af0 65 2d 3e 72 52 75 6e 20 20 20 20 20 20 20 20 20  e->rRun         
11b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11b10 28 32 62 29 20 2a 2f 0a 20 20 20 20 20 26 26 20  (2b) */.     && 
11b20 70 2d 3e 6e 4f 75 74 3c 3d 70 54 65 6d 70 6c 61  p->nOut<=pTempla
11b30 74 65 2d 3e 6e 4f 75 74 20 20 20 20 20 20 20 20  te->nOut        
11b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11b50 20 28 32 63 29 20 2a 2f 0a 20 20 20 20 29 7b 0a   (2c) */.    ){.
11b60 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
11b70 20 2f 2a 20 44 69 73 63 61 72 64 20 70 54 65 6d   /* Discard pTem
11b80 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 0a  plate */.    }..
11b90 20 20 20 20 2f 2a 20 49 66 20 70 54 65 6d 70 6c      /* If pTempl
11ba0 61 74 65 20 69 73 20 61 6c 77 61 79 73 20 62 65  ate is always be
11bb0 74 74 65 72 20 74 68 61 6e 20 70 2c 20 74 68 65  tter than p, the
11bc0 6e 20 63 61 75 73 65 20 70 20 74 6f 20 62 65 20  n cause p to be 
11bd0 6f 76 65 72 77 72 69 74 74 65 6e 0a 20 20 20 20  overwritten.    
11be0 2a 2a 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74  ** with pTemplat
11bf0 65 2e 20 20 70 54 65 6d 70 6c 61 74 65 20 69 73  e.  pTemplate is
11c00 20 62 65 74 74 65 72 20 74 68 61 6e 20 70 20 69   better than p i
11c10 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20  f:.    **   (1) 
11c20 20 70 54 65 6d 70 6c 61 74 65 20 68 61 73 20 6e   pTemplate has n
11c30 6f 20 6d 6f 72 65 20 64 65 70 65 6e 64 65 6e 63  o more dependenc
11c40 65 73 20 74 68 61 6e 20 70 2c 20 61 6e 64 0a 20  es than p, and. 
11c50 20 20 20 2a 2a 20 20 20 28 32 29 20 20 70 54 65     **   (2)  pTe
11c60 6d 70 6c 61 74 65 20 68 61 73 20 61 6e 20 65 71  mplate has an eq
11c70 75 61 6c 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ual or lower cos
11c80 74 20 74 68 61 6e 20 70 2e 0a 20 20 20 20 2a 2f  t than p..    */
11c90 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65  .    if( (p->pre
11ca0 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d  req & pTemplate-
11cb0 3e 70 72 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c  >prereq)==pTempl
11cc0 61 74 65 2d 3e 70 72 65 72 65 71 20 20 20 2f 2a  ate->prereq   /*
11cd0 20 28 31 29 20 20 2a 2f 0a 20 20 20 20 20 26 26   (1)  */.     &&
11ce0 20 70 2d 3e 72 52 75 6e 3e 3d 70 54 65 6d 70 6c   p->rRun>=pTempl
11cf0 61 74 65 2d 3e 72 52 75 6e 20 20 20 20 20 20 20  ate->rRun       
11d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d10 20 20 20 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f        /* (2a) */
11d20 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74  .     && p->nOut
11d30 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75  >=pTemplate->nOu
11d40 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
11d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11d60 20 28 32 62 29 20 2a 2f 0a 20 20 20 20 29 7b 0a   (2b) */.    ){.
11d70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
11d80 3e 72 53 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61  >rSetup>=pTempla
11d90 74 65 2d 3e 72 53 65 74 75 70 20 29 3b 20 2f 2a  te->rSetup ); /*
11da0 20 53 45 54 55 50 2d 49 4e 56 41 52 49 41 4e 54   SETUP-INVARIANT
11db0 20 61 62 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20   above */.      
11dc0 62 72 65 61 6b 3b 20 20 20 2f 2a 20 43 61 75 73  break;   /* Caus
11dd0 65 20 70 20 74 6f 20 62 65 20 6f 76 65 72 77 72  e p to be overwr
11de0 69 74 74 65 6e 20 62 79 20 70 54 65 6d 70 6c 61  itten by pTempla
11df0 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a  te */.    }.  }.
11e00 20 20 72 65 74 75 72 6e 20 70 70 50 72 65 76 3b    return ppPrev;
11e10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
11e20 20 6f 72 20 72 65 70 6c 61 63 65 20 61 20 57 68   or replace a Wh
11e30 65 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 75 73  ereLoop entry us
11e40 69 6e 67 20 74 68 65 20 74 65 6d 70 6c 61 74 65  ing the template
11e50 20 73 75 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a   supplied..**.**
11e60 20 41 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65   An existing Whe
11e70 72 65 4c 6f 6f 70 20 65 6e 74 72 79 20 6d 69 67  reLoop entry mig
11e80 68 74 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ht be overwritte
11e90 6e 20 69 66 20 74 68 65 20 6e 65 77 20 74 65 6d  n if the new tem
11ea0 70 6c 61 74 65 0a 2a 2a 20 69 73 20 62 65 74 74  plate.** is bett
11eb0 65 72 20 61 6e 64 20 68 61 73 20 66 65 77 65 72  er and has fewer
11ec0 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 20   dependencies.  
11ed0 4f 72 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20  Or the template 
11ee0 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 0a  will be ignored.
11ef0 2a 2a 20 61 6e 64 20 6e 6f 20 69 6e 73 65 72 74  ** and no insert
11f00 20 77 69 6c 6c 20 6f 63 63 75 72 20 69 66 20 61   will occur if a
11f10 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65  n existing Where
11f20 4c 6f 6f 70 20 69 73 20 66 61 73 74 65 72 20 61  Loop is faster a
11f30 6e 64 20 68 61 73 0a 2a 2a 20 66 65 77 65 72 20  nd has.** fewer 
11f40 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61  dependencies tha
11f50 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 20  n the template. 
11f60 20 4f 74 68 65 72 77 69 73 65 20 61 20 6e 65 77   Otherwise a new
11f70 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a   WhereLoop is.**
11f80 20 61 64 64 65 64 20 62 61 73 65 64 20 6f 6e 20   added based on 
11f90 74 68 65 20 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a  the template..**
11fa0 0a 2a 2a 20 49 66 20 70 42 75 69 6c 64 65 72 2d  .** If pBuilder-
11fb0 3e 70 4f 72 53 65 74 20 69 73 20 6e 6f 74 20 4e  >pOrSet is not N
11fc0 55 4c 4c 20 74 68 65 6e 20 77 65 20 63 61 72 65  ULL then we care
11fd0 20 61 62 6f 75 74 20 6f 6e 6c 79 20 74 68 65 0a   about only the.
11fe0 2a 2a 20 70 72 65 72 65 71 75 69 73 69 74 65 73  ** prerequisites
11ff0 20 61 6e 64 20 72 52 75 6e 20 61 6e 64 20 6e 4f   and rRun and nO
12000 75 74 20 63 6f 73 74 73 20 6f 66 20 74 68 65 20  ut costs of the 
12010 4e 20 62 65 73 74 20 6c 6f 6f 70 73 2e 20 20 54  N best loops.  T
12020 68 61 74 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  hat.** informati
12030 6f 6e 20 69 73 20 67 61 74 68 65 72 65 64 20 69  on is gathered i
12040 6e 20 74 68 65 20 70 42 75 69 6c 64 65 72 2d 3e  n the pBuilder->
12050 70 4f 72 53 65 74 20 6f 62 6a 65 63 74 2e 20 20  pOrSet object.  
12060 54 68 69 73 20 73 70 65 63 69 61 6c 0a 2a 2a 20  This special.** 
12070 70 72 6f 63 65 73 73 69 6e 67 20 6d 6f 64 65 20  processing mode 
12080 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72  is used only for
12090 20 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65   OR clause proce
120a0 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  ssing..**.** Whe
120b0 6e 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 6d  n accumulating m
120c0 75 6c 74 69 70 6c 65 20 6c 6f 6f 70 73 20 28 77  ultiple loops (w
120d0 68 65 6e 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  hen pBuilder->pO
120e0 72 53 65 74 20 69 73 20 4e 55 4c 4c 29 20 77 65  rSet is NULL) we
120f0 0a 2a 2a 20 73 74 69 6c 6c 20 6d 69 67 68 74 20  .** still might 
12100 6f 76 65 72 77 72 69 74 65 20 73 69 6d 69 6c 61  overwrite simila
12110 72 20 6c 6f 6f 70 73 20 77 69 74 68 20 74 68 65  r loops with the
12120 20 6e 65 77 20 74 65 6d 70 6c 61 74 65 20 69 66   new template if
12130 20 74 68 65 0a 2a 2a 20 6e 65 77 20 74 65 6d 70   the.** new temp
12140 6c 61 74 65 20 69 73 20 62 65 74 74 65 72 2e 20  late is better. 
12150 20 4c 6f 6f 70 73 20 6d 61 79 20 62 65 20 6f 76   Loops may be ov
12160 65 72 77 72 69 74 74 65 6e 20 69 66 20 74 68 65  erwritten if the
12170 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63   following .** c
12180 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65 20 6d 65  onditions are me
12190 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  t:.**.**    (1) 
121a0 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73   They have the s
121b0 61 6d 65 20 69 54 61 62 2e 0a 2a 2a 20 20 20 20  ame iTab..**    
121c0 28 32 29 20 20 54 68 65 79 20 68 61 76 65 20 74  (2)  They have t
121d0 68 65 20 73 61 6d 65 20 69 53 6f 72 74 49 64 78  he same iSortIdx
121e0 2e 0a 2a 2a 20 20 20 20 28 33 29 20 20 54 68 65  ..**    (3)  The
121f0 20 74 65 6d 70 6c 61 74 65 20 68 61 73 20 73 61   template has sa
12200 6d 65 20 6f 72 20 66 65 77 65 72 20 64 65 70 65  me or fewer depe
12210 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68  ndencies than th
12220 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a  e current loop.*
12230 2a 20 20 20 20 28 34 29 20 20 54 68 65 20 74 65  *    (4)  The te
12240 6d 70 6c 61 74 65 20 68 61 73 20 74 68 65 20 73  mplate has the s
12250 61 6d 65 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73  ame or lower cos
12260 74 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  t than the curre
12270 6e 74 20 6c 6f 6f 70 0a 2a 2f 0a 73 74 61 74 69  nt loop.*/.stati
12280 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 49  c int whereLoopI
12290 6e 73 65 72 74 28 57 68 65 72 65 4c 6f 6f 70 42  nsert(WhereLoopB
122a0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
122b0 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65  , WhereLoop *pTe
122c0 6d 70 6c 61 74 65 29 7b 0a 20 20 57 68 65 72 65  mplate){.  Where
122d0 4c 6f 6f 70 20 2a 2a 70 70 50 72 65 76 2c 20 2a  Loop **ppPrev, *
122e0 70 3b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  p;.  WhereInfo *
122f0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
12300 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 73 71 6c  r->pWInfo;.  sql
12310 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49 6e 66  ite3 *db = pWInf
12320 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20  o->pParse->db;. 
12330 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 49   int rc;..  /* I
12340 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  f pBuilder->pOrS
12350 65 74 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74  et is defined, t
12360 68 65 6e 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72  hen only keep tr
12370 61 63 6b 20 6f 66 20 74 68 65 20 63 6f 73 74 73  ack of the costs
12380 0a 20 20 2a 2a 20 61 6e 64 20 70 72 65 72 65 71  .  ** and prereq
12390 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  s..  */.  if( pB
123a0 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d  uilder->pOrSet!=
123b0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  0 ){.    if( pTe
123c0 6d 70 6c 61 74 65 2d 3e 6e 4c 54 65 72 6d 20 29  mplate->nLTerm )
123d0 7b 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  {.#if WHERETRACE
123e0 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20 20 75  _ENABLED.      u
123f0 31 36 20 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d  16 n = pBuilder-
12400 3e 70 4f 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20  >pOrSet->n;.    
12410 20 20 69 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66    int x =.#endif
12420 0a 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e  .      whereOrIn
12430 73 65 72 74 28 70 42 75 69 6c 64 65 72 2d 3e 70  sert(pBuilder->p
12440 4f 72 53 65 74 2c 20 70 54 65 6d 70 6c 61 74 65  OrSet, pTemplate
12450 2d 3e 70 72 65 72 65 71 2c 20 70 54 65 6d 70 6c  ->prereq, pTempl
12460 61 74 65 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20  ate->rRun,.     
12470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
12490 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b  Template->nOut);
124a0 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
124b0 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a  ENABLED /* 0x8 *
124c0 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  /.      if( sqli
124d0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
124e0 30 78 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73  0x8 ){.        s
124f0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
12500 66 28 78 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20  f(x?"   or-%d:  
12510 22 3a 22 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20  ":"   or-X:  ", 
12520 6e 29 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72  n);.        wher
12530 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65 6d 70  eLoopPrint(pTemp
12540 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e  late, pBuilder->
12550 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  pWC);.      }.#e
12560 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72  ndif.    }.    r
12570 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12580 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  .  }..  /* Look 
12590 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20  for an existing 
125a0 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70  WhereLoop to rep
125b0 6c 61 63 65 20 77 69 74 68 20 70 54 65 6d 70 6c  lace with pTempl
125c0 61 74 65 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65  ate.  */.  where
125d0 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73 74 28 70  LoopAdjustCost(p
125e0 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70  WInfo->pLoops, p
125f0 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 70 70 50  Template);.  ppP
12600 72 65 76 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46  rev = whereLoopF
12610 69 6e 64 4c 65 73 73 65 72 28 26 70 57 49 6e 66  indLesser(&pWInf
12620 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70  o->pLoops, pTemp
12630 6c 61 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 70  late);..  if( pp
12640 50 72 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Prev==0 ){.    /
12650 2a 20 54 68 65 72 65 20 61 6c 72 65 61 64 79 20  * There already 
12660 65 78 69 73 74 73 20 61 20 57 68 65 72 65 4c 6f  exists a WhereLo
12670 6f 70 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 74  op on the list t
12680 68 61 74 20 69 73 20 62 65 74 74 65 72 0a 20 20  hat is better.  
12690 20 20 2a 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c    ** than pTempl
126a0 61 74 65 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e  ate, so just ign
126b0 6f 72 65 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f  ore pTemplate */
126c0 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
126d0 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a  ENABLED /* 0x8 *
126e0 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
126f0 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78  3WhereTrace & 0x
12700 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  8 ){.      sqlit
12710 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
12720 20 20 73 6b 69 70 3a 20 22 29 3b 0a 20 20 20 20    skip: ");.    
12730 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
12740 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
12750 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20  lder->pWC);.    
12760 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  }.#endif.    ret
12770 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
12780 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
12790 3d 20 2a 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a  = *ppPrev;.  }..
127a0 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
127b0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d   this point it m
127c0 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72  eans that either
127d0 20 70 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f   p[] should be o
127e0 76 65 72 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  verwritten.  ** 
127f0 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d  with pTemplate[]
12800 20 69 66 20 70 5b 5d 20 65 78 69 73 74 73 2c 20   if p[] exists, 
12810 6f 72 20 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68  or if p==NULL th
12820 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  en allocate a ne
12830 77 0a 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70  w.  ** WhereLoop
12840 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 2e 0a   and insert it..
12850 20 20 2a 2f 0a 23 69 66 20 57 48 45 52 45 54 52    */.#if WHERETR
12860 41 43 45 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30  ACE_ENABLED /* 0
12870 78 38 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  x8 */.  if( sqli
12880 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20  te3WhereTrace & 
12890 30 78 38 20 29 7b 0a 20 20 20 20 69 66 28 20 70  0x8 ){.    if( p
128a0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
128b0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
128c0 22 72 65 70 6c 61 63 65 3a 20 22 29 3b 0a 20 20  "replace: ");.  
128d0 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
128e0 6e 74 28 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e  nt(p, pBuilder->
128f0 70 57 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  pWC);.      sqli
12900 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
12910 20 20 20 77 69 74 68 3a 20 22 29 3b 0a 20 20 20     with: ");.   
12920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
12930 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
12940 28 22 20 20 20 20 61 64 64 3a 20 22 29 3b 0a 20  ("    add: ");. 
12950 20 20 20 7d 0a 20 20 20 20 77 68 65 72 65 4c 6f     }.    whereLo
12960 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74  opPrint(pTemplat
12970 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  e, pBuilder->pWC
12980 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
12990 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
129a0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
129b0 77 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f 20 61  w WhereLoop to a
129c0 64 64 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  dd to the end of
129d0 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 20   the list */.   
129e0 20 2a 70 70 50 72 65 76 20 3d 20 70 20 3d 20 73   *ppPrev = p = s
129f0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
12a00 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 57  wNN(db, sizeof(W
12a10 68 65 72 65 4c 6f 6f 70 29 29 3b 0a 20 20 20 20  hereLoop));.    
12a20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
12a30 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
12a40 4b 50 54 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f  KPT;.    whereLo
12a50 6f 70 49 6e 69 74 28 70 29 3b 0a 20 20 20 20 70  opInit(p);.    p
12a60 2d 3e 70 4e 65 78 74 4c 6f 6f 70 20 3d 20 30 3b  ->pNextLoop = 0;
12a70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
12a80 20 57 65 20 77 69 6c 6c 20 62 65 20 6f 76 65 72   We will be over
12a90 77 72 69 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  writing WhereLoo
12aa0 70 20 70 5b 5d 2e 20 20 42 75 74 20 62 65 66 6f  p p[].  But befo
12ab0 72 65 20 77 65 20 64 6f 2c 20 66 69 72 73 74 0a  re we do, first.
12ac0 20 20 20 20 2a 2a 20 67 6f 20 74 68 72 6f 75 67      ** go throug
12ad0 68 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  h the rest of th
12ae0 65 20 6c 69 73 74 20 61 6e 64 20 64 65 6c 65 74  e list and delet
12af0 65 20 61 6e 79 20 6f 74 68 65 72 20 65 6e 74 72  e any other entr
12b00 69 65 73 20 62 65 73 69 64 65 73 0a 20 20 20 20  ies besides.    
12b10 2a 2a 20 70 5b 5d 20 74 68 61 74 20 61 72 65 20  ** p[] that are 
12b20 61 6c 73 6f 20 73 75 70 70 6c 61 74 65 64 20 62  also supplated b
12b30 79 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 20  y pTemplate */. 
12b40 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70     WhereLoop **p
12b50 70 54 61 69 6c 20 3d 20 26 70 2d 3e 70 4e 65 78  pTail = &p->pNex
12b60 74 4c 6f 6f 70 3b 0a 20 20 20 20 57 68 65 72 65  tLoop;.    Where
12b70 4c 6f 6f 70 20 2a 70 54 6f 44 65 6c 3b 0a 20 20  Loop *pToDel;.  
12b80 20 20 77 68 69 6c 65 28 20 2a 70 70 54 61 69 6c    while( *ppTail
12b90 20 29 7b 0a 20 20 20 20 20 20 70 70 54 61 69 6c   ){.      ppTail
12ba0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64   = whereLoopFind
12bb0 4c 65 73 73 65 72 28 70 70 54 61 69 6c 2c 20 70  Lesser(ppTail, p
12bc0 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 20 20 20  Template);.     
12bd0 20 69 66 28 20 70 70 54 61 69 6c 3d 3d 30 20 29   if( ppTail==0 )
12be0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54   break;.      pT
12bf0 6f 44 65 6c 20 3d 20 2a 70 70 54 61 69 6c 3b 0a  oDel = *ppTail;.
12c00 20 20 20 20 20 20 69 66 28 20 70 54 6f 44 65 6c        if( pToDel
12c10 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
12c20 20 20 20 2a 70 70 54 61 69 6c 20 3d 20 70 54 6f     *ppTail = pTo
12c30 44 65 6c 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a  Del->pNextLoop;.
12c40 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  #if WHERETRACE_E
12c50 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f  NABLED /* 0x8 */
12c60 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
12c70 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
12c80 78 38 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  x8 ){.        sq
12c90 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
12ca0 28 22 20 64 65 6c 65 74 65 3a 20 22 29 3b 0a 20  (" delete: ");. 
12cb0 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70         whereLoop
12cc0 50 72 69 6e 74 28 70 54 6f 44 65 6c 2c 20 70 42  Print(pToDel, pB
12cd0 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20  uilder->pWC);.  
12ce0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
12cf0 20 20 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65     whereLoopDele
12d00 74 65 28 64 62 2c 20 70 54 6f 44 65 6c 29 3b 0a  te(db, pToDel);.
12d10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d      }.  }.  rc =
12d20 20 77 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 64   whereLoopXfer(d
12d30 62 2c 20 70 2c 20 70 54 65 6d 70 6c 61 74 65 29  b, p, pTemplate)
12d40 3b 0a 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  ;.  if( (p->wsFl
12d50 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
12d60 55 41 4c 54 41 42 4c 45 29 3d 3d 30 20 29 7b 0a  UALTABLE)==0 ){.
12d70 20 20 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65      Index *pInde
12d80 78 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70  x = p->u.btree.p
12d90 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70  Index;.    if( p
12da0 49 6e 64 65 78 20 26 26 20 70 49 6e 64 65 78 2d  Index && pIndex-
12db0 3e 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  >tnum==0 ){.    
12dc0 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e    p->u.btree.pIn
12dd0 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  dex = 0;.    }. 
12de0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
12df0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
12e00 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f  the WhereLoop.nO
12e10 75 74 20 76 61 6c 75 65 20 64 6f 77 6e 77 61 72  ut value downwar
12e20 64 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72  d to account for
12e30 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
12e40 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
12e50 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  at reference the
12e60 20 6c 6f 6f 70 20 62 75 74 20 77 68 69 63 68 20   loop but which 
12e70 61 72 65 20 6e 6f 74 20 75 73 65 64 20 62 79 20  are not used by 
12e80 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 0a 2a  an.** index..*.*
12e90 2a 20 46 6f 72 20 65 76 65 72 79 20 57 48 45 52  * For every WHER
12ea0 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68  E clause term th
12eb0 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62  at is not used b
12ec0 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61  y the index.** a
12ed0 6e 64 20 77 68 69 63 68 20 68 61 73 20 61 20 74  nd which has a t
12ee0 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79  ruth probability
12ef0 20 61 73 73 69 67 6e 65 64 20 62 79 20 6f 6e 65   assigned by one
12f00 20 6f 66 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f   of the likeliho
12f10 6f 64 28 29 2c 0a 2a 2a 20 6c 69 6b 65 6c 79 28  od(),.** likely(
12f20 29 2c 20 6f 72 20 75 6e 6c 69 6b 65 6c 79 28 29  ), or unlikely()
12f30 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 73 2c 20   SQL functions, 
12f40 72 65 64 75 63 65 20 74 68 65 20 65 73 74 69 6d  reduce the estim
12f50 61 74 65 64 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f  ated number.** o
12f60 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 62 79  f output rows by
12f70 20 74 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79   the probability
12f80 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
12f90 2a 20 54 55 4e 49 4e 47 3a 20 20 46 6f 72 20 65  * TUNING:  For e
12fa0 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73  very WHERE claus
12fb0 65 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 6e  e term that is n
12fc0 6f 74 20 75 73 65 64 20 62 79 20 74 68 65 20 69  ot used by the i
12fd0 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63  ndex.** and whic
12fe0 68 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20  h does not have 
12ff0 61 6e 20 61 73 73 69 67 6e 65 64 20 74 72 75 74  an assigned trut
13000 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2c 20 68  h probability, h
13010 65 75 72 69 73 74 69 63 73 0a 2a 2a 20 64 65 73  euristics.** des
13020 63 72 69 62 65 64 20 62 65 6c 6f 77 20 61 72 65  cribed below are
13030 20 75 73 65 64 20 74 6f 20 74 72 79 20 74 6f 20   used to try to 
13040 65 73 74 69 6d 61 74 65 20 74 68 65 20 74 72 75  estimate the tru
13050 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2e 0a  th probability..
13060 2a 2a 20 54 4f 44 4f 20 2d 2d 3e 20 50 65 72 68  ** TODO --> Perh
13070 61 70 73 20 74 68 69 73 20 69 73 20 73 6f 6d 65  aps this is some
13080 74 68 69 6e 67 20 74 68 61 74 20 63 6f 75 6c 64  thing that could
13090 20 62 65 20 69 6d 70 72 6f 76 65 64 20 62 79 20   be improved by 
130a0 62 65 74 74 65 72 0a 2a 2a 20 74 61 62 6c 65 20  better.** table 
130b0 73 74 61 74 69 73 74 69 63 73 2e 0a 2a 2a 0a 2a  statistics..**.*
130c0 2a 20 48 65 75 72 69 73 74 69 63 20 31 3a 20 20  * Heuristic 1:  
130d0 45 73 74 69 6d 61 74 65 20 74 68 65 20 74 72 75  Estimate the tru
130e0 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 61  th probability a
130f0 73 20 39 33 2e 37 35 25 2e 20 20 54 68 65 20 39  s 93.75%.  The 9
13100 33 2e 37 35 25 0a 2a 2a 20 76 61 6c 75 65 20 63  3.75%.** value c
13110 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 2d 31  orresponds to -1
13120 20 69 6e 20 4c 6f 67 45 73 74 20 6e 6f 74 61 74   in LogEst notat
13130 69 6f 6e 2c 20 73 6f 20 74 68 69 73 20 6d 65 61  ion, so this mea
13140 6e 73 20 64 65 63 72 65 6d 65 6e 74 0a 2a 2a 20  ns decrement.** 
13150 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f  the WhereLoop.nO
13160 75 74 20 66 69 65 6c 64 20 66 6f 72 20 65 76 65  ut field for eve
13170 72 79 20 73 75 63 68 20 57 48 45 52 45 20 63 6c  ry such WHERE cl
13180 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 0a 2a 2a  ause term..**.**
13190 20 48 65 75 72 69 73 74 69 63 20 32 3a 20 20 49   Heuristic 2:  I
131a0 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6f  f there exists o
131b0 6e 65 20 6f 72 20 6d 6f 72 65 20 57 48 45 52 45  ne or more WHERE
131c0 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66   clause terms of
131d0 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 22 78 3d   the.** form "x=
131e0 3d 45 58 50 52 22 20 61 6e 64 20 45 58 50 52 20  =EXPR" and EXPR 
131f0 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73 74 61 6e  is not a constan
13200 74 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 6d  t 0 or 1, then m
13210 61 6b 65 20 73 75 72 65 20 74 68 65 0a 2a 2a 20  ake sure the.** 
13220 66 69 6e 61 6c 20 6f 75 74 70 75 74 20 72 6f 77  final output row
13230 20 65 73 74 69 6d 61 74 65 20 69 73 20 6e 6f 20   estimate is no 
13240 67 72 65 61 74 65 72 20 74 68 61 6e 20 31 2f 34  greater than 1/4
13250 20 6f 66 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   of the total nu
13260 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20  mber.** of rows 
13270 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49  in the table.  I
13280 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61  n other words, a
13290 73 73 75 6d 65 20 74 68 61 74 20 78 3d 3d 45 58  ssume that x==EX
132a0 50 52 20 77 69 6c 6c 20 66 69 6c 74 65 72 0a 2a  PR will filter.*
132b0 2a 20 6f 75 74 20 61 74 20 6c 65 61 73 74 20 33  * out at least 3
132c0 20 6f 75 74 20 6f 66 20 34 20 72 6f 77 73 2e 20   out of 4 rows. 
132d0 20 49 66 20 45 58 50 52 20 69 73 20 2d 31 20 6f   If EXPR is -1 o
132e0 72 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 6d  r 0 or 1, then m
132f0 61 79 62 65 20 74 68 65 0a 2a 2a 20 22 78 22 20  aybe the.** "x" 
13300 63 6f 6c 75 6d 6e 20 69 73 20 62 6f 6f 6c 65 61  column is boolea
13310 6e 20 6f 72 20 65 6c 73 65 20 2d 31 20 6f 72 20  n or else -1 or 
13320 30 20 6f 72 20 31 20 69 73 20 61 20 63 6f 6d 6d  0 or 1 is a comm
13330 6f 6e 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  on default value
13340 0a 2a 2a 20 6f 6e 20 74 68 65 20 22 78 22 20 63  .** on the "x" c
13350 6f 6c 75 6d 6e 20 61 6e 64 20 73 6f 20 69 6e 20  olumn and so in 
13360 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 63  that case only c
13370 61 70 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f  ap the output ro
13380 77 20 65 73 74 69 6d 61 74 65 0a 2a 2a 20 61 74  w estimate.** at
13390 20 31 2f 32 20 69 6e 73 74 65 61 64 20 6f 66 20   1/2 instead of 
133a0 31 2f 34 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  1/4..*/.static v
133b0 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74  oid whereLoopOut
133c0 70 75 74 41 64 6a 75 73 74 28 0a 20 20 57 68 65  putAdjust(.  Whe
133d0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
133e0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
133f0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
13400 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20  reLoop *pLoop,  
13410 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 70 20      /* The loop 
13420 74 6f 20 61 64 6a 75 73 74 20 64 6f 77 6e 77 61  to adjust downwa
13430 72 64 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e  rd */.  LogEst n
13440 52 6f 77 20 20 20 20 20 20 20 20 20 20 20 20 2f  Row            /
13450 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * Number of rows
13460 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20 74   in the entire t
13470 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65  able */.){.  Whe
13480 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a  reTerm *pTerm, *
13490 70 58 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f  pX;.  Bitmask no
134a0 74 41 6c 6c 6f 77 65 64 20 3d 20 7e 28 70 4c 6f  tAllowed = ~(pLo
134b0 6f 70 2d 3e 70 72 65 72 65 71 7c 70 4c 6f 6f 70  op->prereq|pLoop
134c0 2d 3e 6d 61 73 6b 53 65 6c 66 29 3b 0a 20 20 69  ->maskSelf);.  i
134d0 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a 20 20 4c 6f  nt i, j, k;.  Lo
134e0 67 45 73 74 20 69 52 65 64 75 63 65 20 3d 20 30  gEst iReduce = 0
134f0 3b 20 20 20 20 2f 2a 20 70 4c 6f 6f 70 2d 3e 6e  ;    /* pLoop->n
13500 4f 75 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 65  Out should not e
13510 78 63 65 65 64 20 6e 52 6f 77 2d 69 52 65 64 75  xceed nRow-iRedu
13520 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ce */..  assert(
13530 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
13540 20 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e   & WHERE_AUTO_IN
13550 44 45 58 29 3d 3d 30 20 29 3b 0a 20 20 66 6f 72  DEX)==0 );.  for
13560 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2c 20 70  (i=pWC->nTerm, p
13570 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3e 30  Term=pWC->a; i>0
13580 3b 20 69 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i--, pTerm++){
13590 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
135a0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
135b0 56 49 52 54 55 41 4c 29 21 3d 30 20 29 20 62 72  VIRTUAL)!=0 ) br
135c0 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 28 70 54  eak;.    if( (pT
135d0 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
135e0 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
135f0 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
13600 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
13610 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74  >prereqAll & not
13620 41 6c 6c 6f 77 65 64 29 21 3d 30 20 29 20 63 6f  Allowed)!=0 ) co
13630 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72 28  ntinue;.    for(
13640 6a 3d 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 2d  j=pLoop->nLTerm-
13650 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
13660 20 20 20 20 20 70 58 20 3d 20 70 4c 6f 6f 70 2d       pX = pLoop-
13670 3e 61 4c 54 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20  >aLTerm[j];.    
13680 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 63 6f    if( pX==0 ) co
13690 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
136a0 28 20 70 58 3d 3d 70 54 65 72 6d 20 29 20 62 72  ( pX==pTerm ) br
136b0 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  eak;.      if( p
136c0 58 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 26 26  X->iParent>=0 &&
136d0 20 28 26 70 57 43 2d 3e 61 5b 70 58 2d 3e 69 50   (&pWC->a[pX->iP
136e0 61 72 65 6e 74 5d 29 3d 3d 70 54 65 72 6d 20 29  arent])==pTerm )
136f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
13700 20 20 69 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20    if( j<0 ){.   
13710 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72     if( pTerm->tr
13720 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20  uthProb<=0 ){.  
13730 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 74 72        /* If a tr
13740 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20  uth probability 
13750 69 73 20 73 70 65 63 69 66 69 65 64 20 75 73 69  is specified usi
13760 6e 67 20 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f  ng the likelihoo
13770 64 28 29 20 68 69 6e 74 73 2c 0a 20 20 20 20 20  d() hints,.     
13780 20 20 20 2a 2a 20 74 68 65 6e 20 75 73 65 20 74     ** then use t
13790 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 70  he probability p
137a0 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 61  rovided by the a
137b0 70 70 6c 69 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20  pplication. */. 
137c0 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f         pLoop->nO
137d0 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75  ut += pTerm->tru
137e0 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 7d 65  thProb;.      }e
137f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
13800 49 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f  In the absence o
13810 66 20 65 78 70 6c 69 63 69 74 20 74 72 75 74 68  f explicit truth
13820 20 70 72 6f 62 61 62 69 6c 69 74 69 65 73 2c 20   probabilities, 
13830 75 73 65 20 68 65 75 72 69 73 74 69 63 73 20 74  use heuristics t
13840 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 75 65  o.        ** gue
13850 73 73 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 20  ss a reasonable 
13860 74 72 75 74 68 20 70 72 6f 62 61 62 69 6c 69 74  truth probabilit
13870 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4c  y. */.        pL
13880 6f 6f 70 2d 3e 6e 4f 75 74 2d 2d 3b 0a 20 20 20  oop->nOut--;.   
13890 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
138a0 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f 45 51  eOperator&(WO_EQ
138b0 7c 57 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20 20  |WO_IS) ){.     
138c0 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
138d0 74 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  t = pTerm->pExpr
138e0 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
138f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
13900 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d  erm->pExpr->op==
13910 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20  TK_IS );.       
13920 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
13930 70 72 49 73 49 6e 74 65 67 65 72 28 70 52 69 67  prIsInteger(pRig
13940 68 74 2c 20 26 6b 29 20 26 26 20 6b 3e 3d 28 2d  ht, &k) && k>=(-
13950 31 29 20 26 26 20 6b 3c 3d 31 20 29 7b 0a 20 20  1) && k<=1 ){.  
13960 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 31 30            k = 10
13970 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
13980 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6b  e{.            k
13990 20 3d 20 32 30 3b 0a 20 20 20 20 20 20 20 20 20   = 20;.         
139a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
139b0 20 69 52 65 64 75 63 65 3c 6b 20 29 20 69 52 65   iReduce<k ) iRe
139c0 64 75 63 65 20 3d 20 6b 3b 0a 20 20 20 20 20 20  duce = k;.      
139d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
139e0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f  }.  }.  if( pLoo
139f0 70 2d 3e 6e 4f 75 74 20 3e 20 6e 52 6f 77 2d 69  p->nOut > nRow-i
13a00 52 65 64 75 63 65 20 29 20 20 70 4c 6f 6f 70 2d  Reduce )  pLoop-
13a10 3e 6e 4f 75 74 20 3d 20 6e 52 6f 77 20 2d 20 69  >nOut = nRow - i
13a20 52 65 64 75 63 65 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  Reduce;.}../* .*
13a30 2a 20 54 65 72 6d 20 70 54 65 72 6d 20 69 73 20  * Term pTerm is 
13a40 61 20 76 65 63 74 6f 72 20 72 61 6e 67 65 20 63  a vector range c
13a50 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
13a60 69 6f 6e 2e 20 54 68 65 20 66 69 72 73 74 20 63  ion. The first c
13a70 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 69 6e 20  omparison.** in 
13a80 74 68 65 20 76 65 63 74 6f 72 20 63 61 6e 20 62  the vector can b
13a90 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73 69 6e  e optimized usin
13aa0 67 20 63 6f 6c 75 6d 6e 20 6e 45 71 20 6f 66 20  g column nEq of 
13ab0 74 68 65 20 69 6e 64 65 78 2e 20 54 68 69 73 0a  the index. This.
13ac0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
13ad0 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  rns the total nu
13ae0 6d 62 65 72 20 6f 66 20 76 65 63 74 6f 72 20 65  mber of vector e
13af0 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 63 61 6e  lements that can
13b00 20 62 65 20 75 73 65 64 0a 2a 2a 20 61 73 20 70   be used.** as p
13b10 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65  art of the range
13b20 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2a 0a   comparison..**.
13b30 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
13b40 69 66 20 74 68 65 20 71 75 65 72 79 20 69 73 3a  if the query is:
13b50 0a 2a 2a 0a 2a 2a 20 20 20 57 48 45 52 45 20 61  .**.**   WHERE a
13b60 20 3d 20 3f 20 41 4e 44 20 28 62 2c 20 63 2c 20   = ? AND (b, c, 
13b70 64 29 20 3e 20 28 3f 2c 20 3f 2c 20 3f 29 0a 2a  d) > (?, ?, ?).*
13b80 2a 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64  *.** and the ind
13b90 65 78 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41  ex:.**.**   CREA
13ba0 54 45 20 49 4e 44 45 58 20 2e 2e 2e 20 4f 4e 20  TE INDEX ... ON 
13bb0 28 61 2c 20 62 2c 20 63 2c 20 64 2c 20 65 29 0a  (a, b, c, d, e).
13bc0 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  **.** then this 
13bd0 66 75 6e 63 74 69 6f 6e 20 77 6f 75 6c 64 20 62  function would b
13be0 65 20 69 6e 76 6f 6b 65 64 20 77 69 74 68 20 6e  e invoked with n
13bf0 45 71 3d 31 2e 20 54 68 65 20 76 61 6c 75 65 20  Eq=1. The value 
13c00 72 65 74 75 72 6e 65 64 20 69 6e 0a 2a 2a 20 74  returned in.** t
13c10 68 69 73 20 63 61 73 65 20 69 73 20 33 2e 0a 2a  his case is 3..*
13c20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
13c30 72 65 52 61 6e 67 65 56 65 63 74 6f 72 4c 65 6e  reRangeVectorLen
13c40 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
13c50 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
13c60 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
13c70 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20   int iCur,      
13c80 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
13c90 6f 70 65 6e 20 6f 6e 20 70 49 64 78 20 2a 2f 0a  open on pIdx */.
13ca0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
13cb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
13cc0 64 65 78 20 74 6f 20 62 65 20 75 73 65 64 20 66  dex to be used f
13cd0 6f 72 20 61 20 69 6e 65 71 75 61 6c 69 74 79 20  or a inequality 
13ce0 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
13cf0 69 6e 74 20 6e 45 71 2c 20 20 20 20 20 20 20 20  int nEq,        
13d00 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13d10 66 20 70 72 69 6f 72 20 65 71 75 61 6c 69 74 79  f prior equality
13d20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20   constraints on 
13d30 73 61 6d 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  same index */.  
13d40 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
13d50 20 20 20 20 20 2f 2a 20 54 68 65 20 76 65 63 74       /* The vect
13d60 6f 72 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  or inequality co
13d70 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20  nstraint */.){. 
13d80 20 69 6e 74 20 6e 43 6d 70 20 3d 20 73 71 6c 69   int nCmp = sqli
13d90 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
13da0 65 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  e(pTerm->pExpr->
13db0 70 4c 65 66 74 29 3b 0a 20 20 69 6e 74 20 69 3b  pLeft);.  int i;
13dc0 0a 0a 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e  ..  nCmp = MIN(n
13dd0 43 6d 70 2c 20 28 70 49 64 78 2d 3e 6e 43 6f 6c  Cmp, (pIdx->nCol
13de0 75 6d 6e 20 2d 20 6e 45 71 29 29 3b 0a 20 20 66  umn - nEq));.  f
13df0 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6d 70 3b 20  or(i=1; i<nCmp; 
13e00 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 54 65 73  i++){.    /* Tes
13e10 74 20 69 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  t if comparison 
13e20 69 20 6f 66 20 70 54 65 72 6d 20 69 73 20 63 6f  i of pTerm is co
13e30 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 63 6f  mpatible with co
13e40 6c 75 6d 6e 20 28 69 2b 6e 45 71 29 20 0a 20 20  lumn (i+nEq) .  
13e50 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65    ** of the inde
13e60 78 2e 20 49 66 20 6e 6f 74 2c 20 65 78 69 74 20  x. If not, exit 
13e70 74 68 65 20 6c 6f 6f 70 2e 20 20 2a 2f 0a 20 20  the loop.  */.  
13e80 20 20 63 68 61 72 20 61 66 66 3b 20 20 20 20 20    char aff;     
13e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ea0 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61 66  /* Comparison af
13eb0 66 69 6e 69 74 79 20 2a 2f 0a 20 20 20 20 63 68  finity */.    ch
13ec0 61 72 20 69 64 78 61 66 66 20 3d 20 30 3b 20 20  ar idxaff = 0;  
13ed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
13ee0 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61  ndexed columns a
13ef0 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 20 20 43  ffinity */.    C
13f00 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20  ollSeq *pColl;  
13f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13f20 43 6f 6d 70 61 72 69 73 6f 6e 20 63 6f 6c 6c 61  Comparison colla
13f30 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f  tion sequence */
13f40 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 68 73 20  .    Expr *pLhs 
13f50 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  = pTerm->pExpr->
13f60 70 4c 65 66 74 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pLeft->x.pList->
13f70 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
13f80 45 78 70 72 20 2a 70 52 68 73 20 3d 20 70 54 65  Expr *pRhs = pTe
13f90 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
13fa0 74 3b 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d  t;.    if( pRhs-
13fb0 3e 66 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  >flags & EP_xIsS
13fc0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 70  elect ){.      p
13fd0 52 68 73 20 3d 20 70 52 68 73 2d 3e 78 2e 70 53  Rhs = pRhs->x.pS
13fe0 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
13ff0 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d  [i].pExpr;.    }
14000 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 68 73  else{.      pRhs
14010 20 3d 20 70 52 68 73 2d 3e 78 2e 70 4c 69 73 74   = pRhs->x.pList
14020 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
14030 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
14040 6b 20 74 68 61 74 20 74 68 65 20 4c 48 53 20 6f  k that the LHS o
14050 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  f the comparison
14060 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 72 65 66   is a column ref
14070 65 72 65 6e 63 65 20 74 6f 0a 20 20 20 20 2a 2a  erence to.    **
14080 20 74 68 65 20 72 69 67 68 74 20 63 6f 6c 75 6d   the right colum
14090 6e 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 73  n of the right s
140a0 6f 75 72 63 65 20 74 61 62 6c 65 2e 20 41 6e 64  ource table. And
140b0 20 74 68 61 74 20 74 68 65 20 73 6f 72 74 0a 20   that the sort. 
140c0 20 20 20 2a 2a 20 6f 72 64 65 72 20 6f 66 20 74     ** order of t
140d0 68 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20  he index column 
140e0 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  is the same as t
140f0 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20 6f 66  he sort order of
14100 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74   the.    ** left
14110 6d 6f 73 74 20 69 6e 64 65 78 20 63 6f 6c 75 6d  most index colum
14120 6e 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  n.  */.    if( p
14130 4c 68 73 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  Lhs->op!=TK_COLU
14140 4d 4e 20 0a 20 20 20 20 20 7c 7c 20 70 4c 68 73  MN .     || pLhs
14150 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72 20 0a  ->iTable!=iCur .
14160 20 20 20 20 20 7c 7c 20 70 4c 68 73 2d 3e 69 43       || pLhs->iC
14170 6f 6c 75 6d 6e 21 3d 70 49 64 78 2d 3e 61 69 43  olumn!=pIdx->aiC
14180 6f 6c 75 6d 6e 5b 69 2b 6e 45 71 5d 20 0a 20 20  olumn[i+nEq] .  
14190 20 20 20 7c 7c 20 70 49 64 78 2d 3e 61 53 6f 72     || pIdx->aSor
141a0 74 4f 72 64 65 72 5b 69 2b 6e 45 71 5d 21 3d 70  tOrder[i+nEq]!=p
141b0 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
141c0 6e 45 71 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20  nEq].    ){.    
141d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
141e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c      testcase( pL
141f0 68 73 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f  hs->iColumn==XN_
14200 52 4f 57 49 44 20 29 3b 0a 20 20 20 20 61 66 66  ROWID );.    aff
14210 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72   = sqlite3Compar
14220 65 41 66 66 69 6e 69 74 79 28 70 52 68 73 2c 20  eAffinity(pRhs, 
14230 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
14240 69 74 79 28 70 4c 68 73 29 29 3b 0a 20 20 20 20  ity(pLhs));.    
14250 69 64 78 61 66 66 20 3d 20 73 71 6c 69 74 65 33  idxaff = sqlite3
14260 54 61 62 6c 65 43 6f 6c 75 6d 6e 41 66 66 69 6e  TableColumnAffin
14270 69 74 79 28 70 49 64 78 2d 3e 70 54 61 62 6c 65  ity(pIdx->pTable
14280 2c 20 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d 6e 29  , pLhs->iColumn)
14290 3b 0a 20 20 20 20 69 66 28 20 61 66 66 21 3d 69  ;.    if( aff!=i
142a0 64 78 61 66 66 20 29 20 62 72 65 61 6b 3b 0a 0a  dxaff ) break;..
142b0 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
142c0 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
142d0 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
142e0 70 4c 68 73 2c 20 70 52 68 73 29 3b 0a 20 20 20  pLhs, pRhs);.   
142f0 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
14300 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 73  break;.    if( s
14310 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
14320 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78  oll->zName, pIdx
14330 2d 3e 61 7a 43 6f 6c 6c 5b 69 2b 6e 45 71 5d 29  ->azColl[i+nEq])
14340 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
14350 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a  return i;.}../*.
14360 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 63 6f  ** Adjust the co
14370 73 74 20 43 20 62 79 20 74 68 65 20 63 6f 73 74  st C by the cost
14380 4d 75 6c 74 20 66 61 63 74 65 72 20 54 2e 20 20  Mult facter T.  
14390 54 68 69 73 20 6f 6e 6c 79 20 6f 63 63 75 72 73  This only occurs
143a0 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 65 64 20   if.** compiled 
143b0 77 69 74 68 20 2d 44 53 51 4c 49 54 45 5f 45 4e  with -DSQLITE_EN
143c0 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 2a 2f  ABLE_COSTMULT.*/
143d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
143e0 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 23  NABLE_COSTMULT.#
143f0 20 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73   define ApplyCos
14400 74 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29  tMultiplier(C,T)
14410 20 20 43 20 2b 3d 20 54 0a 23 65 6c 73 65 0a 23    C += T.#else.#
14420 20 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f 73   define ApplyCos
14430 74 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54 29  tMultiplier(C,T)
14440 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
14450 65 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d 61  e have so far ma
14460 74 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d 3e  tched pBuilder->
14470 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
14480 71 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 0a  q terms of the .
14490 2a 2a 20 69 6e 64 65 78 20 70 49 6e 64 65 78 2e  ** index pIndex.
144a0 20 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f 6e   Try to match on
144b0 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 57 68  e more..**.** Wh
144c0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
144d0 20 69 73 20 63 61 6c 6c 65 64 2c 20 70 42 75 69   is called, pBui
144e0 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 6e 4f 75 74  lder->pNew->nOut
144f0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 0a 2a   contains the .*
14500 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * number of rows
14510 20 65 78 70 65 63 74 65 64 20 74 6f 20 62 65 20   expected to be 
14520 76 69 73 69 74 65 64 20 62 79 20 66 69 6c 74 65  visited by filte
14530 72 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20 6e  ring using the n
14540 45 71 20 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c  Eq .** terms onl
14550 79 2e 20 49 66 20 69 74 20 69 73 20 6d 6f 64 69  y. If it is modi
14560 66 69 65 64 2c 20 74 68 69 73 20 76 61 6c 75 65  fied, this value
14570 20 69 73 20 72 65 73 74 6f 72 65 64 20 62 65 66   is restored bef
14580 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  ore this .** fun
14590 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a 2a  ction returns..*
145a0 2a 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d 3e  *.** If pProbe->
145b0 74 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d 65  tnum==0, that me
145c0 61 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61 20  ans pIndex is a 
145d0 66 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64 20  fake index used 
145e0 66 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47  for the.** INTEG
145f0 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a  ER PRIMARY KEY..
14600 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
14610 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
14620 6e 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f 6f  ndex(.  WhereLoo
14630 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
14640 65 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57  er,     /* The W
14650 68 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72 79  hereLoop factory
14660 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
14670 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
14680 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c        /* FROM cl
14690 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20  ause term being 
146a0 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49 6e  analyzed */.  In
146b0 64 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20 20  dex *pProbe,    
146c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
146d0 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53 72   An index on pSr
146e0 63 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 49  c */.  LogEst nI
146f0 6e 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20 20  nMul            
14700 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e 75         /* log(Nu
14710 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69 6f  mber of iteratio
14720 6e 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a 2f  ns due to IN) */
14730 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
14740 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64  *pWInfo = pBuild
14750 65 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a 20  er->pWInfo;  /* 
14760 57 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63 6f  WHERE analyse co
14770 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65  ntext */.  Parse
14780 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66   *pParse = pWInf
14790 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20 20  o->pParse;      
147a0 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
147b0 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
147c0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
147d0 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74  db;       /* Dat
147e0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
147f0 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74 20   malloc context 
14800 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
14810 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
14820 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74 65       /* Template
14830 20 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65 72   WhereLoop under
14840 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
14850 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
14860 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
14870 20 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65 72     /* A WhereTer
14880 6d 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65 72  m under consider
14890 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f  ation */.  int o
148a0 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  pMask;          
148b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
148c0 6c 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66 6f  lid operators fo
148d0 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  r constraints */
148e0 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63 61  .  WhereScan sca
148f0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
14900 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66     /* Iterator f
14910 6f 72 20 57 48 45 52 45 20 74 65 72 6d 73 20 2a  or WHERE terms *
14920 2f 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76 65  /.  Bitmask save
14930 64 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20 20  d_prereq;       
14940 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
14950 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 70  value of pNew->p
14960 72 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20 73  rereq */.  u16 s
14970 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20 20  aved_nLTerm;    
14980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
14990 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
149a0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a  pNew->nLTerm */.
149b0 20 20 75 31 36 20 73 61 76 65 64 5f 6e 45 71 3b    u16 saved_nEq;
149c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149d0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
149e0 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62  lue of pNew->u.b
149f0 74 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75 31  tree.nEq */.  u1
14a00 36 20 73 61 76 65 64 5f 6e 42 74 6d 3b 20 20 20  6 saved_nBtm;   
14a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14a20 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
14a30 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  of pNew->u.btree
14a40 2e 6e 42 74 6d 20 2a 2f 0a 20 20 75 31 36 20 73  .nBtm */.  u16 s
14a50 61 76 65 64 5f 6e 54 6f 70 3b 20 20 20 20 20 20  aved_nTop;      
14a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72             /* Or
14a70 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20  iginal value of 
14a80 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54  pNew->u.btree.nT
14a90 6f 70 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65  op */.  u16 save
14aa0 64 5f 6e 53 6b 69 70 3b 20 20 20 20 20 20 20 20  d_nSkip;        
14ab0 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
14ac0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65  nal value of pNe
14ad0 77 2d 3e 6e 53 6b 69 70 20 2a 2f 0a 20 20 75 33  w->nSkip */.  u3
14ae0 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b  2 saved_wsFlags;
14af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14b00 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
14b10 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  of pNew->wsFlags
14b20 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 73 61 76   */.  LogEst sav
14b30 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20 20 20  ed_nOut;        
14b40 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
14b50 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d  l value of pNew-
14b60 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20 72  >nOut */.  int r
14b70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
14b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
14b90 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4c  turn code */.  L
14ba0 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20  ogEst rSize;    
14bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14bc0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  * Number of rows
14bd0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   in the table */
14be0 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69  .  LogEst rLogSi
14bf0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
14c00 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20     /* Logarithm 
14c10 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20 2a 2f  of table size */
14c20 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
14c30 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20 3d 20  op = 0, *pBtm = 
14c40 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62 6f  0; /* Top and bo
14c50 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73 74  ttom range const
14c60 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e 65  raints */..  pNe
14c70 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
14c80 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ew;.  if( db->ma
14c90 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
14ca0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
14cb0 5f 42 4b 50 54 3b 0a 20 20 57 48 45 52 45 54 52  _BKPT;.  WHERETR
14cc0 41 43 45 28 30 78 38 30 30 2c 20 28 22 42 45 47  ACE(0x800, ("BEG
14cd0 49 4e 20 61 64 64 42 74 72 65 65 49 64 78 28 25  IN addBtreeIdx(%
14ce0 73 29 2c 20 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20  s), nEq=%d\n",. 
14cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d00 20 20 20 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d      pProbe->zNam
14d10 65 2c 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  e, pNew->u.btree
14d20 2e 6e 45 71 29 29 3b 0a 0a 20 20 61 73 73 65 72  .nEq));..  asser
14d30 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  t( (pNew->wsFlag
14d40 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
14d50 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20  LTABLE)==0 );.  
14d60 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77  assert( (pNew->w
14d70 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
14d80 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a  OP_LIMIT)==0 );.
14d90 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c    if( pNew->wsFl
14da0 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
14db0 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d  LIMIT ){.    opM
14dc0 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  ask = WO_LT|WO_L
14dd0 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
14de0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e  assert( pNew->u.
14df0 62 74 72 65 65 2e 6e 42 74 6d 3d 3d 30 20 29 3b  btree.nBtm==0 );
14e00 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f  .    opMask = WO
14e10 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c  _EQ|WO_IN|WO_GT|
14e20 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_GE|WO_LT|WO_L
14e30 45 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49  E|WO_ISNULL|WO_I
14e40 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72  S;.  }.  if( pPr
14e50 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20  obe->bUnordered 
14e60 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f  ) opMask &= ~(WO
14e70 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c  _GT|WO_GE|WO_LT|
14e80 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72  WO_LE);..  asser
14e90 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  t( pNew->u.btree
14ea0 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f  .nEq<pProbe->nCo
14eb0 6c 75 6d 6e 20 29 3b 0a 0a 20 20 73 61 76 65 64  lumn );..  saved
14ec0 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62  _nEq = pNew->u.b
14ed0 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65  tree.nEq;.  save
14ee0 64 5f 6e 42 74 6d 20 3d 20 70 4e 65 77 2d 3e 75  d_nBtm = pNew->u
14ef0 2e 62 74 72 65 65 2e 6e 42 74 6d 3b 0a 20 20 73  .btree.nBtm;.  s
14f00 61 76 65 64 5f 6e 54 6f 70 20 3d 20 70 4e 65 77  aved_nTop = pNew
14f10 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 3b 0a  ->u.btree.nTop;.
14f20 20 20 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20    saved_nSkip = 
14f30 70 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73  pNew->nSkip;.  s
14f40 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e  aved_nLTerm = pN
14f50 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61  ew->nLTerm;.  sa
14f60 76 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e  ved_wsFlags = pN
14f70 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73  ew->wsFlags;.  s
14f80 61 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e  aved_prereq = pN
14f90 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61  ew->prereq;.  sa
14fa0 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d  ved_nOut = pNew-
14fb0 3e 6e 4f 75 74 3b 0a 20 20 70 54 65 72 6d 20 3d  >nOut;.  pTerm =
14fc0 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26   whereScanInit(&
14fd0 73 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e  scan, pBuilder->
14fe0 70 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72 73  pWC, pSrc->iCurs
14ff0 6f 72 2c 20 73 61 76 65 64 5f 6e 45 71 2c 0a 20  or, saved_nEq,. 
15000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15010 20 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70         opMask, p
15020 50 72 6f 62 65 29 3b 0a 20 20 70 4e 65 77 2d 3e  Probe);.  pNew->
15030 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 53  rSetup = 0;.  rS
15040 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  ize = pProbe->ai
15050 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20  RowLogEst[0];.  
15060 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f  rLogSize = estLo
15070 67 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f 72 28  g(rSize);.  for(
15080 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
15090 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65  && pTerm!=0; pTe
150a0 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65  rm = whereScanNe
150b0 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20  xt(&scan)){.    
150c0 75 31 36 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d  u16 eOp = pTerm-
150d0 3e 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a  >eOperator;   /*
150e0 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70   Shorthand for p
150f0 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
15100 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20 72 43  */.    LogEst rC
15110 6f 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45  ostIdx;.    LogE
15120 73 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65  st nOutUnadjuste
15130 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75  d;        /* nOu
15140 74 20 62 65 66 6f 72 65 20 49 4e 28 29 20 61 6e  t before IN() an
15150 64 20 57 48 45 52 45 20 61 64 6a 75 73 74 6d 65  d WHERE adjustme
15160 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  nts */.    int n
15170 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  In = 0;.#ifdef S
15180 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
15190 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
151a0 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20  int nRecValid = 
151b0 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
151c0 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  lid;.#endif.    
151d0 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e  if( (eOp==WO_ISN
151e0 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77  ULL || (pTerm->w
151f0 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c  tFlags&TERM_VNUL
15200 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 69  L)!=0).     && i
15210 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c  ndexColumnNotNul
15220 6c 28 70 50 72 6f 62 65 2c 20 73 61 76 65 64 5f  l(pProbe, saved_
15230 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  nEq).    ){.    
15240 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 69    continue; /* i
15250 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20 4e  gnore IS [NOT] N
15260 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ULL constraints 
15270 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75  on NOT NULL colu
15280 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  mns */.    }.   
15290 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
152a0 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e  eqRight & pNew->
152b0 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69  maskSelf ) conti
152c0 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20  nue;..    /* Do 
152d0 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 75 70  not allow the up
152e0 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 61 20 4c  per bound of a L
152f0 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  IKE optimization
15300 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
15310 74 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 69 78 20  t.    ** to mix 
15320 77 69 74 68 20 61 20 6c 6f 77 65 72 20 72 61 6e  with a lower ran
15330 67 65 20 62 6f 75 6e 64 20 66 72 6f 6d 20 73 6f  ge bound from so
15340 6d 65 20 6f 74 68 65 72 20 73 6f 75 72 63 65 20  me other source 
15350 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  */.    if( pTerm
15360 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
15370 5f 4c 49 4b 45 4f 50 54 20 26 26 20 70 54 65 72  _LIKEOPT && pTer
15380 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
15390 5f 4c 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  _LT ) continue;.
153a0 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61  .    /* Do not a
153b0 6c 6c 6f 77 20 49 53 20 63 6f 6e 73 74 72 61 69  llow IS constrai
153c0 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 57 48 45  nts from the WHE
153d0 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
153e0 75 73 65 64 20 62 79 20 74 68 65 0a 20 20 20 20  used by the.    
153f0 2a 2a 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  ** right table o
15400 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20  f a LEFT JOIN.  
15410 4f 6e 6c 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  Only constraints
15420 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73   in the ON claus
15430 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6c 6c  e are.    ** all
15440 6f 77 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20  owed */.    if( 
15450 28 70 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79  (pSrc->fg.jointy
15460 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
15470 0a 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61  .     && !ExprHa
15480 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
15490 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
154a0 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 28 65 4f  oin).     && (eO
154b0 70 20 26 20 28 57 4f 5f 49 53 7c 57 4f 5f 49 53  p & (WO_IS|WO_IS
154c0 4e 55 4c 4c 29 29 21 3d 30 0a 20 20 20 20 29 7b  NULL))!=0.    ){
154d0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
154e0 20 65 4f 70 20 26 20 57 4f 5f 49 53 20 29 3b 0a   eOp & WO_IS );.
154f0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15500 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  eOp & WO_ISNULL 
15510 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  );.      continu
15520 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  e;.    }..    if
15530 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  ( IsUniqueIndex(
15540 70 50 72 6f 62 65 29 20 26 26 20 73 61 76 65 64  pProbe) && saved
15550 5f 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b  _nEq==pProbe->nK
15560 65 79 43 6f 6c 2d 31 20 29 7b 0a 20 20 20 20 20  eyCol-1 ){.     
15570 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64 46 6c   pBuilder->bldFl
15580 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 42 4c  ags |= SQLITE_BL
15590 44 46 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d  DF_UNIQUE;.    }
155a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 75 69  else{.      pBui
155b0 6c 64 65 72 2d 3e 62 6c 64 46 6c 61 67 73 20 7c  lder->bldFlags |
155c0 3d 20 53 51 4c 49 54 45 5f 42 4c 44 46 5f 49 4e  = SQLITE_BLDF_IN
155d0 44 45 58 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20  DEXED;.    }.   
155e0 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d   pNew->wsFlags =
155f0 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a   saved_wsFlags;.
15600 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
15610 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45  e.nEq = saved_nE
15620 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  q;.    pNew->u.b
15630 74 72 65 65 2e 6e 42 74 6d 20 3d 20 73 61 76 65  tree.nBtm = save
15640 64 5f 6e 42 74 6d 3b 0a 20 20 20 20 70 4e 65 77  d_nBtm;.    pNew
15650 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d  ->u.btree.nTop =
15660 20 73 61 76 65 64 5f 6e 54 6f 70 3b 0a 20 20 20   saved_nTop;.   
15670 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
15680 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20  saved_nLTerm;.  
15690 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
156a0 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20  esize(db, pNew, 
156b0 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20  pNew->nLTerm+1) 
156c0 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20  ) break; /* OOM 
156d0 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54  */.    pNew->aLT
156e0 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d  erm[pNew->nLTerm
156f0 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  ++] = pTerm;.   
15700 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
15710 28 73 61 76 65 64 5f 70 72 65 72 65 71 20 7c 20  (saved_prereq | 
15720 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
15730 68 74 29 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73  ht) & ~pNew->mas
15740 6b 53 65 6c 66 3b 0a 0a 20 20 20 20 61 73 73 65  kSelf;..    asse
15750 72 74 28 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20  rt( nInMul==0.  
15760 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e        || (pNew->
15770 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
15780 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20  COLUMN_NULL)!=0 
15790 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65  .        || (pNe
157a0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
157b0 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30  RE_COLUMN_IN)!=0
157c0 20 0a 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4e   .        || (pN
157d0 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  ew->wsFlags & WH
157e0 45 52 45 5f 53 4b 49 50 53 43 41 4e 29 21 3d 30  ERE_SKIPSCAN)!=0
157f0 20 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 69 66   .    );..    if
15800 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20 29 7b  ( eOp & WO_IN ){
15810 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 78  .      Expr *pEx
15820 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
15830 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  r;.      pNew->w
15840 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
15850 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20  COLUMN_IN;.     
15860 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
15870 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
15880 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
15890 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 53       /* "x IN (S
158a0 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55  ELECT ...)":  TU
158b0 4e 49 4e 47 3a 20 74 68 65 20 53 45 4c 45 43 54  NING: the SELECT
158c0 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f 77 73   returns 25 rows
158d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
158e0 69 3b 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d  i;.        nIn =
158f0 20 34 36 3b 20 20 61 73 73 65 72 74 28 20 34 36   46;  assert( 46
15900 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
15910 32 35 29 20 29 3b 0a 0a 20 20 20 20 20 20 20 20  25) );..        
15920 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
15930 6e 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62  n may actually b
15940 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 28 78  e of the form (x
15950 2c 20 79 29 20 49 4e 20 28 53 45 4c 45 43 54 2e  , y) IN (SELECT.
15960 2e 2e 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ..)..        ** 
15970 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
15980 72 65 20 69 73 20 61 20 73 65 70 61 72 61 74 65  re is a separate
15990 20 74 65 72 6d 20 66 6f 72 20 65 61 63 68 20 6f   term for each o
159a0 66 20 28 78 29 20 61 6e 64 20 28 79 29 2e 0a 20  f (x) and (y).. 
159b0 20 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65         ** Howeve
159c0 72 2c 20 74 68 65 20 6e 49 6e 20 6d 75 6c 74 69  r, the nIn multi
159d0 70 6c 69 65 72 20 73 68 6f 75 6c 64 20 6f 6e 6c  plier should onl
159e0 79 20 62 65 20 61 70 70 6c 69 65 64 20 6f 6e 63  y be applied onc
159f0 65 2c 20 6e 6f 74 20 6f 6e 63 65 0a 20 20 20 20  e, not once.    
15a00 20 20 20 20 2a 2a 20 66 6f 72 20 65 61 63 68 20      ** for each 
15a10 73 75 63 68 20 74 65 72 6d 2e 20 54 68 65 20 66  such term. The f
15a20 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 63 68  ollowing loop ch
15a30 65 63 6b 73 20 74 68 61 74 20 70 54 65 72 6d 20  ecks that pTerm 
15a40 69 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  is the.        *
15a50 2a 20 66 69 72 73 74 20 73 75 63 68 20 74 65 72  * first such ter
15a60 6d 20 69 6e 20 75 73 65 2c 20 61 6e 64 20 73 65  m in use, and se
15a70 74 73 20 6e 49 6e 20 62 61 63 6b 20 74 6f 20 30  ts nIn back to 0
15a80 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20 2a   if it is not. *
15a90 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  /.        for(i=
15aa0 30 3b 20 69 3c 70 4e 65 77 2d 3e 6e 4c 54 65 72  0; i<pNew->nLTer
15ab0 6d 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  m-1; i++){.     
15ac0 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 61       if( pNew->a
15ad0 4c 54 65 72 6d 5b 69 5d 20 26 26 20 70 4e 65 77  LTerm[i] && pNew
15ae0 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78  ->aLTerm[i]->pEx
15af0 70 72 3d 3d 70 45 78 70 72 20 29 20 6e 49 6e 20  pr==pExpr ) nIn 
15b00 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
15b10 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41       }else if( A
15b20 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e 70  LWAYS(pExpr->x.p
15b30 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 78  List && pExpr->x
15b40 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20 29  .pList->nExpr) )
15b50 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20  {.        /* "x 
15b60 49 4e 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65  IN (value, value
15b70 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20 20 20 20  , ...)" */.     
15b80 20 20 20 6e 49 6e 20 3d 20 73 71 6c 69 74 65 33     nIn = sqlite3
15b90 4c 6f 67 45 73 74 28 70 45 78 70 72 2d 3e 78 2e  LogEst(pExpr->x.
15ba0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  pList->nExpr);. 
15bb0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
15bc0 49 6e 3e 30 20 29 3b 20 20 2f 2a 20 52 48 53 20  In>0 );  /* RHS 
15bd0 61 6c 77 61 79 73 20 68 61 73 20 32 20 6f 72 20  always has 2 or 
15be0 6d 6f 72 65 20 74 65 72 6d 73 2e 2e 2e 20 20 54  more terms...  T
15bf0 68 65 20 70 61 72 73 65 72 0a 20 20 20 20 20 20  he parser.      
15c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c10 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 73 20 22      ** changes "
15c20 78 20 49 4e 20 28 3f 29 22 20 69 6e 74 6f 20 22  x IN (?)" into "
15c30 78 3d 3f 22 2e 20 2a 2f 0a 20 20 20 20 20 20 7d  x=?". */.      }
15c40 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
15c50 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  Op & (WO_EQ|WO_I
15c60 53 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  S) ){.      int 
15c70 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65 2d 3e 61  iCol = pProbe->a
15c80 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45  iColumn[saved_nE
15c90 71 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  q];.      pNew->
15ca0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
15cb0 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20  _COLUMN_EQ;.    
15cc0 20 20 61 73 73 65 72 74 28 20 73 61 76 65 64 5f    assert( saved_
15cd0 6e 45 71 3d 3d 70 4e 65 77 2d 3e 75 2e 62 74 72  nEq==pNew->u.btr
15ce0 65 65 2e 6e 45 71 20 29 3b 0a 20 20 20 20 20 20  ee.nEq );.      
15cf0 69 66 28 20 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57  if( iCol==XN_ROW
15d00 49 44 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 69  ID .       || (i
15d10 43 6f 6c 3e 30 20 26 26 20 6e 49 6e 4d 75 6c 3d  Col>0 && nInMul=
15d20 3d 30 20 26 26 20 73 61 76 65 64 5f 6e 45 71 3d  =0 && saved_nEq=
15d30 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c  =pProbe->nKeyCol
15d40 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  -1).      ){.   
15d50 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30       if( iCol>=0
15d60 20 26 26 20 70 50 72 6f 62 65 2d 3e 75 6e 69 71   && pProbe->uniq
15d70 4e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20  NotNull==0 ){.  
15d80 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73          pNew->ws
15d90 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55  Flags |= WHERE_U
15da0 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20 20 20 20  NQ_WANTED;.     
15db0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15dc0 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
15dd0 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f  s |= WHERE_ONERO
15de0 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  W;.        }.   
15df0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
15e00 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55  f( eOp & WO_ISNU
15e10 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  LL ){.      pNew
15e20 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
15e30 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a  RE_COLUMN_NULL;.
15e40 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4f      }else if( eO
15e50 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45  p & (WO_GT|WO_GE
15e60 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  ) ){.      testc
15e70 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 54  ase( eOp & WO_GT
15e80 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
15e90 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 47 45 20  se( eOp & WO_GE 
15ea0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  );.      pNew->w
15eb0 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
15ec0 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45  COLUMN_RANGE|WHE
15ed0 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20  RE_BTM_LIMIT;.  
15ee0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
15ef0 65 2e 6e 42 74 6d 20 3d 20 77 68 65 72 65 52 61  e.nBtm = whereRa
15f00 6e 67 65 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20  ngeVectorLen(.  
15f10 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
15f20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70  pSrc->iCursor, p
15f30 50 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e 45 71  Probe, saved_nEq
15f40 2c 20 70 54 65 72 6d 0a 20 20 20 20 20 20 29 3b  , pTerm.      );
15f50 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 70 54  .      pBtm = pT
15f60 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 6f 70 20  erm;.      pTop 
15f70 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
15f80 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
15f90 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a  TERM_LIKEOPT ){.
15fa0 20 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67 65          /* Range
15fb0 20 63 6f 6e 74 72 61 69 6e 74 73 20 74 68 61 74   contraints that
15fc0 20 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 4c   come from the L
15fd0 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  IKE optimization
15fe0 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   are.        ** 
15ff0 61 6c 77 61 79 73 20 75 73 65 64 20 69 6e 20 70  always used in p
16000 61 69 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  airs. */.       
16010 20 70 54 6f 70 20 3d 20 26 70 54 65 72 6d 5b 31   pTop = &pTerm[1
16020 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
16030 74 28 20 28 70 54 6f 70 2d 28 70 54 65 72 6d 2d  t( (pTop-(pTerm-
16040 3e 70 57 43 2d 3e 61 29 29 3c 70 54 65 72 6d 2d  >pWC->a))<pTerm-
16050 3e 70 57 43 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20  >pWC->nTerm );. 
16060 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
16070 54 6f 70 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  Top->wtFlags & T
16080 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29 3b 0a 20  ERM_LIKEOPT );. 
16090 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
160a0 54 6f 70 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  Top->eOperator==
160b0 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 20  WO_LT );.       
160c0 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65   if( whereLoopRe
160d0 73 69 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70  size(db, pNew, p
160e0 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29  New->nLTerm+1) )
160f0 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a   break; /* OOM *
16100 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  /.        pNew->
16110 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
16120 65 72 6d 2b 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20  erm++] = pTop;. 
16130 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
16140 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f  lags |= WHERE_TO
16150 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20  P_LIMIT;.       
16160 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
16170 54 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Top = 1;.      }
16180 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16190 20 20 61 73 73 65 72 74 28 20 65 4f 70 20 26 20    assert( eOp & 
161a0 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b  (WO_LT|WO_LE) );
161b0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
161c0 20 65 4f 70 20 26 20 57 4f 5f 4c 54 20 29 3b 0a   eOp & WO_LT );.
161d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
161e0 65 4f 70 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20  eOp & WO_LE );. 
161f0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
16200 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
16210 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 54  MN_RANGE|WHERE_T
16220 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
16230 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54  pNew->u.btree.nT
16240 6f 70 20 3d 20 77 68 65 72 65 52 61 6e 67 65 56  op = whereRangeV
16250 65 63 74 6f 72 4c 65 6e 28 0a 20 20 20 20 20 20  ectorLen(.      
16260 20 20 20 20 70 50 61 72 73 65 2c 20 70 53 72 63      pParse, pSrc
16270 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 6f 62  ->iCursor, pProb
16280 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20 70 54  e, saved_nEq, pT
16290 65 72 6d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  erm.      );.   
162a0 20 20 20 70 54 6f 70 20 3d 20 70 54 65 72 6d 3b     pTop = pTerm;
162b0 0a 20 20 20 20 20 20 70 42 74 6d 20 3d 20 28 70  .      pBtm = (p
162c0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  New->wsFlags & W
162d0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 29 21  HERE_BTM_LIMIT)!
162e0 3d 30 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20  =0 ?.           
162f0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
16300 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54  aLTerm[pNew->nLT
16310 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20 20 20 20  erm-2] : 0;.    
16320 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
16330 73 20 70 6f 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f  s point pNew->nO
16340 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ut is set to the
16350 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
16360 65 78 70 65 63 74 65 64 20 74 6f 0a 20 20 20 20  expected to.    
16370 2a 2a 20 62 65 20 76 69 73 69 74 65 64 20 62 79  ** be visited by
16380 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20   the index scan 
16390 62 65 66 6f 72 65 20 63 6f 6e 73 69 64 65 72 69  before consideri
163a0 6e 67 20 74 65 72 6d 20 70 54 65 72 6d 2c 20 6f  ng term pTerm, o
163b0 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 61 6c  r the.    ** val
163c0 75 65 73 20 6f 66 20 6e 49 6e 20 61 6e 64 20 6e  ues of nIn and n
163d0 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68 65 72 20  InMul. In other 
163e0 77 6f 72 64 73 2c 20 61 73 73 75 6d 69 6e 67 20  words, assuming 
163f0 74 68 61 74 20 61 6c 6c 20 0a 20 20 20 20 2a 2a  that all .    **
16400 20 22 78 20 49 4e 28 2e 2e 2e 29 22 20 74 65 72   "x IN(...)" ter
16410 6d 73 20 61 72 65 20 72 65 70 6c 61 63 65 64 20  ms are replaced 
16420 77 69 74 68 20 22 78 20 3d 20 3f 22 2e 20 54 68  with "x = ?". Th
16430 69 73 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73  is block updates
16440 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75  .    ** the valu
16450 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  e of pNew->nOut 
16460 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 70  to account for p
16470 54 65 72 6d 20 28 62 75 74 20 6e 6f 74 20 6e 49  Term (but not nI
16480 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20  n/nInMul).  */. 
16490 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
164a0 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75  >nOut==saved_nOu
164b0 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  t );.    if( pNe
164c0 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  w->wsFlags & WHE
164d0 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20  RE_COLUMN_RANGE 
164e0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 6a 75  ){.      /* Adju
164f0 73 74 20 6e 4f 75 74 20 75 73 69 6e 67 20 73 74  st nOut using st
16500 61 74 33 2f 73 74 61 74 34 20 64 61 74 61 2e 20  at3/stat4 data. 
16510 4f 72 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  Or, if there is 
16520 6e 6f 20 73 74 61 74 33 2f 73 74 61 74 34 0a 20  no stat3/stat4. 
16530 20 20 20 20 20 2a 2a 20 64 61 74 61 2c 20 75 73       ** data, us
16540 69 6e 67 20 73 6f 6d 65 20 6f 74 68 65 72 20 65  ing some other e
16550 73 74 69 6d 61 74 65 2e 20 20 2a 2f 0a 20 20 20  stimate.  */.   
16560 20 20 20 77 68 65 72 65 52 61 6e 67 65 53 63 61     whereRangeSca
16570 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
16580 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20 70 54 6f  ilder, pBtm, pTo
16590 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 7d 65  p, pNew);.    }e
165a0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
165b0 45 71 20 3d 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62  Eq = ++pNew->u.b
165c0 74 72 65 65 2e 6e 45 71 3b 0a 20 20 20 20 20 20  tree.nEq;.      
165d0 61 73 73 65 72 74 28 20 65 4f 70 20 26 20 28 57  assert( eOp & (W
165e0 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57  O_ISNULL|WO_EQ|W
165f0 4f 5f 49 4e 7c 57 4f 5f 49 53 29 20 29 3b 0a 0a  O_IN|WO_IS) );..
16600 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e        assert( pN
16610 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f  ew->nOut==saved_
16620 6e 4f 75 74 20 29 3b 0a 20 20 20 20 20 20 69 66  nOut );.      if
16630 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  ( pTerm->truthPr
16640 6f 62 3c 3d 30 20 26 26 20 70 50 72 6f 62 65 2d  ob<=0 && pProbe-
16650 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f  >aiColumn[saved_
16660 6e 45 71 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 20  nEq]>=0 ){.     
16670 20 20 20 61 73 73 65 72 74 28 20 28 65 4f 70 20     assert( (eOp 
16680 26 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e 49 6e 3d  & WO_IN) || nIn=
16690 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
166a0 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
166b0 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 70  _IN );.        p
166c0 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 70 54 65  New->nOut += pTe
166d0 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20  rm->truthProb;. 
166e0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
166f0 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20  t -= nIn;.      
16700 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51  }else{.#ifdef SQ
16710 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
16720 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20 20  3_OR_STAT4.     
16730 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f 75 74 20     tRowcnt nOut 
16740 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
16750 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20 20 20 20   nInMul==0 .    
16760 20 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e       && pProbe->
16770 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20 20 20 20  nSample .       
16780 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72    && pNew->u.btr
16790 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62 65 2d 3e  ee.nEq<=pProbe->
167a0 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20 20 20 20  nSampleCol.     
167b0 20 20 20 20 26 26 20 28 28 65 4f 70 20 26 20 57      && ((eOp & W
167c0 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20 21 45 78 70  O_IN)==0 || !Exp
167d0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
167e0 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 78 49  rm->pExpr, EP_xI
167f0 73 53 65 6c 65 63 74 29 29 0a 20 20 20 20 20 20  sSelect)).      
16800 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45    ){.          E
16810 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65  xpr *pExpr = pTe
16820 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
16830 20 20 20 20 20 69 66 28 20 28 65 4f 70 20 26 20       if( (eOp & 
16840 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c  (WO_EQ|WO_ISNULL
16850 7c 57 4f 5f 49 53 29 29 21 3d 30 20 29 7b 0a 20  |WO_IS))!=0 ){. 
16860 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
16870 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 45 51  ase( eOp & WO_EQ
16880 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
16890 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26 20  testcase( eOp & 
168a0 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20  WO_IS );.       
168b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 65       testcase( e
168c0 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  Op & WO_ISNULL )
168d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
168e0 20 3d 20 77 68 65 72 65 45 71 75 61 6c 53 63 61   = whereEqualSca
168f0 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 42 75  nEst(pParse, pBu
16900 69 6c 64 65 72 2c 20 70 45 78 70 72 2d 3e 70 52  ilder, pExpr->pR
16910 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20  ight, &nOut);.  
16920 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
16930 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
16940 77 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 70  whereInScanEst(p
16950 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c  Parse, pBuilder,
16960 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c   pExpr->x.pList,
16970 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20   &nOut);.       
16980 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
16990 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
169a0 54 46 4f 55 4e 44 20 29 20 72 63 20 3d 20 53 51  TFOUND ) rc = SQ
169b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
169c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
169d0 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 20 20 20  E_OK ) break;   
169e0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 6f         /* Jump o
169f0 75 74 20 6f 66 20 74 68 65 20 70 54 65 72 6d 20  ut of the pTerm 
16a00 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 20 20  loop */.        
16a10 20 20 69 66 28 20 6e 4f 75 74 20 29 7b 0a 20 20    if( nOut ){.  
16a20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
16a30 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f  nOut = sqlite3Lo
16a40 67 45 73 74 28 6e 4f 75 74 29 3b 0a 20 20 20 20  gEst(nOut);.    
16a50 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
16a60 2d 3e 6e 4f 75 74 3e 73 61 76 65 64 5f 6e 4f 75  ->nOut>saved_nOu
16a70 74 20 29 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d  t ) pNew->nOut =
16a80 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20   saved_nOut;.   
16a90 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e           pNew->n
16aa0 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20  Out -= nIn;.    
16ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16ac0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f  }.        if( nO
16ad0 75 74 3d 3d 30 20 29 0a 23 65 6e 64 69 66 0a 20  ut==0 ).#endif. 
16ae0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
16af0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d     pNew->nOut +=
16b00 20 28 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c   (pProbe->aiRowL
16b10 6f 67 45 73 74 5b 6e 45 71 5d 20 2d 20 70 50 72  ogEst[nEq] - pPr
16b20 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
16b30 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20 20 20 20 20  [nEq-1]);.      
16b40 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57 4f      if( eOp & WO
16b50 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
16b60 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47         /* TUNING
16b70 3a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  : If there is no
16b80 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61   likelihood() va
16b90 6c 75 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74  lue, assume that
16ba0 20 61 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   a .            
16bb0 2a 2a 20 22 63 6f 6c 20 49 53 20 4e 55 4c 4c 22  ** "col IS NULL"
16bc0 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 74 63   expression matc
16bd0 68 65 73 20 74 77 69 63 65 20 61 73 20 6d 61 6e  hes twice as man
16be0 79 20 72 6f 77 73 20 0a 20 20 20 20 20 20 20 20  y rows .        
16bf0 20 20 20 20 2a 2a 20 61 73 20 28 63 6f 6c 3d 3f      ** as (col=?
16c00 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ). */.          
16c10 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
16c20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  10;.          }.
16c30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16c40 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
16c50 53 65 74 20 72 43 6f 73 74 49 64 78 20 74 6f 20  Set rCostIdx to 
16c60 74 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73 69  the cost of visi
16c70 74 69 6e 67 20 73 65 6c 65 63 74 65 64 20 72 6f  ting selected ro
16c80 77 73 20 69 6e 20 69 6e 64 65 78 2e 20 41 64 64  ws in index. Add
16c90 0a 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 70 4e  .    ** it to pN
16ca0 65 77 2d 3e 72 52 75 6e 2c 20 77 68 69 63 68 20  ew->rRun, which 
16cb0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 65 74  is currently set
16cc0 20 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20   to the cost of 
16cd0 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2a  the index.    **
16ce0 20 73 65 65 6b 20 6f 6e 6c 79 2e 20 54 68 65 6e   seek only. Then
16cf0 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 6e  , if this is a n
16d00 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  on-covering inde
16d10 78 2c 20 61 64 64 20 74 68 65 20 63 6f 73 74 20  x, add the cost 
16d20 6f 66 0a 20 20 20 20 2a 2a 20 76 69 73 69 74 69  of.    ** visiti
16d30 6e 67 20 74 68 65 20 72 6f 77 73 20 69 6e 20 74  ng the rows in t
16d40 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 20 20  he main table.  
16d50 2a 2f 0a 20 20 20 20 72 43 6f 73 74 49 64 78 20  */.    rCostIdx 
16d60 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31  = pNew->nOut + 1
16d70 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e 73   + (15*pProbe->s
16d80 7a 49 64 78 52 6f 77 29 2f 70 53 72 63 2d 3e 70  zIdxRow)/pSrc->p
16d90 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20  Tab->szTabRow;. 
16da0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
16db0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
16dc0 28 72 4c 6f 67 53 69 7a 65 2c 20 72 43 6f 73 74  (rLogSize, rCost
16dd0 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 28 70  Idx);.    if( (p
16de0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20 28  New->wsFlags & (
16df0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57  WHERE_IDX_ONLY|W
16e00 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30 20 29 7b  HERE_IPK))==0 ){
16e10 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
16e20 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  n = sqlite3LogEs
16e30 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c  tAdd(pNew->rRun,
16e40 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 36   pNew->nOut + 16
16e50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 41 70 70  );.    }.    App
16e60 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72  lyCostMultiplier
16e70 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 50 72  (pNew->rRun, pPr
16e80 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e 63 6f 73  obe->pTable->cos
16e90 74 4d 75 6c 74 29 3b 0a 0a 20 20 20 20 6e 4f 75  tMult);..    nOu
16ea0 74 55 6e 61 64 6a 75 73 74 65 64 20 3d 20 70 4e  tUnadjusted = pN
16eb0 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20 20 70 4e  ew->nOut;.    pN
16ec0 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e 49 6e 4d  ew->rRun += nInM
16ed0 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 70 4e  ul + nIn;.    pN
16ee0 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e 49 6e 4d  ew->nOut += nInM
16ef0 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20 20 77 68  ul + nIn;.    wh
16f00 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a  ereLoopOutputAdj
16f10 75 73 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 57  ust(pBuilder->pW
16f20 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b  C, pNew, rSize);
16f30 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c  .    rc = whereL
16f40 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64  oopInsert(pBuild
16f50 65 72 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20  er, pNew);..    
16f60 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67  if( pNew->wsFlag
16f70 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
16f80 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
16f90 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
16fa0 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 7d 65 6c  ed_nOut;.    }el
16fb0 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  se{.      pNew->
16fc0 6e 4f 75 74 20 3d 20 6e 4f 75 74 55 6e 61 64 6a  nOut = nOutUnadj
16fd0 75 73 74 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  usted;.    }..  
16fe0 20 20 69 66 28 20 28 70 4e 65 77 2d 3e 77 73 46    if( (pNew->wsF
16ff0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
17000 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20 20 20 20  _LIMIT)==0.     
17010 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  && pNew->u.btree
17020 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f  .nEq<pProbe->nCo
17030 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20 20 20 20  lumn.    ){.    
17040 20 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74    whereLoopAddBt
17050 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65  reeIndex(pBuilde
17060 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c  r, pSrc, pProbe,
17070 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20   nInMul+nIn);.  
17080 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f    }.    pNew->nO
17090 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b  ut = saved_nOut;
170a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
170b0 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
170c0 54 41 54 34 0a 20 20 20 20 70 42 75 69 6c 64 65  TAT4.    pBuilde
170d0 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 3d 20 6e  r->nRecValid = n
170e0 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e 64 69 66  RecValid;.#endif
170f0 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 70 72 65  .  }.  pNew->pre
17100 72 65 71 20 3d 20 73 61 76 65 64 5f 70 72 65 72  req = saved_prer
17110 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74  eq;.  pNew->u.bt
17120 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f  ree.nEq = saved_
17130 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62  nEq;.  pNew->u.b
17140 74 72 65 65 2e 6e 42 74 6d 20 3d 20 73 61 76 65  tree.nBtm = save
17150 64 5f 6e 42 74 6d 3b 0a 20 20 70 4e 65 77 2d 3e  d_nBtm;.  pNew->
17160 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 73  u.btree.nTop = s
17170 61 76 65 64 5f 6e 54 6f 70 3b 0a 20 20 70 4e 65  aved_nTop;.  pNe
17180 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64  w->nSkip = saved
17190 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65 77 2d 3e  _nSkip;.  pNew->
171a0 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f  wsFlags = saved_
171b0 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e 65 77 2d  wsFlags;.  pNew-
171c0 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
171d0 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65  ut;.  pNew->nLTe
171e0 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c 54 65 72  rm = saved_nLTer
171f0 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 69 64 65  m;..  /* Conside
17200 72 20 75 73 69 6e 67 20 61 20 73 6b 69 70 2d 73  r using a skip-s
17210 63 61 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  can if there are
17220 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
17230 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
17240 2a 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  * available for 
17250 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65  the left-most te
17260 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
17270 2c 20 61 6e 64 20 69 66 20 74 68 65 20 61 76 65  , and if the ave
17280 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  rage.  ** number
17290 20 6f 66 20 72 65 70 65 61 74 73 20 69 6e 20 74   of repeats in t
172a0 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  he left-most ter
172b0 6d 73 20 69 73 20 61 74 20 6c 65 61 73 74 20 31  ms is at least 1
172c0 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  8. .  **.  ** Th
172d0 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 20 31  e magic number 1
172e0 38 20 69 73 20 73 65 6c 65 63 74 65 64 20 6f 6e  8 is selected on
172f0 20 74 68 65 20 62 61 73 69 73 20 74 68 61 74 20   the basis that 
17300 73 63 61 6e 6e 69 6e 67 20 31 37 20 72 6f 77 73  scanning 17 rows
17310 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f 73 74 20  .  ** is almost 
17320 61 6c 77 61 79 73 20 71 75 69 63 6b 65 72 20 74  always quicker t
17330 68 61 6e 20 61 6e 20 69 6e 64 65 78 20 73 65 65  han an index see
17340 6b 20 28 65 76 65 6e 20 74 68 6f 75 67 68 20 69  k (even though i
17350 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a  f the index.  **
17360 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20   contains fewer 
17370 74 68 61 6e 20 32 5e 31 37 20 72 6f 77 73 20 77  than 2^17 rows w
17380 65 20 61 73 73 75 6d 65 20 6f 74 68 65 72 77 69  e assume otherwi
17390 73 65 20 69 6e 20 6f 74 68 65 72 20 70 61 72 74  se in other part
173a0 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f  s of.  ** the co
173b0 64 65 29 2e 20 41 6e 64 2c 20 65 76 65 6e 20 69  de). And, even i
173c0 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 69 74 20  f it is not, it 
173d0 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74 6f  should not be to
173e0 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72 2e 20 0a  o much slower. .
173f0 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65    ** On the othe
17400 72 20 68 61 6e 64 2c 20 74 68 65 20 65 78 74 72  r hand, the extr
17410 61 20 73 65 65 6b 73 20 63 6f 75 6c 64 20 65 6e  a seeks could en
17420 64 20 75 70 20 62 65 69 6e 67 20 73 69 67 6e 69  d up being signi
17430 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f  ficantly.  ** mo
17440 72 65 20 65 78 70 65 6e 73 69 76 65 2e 20 20 2a  re expensive.  *
17450 2f 0a 20 20 61 73 73 65 72 74 28 20 34 32 3d 3d  /.  assert( 42==
17460 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 38  sqlite3LogEst(18
17470 29 20 29 3b 0a 20 20 69 66 28 20 73 61 76 65 64  ) );.  if( saved
17480 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e 53 6b 69  _nEq==saved_nSki
17490 70 0a 20 20 20 26 26 20 73 61 76 65 64 5f 6e 45  p.   && saved_nE
174a0 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e 4b 65 79  q+1<pProbe->nKey
174b0 43 6f 6c 0a 20 20 20 26 26 20 70 50 72 6f 62 65  Col.   && pProbe
174c0 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d 3d 30 0a  ->noSkipScan==0.
174d0 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69     && pProbe->ai
174e0 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65 64 5f  RowLogEst[saved_
174f0 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f 2a 20 54  nEq+1]>=42  /* T
17500 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75 6d 20 66  UNING: Minimum f
17510 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a  or skip-scan */.
17520 20 20 20 26 26 20 28 72 63 20 3d 20 77 68 65 72     && (rc = wher
17530 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62 2c 20  eLoopResize(db, 
17540 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65  pNew, pNew->nLTe
17550 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54 45 5f 4f  rm+1))==SQLITE_O
17560 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f 67 45 73  K.  ){.    LogEs
17570 74 20 6e 49 74 65 72 3b 0a 20 20 20 20 70 4e 65  t nIter;.    pNe
17580 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 2b 2b  w->u.btree.nEq++
17590 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69  ;.    pNew->nSki
175a0 70 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  p++;.    pNew->a
175b0 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65  LTerm[pNew->nLTe
175c0 72 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 70  rm++] = 0;.    p
175d0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
175e0 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 3b 0a  WHERE_SKIPSCAN;.
175f0 20 20 20 20 6e 49 74 65 72 20 3d 20 70 50 72 6f      nIter = pPro
17600 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b  be->aiRowLogEst[
17610 73 61 76 65 64 5f 6e 45 71 5d 20 2d 20 70 50 72  saved_nEq] - pPr
17620 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73 74  obe->aiRowLogEst
17630 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20  [saved_nEq+1];. 
17640 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d     pNew->nOut -=
17650 20 6e 49 74 65 72 3b 0a 20 20 20 20 2f 2a 20 54   nIter;.    /* T
17660 55 4e 49 4e 47 3a 20 20 42 65 63 61 75 73 65 20  UNING:  Because 
17670 75 6e 63 65 72 74 61 69 6e 74 69 65 73 20 69 6e  uncertainties in
17680 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 66   the estimates f
17690 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20 71 75 65  or skip-scan que
176a0 72 69 65 73 2c 0a 20 20 20 20 2a 2a 20 61 64 64  ries,.    ** add
176b0 20 61 20 31 2e 33 37 35 20 66 75 64 67 65 20 66   a 1.375 fudge f
176c0 61 63 74 6f 72 20 74 6f 20 6d 61 6b 65 20 73 6b  actor to make sk
176d0 69 70 2d 73 63 61 6e 20 73 6c 69 67 68 74 6c 79  ip-scan slightly
176e0 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2e 20 2a 2f   less likely. */
176f0 0a 20 20 20 20 6e 49 74 65 72 20 2b 3d 20 35 3b  .    nIter += 5;
17700 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64  .    whereLoopAd
17710 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
17720 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
17730 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e 49 6e 4d  be, nIter + nInM
17740 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  ul);.    pNew->n
17750 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74  Out = saved_nOut
17760 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
17770 72 65 65 2e 6e 45 71 20 3d 20 73 61 76 65 64 5f  ree.nEq = saved_
17780 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  nEq;.    pNew->n
17790 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b  Skip = saved_nSk
177a0 69 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73  ip;.    pNew->ws
177b0 46 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73  Flags = saved_ws
177c0 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 57 48  Flags;.  }..  WH
177d0 45 52 45 54 52 41 43 45 28 30 78 38 30 30 2c 20  ERETRACE(0x800, 
177e0 28 22 45 4e 44 20 61 64 64 42 74 72 65 65 49 64  ("END addBtreeId
177f0 78 28 25 73 29 2c 20 6e 45 71 3d 25 64 2c 20 72  x(%s), nEq=%d, r
17800 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
17810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
17820 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 2c 20 73 61  Probe->zName, sa
17830 76 65 64 5f 6e 45 71 2c 20 72 63 29 29 3b 0a 20  ved_nEq, rc));. 
17840 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17850 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72 75 65  *.** Return True
17860 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
17870 6c 65 20 74 68 61 74 20 70 49 6e 64 65 78 20 6d  le that pIndex m
17880 69 67 68 74 20 62 65 20 75 73 65 66 75 6c 20 69  ight be useful i
17890 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  n.** implementin
178a0 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  g the ORDER BY c
178b0 6c 61 75 73 65 20 69 6e 20 70 42 75 69 6c 64 65  lause in pBuilde
178c0 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
178d0 46 61 6c 73 65 20 69 66 20 70 42 75 69 6c 64 65  False if pBuilde
178e0 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  r does not conta
178f0 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  in an ORDER BY c
17900 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74  lause or.** if t
17910 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 66  here is no way f
17920 6f 72 20 70 49 6e 64 65 78 20 74 6f 20 62 65 20  or pIndex to be 
17930 75 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d  useful in implem
17940 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f  enting that.** O
17950 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
17960 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
17970 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68  dexMightHelpWith
17980 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65  OrderBy(.  Where
17990 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
179a0 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a  ilder,.  Index *
179b0 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69 43  pIndex,.  int iC
179c0 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c  ursor.){.  ExprL
179d0 69 73 74 20 2a 70 4f 42 3b 0a 20 20 45 78 70 72  ist *pOB;.  Expr
179e0 4c 69 73 74 20 2a 61 43 6f 6c 45 78 70 72 3b 0a  List *aColExpr;.
179f0 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20    int ii, jj;.. 
17a00 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e   if( pIndex->bUn
17a10 6f 72 64 65 72 65 64 20 29 20 72 65 74 75 72 6e  ordered ) return
17a20 20 30 3b 0a 20 20 69 66 28 20 28 70 4f 42 20 3d   0;.  if( (pOB =
17a30 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
17a40 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30 20  o->pOrderBy)==0 
17a50 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f  ) return 0;.  fo
17a60 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e  r(ii=0; ii<pOB->
17a70 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
17a80 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
17a90 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
17aa0 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69  ollate(pOB->a[ii
17ab0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
17ac0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
17ad0 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
17ae0 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72  >iTable==iCursor
17af0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45   ){.      if( pE
17b00 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
17b10 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
17b20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49   for(jj=0; jj<pI
17b30 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  ndex->nKeyCol; j
17b40 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
17b50 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
17b60 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  ==pIndex->aiColu
17b70 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20  mn[jj] ) return 
17b80 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
17b90 65 6c 73 65 20 69 66 28 20 28 61 43 6f 6c 45 78  else if( (aColEx
17ba0 70 72 20 3d 20 70 49 6e 64 65 78 2d 3e 61 43 6f  pr = pIndex->aCo
17bb0 6c 45 78 70 72 29 21 3d 30 20 29 7b 0a 20 20 20  lExpr)!=0 ){.   
17bc0 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c     for(jj=0; jj<
17bd0 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  pIndex->nKeyCol;
17be0 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   jj++){.        
17bf0 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  if( pIndex->aiCo
17c00 6c 75 6d 6e 5b 6a 6a 5d 21 3d 58 4e 5f 45 58 50  lumn[jj]!=XN_EXP
17c10 52 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  R ) continue;.  
17c20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
17c30 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20  3ExprCompare(0, 
17c40 70 45 78 70 72 2c 61 43 6f 6c 45 78 70 72 2d 3e  pExpr,aColExpr->
17c50 61 5b 6a 6a 5d 2e 70 45 78 70 72 2c 69 43 75 72  a[jj].pExpr,iCur
17c60 73 6f 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  sor)==0 ){.     
17c70 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
17c80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
17c90 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
17ca0 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
17cb0 52 65 74 75 72 6e 20 61 20 62 69 74 6d 61 73 6b  Return a bitmask
17cc0 20 77 68 65 72 65 20 31 73 20 69 6e 64 69 63 61   where 1s indica
17cd0 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 72 72  te that the corr
17ce0 65 73 70 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e  esponding column
17cf0 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
17d00 20 69 73 20 75 73 65 64 20 62 79 20 61 6e 20 69   is used by an i
17d10 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20  ndex.  Only the 
17d20 66 69 72 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73  first 63 columns
17d30 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 2e   are considered.
17d40 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61  .*/.static Bitma
17d50 73 6b 20 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65  sk columnsInInde
17d60 78 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  x(Index *pIdx){.
17d70 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b    Bitmask m = 0;
17d80 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28  .  int j;.  for(
17d90 6a 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d  j=pIdx->nColumn-
17da0 31 3b 20 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20  1; j>=0; j--){. 
17db0 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d     int x = pIdx-
17dc0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
17dd0 20 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20    if( x>=0 ){.  
17de0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d      testcase( x=
17df0 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
17e00 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d 53  testcase( x==BMS
17e10 2d 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  -2 );.      if( 
17e20 78 3c 42 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d  x<BMS-1 ) m |= M
17e30 41 53 4b 42 49 54 28 78 29 3b 0a 20 20 20 20 7d  ASKBIT(x);.    }
17e40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b  .  }.  return m;
17e50 0a 7d 0a 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20  .}../* Check to 
17e60 73 65 65 20 69 66 20 61 20 70 61 72 74 69 61 6c  see if a partial
17e70 20 69 6e 64 65 78 20 77 69 74 68 20 70 50 61 72   index with pPar
17e80 74 49 6e 64 65 78 57 68 65 72 65 20 63 61 6e 20  tIndexWhere can 
17e90 62 65 20 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68  be used.** in th
17ea0 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 2e  e current query.
17eb0 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
17ec0 20 69 74 20 63 61 6e 20 62 65 20 61 6e 64 20 66   it can be and f
17ed0 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  alse if not..*/.
17ee0 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
17ef0 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64  UsablePartialInd
17f00 65 78 28 69 6e 74 20 69 54 61 62 2c 20 57 68 65  ex(int iTab, Whe
17f10 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45  reClause *pWC, E
17f20 78 70 72 20 2a 70 57 68 65 72 65 29 7b 0a 20 20  xpr *pWhere){.  
17f30 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65  int i;.  WhereTe
17f40 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 50 61 72  rm *pTerm;.  Par
17f50 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43  se *pParse = pWC
17f60 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  ->pWInfo->pParse
17f70 3b 0a 20 20 77 68 69 6c 65 28 20 70 57 68 65 72  ;.  while( pWher
17f80 65 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b  e->op==TK_AND ){
17f90 0a 20 20 20 20 69 66 28 20 21 77 68 65 72 65 55  .    if( !whereU
17fa0 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65  sablePartialInde
17fb0 78 28 69 54 61 62 2c 70 57 43 2c 70 57 68 65 72  x(iTab,pWC,pWher
17fc0 65 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75  e->pLeft) ) retu
17fd0 72 6e 20 30 3b 0a 20 20 20 20 70 57 68 65 72 65  rn 0;.    pWhere
17fe0 20 3d 20 70 57 68 65 72 65 2d 3e 70 52 69 67 68   = pWhere->pRigh
17ff0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  t;.  }.  if( pPa
18000 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26  rse->db->flags &
18010 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50   SQLITE_EnableQP
18020 53 47 20 29 20 70 50 61 72 73 65 20 3d 20 30 3b  SG ) pParse = 0;
18030 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 65 72  .  for(i=0, pTer
18040 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
18050 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
18060 72 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  rm++){.    Expr 
18070 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
18080 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 28  pExpr;.    if( (
18090 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
180a0 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
180b0 6f 69 6e 29 20 7c 7c 20 70 45 78 70 72 2d 3e 69  oin) || pExpr->i
180c0 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d  RightJoinTable==
180d0 69 54 61 62 29 0a 20 20 20 20 20 26 26 20 73 71  iTab).     && sq
180e0 6c 69 74 65 33 45 78 70 72 49 6d 70 6c 69 65 73  lite3ExprImplies
180f0 45 78 70 72 28 70 50 61 72 73 65 2c 20 70 45 78  Expr(pParse, pEx
18100 70 72 2c 20 70 57 68 65 72 65 2c 20 69 54 61 62  pr, pWhere, iTab
18110 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
18120 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
18130 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
18140 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  }../*.** Add all
18150 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
18160 74 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ts for a single 
18170 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69  table of the joi
18180 6e 20 77 68 65 72 65 20 74 68 65 20 74 61 62 6c  n where the tabl
18190 65 0a 2a 2a 20 69 73 20 69 64 65 6e 74 69 66 69  e.** is identifi
181a0 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e  ed by pBuilder->
181b0 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54 68 61  pNew->iTab.  Tha
181c0 74 20 74 61 62 6c 65 20 69 73 20 67 75 61 72 61  t table is guara
181d0 6e 74 65 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61  nteed to be.** a
181e0 20 62 2d 74 72 65 65 20 74 61 62 6c 65 2c 20 6e   b-tree table, n
181f0 6f 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62  ot a virtual tab
18200 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  le..**.** The co
18210 73 74 73 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72  sts (WhereLoop.r
18220 52 75 6e 29 20 6f 66 20 74 68 65 20 62 2d 74 72  Run) of the b-tr
18230 65 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 62  ee loops added b
18240 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  y this function.
18250 2a 2a 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65  ** are calculate
18260 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
18270 0a 2a 2a 20 46 6f 72 20 61 20 66 75 6c 6c 20 73  .** For a full s
18280 63 61 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74 68  can, assuming th
18290 65 20 74 61 62 6c 65 20 28 6f 72 20 69 6e 64 65  e table (or inde
182a0 78 29 20 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77  x) contains nRow
182b0 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   rows:.**.**    
182c0 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33   cost = nRow * 3
182d0 2e 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .0              
182e0 20 20 20 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61        // full-ta
182f0 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20  ble scan.**     
18300 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20  cost = nRow * K 
18310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18320 20 20 20 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20       // scan of 
18330 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
18340 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f  *     cost = nRo
18350 77 20 2a 20 28 4b 2b 33 2e 30 29 20 20 20 20 20  w * (K+3.0)     
18360 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63             // sc
18370 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69  an of non-coveri
18380 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77  ng index.**.** w
18390 68 65 72 65 20 4b 20 69 73 20 61 20 76 61 6c 75  here K is a valu
183a0 65 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61 6e  e between 1.1 an
183b0 64 20 33 2e 30 20 73 65 74 20 62 61 73 65 64 20  d 3.0 set based 
183c0 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  on the relative 
183d0 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20 61 76  .** estimated av
183e0 65 72 61 67 65 20 73 69 7a 65 20 6f 66 20 74 68  erage size of th
183f0 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c  e index and tabl
18400 65 20 72 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a  e records..**.**
18410 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 63   For an index sc
18420 61 6e 2c 20 77 68 65 72 65 20 6e 56 69 73 69 74  an, where nVisit
18430 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
18440 66 20 69 6e 64 65 78 20 72 6f 77 73 20 76 69 73  f index rows vis
18450 69 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73  ited.** by the s
18460 63 61 6e 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69  can, and nSeek i
18470 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
18480 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20  seek operations 
18490 72 65 71 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20  required on .** 
184a0 74 68 65 20 69 6e 64 65 78 20 62 2d 74 72 65 65  the index b-tree
184b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74  :.**.**     cost
184c0 20 3d 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28   = nSeek * (log(
184d0 6e 52 6f 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73  nRow) + K * nVis
184e0 69 74 29 20 20 20 20 20 20 20 20 20 20 2f 2f 20  it)          // 
184f0 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a  covering index.*
18500 2a 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 53 65  *     cost = nSe
18510 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20  ek * (log(nRow) 
18520 2b 20 28 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73  + (K+3.0) * nVis
18530 69 74 29 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f  it)    // non-co
18540 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a  vering index.**.
18550 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65  ** Normally, nSe
18560 65 6b 20 69 73 20 31 2e 20 6e 53 65 65 6b 20 76  ek is 1. nSeek v
18570 61 6c 75 65 73 20 67 72 65 61 74 65 72 20 74 68  alues greater th
18580 61 6e 20 31 20 63 6f 6d 65 20 61 62 6f 75 74 20  an 1 come about 
18590 69 66 20 74 68 65 20 0a 2a 2a 20 57 48 45 52 45  if the .** WHERE
185a0 20 63 6c 61 75 73 65 20 69 6e 63 6c 75 64 65 73   clause includes
185b0 20 22 78 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74   "x IN (....)" t
185c0 65 72 6d 73 20 75 73 65 64 20 69 6e 20 70 6c 61  erms used in pla
185d0 63 65 20 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20  ce of "x=?". Or 
185e0 77 68 65 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69  when .** implici
185f0 74 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  t "x IN (SELECT 
18600 78 20 46 52 4f 4d 20 74 62 6c 29 22 20 74 65 72  x FROM tbl)" ter
18610 6d 73 20 61 72 65 20 61 64 64 65 64 20 66 6f 72  ms are added for
18620 20 73 6b 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a   skip-scans..**.
18630 2a 2a 20 54 68 65 20 65 73 74 69 6d 61 74 65 64  ** The estimated
18640 20 76 61 6c 75 65 73 20 28 6e 52 6f 77 2c 20 6e   values (nRow, n
18650 56 69 73 69 74 2c 20 6e 53 65 65 6b 29 20 6f 66  Visit, nSeek) of
18660 74 65 6e 20 63 6f 6e 74 61 69 6e 20 61 20 6c 61  ten contain a la
18670 72 67 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66  rge amount.** of
18680 20 75 6e 63 65 72 74 61 69 6e 74 79 2e 20 20 46   uncertainty.  F
18690 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
186a0 73 63 6f 72 69 6e 67 20 69 73 20 64 65 73 69 67  scoring is desig
186b0 6e 65 64 20 74 6f 20 70 69 63 6b 20 70 6c 61 6e  ned to pick plan
186c0 73 20 74 68 61 74 0a 2a 2a 20 22 64 6f 20 74 68  s that.** "do th
186d0 65 20 6c 65 61 73 74 20 68 61 72 6d 22 20 69 66  e least harm" if
186e0 20 74 68 65 20 65 73 74 69 6d 61 74 65 73 20 61   the estimates a
186f0 72 65 20 69 6e 61 63 63 75 72 61 74 65 2e 20 20  re inaccurate.  
18700 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 0a 2a  For example, a.*
18710 2a 20 6c 6f 67 28 6e 52 6f 77 29 20 66 61 63 74  * log(nRow) fact
18720 6f 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72  or is omitted fr
18730 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e  om a non-coverin
18740 67 20 69 6e 64 65 78 20 73 63 61 6e 20 69 6e 20  g index scan in 
18750 6f 72 64 65 72 20 74 6f 0a 2a 2a 20 62 69 61 73  order to.** bias
18760 20 74 68 65 20 73 63 6f 72 69 6e 67 20 69 6e 20   the scoring in 
18770 66 61 76 6f 72 20 6f 66 20 75 73 69 6e 67 20 61  favor of using a
18780 6e 20 69 6e 64 65 78 2c 20 73 69 6e 63 65 20 74  n index, since t
18790 68 65 20 77 6f 72 73 74 2d 63 61 73 65 0a 2a 2a  he worst-case.**
187a0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20   performance of 
187b0 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 69  using an index i
187c0 73 20 66 61 72 20 62 65 74 74 65 72 20 74 68 61  s far better tha
187d0 6e 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73 65  n the worst-case
187e0 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
187f0 6f 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20  of a full table 
18800 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  scan..*/.static 
18810 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
18820 42 74 72 65 65 28 0a 20 20 57 68 65 72 65 4c 6f  Btree(.  WhereLo
18830 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
18840 64 65 72 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c  der, /* WHERE cl
18850 61 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ause information
18860 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50   */.  Bitmask mP
18870 72 65 72 65 71 20 20 20 20 20 20 20 20 20 20 20  rereq           
18880 20 20 2f 2a 20 45 78 74 72 61 20 70 72 65 72 65    /* Extra prere
18890 71 75 65 73 69 74 65 73 20 66 6f 72 20 75 73 69  quesites for usi
188a0 6e 67 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  ng this table */
188b0 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  .){.  WhereInfo 
188c0 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20  *pWInfo;        
188d0 20 20 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79    /* WHERE analy
188e0 73 69 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  sis context */. 
188f0 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20   Index *pProbe; 
18900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18910 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20  An index we are 
18920 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20  evaluating */.  
18930 49 6e 64 65 78 20 73 50 6b 3b 20 20 20 20 20 20  Index sPk;      
18940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
18950 20 66 61 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65   fake index obje
18960 63 74 20 66 6f 72 20 74 68 65 20 70 72 69 6d 61  ct for the prima
18970 72 79 20 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45  ry key */.  LogE
18980 73 74 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d  st aiRowEstPk[2]
18990 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61  ;       /* The a
189a0 69 52 6f 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c  iRowLogEst[] val
189b0 75 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69  ue for the sPk i
189c0 6e 64 65 78 20 2a 2f 0a 20 20 69 31 36 20 61 69  ndex */.  i16 ai
189d0 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20  ColumnPk = -1;  
189e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 43 6f        /* The aCo
189f0 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72  lumn[] value for
18a00 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
18a10 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
18a20 62 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  bList;          
18a30 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
18a40 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
18a50 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
18a60 63 3b 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c;  /* The FROM 
18a70 63 6c 61 75 73 65 20 62 74 72 65 65 20 74 65 72  clause btree ter
18a80 6d 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68  m to add */.  Wh
18a90 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20  ereLoop *pNew;  
18aa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
18ab0 70 6c 61 74 65 20 57 68 65 72 65 4c 6f 6f 70 20  plate WhereLoop 
18ac0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
18ad0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
18ae0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
18af0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
18b00 69 53 6f 72 74 49 64 78 20 3d 20 31 3b 20 20 20  iSortIdx = 1;   
18b10 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
18b20 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
18b30 20 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   b;             
18b40 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6f           /* A bo
18b50 6f 6c 65 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  olean value */. 
18b60 20 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20   LogEst rSize;  
18b70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18b80 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
18b90 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  n the table */. 
18ba0 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65   LogEst rLogSize
18bb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
18bc0 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  Logarithm of the
18bd0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
18be0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  in the table */.
18bf0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
18c00 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC;           /*
18c10 20 54 68 65 20 70 61 72 73 65 64 20 57 48 45 52   The parsed WHER
18c20 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61  E clause */.  Ta
18c30 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20  ble *pTab;      
18c40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
18c50 6c 65 20 62 65 69 6e 67 20 71 75 65 72 69 65 64  le being queried
18c60 20 2a 2f 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20   */.  .  pNew = 
18c70 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
18c80 20 20 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c    pWInfo = pBuil
18c90 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70  der->pWInfo;.  p
18ca0 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
18cb0 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 53  ->pTabList;.  pS
18cc0 72 63 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  rc = pTabList->a
18cd0 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20   + pNew->iTab;. 
18ce0 20 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54   pTab = pSrc->pT
18cf0 61 62 3b 0a 20 20 70 57 43 20 3d 20 70 42 75 69  ab;.  pWC = pBui
18d00 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73  lder->pWC;.  ass
18d10 65 72 74 28 20 21 49 73 56 69 72 74 75 61 6c 28  ert( !IsVirtual(
18d20 70 53 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a  pSrc->pTab) );..
18d30 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 42 49    if( pSrc->pIBI
18d40 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41  ndex ){.    /* A
18d50 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
18d60 75 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20  use specifies a 
18d70 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
18d80 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70   to use */.    p
18d90 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 49  Probe = pSrc->pI
18da0 42 49 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20  BIndex;.  }else 
18db0 69 66 28 20 21 48 61 73 52 6f 77 69 64 28 70 54  if( !HasRowid(pT
18dc0 61 62 29 20 29 7b 0a 20 20 20 20 70 50 72 6f 62  ab) ){.    pProb
18dd0 65 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78  e = pTab->pIndex
18de0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
18df0 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e  * There is no IN
18e00 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e  DEXED BY clause.
18e10 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20    Create a fake 
18e20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20  Index object in 
18e30 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72  local.    ** var
18e40 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70  iable sPk to rep
18e50 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64  resent the rowid
18e60 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
18e70 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20  ex.  Make this. 
18e80 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78     ** fake index
18e90 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20   the first in a 
18ea0 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f  chain of Index o
18eb0 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20  bjects with all 
18ec0 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20  of the real.    
18ed0 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f  ** indices to fo
18ee0 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65  llow */.    Inde
18ef0 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  x *pFirst;      
18f00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
18f10 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64  irst of real ind
18f20 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
18f30 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  e */.    memset(
18f40 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sPk, 0, sizeof(
18f50 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b  Index));.    sPk
18f60 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20  .nKeyCol = 1;.  
18f70 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20    sPk.nColumn = 
18f80 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c  1;.    sPk.aiCol
18f90 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50  umn = &aiColumnP
18fa0 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77  k;.    sPk.aiRow
18fb0 4c 6f 67 45 73 74 20 3d 20 61 69 52 6f 77 45 73  LogEst = aiRowEs
18fc0 74 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45  tPk;.    sPk.onE
18fd0 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63  rror = OE_Replac
18fe0 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c  e;.    sPk.pTabl
18ff0 65 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 73 50  e = pTab;.    sP
19000 6b 2e 73 7a 49 64 78 52 6f 77 20 3d 20 70 54 61  k.szIdxRow = pTa
19010 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20  b->szTabRow;.   
19020 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d   aiRowEstPk[0] =
19030 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73   pTab->nRowLogEs
19040 74 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50  t;.    aiRowEstP
19050 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46  k[1] = 0;.    pF
19060 69 72 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61  irst = pSrc->pTa
19070 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  b->pIndex;.    i
19080 66 28 20 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49  f( pSrc->fg.notI
19090 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20  ndexed==0 ){.   
190a0 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20 69     /* The real i
190b0 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74 61  ndices of the ta
190c0 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e  ble are only con
190d0 73 69 64 65 72 65 64 20 69 66 20 74 68 65 0a 20  sidered if the. 
190e0 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45       ** NOT INDE
190f0 58 45 44 20 71 75 61 6c 69 66 69 65 72 20 69 73  XED qualifier is
19100 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68   omitted from th
19110 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
19120 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78 74  .      sPk.pNext
19130 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20 7d   = pFirst;.    }
19140 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26 73  .    pProbe = &s
19150 50 6b 3b 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20  Pk;.  }.  rSize 
19160 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45  = pTab->nRowLogE
19170 73 74 3b 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d  st;.  rLogSize =
19180 20 65 73 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a   estLog(rSize);.
19190 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
191a0 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  OMIT_AUTOMATIC_I
191b0 4e 44 45 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61  NDEX.  /* Automa
191c0 74 69 63 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20  tic indexes */. 
191d0 20 69 66 28 20 21 70 42 75 69 6c 64 65 72 2d 3e   if( !pBuilder->
191e0 70 4f 72 53 65 74 20 20 20 20 20 20 2f 2a 20 4e  pOrSet      /* N
191f0 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 20 4f 52  ot part of an OR
19200 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f   optimization */
19210 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e  .   && (pWInfo->
19220 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
19230 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29  RE_OR_SUBCLAUSE)
19240 3d 3d 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66  ==0.   && (pWInf
19250 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  o->pParse->db->f
19260 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75  lags & SQLITE_Au
19270 74 6f 49 6e 64 65 78 29 21 3d 30 0a 20 20 20 26  toIndex)!=0.   &
19280 26 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65 78  & pSrc->pIBIndex
19290 3d 3d 30 20 20 20 20 20 20 2f 2a 20 48 61 73 20  ==0      /* Has 
192a0 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  no INDEXED BY cl
192b0 61 75 73 65 20 2a 2f 0a 20 20 20 26 26 20 21 70  ause */.   && !p
192c0 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78  Src->fg.notIndex
192d0 65 64 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4e  ed   /* Has no N
192e0 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
192f0 65 20 2a 2f 0a 20 20 20 26 26 20 48 61 73 52 6f  e */.   && HasRo
19300 77 69 64 28 70 54 61 62 29 20 20 20 20 20 20 20  wid(pTab)       
19310 20 20 2f 2a 20 4e 6f 74 20 57 49 54 48 4f 55 54    /* Not WITHOUT
19320 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 28 46   ROWID table. (F
19330 49 58 4d 45 3a 20 57 68 79 20 6e 6f 74 3f 29 20  IXME: Why not?) 
19340 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d 3e  */.   && !pSrc->
19350 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 20  fg.isCorrelated 
19360 2f 2a 20 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61  /* Not a correla
19370 74 65 64 20 73 75 62 71 75 65 72 79 20 2a 2f 0a  ted subquery */.
19380 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e     && !pSrc->fg.
19390 69 73 52 65 63 75 72 73 69 76 65 20 20 2f 2a 20  isRecursive  /* 
193a0 4e 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20  Not a recursive 
193b0 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70  common table exp
193c0 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 29 7b  ression. */.  ){
193d0 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
193e0 20 61 75 74 6f 2d 69 6e 64 65 78 20 57 68 65 72   auto-index Wher
193f0 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68  eLoops */.    Wh
19400 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
19410 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
19420 57 43 45 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b  WCEnd = pWC->a +
19430 20 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20   pWC->nTerm;.   
19440 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
19450 61 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  a; rc==SQLITE_OK
19460 20 26 26 20 70 54 65 72 6d 3c 70 57 43 45 6e 64   && pTerm<pWCEnd
19470 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  ; pTerm++){.    
19480 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65    if( pTerm->pre
19490 72 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d  reqRight & pNew-
194a0 3e 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74  >maskSelf ) cont
194b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
194c0 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
194d0 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 30  x(pTerm, pSrc, 0
194e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  ) ){.        pNe
194f0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  w->u.btree.nEq =
19500 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   1;.        pNew
19510 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20  ->nSkip = 0;.   
19520 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72       pNew->u.btr
19530 65 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20  ee.pIndex = 0;. 
19540 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54         pNew->nLT
19550 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
19560 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d   pNew->aLTerm[0]
19570 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
19580 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65    /* TUNING: One
19590 2d 74 69 6d 65 20 63 6f 73 74 20 66 6f 72 20 63  -time cost for c
195a0 6f 6d 70 75 74 69 6e 67 20 74 68 65 20 61 75 74  omputing the aut
195b0 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 73 0a  omatic index is.
195c0 20 20 20 20 20 20 20 20 2a 2a 20 65 73 74 69 6d          ** estim
195d0 61 74 65 64 20 74 6f 20 62 65 20 58 2a 4e 2a 6c  ated to be X*N*l
195e0 6f 67 32 28 4e 29 20 77 68 65 72 65 20 4e 20 69  og2(N) where N i
195f0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
19600 72 6f 77 73 20 69 6e 0a 20 20 20 20 20 20 20 20  rows in.        
19610 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  ** the table bei
19620 6e 67 20 69 6e 64 65 78 65 64 20 61 6e 64 20 77  ng indexed and w
19630 68 65 72 65 20 58 20 69 73 20 37 20 28 4c 6f 67  here X is 7 (Log
19640 45 73 74 3d 32 38 29 20 66 6f 72 20 6e 6f 72 6d  Est=28) for norm
19650 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  al.        ** ta
19660 62 6c 65 73 20 6f 72 20 31 2e 33 37 35 20 28 4c  bles or 1.375 (L
19670 6f 67 45 73 74 3d 34 29 20 66 6f 72 20 76 69 65  ogEst=4) for vie
19680 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
19690 73 2e 20 20 54 68 65 20 76 61 6c 75 65 0a 20 20  s.  The value.  
196a0 20 20 20 20 20 20 2a 2a 20 6f 66 20 58 20 69 73        ** of X is
196b0 20 73 6d 61 6c 6c 65 72 20 66 6f 72 20 76 69 65   smaller for vie
196c0 77 73 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  ws and subquerie
196d0 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 71 75  s so that the qu
196e0 65 72 79 20 70 6c 61 6e 6e 65 72 0a 20 20 20 20  ery planner.    
196f0 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6d      ** will be m
19700 6f 72 65 20 61 67 67 72 65 73 73 69 76 65 20 61  ore aggressive a
19710 62 6f 75 74 20 67 65 6e 65 72 61 74 69 6e 67 20  bout generating 
19720 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65  automatic indexe
19730 73 20 66 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a  s for.        **
19740 20 74 68 6f 73 65 20 6f 62 6a 65 63 74 73 2c 20   those objects, 
19750 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 20 6e  since there is n
19760 6f 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  o opportunity to
19770 20 61 64 64 20 73 63 68 65 6d 61 0a 20 20 20 20   add schema.    
19780 20 20 20 20 2a 2a 20 69 6e 64 65 78 65 73 20 6f      ** indexes o
19790 6e 20 73 75 62 71 75 65 72 69 65 73 20 61 6e 64  n subqueries and
197a0 20 76 69 65 77 73 2e 20 2a 2f 0a 20 20 20 20 20   views. */.     
197b0 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20     pNew->rSetup 
197c0 3d 20 72 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69  = rLogSize + rSi
197d0 7a 65 20 2b 20 34 3b 0a 20 20 20 20 20 20 20 20  ze + 4;.        
197e0 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
197f0 74 3d 3d 30 20 26 26 20 28 70 54 61 62 2d 3e 74  t==0 && (pTab->t
19800 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
19810 65 6d 65 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20  emeral)==0 ){.  
19820 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53          pNew->rS
19830 65 74 75 70 20 2b 3d 20 32 34 3b 0a 20 20 20 20  etup += 24;.    
19840 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70      }.        Ap
19850 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65  plyCostMultiplie
19860 72 28 70 4e 65 77 2d 3e 72 53 65 74 75 70 2c 20  r(pNew->rSetup, 
19870 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b  pTab->costMult);
19880 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
19890 77 2d 3e 72 53 65 74 75 70 3c 30 20 29 20 70 4e  w->rSetup<0 ) pN
198a0 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
198b0 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
198c0 47 3a 20 45 61 63 68 20 69 6e 64 65 78 20 6c 6f  G: Each index lo
198d0 6f 6b 75 70 20 79 69 65 6c 64 73 20 32 30 20 72  okup yields 20 r
198e0 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
198f0 2e 20 20 54 68 69 73 0a 20 20 20 20 20 20 20 20  .  This.        
19900 2a 2a 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20  ** is more than 
19910 74 68 65 20 75 73 75 61 6c 20 67 75 65 73 73 20  the usual guess 
19920 6f 66 20 31 30 20 72 6f 77 73 2c 20 73 69 6e 63  of 10 rows, sinc
19930 65 20 77 65 20 68 61 76 65 20 6e 6f 20 77 61 79  e we have no way
19940 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 6b  .        ** of k
19950 6e 6f 77 69 6e 67 20 68 6f 77 20 73 65 6c 65 63  nowing how selec
19960 74 69 76 65 20 74 68 65 20 69 6e 64 65 78 20 77  tive the index w
19970 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62  ill ultimately b
19980 65 2e 20 20 49 74 20 77 6f 75 6c 64 0a 20 20 20  e.  It would.   
19990 20 20 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75       ** not be u
199a0 6e 72 65 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d  nreasonable to m
199b0 61 6b 65 20 74 68 69 73 20 76 61 6c 75 65 20 6d  ake this value m
199c0 75 63 68 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20  uch larger. */. 
199d0 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
199e0 74 20 3d 20 34 33 3b 20 20 61 73 73 65 72 74 28  t = 43;  assert(
199f0 20 34 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   43==sqlite3LogE
19a00 73 74 28 32 30 29 20 29 3b 0a 20 20 20 20 20 20  st(20) );.      
19a10 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73    pNew->rRun = s
19a20 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28  qlite3LogEstAdd(
19a30 72 4c 6f 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e  rLogSize,pNew->n
19a40 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  Out);.        pN
19a50 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
19a60 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a  ERE_AUTO_INDEX;.
19a70 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 72          pNew->pr
19a80 65 72 65 71 20 3d 20 6d 50 72 65 72 65 71 20 7c  ereq = mPrereq |
19a90 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
19aa0 67 68 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ght;.        rc 
19ab0 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
19ac0 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
19ad0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
19ae0 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
19af0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
19b00 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20  ATIC_INDEX */.. 
19b10 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c   /* Loop over al
19b20 6c 20 69 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20  l indices.  */. 
19b30 20 66 6f 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54   for(; rc==SQLIT
19b40 45 5f 4f 4b 20 26 26 20 70 50 72 6f 62 65 3b 20  E_OK && pProbe; 
19b50 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70  pProbe=pProbe->p
19b60 4e 65 78 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b  Next, iSortIdx++
19b70 29 7b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62  ){.    if( pProb
19b80 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  e->pPartIdxWhere
19b90 21 3d 30 0a 20 20 20 20 20 26 26 20 21 77 68 65  !=0.     && !whe
19ba0 72 65 55 73 61 62 6c 65 50 61 72 74 69 61 6c 49  reUsablePartialI
19bb0 6e 64 65 78 28 70 53 72 63 2d 3e 69 43 75 72 73  ndex(pSrc->iCurs
19bc0 6f 72 2c 20 70 57 43 2c 20 70 50 72 6f 62 65 2d  or, pWC, pProbe-
19bd0 3e 70 50 61 72 74 49 64 78 57 68 65 72 65 29 20  >pPartIdxWhere) 
19be0 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
19bf0 65 28 20 70 4e 65 77 2d 3e 69 54 61 62 21 3d 70  e( pNew->iTab!=p
19c00 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 3b 20  Src->iCursor ); 
19c10 20 2f 2a 20 53 65 65 20 74 69 63 6b 65 74 20 5b   /* See ticket [
19c20 39 38 64 39 37 33 62 38 66 35 5d 20 2a 2f 0a 20  98d973b8f5] */. 
19c30 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
19c40 2f 2a 20 50 61 72 74 69 61 6c 20 69 6e 64 65 78  /* Partial index
19c50 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 20 66   inappropriate f
19c60 6f 72 20 74 68 69 73 20 71 75 65 72 79 20 2a 2f  or this query */
19c70 0a 20 20 20 20 7d 0a 20 20 20 20 72 53 69 7a 65  .    }.    rSize
19c80 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
19c90 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 20 20 70  LogEst[0];.    p
19ca0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
19cb0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
19cc0 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20 3d 20 30  u.btree.nBtm = 0
19cd0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74  ;.    pNew->u.bt
19ce0 72 65 65 2e 6e 54 6f 70 20 3d 20 30 3b 0a 20 20  ree.nTop = 0;.  
19cf0 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20    pNew->nSkip = 
19d00 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  0;.    pNew->nLT
19d10 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65  erm = 0;.    pNe
19d20 77 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b  w->iSortIdx = 0;
19d30 0a 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75  .    pNew->rSetu
19d40 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  p = 0;.    pNew-
19d50 3e 70 72 65 72 65 71 20 3d 20 6d 50 72 65 72 65  >prereq = mPrere
19d60 71 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75  q;.    pNew->nOu
19d70 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 70  t = rSize;.    p
19d80 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  New->u.btree.pIn
19d90 64 65 78 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20  dex = pProbe;.  
19da0 20 20 62 20 3d 20 69 6e 64 65 78 4d 69 67 68 74    b = indexMight
19db0 48 65 6c 70 57 69 74 68 4f 72 64 65 72 42 79 28  HelpWithOrderBy(
19dc0 70 42 75 69 6c 64 65 72 2c 20 70 50 72 6f 62 65  pBuilder, pProbe
19dd0 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29  , pSrc->iCursor)
19de0 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 45  ;.    /* The ONE
19df0 50 41 53 53 5f 44 45 53 49 52 45 44 20 66 6c 61  PASS_DESIRED fla
19e00 67 73 20 6e 65 76 65 72 20 6f 63 63 75 72 73 20  gs never occurs 
19e10 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 4f 52  together with OR
19e20 44 45 52 20 42 59 20 2a 2f 0a 20 20 20 20 61 73  DER BY */.    as
19e30 73 65 72 74 28 20 28 70 57 49 6e 66 6f 2d 3e 77  sert( (pWInfo->w
19e40 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
19e50 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
19e60 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d 30 20 29 3b  D)==0 || b==0 );
19e70 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d  .    if( pProbe-
19e80 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a 20 20 20 20  >tnum<=0 ){.    
19e90 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 70 72 69    /* Integer pri
19ea0 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 20 2a  mary key index *
19eb0 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  /.      pNew->ws
19ec0 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 49 50  Flags = WHERE_IP
19ed0 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c  K;..      /* Ful
19ee0 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a  l table scan */.
19ef0 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72        pNew->iSor
19f00 74 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74  tIdx = b ? iSort
19f10 49 64 78 20 3a 20 30 3b 0a 20 20 20 20 20 20 2f  Idx : 0;.      /
19f20 2a 20 54 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f  * TUNING: Cost o
19f30 66 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  f full table sca
19f40 6e 20 69 73 20 28 4e 2a 33 2e 30 29 2e 20 2a 2f  n is (N*3.0). */
19f50 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75  .      pNew->rRu
19f60 6e 20 3d 20 72 53 69 7a 65 20 2b 20 31 36 3b 0a  n = rSize + 16;.
19f70 20 20 20 20 20 20 41 70 70 6c 79 43 6f 73 74 4d        ApplyCostM
19f80 75 6c 74 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e  ultiplier(pNew->
19f90 72 52 75 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74  rRun, pTab->cost
19fa0 4d 75 6c 74 29 3b 0a 20 20 20 20 20 20 77 68 65  Mult);.      whe
19fb0 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
19fc0 73 74 28 70 57 43 2c 20 70 4e 65 77 2c 20 72 53  st(pWC, pNew, rS
19fd0 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ize);.      rc =
19fe0 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74   whereLoopInsert
19ff0 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29  (pBuilder, pNew)
1a000 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f  ;.      pNew->nO
1a010 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20  ut = rSize;.    
1a020 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
1a030 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a040 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 0a 20 20     Bitmask m;.  
1a050 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
1a060 69 73 43 6f 76 65 72 69 6e 67 20 29 7b 0a 20 20  isCovering ){.  
1a070 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
1a080 61 67 73 20 3d 20 57 48 45 52 45 5f 49 44 58 5f  ags = WHERE_IDX_
1a090 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44  ONLY | WHERE_IND
1a0a0 45 58 45 44 3b 0a 20 20 20 20 20 20 20 20 6d 20  EXED;.        m 
1a0b0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
1a0c0 7b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 70 53  {.        m = pS
1a0d0 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63  rc->colUsed & ~c
1a0e0 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 70 50  olumnsInIndex(pP
1a0f0 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 20 20 70  robe);.        p
1a100 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28  New->wsFlags = (
1a110 6d 3d 3d 30 29 20 3f 20 28 57 48 45 52 45 5f 49  m==0) ? (WHERE_I
1a120 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e  DX_ONLY|WHERE_IN
1a130 44 45 58 45 44 29 20 3a 20 57 48 45 52 45 5f 49  DEXED) : WHERE_I
1a140 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 7d 0a  NDEXED;.      }.
1a150 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 73  .      /* Full s
1a160 63 61 6e 20 76 69 61 20 69 6e 64 65 78 20 2a 2f  can via index */
1a170 0a 20 20 20 20 20 20 69 66 28 20 62 0a 20 20 20  .      if( b.   
1a180 20 20 20 20 7c 7c 20 21 48 61 73 52 6f 77 69 64      || !HasRowid
1a190 28 70 54 61 62 29 0a 20 20 20 20 20 20 20 7c 7c  (pTab).       ||
1a1a0 20 70 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64   pProbe->pPartId
1a1b0 78 57 68 65 72 65 21 3d 30 0a 20 20 20 20 20 20  xWhere!=0.      
1a1c0 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20   || ( m==0.     
1a1d0 20 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 62      && pProbe->b
1a1e0 55 6e 6f 72 64 65 72 65 64 3d 3d 30 0a 20 20 20  Unordered==0.   
1a1f0 20 20 20 20 20 20 26 26 20 28 70 50 72 6f 62 65        && (pProbe
1a200 2d 3e 73 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d  ->szIdxRow<pTab-
1a210 3e 73 7a 54 61 62 52 6f 77 29 0a 20 20 20 20 20  >szTabRow).     
1a220 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
1a230 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1a240 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52  RE_ONEPASS_DESIR
1a250 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ED)==0.         
1a260 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
1a270 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73 0a 20  Config.bUseCis. 
1a280 20 20 20 20 20 20 20 20 26 26 20 4f 70 74 69 6d          && Optim
1a290 69 7a 61 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70  izationEnabled(p
1a2a0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
1a2b0 62 2c 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49  b, SQLITE_CoverI
1a2c0 64 78 53 63 61 6e 29 0a 20 20 20 20 20 20 20 20  dxScan).        
1a2d0 20 20 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20    ).      ){.   
1a2e0 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74       pNew->iSort
1a2f0 49 64 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49  Idx = b ? iSortI
1a300 64 78 20 3a 20 30 3b 0a 0a 20 20 20 20 20 20 20  dx : 0;..       
1a310 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20   /* The cost of 
1a320 76 69 73 69 74 69 6e 67 20 74 68 65 20 69 6e 64  visiting the ind
1a330 65 78 20 72 6f 77 73 20 69 73 20 4e 2a 4b 2c 20  ex rows is N*K, 
1a340 77 68 65 72 65 20 4b 20 69 73 0a 20 20 20 20 20  where K is.     
1a350 20 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 31 2e     ** between 1.
1a360 31 20 61 6e 64 20 33 2e 30 2c 20 64 65 70 65 6e  1 and 3.0, depen
1a370 64 69 6e 67 20 6f 6e 20 74 68 65 20 72 65 6c 61  ding on the rela
1a380 74 69 76 65 20 73 69 7a 65 73 20 6f 66 20 74 68  tive sizes of th
1a390 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64  e.        ** ind
1a3a0 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72 6f 77  ex and table row
1a3b0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e  s. */.        pN
1a3c0 65 77 2d 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65  ew->rRun = rSize
1a3d0 20 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62   + 1 + (15*pProb
1a3e0 65 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 54 61  e->szIdxRow)/pTa
1a3f0 62 2d 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20  b->szTabRow;.   
1a400 20 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b       if( m!=0 ){
1a410 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
1a420 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63   this is a non-c
1a430 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63  overing index sc
1a440 61 6e 2c 20 61 64 64 20 69 6e 20 74 68 65 20 63  an, add in the c
1a450 6f 73 74 20 6f 66 0a 20 20 20 20 20 20 20 20 20  ost of.         
1a460 20 2a 2a 20 64 6f 69 6e 67 20 74 61 62 6c 65 20   ** doing table 
1a470 6c 6f 6f 6b 75 70 73 2e 20 20 54 68 65 20 63 6f  lookups.  The co
1a480 73 74 20 77 69 6c 6c 20 62 65 20 33 78 20 74 68  st will be 3x th
1a490 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  e number of.    
1a4a0 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 6b 75 70 73        ** lookups
1a4b0 2e 20 20 54 61 6b 65 20 69 6e 74 6f 20 61 63 63  .  Take into acc
1a4c0 6f 75 6e 74 20 57 48 45 52 45 20 63 6c 61 75 73  ount WHERE claus
1a4d0 65 20 74 65 72 6d 73 20 74 68 61 74 20 63 61 6e  e terms that can
1a4e0 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   be.          **
1a4f0 20 73 61 74 69 73 66 69 65 64 20 75 73 69 6e 67   satisfied using
1a500 20 6a 75 73 74 20 74 68 65 20 69 6e 64 65 78 2c   just the index,
1a510 20 61 6e 64 20 74 68 61 74 20 64 6f 20 6e 6f 74   and that do not
1a520 20 72 65 71 75 69 72 65 20 61 0a 20 20 20 20 20   require a.     
1a530 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 6c 6f       ** table lo
1a540 6f 6b 75 70 2e 20 2a 2f 0a 20 20 20 20 20 20 20  okup. */.       
1a550 20 20 20 4c 6f 67 45 73 74 20 6e 4c 6f 6f 6b 75     LogEst nLooku
1a560 70 20 3d 20 72 53 69 7a 65 20 2b 20 31 36 3b 20  p = rSize + 16; 
1a570 20 2f 2a 20 42 61 73 65 20 63 6f 73 74 3a 20 20   /* Base cost:  
1a580 4e 2a 33 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  N*3 */.         
1a590 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20   int ii;.       
1a5a0 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53     int iCur = pS
1a5b0 72 63 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  rc->iCursor;.   
1a5c0 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75         WhereClau
1a5d0 73 65 20 2a 70 57 43 32 20 3d 20 26 70 57 49 6e  se *pWC2 = &pWIn
1a5e0 66 6f 2d 3e 73 57 43 3b 0a 20 20 20 20 20 20 20  fo->sWC;.       
1a5f0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
1a600 70 57 43 32 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b  pWC2->nTerm; ii+
1a610 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
1a620 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
1a630 20 3d 20 26 70 57 43 32 2d 3e 61 5b 69 69 5d 3b   = &pWC2->a[ii];
1a640 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1a650 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 76   !sqlite3ExprCov
1a660 65 72 65 64 42 79 49 6e 64 65 78 28 70 54 65 72  eredByIndex(pTer
1a670 6d 2d 3e 70 45 78 70 72 2c 20 69 43 75 72 2c 20  m->pExpr, iCur, 
1a680 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20  pProbe) ){.     
1a690 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1a6a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1a6b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 54 65            /* pTe
1a6c0 72 6d 20 63 61 6e 20 62 65 20 65 76 61 6c 75 61  rm can be evalua
1a6d0 74 65 64 20 75 73 69 6e 67 20 6a 75 73 74 20 74  ted using just t
1a6e0 68 65 20 69 6e 64 65 78 2e 20 20 53 6f 20 72 65  he index.  So re
1a6f0 64 75 63 65 0a 20 20 20 20 20 20 20 20 20 20 20  duce.           
1a700 20 2a 2a 20 74 68 65 20 65 78 70 65 63 74 65 64   ** the expected
1a710 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65   number of table
1a720 20 6c 6f 6f 6b 75 70 73 20 61 63 63 6f 72 64 69   lookups accordi
1a730 6e 67 6c 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  ngly */.        
1a740 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74      if( pTerm->t
1a750 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20  ruthProb<=0 ){. 
1a760 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f               nLo
1a770 6f 6b 75 70 20 2b 3d 20 70 54 65 72 6d 2d 3e 74  okup += pTerm->t
1a780 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20 20  ruthProb;.      
1a790 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a7a0 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 6b             nLook
1a7b0 75 70 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20  up--;.          
1a7c0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
1a7d0 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
1a7e0 51 7c 57 4f 5f 49 53 29 20 29 20 6e 4c 6f 6f 6b  Q|WO_IS) ) nLook
1a7f0 75 70 20 2d 3d 20 31 39 3b 0a 20 20 20 20 20 20  up -= 19;.      
1a800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a810 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 0a 20    }.          . 
1a820 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72           pNew->r
1a830 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  Run = sqlite3Log
1a840 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52 75  EstAdd(pNew->rRu
1a850 6e 2c 20 6e 4c 6f 6f 6b 75 70 29 3b 0a 20 20 20  n, nLookup);.   
1a860 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 41       }.        A
1a870 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69  pplyCostMultipli
1a880 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70  er(pNew->rRun, p
1a890 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a  Tab->costMult);.
1a8a0 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
1a8b0 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70 57  pOutputAdjust(pW
1a8c0 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b  C, pNew, rSize);
1a8d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68  .        rc = wh
1a8e0 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
1a8f0 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
1a900 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75         pNew->nOu
1a910 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20  t = rSize;.     
1a920 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
1a930 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1a940 0a 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e  ..    pBuilder->
1a950 62 6c 64 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  bldFlags = 0;.  
1a960 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70    rc = whereLoop
1a970 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70 42  AddBtreeIndex(pB
1a980 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50  uilder, pSrc, pP
1a990 72 6f 62 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  robe, 0);.    if
1a9a0 28 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64 46  ( pBuilder->bldF
1a9b0 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 42 4c 44  lags==SQLITE_BLD
1a9c0 46 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20  F_INDEXED ){.   
1a9d0 20 20 20 2f 2a 20 49 66 20 61 20 6e 6f 6e 2d 75     /* If a non-u
1a9e0 6e 69 71 75 65 20 69 6e 64 65 78 20 69 73 20 75  nique index is u
1a9f0 73 65 64 2c 20 6f 72 20 69 66 20 61 20 70 72 65  sed, or if a pre
1aa00 66 69 78 20 6f 66 20 74 68 65 20 6b 65 79 20 66  fix of the key f
1aa10 6f 72 0a 20 20 20 20 20 20 2a 2a 20 75 6e 69 71  or.      ** uniq
1aa20 75 65 20 69 6e 64 65 78 20 69 73 20 75 73 65 64  ue index is used
1aa30 20 28 6d 61 6b 69 6e 67 20 74 68 65 20 69 6e 64   (making the ind
1aa40 65 78 20 66 75 6e 63 74 69 6f 6e 61 6c 6c 79 20  ex functionally 
1aa50 6e 6f 6e 2d 75 6e 69 71 75 65 29 0a 20 20 20 20  non-unique).    
1aa60 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 73 71    ** then the sq
1aa70 6c 69 74 65 5f 73 74 61 74 31 20 64 61 74 61 20  lite_stat1 data 
1aa80 62 65 63 6f 6d 65 73 20 69 6d 70 6f 72 74 61 6e  becomes importan
1aa90 74 20 66 6f 72 20 73 63 6f 72 69 6e 67 20 74 68  t for scoring th
1aaa0 65 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 6e 20  e.      ** plan 
1aab0 2a 2f 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74  */.      pTab->t
1aac0 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 53 74  abFlags |= TF_St
1aad0 61 74 73 55 73 65 64 3b 0a 20 20 20 20 7d 0a 23  atsUsed;.    }.#
1aae0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1aaf0 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
1ab00 54 34 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74  T4.    sqlite3St
1ab10 61 74 34 50 72 6f 62 65 46 72 65 65 28 70 42 75  at4ProbeFree(pBu
1ab20 69 6c 64 65 72 2d 3e 70 52 65 63 29 3b 0a 20 20  ilder->pRec);.  
1ab30 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
1ab40 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 70  Valid = 0;.    p
1ab50 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20  Builder->pRec = 
1ab60 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  0;.#endif..    /
1ab70 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
1ab80 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
1ab90 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74  use, then only t
1aba0 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69 73  hat one index is
1abb0 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72  .    ** consider
1abc0 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
1abd0 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 20 29 20  Src->pIBIndex ) 
1abe0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
1abf0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
1ac00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1ac10 49 52 54 55 41 4c 54 41 42 4c 45 0a 0a 2f 2a 0a  IRTUALTABLE../*.
1ac20 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 64 78  ** Argument pIdx
1ac30 49 6e 66 6f 20 69 73 20 61 6c 72 65 61 64 79 20  Info is already 
1ac40 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61  populated with a
1ac50 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  ll constraints t
1ac60 68 61 74 20 6d 61 79 0a 2a 2a 20 62 65 20 75 73  hat may.** be us
1ac70 65 64 20 62 79 20 74 68 65 20 76 69 72 74 75 61  ed by the virtua
1ac80 6c 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69  l table identifi
1ac90 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e  ed by pBuilder->
1aca0 70 4e 65 77 2d 3e 69 54 61 62 2e 20 54 68 69 73  pNew->iTab. This
1acb0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 72  .** function mar
1acc0 6b 73 20 61 20 73 75 62 73 65 74 20 6f 66 20 74  ks a subset of t
1acd0 68 6f 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  hose constraints
1ace0 20 75 73 61 62 6c 65 2c 20 69 6e 76 6f 6b 65 73   usable, invokes
1acf0 20 74 68 65 0a 2a 2a 20 78 42 65 73 74 49 6e 64   the.** xBestInd
1ad00 65 78 20 6d 65 74 68 6f 64 20 61 6e 64 20 61 64  ex method and ad
1ad10 64 73 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ds the returned 
1ad20 70 6c 61 6e 20 74 6f 20 70 42 75 69 6c 64 65 72  plan to pBuilder
1ad30 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 6f 6e 73 74 72  ..**.** A constr
1ad40 61 69 6e 74 20 69 73 20 6d 61 72 6b 65 64 20 75  aint is marked u
1ad50 73 61 62 6c 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20  sable if:.**.** 
1ad60 20 20 2a 20 41 72 67 75 6d 65 6e 74 20 6d 55 73    * Argument mUs
1ad70 61 62 6c 65 20 69 6e 64 69 63 61 74 65 73 20 74  able indicates t
1ad80 68 61 74 20 69 74 73 20 70 72 65 72 65 71 75 69  hat its prerequi
1ad90 73 69 74 65 73 20 61 72 65 20 61 76 61 69 6c 61  sites are availa
1ada0 62 6c 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ble, and.**.**  
1adb0 20 2a 20 49 74 20 69 73 20 6e 6f 74 20 6f 6e 65   * It is not one
1adc0 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
1add0 73 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  s specified in t
1ade0 68 65 20 6d 45 78 63 6c 75 64 65 20 6d 61 73 6b  he mExclude mask
1adf0 20 70 61 73 73 65 64 0a 2a 2a 20 20 20 20 20 61   passed.**     a
1ae00 73 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67  s the fourth arg
1ae10 75 6d 65 6e 74 20 28 77 68 69 63 68 20 69 6e 20  ument (which in 
1ae20 70 72 61 63 74 69 63 65 20 69 73 20 65 69 74 68  practice is eith
1ae30 65 72 20 57 4f 5f 49 4e 20 6f 72 20 30 29 2e 0a  er WO_IN or 0)..
1ae40 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 6d  **.** Argument m
1ae50 50 72 65 72 65 71 20 69 73 20 61 20 6d 61 73 6b  Prereq is a mask
1ae60 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
1ae70 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20  must be scanned 
1ae80 62 65 66 6f 72 65 20 74 68 65 0a 2a 2a 20 76 69  before the.** vi
1ae90 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 71  rtual table in q
1aea0 75 65 73 74 69 6f 6e 2e 20 54 68 65 73 65 20 61  uestion. These a
1aeb0 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  re added to the 
1aec0 70 6c 61 6e 73 20 70 72 65 72 65 71 75 69 73 69  plans prerequisi
1aed0 74 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 69 74  tes.** before it
1aee0 20 69 73 20 61 64 64 65 64 20 74 6f 20 70 42 75   is added to pBu
1aef0 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74  ilder..**.** Out
1af00 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 2a 70  put parameter *p
1af10 62 49 6e 20 69 73 20 73 65 74 20 74 6f 20 74 72  bIn is set to tr
1af20 75 65 20 69 66 20 74 68 65 20 70 6c 61 6e 20 61  ue if the plan a
1af30 64 64 65 64 20 74 6f 20 70 42 75 69 6c 64 65 72  dded to pBuilder
1af40 0a 2a 2a 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  .** uses one or 
1af50 6d 6f 72 65 20 57 4f 5f 49 4e 20 74 65 72 6d 73  more WO_IN terms
1af60 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
1af70 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
1af80 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
1af90 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 57 68  VirtualOne(.  Wh
1afa0 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
1afb0 70 42 75 69 6c 64 65 72 2c 0a 20 20 42 69 74 6d  pBuilder,.  Bitm
1afc0 61 73 6b 20 6d 50 72 65 72 65 71 2c 20 20 20 20  ask mPrereq,    
1afd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1afe0 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 74 68  ask of tables th
1aff0 61 74 20 6d 75 73 74 20 62 65 20 75 73 65 64 2e  at must be used.
1b000 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55   */.  Bitmask mU
1b010 73 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  sable,          
1b020 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
1b030 20 75 73 61 62 6c 65 20 74 61 62 6c 65 73 20 2a   usable tables *
1b040 2f 0a 20 20 75 31 36 20 6d 45 78 63 6c 75 64 65  /.  u16 mExclude
1b050 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b060 20 20 20 20 2f 2a 20 45 78 63 6c 75 64 65 20 74      /* Exclude t
1b070 65 72 6d 73 20 75 73 69 6e 67 20 74 68 65 73 65  erms using these
1b080 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   operators */.  
1b090 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
1b0a0 66 6f 20 2a 70 49 64 78 49 6e 66 6f 2c 20 20 20  fo *pIdxInfo,   
1b0b0 2f 2a 20 50 6f 70 75 6c 61 74 65 64 20 6f 62 6a  /* Populated obj
1b0c0 65 63 74 20 66 6f 72 20 78 42 65 73 74 49 6e 64  ect for xBestInd
1b0d0 65 78 20 2a 2f 0a 20 20 75 31 36 20 6d 4e 6f 4f  ex */.  u16 mNoO
1b0e0 6d 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  mit,            
1b0f0 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
1b100 74 20 6f 6d 69 74 20 74 68 65 73 65 20 63 6f 6e  t omit these con
1b110 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e  straints */.  in
1b120 74 20 2a 70 62 49 6e 20 20 20 20 20 20 20 20 20  t *pbIn         
1b130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b140 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20 70 6c   OUT: True if pl
1b150 61 6e 20 75 73 65 73 20 61 6e 20 49 4e 28 2e 2e  an uses an IN(..
1b160 2e 29 20 6f 70 20 2a 2f 0a 29 7b 0a 20 20 57 68  .) op */.){.  Wh
1b170 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 3d  ereClause *pWC =
1b180 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a   pBuilder->pWC;.
1b190 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
1b1a0 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
1b1b0 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73  t *pIdxCons;.  s
1b1c0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
1b1d0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
1b1e0 73 61 67 65 20 2a 70 55 73 61 67 65 20 3d 20 70  sage *pUsage = p
1b1f0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
1b200 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 69 6e 74  aintUsage;.  int
1b210 20 69 3b 0a 20 20 69 6e 74 20 6d 78 54 65 72 6d   i;.  int mxTerm
1b220 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1b230 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72 65 4c  ITE_OK;.  WhereL
1b240 6f 6f 70 20 2a 70 4e 65 77 20 3d 20 70 42 75 69  oop *pNew = pBui
1b250 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 50 61  lder->pNew;.  Pa
1b260 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 42  rse *pParse = pB
1b270 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e  uilder->pWInfo->
1b280 70 50 61 72 73 65 3b 0a 20 20 73 74 72 75 63 74  pParse;.  struct
1b290 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
1b2a0 53 72 63 20 3d 20 26 70 42 75 69 6c 64 65 72 2d  Src = &pBuilder-
1b2b0 3e 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73  >pWInfo->pTabLis
1b2c0 74 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d  t->a[pNew->iTab]
1b2d0 3b 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61  ;.  int nConstra
1b2e0 69 6e 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  int = pIdxInfo->
1b2f0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20  nConstraint;..  
1b300 61 73 73 65 72 74 28 20 28 6d 55 73 61 62 6c 65  assert( (mUsable
1b310 20 26 20 6d 50 72 65 72 65 71 29 3d 3d 6d 50 72   & mPrereq)==mPr
1b320 65 72 65 71 20 29 3b 0a 20 20 2a 70 62 49 6e 20  ereq );.  *pbIn 
1b330 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65  = 0;.  pNew->pre
1b340 72 65 71 20 3d 20 6d 50 72 65 72 65 71 3b 0a 0a  req = mPrereq;..
1b350 20 20 2f 2a 20 53 65 74 20 74 68 65 20 75 73 61    /* Set the usa
1b360 62 6c 65 20 66 6c 61 67 20 6f 6e 20 74 68 65 20  ble flag on the 
1b370 73 75 62 73 65 74 20 6f 66 20 63 6f 6e 73 74 72  subset of constr
1b380 61 69 6e 74 73 20 69 64 65 6e 74 69 66 69 65 64  aints identified
1b390 20 62 79 20 0a 20 20 2a 2a 20 61 72 67 75 6d 65   by .  ** argume
1b3a0 6e 74 73 20 6d 55 73 61 62 6c 65 20 61 6e 64 20  nts mUsable and 
1b3b0 6d 45 78 63 6c 75 64 65 2e 20 2a 2f 0a 20 20 70  mExclude. */.  p
1b3c0 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75  IdxCons = *(stru
1b3d0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
1b3e0 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
1b3f0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
1b400 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  aint;.  for(i=0;
1b410 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   i<nConstraint; 
1b420 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29  i++, pIdxCons++)
1b430 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  {.    WhereTerm 
1b440 2a 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61  *pTerm = &pWC->a
1b450 5b 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d  [pIdxCons->iTerm
1b460 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 70 49 64  Offset];.    pId
1b470 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20  xCons->usable = 
1b480 30 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72  0;.    if( (pTer
1b490 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  m->prereqRight &
1b4a0 20 6d 55 73 61 62 6c 65 29 3d 3d 70 54 65 72 6d   mUsable)==pTerm
1b4b0 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 0a 20  ->prereqRight . 
1b4c0 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65      && (pTerm->e
1b4d0 4f 70 65 72 61 74 6f 72 20 26 20 6d 45 78 63 6c  Operator & mExcl
1b4e0 75 64 65 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  ude)==0.    ){. 
1b4f0 20 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75       pIdxCons->u
1b500 73 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  sable = 1;.    }
1b510 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
1b520 61 6c 69 7a 65 20 74 68 65 20 6f 75 74 70 75 74  alize the output
1b530 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73   fields of the s
1b540 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
1b550 6f 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  o structure */. 
1b560 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20   memset(pUsage, 
1b570 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65  0, sizeof(pUsage
1b580 5b 30 5d 29 2a 6e 43 6f 6e 73 74 72 61 69 6e 74  [0])*nConstraint
1b590 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 64  );.  assert( pId
1b5a0 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
1b5b0 65 49 64 78 53 74 72 3d 3d 30 20 29 3b 0a 20 20  eIdxStr==0 );.  
1b5c0 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
1b5d0 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f   = 0;.  pIdxInfo
1b5e0 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20  ->idxNum = 0;.  
1b5f0 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
1b600 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
1b610 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
1b620 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54  atedCost = SQLIT
1b630 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75  E_BIG_DBL / (dou
1b640 62 6c 65 29 32 3b 0a 20 20 70 49 64 78 49 6e 66  ble)2;.  pIdxInf
1b650 6f 2d 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73  o->estimatedRows
1b660 20 3d 20 32 35 3b 0a 20 20 70 49 64 78 49 6e 66   = 25;.  pIdxInf
1b670 6f 2d 3e 69 64 78 46 6c 61 67 73 20 3d 20 30 3b  o->idxFlags = 0;
1b680 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 63 6f 6c  .  pIdxInfo->col
1b690 55 73 65 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  Used = (sqlite3_
1b6a0 69 6e 74 36 34 29 70 53 72 63 2d 3e 63 6f 6c 55  int64)pSrc->colU
1b6b0 73 65 64 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b  sed;..  /* Invok
1b6c0 65 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  e the virtual ta
1b6d0 62 6c 65 20 78 42 65 73 74 49 6e 64 65 78 28 29  ble xBestIndex()
1b6e0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 72 63 20   method */.  rc 
1b6f0 3d 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28  = vtabBestIndex(
1b700 70 50 61 72 73 65 2c 20 70 53 72 63 2d 3e 70 54  pParse, pSrc->pT
1b710 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20  ab, pIdxInfo);. 
1b720 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1b730 20 72 63 3b 0a 0a 20 20 6d 78 54 65 72 6d 20 3d   rc;..  mxTerm =
1b740 20 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70   -1;.  assert( p
1b750 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f  New->nLSlot>=nCo
1b760 6e 73 74 72 61 69 6e 74 20 29 3b 0a 20 20 66 6f  nstraint );.  fo
1b770 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72  r(i=0; i<nConstr
1b780 61 69 6e 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d  aint; i++) pNew-
1b790 3e 61 4c 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a  >aLTerm[i] = 0;.
1b7a0 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f    pNew->u.vtab.o
1b7b0 6d 69 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70  mitMask = 0;.  p
1b7c0 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75  IdxCons = *(stru
1b7d0 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
1b7e0 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70  _constraint**)&p
1b7f0 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
1b800 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  aint;.  for(i=0;
1b810 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   i<nConstraint; 
1b820 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29  i++, pIdxCons++)
1b830 7b 0a 20 20 20 20 69 6e 74 20 69 54 65 72 6d 3b  {.    int iTerm;
1b840 0a 20 20 20 20 69 66 28 20 28 69 54 65 72 6d 20  .    if( (iTerm 
1b850 3d 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  = pUsage[i].argv
1b860 49 6e 64 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b  Index - 1)>=0 ){
1b870 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
1b880 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 69   *pTerm;.      i
1b890 6e 74 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d  nt j = pIdxCons-
1b8a0 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  >iTermOffset;.  
1b8b0 20 20 20 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e      if( iTerm>=n
1b8c0 43 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 20  Constraint.     
1b8d0 20 20 7c 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20    || j<0.       
1b8e0 7c 7c 20 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d  || j>=pWC->nTerm
1b8f0 0a 20 20 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d  .       || pNew-
1b900 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d  >aLTerm[iTerm]!=
1b910 30 0a 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78  0.       || pIdx
1b920 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 3d 3d 30 0a  Cons->usable==0.
1b930 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1b940 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
1b950 4f 52 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  OR;.        sqli
1b960 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1b970 73 65 2c 22 25 73 2e 78 42 65 73 74 49 6e 64 65  se,"%s.xBestInde
1b980 78 20 6d 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 70  x malfunction",p
1b990 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  Src->pTab->zName
1b9a0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
1b9b0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1b9c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 54      testcase( iT
1b9d0 65 72 6d 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  erm==nConstraint
1b9e0 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  -1 );.      test
1b9f0 63 61 73 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20  case( j==0 );.  
1ba00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
1ba10 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b  =pWC->nTerm-1 );
1ba20 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
1ba30 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20  pWC->a[j];.     
1ba40 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d   pNew->prereq |=
1ba50 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
1ba60 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ght;.      asser
1ba70 74 28 20 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e  t( iTerm<pNew->n
1ba80 4c 53 6c 6f 74 20 29 3b 0a 20 20 20 20 20 20 70  LSlot );.      p
1ba90 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72  New->aLTerm[iTer
1baa0 6d 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  m] = pTerm;.    
1bab0 20 20 69 66 28 20 69 54 65 72 6d 3e 6d 78 54 65    if( iTerm>mxTe
1bac0 72 6d 20 29 20 6d 78 54 65 72 6d 20 3d 20 69 54  rm ) mxTerm = iT
1bad0 65 72 6d 3b 0a 20 20 20 20 20 20 74 65 73 74 63  erm;.      testc
1bae0 61 73 65 28 20 69 54 65 72 6d 3d 3d 31 35 20 29  ase( iTerm==15 )
1baf0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1bb00 28 20 69 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20  ( iTerm==16 );. 
1bb10 20 20 20 20 20 69 66 28 20 69 54 65 72 6d 3c 31       if( iTerm<1
1bb20 36 20 26 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f  6 && pUsage[i].o
1bb30 6d 69 74 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74  mit ) pNew->u.vt
1bb40 61 62 2e 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31  ab.omitMask |= 1
1bb50 3c 3c 69 54 65 72 6d 3b 0a 20 20 20 20 20 20 69  <<iTerm;.      i
1bb60 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  f( (pTerm->eOper
1bb70 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30  ator & WO_IN)!=0
1bb80 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
1bb90 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
1bba0 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  hat is constrain
1bbb0 65 64 20 62 79 20 61 6e 20 49 4e 20 63 6c 61 75  ed by an IN clau
1bbc0 73 65 20 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20  se may not.     
1bbd0 20 20 20 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68     ** consume th
1bbe0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1bbf0 65 20 62 65 63 61 75 73 65 20 28 31 29 20 74 68  e because (1) th
1bc00 65 20 6f 72 64 65 72 20 6f 66 20 49 4e 20 74 65  e order of IN te
1bc10 72 6d 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  rms.        ** i
1bc20 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
1bc30 79 20 72 65 6c 61 74 65 64 20 74 6f 20 74 68 65  y related to the
1bc40 20 6f 72 64 65 72 20 6f 66 20 6f 75 74 70 75 74   order of output
1bc50 20 74 65 72 6d 73 20 61 6e 64 0a 20 20 20 20 20   terms and.     
1bc60 20 20 20 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70     ** (2) Multip
1bc70 6c 65 20 6f 75 74 70 75 74 73 20 66 72 6f 6d 20  le outputs from 
1bc80 61 20 73 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75  a single IN valu
1bc90 65 20 77 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65  e will not merge
1bca0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 67 65  .        ** toge
1bcb0 74 68 65 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ther.  */.      
1bcc0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65    pIdxInfo->orde
1bcd0 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b  rByConsumed = 0;
1bce0 0a 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66  .        pIdxInf
1bcf0 6f 2d 3e 69 64 78 46 6c 61 67 73 20 26 3d 20 7e  o->idxFlags &= ~
1bd00 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43 41  SQLITE_INDEX_SCA
1bd10 4e 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 20 20  N_UNIQUE;.      
1bd20 20 20 2a 70 62 49 6e 20 3d 20 31 3b 20 61 73 73    *pbIn = 1; ass
1bd30 65 72 74 28 20 28 6d 45 78 63 6c 75 64 65 20 26  ert( (mExclude &
1bd40 20 57 4f 5f 49 4e 29 3d 3d 30 20 29 3b 0a 20 20   WO_IN)==0 );.  
1bd50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1bd60 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f    pNew->u.vtab.o
1bd70 6d 69 74 4d 61 73 6b 20 26 3d 20 7e 6d 4e 6f 4f  mitMask &= ~mNoO
1bd80 6d 69 74 3b 0a 0a 20 20 70 4e 65 77 2d 3e 6e 4c  mit;..  pNew->nL
1bd90 54 65 72 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b  Term = mxTerm+1;
1bda0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
1bdb0 3e 6e 4c 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e  >nLTerm<=pNew->n
1bdc0 4c 53 6c 6f 74 20 29 3b 0a 20 20 70 4e 65 77 2d  LSlot );.  pNew-
1bdd0 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d  >u.vtab.idxNum =
1bde0 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
1bdf0 6d 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61  m;.  pNew->u.vta
1be00 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 70 49 64  b.needFree = pId
1be10 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
1be20 65 49 64 78 53 74 72 3b 0a 20 20 70 49 64 78 49  eIdxStr;.  pIdxI
1be30 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
1be40 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 4e 65  dxStr = 0;.  pNe
1be50 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72  w->u.vtab.idxStr
1be60 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78   = pIdxInfo->idx
1be70 53 74 72 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76  Str;.  pNew->u.v
1be80 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20 3d 20  tab.isOrdered = 
1be90 28 69 38 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6f  (i8)(pIdxInfo->o
1bea0 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3f  rderByConsumed ?
1beb0 0a 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d  .      pIdxInfo-
1bec0 3e 6e 4f 72 64 65 72 42 79 20 3a 20 30 29 3b 0a  >nOrderBy : 0);.
1bed0 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
1bee0 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 72 52 75 6e   0;.  pNew->rRun
1bef0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1bf00 46 72 6f 6d 44 6f 75 62 6c 65 28 70 49 64 78 49  FromDouble(pIdxI
1bf10 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
1bf20 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75  st);.  pNew->nOu
1bf30 74 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  t = sqlite3LogEs
1bf40 74 28 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69  t(pIdxInfo->esti
1bf50 6d 61 74 65 64 52 6f 77 73 29 3b 0a 0a 20 20 2f  matedRows);..  /
1bf60 2a 20 53 65 74 20 74 68 65 20 57 48 45 52 45 5f  * Set the WHERE_
1bf70 4f 4e 45 52 4f 57 20 66 6c 61 67 20 69 66 20 74  ONEROW flag if t
1bf80 68 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  he xBestIndex() 
1bf90 6d 65 74 68 6f 64 20 69 6e 64 69 63 61 74 65 64  method indicated
1bfa0 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73  .  ** that the s
1bfb0 63 61 6e 20 77 69 6c 6c 20 76 69 73 69 74 20 61  can will visit a
1bfc0 74 20 6d 6f 73 74 20 6f 6e 65 20 72 6f 77 2e 20  t most one row. 
1bfd0 43 6c 65 61 72 20 69 74 20 6f 74 68 65 72 77 69  Clear it otherwi
1bfe0 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 64  se. */.  if( pId
1bff0 78 49 6e 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20  xInfo->idxFlags 
1c000 26 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53  & SQLITE_INDEX_S
1c010 43 41 4e 5f 55 4e 49 51 55 45 20 29 7b 0a 20 20  CAN_UNIQUE ){.  
1c020 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
1c030 7c 3d 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b  |= WHERE_ONEROW;
1c040 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
1c050 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e  ew->wsFlags &= ~
1c060 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20  WHERE_ONEROW;.  
1c070 7d 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f  }.  rc = whereLo
1c080 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c 64 65  opInsert(pBuilde
1c090 72 2c 20 70 4e 65 77 29 3b 0a 20 20 69 66 28 20  r, pNew);.  if( 
1c0a0 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
1c0b0 64 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  dFree ){.    sql
1c0c0 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e  ite3_free(pNew->
1c0d0 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
1c0e0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62      pNew->u.vtab
1c0f0 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20  .needFree = 0;. 
1c100 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45 28   }.  WHERETRACE(
1c110 30 78 66 66 66 66 2c 20 28 22 20 20 62 49 6e 3d  0xffff, ("  bIn=
1c120 25 64 20 70 72 65 72 65 71 49 6e 3d 25 30 34 6c  %d prereqIn=%04l
1c130 6c 78 20 70 72 65 72 65 71 4f 75 74 3d 25 30 34  lx prereqOut=%04
1c140 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  llx\n",.        
1c150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
1c160 62 49 6e 2c 20 28 73 71 6c 69 74 65 33 5f 75 69  bIn, (sqlite3_ui
1c170 6e 74 36 34 29 6d 50 72 65 72 65 71 2c 0a 20 20  nt64)mPrereq,.  
1c180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c190 20 20 20 20 28 73 71 6c 69 74 65 33 5f 75 69 6e      (sqlite3_uin
1c1a0 74 36 34 29 28 70 4e 65 77 2d 3e 70 72 65 72 65  t64)(pNew->prere
1c1b0 71 20 26 20 7e 6d 50 72 65 72 65 71 29 29 29 3b  q & ~mPrereq)));
1c1c0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1c1d0 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  .../*.** Add all
1c1e0 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
1c1f0 74 73 20 66 6f 72 20 61 20 74 61 62 6c 65 20 6f  ts for a table o
1c200 66 20 74 68 65 20 6a 6f 69 6e 20 69 64 65 6e 74  f the join ident
1c210 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 42 75 69  ified by.** pBui
1c220 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62  lder->pNew->iTab
1c230 2e 20 20 54 68 61 74 20 74 61 62 6c 65 20 69 73  .  That table is
1c240 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
1c250 65 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  e a virtual tabl
1c260 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  e..**.** If ther
1c270 65 20 61 72 65 20 6e 6f 20 4c 45 46 54 20 6f 72  e are no LEFT or
1c280 20 43 52 4f 53 53 20 4a 4f 49 4e 20 6a 6f 69 6e   CROSS JOIN join
1c290 73 20 69 6e 20 74 68 65 20 71 75 65 72 79 2c 20  s in the query, 
1c2a0 62 6f 74 68 20 6d 50 72 65 72 65 71 20 61 6e 64  both mPrereq and
1c2b0 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 61 72  .** mUnusable ar
1c2c0 65 20 73 65 74 20 74 6f 20 30 2e 20 4f 74 68 65  e set to 0. Othe
1c2d0 72 77 69 73 65 2c 20 6d 50 72 65 72 65 71 20 69  rwise, mPrereq i
1c2e0 73 20 61 20 6d 61 73 6b 20 6f 66 20 61 6c 6c 20  s a mask of all 
1c2f0 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 65  FROM clause.** e
1c300 6e 74 72 69 65 73 20 74 68 61 74 20 6f 63 63 75  ntries that occu
1c310 72 20 62 65 66 6f 72 65 20 74 68 65 20 76 69 72  r before the vir
1c320 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 74 68  tual table in th
1c330 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6e  e FROM clause an
1c340 64 20 61 72 65 0a 2a 2a 20 73 65 70 61 72 61 74  d are.** separat
1c350 65 64 20 66 72 6f 6d 20 69 74 20 62 79 20 61 74  ed from it by at
1c360 20 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46 54 20   least one LEFT 
1c370 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 53  or CROSS JOIN. S
1c380 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 0a 2a 2a  imilarly, the.**
1c390 20 6d 55 6e 75 73 61 62 6c 65 20 6d 61 73 6b 20   mUnusable mask 
1c3a0 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 46 52 4f  contains all FRO
1c3b0 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 69 65 73  M clause entries
1c3c0 20 74 68 61 74 20 6f 63 63 75 72 20 61 66 74 65   that occur afte
1c3d0 72 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  r the.** virtual
1c3e0 20 74 61 62 6c 65 20 61 6e 64 20 61 72 65 20 73   table and are s
1c3f0 65 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69 74  eparated from it
1c400 20 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   by at least one
1c410 20 4c 45 46 54 20 6f 72 20 0a 2a 2a 20 43 52 4f   LEFT or .** CRO
1c420 53 53 20 4a 4f 49 4e 2e 20 0a 2a 2a 0a 2a 2a 20  SS JOIN. .**.** 
1c430 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
1c440 74 68 65 20 71 75 65 72 79 20 77 65 72 65 3a 0a  the query were:.
1c450 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
1c460 20 74 31 2c 20 74 32 20 4c 45 46 54 20 4a 4f 49   t1, t2 LEFT JOI
1c470 4e 20 74 33 2c 20 74 34 2c 20 76 74 20 43 52 4f  N t3, t4, vt CRO
1c480 53 53 20 4a 4f 49 4e 20 74 35 2c 20 74 36 3b 0a  SS JOIN t5, t6;.
1c490 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6d 50 72 65 72  **.** then mPrer
1c4a0 65 71 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  eq corresponds t
1c4b0 6f 20 28 74 31 2c 20 74 32 29 20 61 6e 64 20 6d  o (t1, t2) and m
1c4c0 55 6e 75 73 61 62 6c 65 20 74 6f 20 28 74 35 2c  Unusable to (t5,
1c4d0 20 74 36 29 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20   t6)..**.** All 
1c4e0 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 6d 50  the tables in mP
1c4f0 72 65 72 65 71 20 6d 75 73 74 20 62 65 20 73 63  rereq must be sc
1c500 61 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68 65  anned before the
1c510 20 63 75 72 72 65 6e 74 20 76 69 72 74 75 61 6c   current virtual
1c520 20 0a 2a 2a 20 74 61 62 6c 65 2e 20 53 6f 20 61   .** table. So a
1c530 6e 79 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69  ny terms for whi
1c540 63 68 20 61 6c 6c 20 70 72 65 72 65 71 75 69 73  ch all prerequis
1c550 69 74 65 73 20 61 72 65 20 73 61 74 69 73 66 69  ites are satisfi
1c560 65 64 20 62 79 20 0a 2a 2a 20 6d 50 72 65 72 65  ed by .** mPrere
1c570 71 20 6d 61 79 20 62 65 20 73 70 65 63 69 66 69  q may be specifi
1c580 65 64 20 61 73 20 22 75 73 61 62 6c 65 22 20 69  ed as "usable" i
1c590 6e 20 61 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 78  n all calls to x
1c5a0 42 65 73 74 49 6e 64 65 78 2e 20 0a 2a 2a 20 43  BestIndex. .** C
1c5b0 6f 6e 76 65 72 73 65 6c 79 2c 20 61 6c 6c 20 74  onversely, all t
1c5c0 61 62 6c 65 73 20 69 6e 20 6d 55 6e 75 73 61 62  ables in mUnusab
1c5d0 6c 65 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e  le must be scann
1c5e0 65 64 20 61 66 74 65 72 20 74 68 65 20 63 75 72  ed after the cur
1c5f0 72 65 6e 74 0a 2a 2a 20 76 69 72 74 75 61 6c 20  rent.** virtual 
1c600 74 61 62 6c 65 2c 20 73 6f 20 61 6e 79 20 74 65  table, so any te
1c610 72 6d 73 20 66 6f 72 20 77 68 69 63 68 20 74 68  rms for which th
1c620 65 20 70 72 65 72 65 71 75 69 73 69 74 65 73 20  e prerequisites 
1c630 6f 76 65 72 6c 61 70 20 77 69 74 68 0a 2a 2a 20  overlap with.** 
1c640 6d 55 6e 75 73 61 62 6c 65 20 73 68 6f 75 6c 64  mUnusable should
1c650 20 61 6c 77 61 79 73 20 62 65 20 63 6f 6e 66 69   always be confi
1c660 67 75 72 65 64 20 61 73 20 22 6e 6f 74 2d 75 73  gured as "not-us
1c670 61 62 6c 65 22 20 66 6f 72 20 78 42 65 73 74 49  able" for xBestI
1c680 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
1c690 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
1c6a0 56 69 72 74 75 61 6c 28 0a 20 20 57 68 65 72 65  Virtual(.  Where
1c6b0 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
1c6c0 69 6c 64 65 72 2c 20 20 2f 2a 20 57 48 45 52 45  ilder,  /* WHERE
1c6d0 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61 74   clause informat
1c6e0 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
1c6f0 20 6d 50 72 65 72 65 71 2c 20 20 20 20 20 20 20   mPrereq,       
1c700 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20        /* Tables 
1c710 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63 61  that must be sca
1c720 6e 6e 65 64 20 62 65 66 6f 72 65 20 74 68 69 73  nned before this
1c730 20 6f 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73   one */.  Bitmas
1c740 6b 20 6d 55 6e 75 73 61 62 6c 65 20 20 20 20 20  k mUnusable     
1c750 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
1c760 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 73 63   that must be sc
1c770 61 6e 6e 65 64 20 61 66 74 65 72 20 74 68 69 73  anned after this
1c780 20 6f 6e 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   one */.){.  int
1c790 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c7a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1c7b0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 57 68  urn code */.  Wh
1c7c0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
1c7d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 48             /* WH
1c7e0 45 52 45 20 61 6e 61 6c 79 73 69 73 20 63 6f 6e  ERE analysis con
1c7f0 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73 65 20  text */.  Parse 
1c800 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
1c810 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1c820 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1c830 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
1c840 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  pWC;            
1c850 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
1c860 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
1c870 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
1c880 72 63 3b 20 20 20 2f 2a 20 54 68 65 20 46 52 4f  rc;   /* The FRO
1c890 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
1c8a0 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 73 71 6c   search */.  sql
1c8b0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
1c8c0 2a 70 3b 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a  *p;       /* Obj
1c8d0 65 63 74 20 74 6f 20 70 61 73 73 20 74 6f 20 78  ect to pass to x
1c8e0 42 65 73 74 49 6e 64 65 78 28 29 20 2a 2f 0a 20  BestIndex() */. 
1c8f0 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
1c900 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1c910 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74   Number of const
1c920 72 61 69 6e 74 73 20 69 6e 20 70 20 2a 2f 0a 20  raints in p */. 
1c930 20 69 6e 74 20 62 49 6e 3b 20 20 20 20 20 20 20   int bIn;       
1c940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c950 20 54 72 75 65 20 69 66 20 70 6c 61 6e 20 75 73   True if plan us
1c960 65 73 20 49 4e 28 2e 2e 2e 29 20 6f 70 65 72 61  es IN(...) opera
1c970 74 6f 72 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  tor */.  WhereLo
1c980 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 42 69 74 6d  op *pNew;.  Bitm
1c990 61 73 6b 20 6d 42 65 73 74 3b 20 20 20 20 20 20  ask mBest;      
1c9a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
1c9b0 65 73 20 75 73 65 64 20 62 79 20 62 65 73 74 20  es used by best 
1c9c0 70 6f 73 73 69 62 6c 65 20 70 6c 61 6e 20 2a 2f  possible plan */
1c9d0 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d 69 74 3b 0a  .  u16 mNoOmit;.
1c9e0 0a 20 20 61 73 73 65 72 74 28 20 28 6d 50 72 65  .  assert( (mPre
1c9f0 72 65 71 20 26 20 6d 55 6e 75 73 61 62 6c 65 29  req & mUnusable)
1ca00 3d 3d 30 20 29 3b 0a 20 20 70 57 49 6e 66 6f 20  ==0 );.  pWInfo 
1ca10 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e  = pBuilder->pWIn
1ca20 66 6f 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70  fo;.  pParse = p
1ca30 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
1ca40 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d   pWC = pBuilder-
1ca50 3e 70 57 43 3b 0a 20 20 70 4e 65 77 20 3d 20 70  >pWC;.  pNew = p
1ca60 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20  Builder->pNew;. 
1ca70 20 70 53 72 63 20 3d 20 26 70 57 49 6e 66 6f 2d   pSrc = &pWInfo-
1ca80 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4e 65  >pTabList->a[pNe
1ca90 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 61 73 73 65  w->iTab];.  asse
1caa0 72 74 28 20 49 73 56 69 72 74 75 61 6c 28 70 53  rt( IsVirtual(pS
1cab0 72 63 2d 3e 70 54 61 62 29 20 29 3b 0a 20 20 70  rc->pTab) );.  p
1cac0 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78   = allocateIndex
1cad0 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43  Info(pParse, pWC
1cae0 2c 20 6d 55 6e 75 73 61 62 6c 65 2c 20 70 53 72  , mUnusable, pSr
1caf0 63 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  c, pBuilder->pOr
1cb00 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 26 6d  derBy, .      &m
1cb10 4e 6f 4f 6d 69 74 29 3b 0a 20 20 69 66 28 20 70  NoOmit);.  if( p
1cb20 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1cb30 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
1cb40 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
1cb50 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c   0;.  pNew->wsFl
1cb60 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52 54  ags = WHERE_VIRT
1cb70 55 41 4c 54 41 42 4c 45 3b 0a 20 20 70 4e 65 77  UALTABLE;.  pNew
1cb80 2d 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20  ->nLTerm = 0;.  
1cb90 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65  pNew->u.vtab.nee
1cba0 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 6e 43 6f  dFree = 0;.  nCo
1cbb0 6e 73 74 72 61 69 6e 74 20 3d 20 70 2d 3e 6e 43  nstraint = p->nC
1cbc0 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 69 66 28  onstraint;.  if(
1cbd0 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
1cbe0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 65  (pParse->db, pNe
1cbf0 77 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29 20  w, nConstraint) 
1cc00 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
1cc10 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
1cc20 20 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   p);.    return 
1cc30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
1cc40 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72  T;.  }..  /* Fir
1cc50 73 74 20 63 61 6c 6c 20 78 42 65 73 74 49 6e 64  st call xBestInd
1cc60 65 78 28 29 20 77 69 74 68 20 61 6c 6c 20 63 6f  ex() with all co
1cc70 6e 73 74 72 61 69 6e 74 73 20 75 73 61 62 6c 65  nstraints usable
1cc80 2e 20 2a 2f 0a 20 20 57 48 45 52 45 54 52 41 43  . */.  WHERETRAC
1cc90 45 28 30 78 34 30 2c 20 28 22 20 20 56 69 72 74  E(0x40, ("  Virt
1cca0 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 75 73 61 62  ualOne: all usab
1ccb0 6c 65 5c 6e 22 29 29 3b 0a 20 20 72 63 20 3d 20  le\n"));.  rc = 
1ccc0 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
1ccd0 75 61 6c 4f 6e 65 28 70 42 75 69 6c 64 65 72 2c  ualOne(pBuilder,
1cce0 20 6d 50 72 65 72 65 71 2c 20 41 4c 4c 42 49 54   mPrereq, ALLBIT
1ccf0 53 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74  S, 0, p, mNoOmit
1cd00 2c 20 26 62 49 6e 29 3b 0a 0a 20 20 2f 2a 20 49  , &bIn);..  /* I
1cd10 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 78 42  f the call to xB
1cd20 65 73 74 49 6e 64 65 78 28 29 20 77 69 74 68 20  estIndex() with 
1cd30 61 6c 6c 20 74 65 72 6d 73 20 65 6e 61 62 6c 65  all terms enable
1cd40 64 20 70 72 6f 64 75 63 65 64 20 61 20 70 6c 61  d produced a pla
1cd50 6e 0a 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73  n.  ** that does
1cd60 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 79   not require any
1cd70 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 28   source tables (
1cd80 49 4f 57 3a 20 61 20 70 6c 61 6e 20 77 69 74 68  IOW: a plan with
1cd90 20 6d 42 65 73 74 3d 3d 30 29 2c 0a 20 20 2a 2a   mBest==0),.  **
1cda0 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
1cdb0 6f 20 70 6f 69 6e 74 20 69 6e 20 6d 61 6b 69 6e  o point in makin
1cdc0 67 20 61 6e 79 20 66 75 72 74 68 65 72 20 63 61  g any further ca
1cdd0 6c 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64 65  lls to xBestInde
1cde0 78 28 29 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20  x() .  ** since 
1cdf0 74 68 65 79 20 77 69 6c 6c 20 61 6c 6c 20 72 65  they will all re
1ce00 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20 72 65  turn the same re
1ce10 73 75 6c 74 20 28 69 66 20 74 68 65 20 78 42 65  sult (if the xBe
1ce20 73 74 49 6e 64 65 78 28 29 0a 20 20 2a 2a 20 69  stIndex().  ** i
1ce30 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
1ce40 20 73 61 6e 65 29 2e 20 2a 2f 0a 20 20 69 66 28   sane). */.  if(
1ce50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1ce60 26 20 28 6d 42 65 73 74 20 3d 20 28 70 4e 65 77  & (mBest = (pNew
1ce70 2d 3e 70 72 65 72 65 71 20 26 20 7e 6d 50 72 65  ->prereq & ~mPre
1ce80 72 65 71 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  req))!=0 ){.    
1ce90 69 6e 74 20 73 65 65 6e 5a 65 72 6f 20 3d 20 30  int seenZero = 0
1cea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1ceb0 20 54 72 75 65 20 69 66 20 61 20 70 6c 61 6e 20   True if a plan 
1cec0 77 69 74 68 20 6e 6f 20 70 72 65 72 65 71 73 20  with no prereqs 
1ced0 73 65 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  seen */.    int 
1cee0 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 30  seenZeroNoIN = 0
1cef0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6c 61  ;         /* Pla
1cf00 6e 20 77 69 74 68 20 6e 6f 20 70 72 65 72 65 71  n with no prereq
1cf10 73 20 61 6e 64 20 6e 6f 20 49 4e 28 2e 2e 2e 29  s and no IN(...)
1cf20 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 42 69 74   seen */.    Bit
1cf30 6d 61 73 6b 20 6d 50 72 65 76 20 3d 20 30 3b 0a  mask mPrev = 0;.
1cf40 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 42 65 73      Bitmask mBes
1cf50 74 4e 6f 49 6e 20 3d 20 30 3b 0a 0a 20 20 20 20  tNoIn = 0;..    
1cf60 2f 2a 20 49 66 20 74 68 65 20 70 6c 61 6e 20 70  /* If the plan p
1cf70 72 6f 64 75 63 65 64 20 62 79 20 74 68 65 20 65  roduced by the e
1cf80 61 72 6c 69 65 72 20 63 61 6c 6c 20 75 73 65 73  arlier call uses
1cf90 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 74 65 72 6d   an IN(...) term
1cfa0 2c 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 78 42  , call.    ** xB
1cfb0 65 73 74 49 6e 64 65 78 20 61 67 61 69 6e 2c 20  estIndex again, 
1cfc0 74 68 69 73 20 74 69 6d 65 20 77 69 74 68 20 49  this time with I
1cfd0 4e 28 2e 2e 2e 29 20 74 65 72 6d 73 20 64 69 73  N(...) terms dis
1cfe0 61 62 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66  abled. */.    if
1cff0 28 20 62 49 6e 20 29 7b 0a 20 20 20 20 20 20 57  ( bIn ){.      W
1d000 48 45 52 45 54 52 41 43 45 28 30 78 34 30 2c 20  HERETRACE(0x40, 
1d010 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20  ("  VirtualOne: 
1d020 61 6c 6c 20 75 73 61 62 6c 65 20 77 2f 6f 20 49  all usable w/o I
1d030 4e 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 63  N\n"));.      rc
1d040 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56   = whereLoopAddV
1d050 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20 20  irtualOne(.     
1d060 20 20 20 20 20 70 42 75 69 6c 64 65 72 2c 20 6d       pBuilder, m
1d070 50 72 65 72 65 71 2c 20 41 4c 4c 42 49 54 53 2c  Prereq, ALLBITS,
1d080 20 57 4f 5f 49 4e 2c 20 70 2c 20 6d 4e 6f 4f 6d   WO_IN, p, mNoOm
1d090 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20 20 20  it, &bIn);.     
1d0a0 20 61 73 73 65 72 74 28 20 62 49 6e 3d 3d 30 20   assert( bIn==0 
1d0b0 29 3b 0a 20 20 20 20 20 20 6d 42 65 73 74 4e 6f  );.      mBestNo
1d0c0 49 6e 20 3d 20 70 4e 65 77 2d 3e 70 72 65 72 65  In = pNew->prere
1d0d0 71 20 26 20 7e 6d 50 72 65 72 65 71 3b 0a 20 20  q & ~mPrereq;.  
1d0e0 20 20 20 20 69 66 28 20 6d 42 65 73 74 4e 6f 49      if( mBestNoI
1d0f0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
1d100 73 65 65 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20 20  seenZero = 1;.  
1d110 20 20 20 20 20 20 73 65 65 6e 5a 65 72 6f 4e 6f        seenZeroNo
1d120 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  IN = 1;.      }.
1d130 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61      }..    /* Ca
1d140 6c 6c 20 78 42 65 73 74 49 6e 64 65 78 20 6f 6e  ll xBestIndex on
1d150 63 65 20 66 6f 72 20 65 61 63 68 20 64 69 73 74  ce for each dist
1d160 69 6e 63 74 20 76 61 6c 75 65 20 6f 66 20 28 70  inct value of (p
1d170 72 65 72 65 71 52 69 67 68 74 20 26 20 7e 6d 50  rereqRight & ~mP
1d180 72 65 72 65 71 29 20 0a 20 20 20 20 2a 2a 20 69  rereq) .    ** i
1d190 6e 20 74 68 65 20 73 65 74 20 6f 66 20 74 65 72  n the set of ter
1d1a0 6d 73 20 74 68 61 74 20 61 70 70 6c 79 20 74 6f  ms that apply to
1d1b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 69 72   the current vir
1d1c0 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 2a 2f 0a  tual table.  */.
1d1d0 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
1d1e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d1f0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 42    int i;.      B
1d200 69 74 6d 61 73 6b 20 6d 4e 65 78 74 20 3d 20 41  itmask mNext = A
1d210 4c 4c 42 49 54 53 3b 0a 20 20 20 20 20 20 61 73  LLBITS;.      as
1d220 73 65 72 74 28 20 6d 4e 65 78 74 3e 30 20 29 3b  sert( mNext>0 );
1d230 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1d240 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  i<nConstraint; i
1d250 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74  ++){.        Bit
1d260 6d 61 73 6b 20 6d 54 68 69 73 20 3d 20 28 0a 20  mask mThis = (. 
1d270 20 20 20 20 20 20 20 20 20 20 20 70 57 43 2d 3e             pWC->
1d280 61 5b 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  a[p->aConstraint
1d290 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 5d  [i].iTermOffset]
1d2a0 2e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 7e  .prereqRight & ~
1d2b0 6d 50 72 65 72 65 71 0a 20 20 20 20 20 20 20 20  mPrereq.        
1d2c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  );.        if( m
1d2d0 54 68 69 73 3e 6d 50 72 65 76 20 26 26 20 6d 54  This>mPrev && mT
1d2e0 68 69 73 3c 6d 4e 65 78 74 20 29 20 6d 4e 65 78  his<mNext ) mNex
1d2f0 74 20 3d 20 6d 54 68 69 73 3b 0a 20 20 20 20 20  t = mThis;.     
1d300 20 7d 0a 20 20 20 20 20 20 6d 50 72 65 76 20 3d   }.      mPrev =
1d310 20 6d 4e 65 78 74 3b 0a 20 20 20 20 20 20 69 66   mNext;.      if
1d320 28 20 6d 4e 65 78 74 3d 3d 41 4c 4c 42 49 54 53  ( mNext==ALLBITS
1d330 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1d340 69 66 28 20 6d 4e 65 78 74 3d 3d 6d 42 65 73 74  if( mNext==mBest
1d350 20 7c 7c 20 6d 4e 65 78 74 3d 3d 6d 42 65 73 74   || mNext==mBest
1d360 4e 6f 49 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NoIn ) continue;
1d370 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
1d380 45 28 30 78 34 30 2c 20 28 22 20 20 56 69 72 74  E(0x40, ("  Virt
1d390 75 61 6c 4f 6e 65 3a 20 6d 50 72 65 76 3d 25 30  ualOne: mPrev=%0
1d3a0 34 6c 6c 78 20 6d 4e 65 78 74 3d 25 30 34 6c 6c  4llx mNext=%04ll
1d3b0 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  x\n",.          
1d3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
1d3d0 6c 69 74 65 33 5f 75 69 6e 74 36 34 29 6d 50 72  lite3_uint64)mPr
1d3e0 65 76 2c 20 28 73 71 6c 69 74 65 33 5f 75 69 6e  ev, (sqlite3_uin
1d3f0 74 36 34 29 6d 4e 65 78 74 29 29 3b 0a 20 20 20  t64)mNext));.   
1d400 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1d410 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a  pAddVirtualOne(.
1d420 20 20 20 20 20 20 20 20 20 20 70 42 75 69 6c 64            pBuild
1d430 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 4e 65  er, mPrereq, mNe
1d440 78 74 7c 6d 50 72 65 72 65 71 2c 20 30 2c 20 70  xt|mPrereq, 0, p
1d450 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29  , mNoOmit, &bIn)
1d460 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
1d470 2d 3e 70 72 65 72 65 71 3d 3d 6d 50 72 65 72 65  ->prereq==mPrere
1d480 71 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 65  q ){.        see
1d490 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20  nZero = 1;.     
1d4a0 20 20 20 69 66 28 20 62 49 6e 3d 3d 30 20 29 20     if( bIn==0 ) 
1d4b0 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31  seenZeroNoIN = 1
1d4c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d4d0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
1d4e0 61 6c 6c 73 20 74 6f 20 78 42 65 73 74 49 6e 64  alls to xBestInd
1d4f0 65 78 28 29 20 69 6e 20 74 68 65 20 61 62 6f 76  ex() in the abov
1d500 65 20 6c 6f 6f 70 20 64 69 64 20 6e 6f 74 20 66  e loop did not f
1d510 69 6e 64 20 61 20 70 6c 61 6e 0a 20 20 20 20 2a  ind a plan.    *
1d520 2a 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  * that requires 
1d530 6e 6f 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73  no source tables
1d540 20 61 74 20 61 6c 6c 20 28 69 2e 65 2e 20 6f 6e   at all (i.e. on
1d550 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  e guaranteed to 
1d560 62 65 0a 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  be.    ** usable
1d570 29 2c 20 6d 61 6b 65 20 61 20 63 61 6c 6c 20 68  ), make a call h
1d580 65 72 65 20 77 69 74 68 20 61 6c 6c 20 73 6f 75  ere with all sou
1d590 72 63 65 20 74 61 62 6c 65 73 20 64 69 73 61 62  rce tables disab
1d5a0 6c 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  led */.    if( r
1d5b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1d5c0 73 65 65 6e 5a 65 72 6f 3d 3d 30 20 29 7b 0a 20  seenZero==0 ){. 
1d5d0 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1d5e0 30 78 34 30 2c 20 28 22 20 20 56 69 72 74 75 61  0x40, ("  Virtua
1d5f0 6c 4f 6e 65 3a 20 61 6c 6c 20 64 69 73 61 62 6c  lOne: all disabl
1d600 65 64 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  ed\n"));.      r
1d610 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1d620 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 20 20  VirtualOne(.    
1d630 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2c 20        pBuilder, 
1d640 6d 50 72 65 72 65 71 2c 20 6d 50 72 65 72 65 71  mPrereq, mPrereq
1d650 2c 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c  , 0, p, mNoOmit,
1d660 20 26 62 49 6e 29 3b 0a 20 20 20 20 20 20 69 66   &bIn);.      if
1d670 28 20 62 49 6e 3d 3d 30 20 29 20 73 65 65 6e 5a  ( bIn==0 ) seenZ
1d680 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20  eroNoIN = 1;.   
1d690 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1d6a0 65 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74  e calls to xBest
1d6b0 49 6e 64 65 78 28 29 20 68 61 76 65 20 73 6f 20  Index() have so 
1d6c0 66 61 72 20 66 61 69 6c 65 64 20 74 6f 20 66 69  far failed to fi
1d6d0 6e 64 20 61 20 70 6c 61 6e 0a 20 20 20 20 2a 2a  nd a plan.    **
1d6e0 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 6e   that requires n
1d6f0 6f 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20  o source tables 
1d700 61 74 20 61 6c 6c 20 61 6e 64 20 64 6f 65 73 20  at all and does 
1d710 6e 6f 74 20 75 73 65 20 61 6e 20 49 4e 28 2e 2e  not use an IN(..
1d720 2e 29 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  .).    ** operat
1d730 6f 72 2c 20 6d 61 6b 65 20 61 20 66 69 6e 61 6c  or, make a final
1d740 20 63 61 6c 6c 20 74 6f 20 6f 62 74 61 69 6e 20   call to obtain 
1d750 6f 6e 65 20 68 65 72 65 2e 20 20 2a 2f 0a 20 20  one here.  */.  
1d760 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d770 5f 4f 4b 20 26 26 20 73 65 65 6e 5a 65 72 6f 4e  _OK && seenZeroN
1d780 6f 49 4e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  oIN==0 ){.      
1d790 57 48 45 52 45 54 52 41 43 45 28 30 78 34 30 2c  WHERETRACE(0x40,
1d7a0 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a   ("  VirtualOne:
1d7b0 20 61 6c 6c 20 64 69 73 61 62 6c 65 64 20 61 6e   all disabled an
1d7c0 64 20 77 2f 6f 20 49 4e 5c 6e 22 29 29 3b 0a 20  d w/o IN\n"));. 
1d7d0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1d7e0 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65  oopAddVirtualOne
1d7f0 28 0a 20 20 20 20 20 20 20 20 20 20 70 42 75 69  (.          pBui
1d800 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d  lder, mPrereq, m
1d810 50 72 65 72 65 71 2c 20 57 4f 5f 49 4e 2c 20 70  Prereq, WO_IN, p
1d820 2c 20 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29  , mNoOmit, &bIn)
1d830 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1d840 66 28 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65  f( p->needToFree
1d850 49 64 78 53 74 72 20 29 20 73 71 6c 69 74 65 33  IdxStr ) sqlite3
1d860 5f 66 72 65 65 28 70 2d 3e 69 64 78 53 74 72 29  _free(p->idxStr)
1d870 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
1d880 65 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  eNN(pParse->db, 
1d890 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1d8a0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1d8b0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1d8c0 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TABLE */../*.** 
1d8d0 41 64 64 20 57 68 65 72 65 4c 6f 6f 70 20 65 6e  Add WhereLoop en
1d8e0 74 72 69 65 73 20 74 6f 20 68 61 6e 64 6c 65 20  tries to handle 
1d8f0 4f 52 20 74 65 72 6d 73 2e 20 20 54 68 69 73 20  OR terms.  This 
1d900 77 6f 72 6b 73 20 66 6f 72 20 65 69 74 68 65 72  works for either
1d910 0a 2a 2a 20 62 74 72 65 65 73 20 6f 72 20 76 69  .** btrees or vi
1d920 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 0a 2a 2f  rtual tables..*/
1d930 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
1d940 65 4c 6f 6f 70 41 64 64 4f 72 28 0a 20 20 57 68  eLoopAddOr(.  Wh
1d950 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
1d960 70 42 75 69 6c 64 65 72 2c 20 0a 20 20 42 69 74  pBuilder, .  Bit
1d970 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c 20 0a 20  mask mPrereq, . 
1d980 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62   Bitmask mUnusab
1d990 6c 65 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66  le.){.  WhereInf
1d9a0 6f 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69  o *pWInfo = pBui
1d9b0 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20  lder->pWInfo;.  
1d9c0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
1d9d0 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
1d9e0 4e 65 77 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  New;.  WhereTerm
1d9f0 20 2a 70 54 65 72 6d 2c 20 2a 70 57 43 45 6e 64   *pTerm, *pWCEnd
1da00 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1da10 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 43  ITE_OK;.  int iC
1da20 75 72 3b 0a 20 20 57 68 65 72 65 43 6c 61 75 73  ur;.  WhereClaus
1da30 65 20 74 65 6d 70 57 43 3b 0a 20 20 57 68 65 72  e tempWC;.  Wher
1da40 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 53 75  eLoopBuilder sSu
1da50 62 42 75 69 6c 64 3b 0a 20 20 57 68 65 72 65 4f  bBuild;.  WhereO
1da60 72 53 65 74 20 73 53 75 6d 2c 20 73 43 75 72 3b  rSet sSum, sCur;
1da70 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1da80 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1da90 20 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64   .  pWC = pBuild
1daa0 65 72 2d 3e 70 57 43 3b 0a 20 20 70 57 43 45 6e  er->pWC;.  pWCEn
1dab0 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57 43  d = pWC->a + pWC
1dac0 2d 3e 6e 54 65 72 6d 3b 0a 20 20 70 4e 65 77 20  ->nTerm;.  pNew 
1dad0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
1dae0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 75 6d  ;.  memset(&sSum
1daf0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 75 6d  , 0, sizeof(sSum
1db00 29 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20 70 57  ));.  pItem = pW
1db10 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
1db20 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61 62 3b 0a  a + pNew->iTab;.
1db30 20 20 69 43 75 72 20 3d 20 70 49 74 65 6d 2d 3e    iCur = pItem->
1db40 69 43 75 72 73 6f 72 3b 0a 0a 20 20 66 6f 72 28  iCursor;..  for(
1db50 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54  pTerm=pWC->a; pT
1db60 65 72 6d 3c 70 57 43 45 6e 64 20 26 26 20 72 63  erm<pWCEnd && rc
1db70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 70 54 65  ==SQLITE_OK; pTe
1db80 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 28  rm++){.    if( (
1db90 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1dba0 20 26 20 57 4f 5f 4f 52 29 21 3d 30 0a 20 20 20   & WO_OR)!=0.   
1dbb0 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e 70    && (pTerm->u.p
1dbc0 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c  OrInfo->indexabl
1dbd0 65 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b 53 65  e & pNew->maskSe
1dbe0 6c 66 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20  lf)!=0 .    ){. 
1dbf0 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65       WhereClause
1dc00 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d   * const pOrWC =
1dc10 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   &pTerm->u.pOrIn
1dc20 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68  fo->wc;.      Wh
1dc30 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20  ereTerm * const 
1dc40 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57  pOrWCEnd = &pOrW
1dc50 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72  C->a[pOrWC->nTer
1dc60 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54  m];.      WhereT
1dc70 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20  erm *pOrTerm;.  
1dc80 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31      int once = 1
1dc90 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  ;.      int i, j
1dca0 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 73 53 75  ;.    .      sSu
1dcb0 62 42 75 69 6c 64 20 3d 20 2a 70 42 75 69 6c 64  bBuild = *pBuild
1dcc0 65 72 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75  er;.      sSubBu
1dcd0 69 6c 64 2e 70 4f 72 64 65 72 42 79 20 3d 20 30  ild.pOrderBy = 0
1dce0 3b 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c  ;.      sSubBuil
1dcf0 64 2e 70 4f 72 53 65 74 20 3d 20 26 73 43 75 72  d.pOrSet = &sCur
1dd00 3b 0a 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  ;..      WHERETR
1dd10 41 43 45 28 30 78 32 30 30 2c 20 28 22 42 65 67  ACE(0x200, ("Beg
1dd20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52  in processing OR
1dd30 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70  -clause %p\n", p
1dd40 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 66 6f  Term));.      fo
1dd50 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d  r(pOrTerm=pOrWC-
1dd60 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57  >a; pOrTerm<pOrW
1dd70 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29  CEnd; pOrTerm++)
1dd80 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
1dd90 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
1dda0 72 20 26 20 57 4f 5f 41 4e 44 29 21 3d 30 20 29  r & WO_AND)!=0 )
1ddb0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75 62  {.          sSub
1ddc0 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 70 4f 72  Build.pWC = &pOr
1ddd0 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  Term->u.pAndInfo
1dde0 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 7d 65  ->wc;.        }e
1ddf0 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d  lse if( pOrTerm-
1de00 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
1de10 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  r ){.          t
1de20 65 6d 70 57 43 2e 70 57 49 6e 66 6f 20 3d 20 70  empWC.pWInfo = p
1de30 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 20 20  WC->pWInfo;.    
1de40 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4f 75        tempWC.pOu
1de50 74 65 72 20 3d 20 70 57 43 3b 0a 20 20 20 20 20  ter = pWC;.     
1de60 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d       tempWC.op =
1de70 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20   TK_AND;.       
1de80 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20     tempWC.nTerm 
1de90 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 1;.          t
1dea0 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72  empWC.a = pOrTer
1deb0 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  m;.          sSu
1dec0 62 42 75 69 6c 64 2e 70 57 43 20 3d 20 26 74 65  bBuild.pWC = &te
1ded0 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 7d 65  mpWC;.        }e
1dee0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
1def0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1df00 20 7d 0a 20 20 20 20 20 20 20 20 73 43 75 72 2e   }.        sCur.
1df10 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 57 48  n = 0;.#ifdef WH
1df20 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
1df30 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52  .        WHERETR
1df40 41 43 45 28 30 78 32 30 30 2c 20 28 22 4f 52 2d  ACE(0x200, ("OR-
1df50 74 65 72 6d 20 25 64 20 6f 66 20 25 70 20 68 61  term %d of %p ha
1df60 73 20 25 64 20 73 75 62 74 65 72 6d 73 3a 5c 6e  s %d subterms:\n
1df70 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
1df80 20 20 20 20 20 20 20 28 69 6e 74 29 28 70 4f 72         (int)(pOr
1df90 54 65 72 6d 2d 70 4f 72 57 43 2d 3e 61 29 2c 20  Term-pOrWC->a), 
1dfa0 70 54 65 72 6d 2c 20 73 53 75 62 42 75 69 6c 64  pTerm, sSubBuild
1dfb0 2e 70 57 43 2d 3e 6e 54 65 72 6d 29 29 3b 0a 20  .pWC->nTerm));. 
1dfc0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1dfd0 65 33 57 68 65 72 65 54 72 61 63 65 20 26 20 30  e3WhereTrace & 0
1dfe0 78 34 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x400 ){.        
1dff0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c    sqlite3WhereCl
1e000 61 75 73 65 50 72 69 6e 74 28 73 53 75 62 42 75  ausePrint(sSubBu
1e010 69 6c 64 2e 70 57 43 29 3b 0a 20 20 20 20 20 20  ild.pWC);.      
1e020 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64    }.#endif.#ifnd
1e030 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1e040 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
1e050 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
1e060 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29  l(pItem->pTab) )
1e070 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1e080 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
1e090 74 75 61 6c 28 26 73 53 75 62 42 75 69 6c 64 2c  tual(&sSubBuild,
1e0a0 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75 73 61   mPrereq, mUnusa
1e0b0 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ble);.        }e
1e0c0 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  lse.#endif.     
1e0d0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72     {.          r
1e0e0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1e0f0 42 74 72 65 65 28 26 73 53 75 62 42 75 69 6c 64  Btree(&sSubBuild
1e100 2c 20 6d 50 72 65 72 65 71 29 3b 0a 20 20 20 20  , mPrereq);.    
1e110 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1e120 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e130 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1e140 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f 72  = whereLoopAddOr
1e150 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72  (&sSubBuild, mPr
1e160 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29  ereq, mUnusable)
1e170 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e180 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
1e190 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 43 75  SQLITE_OK || sCu
1e1a0 72 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  r.n==0 );.      
1e1b0 20 20 69 66 28 20 73 43 75 72 2e 6e 3d 3d 30 20    if( sCur.n==0 
1e1c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 53 75  ){.          sSu
1e1d0 6d 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  m.n = 0;.       
1e1e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1e1f0 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 63 65    }else if( once
1e200 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68   ){.          wh
1e210 65 72 65 4f 72 4d 6f 76 65 28 26 73 53 75 6d 2c  ereOrMove(&sSum,
1e220 20 26 73 43 75 72 29 3b 0a 20 20 20 20 20 20 20   &sCur);.       
1e230 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20     once = 0;.   
1e240 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e250 20 20 20 20 20 20 57 68 65 72 65 4f 72 53 65 74        WhereOrSet
1e260 20 73 50 72 65 76 3b 0a 20 20 20 20 20 20 20 20   sPrev;.        
1e270 20 20 77 68 65 72 65 4f 72 4d 6f 76 65 28 26 73    whereOrMove(&s
1e280 50 72 65 76 2c 20 26 73 53 75 6d 29 3b 0a 20 20  Prev, &sSum);.  
1e290 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d          sSum.n =
1e2a0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   0;.          fo
1e2b0 72 28 69 3d 30 3b 20 69 3c 73 50 72 65 76 2e 6e  r(i=0; i<sPrev.n
1e2c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1e2d0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73      for(j=0; j<s
1e2e0 43 75 72 2e 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  Cur.n; j++){.   
1e2f0 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65             where
1e300 4f 72 49 6e 73 65 72 74 28 26 73 53 75 6d 2c 20  OrInsert(&sSum, 
1e310 73 50 72 65 76 2e 61 5b 69 5d 2e 70 72 65 72 65  sPrev.a[i].prere
1e320 71 20 7c 20 73 43 75 72 2e 61 5b 6a 5d 2e 70 72  q | sCur.a[j].pr
1e330 65 72 65 71 2c 0a 20 20 20 20 20 20 20 20 20 20  ereq,.          
1e340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e350 20 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41    sqlite3LogEstA
1e360 64 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 72 52  dd(sPrev.a[i].rR
1e370 75 6e 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 72 52  un, sCur.a[j].rR
1e380 75 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  un),.           
1e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3a0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64   sqlite3LogEstAd
1e3b0 64 28 73 50 72 65 76 2e 61 5b 69 5d 2e 6e 4f 75  d(sPrev.a[i].nOu
1e3c0 74 2c 20 73 43 75 72 2e 61 5b 6a 5d 2e 6e 4f 75  t, sCur.a[j].nOu
1e3d0 74 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t));.           
1e3e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1e3f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e400 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54  .      pNew->nLT
1e410 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  erm = 1;.      p
1e420 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d  New->aLTerm[0] =
1e430 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4e   pTerm;.      pN
1e440 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48  ew->wsFlags = WH
1e450 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20  ERE_MULTI_OR;.  
1e460 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70      pNew->rSetup
1e470 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
1e480 2d 3e 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a  ->iSortIdx = 0;.
1e490 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 4e        memset(&pN
1e4a0 65 77 2d 3e 75 2c 20 30 2c 20 73 69 7a 65 6f 66  ew->u, 0, sizeof
1e4b0 28 70 4e 65 77 2d 3e 75 29 29 3b 0a 20 20 20 20  (pNew->u));.    
1e4c0 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
1e4d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73 53  QLITE_OK && i<sS
1e4e0 75 6d 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  um.n; i++){.    
1e4f0 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
1e500 75 72 72 65 6e 74 6c 79 20 73 53 75 6d 2e 61 5b  urrently sSum.a[
1e510 69 5d 2e 72 52 75 6e 20 69 73 20 73 65 74 20 74  i].rRun is set t
1e520 6f 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  o the sum of the
1e530 20 63 6f 73 74 73 0a 20 20 20 20 20 20 20 20 2a   costs.        *
1e540 2a 20 6f 66 20 61 6c 6c 20 73 75 62 2d 73 63 61  * of all sub-sca
1e550 6e 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  ns required by t
1e560 68 65 20 4f 52 2d 73 63 61 6e 2e 20 48 6f 77 65  he OR-scan. Howe
1e570 76 65 72 2c 20 64 75 65 20 74 6f 20 72 6f 75 6e  ver, due to roun
1e580 64 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  ding.        ** 
1e590 65 72 72 6f 72 73 2c 20 69 74 20 6d 61 79 20 62  errors, it may b
1e5a0 65 20 74 68 61 74 20 74 68 65 20 63 6f 73 74 20  e that the cost 
1e5b0 6f 66 20 74 68 65 20 4f 52 2d 73 63 61 6e 20 69  of the OR-scan i
1e5c0 73 20 65 71 75 61 6c 20 74 6f 20 69 74 73 0a 20  s equal to its. 
1e5d0 20 20 20 20 20 20 20 2a 2a 20 6d 6f 73 74 20 65         ** most e
1e5e0 78 70 65 6e 73 69 76 65 20 73 75 62 2d 73 63 61  xpensive sub-sca
1e5f0 6e 2e 20 41 64 64 20 74 68 65 20 73 6d 61 6c 6c  n. Add the small
1e600 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 65 6e  est possible pen
1e610 61 6c 74 79 20 0a 20 20 20 20 20 20 20 20 2a 2a  alty .        **
1e620 20 28 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20   (equivalent to 
1e630 6d 75 6c 74 69 70 6c 79 69 6e 67 20 74 68 65 20  multiplying the 
1e640 63 6f 73 74 20 62 79 20 31 2e 30 37 29 20 74 6f  cost by 1.07) to
1e650 20 65 6e 73 75 72 65 20 74 68 61 74 20 0a 20 20   ensure that .  
1e660 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 64 6f        ** this do
1e670 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 2e 20 4f  es not happen. O
1e680 74 68 65 72 77 69 73 65 2c 20 66 6f 72 20 57 48  therwise, for WH
1e690 45 52 45 20 63 6c 61 75 73 65 73 20 73 75 63 68  ERE clauses such
1e6a0 20 61 73 20 74 68 65 0a 20 20 20 20 20 20 20 20   as the.        
1e6b0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68 65  ** following whe
1e6c0 72 65 20 74 68 65 72 65 20 69 73 20 61 6e 20 69  re there is an i
1e6d0 6e 64 65 78 20 6f 6e 20 22 79 22 3a 0a 20 20 20  ndex on "y":.   
1e6e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1e6f0 2a 2a 20 20 20 20 20 57 48 45 52 45 20 6c 69 6b  **     WHERE lik
1e700 65 6c 69 68 6f 6f 64 28 78 3d 3f 2c 20 30 2e 39  elihood(x=?, 0.9
1e710 39 29 20 4f 52 20 79 3d 3f 0a 20 20 20 20 20 20  9) OR y=?.      
1e720 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
1e730 74 68 65 20 70 6c 61 6e 6e 65 72 20 6d 61 79 20  the planner may 
1e740 65 6c 65 63 74 20 74 6f 20 22 4f 52 22 20 74 6f  elect to "OR" to
1e750 67 65 74 68 65 72 20 61 20 66 75 6c 6c 2d 74 61  gether a full-ta
1e760 62 6c 65 20 73 63 61 6e 20 61 6e 64 20 61 6e 0a  ble scan and an.
1e770 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78          ** index
1e780 20 6c 6f 6f 6b 75 70 2e 20 41 6e 64 20 6f 74 68   lookup. And oth
1e790 65 72 20 73 69 6d 69 6c 61 72 6c 79 20 6f 64 64  er similarly odd
1e7a0 20 72 65 73 75 6c 74 73 2e 20 20 2a 2f 0a 20 20   results.  */.  
1e7b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
1e7c0 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75   = sSum.a[i].rRu
1e7d0 6e 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 70  n + 1;.        p
1e7e0 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 53 75 6d  New->nOut = sSum
1e7f0 2e 61 5b 69 5d 2e 6e 4f 75 74 3b 0a 20 20 20 20  .a[i].nOut;.    
1e800 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
1e810 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e 70 72 65   = sSum.a[i].pre
1e820 72 65 71 3b 0a 20 20 20 20 20 20 20 20 72 63 20  req;.        rc 
1e830 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  = whereLoopInser
1e840 74 28 70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77  t(pBuilder, pNew
1e850 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1e860 20 57 48 45 52 45 54 52 41 43 45 28 30 78 32 30   WHERETRACE(0x20
1e870 30 2c 20 28 22 45 6e 64 20 70 72 6f 63 65 73 73  0, ("End process
1e880 69 6e 67 20 4f 52 2d 63 6c 61 75 73 65 20 25 70  ing OR-clause %p
1e890 5c 6e 22 2c 20 70 54 65 72 6d 29 29 3b 0a 20 20  \n", pTerm));.  
1e8a0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1e8b0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
1e8c0 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20  d all WhereLoop 
1e8d0 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c 20  objects for all 
1e8e0 74 61 62 6c 65 73 20 0a 2a 2f 0a 73 74 61 74 69  tables .*/.stati
1e8f0 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
1e900 64 64 41 6c 6c 28 57 68 65 72 65 4c 6f 6f 70 42  ddAll(WhereLoopB
1e910 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
1e920 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  ){.  WhereInfo *
1e930 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
1e940 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 42 69 74  r->pWInfo;.  Bit
1e950 6d 61 73 6b 20 6d 50 72 65 72 65 71 20 3d 20 30  mask mPrereq = 0
1e960 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 69  ;.  Bitmask mPri
1e970 6f 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54  or = 0;.  int iT
1e980 61 62 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ab;.  SrcList *p
1e990 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
1e9a0 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 74  ->pTabList;.  st
1e9b0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1e9c0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 74 72 75  m *pItem;.  stru
1e9d0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1e9e0 2a 70 45 6e 64 20 3d 20 26 70 54 61 62 4c 69 73  *pEnd = &pTabLis
1e9f0 74 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65  t->a[pWInfo->nLe
1ea00 76 65 6c 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20  vel];.  sqlite3 
1ea10 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  *db = pWInfo->pP
1ea20 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
1ea30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1ea40 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
1ea50 77 3b 0a 20 20 75 38 20 70 72 69 6f 72 4a 6f 69  w;.  u8 priorJoi
1ea60 6e 74 79 70 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a  ntype = 0;..  /*
1ea70 20 4c 6f 6f 70 20 6f 76 65 72 20 74 68 65 20 74   Loop over the t
1ea80 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69  ables in the joi
1ea90 6e 2c 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20  n, from left to 
1eaa0 72 69 67 68 74 20 2a 2f 0a 20 20 70 4e 65 77 20  right */.  pNew 
1eab0 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
1eac0 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69  ;.  whereLoopIni
1ead0 74 28 70 4e 65 77 29 3b 0a 20 20 66 6f 72 28 69  t(pNew);.  for(i
1eae0 54 61 62 3d 30 2c 20 70 49 74 65 6d 3d 70 54 61  Tab=0, pItem=pTa
1eaf0 62 4c 69 73 74 2d 3e 61 3b 20 70 49 74 65 6d 3c  bList->a; pItem<
1eb00 70 45 6e 64 3b 20 69 54 61 62 2b 2b 2c 20 70 49  pEnd; iTab++, pI
1eb10 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 42 69 74 6d  tem++){.    Bitm
1eb20 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 20 3d 20  ask mUnusable = 
1eb30 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69 54 61  0;.    pNew->iTa
1eb40 62 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 4e  b = iTab;.    pN
1eb50 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d 20 73  ew->maskSelf = s
1eb60 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61  qlite3WhereGetMa
1eb70 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
1eb80 6b 53 65 74 2c 20 70 49 74 65 6d 2d 3e 69 43 75  kSet, pItem->iCu
1eb90 72 73 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 28  rsor);.    if( (
1eba0 28 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74  (pItem->fg.joint
1ebb0 79 70 65 7c 70 72 69 6f 72 4a 6f 69 6e 74 79 70  ype|priorJointyp
1ebc0 65 29 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  e) & (JT_LEFT|JT
1ebd0 5f 43 52 4f 53 53 29 29 21 3d 30 20 29 7b 0a 20  _CROSS))!=0 ){. 
1ebe0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e       /* This con
1ebf0 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 77  dition is true w
1ec00 68 65 6e 20 70 49 74 65 6d 20 69 73 20 74 68 65  hen pItem is the
1ec10 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1ec20 6d 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  m on the.      *
1ec30 2a 20 72 69 67 68 74 2d 68 61 6e 64 2d 73 69 64  * right-hand-sid
1ec40 65 20 6f 66 20 61 20 4c 45 46 54 20 6f 72 20 43  e of a LEFT or C
1ec50 52 4f 53 53 20 4a 4f 49 4e 2e 20 20 2a 2f 0a 20  ROSS JOIN.  */. 
1ec60 20 20 20 20 20 6d 50 72 65 72 65 71 20 3d 20 6d       mPrereq = m
1ec70 50 72 69 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  Prior;.    }.   
1ec80 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20 3d   priorJointype =
1ec90 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74   pItem->fg.joint
1eca0 79 70 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ype;.#ifndef SQL
1ecb0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1ecc0 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 49 73  TABLE.    if( Is
1ecd0 56 69 72 74 75 61 6c 28 70 49 74 65 6d 2d 3e 70  Virtual(pItem->p
1ece0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 73 74  Tab) ){.      st
1ecf0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1ed00 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  m *p;.      for(
1ed10 70 3d 26 70 49 74 65 6d 5b 31 5d 3b 20 70 3c 70  p=&pItem[1]; p<p
1ed20 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20  End; p++){.     
1ed30 20 20 20 69 66 28 20 6d 55 6e 75 73 61 62 6c 65     if( mUnusable
1ed40 20 7c 7c 20 28 70 2d 3e 66 67 2e 6a 6f 69 6e 74   || (p->fg.joint
1ed50 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  ype & (JT_LEFT|J
1ed60 54 5f 43 52 4f 53 53 29 29 20 29 7b 0a 20 20 20  T_CROSS)) ){.   
1ed70 20 20 20 20 20 20 20 6d 55 6e 75 73 61 62 6c 65         mUnusable
1ed80 20 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65   |= sqlite3Where
1ed90 47 65 74 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d  GetMask(&pWInfo-
1eda0 3e 73 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 43  >sMaskSet, p->iC
1edb0 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  ursor);.        
1edc0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1edd0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
1ede0 64 56 69 72 74 75 61 6c 28 70 42 75 69 6c 64 65  dVirtual(pBuilde
1edf0 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75  r, mPrereq, mUnu
1ee00 73 61 62 6c 65 29 3b 0a 20 20 20 20 7d 65 6c 73  sable);.    }els
1ee10 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  e.#endif /* SQLI
1ee20 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1ee30 41 42 4c 45 20 2a 2f 0a 20 20 20 20 7b 0a 20 20  ABLE */.    {.  
1ee40 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1ee50 6f 70 41 64 64 42 74 72 65 65 28 70 42 75 69 6c  opAddBtree(pBuil
1ee60 64 65 72 2c 20 6d 50 72 65 72 65 71 29 3b 0a 20  der, mPrereq);. 
1ee70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
1ee80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ee90 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1eea0 6f 70 41 64 64 4f 72 28 70 42 75 69 6c 64 65 72  opAddOr(pBuilder
1eeb0 2c 20 6d 50 72 65 72 65 71 2c 20 6d 55 6e 75 73  , mPrereq, mUnus
1eec0 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  able);.    }.   
1eed0 20 6d 50 72 69 6f 72 20 7c 3d 20 70 4e 65 77 2d   mPrior |= pNew-
1eee0 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69  >maskSelf;.    i
1eef0 66 28 20 72 63 20 7c 7c 20 64 62 2d 3e 6d 61 6c  f( rc || db->mal
1ef00 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
1ef10 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 65 72 65 4c  k;.  }..  whereL
1ef20 6f 6f 70 43 6c 65 61 72 28 64 62 2c 20 70 4e 65  oopClear(db, pNe
1ef30 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  w);.  return rc;
1ef40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 61 6d 69 6e  .}../*.** Examin
1ef50 65 20 61 20 57 68 65 72 65 50 61 74 68 20 28 77  e a WherePath (w
1ef60 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e  ith the addition
1ef70 20 6f 66 20 74 68 65 20 65 78 74 72 61 20 57 68   of the extra Wh
1ef80 65 72 65 4c 6f 6f 70 20 6f 66 20 74 68 65 20 36  ereLoop of the 6
1ef90 74 68 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  th.** parameters
1efa0 29 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6f  ) to see if it o
1efb0 75 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 74  utputs rows in t
1efc0 68 65 20 72 65 71 75 65 73 74 65 64 20 4f 52 44  he requested ORD
1efd0 45 52 20 42 59 0a 2a 2a 20 28 6f 72 20 47 52 4f  ER BY.** (or GRO
1efe0 55 50 20 42 59 29 20 77 69 74 68 6f 75 74 20 72  UP BY) without r
1eff0 65 71 75 69 72 69 6e 67 20 61 20 73 65 70 61 72  equiring a separ
1f000 61 74 65 20 73 6f 72 74 20 6f 70 65 72 61 74 69  ate sort operati
1f010 6f 6e 2e 20 20 52 65 74 75 72 6e 20 4e 3a 0a 2a  on.  Return N:.*
1f020 2a 20 0a 2a 2a 20 20 20 4e 3e 30 3a 20 20 20 4e  * .**   N>0:   N
1f030 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
1f040 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
1f050 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 20  e satisfied.**  
1f060 20 4e 3d 3d 30 3a 20 20 4e 6f 20 74 65 72 6d 73   N==0:  No terms
1f070 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
1f080 20 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69   clause are sati
1f090 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3c 30 3a 20  sfied.**   N<0: 
1f0a0 20 20 55 6e 6b 6e 6f 77 6e 20 79 65 74 20 68 6f    Unknown yet ho
1f0b0 77 20 6d 61 6e 79 20 74 65 72 6d 73 20 6f 66 20  w many terms of 
1f0c0 4f 52 44 45 52 20 42 59 20 6d 69 67 68 74 20 62  ORDER BY might b
1f0d0 65 20 73 61 74 69 73 66 69 65 64 2e 20 20 20 0a  e satisfied.   .
1f0e0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
1f0f0 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 57  processing for W
1f100 48 45 52 45 5f 47 52 4f 55 50 42 59 20 61 6e 64  HERE_GROUPBY and
1f110 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
1f120 59 20 69 73 20 6e 6f 74 20 61 73 0a 2a 2a 20 73  Y is not as.** s
1f130 74 72 69 63 74 2e 20 20 57 69 74 68 20 47 52 4f  trict.  With GRO
1f140 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
1f150 43 54 20 74 68 65 20 6f 6e 6c 79 20 72 65 71 75  CT the only requ
1f160 69 72 65 6d 65 6e 74 20 69 73 20 74 68 61 74 0a  irement is that.
1f170 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 72 6f  ** equivalent ro
1f180 77 73 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69  ws appear immedi
1f190 61 74 65 6c 79 20 61 64 6a 61 63 65 6e 74 20 74  ately adjacent t
1f1a0 6f 20 6f 6e 65 20 61 6e 6f 74 68 65 72 2e 20 20  o one another.  
1f1b0 47 52 4f 55 50 20 42 59 0a 2a 2a 20 61 6e 64 20  GROUP BY.** and 
1f1c0 44 49 53 54 49 4e 43 54 20 64 6f 20 6e 6f 74 20  DISTINCT do not 
1f1d0 72 65 71 75 69 72 65 20 72 6f 77 73 20 74 6f 20  require rows to 
1f1e0 61 70 70 65 61 72 20 69 6e 20 61 6e 79 20 70 61  appear in any pa
1f1f0 72 74 69 63 75 6c 61 72 20 6f 72 64 65 72 20 61  rticular order a
1f200 73 20 6c 6f 6e 67 0a 2a 2a 20 61 73 20 65 71 75  s long.** as equ
1f210 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 72 65  ivalent rows are
1f220 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
1f230 72 2e 20 20 54 68 75 73 20 66 6f 72 20 47 52 4f  r.  Thus for GRO
1f240 55 50 20 42 59 20 61 6e 64 20 44 49 53 54 49 4e  UP BY and DISTIN
1f250 43 54 0a 2a 2a 20 74 68 65 20 70 4f 72 64 65 72  CT.** the pOrder
1f260 42 79 20 74 65 72 6d 73 20 63 61 6e 20 62 65 20  By terms can be 
1f270 6d 61 74 63 68 65 64 20 69 6e 20 61 6e 79 20 6f  matched in any o
1f280 72 64 65 72 2e 20 20 57 69 74 68 20 4f 52 44 45  rder.  With ORDE
1f290 52 20 42 59 2c 20 74 68 65 20 0a 2a 2a 20 70 4f  R BY, the .** pO
1f2a0 72 64 65 72 42 79 20 74 65 72 6d 73 20 6d 75 73  rderBy terms mus
1f2b0 74 20 62 65 20 6d 61 74 63 68 65 64 20 69 6e 20  t be matched in 
1f2c0 73 74 72 69 63 74 20 6c 65 66 74 2d 74 6f 2d 72  strict left-to-r
1f2d0 69 67 68 74 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ight order..*/.s
1f2e0 74 61 74 69 63 20 69 38 20 77 68 65 72 65 50 61  tatic i8 wherePa
1f2f0 74 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72  thSatisfiesOrder
1f300 42 79 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20  By(.  WhereInfo 
1f310 2a 70 57 49 6e 66 6f 2c 20 20 20 20 2f 2a 20 54  *pWInfo,    /* T
1f320 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1f330 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
1f340 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 4f 52  OrderBy,   /* OR
1f350 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
1f360 42 59 20 6f 72 20 44 49 53 54 49 4e 43 54 20 63  BY or DISTINCT c
1f370 6c 61 75 73 65 20 74 6f 20 63 68 65 63 6b 20 2a  lause to check *
1f380 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
1f390 50 61 74 68 2c 20 20 20 20 20 2f 2a 20 54 68 65  Path,     /* The
1f3a0 20 57 68 65 72 65 50 61 74 68 20 74 6f 20 63 68   WherePath to ch
1f3b0 65 63 6b 20 2a 2f 0a 20 20 75 31 36 20 77 63 74  eck */.  u16 wct
1f3c0 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 20 2f  rlFlags,       /
1f3d0 2a 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  * WHERE_GROUPBY 
1f3e0 6f 72 20 5f 44 49 53 54 49 4e 43 54 42 59 20 6f  or _DISTINCTBY o
1f3f0 72 20 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54  r _ORDERBY_LIMIT
1f400 20 2a 2f 0a 20 20 75 31 36 20 6e 4c 6f 6f 70 2c   */.  u16 nLoop,
1f410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1f420 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
1f430 20 69 6e 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70   in pPath->aLoop
1f440 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  [] */.  WhereLoo
1f450 70 20 2a 70 4c 61 73 74 2c 20 20 20 20 20 2f 2a  p *pLast,     /*
1f460 20 41 64 64 20 74 68 69 73 20 57 68 65 72 65 4c   Add this WhereL
1f470 6f 6f 70 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  oop to the end o
1f480 66 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d  f pPath->aLoop[]
1f490 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 2a 70   */.  Bitmask *p
1f4a0 52 65 76 4d 61 73 6b 20 20 20 20 20 2f 2a 20 4f  RevMask     /* O
1f4b0 55 54 3a 20 4d 61 73 6b 20 6f 66 20 57 68 65 72  UT: Mask of Wher
1f4c0 65 4c 6f 6f 70 73 20 74 6f 20 72 75 6e 20 69 6e  eLoops to run in
1f4d0 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
1f4e0 2f 0a 29 7b 0a 20 20 75 38 20 72 65 76 53 65 74  /.){.  u8 revSet
1f4f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1f500 54 72 75 65 20 69 66 20 72 65 76 20 69 73 20 6b  True if rev is k
1f510 6e 6f 77 6e 20 2a 2f 0a 20 20 75 38 20 72 65 76  nown */.  u8 rev
1f520 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f530 2f 2a 20 43 6f 6d 70 6f 73 69 74 65 20 73 6f 72  /* Composite sor
1f540 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20  t order */.  u8 
1f550 72 65 76 49 64 78 3b 20 20 20 20 20 20 20 20 20  revIdx;         
1f560 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 6f 72 74     /* Index sort
1f570 20 6f 72 64 65 72 20 2a 2f 0a 20 20 75 38 20 69   order */.  u8 i
1f580 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3b 20  sOrderDistinct; 
1f590 20 20 2f 2a 20 41 6c 6c 20 70 72 69 6f 72 20 57    /* All prior W
1f5a0 68 65 72 65 4c 6f 6f 70 73 20 61 72 65 20 6f 72  hereLoops are or
1f5b0 64 65 72 2d 64 69 73 74 69 6e 63 74 20 2a 2f 0a  der-distinct */.
1f5c0 20 20 75 38 20 64 69 73 74 69 6e 63 74 43 6f 6c    u8 distinctCol
1f5d0 75 6d 6e 73 3b 20 20 20 2f 2a 20 54 72 75 65 20  umns;   /* True 
1f5e0 69 66 20 74 68 65 20 6c 6f 6f 70 20 68 61 73 20  if the loop has 
1f5f0 55 4e 49 51 55 45 20 4e 4f 54 20 4e 55 4c 4c 20  UNIQUE NOT NULL 
1f600 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75 38 20  columns */.  u8 
1f610 69 73 4d 61 74 63 68 3b 20 20 20 20 20 20 20 20  isMatch;        
1f620 20 20 20 2f 2a 20 69 43 6f 6c 75 6d 6e 20 6d 61     /* iColumn ma
1f630 74 63 68 65 73 20 61 20 74 65 72 6d 20 6f 66 20  tches a term of 
1f640 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1f650 75 73 65 20 2a 2f 0a 20 20 75 31 36 20 65 71 4f  use */.  u16 eqO
1f660 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 2f  pMask;         /
1f670 2a 20 41 6c 6c 6f 77 65 64 20 65 71 75 61 6c 69  * Allowed equali
1f680 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  ty operators */.
1f690 20 20 75 31 36 20 6e 4b 65 79 43 6f 6c 3b 20 20    u16 nKeyCol;  
1f6a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1f6b0 72 20 6f 66 20 6b 65 79 20 63 6f 6c 75 6d 6e 73  r of key columns
1f6c0 20 69 6e 20 70 49 6e 64 65 78 20 2a 2f 0a 20 20   in pIndex */.  
1f6d0 75 31 36 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20  u16 nColumn;    
1f6e0 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
1f6f0 75 6d 62 65 72 20 6f 66 20 6f 72 64 65 72 65 64  umber of ordered
1f700 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
1f710 69 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e  index */.  u16 n
1f720 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20 20  OrderBy;        
1f730 20 2f 2a 20 4e 75 6d 62 65 72 20 74 65 72 6d 73   /* Number terms
1f740 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
1f750 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
1f760 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20   iLoop;         
1f770 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 57     /* Index of W
1f780 68 65 72 65 4c 6f 6f 70 20 69 6e 20 70 50 61 74  hereLoop in pPat
1f790 68 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65  h being processe
1f7a0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  d */.  int i, j;
1f7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f7c0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
1f7d0 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
1f7e0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
1f7f0 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 63 75  or number for cu
1f800 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20  rrent WhereLoop 
1f810 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
1f820 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ;          /* A 
1f830 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69  column number wi
1f840 74 68 69 6e 20 74 61 62 6c 65 20 69 43 75 72 20  thin table iCur 
1f850 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
1f860 70 4c 6f 6f 70 20 3d 20 30 3b 20 2f 2a 20 43 75  pLoop = 0; /* Cu
1f870 72 72 65 6e 74 20 57 68 65 72 65 4c 6f 6f 70 20  rrent WhereLoop 
1f880 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 2e  being processed.
1f890 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
1f8a0 2a 70 54 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41  *pTerm;     /* A
1f8b0 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
1f8c0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1f8d0 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 42 45   */.  Expr *pOBE
1f8e0 78 70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  xpr;        /* A
1f8f0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f  n expression fro
1f900 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  m the ORDER BY c
1f910 6c 61 75 73 65 20 2a 2f 0a 20 20 43 6f 6c 6c 53  lause */.  CollS
1f920 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
1f930 20 2f 2a 20 43 4f 4c 4c 41 54 45 20 66 75 6e 63   /* COLLATE func
1f940 74 69 6f 6e 20 66 72 6f 6d 20 61 6e 20 4f 52 44  tion from an ORD
1f950 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 65 72  ER BY clause ter
1f960 6d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  m */.  Index *pI
1f970 6e 64 65 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  ndex;        /* 
1f980 54 68 65 20 69 6e 64 65 78 20 61 73 73 6f 63 69  The index associ
1f990 61 74 65 64 20 77 69 74 68 20 70 4c 6f 6f 70 20  ated with pLoop 
1f9a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
1f9b0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
1f9c0 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62  e->db;  /* Datab
1f9d0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1f9e0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 53 61  /.  Bitmask obSa
1f9f0 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 73  t = 0;    /* Mas
1fa00 6b 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65  k of ORDER BY te
1fa10 72 6d 73 20 73 61 74 69 73 66 69 65 64 20 73 6f  rms satisfied so
1fa20 20 66 61 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73   far */.  Bitmas
1fa30 6b 20 6f 62 44 6f 6e 65 3b 20 20 20 20 20 20 20  k obDone;       
1fa40 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 4f  /* Mask of all O
1fa50 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f  RDER BY terms */
1fa60 0a 20 20 42 69 74 6d 61 73 6b 20 6f 72 64 65 72  .  Bitmask order
1fa70 44 69 73 74 69 6e 63 74 4d 61 73 6b 3b 20 20 2f  DistinctMask;  /
1fa80 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 77 65  * Mask of all we
1fa90 6c 6c 2d 6f 72 64 65 72 65 64 20 6c 6f 6f 70 73  ll-ordered loops
1faa0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 72 65   */.  Bitmask re
1fab0 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ady;            
1fac0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 69 6e 6e    /* Mask of inn
1fad0 65 72 20 6c 6f 6f 70 73 20 2a 2f 0a 0a 20 20 2f  er loops */..  /
1fae0 2a 0a 20 20 2a 2a 20 57 65 20 73 61 79 20 74 68  *.  ** We say th
1faf0 65 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 22  e WhereLoop is "
1fb00 6f 6e 65 2d 72 6f 77 22 20 69 66 20 69 74 20 67  one-row" if it g
1fb10 65 6e 65 72 61 74 65 73 20 6e 6f 20 6d 6f 72 65  enerates no more
1fb20 20 74 68 61 6e 20 6f 6e 65 0a 20 20 2a 2a 20 72   than one.  ** r
1fb30 6f 77 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 41  ow of output.  A
1fb40 20 57 68 65 72 65 4c 6f 6f 70 20 69 73 20 6f 6e   WhereLoop is on
1fb50 65 2d 72 6f 77 20 69 66 20 61 6c 6c 20 6f 66 20  e-row if all of 
1fb60 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72  the following ar
1fb70 65 20 74 72 75 65 3a 0a 20 20 2a 2a 20 20 28 61  e true:.  **  (a
1fb80 29 20 41 6c 6c 20 69 6e 64 65 78 20 63 6f 6c 75  ) All index colu
1fb90 6d 6e 73 20 6d 61 74 63 68 20 77 69 74 68 20 57  mns match with W
1fba0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 2e 0a  HERE_COLUMN_EQ..
1fbb0 20 20 2a 2a 20 20 28 62 29 20 54 68 65 20 69 6e    **  (b) The in
1fbc0 64 65 78 20 69 73 20 75 6e 69 71 75 65 0a 20 20  dex is unique.  
1fbd0 2a 2a 20 41 6e 79 20 57 68 65 72 65 4c 6f 6f 70  ** Any WhereLoop
1fbe0 20 77 69 74 68 20 61 6e 20 57 48 45 52 45 5f 43   with an WHERE_C
1fbf0 4f 4c 55 4d 4e 5f 45 51 20 63 6f 6e 73 74 72 61  OLUMN_EQ constra
1fc00 69 6e 74 20 6f 6e 20 74 68 65 20 72 6f 77 69 64  int on the rowid
1fc10 20 69 73 20 6f 6e 65 2d 72 6f 77 2e 0a 20 20 2a   is one-row..  *
1fc20 2a 20 45 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20  * Every one-row 
1fc30 57 68 65 72 65 4c 6f 6f 70 20 77 69 6c 6c 20 68  WhereLoop will h
1fc40 61 76 65 20 74 68 65 20 57 48 45 52 45 5f 4f 4e  ave the WHERE_ON
1fc50 45 52 4f 57 20 62 69 74 20 73 65 74 20 69 6e 20  EROW bit set in 
1fc60 77 73 46 6c 61 67 73 2e 0a 20 20 2a 2a 0a 20 20  wsFlags..  **.  
1fc70 2a 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68  ** We say the Wh
1fc80 65 72 65 4c 6f 6f 70 20 69 73 20 22 6f 72 64 65  ereLoop is "orde
1fc90 72 2d 64 69 73 74 69 6e 63 74 22 20 69 66 20 74  r-distinct" if t
1fca0 68 65 20 73 65 74 20 6f 66 20 63 6f 6c 75 6d 6e  he set of column
1fcb0 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 61 74  s from.  ** that
1fcc0 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
1fcd0 61 72 65 20 69 6e 20 74 68 65 20 4f 52 44 45 52  are in the ORDER
1fce0 20 42 59 20 63 6c 61 75 73 65 20 61 72 65 20 64   BY clause are d
1fcf0 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
1fd00 72 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74  ry.  ** row of t
1fd10 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e 20 20 45  he WhereLoop.  E
1fd20 76 65 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65  very one-row Whe
1fd30 72 65 4c 6f 6f 70 20 69 73 20 61 75 74 6f 6d 61  reLoop is automa
1fd40 74 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6f 72 64  tically.  ** ord
1fd50 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 20 20 41  er-distinct.   A
1fd60 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
1fd70 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 69  has no columns i
1fd80 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
1fd90 6c 61 75 73 65 0a 20 20 2a 2a 20 69 73 20 6e 6f  lause.  ** is no
1fda0 74 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  t order-distinct
1fdb0 2e 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64 69  . To be order-di
1fdc0 73 74 69 6e 63 74 20 69 73 20 6e 6f 74 20 71 75  stinct is not qu
1fdd0 69 74 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  ite the same as 
1fde0 62 65 69 6e 67 0a 20 20 2a 2a 20 55 4e 49 51 55  being.  ** UNIQU
1fdf0 45 20 73 69 6e 63 65 20 61 20 55 4e 49 51 55 45  E since a UNIQUE
1fe00 20 63 6f 6c 75 6d 6e 20 6f 72 20 69 6e 64 65 78   column or index
1fe10 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70   can have multip
1fe20 6c 65 20 72 6f 77 73 20 74 68 61 74 20 0a 20 20  le rows that .  
1fe30 2a 2a 20 61 72 65 20 4e 55 4c 4c 20 61 6e 64 20  ** are NULL and 
1fe40 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20  NULL values are 
1fe50 65 71 75 69 76 61 6c 65 6e 74 20 66 6f 72 20 74  equivalent for t
1fe60 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 6f 72  he purpose of or
1fe70 64 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20  der-distinct..  
1fe80 2a 2a 20 54 6f 20 62 65 20 6f 72 64 65 72 2d 64  ** To be order-d
1fe90 69 73 74 69 6e 63 74 2c 20 74 68 65 20 63 6f 6c  istinct, the col
1fea0 75 6d 6e 73 20 6d 75 73 74 20 62 65 20 55 4e 49  umns must be UNI
1feb0 51 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c  QUE and NOT NULL
1fec0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
1fed0 72 6f 77 69 64 20 66 6f 72 20 61 20 74 61 62 6c  rowid for a tabl
1fee0 65 20 69 73 20 61 6c 77 61 79 73 20 55 4e 49 51  e is always UNIQ
1fef0 55 45 20 61 6e 64 20 4e 4f 54 20 4e 55 4c 4c 20  UE and NOT NULL 
1ff00 73 6f 20 77 68 65 6e 65 76 65 72 20 74 68 65 0a  so whenever the.
1ff10 20 20 2a 2a 20 72 6f 77 69 64 20 61 70 70 65 61    ** rowid appea
1ff20 72 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  rs in the ORDER 
1ff30 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63  BY clause, the c
1ff40 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65  orresponding Whe
1ff50 72 65 4c 6f 6f 70 20 69 73 0a 20 20 2a 2a 20 61  reLoop is.  ** a
1ff60 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6f 72 64  utomatically ord
1ff70 65 72 2d 64 69 73 74 69 6e 63 74 2e 0a 20 20 2a  er-distinct..  *
1ff80 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  /..  assert( pOr
1ff90 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 69 66  derBy!=0 );.  if
1ffa0 28 20 6e 4c 6f 6f 70 20 26 26 20 4f 70 74 69 6d  ( nLoop && Optim
1ffb0 69 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28  izationDisabled(
1ffc0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 72 64 65 72  db, SQLITE_Order
1ffd0 42 79 49 64 78 4a 6f 69 6e 29 20 29 20 72 65 74  ByIdxJoin) ) ret
1ffe0 75 72 6e 20 30 3b 0a 0a 20 20 6e 4f 72 64 65 72  urn 0;..  nOrder
1fff0 42 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e  By = pOrderBy->n
20000 45 78 70 72 3b 0a 20 20 74 65 73 74 63 61 73 65  Expr;.  testcase
20010 28 20 6e 4f 72 64 65 72 42 79 3d 3d 42 4d 53 2d  ( nOrderBy==BMS-
20020 31 20 29 3b 0a 20 20 69 66 28 20 6e 4f 72 64 65  1 );.  if( nOrde
20030 72 42 79 3e 42 4d 53 2d 31 20 29 20 72 65 74 75  rBy>BMS-1 ) retu
20040 72 6e 20 30 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74  rn 0;  /* Cannot
20050 20 6f 70 74 69 6d 69 7a 65 20 6f 76 65 72 6c 79   optimize overly
20060 20 6c 61 72 67 65 20 4f 52 44 45 52 20 42 59 73   large ORDER BYs
20070 20 2a 2f 0a 20 20 69 73 4f 72 64 65 72 44 69 73   */.  isOrderDis
20080 74 69 6e 63 74 20 3d 20 31 3b 0a 20 20 6f 62 44  tinct = 1;.  obD
20090 6f 6e 65 20 3d 20 4d 41 53 4b 42 49 54 28 6e 4f  one = MASKBIT(nO
200a0 72 64 65 72 42 79 29 2d 31 3b 0a 20 20 6f 72 64  rderBy)-1;.  ord
200b0 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 3d  erDistinctMask =
200c0 20 30 3b 0a 20 20 72 65 61 64 79 20 3d 20 30 3b   0;.  ready = 0;
200d0 0a 20 20 65 71 4f 70 4d 61 73 6b 20 3d 20 57 4f  .  eqOpMask = WO
200e0 5f 45 51 20 7c 20 57 4f 5f 49 53 20 7c 20 57 4f  _EQ | WO_IS | WO
200f0 5f 49 53 4e 55 4c 4c 3b 0a 20 20 69 66 28 20 77  _ISNULL;.  if( w
20100 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
20110 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20  E_ORDERBY_LIMIT 
20120 29 20 65 71 4f 70 4d 61 73 6b 20 7c 3d 20 57 4f  ) eqOpMask |= WO
20130 5f 49 4e 3b 0a 20 20 66 6f 72 28 69 4c 6f 6f 70  _IN;.  for(iLoop
20140 3d 30 3b 20 69 73 4f 72 64 65 72 44 69 73 74 69  =0; isOrderDisti
20150 6e 63 74 20 26 26 20 6f 62 53 61 74 3c 6f 62 44  nct && obSat<obD
20160 6f 6e 65 20 26 26 20 69 4c 6f 6f 70 3c 3d 6e 4c  one && iLoop<=nL
20170 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20  oop; iLoop++){. 
20180 20 20 20 69 66 28 20 69 4c 6f 6f 70 3e 30 20 29     if( iLoop>0 )
20190 20 72 65 61 64 79 20 7c 3d 20 70 4c 6f 6f 70 2d   ready |= pLoop-
201a0 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 69  >maskSelf;.    i
201b0 66 28 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 20 29  f( iLoop<nLoop )
201c0 7b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20  {.      pLoop = 
201d0 70 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f  pPath->aLoop[iLo
201e0 6f 70 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 77  op];.      if( w
201f0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
20200 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d 49 54 20  E_ORDERBY_LIMIT 
20210 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
20220 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 6f  }else{.      pLo
20230 6f 70 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20  op = pLast;.    
20240 7d 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d  }.    if( pLoop-
20250 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
20260 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 29 7b  _VIRTUALTABLE ){
20270 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  .      if( pLoop
20280 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72  ->u.vtab.isOrder
20290 65 64 20 29 20 6f 62 53 61 74 20 3d 20 6f 62 44  ed ) obSat = obD
202a0 6f 6e 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  one;.      break
202b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
202c0 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
202d0 65 2e 6e 49 64 78 43 6f 6c 20 3d 20 30 3b 0a 20  e.nIdxCol = 0;. 
202e0 20 20 20 7d 0a 20 20 20 20 69 43 75 72 20 3d 20     }.    iCur = 
202f0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
20300 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d  ->a[pLoop->iTab]
20310 2e 69 43 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f  .iCursor;..    /
20320 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f  * Mark off any O
20330 52 44 45 52 20 42 59 20 74 65 72 6d 20 58 20 74  RDER BY term X t
20340 68 61 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  hat is a column 
20350 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a  in the table of.
20360 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
20370 6e 74 20 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63  nt loop for whic
20380 68 20 74 68 65 72 65 20 69 73 20 74 65 72 6d 20  h there is term 
20390 69 6e 20 74 68 65 20 57 48 45 52 45 0a 20 20 20  in the WHERE.   
203a0 20 2a 2a 20 63 6c 61 75 73 65 20 6f 66 20 74 68   ** clause of th
203b0 65 20 66 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c  e form X IS NULL
203c0 20 6f 72 20 58 3d 3f 20 74 68 61 74 20 72 65 66   or X=? that ref
203d0 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65  erence only oute
203e0 72 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a  r.    ** loops..
203f0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
20400 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20  =0; i<nOrderBy; 
20410 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
20420 4d 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53  MASKBIT(i) & obS
20430 61 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  at ) continue;. 
20440 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20 73       pOBExpr = s
20450 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
20460 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d 3e  llate(pOrderBy->
20470 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
20480 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
20490 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20  op!=TK_COLUMN ) 
204a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
204b0 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54 61  if( pOBExpr->iTa
204c0 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e 74  ble!=iCur ) cont
204d0 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 54 65 72  inue;.      pTer
204e0 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65  m = sqlite3Where
204f0 46 69 6e 64 54 65 72 6d 28 26 70 57 49 6e 66 6f  FindTerm(&pWInfo
20500 2d 3e 73 57 43 2c 20 69 43 75 72 2c 20 70 4f 42  ->sWC, iCur, pOB
20510 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20  Expr->iColumn,. 
20520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20530 20 20 20 20 20 20 7e 72 65 61 64 79 2c 20 65 71        ~ready, eq
20540 4f 70 4d 61 73 6b 2c 20 30 29 3b 0a 20 20 20 20  OpMask, 0);.    
20550 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
20560 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
20570 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
20580 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 7b 0a  rator==WO_IN ){.
20590 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 20 74 65          /* IN te
205a0 72 6d 73 20 61 72 65 20 6f 6e 6c 79 20 76 61 6c  rms are only val
205b0 69 64 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 69  id for sorting i
205c0 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 4c  n the ORDER BY L
205d0 49 4d 49 54 20 0a 20 20 20 20 20 20 20 20 2a 2a  IMIT .        **
205e0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 61   optimization, a
205f0 6e 64 20 74 68 65 6e 20 6f 6e 6c 79 20 69 66 20  nd then only if 
20600 74 68 65 79 20 61 72 65 20 61 63 74 75 61 6c 6c  they are actuall
20610 79 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a  y used.        *
20620 2a 20 62 79 20 74 68 65 20 71 75 65 72 79 20 70  * by the query p
20630 6c 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  lan */.        a
20640 73 73 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67  ssert( wctrlFlag
20650 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42  s & WHERE_ORDERB
20660 59 5f 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 20  Y_LIMIT );.     
20670 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4c     for(j=0; j<pL
20680 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20 70  oop->nLTerm && p
20690 54 65 72 6d 21 3d 70 4c 6f 6f 70 2d 3e 61 4c 54  Term!=pLoop->aLT
206a0 65 72 6d 5b 6a 5d 3b 20 6a 2b 2b 29 7b 7d 0a 20  erm[j]; j++){}. 
206b0 20 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 4c         if( j>=pL
206c0 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20 29 20 63 6f  oop->nLTerm ) co
206d0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
206e0 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
206f0 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f  ->eOperator&(WO_
20700 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30 20 26 26  EQ|WO_IS))!=0 &&
20710 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   pOBExpr->iColum
20720 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=0 ){.        
20730 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 2c 20  const char *z1, 
20740 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  *z2;.        pCo
20750 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
20760 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d 3e  CollSeq(pWInfo->
20770 70 50 61 72 73 65 2c 20 70 4f 72 64 65 72 42 79  pParse, pOrderBy
20780 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
20790 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
207a0 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
207b0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
207c0 20 20 20 7a 31 20 3d 20 70 43 6f 6c 6c 2d 3e 7a     z1 = pColl->z
207d0 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 43  Name;.        pC
207e0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
207f0 72 43 6f 6c 6c 53 65 71 28 70 57 49 6e 66 6f 2d  rCollSeq(pWInfo-
20800 3e 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e  >pParse, pTerm->
20810 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
20820 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
20830 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
20840 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7a 32 20 3d  ll;.        z2 =
20850 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20   pColl->zName;. 
20860 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
20870 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32  e3StrICmp(z1, z2
20880 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
20890 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
208a0 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  e( pTerm->pExpr-
208b0 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20  >op==TK_IS );.  
208c0 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 62 53 61      }.      obSa
208d0 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b  t |= MASKBIT(i);
208e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
208f0 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20  (pLoop->wsFlags 
20900 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d  & WHERE_ONEROW)=
20910 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
20920 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
20930 20 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20 20   WHERE_IPK ){.  
20940 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30        pIndex = 0
20950 3b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f  ;.        nKeyCo
20960 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e  l = 0;.        n
20970 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20 20  Column = 1;.    
20980 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49 6e    }else if( (pIn
20990 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  dex = pLoop->u.b
209a0 74 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30 20  tree.pIndex)==0 
209b0 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72  || pIndex->bUnor
209c0 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  dered ){.       
209d0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
209e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
209f0 6e 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65 78  nKeyCol = pIndex
20a00 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20 20  ->nKeyCol;.     
20a10 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e     nColumn = pIn
20a20 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  dex->nColumn;.  
20a30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
20a40 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b 31  olumn==nKeyCol+1
20a50 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49   || !HasRowid(pI
20a60 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 20 29 3b  ndex->pTable) );
20a70 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
20a80 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
20a90 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 58 4e  n[nColumn-1]==XN
20aa0 5f 52 4f 57 49 44 0a 20 20 20 20 20 20 20 20 20  _ROWID.         
20ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ac0 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49   || !HasRowid(pI
20ad0 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 29 3b 0a  ndex->pTable));.
20ae0 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44          isOrderD
20af0 69 73 74 69 6e 63 74 20 3d 20 49 73 55 6e 69 71  istinct = IsUniq
20b00 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  ueIndex(pIndex);
20b10 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
20b20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
20b30 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  all columns of t
20b40 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65 61  he index and dea
20b50 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73 0a  l with the ones.
20b60 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72        ** that ar
20b70 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e 65  e not constraine
20b80 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a 20  d by == or IN.. 
20b90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
20ba0 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b 0a  v = revSet = 0;.
20bb0 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43 6f        distinctCo
20bc0 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20  lumns = 0;.     
20bd0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c   for(j=0; j<nCol
20be0 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
20bf0 20 20 20 75 38 20 62 4f 6e 63 65 20 3d 20 31 3b     u8 bOnce = 1;
20c00 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e 20   /* True to run 
20c10 74 68 65 20 4f 52 44 45 52 20 42 59 20 73 65 61  the ORDER BY sea
20c20 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 20  rch loop */..   
20c30 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3e 3d       assert( j>=
20c40 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
20c50 45 71 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  Eq .            
20c60 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  || (pLoop->aLTer
20c70 6d 5b 6a 5d 3d 3d 30 29 3d 3d 28 6a 3c 70 4c 6f  m[j]==0)==(j<pLo
20c80 6f 70 2d 3e 6e 53 6b 69 70 29 0a 20 20 20 20 20  op->nSkip).     
20c90 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
20ca0 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  ( j<pLoop->u.btr
20cb0 65 65 2e 6e 45 71 20 26 26 20 6a 3e 3d 70 4c 6f  ee.nEq && j>=pLo
20cc0 6f 70 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20 20 20  op->nSkip ){.   
20cd0 20 20 20 20 20 20 20 75 31 36 20 65 4f 70 20 3d         u16 eOp =
20ce0 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a   pLoop->aLTerm[j
20cf0 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 0a 20  ]->eOperator;.. 
20d00 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70           /* Skip
20d10 20 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49 53 20   over == and IS 
20d20 61 6e 64 20 49 53 4e 55 4c 4c 20 74 65 72 6d 73  and ISNULL terms
20d30 2e 20 20 28 41 6c 73 6f 20 73 6b 69 70 20 49 4e  .  (Also skip IN
20d40 20 74 65 72 6d 73 20 77 68 65 6e 0a 20 20 20 20   terms when.    
20d50 20 20 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 57        ** doing W
20d60 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d  HERE_ORDERBY_LIM
20d70 49 54 20 70 72 6f 63 65 73 73 69 6e 67 29 2e 20  IT processing). 
20d80 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .          **.  
20d90 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68          ** If th
20da0 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69  e current term i
20db0 73 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e  s a column of an
20dc0 20 28 28 3f 2c 3f 29 20 49 4e 20 28 53 45 4c 45   ((?,?) IN (SELE
20dd0 43 54 2e 2e 2e 29 29 20 0a 20 20 20 20 20 20 20  CT...)) .       
20de0 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
20df0 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 53   for which the S
20e00 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20 6d 6f  ELECT returns mo
20e10 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c 75  re than one colu
20e20 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  mn,.          **
20e30 20 63 68 65 63 6b 20 74 68 61 74 20 69 74 20 69   check that it i
20e40 73 20 74 68 65 20 6f 6e 6c 79 20 63 6f 6c 75 6d  s the only colum
20e50 6e 20 75 73 65 64 20 62 79 20 74 68 69 73 20 6c  n used by this l
20e60 6f 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  oop. Otherwise,.
20e70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20            ** if 
20e80 69 74 20 69 73 20 6f 6e 65 20 6f 66 20 74 77 6f  it is one of two
20e90 20 6f 72 20 6d 6f 72 65 2c 20 6e 6f 6e 65 20 6f   or more, none o
20ea0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 63 61  f the columns ca
20eb0 6e 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a  n be.          *
20ec0 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  * considered to 
20ed0 6d 61 74 63 68 20 61 6e 20 4f 52 44 45 52 20 42  match an ORDER B
20ee0 59 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20  Y term.  */.    
20ef0 20 20 20 20 20 20 69 66 28 20 28 65 4f 70 20 26        if( (eOp &
20f00 20 65 71 4f 70 4d 61 73 6b 29 21 3d 30 20 29 7b   eqOpMask)!=0 ){
20f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
20f20 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c   eOp & WO_ISNULL
20f30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
20f40 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72    testcase( isOr
20f50 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b 0a 20  derDistinct );. 
20f60 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
20f70 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20 30  rderDistinct = 0
20f80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
20f90 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
20fa0 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20 20  inue;  .        
20fb0 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41    }else if( ALWA
20fc0 59 53 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29 20  YS(eOp & WO_IN) 
20fd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
20fe0 2a 20 41 4c 57 41 59 53 28 29 20 6a 75 73 74 69  * ALWAYS() justi
20ff0 66 69 63 61 74 69 6f 6e 3a 20 65 4f 70 20 69 73  fication: eOp is
21000 20 61 6e 20 65 71 75 61 6c 69 74 79 20 6f 70 65   an equality ope
21010 72 61 74 6f 72 20 64 75 65 20 74 6f 20 74 68 65  rator due to the
21020 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
21030 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  j<pLoop->u.btree
21040 2e 6e 45 71 20 63 6f 6e 73 74 72 61 69 6e 74 20  .nEq constraint 
21050 61 62 6f 76 65 2e 20 20 41 6e 79 20 65 71 75 61  above.  Any equa
21060 6c 69 74 79 20 6f 74 68 65 72 0a 20 20 20 20 20  lity other.     
21070 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20 57         ** than W
21080 4f 5f 49 4e 20 69 73 20 63 61 70 74 75 72 65 64  O_IN is captured
21090 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73   by the previous
210a0 20 22 69 66 22 2e 20 20 53 6f 20 74 68 69 73 20   "if".  So this 
210b0 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  one.            
210c0 2a 2a 20 61 6c 77 61 79 73 20 68 61 73 20 74 6f  ** always has to
210d0 20 62 65 20 57 4f 5f 49 4e 2e 20 2a 2f 0a 20 20   be WO_IN. */.  
210e0 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
210f0 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65  pX = pLoop->aLTe
21100 72 6d 5b 6a 5d 2d 3e 70 45 78 70 72 3b 0a 20 20  rm[j]->pExpr;.  
21110 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
21120 6a 2b 31 3b 20 69 3c 70 4c 6f 6f 70 2d 3e 75 2e  j+1; i<pLoop->u.
21130 62 74 72 65 65 2e 6e 45 71 3b 20 69 2b 2b 29 7b  btree.nEq; i++){
21140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
21150 66 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  f( pLoop->aLTerm
21160 5b 69 5d 2d 3e 70 45 78 70 72 3d 3d 70 58 20 29  [i]->pExpr==pX )
21170 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
21180 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
21190 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 65 4f 70  ->aLTerm[i]->eOp
211a0 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29 20  erator & WO_IN) 
211b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
211c0 20 20 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20     bOnce = 0;.  
211d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
211e0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
211f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
21200 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
21210 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
21220 20 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f 6c    /* Get the col
21230 75 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74 68  umn number in th
21240 65 20 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d 6e  e table (iColumn
21250 29 20 61 6e 64 20 73 6f 72 74 20 6f 72 64 65 72  ) and sort order
21260 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 72 65 76  .        ** (rev
21270 49 64 78 29 20 66 6f 72 20 74 68 65 20 6a 2d 74  Idx) for the j-t
21280 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
21290 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20 2a  index..        *
212a0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  /.        if( pI
212b0 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20  ndex ){.        
212c0 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64    iColumn = pInd
212d0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  ex->aiColumn[j];
212e0 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49 64  .          revId
212f0 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72  x = pIndex->aSor
21300 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20 20  tOrder[j];.     
21310 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
21320 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  ==pIndex->pTable
21330 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c 75 6d  ->iPKey ) iColum
21340 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  n = -1;.        
21350 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
21360 20 69 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f   iColumn = XN_RO
21370 57 49 44 3b 0a 20 20 20 20 20 20 20 20 20 20 72  WID;.          r
21380 65 76 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20  evIdx = 0;.     
21390 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
213a0 20 41 6e 20 75 6e 63 6f 6e 73 74 72 61 69 6e 65   An unconstraine
213b0 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 6d 69  d column that mi
213c0 67 68 74 20 62 65 20 4e 55 4c 4c 20 6d 65 61 6e  ght be NULL mean
213d0 73 20 74 68 61 74 20 74 68 69 73 0a 20 20 20 20  s that this.    
213e0 20 20 20 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70      ** WhereLoop
213f0 20 69 73 20 6e 6f 74 20 77 65 6c 6c 2d 6f 72 64   is not well-ord
21400 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ered.        */.
21410 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72          if( isOr
21420 64 65 72 44 69 73 74 69 6e 63 74 0a 20 20 20 20  derDistinct.    
21430 20 20 20 20 20 26 26 20 69 43 6f 6c 75 6d 6e 3e       && iColumn>
21440 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 6a  =0.         && j
21450 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  >=pLoop->u.btree
21460 2e 6e 45 71 0a 20 20 20 20 20 20 20 20 20 26 26  .nEq.         &&
21470 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
21480 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 6e  >aCol[iColumn].n
21490 6f 74 4e 75 6c 6c 3d 3d 30 0a 20 20 20 20 20 20  otNull==0.      
214a0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
214b0 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d  sOrderDistinct =
214c0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
214d0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 74         /* Find t
214e0 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  he ORDER BY term
214f0 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
21500 73 20 74 6f 20 74 68 65 20 6a 2d 74 68 20 63 6f  s to the j-th co
21510 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  lumn.        ** 
21520 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64  of the index and
21530 20 6d 61 72 6b 20 74 68 61 74 20 4f 52 44 45 52   mark that ORDER
21540 20 42 59 20 74 65 72 6d 20 6f 66 66 20 0a 20 20   BY term off .  
21550 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
21560 20 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20   isMatch = 0;.  
21570 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 62        for(i=0; b
21580 4f 6e 63 65 20 26 26 20 69 3c 6e 4f 72 64 65 72  Once && i<nOrder
21590 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  By; i++){.      
215a0 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
215b0 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
215c0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
215d0 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74   pOBExpr = sqlit
215e0 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
215f0 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  e(pOrderBy->a[i]
21600 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
21610 20 20 20 74 65 73 74 63 61 73 65 28 20 77 63 74     testcase( wct
21620 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
21630 47 52 4f 55 50 42 59 20 29 3b 0a 20 20 20 20 20  GROUPBY );.     
21640 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
21650 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
21660 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 3b 0a  E_DISTINCTBY );.
21670 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77            if( (w
21680 63 74 72 6c 46 6c 61 67 73 20 26 20 28 57 48 45  ctrlFlags & (WHE
21690 52 45 5f 47 52 4f 55 50 42 59 7c 57 48 45 52 45  RE_GROUPBY|WHERE
216a0 5f 44 49 53 54 49 4e 43 54 42 59 29 29 3d 3d 30  _DISTINCTBY))==0
216b0 20 29 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20 20   ) bOnce = 0;.  
216c0 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
216d0 75 6d 6e 3e 3d 28 2d 31 29 20 29 7b 0a 20 20 20  umn>=(-1) ){.   
216e0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
216f0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
21700 55 4d 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UMN ) continue;.
21710 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
21720 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  pOBExpr->iTable!
21730 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  =iCur ) continue
21740 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
21750 28 20 70 4f 42 45 78 70 72 2d 3e 69 43 6f 6c 75  ( pOBExpr->iColu
21760 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 29 20 63 6f  mn!=iColumn ) co
21770 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
21780 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21790 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
217a0 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 0a 20  ExprCompare(0,. 
217b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217c0 20 70 4f 42 45 78 70 72 2c 70 49 6e 64 65 78 2d   pOBExpr,pIndex-
217d0 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e  >aColExpr->a[j].
217e0 70 45 78 70 72 2c 69 43 75 72 29 20 29 7b 0a 20  pExpr,iCur) ){. 
217f0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
21800 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
21810 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
21820 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
21830 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
21840 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
21850 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
21860 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  Seq(pWInfo->pPar
21870 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  se, pOrderBy->a[
21880 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
21890 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
218a0 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
218b0 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
218c0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
218d0 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
218e0 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e  >zName, pIndex->
218f0 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20  azColl[j])!=0 ) 
21900 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
21910 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21920 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e  pLoop->u.btree.n
21930 49 64 78 43 6f 6c 20 3d 20 6a 2b 31 3b 0a 20 20  IdxCol = j+1;.  
21940 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20          isMatch 
21950 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 1;.          b
21960 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
21970 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d 61          if( isMa
21980 74 63 68 20 26 26 20 28 77 63 74 72 6c 46 6c 61  tch && (wctrlFla
21990 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50  gs & WHERE_GROUP
219a0 42 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  BY)==0 ){.      
219b0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
219c0 20 74 68 65 20 73 6f 72 74 20 6f 72 64 65 72 20   the sort order 
219d0 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 69 6e  is compatible in
219e0 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
219f0 75 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  use..          *
21a00 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 69 73 20  * Sort order is 
21a10 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72 20 61  irrelevant for a
21a20 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
21a30 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
21a40 66 28 20 72 65 76 53 65 74 20 29 7b 0a 20 20 20  f( revSet ){.   
21a50 20 20 20 20 20 20 20 20 20 69 66 28 20 28 72 65           if( (re
21a60 76 20 5e 20 72 65 76 49 64 78 29 21 3d 70 4f 72  v ^ revIdx)!=pOr
21a70 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
21a80 4f 72 64 65 72 20 29 20 69 73 4d 61 74 63 68 20  Order ) isMatch 
21a90 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
21aa0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
21ab0 20 20 72 65 76 20 3d 20 72 65 76 49 64 78 20 5e    rev = revIdx ^
21ac0 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
21ad0 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20  sortOrder;.     
21ae0 20 20 20 20 20 20 20 69 66 28 20 72 65 76 20 29         if( rev )
21af0 20 2a 70 52 65 76 4d 61 73 6b 20 7c 3d 20 4d 41   *pRevMask |= MA
21b00 53 4b 42 49 54 28 69 4c 6f 6f 70 29 3b 0a 20 20  SKBIT(iLoop);.  
21b10 20 20 20 20 20 20 20 20 20 20 72 65 76 53 65 74            revSet
21b20 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
21b30 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
21b40 20 20 20 20 69 66 28 20 69 73 4d 61 74 63 68 20      if( isMatch 
21b50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
21b60 20 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57   iColumn==XN_ROW
21b70 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ID ){.          
21b80 20 20 74 65 73 74 63 61 73 65 28 20 64 69 73 74    testcase( dist
21b90 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29  inctColumns==0 )
21ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69  ;.            di
21bb0 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20  stinctColumns = 
21bc0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
21bd0 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c           obSat |
21be0 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20  = MASKBIT(i);.  
21bf0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21c00 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74         /* No mat
21c10 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  ch found */.    
21c20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c        if( j==0 |
21c30 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20  | j<nKeyCol ){. 
21c40 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
21c50 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74  ase( isOrderDist
21c60 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  inct!=0 );.     
21c70 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
21c80 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
21c90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21ca0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
21cb0 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e   }.      } /* en
21cc0 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  d Loop over all 
21cd0 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f  index columns */
21ce0 0a 20 20 20 20 20 20 69 66 28 20 64 69 73 74 69  .      if( disti
21cf0 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20  nctColumns ){.  
21d00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
21d10 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3d  isOrderDistinct=
21d20 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 73  =0 );.        is
21d30 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
21d40 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
21d50 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f   /* end-if not o
21d60 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f  ne-row */..    /
21d70 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f  * Mark off any o
21d80 74 68 65 72 20 4f 52 44 45 52 20 42 59 20 74 65  ther ORDER BY te
21d90 72 6d 73 20 74 68 61 74 20 72 65 66 65 72 65 6e  rms that referen
21da0 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20  ce pLoop */.    
21db0 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  if( isOrderDisti
21dc0 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 6f 72 64  nct ){.      ord
21dd0 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c  erDistinctMask |
21de0 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  = pLoop->maskSel
21df0 66 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  f;.      for(i=0
21e00 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
21e10 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72  +){.        Expr
21e20 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 42 69 74   *p;.        Bit
21e30 6d 61 73 6b 20 6d 54 65 72 6d 3b 0a 20 20 20 20  mask mTerm;.    
21e40 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
21e50 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
21e60 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70  tinue;.        p
21e70 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
21e80 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
21e90 20 6d 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33   mTerm = sqlite3
21ea0 57 68 65 72 65 45 78 70 72 55 73 61 67 65 28 26  WhereExprUsage(&
21eb0 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
21ec0 2c 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ,p);.        if(
21ed0 20 6d 54 65 72 6d 3d 3d 30 20 26 26 20 21 73 71   mTerm==0 && !sq
21ee0 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
21ef0 61 6e 74 28 70 29 20 29 20 63 6f 6e 74 69 6e 75  ant(p) ) continu
21f00 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  e;.        if( (
21f10 6d 54 65 72 6d 26 7e 6f 72 64 65 72 44 69 73 74  mTerm&~orderDist
21f20 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a  inctMask)==0 ){.
21f30 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20            obSat 
21f40 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20  |= MASKBIT(i);. 
21f50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
21f60 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e  .    }.  } /* En
21f70 64 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20  d the loop over 
21f80 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20 66  all WhereLoops f
21f90 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64  rom outer-most d
21fa0 6f 77 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73  own to inner-mos
21fb0 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61 74  t */.  if( obSat
21fc0 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74 75 72  ==obDone ) retur
21fd0 6e 20 28 69 38 29 6e 4f 72 64 65 72 42 79 3b 0a  n (i8)nOrderBy;.
21fe0 20 20 69 66 28 20 21 69 73 4f 72 64 65 72 44 69    if( !isOrderDi
21ff0 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 66 6f  stinct ){.    fo
22000 72 28 69 3d 6e 4f 72 64 65 72 42 79 2d 31 3b 20  r(i=nOrderBy-1; 
22010 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  i>0; i--){.     
22020 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 4d 41 53   Bitmask m = MAS
22030 4b 42 49 54 28 69 29 20 2d 20 31 3b 0a 20 20 20  KBIT(i) - 1;.   
22040 20 20 20 69 66 28 20 28 6f 62 53 61 74 26 6d 29     if( (obSat&m)
22050 3d 3d 6d 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==m ) return i;.
22060 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
22070 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
22080 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49   -1;.}.../*.** I
22090 66 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55  f the WHERE_GROU
220a0 50 42 59 20 66 6c 61 67 20 69 73 20 73 65 74 20  PBY flag is set 
220b0 69 6e 20 74 68 65 20 6d 61 73 6b 20 70 61 73 73  in the mask pass
220c0 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ed to sqlite3Whe
220d0 72 65 42 65 67 69 6e 28 29 2c 0a 2a 2a 20 74 68  reBegin(),.** th
220e0 65 20 70 6c 61 6e 6e 65 72 20 61 73 73 75 6d 65  e planner assume
220f0 73 20 74 68 61 74 20 74 68 65 20 73 70 65 63 69  s that the speci
22100 66 69 65 64 20 70 4f 72 64 65 72 42 79 20 6c 69  fied pOrderBy li
22110 73 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  st is actually a
22120 20 47 52 4f 55 50 0a 2a 2a 20 42 59 20 63 6c 61   GROUP.** BY cla
22130 75 73 65 20 2d 20 61 6e 64 20 73 6f 20 61 6e 79  use - and so any
22140 20 6f 72 64 65 72 20 74 68 61 74 20 67 72 6f 75   order that grou
22150 70 73 20 72 6f 77 73 20 61 73 20 72 65 71 75 69  ps rows as requi
22160 72 65 64 20 73 61 74 69 73 66 69 65 73 20 74 68  red satisfies th
22170 65 0a 2a 2a 20 72 65 71 75 65 73 74 2e 0a 2a 2a  e.** request..**
22180 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 6e  .** Normally, in
22190 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73   this case it is
221a0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
221b0 72 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  r the caller to 
221c0 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65  determine.** whe
221d0 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
221e0 72 6f 77 73 20 61 72 65 20 72 65 61 6c 6c 79 20  rows are really 
221f0 62 65 69 6e 67 20 64 65 6c 69 76 65 72 65 64 20  being delivered 
22200 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c  in sorted order,
22210 20 6f 72 0a 2a 2a 20 6a 75 73 74 20 69 6e 20 73   or.** just in s
22220 6f 6d 65 20 6f 74 68 65 72 20 6f 72 64 65 72 20  ome other order 
22230 74 68 61 74 20 70 72 6f 76 69 64 65 73 20 74 68  that provides th
22240 65 20 72 65 71 75 69 72 65 64 20 67 72 6f 75 70  e required group
22250 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a  ing. However,.**
22260 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 53 4f   if the WHERE_SO
22270 52 54 42 59 47 52 4f 55 50 20 66 6c 61 67 20 69  RTBYGROUP flag i
22280 73 20 61 6c 73 6f 20 70 61 73 73 65 64 20 74 6f  s also passed to
22290 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
222a0 69 6e 28 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  in(), then.** th
222b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
222c0 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  be called on the
222d0 20 72 65 74 75 72 6e 65 64 20 57 68 65 72 65 49   returned WhereI
222e0 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 49 74 20 72  nfo object. It r
222f0 65 74 75 72 6e 73 0a 2a 2a 20 74 72 75 65 20 69  eturns.** true i
22300 66 20 74 68 65 20 72 6f 77 73 20 72 65 61 6c 6c  f the rows reall
22310 79 20 77 69 6c 6c 20 62 65 20 73 6f 72 74 65 64  y will be sorted
22320 20 69 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   in the specifie
22330 64 20 6f 72 64 65 72 2c 20 6f 72 20 66 61 6c 73  d order, or fals
22340 65 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a  e.** otherwise..
22350 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
22360 65 2c 20 61 73 73 75 6d 69 6e 67 3a 0a 2a 2a 0a  e, assuming:.**.
22370 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
22380 58 20 69 31 20 4f 4e 20 74 31 28 78 2c 20 59 29  X i1 ON t1(x, Y)
22390 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 0a 2a 2a 0a  ;.**.** then.**.
223a0 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
223b0 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 78  OM t1 GROUP BY x
223c0 2c 79 20 4f 52 44 45 52 20 42 59 20 78 2c 79 3b  ,y ORDER BY x,y;
223d0 20 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29     -- IsSorted()
223e0 3d 3d 31 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  ==1.**   SELECT 
223f0 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20  * FROM t1 GROUP 
22400 42 59 20 79 2c 78 20 4f 52 44 45 52 20 42 59 20  BY y,x ORDER BY 
22410 79 2c 78 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74  y,x;   -- IsSort
22420 65 64 28 29 3d 3d 30 0a 2a 2f 0a 69 6e 74 20 73  ed()==0.*/.int s
22430 71 6c 69 74 65 33 57 68 65 72 65 49 73 53 6f 72  qlite3WhereIsSor
22440 74 65 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  ted(WhereInfo *p
22450 57 49 6e 66 6f 29 7b 0a 20 20 61 73 73 65 72 74  WInfo){.  assert
22460 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
22470 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f  lags & WHERE_GRO
22480 55 50 42 59 20 29 3b 0a 20 20 61 73 73 65 72 74  UPBY );.  assert
22490 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
224a0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52  lags & WHERE_SOR
224b0 54 42 59 47 52 4f 55 50 20 29 3b 0a 20 20 72 65  TBYGROUP );.  re
224c0 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 73 6f 72  turn pWInfo->sor
224d0 74 65 64 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57  ted;.}..#ifdef W
224e0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
224f0 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67 67 69  D./* For debuggi
22500 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a  ng use only: */.
22510 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
22520 72 20 2a 77 68 65 72 65 50 61 74 68 4e 61 6d 65  r *wherePathName
22530 28 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74  (WherePath *pPat
22540 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68  h, int nLoop, Wh
22550 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b  ereLoop *pLast){
22560 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a  .  static char z
22570 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20  Name[65];.  int 
22580 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
22590 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61  nLoop; i++){ zNa
225a0 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61  me[i] = pPath->a
225b0 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a  Loop[i]->cId; }.
225c0 20 20 69 66 28 20 70 4c 61 73 74 20 29 20 7a 4e    if( pLast ) zN
225d0 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74  ame[i++] = pLast
225e0 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69  ->cId;.  zName[i
225f0 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 0;.  return 
22600 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  zName;.}.#endif.
22610 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
22620 65 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e  e cost of sortin
22630 67 20 6e 52 6f 77 20 72 6f 77 73 2c 20 61 73 73  g nRow rows, ass
22640 75 6d 69 6e 67 20 74 68 61 74 20 74 68 65 20 6b  uming that the k
22650 65 79 73 20 68 61 76 65 20 0a 2a 2a 20 6e 4f 72  eys have .** nOr
22660 64 65 72 62 79 20 63 6f 6c 75 6d 6e 73 20 61 6e  derby columns an
22670 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74  d that the first
22680 20 6e 53 6f 72 74 65 64 20 63 6f 6c 75 6d 6e 73   nSorted columns
22690 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a   are already in.
226a0 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ** order..*/.sta
226b0 74 69 63 20 4c 6f 67 45 73 74 20 77 68 65 72 65  tic LogEst where
226c0 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 57  SortingCost(.  W
226d0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
226e0 2c 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77 2c  ,.  LogEst nRow,
226f0 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 2c  .  int nOrderBy,
22700 0a 20 20 69 6e 74 20 6e 53 6f 72 74 65 64 0a 29  .  int nSorted.)
22710 7b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45  {.  /* TUNING: E
22720 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66  stimated cost of
22730 20 61 20 66 75 6c 6c 20 65 78 74 65 72 6e 61 6c   a full external
22740 20 73 6f 72 74 2c 20 77 68 65 72 65 20 4e 20 69   sort, where N i
22750 73 20 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62  s .  ** the numb
22760 65 72 20 6f 66 20 72 6f 77 73 20 74 6f 20 73 6f  er of rows to so
22770 72 74 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  rt is:.  **.  **
22780 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a     cost = (3.0 *
22790 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 2e 0a 20 20   N * log(N))..  
227a0 2a 2a 20 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20  ** .  ** Or, if 
227b0 74 68 65 20 6f 72 64 65 72 2d 62 79 20 63 6c 61  the order-by cla
227c0 75 73 65 20 68 61 73 20 58 20 74 65 72 6d 73 20  use has X terms 
227d0 62 75 74 20 6f 6e 6c 79 20 74 68 65 20 6c 61 73  but only the las
227e0 74 20 59 20 0a 20 20 2a 2a 20 74 65 72 6d 73 20  t Y .  ** terms 
227f0 61 72 65 20 6f 75 74 20 6f 66 20 6f 72 64 65 72  are out of order
22800 2c 20 74 68 65 6e 20 62 6c 6f 63 6b 2d 73 6f 72  , then block-sor
22810 74 69 6e 67 20 77 69 6c 6c 20 72 65 64 75 63 65  ting will reduce
22820 20 74 68 65 20 0a 20 20 2a 2a 20 73 6f 72 74 69   the .  ** sorti
22830 6e 67 20 63 6f 73 74 20 74 6f 3a 0a 20 20 2a 2a  ng cost to:.  **
22840 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28  .  **   cost = (
22850 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29  3.0 * N * log(N)
22860 29 20 2a 20 28 59 2f 58 29 0a 20 20 2a 2a 0a 20  ) * (Y/X).  **. 
22870 20 2a 2a 20 54 68 65 20 28 59 2f 58 29 20 74 65   ** The (Y/X) te
22880 72 6d 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  rm is implemente
22890 64 20 75 73 69 6e 67 20 73 74 61 63 6b 20 76 61  d using stack va
228a0 72 69 61 62 6c 65 20 72 53 63 61 6c 65 0a 20 20  riable rScale.  
228b0 2a 2a 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20  ** below.  */.  
228c0 4c 6f 67 45 73 74 20 72 53 63 61 6c 65 2c 20 72  LogEst rScale, r
228d0 53 6f 72 74 43 6f 73 74 3b 0a 20 20 61 73 73 65  SortCost;.  asse
228e0 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 30 20 26  rt( nOrderBy>0 &
228f0 26 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  & 66==sqlite3Log
22900 45 73 74 28 31 30 30 29 20 29 3b 0a 20 20 72 53  Est(100) );.  rS
22910 63 61 6c 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f  cale = sqlite3Lo
22920 67 45 73 74 28 28 6e 4f 72 64 65 72 42 79 2d 6e  gEst((nOrderBy-n
22930 53 6f 72 74 65 64 29 2a 31 30 30 2f 6e 4f 72 64  Sorted)*100/nOrd
22940 65 72 42 79 29 20 2d 20 36 36 3b 0a 20 20 72 53  erBy) - 66;.  rS
22950 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f 77 20 2b  ortCost = nRow +
22960 20 72 53 63 61 6c 65 20 2b 20 31 36 3b 0a 0a 20   rScale + 16;.. 
22970 20 2f 2a 20 4d 75 6c 74 69 70 6c 65 20 62 79 20   /* Multiple by 
22980 6c 6f 67 28 4d 29 20 77 68 65 72 65 20 4d 20 69  log(M) where M i
22990 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
229a0 6f 75 74 70 75 74 20 72 6f 77 73 2e 0a 20 20 2a  output rows..  *
229b0 2a 20 55 73 65 20 74 68 65 20 4c 49 4d 49 54 20  * Use the LIMIT 
229c0 66 6f 72 20 4d 20 69 66 20 69 74 20 69 73 20 73  for M if it is s
229d0 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20  maller */.  if( 
229e0 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
229f0 61 67 73 20 26 20 57 48 45 52 45 5f 55 53 45 5f  ags & WHERE_USE_
22a00 4c 49 4d 49 54 29 21 3d 30 20 26 26 20 70 57 49  LIMIT)!=0 && pWI
22a10 6e 66 6f 2d 3e 69 4c 69 6d 69 74 3c 6e 52 6f 77  nfo->iLimit<nRow
22a20 20 29 7b 0a 20 20 20 20 6e 52 6f 77 20 3d 20 70   ){.    nRow = p
22a30 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74 3b 0a 20  WInfo->iLimit;. 
22a40 20 7d 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 2b   }.  rSortCost +
22a50 3d 20 65 73 74 4c 6f 67 28 6e 52 6f 77 29 3b 0a  = estLog(nRow);.
22a60 20 20 72 65 74 75 72 6e 20 72 53 6f 72 74 43 6f    return rSortCo
22a70 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  st;.}../*.** Giv
22a80 65 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57  en the list of W
22a90 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
22aa0 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f   at pWInfo->pLoo
22ab0 70 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ps, this routine
22ac0 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
22ad0 66 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20  find the lowest 
22ae0 63 6f 73 74 20 70 61 74 68 20 74 68 61 74 20 76  cost path that v
22af0 69 73 69 74 73 20 65 61 63 68 20 57 68 65 72 65  isits each Where
22b00 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54  Loop.** once.  T
22b10 68 69 73 20 70 61 74 68 20 69 73 20 74 68 65 6e  his path is then
22b20 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65   loaded into the
22b30 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c   pWInfo->a[].pWL
22b40 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a  oop fields..**.*
22b50 2a 20 41 73 73 75 6d 65 20 74 68 61 74 20 74 68  * Assume that th
22b60 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
22b70 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 74 68  f output rows th
22b80 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  at will need to 
22b90 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c  be sorted.** wil
22ba0 6c 20 62 65 20 6e 52 6f 77 45 73 74 20 28 69 6e  l be nRowEst (in
22bb0 20 74 68 65 20 31 30 2a 6c 6f 67 32 20 72 65 70   the 10*log2 rep
22bc0 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f  resentation).  O
22bd0 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e  r, ignore sortin
22be0 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e 52  g.** costs if nR
22bf0 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  owEst==0..**.** 
22c00 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
22c10 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53   on success or S
22c20 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61  QLITE_NOMEM of a
22c30 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
22c40 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  on.** error occu
22c50 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
22c60 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65  t wherePathSolve
22c70 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  r(WhereInfo *pWI
22c80 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f 77  nfo, LogEst nRow
22c90 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68  Est){.  int mxCh
22ca0 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  oice;           
22cb0 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
22cc0 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65  ber of simultane
22cd0 6f 75 73 20 70 61 74 68 73 20 74 72 61 63 6b 65  ous paths tracke
22ce0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70  d */.  int nLoop
22cf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22d00 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
22d10 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20  rms in the join 
22d20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
22d30 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  se;            /
22d40 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
22d50 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
22d60 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
22d70 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
22d80 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
22d90 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20   int iLoop;     
22da0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
22db0 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20  op counter over 
22dc0 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
22dd0 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69   join */.  int i
22de0 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20  i, jj;          
22df0 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
22e00 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6d  nters */.  int m
22e10 78 49 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  xI = 0;         
22e20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
22e30 20 6e 65 78 74 20 65 6e 74 72 79 20 74 6f 20 72   next entry to r
22e40 65 70 6c 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20  eplace */.  int 
22e50 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  nOrderBy;       
22e60 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22e70 6f 66 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  of ORDER BY clau
22e80 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20 4c 6f  se terms */.  Lo
22e90 67 45 73 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b  gEst mxCost = 0;
22ea0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
22eb0 75 6d 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74  um cost of a set
22ec0 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c   of paths */.  L
22ed0 6f 67 45 73 74 20 6d 78 55 6e 73 6f 72 74 65 64  ogEst mxUnsorted
22ee0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 78 69   = 0;    /* Maxi
22ef0 6d 75 6d 20 75 6e 73 6f 72 74 65 64 20 63 6f 73  mum unsorted cos
22f00 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61  t of a set of pa
22f10 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c  th */.  int nTo,
22f20 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20   nFrom;         
22f30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
22f40 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20  alid entries in 
22f50 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b  aTo[] and aFrom[
22f60 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  ] */.  WherePath
22f70 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20   *aFrom;        
22f80 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61   /* All nFrom pa
22f90 74 68 73 20 61 74 20 74 68 65 20 70 72 65 76 69  ths at the previ
22fa0 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57  ous level */.  W
22fb0 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20  herePath *aTo;  
22fc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22fd0 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73 20 61  nTo best paths a
22fe0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  t the current le
22ff0 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  vel */.  WherePa
23000 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20  th *pFrom;      
23010 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74     /* An element
23020 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74   of aFrom[] that
23030 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
23040 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  on */.  WherePat
23050 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20  h *pTo;         
23060 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20    /* An element 
23070 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65  of aTo[] that we
23080 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20   are working on 
23090 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
230a0 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f  pWLoop;        /
230b0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65  * One of the Whe
230c0 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a  reLoop objects *
230d0 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  /.  WhereLoop **
230e0 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pX;           /*
230f0 20 55 73 65 64 20 74 6f 20 64 69 76 79 20 75 70   Used to divy up
23100 20 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f   the pSpace memo
23110 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 2a  ry */.  LogEst *
23120 61 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b 20 20  aSortCost = 0;  
23130 20 20 2f 2a 20 53 6f 72 74 69 6e 67 20 61 6e 64    /* Sorting and
23140 20 70 61 72 74 69 61 6c 20 73 6f 72 74 69 6e 67   partial sorting
23150 20 63 6f 73 74 73 20 2a 2f 0a 20 20 63 68 61 72   costs */.  char
23160 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 20   *pSpace;       
23170 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
23180 72 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  ry memory used b
23190 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a  y this routine *
231a0 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63 65 3b 20  /.  int nSpace; 
231b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
231c0 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   Bytes of space 
231d0 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 70 53 70  allocated at pSp
231e0 61 63 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ace */..  pParse
231f0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
23200 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  e;.  db = pParse
23210 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20  ->db;.  nLoop = 
23220 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a  pWInfo->nLevel;.
23230 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72    /* TUNING: For
23240 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65 73 2c   simple queries,
23250 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74 20 70   only the best p
23260 61 74 68 20 69 73 20 74 72 61 63 6b 65 64 2e 0a  ath is tracked..
23270 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a    ** For 2-way j
23280 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65 73 74  oins, the 5 best
23290 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f   paths are follo
232a0 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f  wed..  ** For jo
232b0 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65  ins of 3 or more
232c0 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b 20 74   tables, track t
232d0 68 65 20 31 30 20 62 65 73 74 20 70 61 74 68 73  he 10 best paths
232e0 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d   */.  mxChoice =
232f0 20 28 6e 4c 6f 6f 70 3c 3d 31 29 20 3f 20 31 20   (nLoop<=1) ? 1 
23300 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20  : (nLoop==2 ? 5 
23310 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72 74 28  : 10);.  assert(
23320 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e   nLoop<=pWInfo->
23330 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
23340 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  ;.  WHERETRACE(0
23350 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67  x002, ("---- beg
23360 69 6e 20 73 6f 6c 76 65 72 2e 20 20 28 6e 52 6f  in solver.  (nRo
23370 77 45 73 74 3d 25 64 29 5c 6e 22 2c 20 6e 52 6f  wEst=%d)\n", nRo
23380 77 45 73 74 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  wEst));..  /* If
23390 20 6e 52 6f 77 45 73 74 20 69 73 20 7a 65 72 6f   nRowEst is zero
233a0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e   and there is an
233b0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
233c0 2c 20 69 67 6e 6f 72 65 20 69 74 2e 20 49 6e 20  , ignore it. In 
233d0 74 68 69 73 0a 20 20 2a 2a 20 63 61 73 65 20 74  this.  ** case t
233e0 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68  he purpose of th
233f0 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 65 73  is call is to es
23400 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
23410 72 20 6f 66 20 72 6f 77 73 20 72 65 74 75 72 6e  r of rows return
23420 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6f  ed.  ** by the o
23430 76 65 72 61 6c 6c 20 71 75 65 72 79 2e 20 4f 6e  verall query. On
23440 63 65 20 74 68 69 73 20 65 73 74 69 6d 61 74 65  ce this estimate
23450 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e   has been obtain
23460 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 0a 20  ed, the caller. 
23470 20 2a 2a 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20   ** will invoke 
23480 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 20  this function a 
23490 73 65 63 6f 6e 64 20 74 69 6d 65 2c 20 70 61 73  second time, pas
234a0 73 69 6e 67 20 74 68 65 20 65 73 74 69 6d 61 74  sing the estimat
234b0 65 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 6e 52  e as the.  ** nR
234c0 6f 77 45 73 74 20 70 61 72 61 6d 65 74 65 72 2e  owEst parameter.
234d0 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66    */.  if( pWInf
234e0 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  o->pOrderBy==0 |
234f0 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a  | nRowEst==0 ){.
23500 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30      nOrderBy = 0
23510 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
23520 4f 72 64 65 72 42 79 20 3d 20 70 57 49 6e 66 6f  OrderBy = pWInfo
23530 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
23540 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c  r;.  }..  /* All
23550 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
23560 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61  lize space for a
23570 54 6f 2c 20 61 46 72 6f 6d 20 61 6e 64 20 61 53  To, aFrom and aS
23580 6f 72 74 43 6f 73 74 5b 5d 20 2a 2f 0a 20 20 6e  ortCost[] */.  n
23590 53 70 61 63 65 20 3d 20 28 73 69 7a 65 6f 66 28  Space = (sizeof(
235a0 57 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f  WherePath)+sizeo
235b0 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c  f(WhereLoop*)*nL
235c0 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b  oop)*mxChoice*2;
235d0 0a 20 20 6e 53 70 61 63 65 20 2b 3d 20 73 69 7a  .  nSpace += siz
235e0 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f  eof(LogEst) * nO
235f0 72 64 65 72 42 79 3b 0a 20 20 70 53 70 61 63 65  rderBy;.  pSpace
23600 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
23610 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 53 70 61  ocRawNN(db, nSpa
23620 63 65 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63  ce);.  if( pSpac
23630 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
23640 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
23650 0a 20 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50  .  aTo = (WhereP
23660 61 74 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61  ath*)pSpace;.  a
23670 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f  From = aTo+mxCho
23680 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46  ice;.  memset(aF
23690 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  rom, 0, sizeof(a
236a0 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20  From[0]));.  pX 
236b0 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28  = (WhereLoop**)(
236c0 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b  aFrom+mxChoice);
236d0 0a 20 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69  .  for(ii=mxChoi
236e0 63 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b  ce*2, pFrom=aTo;
236f0 20 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72   ii>0; ii--, pFr
23700 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f  om++, pX += nLoo
23710 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61  p){.    pFrom->a
23720 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 20  Loop = pX;.  }. 
23730 20 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b   if( nOrderBy ){
23740 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
23750 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
23760 63 6c 61 75 73 65 20 61 6e 64 20 69 74 20 69 73  clause and it is
23770 20 6e 6f 74 20 62 65 69 6e 67 20 69 67 6e 6f 72   not being ignor
23780 65 64 2c 20 73 65 74 20 75 70 0a 20 20 20 20 2a  ed, set up.    *
23790 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  * space for the 
237a0 61 53 6f 72 74 43 6f 73 74 5b 5d 20 61 72 72 61  aSortCost[] arra
237b0 79 2e 20 45 61 63 68 20 65 6c 65 6d 65 6e 74 20  y. Each element 
237c0 6f 66 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74  of the aSortCost
237d0 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 69 73   array.    ** is
237e0 20 65 69 74 68 65 72 20 7a 65 72 6f 20 2d 20 6d   either zero - m
237f0 65 61 6e 69 6e 67 20 69 74 20 68 61 73 20 6e 6f  eaning it has no
23800 74 20 79 65 74 20 62 65 65 6e 20 69 6e 69 74 69  t yet been initi
23810 61 6c 69 7a 65 64 20 2d 20 6f 72 20 74 68 65 0a  alized - or the.
23820 20 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 73      ** cost of s
23830 6f 72 74 69 6e 67 20 6e 52 6f 77 45 73 74 20 72  orting nRowEst r
23840 6f 77 73 20 6f 66 20 64 61 74 61 20 77 68 65 72  ows of data wher
23850 65 20 74 68 65 20 66 69 72 73 74 20 58 20 74 65  e the first X te
23860 72 6d 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  rms of.    ** th
23870 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
23880 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  e are already in
23890 20 6f 72 64 65 72 2c 20 77 68 65 72 65 20 58 20   order, where X 
238a0 69 73 20 74 68 65 20 61 72 72 61 79 20 0a 20 20  is the array .  
238b0 20 20 2a 2a 20 69 6e 64 65 78 2e 20 20 2a 2f 0a    ** index.  */.
238c0 20 20 20 20 61 53 6f 72 74 43 6f 73 74 20 3d 20      aSortCost = 
238d0 28 4c 6f 67 45 73 74 2a 29 70 58 3b 0a 20 20 20  (LogEst*)pX;.   
238e0 20 6d 65 6d 73 65 74 28 61 53 6f 72 74 43 6f 73   memset(aSortCos
238f0 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 67  t, 0, sizeof(Log
23900 45 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 29  Est) * nOrderBy)
23910 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
23920 61 53 6f 72 74 43 6f 73 74 3d 3d 30 20 7c 7c 20  aSortCost==0 || 
23930 26 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d  &pSpace[nSpace]=
23940 3d 28 63 68 61 72 2a 29 26 61 53 6f 72 74 43 6f  =(char*)&aSortCo
23950 73 74 5b 6e 4f 72 64 65 72 42 79 5d 20 29 3b 0a  st[nOrderBy] );.
23960 20 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 43    assert( aSortC
23970 6f 73 74 21 3d 30 20 7c 7c 20 26 70 53 70 61 63  ost!=0 || &pSpac
23980 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72  e[nSpace]==(char
23990 2a 29 70 58 20 29 3b 0a 0a 20 20 2f 2a 20 53 65  *)pX );..  /* Se
239a0 65 64 20 74 68 65 20 73 65 61 72 63 68 20 77 69  ed the search wi
239b0 74 68 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72  th a single Wher
239c0 65 50 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67  ePath containing
239d0 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73   zero WhereLoops
239e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49  ..  **.  ** TUNI
239f0 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74  NG: Do not let t
23a00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65  he number of ite
23a10 72 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65  rations go above
23a20 20 32 38 2e 20 20 49 66 20 74 68 65 20 63 6f 73   28.  If the cos
23a30 74 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74  t.  ** of comput
23a40 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ing an automatic
23a50 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61   index is not pa
23a60 69 64 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74  id back within t
23a70 68 65 20 66 69 72 73 74 20 32 38 0a 20 20 2a 2a  he first 28.  **
23a80 20 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e   rows, then do n
23a90 6f 74 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d  ot use the autom
23aa0 61 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20  atic index. */. 
23ab0 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d   aFrom[0].nRow =
23ac0 20 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75   MIN(pParse->nQu
23ad0 65 72 79 4c 6f 6f 70 2c 20 34 38 29 3b 20 20 61  eryLoop, 48);  a
23ae0 73 73 65 72 74 28 20 34 38 3d 3d 73 71 6c 69 74  ssert( 48==sqlit
23af0 65 33 4c 6f 67 45 73 74 28 32 38 29 20 29 3b 0a  e3LogEst(28) );.
23b00 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 20 20 61    nFrom = 1;.  a
23b10 73 73 65 72 74 28 20 61 46 72 6f 6d 5b 30 5d 2e  ssert( aFrom[0].
23b20 69 73 4f 72 64 65 72 65 64 3d 3d 30 20 29 3b 0a  isOrdered==0 );.
23b30 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29    if( nOrderBy )
23b40 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 4c 6f 6f  {.    /* If nLoo
23b50 70 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p is zero, then 
23b60 74 68 65 72 65 20 61 72 65 20 6e 6f 20 46 52 4f  there are no FRO
23b70 4d 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 71  M terms in the q
23b80 75 65 72 79 2e 20 53 69 6e 63 65 0a 20 20 20 20  uery. Since.    
23b90 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  ** in this case 
23ba0 74 68 65 20 71 75 65 72 79 20 6d 61 79 20 72 65  the query may re
23bb0 74 75 72 6e 20 61 20 6d 61 78 69 6d 75 6d 20 6f  turn a maximum o
23bc0 66 20 6f 6e 65 20 72 6f 77 2c 20 74 68 65 20 72  f one row, the r
23bd0 65 73 75 6c 74 73 0a 20 20 20 20 2a 2a 20 61 72  esults.    ** ar
23be0 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  e already in the
23bf0 20 72 65 71 75 65 73 74 65 64 20 6f 72 64 65 72   requested order
23c00 2e 20 53 65 74 20 69 73 4f 72 64 65 72 65 64 20  . Set isOrdered 
23c10 74 6f 20 6e 4f 72 64 65 72 42 79 20 74 6f 0a 20  to nOrderBy to. 
23c20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 20 74     ** indicate t
23c30 68 69 73 2e 20 4f 72 2c 20 69 66 20 6e 4c 6f 6f  his. Or, if nLoo
23c40 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  p is greater tha
23c50 6e 20 7a 65 72 6f 2c 20 73 65 74 20 69 73 4f 72  n zero, set isOr
23c60 64 65 72 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  dered to.    ** 
23c70 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  -1, indicating t
23c80 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 73  hat the result s
23c90 65 74 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  et may or may no
23ca0 74 20 62 65 20 6f 72 64 65 72 65 64 2c 20 0a 20  t be ordered, . 
23cb0 20 20 20 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20     ** depending 
23cc0 6f 6e 20 74 68 65 20 6c 6f 6f 70 73 20 61 64 64  on the loops add
23cd0 65 64 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ed to the curren
23ce0 74 20 70 6c 61 6e 2e 20 20 2a 2f 0a 20 20 20 20  t plan.  */.    
23cf0 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72  aFrom[0].isOrder
23d00 65 64 20 3d 20 6e 4c 6f 6f 70 3e 30 20 3f 20 2d  ed = nLoop>0 ? -
23d10 31 20 3a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  1 : nOrderBy;.  
23d20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
23d30 73 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e  successively lon
23d40 67 65 72 20 57 68 65 72 65 50 61 74 68 73 20 75  ger WherePaths u
23d50 73 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75  sing the previou
23d60 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a  s generation.  *
23d70 2a 20 6f 66 20 57 68 65 72 65 50 61 74 68 73 20  * of WherePaths 
23d80 61 73 20 74 68 65 20 62 61 73 69 73 20 66 6f 72  as the basis for
23d90 20 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70   the next.  Keep
23da0 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78   track of the mx
23db0 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74  Choice.  ** best
23dc0 20 70 61 74 68 73 20 61 74 20 65 61 63 68 20 67   paths at each g
23dd0 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66  eneration */.  f
23de0 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f  or(iLoop=0; iLoo
23df0 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  p<nLoop; iLoop++
23e00 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a  ){.    nTo = 0;.
23e10 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46      for(ii=0, pF
23e20 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46  rom=aFrom; ii<nF
23e30 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d  rom; ii++, pFrom
23e40 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  ++){.      for(p
23e50 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c  WLoop=pWInfo->pL
23e60 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57  oops; pWLoop; pW
23e70 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65  Loop=pWLoop->pNe
23e80 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20  xtLoop){.       
23e90 20 4c 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20 20   LogEst nOut;   
23ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23eb0 20 20 20 2f 2a 20 52 6f 77 73 20 76 69 73 69 74     /* Rows visit
23ec0 65 64 20 62 79 20 28 70 46 72 6f 6d 2b 70 57 4c  ed by (pFrom+pWL
23ed0 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  oop) */.        
23ee0 4c 6f 67 45 73 74 20 72 43 6f 73 74 3b 20 20 20  LogEst rCost;   
23ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f00 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 70 61 74    /* Cost of pat
23f10 68 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29  h (pFrom+pWLoop)
23f20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45   */.        LogE
23f30 73 74 20 72 55 6e 73 6f 72 74 65 64 3b 20 20 20  st rUnsorted;   
23f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23f50 20 55 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f   Unsorted cost o
23f60 66 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29  f (pFrom+pWLoop)
23f70 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 38 20 69   */.        i8 i
23f80 73 4f 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d  sOrdered = pFrom
23f90 2d 3e 69 73 4f 72 64 65 72 65 64 3b 20 20 2f 2a  ->isOrdered;  /*
23fa0 20 69 73 4f 72 64 65 72 65 64 20 66 6f 72 20 28   isOrdered for (
23fb0 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f  pFrom+pWLoop) */
23fc0 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
23fd0 20 6d 61 73 6b 4e 65 77 3b 20 20 20 20 20 20 20   maskNew;       
23fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
23ff0 73 6b 20 6f 66 20 73 72 63 20 76 69 73 69 74 65  sk of src visite
24000 64 20 62 79 20 28 2e 2e 29 20 2a 2f 0a 20 20 20  d by (..) */.   
24010 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76       Bitmask rev
24020 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  Mask = 0;       
24030 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
24040 66 20 72 65 76 2d 6f 72 64 65 72 20 6c 6f 6f 70  f rev-order loop
24050 73 20 66 6f 72 20 28 2e 2e 29 20 2a 2f 0a 0a 20  s for (..) */.. 
24060 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f         if( (pWLo
24070 6f 70 2d 3e 70 72 65 72 65 71 20 26 20 7e 70 46  op->prereq & ~pF
24080 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d  rom->maskLoop)!=
24090 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
240a0 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f        if( (pWLoo
240b0 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70 46  p->maskSelf & pF
240c0 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d  rom->maskLoop)!=
240d0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
240e0 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f        if( (pWLoo
240f0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
24100 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
24110 30 20 26 26 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77  0 && pFrom->nRow
24120 3c 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  <10 ){.         
24130 20 2f 2a 20 44 6f 20 6e 6f 74 20 75 73 65 20 61   /* Do not use a
24140 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
24150 78 20 69 66 20 74 68 65 20 74 68 69 73 20 6c 6f  x if the this lo
24160 6f 70 20 69 73 20 65 78 70 65 63 74 65 64 0a 20  op is expected. 
24170 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 72           ** to r
24180 75 6e 20 6c 65 73 73 20 74 68 61 6e 20 32 20 74  un less than 2 t
24190 69 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  imes. */.       
241a0 20 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73     assert( 10==s
241b0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20  qlite3LogEst(2) 
241c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  );.          con
241d0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
241e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74  .        /* At t
241f0 68 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f  his point, pWLoo
24200 70 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  p is a candidate
24210 20 74 6f 20 62 65 20 74 68 65 20 6e 65 78 74 20   to be the next 
24220 6c 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20 20 2a  loop. .        *
24230 2a 20 43 6f 6d 70 75 74 65 20 69 74 73 20 63 6f  * Compute its co
24240 73 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 55  st */.        rU
24250 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65  nsorted = sqlite
24260 33 4c 6f 67 45 73 74 41 64 64 28 70 57 4c 6f 6f  3LogEstAdd(pWLoo
24270 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70  p->rSetup,pWLoop
24280 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e  ->rRun + pFrom->
24290 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 72  nRow);.        r
242a0 55 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c 69 74  Unsorted = sqlit
242b0 65 33 4c 6f 67 45 73 74 41 64 64 28 72 55 6e 73  e3LogEstAdd(rUns
242c0 6f 72 74 65 64 2c 20 70 46 72 6f 6d 2d 3e 72 55  orted, pFrom->rU
242d0 6e 73 6f 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nsorted);.      
242e0 20 20 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e    nOut = pFrom->
242f0 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e  nRow + pWLoop->n
24300 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 6d 61 73  Out;.        mas
24310 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61  kNew = pFrom->ma
24320 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d  skLoop | pWLoop-
24330 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20  >maskSelf;.     
24340 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 65 64     if( isOrdered
24350 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
24360 69 73 4f 72 64 65 72 65 64 20 3d 20 77 68 65 72  isOrdered = wher
24370 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
24380 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20  derBy(pWInfo,.  
24390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243a0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72       pWInfo->pOr
243b0 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57  derBy, pFrom, pW
243c0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
243d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
243e0 20 20 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20           iLoop, 
243f0 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b  pWLoop, &revMask
24400 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
24410 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 4d  {.          revM
24420 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76  ask = pFrom->rev
24430 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Loop;.        }.
24440 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72          if( isOr
24450 64 65 72 65 64 3e 3d 30 20 26 26 20 69 73 4f 72  dered>=0 && isOr
24460 64 65 72 65 64 3c 6e 4f 72 64 65 72 42 79 20 29  dered<nOrderBy )
24470 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
24480 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65  aSortCost[isOrde
24490 72 65 64 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  red]==0 ){.     
244a0 20 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74         aSortCost
244b0 5b 69 73 4f 72 64 65 72 65 64 5d 20 3d 20 77 68  [isOrdered] = wh
244c0 65 72 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a  ereSortingCost(.
244d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244e0 70 57 49 6e 66 6f 2c 20 6e 52 6f 77 45 73 74 2c  pWInfo, nRowEst,
244f0 20 6e 4f 72 64 65 72 42 79 2c 20 69 73 4f 72 64   nOrderBy, isOrd
24500 65 72 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  ered.           
24510 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   );.          }.
24520 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20            rCost 
24530 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
24540 64 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 61 53  dd(rUnsorted, aS
24550 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65  ortCost[isOrdere
24560 64 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  d]);..          
24570 57 48 45 52 45 54 52 41 43 45 28 30 78 30 30 32  WHERETRACE(0x002
24580 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
24590 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74  ("---- sort cost
245a0 3d 25 2d 33 64 20 28 25 64 2f 25 64 29 20 69 6e  =%-3d (%d/%d) in
245b0 63 72 65 61 73 65 73 20 63 6f 73 74 20 25 33 64  creases cost %3d
245c0 20 74 6f 20 25 2d 33 64 5c 6e 22 2c 0a 20 20 20   to %-3d\n",.   
245d0 20 20 20 20 20 20 20 20 20 20 20 20 61 53 6f 72              aSor
245e0 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d  tCost[isOrdered]
245f0 2c 20 28 6e 4f 72 64 65 72 42 79 2d 69 73 4f 72  , (nOrderBy-isOr
24600 64 65 72 65 64 29 2c 20 6e 4f 72 64 65 72 42 79  dered), nOrderBy
24610 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
24620 20 20 72 55 6e 73 6f 72 74 65 64 2c 20 72 43 6f    rUnsorted, rCo
24630 73 74 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  st));.        }e
24640 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
24650 43 6f 73 74 20 3d 20 72 55 6e 73 6f 72 74 65 64  Cost = rUnsorted
24660 3b 0a 20 20 20 20 20 20 20 20 20 20 72 55 6e 73  ;.          rUns
24670 6f 72 74 65 64 20 2d 3d 20 32 3b 20 20 2f 2a 20  orted -= 2;  /* 
24680 54 55 4e 49 4e 47 3a 20 20 53 6c 69 67 68 74 20  TUNING:  Slight 
24690 62 69 61 73 20 69 6e 20 66 61 76 6f 72 20 6f 66  bias in favor of
246a0 20 6e 6f 2d 73 6f 72 74 20 70 6c 61 6e 73 20 2a   no-sort plans *
246b0 2f 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  /.        }..   
246c0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
246d0 20 73 65 65 20 69 66 20 70 57 4c 6f 6f 70 20 73   see if pWLoop s
246e0 68 6f 75 6c 64 20 62 65 20 61 64 64 65 64 20 74  hould be added t
246f0 6f 20 74 68 65 20 73 65 74 20 6f 66 0a 20 20 20  o the set of.   
24700 20 20 20 20 20 2a 2a 20 6d 78 43 68 6f 69 63 65       ** mxChoice
24710 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74   best-so-far pat
24720 68 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  hs..        **. 
24730 20 20 20 20 20 20 20 2a 2a 20 46 69 72 73 74 20         ** First 
24740 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69 73  look for an exis
24750 74 69 6e 67 20 70 61 74 68 20 61 6d 6f 6e 67 20  ting path among 
24760 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68  best-so-far path
24770 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  s.        ** tha
24780 74 20 63 6f 76 65 72 73 20 74 68 65 20 73 61 6d  t covers the sam
24790 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61  e set of loops a
247a0 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  nd has the same 
247b0 69 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20 20  isOrdered.      
247c0 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 61 73 20    ** setting as 
247d0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 74 68  the current path
247e0 20 63 61 6e 64 69 64 61 74 65 2e 0a 20 20 20 20   candidate..    
247f0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
24800 2a 20 54 68 65 20 74 65 72 6d 20 22 28 28 70 54  * The term "((pT
24810 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f  o->isOrdered^isO
24820 72 64 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30  rdered)&0x80)==0
24830 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 0a  " is equivalent.
24840 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 28 70          ** to (p
24850 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 28  To->isOrdered==(
24860 2d 31 29 29 3d 3d 28 69 73 4f 72 64 65 72 65 64  -1))==(isOrdered
24870 3d 3d 28 2d 31 29 29 22 20 66 6f 72 20 74 68 65  ==(-1))" for the
24880 20 72 61 6e 67 65 0a 20 20 20 20 20 20 20 20 2a   range.        *
24890 2a 20 6f 66 20 6c 65 67 61 6c 20 76 61 6c 75 65  * of legal value
248a0 73 20 66 6f 72 20 69 73 4f 72 64 65 72 65 64 2c  s for isOrdered,
248b0 20 2d 31 2e 2e 36 34 2e 0a 20 20 20 20 20 20 20   -1..64..       
248c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
248d0 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a  jj=0, pTo=aTo; j
248e0 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f  j<nTo; jj++, pTo
248f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
24900 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70  f( pTo->maskLoop
24910 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20 20 20 20 20  ==maskNew.      
24920 20 20 20 20 20 26 26 20 28 28 70 54 6f 2d 3e 69       && ((pTo->i
24930 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72  sOrdered^isOrder
24940 65 64 29 26 30 78 38 30 29 3d 3d 30 0a 20 20 20  ed)&0x80)==0.   
24950 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
24960 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
24970 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20 20  jj==nTo-1 );.   
24980 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
24990 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
249a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
249b0 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20  ( jj>=nTo ){.   
249c0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 65 20 6f         /* None o
249d0 66 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 62  f the existing b
249e0 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73  est-so-far paths
249f0 20 6d 61 74 63 68 20 74 68 65 20 63 61 6e 64 69   match the candi
24a00 64 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  date. */.       
24a10 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68     if( nTo>=mxCh
24a20 6f 69 63 65 0a 20 20 20 20 20 20 20 20 20 20 20  oice.           
24a30 26 26 20 28 72 43 6f 73 74 3e 6d 78 43 6f 73 74  && (rCost>mxCost
24a40 20 7c 7c 20 28 72 43 6f 73 74 3d 3d 6d 78 43 6f   || (rCost==mxCo
24a50 73 74 20 26 26 20 72 55 6e 73 6f 72 74 65 64 3e  st && rUnsorted>
24a60 3d 6d 78 55 6e 73 6f 72 74 65 64 29 29 0a 20 20  =mxUnsorted)).  
24a70 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
24a80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
24a90 72 72 65 6e 74 20 63 61 6e 64 69 64 61 74 65 20  rrent candidate 
24aa0 69 73 20 6e 6f 20 62 65 74 74 65 72 20 74 68 61  is no better tha
24ab0 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6d 78 43  n any of the mxC
24ac0 68 6f 69 63 65 0a 20 20 20 20 20 20 20 20 20 20  hoice.          
24ad0 20 20 2a 2a 20 70 61 74 68 73 20 63 75 72 72 65    ** paths curre
24ae0 6e 74 6c 79 20 69 6e 20 74 68 65 20 62 65 73 74  ntly in the best
24af0 2d 73 6f 2d 66 61 72 20 62 75 66 66 65 72 2e 20  -so-far buffer. 
24b00 20 53 6f 20 64 69 73 63 61 72 64 0a 20 20 20 20   So discard.    
24b10 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
24b20 63 61 6e 64 69 64 61 74 65 20 61 73 20 6e 6f 74  candidate as not
24b30 20 76 69 61 62 6c 65 2e 20 2a 2f 0a 23 69 66 64   viable. */.#ifd
24b40 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
24b50 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a  ABLED /* 0x4 */.
24b60 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
24b70 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
24b80 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
24b90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
24ba0 62 75 67 50 72 69 6e 74 66 28 22 53 6b 69 70 20  bugPrintf("Skip 
24bb0 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25    %s cost=%-3d,%
24bc0 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c  3d,%3d order=%c\
24bd0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
24be0 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e        wherePathN
24bf0 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70  ame(pFrom, iLoop
24c00 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74  , pWLoop), rCost
24c10 2c 20 6e 4f 75 74 2c 20 72 55 6e 73 6f 72 74 65  , nOut, rUnsorte
24c20 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
24c30 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d       isOrdered>=
24c40 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30  0 ? isOrdered+'0
24c50 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
24c60 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
24c70 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
24c80 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
24c90 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
24ca0 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
24cb0 6f 69 6e 74 73 20 69 74 20 6d 65 61 6e 73 20 74  oints it means t
24cc0 68 61 74 20 74 68 65 20 6e 65 77 20 63 61 6e 64  hat the new cand
24cd0 69 64 61 74 65 20 70 61 74 68 0a 20 20 20 20 20  idate path.     
24ce0 20 20 20 20 20 2a 2a 20 6e 65 65 64 73 20 74 6f       ** needs to
24cf0 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65   be added to the
24d00 20 73 65 74 20 6f 66 20 62 65 73 74 2d 73 6f 2d   set of best-so-
24d10 66 61 72 20 70 61 74 68 73 2e 20 2a 2f 0a 20 20  far paths. */.  
24d20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f 3c          if( nTo<
24d30 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20  mxChoice ){.    
24d40 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65          /* Incre
24d50 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
24d60 74 68 65 20 61 54 6f 20 73 65 74 20 62 79 20 6f  the aTo set by o
24d70 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ne */.          
24d80 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20    jj = nTo++;.  
24d90 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
24da0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
24db0 77 20 70 61 74 68 20 72 65 70 6c 61 63 65 73 20  w path replaces 
24dc0 74 68 65 20 70 72 69 6f 72 20 77 6f 72 73 74 20  the prior worst 
24dd0 74 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20 62 65  to keep count be
24de0 6c 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f 0a  low mxChoice */.
24df0 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 3d              jj =
24e00 20 6d 78 49 3b 0a 20 20 20 20 20 20 20 20 20 20   mxI;.          
24e10 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f 20  }.          pTo 
24e20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64  = &aTo[jj];.#ifd
24e30 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
24e40 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a  ABLED /* 0x4 */.
24e50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
24e60 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26  lite3WhereTrace&
24e70 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  0x4 ){.         
24e80 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
24e90 72 69 6e 74 66 28 22 4e 65 77 20 20 20 20 25 73  rintf("New    %s
24ea0 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25   cost=%-3d,%3d,%
24eb0 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  3d order=%c\n",.
24ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ed0 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46  wherePathName(pF
24ee0 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f  rom, iLoop, pWLo
24ef0 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74  op), rCost, nOut
24f00 2c 20 72 55 6e 73 6f 72 74 65 64 2c 0a 20 20 20  , rUnsorted,.   
24f10 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f               isO
24f20 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72  rdered>=0 ? isOr
24f30 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29  dered+'0' : '?')
24f40 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
24f50 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65 6c  ndif.        }el
24f60 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
24f70 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65 73   Control reaches
24f80 20 68 65 72 65 20 69 66 20 62 65 73 74 2d 73 6f   here if best-so
24f90 2d 66 61 72 20 70 61 74 68 20 70 54 6f 3d 61 54  -far path pTo=aT
24fa0 6f 5b 6a 6a 5d 20 63 6f 76 65 72 73 20 74 68 65  o[jj] covers the
24fb0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61  .          ** sa
24fc0 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20  me set of loops 
24fd0 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 65  and has the same
24fe0 20 69 73 4f 72 64 65 72 65 64 20 73 65 74 74 69   isOrdered setti
24ff0 6e 67 20 61 73 20 74 68 65 0a 20 20 20 20 20 20  ng as the.      
25000 20 20 20 20 2a 2a 20 63 61 6e 64 69 64 61 74 65      ** candidate
25010 20 70 61 74 68 2e 20 20 43 68 65 63 6b 20 74 6f   path.  Check to
25020 20 73 65 65 20 69 66 20 74 68 65 20 63 61 6e 64   see if the cand
25030 69 64 61 74 65 20 73 68 6f 75 6c 64 20 72 65 70  idate should rep
25040 6c 61 63 65 0a 20 20 20 20 20 20 20 20 20 20 2a  lace.          *
25050 2a 20 70 54 6f 20 6f 72 20 69 66 20 74 68 65 20  * pTo or if the 
25060 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c 64  candidate should
25070 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 20   be skipped..   
25080 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20         ** .     
25090 20 20 20 20 20 2a 2a 20 54 68 65 20 63 6f 6e 64       ** The cond
250a0 69 74 69 6f 6e 61 6c 20 69 73 20 61 6e 20 65 78  itional is an ex
250b0 70 61 6e 64 65 64 20 76 65 63 74 6f 72 20 63 6f  panded vector co
250c0 6d 70 61 72 69 73 6f 6e 20 65 71 75 69 76 61 6c  mparison equival
250d0 65 6e 74 20 74 6f 3a 0a 20 20 20 20 20 20 20 20  ent to:.        
250e0 20 20 2a 2a 20 20 20 28 70 54 6f 2d 3e 72 43 6f    **   (pTo->rCo
250f0 73 74 2c 70 54 6f 2d 3e 6e 52 6f 77 2c 70 54 6f  st,pTo->nRow,pTo
25100 2d 3e 72 55 6e 73 6f 72 74 65 64 29 20 3c 3d 20  ->rUnsorted) <= 
25110 28 72 43 6f 73 74 2c 6e 4f 75 74 2c 72 55 6e 73  (rCost,nOut,rUns
25120 6f 72 74 65 64 29 0a 20 20 20 20 20 20 20 20 20  orted).         
25130 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
25140 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3c 72 43 6f  ( pTo->rCost<rCo
25150 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  st .           |
25160 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72  | (pTo->rCost==r
25170 43 6f 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  Cost.           
25180 20 20 20 20 26 26 20 28 70 54 6f 2d 3e 6e 52 6f      && (pTo->nRo
25190 77 3c 6e 4f 75 74 0a 20 20 20 20 20 20 20 20 20  w<nOut.         
251a0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54            || (pT
251b0 6f 2d 3e 6e 52 6f 77 3d 3d 6e 4f 75 74 20 26 26  o->nRow==nOut &&
251c0 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3c   pTo->rUnsorted<
251d0 3d 72 55 6e 73 6f 72 74 65 64 29 0a 20 20 20 20  =rUnsorted).    
251e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
251f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29 0a                ).
25200 20 20 20 20 20 20 20 20 20 20 29 7b 0a 23 69 66            ){.#if
25210 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
25220 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f  NABLED /* 0x4 */
25230 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
25240 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
25250 63 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20  ce&0x4 ){.      
25260 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
25270 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
25280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
25290 6b 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d  kip   %s cost=%-
252a0 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72  3d,%3d,%3d order
252b0 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%c",.          
252c0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
252d0 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f  hName(pFrom, iLo
252e0 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f  op, pWLoop), rCo
252f0 73 74 2c 20 6e 4f 75 74 2c 20 72 55 6e 73 6f 72  st, nOut, rUnsor
25300 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
25310 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
25320 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b  >=0 ? isOrdered+
25330 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
25340 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25350 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
25360 20 76 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64   vs %s cost=%-3d
25370 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25  ,%3d,%3d order=%
25380 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c\n",.          
25390 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
253a0 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70  hName(pTo, iLoop
253b0 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f  +1, 0), pTo->rCo
253c0 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20  st, pTo->nRow,. 
253d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253e0 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 2c   pTo->rUnsorted,
253f0 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e   pTo->isOrdered>
25400 3d 30 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65  =0 ? pTo->isOrde
25410 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
25420 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65              }.#e
25430 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 20  ndif.           
25440 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68 65 20   /* Discard the 
25450 63 61 6e 64 69 64 61 74 65 20 70 61 74 68 20 66  candidate path f
25460 72 6f 6d 20 66 75 72 74 68 65 72 20 63 6f 6e 73  rom further cons
25470 69 64 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  ideration */.   
25480 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
25490 65 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72  e( pTo->rCost==r
254a0 43 6f 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Cost );.        
254b0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
254c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
254d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
254e0 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 2b  o->rCost==rCost+
254f0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  1 );.          /
25500 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68 65  * Control reache
25510 73 20 68 65 72 65 20 69 66 20 74 68 65 20 63 61  s here if the ca
25520 6e 64 69 64 61 74 65 20 70 61 74 68 20 69 73 20  ndidate path is 
25530 62 65 74 74 65 72 20 74 68 61 6e 20 74 68 65 0a  better than the.
25540 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54 6f            ** pTo
25550 20 70 61 74 68 2e 20 20 52 65 70 6c 61 63 65 20   path.  Replace 
25560 70 54 6f 20 77 69 74 68 20 74 68 65 20 63 61 6e  pTo with the can
25570 64 69 64 61 74 65 2e 20 2a 2f 0a 23 69 66 64 65  didate. */.#ifde
25580 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
25590 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20  BLED /* 0x4 */. 
255a0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
255b0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
255c0 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
255d0 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
255e0 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
255f0 20 20 20 20 20 20 22 55 70 64 61 74 65 20 25 73        "Update %s
25600 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25   cost=%-3d,%3d,%
25610 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20  3d order=%c",.  
25620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
25630 65 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f  erePathName(pFro
25640 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70  m, iLoop, pWLoop
25650 29 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 20  ), rCost, nOut, 
25660 72 55 6e 73 6f 72 74 65 64 2c 0a 20 20 20 20 20  rUnsorted,.     
25670 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 72 64             isOrd
25680 65 72 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65  ered>=0 ? isOrde
25690 72 65 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a  red+'0' : '?');.
256a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
256b0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
256c0 20 20 77 61 73 20 25 73 20 63 6f 73 74 3d 25 2d    was %s cost=%-
256d0 33 64 2c 25 33 64 2c 25 33 64 20 6f 72 64 65 72  3d,%3d,%3d order
256e0 3d 25 63 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%c\n",.        
256f0 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74          wherePat
25700 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f 70  hName(pTo, iLoop
25710 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43 6f  +1, 0), pTo->rCo
25720 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20  st, pTo->nRow,. 
25730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
25740 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 2c 20 70  To->rUnsorted, p
25750 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30  To->isOrdered>=0
25760 20 3f 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65   ? pTo->isOrdere
25770 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
25780 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
25790 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
257a0 20 20 20 2f 2a 20 70 57 4c 6f 6f 70 20 69 73 20     /* pWLoop is 
257b0 61 20 77 69 6e 6e 65 72 2e 20 20 41 64 64 20 69  a winner.  Add i
257c0 74 20 74 6f 20 74 68 65 20 73 65 74 20 6f 66 20  t to the set of 
257d0 62 65 73 74 20 73 6f 20 66 61 72 20 2a 2f 0a 20  best so far */. 
257e0 20 20 20 20 20 20 20 70 54 6f 2d 3e 6d 61 73 6b         pTo->mask
257f0 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61  Loop = pFrom->ma
25800 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d  skLoop | pWLoop-
25810 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20  >maskSelf;.     
25820 20 20 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20     pTo->revLoop 
25830 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20  = revMask;.     
25840 20 20 20 70 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e     pTo->nRow = n
25850 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  Out;.        pTo
25860 2d 3e 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b  ->rCost = rCost;
25870 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 55  .        pTo->rU
25880 6e 73 6f 72 74 65 64 20 3d 20 72 55 6e 73 6f 72  nsorted = rUnsor
25890 74 65 64 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  ted;.        pTo
258a0 2d 3e 69 73 4f 72 64 65 72 65 64 20 3d 20 69 73  ->isOrdered = is
258b0 4f 72 64 65 72 65 64 3b 0a 20 20 20 20 20 20 20  Ordered;.       
258c0 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 6f   memcpy(pTo->aLo
258d0 6f 70 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  op, pFrom->aLoop
258e0 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f  , sizeof(WhereLo
258f0 6f 70 2a 29 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20  op*)*iLoop);.   
25900 20 20 20 20 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b       pTo->aLoop[
25910 69 4c 6f 6f 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b  iLoop] = pWLoop;
25920 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f  .        if( nTo
25930 3e 3d 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20  >=mxChoice ){.  
25940 20 20 20 20 20 20 20 20 6d 78 49 20 3d 20 30 3b          mxI = 0;
25950 0a 20 20 20 20 20 20 20 20 20 20 6d 78 43 6f 73  .          mxCos
25960 74 20 3d 20 61 54 6f 5b 30 5d 2e 72 43 6f 73 74  t = aTo[0].rCost
25970 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 78 55 6e  ;.          mxUn
25980 73 6f 72 74 65 64 20 3d 20 61 54 6f 5b 30 5d 2e  sorted = aTo[0].
25990 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 20 20  nRow;.          
259a0 66 6f 72 28 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61  for(jj=1, pTo=&a
259b0 54 6f 5b 31 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69  To[1]; jj<mxChoi
259c0 63 65 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29  ce; jj++, pTo++)
259d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
259e0 28 20 70 54 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43  ( pTo->rCost>mxC
259f0 6f 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20  ost .           
25a00 20 20 7c 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74    || (pTo->rCost
25a10 3d 3d 6d 78 43 6f 73 74 20 26 26 20 70 54 6f 2d  ==mxCost && pTo-
25a20 3e 72 55 6e 73 6f 72 74 65 64 3e 6d 78 55 6e 73  >rUnsorted>mxUns
25a30 6f 72 74 65 64 29 20 0a 20 20 20 20 20 20 20 20  orted) .        
25a40 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
25a50 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20 70 54       mxCost = pT
25a60 6f 2d 3e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20  o->rCost;.      
25a70 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74          mxUnsort
25a80 65 64 20 3d 20 70 54 6f 2d 3e 72 55 6e 73 6f 72  ed = pTo->rUnsor
25a90 74 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ted;.           
25aa0 20 20 20 6d 78 49 20 3d 20 6a 6a 3b 0a 20 20 20     mxI = jj;.   
25ab0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25ac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
25ad0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
25ae0 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43  #ifdef WHERETRAC
25af0 45 5f 45 4e 41 42 4c 45 44 20 20 2f 2a 20 3e 3d  E_ENABLED  /* >=
25b00 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  2 */.    if( sql
25b10 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 26  ite3WhereTrace &
25b20 20 30 78 30 32 20 29 7b 0a 20 20 20 20 20 20 73   0x02 ){.      s
25b30 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
25b40 66 28 22 2d 2d 2d 2d 20 61 66 74 65 72 20 72 6f  f("---- after ro
25b50 75 6e 64 20 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20  und %d ----\n", 
25b60 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 66 6f  iLoop);.      fo
25b70 72 28 69 69 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b  r(ii=0, pTo=aTo;
25b80 20 69 69 3c 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70   ii<nTo; ii++, p
25b90 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73  To++){.        s
25ba0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
25bb0 66 28 22 20 25 73 20 63 6f 73 74 3d 25 2d 33 64  f(" %s cost=%-3d
25bc0 20 6e 72 6f 77 3d 25 2d 33 64 20 6f 72 64 65 72   nrow=%-3d order
25bd0 3d 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%c",.          
25be0 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70   wherePathName(p
25bf0 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c  To, iLoop+1, 0),
25c00 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f   pTo->rCost, pTo
25c10 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20  ->nRow,.        
25c20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65     pTo->isOrdere
25c30 64 3e 3d 30 20 3f 20 28 70 54 6f 2d 3e 69 73 4f  d>=0 ? (pTo->isO
25c40 72 64 65 72 65 64 2b 27 30 27 29 20 3a 20 27 3f  rdered+'0') : '?
25c50 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ');.        if( 
25c60 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 30  pTo->isOrdered>0
25c70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
25c80 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
25c90 28 22 20 72 65 76 3d 30 78 25 6c 6c 78 5c 6e 22  (" rev=0x%llx\n"
25ca0 2c 20 70 54 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b  , pTo->revLoop);
25cb0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
25cc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25cd0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
25ce0 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ");.        }.  
25cf0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
25d00 69 66 0a 0a 20 20 20 20 2f 2a 20 53 77 61 70 20  if..    /* Swap 
25d10 74 68 65 20 72 6f 6c 65 73 20 6f 66 20 61 46 72  the roles of aFr
25d20 6f 6d 20 61 6e 64 20 61 54 6f 20 66 6f 72 20 74  om and aTo for t
25d30 68 65 20 6e 65 78 74 20 67 65 6e 65 72 61 74 69  he next generati
25d40 6f 6e 20 2a 2f 0a 20 20 20 20 70 46 72 6f 6d 20  on */.    pFrom 
25d50 3d 20 61 54 6f 3b 0a 20 20 20 20 61 54 6f 20 3d  = aTo;.    aTo =
25d60 20 61 46 72 6f 6d 3b 0a 20 20 20 20 61 46 72 6f   aFrom;.    aFro
25d70 6d 20 3d 20 70 46 72 6f 6d 3b 0a 20 20 20 20 6e  m = pFrom;.    n
25d80 46 72 6f 6d 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a  From = nTo;.  }.
25d90 0a 20 20 69 66 28 20 6e 46 72 6f 6d 3d 3d 30 20  .  if( nFrom==0 
25da0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
25db0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
25dc0 6e 6f 20 71 75 65 72 79 20 73 6f 6c 75 74 69 6f  no query solutio
25dd0 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n");.    sqlite3
25de0 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 53 70  DbFreeNN(db, pSp
25df0 61 63 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ace);.    return
25e00 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
25e10 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6e 64 20   }.  .  /* Find 
25e20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
25e30 70 61 74 68 2e 20 20 70 46 72 6f 6d 20 77 69 6c  path.  pFrom wil
25e40 6c 20 62 65 20 6c 65 66 74 20 70 6f 69 6e 74 69  l be left pointi
25e50 6e 67 20 74 6f 20 74 68 61 74 20 70 61 74 68 20  ng to that path 
25e60 2a 2f 0a 20 20 70 46 72 6f 6d 20 3d 20 61 46 72  */.  pFrom = aFr
25e70 6f 6d 3b 0a 20 20 66 6f 72 28 69 69 3d 31 3b 20  om;.  for(ii=1; 
25e80 69 69 3c 6e 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b  ii<nFrom; ii++){
25e90 0a 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e  .    if( pFrom->
25ea0 72 43 6f 73 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e  rCost>aFrom[ii].
25eb0 72 43 6f 73 74 20 29 20 70 46 72 6f 6d 20 3d 20  rCost ) pFrom = 
25ec0 26 61 46 72 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a  &aFrom[ii];.  }.
25ed0 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f    assert( pWInfo
25ee0 2d 3e 6e 4c 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20  ->nLevel==nLoop 
25ef0 29 3b 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  );.  /* Load the
25f00 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74   lowest cost pat
25f10 68 20 69 6e 74 6f 20 70 57 49 6e 66 6f 20 2a 2f  h into pWInfo */
25f20 0a 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20  .  for(iLoop=0; 
25f30 69 4c 6f 6f 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f  iLoop<nLoop; iLo
25f40 6f 70 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65  op++){.    Where
25f50 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 3d 20  Level *pLevel = 
25f60 70 57 49 6e 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f  pWInfo->a + iLoo
25f70 70 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  p;.    pLevel->p
25f80 57 4c 6f 6f 70 20 3d 20 70 57 4c 6f 6f 70 20 3d  WLoop = pWLoop =
25f90 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c   pFrom->aLoop[iL
25fa0 6f 6f 70 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c  oop];.    pLevel
25fb0 2d 3e 69 46 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70  ->iFrom = pWLoop
25fc0 2d 3e 69 54 61 62 3b 0a 20 20 20 20 70 4c 65 76  ->iTab;.    pLev
25fd0 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 57  el->iTabCur = pW
25fe0 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
25ff0 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
26000 2e 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a 20 20  .iCursor;.  }.  
26010 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74  if( (pWInfo->wct
26020 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
26030 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 21 3d  WANT_DISTINCT)!=
26040 30 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d  0.   && (pWInfo-
26050 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  >wctrlFlags & WH
26060 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 29 3d  ERE_DISTINCTBY)=
26070 3d 30 0a 20 20 20 26 26 20 70 57 49 6e 66 6f 2d  =0.   && pWInfo-
26080 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52  >eDistinct==WHER
26090 45 5f 44 49 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a  E_DISTINCT_NOOP.
260a0 20 20 20 26 26 20 6e 52 6f 77 45 73 74 0a 20 20     && nRowEst.  
260b0 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6e  ){.    Bitmask n
260c0 6f 74 55 73 65 64 3b 0a 20 20 20 20 69 6e 74 20  otUsed;.    int 
260d0 72 63 20 3d 20 77 68 65 72 65 50 61 74 68 53 61  rc = wherePathSa
260e0 74 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 70  tisfiesOrderBy(p
260f0 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70  WInfo, pWInfo->p
26100 52 65 73 75 6c 74 53 65 74 2c 20 70 46 72 6f 6d  ResultSet, pFrom
26110 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26120 20 20 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43     WHERE_DISTINC
26130 54 42 59 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46  TBY, nLoop-1, pF
26140 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70  rom->aLoop[nLoop
26150 2d 31 5d 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a  -1], &notUsed);.
26160 20 20 20 20 69 66 28 20 72 63 3d 3d 70 57 49 6e      if( rc==pWIn
26170 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 2d 3e  fo->pResultSet->
26180 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70  nExpr ){.      p
26190 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
261a0 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
261b0 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 7d  T_ORDERED;.    }
261c0 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66  .  }.  if( pWInf
261d0 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  o->pOrderBy ){. 
261e0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77     if( pWInfo->w
261f0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
26200 45 5f 44 49 53 54 49 4e 43 54 42 59 20 29 7b 0a  E_DISTINCTBY ){.
26210 20 20 20 20 20 20 69 66 28 20 70 46 72 6f 6d 2d        if( pFrom-
26220 3e 69 73 4f 72 64 65 72 65 64 3d 3d 70 57 49 6e  >isOrdered==pWIn
26230 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45  fo->pOrderBy->nE
26240 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  xpr ){.        p
26250 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
26260 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
26270 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20 20 20 20  T_ORDERED;.     
26280 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
26290 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53      pWInfo->nOBS
262a0 61 74 20 3d 20 70 46 72 6f 6d 2d 3e 69 73 4f 72  at = pFrom->isOr
262b0 64 65 72 65 64 3b 0a 20 20 20 20 20 20 70 57 49  dered;.      pWI
262c0 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 70  nfo->revMask = p
262d0 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20  From->revLoop;. 
262e0 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d       if( pWInfo-
262f0 3e 6e 4f 42 53 61 74 3c 3d 30 20 29 7b 0a 20 20  >nOBSat<=0 ){.  
26300 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f        pWInfo->nO
26310 42 53 61 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  BSat = 0;.      
26320 20 20 69 66 28 20 6e 4c 6f 6f 70 3e 30 20 29 7b    if( nLoop>0 ){
26330 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 77  .          u32 w
26340 73 46 6c 61 67 73 20 3d 20 70 46 72 6f 6d 2d 3e  sFlags = pFrom->
26350 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2d 3e  aLoop[nLoop-1]->
26360 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 20  wsFlags;.       
26370 20 20 20 69 66 28 20 28 77 73 46 6c 61 67 73 20     if( (wsFlags 
26380 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d  & WHERE_ONEROW)=
26390 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 26  =0 .           &
263a0 26 20 28 77 73 46 6c 61 67 73 26 28 57 48 45 52  & (wsFlags&(WHER
263b0 45 5f 49 50 4b 7c 57 48 45 52 45 5f 43 4f 4c 55  E_IPK|WHERE_COLU
263c0 4d 4e 5f 49 4e 29 29 21 3d 28 57 48 45 52 45 5f  MN_IN))!=(WHERE_
263d0 49 50 4b 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  IPK|WHERE_COLUMN
263e0 5f 49 4e 29 0a 20 20 20 20 20 20 20 20 20 20 29  _IN).          )
263f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 69  {.            Bi
26400 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20 20  tmask m = 0;.   
26410 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20           int rc 
26420 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  = wherePathSatis
26430 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e  fiesOrderBy(pWIn
26440 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  fo, pWInfo->pOrd
26450 65 72 42 79 2c 20 70 46 72 6f 6d 2c 0a 20 20 20  erBy, pFrom,.   
26460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26470 20 20 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59     WHERE_ORDERBY
26480 5f 4c 49 4d 49 54 2c 20 6e 4c 6f 6f 70 2d 31 2c  _LIMIT, nLoop-1,
26490 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c   pFrom->aLoop[nL
264a0 6f 6f 70 2d 31 5d 2c 20 26 6d 29 3b 0a 20 20 20  oop-1], &m);.   
264b0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
264c0 65 28 20 77 73 46 6c 61 67 73 20 26 20 57 48 45  e( wsFlags & WHE
264d0 52 45 5f 49 50 4b 20 29 3b 0a 20 20 20 20 20 20  RE_IPK );.      
264e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
264f0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
26500 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b 0a 20 20 20  COLUMN_IN );.   
26510 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
26520 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42  =pWInfo->pOrderB
26530 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  y->nExpr ){.    
26540 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f            pWInfo
26550 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72 4c  ->bOrderedInnerL
26560 6f 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  oop = 1;.       
26570 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72         pWInfo->r
26580 65 76 4d 61 73 6b 20 3d 20 6d 3b 0a 20 20 20 20  evMask = m;.    
26590 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
265a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
265b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
265c0 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e 77    if( (pWInfo->w
265d0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
265e0 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 29 0a 20  E_SORTBYGROUP). 
265f0 20 20 20 20 20 20 20 26 26 20 70 57 49 6e 66 6f         && pWInfo
26600 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57 49 6e 66 6f  ->nOBSat==pWInfo
26610 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
26620 72 20 26 26 20 6e 4c 6f 6f 70 3e 30 0a 20 20 20  r && nLoop>0.   
26630 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73   ){.      Bitmas
26640 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a 20  k revMask = 0;. 
26650 20 20 20 20 20 69 6e 74 20 6e 4f 72 64 65 72 20       int nOrder 
26660 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73  = wherePathSatis
26670 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e  fiesOrderBy(pWIn
26680 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  fo, pWInfo->pOrd
26690 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20 20  erBy, .         
266a0 20 70 46 72 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f 70   pFrom, 0, nLoop
266b0 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70  -1, pFrom->aLoop
266c0 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 72 65 76 4d  [nLoop-1], &revM
266d0 61 73 6b 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ask.      );.   
266e0 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66     assert( pWInf
266f0 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30 20 29 3b 0a  o->sorted==0 );.
26700 20 20 20 20 20 20 69 66 28 20 6e 4f 72 64 65 72        if( nOrder
26710 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ==pWInfo->pOrder
26720 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  By->nExpr ){.   
26730 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 73 6f 72       pWInfo->sor
26740 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ted = 1;.       
26750 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
26760 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20 20   = revMask;.    
26770 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a    }.    }.  }...
26780 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75    pWInfo->nRowOu
26790 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b  t = pFrom->nRow;
267a0 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65 6d 70  ..  /* Free temp
267b0 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61 6e 64  orary memory and
267c0 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 20   return success 
267d0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  */.  sqlite3DbFr
267e0 65 65 4e 4e 28 64 62 2c 20 70 53 70 61 63 65 29  eeNN(db, pSpace)
267f0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
26800 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
26810 6f 73 74 20 71 75 65 72 69 65 73 20 75 73 65 20  ost queries use 
26820 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61  only a single ta
26830 62 6c 65 20 28 74 68 65 79 20 61 72 65 20 6e 6f  ble (they are no
26840 74 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61 76  t joins) and hav
26850 65 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63  e.** simple == c
26860 6f 6e 73 74 72 61 69 6e 74 73 20 61 67 61 69 6e  onstraints again
26870 73 74 20 69 6e 64 65 78 65 64 20 66 69 65 6c 64  st indexed field
26880 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
26890 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20   attempts.** to 
268a0 70 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c  plan those simpl
268b0 65 20 63 61 73 65 73 20 75 73 69 6e 67 20 6d 75  e cases using mu
268c0 63 68 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79  ch less ceremony
268d0 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e   than the.** gen
268e0 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65  eral-purpose que
268f0 72 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20  ry planner, and 
26900 74 68 65 72 65 62 79 20 79 69 65 6c 64 20 66 61  thereby yield fa
26910 73 74 65 72 20 73 71 6c 69 74 65 33 5f 70 72 65  ster sqlite3_pre
26920 70 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20  pare().** times 
26930 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
26940 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ase..**.** Retur
26950 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75  n non-zero on su
26960 63 63 65 73 73 2c 20 69 66 20 74 68 69 73 20 71  ccess, if this q
26970 75 65 72 79 20 63 61 6e 20 62 65 20 68 61 6e 64  uery can be hand
26980 6c 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e  led by this.** n
26990 6f 2d 66 72 69 6c 6c 73 20 71 75 65 72 79 20 70  o-frills query p
269a0 6c 61 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e 20  lanner.  Return 
269b0 7a 65 72 6f 20 69 66 20 74 68 69 73 20 71 75 65  zero if this que
269c0 72 79 20 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a  ry needs the .**
269d0 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   general-purpose
269e0 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a   query planner..
269f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
26a00 65 72 65 53 68 6f 72 74 43 75 74 28 57 68 65 72  ereShortCut(Wher
26a10 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
26a20 75 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65  uilder){.  Where
26a30 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20  Info *pWInfo;.  
26a40 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
26a50 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68  tem *pItem;.  Wh
26a60 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a  ereClause *pWC;.
26a70 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
26a80 72 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20  rm;.  WhereLoop 
26a90 2a 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43  *pLoop;.  int iC
26aa0 75 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54  ur;.  int j;.  T
26ab0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e  able *pTab;.  In
26ac0 64 65 78 20 2a 70 49 64 78 3b 0a 0a 20 20 70 57  dex *pIdx;..  pW
26ad0 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
26ae0 3e 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70  >pWInfo;.  if( p
26af0 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
26b00 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42  s & WHERE_OR_SUB
26b10 43 4c 41 55 53 45 20 29 20 72 65 74 75 72 6e 20  CLAUSE ) return 
26b20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49  0;.  assert( pWI
26b30 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e  nfo->pTabList->n
26b40 53 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74 65  Src>=1 );.  pIte
26b50 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  m = pWInfo->pTab
26b60 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62 20  List->a;.  pTab 
26b70 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  = pItem->pTab;. 
26b80 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
26b90 54 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b  Tab) ) return 0;
26ba0 0a 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67  .  if( pItem->fg
26bb0 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29 20 72  .isIndexedBy ) r
26bc0 65 74 75 72 6e 20 30 3b 0a 20 20 69 43 75 72 20  eturn 0;.  iCur 
26bd0 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
26be0 3b 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66  ;.  pWC = &pWInf
26bf0 6f 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70 20  o->sWC;.  pLoop 
26c00 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
26c10 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  ;.  pLoop->wsFla
26c20 67 73 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70 2d  gs = 0;.  pLoop-
26c30 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 70 54  >nSkip = 0;.  pT
26c40 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65  erm = sqlite3Whe
26c50 72 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  reFindTerm(pWC, 
26c60 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f  iCur, -1, 0, WO_
26c70 45 51 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a 20 20  EQ|WO_IS, 0);.  
26c80 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20  if( pTerm ){.   
26c90 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
26ca0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
26cb0 5f 49 53 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70  _IS );.    pLoop
26cc0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
26cd0 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52  E_COLUMN_EQ|WHER
26ce0 45 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45 52  E_IPK|WHERE_ONER
26cf0 4f 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 61  OW;.    pLoop->a
26d00 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d  LTerm[0] = pTerm
26d10 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54  ;.    pLoop->nLT
26d20 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f  erm = 1;.    pLo
26d30 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
26d40 3d 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49  = 1;.    /* TUNI
26d50 4e 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72 6f  NG: Cost of a ro
26d60 77 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31 30  wid lookup is 10
26d70 20 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 72   */.    pLoop->r
26d80 52 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33 33  Run = 33;  /* 33
26d90 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
26da0 31 30 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  10) */.  }else{.
26db0 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
26dc0 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
26dd0 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
26de0 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70  t){.      int op
26df0 4d 61 73 6b 3b 0a 20 20 20 20 20 20 61 73 73 65  Mask;.      asse
26e00 72 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  rt( pLoop->aLTer
26e10 6d 53 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61  mSpace==pLoop->a
26e20 4c 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 69  LTerm );.      i
26e30 66 28 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65  f( !IsUniqueInde
26e40 78 28 70 49 64 78 29 0a 20 20 20 20 20 20 20 7c  x(pIdx).       |
26e50 7c 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78  | pIdx->pPartIdx
26e60 57 68 65 72 65 21 3d 30 20 0a 20 20 20 20 20 20  Where!=0 .      
26e70 20 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f   || pIdx->nKeyCo
26e80 6c 3e 41 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f  l>ArraySize(pLoo
26e90 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 20  p->aLTermSpace) 
26ea0 0a 20 20 20 20 20 20 29 20 63 6f 6e 74 69 6e 75  .      ) continu
26eb0 65 3b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b 20  e;.      opMask 
26ec0 3d 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e  = pIdx->uniqNotN
26ed0 75 6c 6c 20 3f 20 28 57 4f 5f 45 51 7c 57 4f 5f  ull ? (WO_EQ|WO_
26ee0 49 53 29 20 3a 20 57 4f 5f 45 51 3b 0a 20 20 20  IS) : WO_EQ;.   
26ef0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49     for(j=0; j<pI
26f00 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b  dx->nKeyCol; j++
26f10 29 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ){.        pTerm
26f20 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 46   = sqlite3WhereF
26f30 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
26f40 72 2c 20 6a 2c 20 30 2c 20 6f 70 4d 61 73 6b 2c  r, j, 0, opMask,
26f50 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
26f60 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62  if( pTerm==0 ) b
26f70 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 74 65  reak;.        te
26f80 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
26f90 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
26fa0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f   );.        pLoo
26fb0 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70  p->aLTerm[j] = p
26fc0 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Term;.      }.  
26fd0 20 20 20 20 69 66 28 20 6a 21 3d 70 49 64 78 2d      if( j!=pIdx-
26fe0 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69  >nKeyCol ) conti
26ff0 6e 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70  nue;.      pLoop
27000 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
27010 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52  E_COLUMN_EQ|WHER
27020 45 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f 49  E_ONEROW|WHERE_I
27030 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20 69 66  NDEXED;.      if
27040 28 20 70 49 64 78 2d 3e 69 73 43 6f 76 65 72 69  ( pIdx->isCoveri
27050 6e 67 20 7c 7c 20 28 70 49 74 65 6d 2d 3e 63 6f  ng || (pItem->co
27060 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73  lUsed & ~columns
27070 49 6e 49 6e 64 65 78 28 70 49 64 78 29 29 3d 3d  InIndex(pIdx))==
27080 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f  0 ){.        pLo
27090 6f 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57  op->wsFlags |= W
270a0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20  HERE_IDX_ONLY;. 
270b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f       }.      pLo
270c0 6f 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a  op->nLTerm = j;.
270d0 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62        pLoop->u.b
270e0 74 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20  tree.nEq = j;.  
270f0 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72      pLoop->u.btr
27100 65 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78  ee.pIndex = pIdx
27110 3b 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e  ;.      /* TUNIN
27120 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e 69  G: Cost of a uni
27130 71 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70  que index lookup
27140 20 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20 20   is 15 */.      
27150 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39  pLoop->rRun = 39
27160 3b 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74 65  ;  /* 39==sqlite
27170 33 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a 20  3LogEst(15) */. 
27180 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
27190 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f  }.  }.  if( pLoo
271a0 70 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20 20  p->wsFlags ){.  
271b0 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20    pLoop->nOut = 
271c0 28 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20 20 70  (LogEst)1;.    p
271d0 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f  WInfo->a[0].pWLo
271e0 6f 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20  op = pLoop;.    
271f0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
27200 73 4d 61 73 6b 53 65 74 2e 6e 3d 3d 31 20 26 26  sMaskSet.n==1 &&
27210 20 69 43 75 72 3d 3d 70 57 49 6e 66 6f 2d 3e 73   iCur==pWInfo->s
27220 4d 61 73 6b 53 65 74 2e 69 78 5b 30 5d 20 29 3b  MaskSet.ix[0] );
27230 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  .    pLoop->mask
27240 53 65 6c 66 20 3d 20 31 3b 20 2f 2a 20 73 71 6c  Self = 1; /* sql
27250 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b  ite3WhereGetMask
27260 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53  (&pWInfo->sMaskS
27270 65 74 2c 20 69 43 75 72 29 3b 20 2a 2f 0a 20 20  et, iCur); */.  
27280 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69    pWInfo->a[0].i
27290 54 61 62 43 75 72 20 3d 20 69 43 75 72 3b 0a 20  TabCur = iCur;. 
272a0 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f     pWInfo->nRowO
272b0 75 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ut = 1;.    if( 
272c0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
272d0 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61   ) pWInfo->nOBSa
272e0 74 20 3d 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  t =  pWInfo->pOr
272f0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
27300 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63    if( pWInfo->wc
27310 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
27320 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29  _WANT_DISTINCT )
27330 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  {.      pWInfo->
27340 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52  eDistinct = WHER
27350 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55  E_DISTINCT_UNIQU
27360 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  E;.    }.#ifdef 
27370 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
27380 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27 30   pLoop->cId = '0
27390 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  ';.#endif.    re
273a0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
273b0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
273c0 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
273d0 20 66 6f 72 20 65 78 70 72 49 73 44 65 74 65 72   for exprIsDeter
273e0 6d 69 6e 69 73 74 69 63 28 29 2e 0a 2a 2f 0a 73  ministic()..*/.s
273f0 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f  tatic int exprNo
27400 64 65 49 73 44 65 74 65 72 6d 69 6e 69 73 74 69  deIsDeterministi
27410 63 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  c(Walker *pWalke
27420 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
27430 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
27440 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 26 26  ==TK_FUNCTION &&
27450 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
27460 28 70 45 78 70 72 2c 20 45 50 5f 43 6f 6e 73 74  (pExpr, EP_Const
27470 46 75 6e 63 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Func)==0 ){.    
27480 70 57 61 6c 6b 65 72 2d 3e 65 43 6f 64 65 20 3d  pWalker->eCode =
27490 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   0;.    return W
274a0 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20 20  RC_Abort;.  }.  
274b0 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
274c0 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nue;.}../*.** Re
274d0 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
274e0 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74   expression cont
274f0 61 69 6e 73 20 6e 6f 20 6e 6f 6e 2d 64 65 74 65  ains no non-dete
27500 72 6d 69 6e 69 73 74 69 63 20 53 51 4c 20 0a 2a  rministic SQL .*
27510 2a 20 66 75 6e 63 74 69 6f 6e 73 2e 20 44 6f 20  * functions. Do 
27520 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 6e 6f 6e  not consider non
27530 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20 53  -deterministic S
27540 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  QL functions tha
27550 74 20 61 72 65 20 0a 2a 2a 20 70 61 72 74 20 6f  t are .** part o
27560 66 20 73 75 62 2d 73 65 6c 65 63 74 20 73 74 61  f sub-select sta
27570 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  tements..*/.stat
27580 69 63 20 69 6e 74 20 65 78 70 72 49 73 44 65 74  ic int exprIsDet
27590 65 72 6d 69 6e 69 73 74 69 63 28 45 78 70 72 20  erministic(Expr 
275a0 2a 70 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b  *p){.  Walker w;
275b0 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 2c  .  memset(&w, 0,
275c0 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 77   sizeof(w));.  w
275d0 2e 65 43 6f 64 65 20 3d 20 31 3b 0a 20 20 77 2e  .eCode = 1;.  w.
275e0 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
275f0 65 78 70 72 4e 6f 64 65 49 73 44 65 74 65 72 6d  exprNodeIsDeterm
27600 69 6e 69 73 74 69 63 3b 0a 20 20 73 71 6c 69 74  inistic;.  sqlit
27610 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
27620 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e 65 43  );.  return w.eC
27630 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ode;.}../*.** Ge
27640 6e 65 72 61 74 65 20 74 68 65 20 62 65 67 69 6e  nerate the begin
27650 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ning of the loop
27660 20 75 73 65 64 20 66 6f 72 20 57 48 45 52 45 20   used for WHERE 
27670 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
27680 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  g..** The return
27690 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e   value is a poin
276a0 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65  ter to an opaque
276b0 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
276c0 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f  contains.** info
276d0 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74  rmation needed t
276e0 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
276f0 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68  loop.  Later, th
27700 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
27710 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f  e.** should invo
27720 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ke sqlite3WhereE
27730 6e 64 28 29 20 77 69 74 68 20 74 68 65 20 72 65  nd() with the re
27740 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
27750 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
27760 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c  n order to compl
27770 65 74 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ete the WHERE cl
27780 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
27790 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
277a0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20  or occurs, this 
277b0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
277c0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
277d0 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74 6f  basic idea is to
277e0 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f   do a nested loo
277f0 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20  p, one loop for 
27800 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a  each table in.**
27810 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
27820 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28   of a select.  (
27830 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54  INSERT and UPDAT
27840 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  E statements are
27850 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20   the.** same as 
27860 61 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e  a SELECT with on
27870 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
27880 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
27890 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65  ause.)  For.** e
278a0 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53  xample, if the S
278b0 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a  QL is this:.**.*
278c0 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  *       SELECT *
278d0 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33   FROM t1, t2, t3
278e0 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a   WHERE ...;.**.*
278f0 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20  * Then the code 
27900 67 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e  generated is con
27910 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74  ceptually like t
27920 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
27930 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68  .**      foreach
27940 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20   row1 in t1 do  
27950 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
27960 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
27970 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
27980 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d  in t2 do      |-
27990 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
279a0 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20  eBegin().**     
279b0 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
279c0 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a  3 in t3 do   /.*
279d0 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  *            ...
279e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64  .**          end
279f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a00 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
27a10 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
27a20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
27a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d                |-
27a40 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
27a50 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65  eEnd().**      e
27a60 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
27a70 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a             /.**.
27a80 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
27a90 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74   loops might not
27aa0 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68   be nested in th
27ab0 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68  e order in which
27ac0 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20   they.** appear 
27ad0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
27ae0 73 65 20 69 66 20 61 20 64 69 66 66 65 72 65 6e  se if a differen
27af0 74 20 6f 72 64 65 72 20 69 73 20 62 65 74 74 65  t order is bette
27b00 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a  r able to make.*
27b10 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73  * use of indices
27b20 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61  .  Note also tha
27b30 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70  t when the IN op
27b40 65 72 61 74 6f 72 20 61 70 70 65 61 72 73 20 69  erator appears i
27b50 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  n.** the WHERE c
27b60 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20  lause, it might 
27b70 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69  result in additi
27b80 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70  onal nested loop
27b90 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e  s for.** scannin
27ba0 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61  g through all va
27bb0 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68  lues on the righ
27bc0 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
27bd0 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  he IN..**.** The
27be0 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75 72  re are Btree cur
27bf0 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  sors associated 
27c00 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e  with each table.
27c10 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f 72    t1 uses cursor
27c20 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c  .** number pTabL
27c30 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
27c40 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65 20  r.  t2 uses the 
27c50 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d  cursor pTabList-
27c60 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a  >a[1].iCursor..*
27c70 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20  * And so forth. 
27c80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
27c90 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20  nerates code to 
27ca0 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20  open those VDBE 
27cb0 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73  cursors.** and s
27cc0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
27cd0 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
27ce0 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65  ode to close the
27cf0 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  m..**.** The cod
27d00 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57 68  e that sqlite3Wh
27d10 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72  ereBegin() gener
27d20 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65 20  ates leaves the 
27d30 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a  cursors named.**
27d40 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69   in pTabList poi
27d50 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20 61  nting at their a
27d60 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69  ppropriate entri
27d70 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63  es.  The [...] c
27d80 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f  ode.** can use O
27d90 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f  P_Column and OP_
27da0 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e  Rowid opcodes on
27db0 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20 74   these cursors t
27dc0 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74  o extract.** dat
27dd0 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f  a from the vario
27de0 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65  us tables of the
27df0 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   loop..**.** If 
27e00 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
27e10 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66   is empty, the f
27e20 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73  oreach loops mus
27e30 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69  t each scan thei
27e40 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c  r.** entire tabl
27e50 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65  es.  Thus a thre
27e60 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e  e-way join is an
27e70 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f   O(N^3) operatio
27e80 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68  n.  But if.** th
27e90 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e  e tables have in
27ea0 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20  dices and there 
27eb0 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65  are terms in the
27ec0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
27ed0 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  at.** refer to t
27ee0 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20  hose indices, a 
27ef0 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73  complete table s
27f00 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64  can can be avoid
27f10 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f  ed and the.** co
27f20 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68  de will run much
27f30 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f   faster.  Most o
27f40 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68  f the work of th
27f50 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68  is routine is ch
27f60 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65  ecking.** to see
27f70 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   if there are in
27f80 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62  dices that can b
27f90 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  e used to speed 
27fa0 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  up the loop..**.
27fb0 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20  ** Terms of the 
27fc0 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65  WHERE clause are
27fd0 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69   also used to li
27fe0 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61  mit which rows a
27ff0 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20  ctually.** make 
28000 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20  it to the "..." 
28010 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
28020 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65   the loop.  Afte
28030 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22  r each "foreach"
28040 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68  ,.** terms of th
28050 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
28060 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72  hat use only ter
28070 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20  ms in that loop 
28080 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f  and outer.** loo
28090 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ps are evaluated
280a0 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20   and if false a 
280b0 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f  jump is made aro
280c0 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65  und all subseque
280d0 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70  nt.** inner loop
280e0 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65  s (or around the
280f0 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65   "..." if the te
28100 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  st occurs within
28110 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d   the inner-.** m
28120 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20  ost loop).**.** 
28130 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a  OUTER JOINS.**.*
28140 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20  * An outer join 
28150 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64  of tables t1 and
28160 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c   t2 is conceptal
28170 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c  ly coded as foll
28180 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f  ows:.**.**    fo
28190 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
281a0 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67   do.**      flag
281b0 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72   = 0.**      for
281c0 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20  each row2 in t2 
281d0 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61  do.**        sta
281e0 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  rt:.**          
281f0 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
28200 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20  flag = 1.**     
28210 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20   end.**      if 
28220 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  flag==0 then.** 
28230 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20         move the 
28240 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61  row2 cursor to a
28250 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20   null row.**    
28260 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a      goto start.*
28270 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20  *      fi.**    
28280 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20  end.**.** ORDER 
28290 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53  BY CLAUSE PROCES
282a0 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65  SING.**.** pOrde
282b0 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72  rBy is a pointer
282c0 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59   to the ORDER BY
282d0 20 63 6c 61 75 73 65 20 28 6f 72 20 74 68 65 20   clause (or the 
282e0 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 0a  GROUP BY clause.
282f0 2a 2a 20 69 66 20 74 68 65 20 57 48 45 52 45 5f  ** if the WHERE_
28300 47 52 4f 55 50 42 59 20 66 6c 61 67 20 69 73 20  GROUPBY flag is 
28310 73 65 74 20 69 6e 20 77 63 74 72 6c 46 6c 61 67  set in wctrlFlag
28320 73 29 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  s) of a SELECT s
28330 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 69 66 20 74  tatement.** if t
28340 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66  here is one.  If
28350 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44   there is no ORD
28360 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20  ER BY clause or 
28370 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
28380 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  ** is called fro
28390 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  m an UPDATE or D
283a0 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c  ELETE statement,
283b0 20 74 68 65 6e 20 70 4f 72 64 65 72 42 79 20 69   then pOrderBy i
283c0 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  s NULL..**.** Th
283d0 65 20 69 49 64 78 43 75 72 20 70 61 72 61 6d 65  e iIdxCur parame
283e0 74 65 72 20 69 73 20 74 68 65 20 63 75 72 73 6f  ter is the curso
283f0 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 69  r number of an i
28400 6e 64 65 78 2e 20 20 49 66 20 0a 2a 2a 20 57 48  ndex.  If .** WH
28410 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45  ERE_OR_SUBCLAUSE
28420 20 69 73 20 73 65 74 2c 20 69 49 64 78 43 75 72   is set, iIdxCur
28430 20 69 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e   is the cursor n
28440 75 6d 62 65 72 20 6f 66 20 61 6e 20 69 6e 64 65  umber of an inde
28450 78 0a 2a 2a 20 74 6f 20 75 73 65 20 66 6f 72 20  x.** to use for 
28460 4f 52 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  OR clause proces
28470 73 69 6e 67 2e 20 20 54 68 65 20 57 48 45 52 45  sing.  The WHERE
28480 20 63 6c 61 75 73 65 20 73 68 6f 75 6c 64 20 75   clause should u
28490 73 65 20 74 68 69 73 0a 2a 2a 20 73 70 65 63 69  se this.** speci
284a0 66 69 63 20 63 75 72 73 6f 72 2e 20 20 49 66 20  fic cursor.  If 
284b0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
284c0 53 49 52 45 44 20 69 73 20 73 65 74 2c 20 74 68  SIRED is set, th
284d0 65 6e 20 69 49 64 78 43 75 72 20 69 73 0a 2a 2a  en iIdxCur is.**
284e0 20 74 68 65 20 66 69 72 73 74 20 63 75 72 73 6f   the first curso
284f0 72 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  r in an array of
28500 20 63 75 72 73 6f 72 73 20 66 6f 72 20 61 6c 6c   cursors for all
28510 20 69 6e 64 69 63 65 73 2e 20 20 69 49 64 78 43   indices.  iIdxC
28520 75 72 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  ur should.** be 
28530 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20  used to compute 
28540 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
28550 63 75 72 73 6f 72 20 64 65 70 65 6e 64 69 6e 67  cursor depending
28560 20 6f 6e 20 77 68 69 63 68 20 69 6e 64 65 78 20   on which index 
28570 69 73 0a 2a 2a 20 75 73 65 64 2e 0a 2a 2f 0a 57  is.** used..*/.W
28580 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65  hereInfo *sqlite
28590 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50  3WhereBegin(.  P
285a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
285b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
285c0 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
285d0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
285e0 69 73 74 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f  ist,      /* FRO
285f0 4d 20 63 6c 61 75 73 65 3a 20 41 20 6c 69 73 74  M clause: A list
28600 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74   of all tables t
28610 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  o be scanned */.
28620 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20    Expr *pWhere, 
28630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
28640 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
28650 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
28660 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 41 6e  derBy,     /* An
28670 20 4f 52 44 45 52 20 42 59 20 28 6f 72 20 47 52   ORDER BY (or GR
28680 4f 55 50 20 42 59 29 20 63 6c 61 75 73 65 2c 20  OUP BY) clause, 
28690 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70  or NULL */.  Exp
286a0 72 4c 69 73 74 20 2a 70 52 65 73 75 6c 74 53 65  rList *pResultSe
286b0 74 2c 20 20 20 2f 2a 20 51 75 65 72 79 20 72 65  t,   /* Query re
286c0 73 75 6c 74 20 73 65 74 2e 20 20 52 65 71 27 64  sult set.  Req'd
286d0 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 2a 2f   for DISTINCT */
286e0 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67  .  u16 wctrlFlag
286f0 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  s,         /* Th
28700 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20  e WHERE_* flags 
28710 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74  defined in sqlit
28720 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20  eInt.h */.  int 
28730 69 41 75 78 41 72 67 20 20 20 20 20 20 20 20 20  iAuxArg         
28740 20 20 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f      /* If WHERE_
28750 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 69 73 20  OR_SUBCLAUSE is 
28760 73 65 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f  set, index curso
28770 72 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20  r number.       
28780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28790 20 20 20 2a 2a 20 49 66 20 57 48 45 52 45 5f 55     ** If WHERE_U
287a0 53 45 5f 4c 49 4d 49 54 2c 20 74 68 65 6e 20 74  SE_LIMIT, then t
287b0 68 65 20 6c 69 6d 69 74 20 61 6d 6f 75 6e 74 20  he limit amount 
287c0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  */.){.  int nByt
287d0 65 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  eWInfo;         
287e0 20 20 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73     /* Num. bytes
287f0 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57   allocated for W
28800 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20  hereInfo struct 
28810 2a 2f 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73  */.  int nTabLis
28820 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
28830 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  /* Number of ele
28840 6d 65 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73  ments in pTabLis
28850 74 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f  t */.  WhereInfo
28860 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20   *pWInfo;       
28870 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65    /* Will become
28880 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
28890 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  e of this functi
288a0 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  on */.  Vdbe *v 
288b0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
288c0 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
288d0 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e  l database engin
288e0 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  e */.  Bitmask n
288f0 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20  otReady;        
28900 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61    /* Cursors tha
28910 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f  t are not yet po
28920 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68  sitioned */.  Wh
28930 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73  ereLoopBuilder s
28940 57 4c 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  WLB;     /* The 
28950 57 68 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65  WhereLoop builde
28960 72 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  r */.  WhereMask
28970 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20  Set *pMaskSet;  
28980 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
28990 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a  ion mask set */.
289a0 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
289b0 65 76 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20  evel;        /* 
289c0 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69  A single level i
289d0 6e 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f  n pWInfo->a[] */
289e0 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
289f0 6f 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  oop;          /*
28a00 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69   Pointer to a si
28a10 6e 67 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f  ngle WhereLoop o
28a20 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69  bject */.  int i
28a30 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
28a40 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
28a50 75 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  unter */.  sqlit
28a60 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
28a70 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
28a80 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
28a90 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
28aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28ab0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
28ac0 20 75 38 20 62 46 6f 72 64 65 6c 65 74 65 20 3d   u8 bFordelete =
28ad0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f   0;         /* O
28ae0 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 20  PFLAG_FORDELETE 
28af0 6f 72 20 7a 65 72 6f 2c 20 61 73 20 61 70 70 72  or zero, as appr
28b00 6f 70 72 69 61 74 65 20 2a 2f 0a 0a 20 20 61 73  opriate */..  as
28b10 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67  sert( (wctrlFlag
28b20 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
28b30 53 5f 4d 55 4c 54 49 52 4f 57 29 3d 3d 30 20 7c  S_MULTIROW)==0 |
28b40 7c 20 28 0a 20 20 20 20 20 20 20 20 28 77 63 74  | (.        (wct
28b50 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
28b60 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
28b70 21 3d 30 20 0a 20 20 20 20 20 26 26 20 28 77 63  !=0 .     && (wc
28b80 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
28b90 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d  _OR_SUBCLAUSE)==
28ba0 30 20 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 4f  0 .  ));..  /* O
28bb0 6e 6c 79 20 6f 6e 65 20 6f 66 20 57 48 45 52 45  nly one of WHERE
28bc0 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 6f 72  _OR_SUBCLAUSE or
28bd0 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54   WHERE_USE_LIMIT
28be0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77   */.  assert( (w
28bf0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
28c00 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d  E_OR_SUBCLAUSE)=
28c10 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  =0.            |
28c20 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  | (wctrlFlags & 
28c30 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29  WHERE_USE_LIMIT)
28c40 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 56 61 72  ==0 );..  /* Var
28c50 69 61 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61  iable initializa
28c60 74 69 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70  tion */.  db = p
28c70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d  Parse->db;.  mem
28c80 73 65 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69  set(&sWLB, 0, si
28c90 7a 65 6f 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20  zeof(sWLB));..  
28ca0 2f 2a 20 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55  /* An ORDER/GROU
28cb0 50 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 6d  P BY clause of m
28cc0 6f 72 65 20 74 68 61 6e 20 36 33 20 74 65 72 6d  ore than 63 term
28cd0 73 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69  s cannot be opti
28ce0 6d 69 7a 65 64 20 2a 2f 0a 20 20 74 65 73 74 63  mized */.  testc
28cf0 61 73 65 28 20 70 4f 72 64 65 72 42 79 20 26 26  ase( pOrderBy &&
28d00 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
28d10 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28  ==BMS-1 );.  if(
28d20 20 70 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72   pOrderBy && pOr
28d30 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d  derBy->nExpr>=BM
28d40 53 20 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30  S ) pOrderBy = 0
28d50 3b 0a 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42  ;.  sWLB.pOrderB
28d60 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20  y = pOrderBy;.. 
28d70 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20   /* Disable the 
28d80 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a  DISTINCT optimiz
28d90 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f  ation if SQLITE_
28da0 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73  DistinctOpt is s
28db0 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69  et via.  ** sqli
28dc0 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51  te3_test_ctrl(SQ
28dd0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
28de0 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29  TIMIZATIONS,...)
28df0 20 2a 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69   */.  if( Optimi
28e00 7a 61 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64  zationDisabled(d
28e10 62 2c 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e  b, SQLITE_Distin
28e20 63 74 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63  ctOpt) ){.    wc
28e30 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45  trlFlags &= ~WHE
28e40 52 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54  RE_WANT_DISTINCT
28e50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
28e60 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73  number of tables
28e70 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
28e80 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62  use is limited b
28e90 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  y the number of.
28ea0 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42    ** bits in a B
28eb0 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74  itmask .  */.  t
28ec0 65 73 74 63 61 73 65 28 20 70 54 61 62 4c 69 73  estcase( pTabLis
28ed0 74 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a  t->nSrc==BMS );.
28ee0 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
28ef0 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20  nSrc>BMS ){.    
28f00 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
28f10 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74  pParse, "at most
28f20 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20   %d tables in a 
28f30 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20  join", BMS);.   
28f40 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
28f50 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
28f60 6f 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65  on normally gene
28f70 72 61 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c  rates a nested l
28f80 6f 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c  oop for all tabl
28f90 65 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62  es in .  ** pTab
28fa0 4c 69 73 74 2e 20 20 42 75 74 20 69 66 20 74 68  List.  But if th
28fb0 65 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  e WHERE_OR_SUBCL
28fc0 41 55 53 45 20 66 6c 61 67 20 69 73 20 73 65 74  AUSE flag is set
28fd0 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64  , then we should
28fe0 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72  .  ** only gener
28ff0 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
29000 20 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20   first table in 
29010 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73  pTabList and ass
29020 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e  ume that.  ** an
29030 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69  y cursors associ
29040 61 74 65 64 20 77 69 74 68 20 73 75 62 73 65 71  ated with subseq
29050 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20  uent tables are 
29060 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  uninitialized.. 
29070 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d   */.  nTabList =
29080 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
29090 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
290a0 45 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73  E) ? 1 : pTabLis
290b0 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41  t->nSrc;..  /* A
290c0 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
290d0 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65  ialize the Where
290e0 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
290f0 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
29100 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  the.  ** return 
29110 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20  value. A single 
29120 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73  allocation is us
29130 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  ed to store the 
29140 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73  WhereInfo.  ** s
29150 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65  truct, the conte
29160 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f  nts of WhereInfo
29170 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43  .a[], the WhereC
29180 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
29190 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65    ** and the Whe
291a0 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74  reMaskSet struct
291b0 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65  ure. Since Where
291c0 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20  Clause contains 
291d0 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66  an 8-byte.  ** f
291e0 69 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61  ield (type Bitma
291f0 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20 61  sk) it must be a
29200 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62  ligned on an 8-b
29210 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a  yte boundary on.
29220 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74    ** some archit
29230 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74  ectures. Hence t
29240 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f  he ROUND8() belo
29250 77 2e 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57  w..  */.  nByteW
29260 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69  Info = ROUND8(si
29270 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b  zeof(WhereInfo)+
29280 28 6e 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a  (nTabList-1)*siz
29290 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29  eof(WhereLevel))
292a0 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c  ;.  pWInfo = sql
292b0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
292c0 4e 28 64 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f  N(db, nByteWInfo
292d0 20 2b 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c   + sizeof(WhereL
292e0 6f 6f 70 29 29 3b 0a 20 20 69 66 28 20 64 62 2d  oop));.  if( db-
292f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
29300 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
29310 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
29320 20 20 20 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a      pWInfo = 0;.
29330 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
29340 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ginError;.  }.  
29350 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d  pWInfo->pParse =
29360 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66   pParse;.  pWInf
29370 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54  o->pTabList = pT
29380 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
29390 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  ->pOrderBy = pOr
293a0 64 65 72 42 79 3b 0a 20 20 70 57 49 6e 66 6f 2d  derBy;.  pWInfo-
293b0 3e 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65  >pWhere = pWhere
293c0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73  ;.  pWInfo->pRes
293d0 75 6c 74 53 65 74 20 3d 20 70 52 65 73 75 6c 74  ultSet = pResult
293e0 53 65 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 61  Set;.  pWInfo->a
293f0 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d  iCurOnePass[0] =
29400 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e   pWInfo->aiCurOn
29410 65 50 61 73 73 5b 31 5d 20 3d 20 2d 31 3b 0a 20  ePass[1] = -1;. 
29420 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20   pWInfo->nLevel 
29430 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20 70 57  = nTabList;.  pW
29440 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 70  Info->iBreak = p
29450 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65  WInfo->iContinue
29460 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
29470 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 57  keLabel(v);.  pW
29480 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
29490 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20   = wctrlFlags;. 
294a0 20 70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74 20   pWInfo->iLimit 
294b0 3d 20 69 41 75 78 41 72 67 3b 0a 20 20 70 57 49  = iAuxArg;.  pWI
294c0 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79  nfo->savedNQuery
294d0 4c 6f 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Loop = pParse->n
294e0 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 6d 65 6d  QueryLoop;.  mem
294f0 73 65 74 28 26 70 57 49 6e 66 6f 2d 3e 6e 4f 42  set(&pWInfo->nOB
29500 53 61 74 2c 20 30 2c 20 0a 20 20 20 20 20 20 20  Sat, 0, .       
29510 20 20 6f 66 66 73 65 74 6f 66 28 57 68 65 72 65    offsetof(Where
29520 49 6e 66 6f 2c 73 57 43 29 20 2d 20 6f 66 66 73  Info,sWC) - offs
29530 65 74 6f 66 28 57 68 65 72 65 49 6e 66 6f 2c 6e  etof(WhereInfo,n
29540 4f 42 53 61 74 29 29 3b 0a 20 20 6d 65 6d 73 65  OBSat));.  memse
29550 74 28 26 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c  t(&pWInfo->a[0],
29560 20 30 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65   0, sizeof(Where
29570 4c 6f 6f 70 29 2b 6e 54 61 62 4c 69 73 74 2a 73  Loop)+nTabList*s
29580 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c  izeof(WhereLevel
29590 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57  ));.  assert( pW
295a0 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d  Info->eOnePass==
295b0 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 3b 20 20  ONEPASS_OFF );  
295c0 2f 2a 20 4f 4e 45 50 41 53 53 20 64 65 66 61 75  /* ONEPASS defau
295d0 6c 74 73 20 74 6f 20 4f 46 46 20 2a 2f 0a 20 20  lts to OFF */.  
295e0 70 4d 61 73 6b 53 65 74 20 3d 20 26 70 57 49 6e  pMaskSet = &pWIn
295f0 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20  fo->sMaskSet;.  
29600 73 57 4c 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57  sWLB.pWInfo = pW
29610 49 6e 66 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43  Info;.  sWLB.pWC
29620 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b   = &pWInfo->sWC;
29630 0a 20 20 73 57 4c 42 2e 70 4e 65 77 20 3d 20 28  .  sWLB.pNew = (
29640 57 68 65 72 65 4c 6f 6f 70 2a 29 28 28 28 63 68  WhereLoop*)(((ch
29650 61 72 2a 29 70 57 49 6e 66 6f 29 2b 6e 42 79 74  ar*)pWInfo)+nByt
29660 65 57 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72  eWInfo);.  asser
29670 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
29680 49 47 4e 4d 45 4e 54 28 73 57 4c 42 2e 70 4e 65  IGNMENT(sWLB.pNe
29690 77 29 20 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f  w) );.  whereLoo
296a0 70 49 6e 69 74 28 73 57 4c 42 2e 70 4e 65 77 29  pInit(sWLB.pNew)
296b0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
296c0 44 45 42 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65  DEBUG.  sWLB.pNe
296d0 77 2d 3e 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65  w->cId = '*';.#e
296e0 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 70 6c 69 74  ndif..  /* Split
296f0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
29700 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20  e into separate 
29710 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77  subexpressions w
29720 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73  here each.  ** s
29730 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
29740 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e 20  separated by an 
29750 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20  AND operator..  
29760 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74  */.  initMaskSet
29770 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73 71  (pMaskSet);.  sq
29780 6c 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65  lite3WhereClause
29790 49 6e 69 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57  Init(&pWInfo->sW
297a0 43 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 73 71  C, pWInfo);.  sq
297b0 6c 69 74 65 33 57 68 65 72 65 53 70 6c 69 74 28  lite3WhereSplit(
297c0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57  &pWInfo->sWC, pW
297d0 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20  here, TK_AND);. 
297e0 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c     .  /* Special
297f0 20 63 61 73 65 3a 20 4e 6f 20 46 52 4f 4d 20 63   case: No FROM c
29800 6c 61 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28  lause.  */.  if(
29810 20 6e 54 61 62 4c 69 73 74 3d 3d 30 20 29 7b 0a   nTabList==0 ){.
29820 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
29830 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61   ) pWInfo->nOBSa
29840 74 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  t = pOrderBy->nE
29850 78 70 72 3b 0a 20 20 20 20 69 66 28 20 77 63 74  xpr;.    if( wct
29860 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
29870 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b  WANT_DISTINCT ){
29880 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
29890 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45  Distinct = WHERE
298a0 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45  _DISTINCT_UNIQUE
298b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
298c0 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66  * Assign a bit f
298d0 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20  rom the bitmask 
298e0 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  to every term in
298f0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
29900 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
29910 4e 2d 74 68 20 74 65 72 6d 20 6f 66 20 74 68 65  N-th term of the
29920 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
29930 61 73 73 69 67 6e 65 64 20 61 20 62 69 74 6d 61  assigned a bitma
29940 73 6b 20 6f 66 20 31 3c 3c 4e 2e 0a 20 20 2a 2a  sk of 1<<N..  **
29950 0a 20 20 2a 2a 20 54 68 65 20 72 75 6c 65 20 6f  .  ** The rule o
29960 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73  f the previous s
29970 65 6e 74 65 6e 63 65 20 65 6e 73 75 72 65 73 20  entence ensures 
29980 74 68 74 61 20 69 66 20 58 20 69 73 20 74 68 65  thta if X is the
29990 20 62 69 74 6d 61 73 6b 20 66 6f 72 0a 20 20 2a   bitmask for.  *
299a0 2a 20 61 20 74 61 62 6c 65 20 54 2c 20 74 68 65  * a table T, the
299b0 6e 20 58 2d 31 20 69 73 20 74 68 65 20 62 69 74  n X-1 is the bit
299c0 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 6f 74 68  mask for all oth
299d0 65 72 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  er tables to the
299e0 20 6c 65 66 74 20 6f 66 20 54 2e 0a 20 20 2a 2a   left of T..  **
299f0 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74   Knowing the bit
29a00 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61 62  mask for all tab
29a10 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  les to the left 
29a20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69  of a left join i
29a30 73 0a 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74  s.  ** important
29a40 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e  .  Ticket #3015.
29a50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20  .  **.  ** Note 
29a60 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61 72  that bitmasks ar
29a70 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61 6c  e created for al
29a80 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  l pTabList->nSrc
29a90 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a 2a 20   tables in.  ** 
29aa0 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20 6a 75  pTabList, not ju
29ab0 73 74 20 74 68 65 20 66 69 72 73 74 20 6e 54 61  st the first nTa
29ac0 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20 20 6e  bList tables.  n
29ad0 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72 6d 61  TabList is norma
29ae0 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74  lly.  ** equal t
29af0 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  o pTabList->nSrc
29b00 20 62 75 74 20 6d 69 67 68 74 20 62 65 20 73 68   but might be sh
29b10 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69 66 20  ortened to 1 if 
29b20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45 5f 4f  the.  ** WHERE_O
29b30 52 5f 53 55 42 43 4c 41 55 53 45 20 66 6c 61 67  R_SUBCLAUSE flag
29b40 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20   is set..  */.  
29b50 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61  for(ii=0; ii<pTa
29b60 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b  bList->nSrc; ii+
29b70 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61  +){.    createMa
29b80 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  sk(pMaskSet, pTa
29b90 62 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75  bList->a[ii].iCu
29ba0 72 73 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  rsor);.    sqlit
29bb0 65 33 57 68 65 72 65 54 61 62 46 75 6e 63 41 72  e3WhereTabFuncAr
29bc0 67 73 28 70 50 61 72 73 65 2c 20 26 70 54 61 62  gs(pParse, &pTab
29bd0 4c 69 73 74 2d 3e 61 5b 69 69 5d 2c 20 26 70 57  List->a[ii], &pW
29be0 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 7d 0a  Info->sWC);.  }.
29bf0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
29c00 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69 74 6d  BUG.  {.    Bitm
29c10 61 73 6b 20 6d 78 20 3d 20 30 3b 0a 20 20 20 20  ask mx = 0;.    
29c20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61  for(ii=0; ii<pTa
29c30 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b  bList->nSrc; ii+
29c40 2b 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  +){.      Bitmas
29c50 6b 20 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65  k m = sqlite3Whe
29c60 72 65 47 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  reGetMask(pMaskS
29c70 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
29c80 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  ii].iCursor);.  
29c90 20 20 20 20 61 73 73 65 72 74 28 20 6d 3e 3d 6d      assert( m>=m
29ca0 78 20 29 3b 0a 20 20 20 20 20 20 6d 78 20 3d 20  x );.      mx = 
29cb0 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  m;.    }.  }.#en
29cc0 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a  dif..  /* Analyz
29cd0 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62  e all of the sub
29ce0 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 2a 2f 0a  expressions. */.
29cf0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78    sqlite3WhereEx
29d00 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69  prAnalyze(pTabLi
29d10 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  st, &pWInfo->sWC
29d20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
29d30 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
29d40 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
29d50 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  ;..  /* Special 
29d60 63 61 73 65 3a 20 57 48 45 52 45 20 74 65 72 6d  case: WHERE term
29d70 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 72 65  s that do not re
29d80 66 65 72 20 74 6f 20 61 6e 79 20 74 61 62 6c 65  fer to any table
29d90 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 0a 20 20  s in the join.  
29da0 2a 2a 20 28 63 6f 6e 73 74 61 6e 74 20 65 78 70  ** (constant exp
29db0 72 65 73 73 69 6f 6e 73 29 2e 20 45 76 61 6c 75  ressions). Evalu
29dc0 61 74 65 20 65 61 63 68 20 73 75 63 68 20 74 65  ate each such te
29dd0 72 6d 2c 20 61 6e 64 20 6a 75 6d 70 20 6f 76 65  rm, and jump ove
29de0 72 20 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 67  r all the.  ** g
29df0 65 6e 65 72 61 74 65 64 20 63 6f 64 65 20 69 66  enerated code if
29e00 20 74 68 65 20 72 65 73 75 6c 74 20 69 73 20 6e   the result is n
29e10 6f 74 20 74 72 75 65 2e 20 20 0a 20 20 2a 2a 0a  ot true.  .  **.
29e20 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 64 6f 20 74    ** Do not do t
29e30 68 69 73 20 69 66 20 74 68 65 20 65 78 70 72 65  his if the expre
29e40 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 6e  ssion contains n
29e50 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63  on-deterministic
29e60 20 66 75 6e 63 74 69 6f 6e 73 0a 20 20 2a 2a 20   functions.  ** 
29e70 74 68 61 74 20 61 72 65 20 6e 6f 74 20 77 69 74  that are not wit
29e80 68 69 6e 20 61 20 73 75 62 2d 73 65 6c 65 63 74  hin a sub-select
29e90 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 73 74  . This is not st
29ea0 72 69 63 74 6c 79 20 72 65 71 75 69 72 65 64 2c  rictly required,
29eb0 20 62 75 74 0a 20 20 2a 2a 20 70 72 65 73 65 72   but.  ** preser
29ec0 76 65 73 20 53 51 4c 69 74 65 27 73 20 6c 65 67  ves SQLite's leg
29ed0 61 63 79 20 62 65 68 61 76 69 6f 75 72 20 69 6e  acy behaviour in
29ee0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
29ef0 77 6f 20 63 61 73 65 73 3a 0a 20 20 2a 2a 0a 20  wo cases:.  **. 
29f00 20 2a 2a 20 20 20 46 52 4f 4d 20 2e 2e 2e 20 57   **   FROM ... W
29f10 48 45 52 45 20 72 61 6e 64 6f 6d 28 29 3e 30 3b  HERE random()>0;
29f20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 65 76             -- ev
29f30 61 6c 20 72 61 6e 64 6f 6d 28 29 20 6f 6e 63 65  al random() once
29f40 20 70 65 72 20 72 6f 77 0a 20 20 2a 2a 20 20 20   per row.  **   
29f50 46 52 4f 4d 20 2e 2e 2e 20 57 48 45 52 45 20 28  FROM ... WHERE (
29f60 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 28 29 29  SELECT random())
29f70 3e 30 3b 20 20 2d 2d 20 65 76 61 6c 20 72 61 6e  >0;  -- eval ran
29f80 64 6f 6d 28 29 20 6f 6e 63 65 20 6f 76 65 72 61  dom() once overa
29f90 6c 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69  ll.  */.  for(ii
29fa0 3d 30 3b 20 69 69 3c 73 57 4c 42 2e 70 57 43 2d  =0; ii<sWLB.pWC-
29fb0 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20  >nTerm; ii++){. 
29fc0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
29fd0 20 3d 20 26 73 57 4c 42 2e 70 57 43 2d 3e 61 5b   = &sWLB.pWC->a[
29fe0 69 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 54 2d  ii];.    if( pT-
29ff0 3e 70 72 65 72 65 71 41 6c 6c 3d 3d 30 20 26 26  >prereqAll==0 &&
2a000 20 28 6e 54 61 62 4c 69 73 74 3d 3d 30 20 7c 7c   (nTabList==0 ||
2a010 20 65 78 70 72 49 73 44 65 74 65 72 6d 69 6e 69   exprIsDetermini
2a020 73 74 69 63 28 70 54 2d 3e 70 45 78 70 72 29 29  stic(pT->pExpr))
2a030 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2a040 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
2a050 72 73 65 2c 20 70 54 2d 3e 70 45 78 70 72 2c 20  rse, pT->pExpr, 
2a060 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20  pWInfo->iBreak, 
2a070 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
2a080 4c 29 3b 0a 20 20 20 20 20 20 70 54 2d 3e 77 74  L);.      pT->wt
2a090 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
2a0a0 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  DED;.    }.  }..
2a0b0 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73    if( wctrlFlags
2a0c0 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
2a0d0 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 69 66  STINCT ){.    if
2a0e0 28 20 69 73 44 69 73 74 69 6e 63 74 52 65 64 75  ( isDistinctRedu
2a0f0 6e 64 61 6e 74 28 70 50 61 72 73 65 2c 20 70 54  ndant(pParse, pT
2a100 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66 6f 2d  abList, &pWInfo-
2a110 3e 73 57 43 2c 20 70 52 65 73 75 6c 74 53 65 74  >sWC, pResultSet
2a120 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
2a130 65 20 44 49 53 54 49 4e 43 54 20 6d 61 72 6b 69  e DISTINCT marki
2a140 6e 67 20 69 73 20 70 6f 69 6e 74 6c 65 73 73 2e  ng is pointless.
2a150 20 20 49 67 6e 6f 72 65 20 69 74 2e 20 2a 2f 0a    Ignore it. */.
2a160 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44        pWInfo->eD
2a170 69 73 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f  istinct = WHERE_
2a180 44 49 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b  DISTINCT_UNIQUE;
2a190 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
2a1a0 4f 72 64 65 72 42 79 3d 3d 30 20 29 7b 0a 20 20  OrderBy==0 ){.  
2a1b0 20 20 20 20 2f 2a 20 54 72 79 20 74 6f 20 4f 52      /* Try to OR
2a1c0 44 45 52 20 42 59 20 74 68 65 20 72 65 73 75 6c  DER BY the resul
2a1d0 74 20 73 65 74 20 74 6f 20 6d 61 6b 65 20 64 69  t set to make di
2a1e0 73 74 69 6e 63 74 20 70 72 6f 63 65 73 73 69 6e  stinct processin
2a1f0 67 20 65 61 73 69 65 72 20 2a 2f 0a 20 20 20 20  g easier */.    
2a200 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46    pWInfo->wctrlF
2a210 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 44 49  lags |= WHERE_DI
2a220 53 54 49 4e 43 54 42 59 3b 0a 20 20 20 20 20 20  STINCTBY;.      
2a230 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
2a240 20 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20   = pResultSet;. 
2a250 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
2a260 6f 6e 73 74 72 75 63 74 20 74 68 65 20 57 68 65  onstruct the Whe
2a270 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a  reLoop objects *
2a280 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 57 48  /.#if defined(WH
2a290 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
2a2a0 29 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  ).  if( sqlite3W
2a2b0 68 65 72 65 54 72 61 63 65 20 26 20 30 78 66 66  hereTrace & 0xff
2a2c0 66 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ff ){.    sqlite
2a2d0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2a 2a  3DebugPrintf("**
2a2e0 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72  * Optimizer Star
2a2f0 74 20 2a 2a 2a 20 28 77 63 74 72 6c 46 6c 61 67  t *** (wctrlFlag
2a300 73 3a 20 30 78 25 78 22 2c 77 63 74 72 6c 46 6c  s: 0x%x",wctrlFl
2a310 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 77 63  ags);.    if( wc
2a320 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2a330 5f 55 53 45 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _USE_LIMIT ){.  
2a340 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2a350 50 72 69 6e 74 66 28 22 2c 20 6c 69 6d 69 74 3a  Printf(", limit:
2a360 20 25 64 22 2c 20 69 41 75 78 41 72 67 29 3b 0a   %d", iAuxArg);.
2a370 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2a380 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 29 5c  3DebugPrintf(")\
2a390 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n");.  }.  if( s
2a3a0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
2a3b0 20 26 20 30 78 31 30 30 20 29 7b 20 2f 2a 20 44   & 0x100 ){ /* D
2a3c0 69 73 70 6c 61 79 20 61 6c 6c 20 74 65 72 6d 73  isplay all terms
2a3d0 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2a3e0 61 75 73 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ause */.    sqli
2a3f0 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 50 72  te3WhereClausePr
2a400 69 6e 74 28 73 57 4c 42 2e 70 57 43 29 3b 0a 20  int(sWLB.pWC);. 
2a410 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
2a420 20 6e 54 61 62 4c 69 73 74 21 3d 31 20 7c 7c 20   nTabList!=1 || 
2a430 77 68 65 72 65 53 68 6f 72 74 43 75 74 28 26 73  whereShortCut(&s
2a440 57 4c 42 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  WLB)==0 ){.    r
2a450 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
2a460 41 6c 6c 28 26 73 57 4c 42 29 3b 0a 20 20 20 20  All(&sWLB);.    
2a470 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68  if( rc ) goto wh
2a480 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20  ereBeginError;. 
2a490 20 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52   .#ifdef WHERETR
2a4a0 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
2a4b0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
2a4c0 54 72 61 63 65 20 29 7b 20 20 20 20 2f 2a 20 44  Trace ){    /* D
2a4d0 69 73 70 6c 61 79 20 61 6c 6c 20 6f 66 20 74 68  isplay all of th
2a4e0 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65  e WhereLoop obje
2a4f0 63 74 73 20 2a 2f 0a 20 20 20 20 20 20 57 68 65  cts */.      Whe
2a500 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 20 20 20  reLoop *p;.     
2a510 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 74   int i;.      st
2a520 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
2a530 7a 4c 61 62 65 6c 5b 5d 20 3d 20 22 30 31 32 33  zLabel[] = "0123
2a540 34 35 36 37 38 39 61 62 63 64 65 66 67 68 69 6a  456789abcdefghij
2a550 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 79 78 7a  klmnopqrstuvwyxz
2a560 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
2a570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2a590 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
2a5a0 51 52 53 54 55 56 57 59 58 5a 22 3b 0a 20 20 20  QRSTUVWYXZ";.   
2a5b0 20 20 20 66 6f 72 28 70 3d 70 57 49 6e 66 6f 2d     for(p=pWInfo-
2a5c0 3e 70 4c 6f 6f 70 73 2c 20 69 3d 30 3b 20 70 3b  >pLoops, i=0; p;
2a5d0 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 2c   p=p->pNextLoop,
2a5e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
2a5f0 2d 3e 63 49 64 20 3d 20 7a 4c 61 62 65 6c 5b 69  ->cId = zLabel[i
2a600 25 28 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29  %(sizeof(zLabel)
2a610 2d 31 29 5d 3b 0a 20 20 20 20 20 20 20 20 77 68  -1)];.        wh
2a620 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 2c 20  ereLoopPrint(p, 
2a630 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20 20 20 20  sWLB.pWC);.     
2a640 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
2a650 20 20 0a 20 20 20 20 77 68 65 72 65 50 61 74 68    .    wherePath
2a660 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 30  Solver(pWInfo, 0
2a670 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
2a680 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
2a690 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
2a6a0 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e  or;.    if( pWIn
2a6b0 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a  fo->pOrderBy ){.
2a6c0 20 20 20 20 20 20 20 77 68 65 72 65 50 61 74 68         wherePath
2a6d0 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f 2c 20 70  Solver(pWInfo, p
2a6e0 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 2b 31  WInfo->nRowOut+1
2a6f0 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 64 62  );.       if( db
2a700 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2a710 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
2a720 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Error;.    }.  }
2a730 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70  .  if( pWInfo->p
2a740 4f 72 64 65 72 42 79 3d 3d 30 20 26 26 20 28 64  OrderBy==0 && (d
2a750 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
2a760 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 29 21  E_ReverseOrder)!
2a770 3d 30 20 29 7b 0a 20 20 20 20 20 70 57 49 6e 66  =0 ){.     pWInf
2a780 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 41 4c 4c  o->revMask = ALL
2a790 42 49 54 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BITS;.  }.  if( 
2a7a0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
2a7b0 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c 6c 6f 63  NEVER(db->malloc
2a7c0 46 61 69 6c 65 64 29 20 29 7b 0a 20 20 20 20 67  Failed) ){.    g
2a7d0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
2a7e0 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  ror;.  }.#ifdef 
2a7f0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
2a800 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
2a810 57 68 65 72 65 54 72 61 63 65 20 29 7b 0a 20 20  WhereTrace ){.  
2a820 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2a830 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f 6c 75 74  intf("---- Solut
2a840 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c 20 70 57  ion nRow=%d", pW
2a850 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 29 3b 0a  Info->nRowOut);.
2a860 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
2a870 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20 20 20 20  nOBSat>0 ){.    
2a880 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2a890 69 6e 74 66 28 22 20 4f 52 44 45 52 42 59 3d 25  intf(" ORDERBY=%
2a8a0 64 2c 30 78 25 6c 6c 78 22 2c 20 70 57 49 6e 66  d,0x%llx", pWInf
2a8b0 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70 57 49 6e 66  o->nOBSat, pWInf
2a8c0 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a 20 20 20  o->revMask);.   
2a8d0 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20 70   }.    switch( p
2a8e0 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
2a8f0 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 57   ){.      case W
2a900 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
2a910 49 51 55 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  IQUE: {.        
2a920 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2a930 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75  tf("  DISTINCT=u
2a940 6e 69 71 75 65 22 29 3b 0a 20 20 20 20 20 20 20  nique");.       
2a950 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2a960 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52 45        case WHERE
2a970 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45  _DISTINCT_ORDERE
2a980 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  D: {.        sql
2a990 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2a9a0 22 20 20 44 49 53 54 49 4e 43 54 3d 6f 72 64 65  "  DISTINCT=orde
2a9b0 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 62  red");.        b
2a9c0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2a9d0 20 20 20 20 63 61 73 65 20 57 48 45 52 45 5f 44      case WHERE_D
2a9e0 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44 45 52 45  ISTINCT_UNORDERE
2a9f0 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  D: {.        sql
2aa00 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
2aa10 22 20 20 44 49 53 54 49 4e 43 54 3d 75 6e 6f 72  "  DISTINCT=unor
2aa20 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20 20  dered");.       
2aa30 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2aa40 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2aa50 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e  3DebugPrintf("\n
2aa60 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  ");.    for(ii=0
2aa70 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65  ; ii<pWInfo->nLe
2aa80 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  vel; ii++){.    
2aa90 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
2aaa0 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 2e 70  (pWInfo->a[ii].p
2aab0 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e 70 57 43 29  WLoop, sWLB.pWC)
2aac0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
2aad0 69 66 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20  if.  /* Attempt 
2aae0 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65 73 20 66  to omit tables f
2aaf0 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20 74 68 61  rom the join tha
2ab00 74 20 64 6f 20 6e 6f 74 20 65 66 66 65 63 74 20  t do not effect 
2ab10 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
2ab20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  if( pWInfo->nLev
2ab30 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70 52 65 73  el>=2.   && pRes
2ab40 75 6c 74 53 65 74 21 3d 30 0a 20 20 20 26 26 20  ultSet!=0.   && 
2ab50 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62  OptimizationEnab
2ab60 6c 65 64 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  led(db, SQLITE_O
2ab70 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 29 0a 20 20 29  mitNoopJoin).  )
2ab80 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 74 61  {.    Bitmask ta
2ab90 62 55 73 65 64 20 3d 20 73 71 6c 69 74 65 33 57  bUsed = sqlite3W
2aba0 68 65 72 65 45 78 70 72 4c 69 73 74 55 73 61 67  hereExprListUsag
2abb0 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 65 73  e(pMaskSet, pRes
2abc0 75 6c 74 53 65 74 29 3b 0a 20 20 20 20 69 66 28  ultSet);.    if(
2abd0 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20 29   sWLB.pOrderBy )
2abe0 7b 0a 20 20 20 20 20 20 74 61 62 55 73 65 64 20  {.      tabUsed 
2abf0 7c 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  |= sqlite3WhereE
2ac00 78 70 72 4c 69 73 74 55 73 61 67 65 28 70 4d 61  xprListUsage(pMa
2ac10 73 6b 53 65 74 2c 20 73 57 4c 42 2e 70 4f 72 64  skSet, sWLB.pOrd
2ac20 65 72 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  erBy);.    }.   
2ac30 20 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e   while( pWInfo->
2ac40 6e 4c 65 76 65 6c 3e 3d 32 20 29 7b 0a 20 20 20  nLevel>=2 ){.   
2ac50 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
2ac60 65 72 6d 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20  erm, *pEnd;.    
2ac70 20 20 70 4c 6f 6f 70 20 3d 20 70 57 49 6e 66 6f    pLoop = pWInfo
2ac80 2d 3e 61 5b 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  ->a[pWInfo->nLev
2ac90 65 6c 2d 31 5d 2e 70 57 4c 6f 6f 70 3b 0a 20 20  el-1].pWLoop;.  
2aca0 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d      if( (pWInfo-
2acb0 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 6f  >pTabList->a[pLo
2acc0 6f 70 2d 3e 69 54 61 62 5d 2e 66 67 2e 6a 6f 69  op->iTab].fg.joi
2acd0 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
2ace0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
2acf0 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61     if( (wctrlFla
2ad00 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f  gs & WHERE_WANT_
2ad10 44 49 53 54 49 4e 43 54 29 3d 3d 30 0a 20 20 20  DISTINCT)==0.   
2ad20 20 20 20 20 26 26 20 28 70 4c 6f 6f 70 2d 3e 77      && (pLoop->w
2ad30 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  sFlags & WHERE_O
2ad40 4e 45 52 4f 57 29 3d 3d 30 0a 20 20 20 20 20 20  NEROW)==0.      
2ad50 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
2ad60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ad70 69 66 28 20 28 74 61 62 55 73 65 64 20 26 20 70  if( (tabUsed & p
2ad80 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 21  Loop->maskSelf)!
2ad90 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
2ada0 20 20 70 45 6e 64 20 3d 20 73 57 4c 42 2e 70 57    pEnd = sWLB.pW
2adb0 43 2d 3e 61 20 2b 20 73 57 4c 42 2e 70 57 43 2d  C->a + sWLB.pWC-
2adc0 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 66 6f  >nTerm;.      fo
2add0 72 28 70 54 65 72 6d 3d 73 57 4c 42 2e 70 57 43  r(pTerm=sWLB.pWC
2ade0 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 45 6e 64 3b  ->a; pTerm<pEnd;
2adf0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
2ae00 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
2ae10 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70  rereqAll & pLoop
2ae20 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30 0a 20  ->maskSelf)!=0. 
2ae30 20 20 20 20 20 20 20 20 26 26 20 21 45 78 70 72          && !Expr
2ae40 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72  HasProperty(pTer
2ae50 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  m->pExpr, EP_Fro
2ae60 6d 4a 6f 69 6e 29 0a 20 20 20 20 20 20 20 20 29  mJoin).        )
2ae70 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  {.          brea
2ae80 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
2ae90 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
2aea0 54 65 72 6d 3c 70 45 6e 64 20 29 20 62 72 65 61  Term<pEnd ) brea
2aeb0 6b 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  k;.      WHERETR
2aec0 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 2d 3e  ACE(0xffff, ("->
2aed0 20 64 72 6f 70 20 6c 6f 6f 70 20 25 63 20 6e 6f   drop loop %c no
2aee0 74 20 75 73 65 64 5c 6e 22 2c 20 70 4c 6f 6f 70  t used\n", pLoop
2aef0 2d 3e 63 49 64 29 29 3b 0a 20 20 20 20 20 20 70  ->cId));.      p
2af00 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 2d 3b  WInfo->nLevel--;
2af10 0a 20 20 20 20 20 20 6e 54 61 62 4c 69 73 74 2d  .      nTabList-
2af20 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57  -;.    }.  }.  W
2af30 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66  HERETRACE(0xffff
2af40 2c 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  ,("*** Optimizer
2af50 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22   Finished ***\n"
2af60 29 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50  ));.  pWInfo->pP
2af70 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70  arse->nQueryLoop
2af80 20 2b 3d 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77   += pWInfo->nRow
2af90 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Out;..  /* If th
2afa0 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55  e caller is an U
2afb0 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
2afc0 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69  statement that i
2afd0 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a  s requesting.  *
2afe0 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70  * to use a one-p
2aff0 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64  ass algorithm, d
2b000 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73  etermine if this
2b010 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   is appropriate.
2b020 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2b030 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
2b040 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
2b050 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66  RED)==0 || pWInf
2b060 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a  o->nLevel==1 );.
2b070 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
2b080 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
2b090 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 29 7b  S_DESIRED)!=0 ){
2b0a0 0a 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73  .    int wsFlags
2b0b0 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e   = pWInfo->a[0].
2b0c0 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 3b  pWLoop->wsFlags;
2b0d0 0a 20 20 20 20 69 6e 74 20 62 4f 6e 65 72 6f 77  .    int bOnerow
2b0e0 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20 57 48   = (wsFlags & WH
2b0f0 45 52 45 5f 4f 4e 45 52 4f 57 29 21 3d 30 3b 0a  ERE_ONEROW)!=0;.
2b100 20 20 20 20 69 66 28 20 62 4f 6e 65 72 6f 77 0a      if( bOnerow.
2b110 20 20 20 20 20 7c 7c 20 28 28 77 63 74 72 6c 46       || ((wctrlF
2b120 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45  lags & WHERE_ONE
2b130 50 41 53 53 5f 4d 55 4c 54 49 52 4f 57 29 21 3d  PASS_MULTIROW)!=
2b140 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
2b150 30 3d 3d 28 77 73 46 6c 61 67 73 20 26 20 57 48  0==(wsFlags & WH
2b160 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
2b170 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
2b180 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
2b190 20 3d 20 62 4f 6e 65 72 6f 77 20 3f 20 4f 4e 45   = bOnerow ? ONE
2b1a0 50 41 53 53 5f 53 49 4e 47 4c 45 20 3a 20 4f 4e  PASS_SINGLE : ON
2b1b0 45 50 41 53 53 5f 4d 55 4c 54 49 3b 0a 20 20 20  EPASS_MULTI;.   
2b1c0 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64 28     if( HasRowid(
2b1d0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  pTabList->a[0].p
2b1e0 54 61 62 29 20 26 26 20 28 77 73 46 6c 61 67 73  Tab) && (wsFlags
2b1f0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
2b200 59 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  Y) ){.        if
2b210 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
2b220 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c  HERE_ONEPASS_MUL
2b230 54 49 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20  TIROW ){.       
2b240 20 20 20 62 46 6f 72 64 65 6c 65 74 65 20 3d 20     bFordelete = 
2b250 4f 50 46 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45  OPFLAG_FORDELETE
2b260 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2b270 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d      pWInfo->a[0]
2b280 2e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  .pWLoop->wsFlags
2b290 20 3d 20 28 77 73 46 6c 61 67 73 20 26 20 7e 57   = (wsFlags & ~W
2b2a0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3b 0a  HERE_IDX_ONLY);.
2b2b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2b2c0 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c  }..  /* Open all
2b2d0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70   tables in the p
2b2e0 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20  TabList and any 
2b2f0 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65 64  indices selected
2b300 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68   for.  ** search
2b310 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73  ing those tables
2b320 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
2b330 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f  0, pLevel=pWInfo
2b340 2d 3e 61 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74  ->a; ii<nTabList
2b350 3b 20 69 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  ; ii++, pLevel++
2b360 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
2b370 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  ab;     /* Table
2b380 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20   to open */.    
2b390 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
2b3a0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74   /* Index of dat
2b3b0 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
2b3c0 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a   table/index */.
2b3d0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
2b3e0 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
2b3f0 6d 3b 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d  m;..    pTabItem
2b400 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
2b410 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
2b420 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62 49      pTab = pTabI
2b430 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69  tem->pTab;.    i
2b440 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
2b450 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
2b460 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
2b470 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c    pLoop = pLevel
2b480 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 69 66  ->pWLoop;.    if
2b490 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  ( (pTab->tabFlag
2b4a0 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
2b4b0 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53  )!=0 || pTab->pS
2b4c0 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 2f  elect ){.      /
2b4d0 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
2b4e0 20 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65      }else.#ifnde
2b4f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2b500 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
2b510 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  f( (pLoop->wsFla
2b520 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
2b530 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20  ALTABLE)!=0 ){. 
2b540 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2b550 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20  *pVTab = (const 
2b560 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65  char *)sqlite3Ge
2b570 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  tVTable(db, pTab
2b580 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75  );.      int iCu
2b590 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  r = pTabItem->iC
2b5a0 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c  ursor;.      sql
2b5b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
2b5c0 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72  , OP_VOpen, iCur
2b5d0 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50  , 0, 0, pVTab, P
2b5e0 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c  4_VTAB);.    }el
2b5f0 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  se if( IsVirtual
2b600 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
2b610 2f 2a 20 6e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d  /* noop */.    }
2b620 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
2b630 69 66 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  if( (pLoop->wsFl
2b640 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
2b650 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20 20 20 20  ONLY)==0.       
2b660 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73    && (wctrlFlags
2b670 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43   & WHERE_OR_SUBC
2b680 4c 41 55 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20  LAUSE)==0 ){.   
2b690 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f     int op = OP_O
2b6a0 70 65 6e 52 65 61 64 3b 0a 20 20 20 20 20 20 69  penRead;.      i
2b6b0 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50  f( pWInfo->eOneP
2b6c0 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46 46  ass!=ONEPASS_OFF
2b6d0 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d   ){.        op =
2b6e0 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 3b 0a 20   OP_OpenWrite;. 
2b6f0 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61         pWInfo->a
2b700 69 43 75 72 4f 6e 65 50 61 73 73 5b 30 5d 20 3d  iCurOnePass[0] =
2b710 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
2b720 6f 72 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  or;.      };.   
2b730 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
2b740 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
2b750 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69  Item->iCursor, i
2b760 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20  Db, pTab, op);. 
2b770 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
2b780 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3d 3d  bItem->iCursor==
2b790 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
2b7a0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2b7b0 65 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50  e( pWInfo->eOneP
2b7c0 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46  ass==ONEPASS_OFF
2b7d0 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d   && pTab->nCol==
2b7e0 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  BMS-1 );.      t
2b7f0 65 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d  estcase( pWInfo-
2b800 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41  >eOnePass==ONEPA
2b810 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d 3e  SS_OFF && pTab->
2b820 6e 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20  nCol==BMS );.   
2b830 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65     if( pWInfo->e
2b840 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53  OnePass==ONEPASS
2b850 5f 4f 46 46 20 26 26 20 70 54 61 62 2d 3e 6e 43  _OFF && pTab->nC
2b860 6f 6c 3c 42 4d 53 20 26 26 20 48 61 73 52 6f 77  ol<BMS && HasRow
2b870 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
2b880 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20      Bitmask b = 
2b890 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pTabItem->colUse
2b8a0 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  d;.        int n
2b8b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 0;.        fo
2b8c0 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e  r(; b; b=b>>1, n
2b8d0 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 73 71  ++){}.        sq
2b8e0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2b8f0 34 28 76 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  4(v, -1, SQLITE_
2b900 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50  INT_TO_PTR(n), P
2b910 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20  4_INT32);.      
2b920 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61    assert( n<=pTa
2b930 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
2b940 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
2b950 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
2b960 49 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20 70  INTS.      if( p
2b970 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
2b980 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20  ndex!=0 ){.     
2b990 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
2b9a0 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
2b9b0 5f 53 45 45 4b 45 51 7c 62 46 6f 72 64 65 6c 65  _SEEKEQ|bFordele
2b9c0 74 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  te);.      }else
2b9d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
2b9e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2b9f0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 62  dbeChangeP5(v, b
2ba00 46 6f 72 64 65 6c 65 74 65 29 3b 0a 20 20 20 20  Fordelete);.    
2ba10 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
2ba20 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f  E_ENABLE_COLUMN_
2ba30 55 53 45 44 5f 4d 41 53 4b 0a 20 20 20 20 20 20  USED_MASK.      
2ba40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2ba50 34 44 75 70 38 28 76 2c 20 4f 50 5f 43 6f 6c 75  4Dup8(v, OP_Colu
2ba60 6d 6e 73 55 73 65 64 2c 20 70 54 61 62 49 74 65  mnsUsed, pTabIte
2ba70 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 30 2c 20 30  m->iCursor, 0, 0
2ba80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2ba90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
2baa0 6f 6e 73 74 20 75 38 2a 29 26 70 54 61 62 49 74  onst u8*)&pTabIt
2bab0 65 6d 2d 3e 63 6f 6c 55 73 65 64 2c 20 50 34 5f  em->colUsed, P4_
2bac0 49 4e 54 36 34 29 3b 0a 23 65 6e 64 69 66 0a 20  INT64);.#endif. 
2bad0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2bae0 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
2baf0 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
2bb00 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61  ab->tnum, 0, pTa
2bb10 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
2bb20 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e  .    if( pLoop->
2bb30 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2bb40 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20  INDEXED ){.     
2bb50 20 49 6e 64 65 78 20 2a 70 49 78 20 3d 20 70 4c   Index *pIx = pL
2bb60 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
2bb70 64 65 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  dex;.      int i
2bb80 49 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20  IndexCur;.      
2bb90 69 6e 74 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e  int op = OP_Open
2bba0 52 65 61 64 3b 0a 20 20 20 20 20 20 2f 2a 20 69  Read;.      /* i
2bbb0 41 75 78 41 72 67 20 69 73 20 61 6c 77 61 79 73  AuxArg is always
2bbc0 20 73 65 74 20 69 66 20 74 6f 20 61 20 70 6f 73   set if to a pos
2bbd0 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 4f  itive value if O
2bbe0 4e 45 50 41 53 53 20 69 73 20 70 6f 73 73 69 62  NEPASS is possib
2bbf0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  le */.      asse
2bc00 72 74 28 20 69 41 75 78 41 72 67 21 3d 30 20 7c  rt( iAuxArg!=0 |
2bc10 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  | (pWInfo->wctrl
2bc20 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
2bc30 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d  EPASS_DESIRED)==
2bc40 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  0 );.      if( !
2bc50 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 26  HasRowid(pTab) &
2bc60 26 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e  & IsPrimaryKeyIn
2bc70 64 65 78 28 70 49 78 29 0a 20 20 20 20 20 20 20  dex(pIx).       
2bc80 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
2bc90 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
2bca0 55 53 45 29 21 3d 30 0a 20 20 20 20 20 20 29 7b  USE)!=0.      ){
2bcb0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  .        /* This
2bcc0 20 69 73 20 6f 6e 65 20 74 65 72 6d 20 6f 66 20   is one term of 
2bcd0 61 6e 20 4f 52 2d 6f 70 74 69 6d 69 7a 61 74 69  an OR-optimizati
2bce0 6f 6e 20 75 73 69 6e 67 20 74 68 65 20 50 52 49  on using the PRI
2bcf0 4d 41 52 59 20 4b 45 59 20 6f 66 20 61 0a 20 20  MARY KEY of a.  
2bd00 20 20 20 20 20 20 2a 2a 20 57 49 54 48 4f 55 54        ** WITHOUT
2bd10 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 20 4e   ROWID table.  N
2bd20 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 73 65 70  o need for a sep
2bd30 61 72 61 74 65 20 69 6e 64 65 78 20 2a 2f 0a 20  arate index */. 
2bd40 20 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72         iIndexCur
2bd50 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43   = pLevel->iTabC
2bd60 75 72 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d  ur;.        op =
2bd70 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
2bd80 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65  if( pWInfo->eOne
2bd90 50 61 73 73 21 3d 4f 4e 45 50 41 53 53 5f 4f 46  Pass!=ONEPASS_OF
2bda0 46 20 29 7b 0a 20 20 20 20 20 20 20 20 49 6e 64  F ){.        Ind
2bdb0 65 78 20 2a 70 4a 20 3d 20 70 54 61 62 49 74 65  ex *pJ = pTabIte
2bdc0 6d 2d 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  m->pTab->pIndex;
2bdd0 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43  .        iIndexC
2bde0 75 72 20 3d 20 69 41 75 78 41 72 67 3b 0a 20 20  ur = iAuxArg;.  
2bdf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 77 63        assert( wc
2be00 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2be10 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
2be20 20 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   );.        whil
2be30 65 28 20 41 4c 57 41 59 53 28 70 4a 29 20 26 26  e( ALWAYS(pJ) &&
2be40 20 70 4a 21 3d 70 49 78 20 29 7b 0a 20 20 20 20   pJ!=pIx ){.    
2be50 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 2b        iIndexCur+
2be60 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4a 20  +;.          pJ 
2be70 3d 20 70 4a 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  = pJ->pNext;.   
2be80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f       }.        o
2be90 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  p = OP_OpenWrite
2bea0 3b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  ;.        pWInfo
2beb0 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31  ->aiCurOnePass[1
2bec0 5d 20 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20  ] = iIndexCur;. 
2bed0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
2bee0 41 75 78 41 72 67 20 26 26 20 28 77 63 74 72 6c  AuxArg && (wctrl
2bef0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
2bf00 5f 53 55 42 43 4c 41 55 53 45 29 21 3d 30 20 29  _SUBCLAUSE)!=0 )
2bf10 7b 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78  {.        iIndex
2bf20 43 75 72 20 3d 20 69 41 75 78 41 72 67 3b 0a 20  Cur = iAuxArg;. 
2bf30 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 52         op = OP_R
2bf40 65 6f 70 65 6e 49 64 78 3b 0a 20 20 20 20 20 20  eopenIdx;.      
2bf50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
2bf60 49 6e 64 65 78 43 75 72 20 3d 20 70 50 61 72 73  IndexCur = pPars
2bf70 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20  e->nTab++;.     
2bf80 20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d   }.      pLevel-
2bf90 3e 69 49 64 78 43 75 72 20 3d 20 69 49 6e 64 65  >iIdxCur = iInde
2bfa0 78 43 75 72 3b 0a 20 20 20 20 20 20 61 73 73 65  xCur;.      asse
2bfb0 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61  rt( pIx->pSchema
2bfc0 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
2bfd0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2bfe0 20 69 49 6e 64 65 78 43 75 72 3e 3d 30 20 29 3b   iIndexCur>=0 );
2bff0 0a 20 20 20 20 20 20 69 66 28 20 6f 70 20 29 7b  .      if( op ){
2c000 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2c010 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70  VdbeAddOp3(v, op
2c020 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 70 49 78  , iIndexCur, pIx
2c030 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
2c040 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2c050 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50  eSetP4KeyInfo(pP
2c060 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20  arse, pIx);.    
2c070 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
2c080 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2c090 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d 30 0a 20  CONSTRAINT)!=0. 
2c0a0 20 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f          && (pLoo
2c0b0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  p->wsFlags & (WH
2c0c0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
2c0d0 7c 57 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 29  |WHERE_SKIPSCAN)
2c0e0 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
2c0f0 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46   (pWInfo->wctrlF
2c100 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52  lags&WHERE_ORDER
2c110 42 59 5f 4d 49 4e 29 3d 3d 30 0a 20 20 20 20 20  BY_MIN)==0.     
2c120 20 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65      && pWInfo->e
2c130 44 69 73 74 69 6e 63 74 21 3d 57 48 45 52 45 5f  Distinct!=WHERE_
2c140 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
2c150 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2c160 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2c170 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46  eChangeP5(v, OPF
2c180 4c 41 47 5f 53 45 45 4b 45 51 29 3b 20 2f 2a 20  LAG_SEEKEQ); /* 
2c190 48 69 6e 74 20 74 6f 20 43 4f 4d 44 42 32 20 2a  Hint to COMDB2 *
2c1a0 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
2c1b0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
2c1c0 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e 7a  (v, "%s", pIx->z
2c1d0 4e 61 6d 65 29 29 3b 0a 23 69 66 64 65 66 20 53  Name));.#ifdef S
2c1e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
2c1f0 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20 20  UMN_USED_MASK.  
2c200 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
2c210 20 20 75 36 34 20 63 6f 6c 55 73 65 64 20 3d 20    u64 colUsed = 
2c220 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  0;.          int
2c230 20 69 69 2c 20 6a 6a 3b 0a 20 20 20 20 20 20 20   ii, jj;.       
2c240 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
2c250 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 69  pIx->nColumn; ii
2c260 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2c270 20 6a 6a 20 3d 20 70 49 78 2d 3e 61 69 43 6f 6c   jj = pIx->aiCol
2c280 75 6d 6e 5b 69 69 5d 3b 0a 20 20 20 20 20 20 20  umn[ii];.       
2c290 20 20 20 20 20 69 66 28 20 6a 6a 3c 30 20 29 20       if( jj<0 ) 
2c2a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2c2b0 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 36 33 20        if( jj>63 
2c2c0 29 20 6a 6a 20 3d 20 36 33 3b 0a 20 20 20 20 20  ) jj = 63;.     
2c2d0 20 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62         if( (pTab
2c2e0 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20  Item->colUsed & 
2c2f0 4d 41 53 4b 42 49 54 28 6a 6a 29 29 3d 3d 30 20  MASKBIT(jj))==0 
2c300 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2c310 20 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64 20          colUsed 
2c320 7c 3d 20 28 28 75 36 34 29 31 29 3c 3c 28 69 69  |= ((u64)1)<<(ii
2c330 3c 36 33 20 3f 20 69 69 20 3a 20 36 33 29 3b 0a  <63 ? ii : 63);.
2c340 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c350 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2c360 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f  eAddOp4Dup8(v, O
2c370 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 69  P_ColumnsUsed, i
2c380 49 6e 64 65 78 43 75 72 2c 20 30 2c 20 30 2c 0a  IndexCur, 0, 0,.
2c390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3b0 28 75 38 2a 29 26 63 6f 6c 55 73 65 64 2c 20 50  (u8*)&colUsed, P
2c3c0 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 20 20  4_INT64);.      
2c3d0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
2c3e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
2c3f0 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 20 2a 2f 0a  MN_USED_MASK */.
2c400 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2c410 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 20 73    if( iDb>=0 ) s
2c420 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
2c430 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
2c440 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66  Db);.  }.  pWInf
2c450 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65  o->iTop = sqlite
2c460 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
2c470 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  (v);.  if( db->m
2c480 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
2c490 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72  to whereBeginErr
2c4a0 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  or;..  /* Genera
2c4b0 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64  te the code to d
2c4c0 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20 45  o the search.  E
2c4d0 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ach iteration of
2c4e0 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f   the for.  ** lo
2c4f0 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74  op below generat
2c500 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69  es code for a si
2c510 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70  ngle nested loop
2c520 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20   of the VM.  ** 
2c530 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20  program..  */.  
2c540 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74  notReady = ~(Bit
2c550 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 69  mask)0;.  for(ii
2c560 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74 3b  =0; ii<nTabList;
2c570 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20   ii++){.    int 
2c580 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20  addrExplain;.   
2c590 20 69 6e 74 20 77 73 46 6c 61 67 73 3b 0a 20 20   int wsFlags;.  
2c5a0 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
2c5b0 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 77  fo->a[ii];.    w
2c5c0 73 46 6c 61 67 73 20 3d 20 70 4c 65 76 65 6c 2d  sFlags = pLevel-
2c5d0 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  >pWLoop->wsFlags
2c5e0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2c5f0 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
2c600 49 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28 70  INDEX.    if( (p
2c610 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77  Level->pWLoop->w
2c620 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
2c630 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b  UTO_INDEX)!=0 ){
2c640 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74  .      construct
2c650 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 70  AutomaticIndex(p
2c660 50 61 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d 3e  Parse, &pWInfo->
2c670 73 57 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20  sWC,.           
2c680 20 20 20 20 20 26 70 54 61 62 4c 69 73 74 2d 3e       &pTabList->
2c690 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
2c6a0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76  , notReady, pLev
2c6b0 65 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  el);.      if( d
2c6c0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2c6d0 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
2c6e0 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23 65  nError;.    }.#e
2c6f0 6e 64 69 66 0a 20 20 20 20 61 64 64 72 45 78 70  ndif.    addrExp
2c700 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 57 68  lain = sqlite3Wh
2c710 65 72 65 45 78 70 6c 61 69 6e 4f 6e 65 53 63 61  ereExplainOneSca
2c720 6e 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  n(.        pPars
2c730 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c 65  e, pTabList, pLe
2c740 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c 2d  vel, ii, pLevel-
2c750 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c 61  >iFrom, wctrlFla
2c760 67 73 0a 20 20 20 20 29 3b 0a 20 20 20 20 70 4c  gs.    );.    pL
2c770 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 20 3d  evel->addrBody =
2c780 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2c790 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
2c7a0 6e 6f 74 52 65 61 64 79 20 3d 20 73 71 6c 69 74  notReady = sqlit
2c7b0 65 33 57 68 65 72 65 43 6f 64 65 4f 6e 65 4c 6f  e3WhereCodeOneLo
2c7c0 6f 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c 20  opStart(pWInfo, 
2c7d0 69 69 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20  ii, notReady);. 
2c7e0 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74     pWInfo->iCont
2c7f0 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 61  inue = pLevel->a
2c800 64 64 72 43 6f 6e 74 3b 0a 20 20 20 20 69 66 28  ddrCont;.    if(
2c810 20 28 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f   (wsFlags&WHERE_
2c820 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 26 26 20  MULTI_OR)==0 && 
2c830 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52  (wctrlFlags&WHER
2c840 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d  E_OR_SUBCLAUSE)=
2c850 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
2c860 74 65 33 57 68 65 72 65 41 64 64 53 63 61 6e 53  te3WhereAddScanS
2c870 74 61 74 75 73 28 76 2c 20 70 54 61 62 4c 69 73  tatus(v, pTabLis
2c880 74 2c 20 70 4c 65 76 65 6c 2c 20 61 64 64 72 45  t, pLevel, addrE
2c890 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 7d 0a 20  xplain);.    }. 
2c8a0 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20 2a   }..  /* Done. *
2c8b0 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43 6f  /.  VdbeModuleCo
2c8c0 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69 6e  mment((v, "Begin
2c8d0 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a   WHERE-core"));.
2c8e0 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b    return pWInfo;
2c8f0 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
2c900 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
2c910 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72   */.whereBeginEr
2c920 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e 66  ror:.  if( pWInf
2c930 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  o ){.    pParse-
2c940 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57  >nQueryLoop = pW
2c950 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72  Info->savedNQuer
2c960 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72 65  yLoop;.    where
2c970 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49  InfoFree(db, pWI
2c980 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nfo);.  }.  retu
2c990 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
2c9a0 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64 20  enerate the end 
2c9b0 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f  of the WHERE loo
2c9c0 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  p.  See comments
2c9d0 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57   on .** sqlite3W
2c9e0 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20  hereBegin() for 
2c9f0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
2ca00 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  mation..*/.void 
2ca10 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
2ca20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
2ca30 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  o){.  Parse *pPa
2ca40 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
2ca50 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20  arse;.  Vdbe *v 
2ca60 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
2ca70 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72  .  int i;.  Wher
2ca80 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a  eLevel *pLevel;.
2ca90 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
2caa0 6f 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  op;.  SrcList *p
2cab0 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
2cac0 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73 71  ->pTabList;.  sq
2cad0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
2cae0 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65  se->db;..  /* Ge
2caf0 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d  nerate loop term
2cb00 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20  ination code..  
2cb10 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43  */.  VdbeModuleC
2cb20 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64 20  omment((v, "End 
2cb30 57 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a 20  WHERE-core"));. 
2cb40 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
2cb50 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a  eClear(pParse);.
2cb60 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d 3e    for(i=pWInfo->
2cb70 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b 20  nLevel-1; i>=0; 
2cb80 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  i--){.    int ad
2cb90 64 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d  dr;.    pLevel =
2cba0 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a   &pWInfo->a[i];.
2cbb0 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76      pLoop = pLev
2cbc0 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20 20  el->pWLoop;.    
2cbd0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d  if( pLevel->op!=
2cbe0 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 23 69 66 6e 64  OP_Noop ){.#ifnd
2cbf0 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
2cc00 45 5f 53 4b 49 50 41 48 45 41 44 5f 44 49 53 54  E_SKIPAHEAD_DIST
2cc10 49 4e 43 54 0a 20 20 20 20 20 20 69 6e 74 20 61  INCT.      int a
2cc20 64 64 72 53 65 65 6b 20 3d 20 30 3b 0a 20 20 20  ddrSeek = 0;.   
2cc30 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
2cc40 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20        int n;.   
2cc50 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65     if( pWInfo->e
2cc60 44 69 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f  Distinct==WHERE_
2cc70 44 49 53 54 49 4e 43 54 5f 4f 52 44 45 52 45 44  DISTINCT_ORDERED
2cc80 0a 20 20 20 20 20 20 20 26 26 20 28 70 4c 6f 6f  .       && (pLoo
2cc90 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2cca0 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 0a 20  RE_INDEXED)!=0. 
2ccb0 20 20 20 20 20 20 26 26 20 28 70 49 64 78 20 3d        && (pIdx =
2ccc0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
2ccd0 70 49 6e 64 65 78 29 2d 3e 68 61 73 53 74 61 74  pIndex)->hasStat
2cce0 31 0a 20 20 20 20 20 20 20 26 26 20 28 6e 20 3d  1.       && (n =
2ccf0 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
2cd00 6e 49 64 78 43 6f 6c 29 3e 30 0a 20 20 20 20 20  nIdxCol)>0.     
2cd10 20 20 26 26 20 70 49 64 78 2d 3e 61 69 52 6f 77    && pIdx->aiRow
2cd20 4c 6f 67 45 73 74 5b 6e 5d 3e 3d 33 36 0a 20 20  LogEst[n]>=36.  
2cd30 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69      ){.        i
2cd40 6e 74 20 72 31 20 3d 20 70 50 61 72 73 65 2d 3e  nt r1 = pParse->
2cd50 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20 20 20 20  nMem+1;.        
2cd60 69 6e 74 20 6a 2c 20 6f 70 3b 0a 20 20 20 20 20  int j, op;.     
2cd70 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 3b     for(j=0; j<n;
2cd80 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
2cd90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2cda0 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c  p3(v, OP_Column,
2cdb0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
2cdc0 2c 20 6a 2c 20 72 31 2b 6a 29 3b 0a 20 20 20 20  , j, r1+j);.    
2cdd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
2cde0 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 2b  arse->nMem += n+
2cdf0 31 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20  1;.        op = 
2ce00 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 50  pLevel->op==OP_P
2ce10 72 65 76 20 3f 20 4f 50 5f 53 65 65 6b 4c 54 20  rev ? OP_SeekLT 
2ce20 3a 20 4f 50 5f 53 65 65 6b 47 54 3b 0a 20 20 20  : OP_SeekGT;.   
2ce30 20 20 20 20 20 61 64 64 72 53 65 65 6b 20 3d 20       addrSeek = 
2ce40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2ce50 34 49 6e 74 28 76 2c 20 6f 70 2c 20 70 4c 65 76  4Int(v, op, pLev
2ce60 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 30 2c 20  el->iIdxCur, 0, 
2ce70 72 31 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20  r1, n);.        
2ce80 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
2ce90 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 54 29  , op==OP_SeekLT)
2cea0 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f  ;.        VdbeCo
2ceb0 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
2cec0 4f 50 5f 53 65 65 6b 47 54 29 3b 0a 20 20 20 20  OP_SeekGT);.    
2ced0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2cee0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
2cef0 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29  , 1, pLevel->p2)
2cf00 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
2cf10 20 2f 2a 20 53 51 4c 49 54 45 5f 44 49 53 41 42   /* SQLITE_DISAB
2cf20 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f 44 49 53  LE_SKIPAHEAD_DIS
2cf30 54 49 4e 43 54 20 2a 2f 0a 20 20 20 20 20 20 2f  TINCT */.      /
2cf40 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
2cf50 65 3a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68  e: Advance to th
2cf60 65 20 6e 65 78 74 20 72 6f 77 20 2a 2f 0a 20 20  e next row */.  
2cf70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2cf80 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
2cf90 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29  Level->addrCont)
2cfa0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2cfb0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 70 4c 65  dbeAddOp3(v, pLe
2cfc0 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d  vel->op, pLevel-
2cfd0 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 2c  >p1, pLevel->p2,
2cfe0 20 70 4c 65 76 65 6c 2d 3e 70 33 29 3b 0a 20 20   pLevel->p3);.  
2cff0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2d000 68 61 6e 67 65 50 35 28 76 2c 20 70 4c 65 76 65  hangeP5(v, pLeve
2d010 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 20 20 56 64  l->p5);.      Vd
2d020 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2d030 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
2d040 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f  eIf(v, pLevel->o
2d050 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a 20 20 20  p==OP_Next);.   
2d060 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
2d070 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d  f(v, pLevel->op=
2d080 3d 4f 50 5f 50 72 65 76 29 3b 0a 20 20 20 20 20  =OP_Prev);.     
2d090 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
2d0a0 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f  v, pLevel->op==O
2d0b0 50 5f 56 4e 65 78 74 29 3b 0a 23 69 66 6e 64 65  P_VNext);.#ifnde
2d0c0 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  f SQLITE_DISABLE
2d0d0 5f 53 4b 49 50 41 48 45 41 44 5f 44 49 53 54 49  _SKIPAHEAD_DISTI
2d0e0 4e 43 54 0a 20 20 20 20 20 20 69 66 28 20 61 64  NCT.      if( ad
2d0f0 64 72 53 65 65 6b 20 29 20 73 71 6c 69 74 65 33  drSeek ) sqlite3
2d100 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2d110 61 64 64 72 53 65 65 6b 29 3b 0a 23 65 6e 64 69  addrSeek);.#endi
2d120 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
2d130 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
2d140 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
2d150 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b  evel->addrCont);
2d160 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2d170 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2d180 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26  WHERE_IN_ABLE &&
2d190 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
2d1a0 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72  n>0 ){.      str
2d1b0 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b  uct InLoop *pIn;
2d1c0 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
2d1d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
2d1e0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
2d1f0 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b  Level->addrNxt);
2d200 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65  .      for(j=pLe
2d210 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70  vel->u.in.nIn, p
2d220 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  In=&pLevel->u.in
2d230 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a  .aInLoop[j-1]; j
2d240 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b  >0; j--, pIn--){
2d250 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2d260 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
2d270 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31  pIn->addrInTop+1
2d280 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2d290 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 21 3d  In->eEndLoopOp!=
2d2a0 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
2d2b0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2d2c0 41 64 64 4f 70 32 28 76 2c 20 70 49 6e 2d 3e 65  AddOp2(v, pIn->e
2d2d0 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49 6e 2d 3e  EndLoopOp, pIn->
2d2e0 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49  iCur, pIn->addrI
2d2f0 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20  nTop);.         
2d300 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2d310 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
2d320 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 49  CoverageIf(v, pI
2d330 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f  n->eEndLoopOp==O
2d340 50 5f 50 72 65 76 49 66 4f 70 65 6e 29 3b 0a 20  P_PrevIfOpen);. 
2d350 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76           VdbeCov
2d360 65 72 61 67 65 49 66 28 76 2c 20 70 49 6e 2d 3e  erageIf(v, pIn->
2d370 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f 50 5f 4e  eEndLoopOp==OP_N
2d380 65 78 74 49 66 4f 70 65 6e 29 3b 0a 20 20 20 20  extIfOpen);.    
2d390 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
2d3a0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2d3b0 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e  e(v, pIn->addrIn
2d3c0 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  Top-1);.      }.
2d3d0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2d3e0 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
2d3f0 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  l(v, pLevel->add
2d400 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  rBrk);.    if( p
2d410 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 20  Level->addrSkip 
2d420 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2d430 56 64 62 65 47 6f 74 6f 28 76 2c 20 70 4c 65 76  VdbeGoto(v, pLev
2d440 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20  el->addrSkip);. 
2d450 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2d460 28 28 76 2c 20 22 6e 65 78 74 20 73 6b 69 70 2d  ((v, "next skip-
2d470 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20 70 4c 6f  scan on %s", pLo
2d480 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  op->u.btree.pInd
2d490 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20  ex->zName));.   
2d4a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2d4b0 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c  mpHere(v, pLevel
2d4c0 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a 20 20 20  ->addrSkip);.   
2d4d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2d4e0 6d 70 48 65 72 65 28 76 2c 20 70 4c 65 76 65 6c  mpHere(v, pLevel
2d4f0 2d 3e 61 64 64 72 53 6b 69 70 2d 32 29 3b 0a 20  ->addrSkip-2);. 
2d500 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
2d510 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53 4e 54 5f  ITE_LIKE_DOESNT_
2d520 4d 41 54 43 48 5f 42 4c 4f 42 53 0a 20 20 20 20  MATCH_BLOBS.    
2d530 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  if( pLevel->addr
2d540 4c 69 6b 65 52 65 70 20 29 7b 0a 20 20 20 20 20  LikeRep ){.     
2d550 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2d560 70 32 28 76 2c 20 4f 50 5f 44 65 63 72 4a 75 6d  p2(v, OP_DecrJum
2d570 70 5a 65 72 6f 2c 20 28 69 6e 74 29 28 70 4c 65  pZero, (int)(pLe
2d580 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70 43 6e 74  vel->iLikeRepCnt
2d590 72 3e 3e 31 29 2c 0a 20 20 20 20 20 20 20 20 20  r>>1),.         
2d5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2d5b0 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69 6b 65 52  Level->addrLikeR
2d5c0 65 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  ep);.      VdbeC
2d5d0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
2d5e0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
2d5f0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
2d600 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  in ){.      int 
2d610 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c  ws = pLoop->wsFl
2d620 61 67 73 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ags;.      addr 
2d630 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
2d640 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
2d650 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
2d660 69 6e 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  in); VdbeCoverag
2d670 65 28 76 29 3b 0a 20 20 20 20 20 20 61 73 73 65  e(v);.      asse
2d680 72 74 28 20 28 77 73 20 26 20 57 48 45 52 45 5f  rt( (ws & WHERE_
2d690 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20  IDX_ONLY)==0 || 
2d6a0 28 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  (ws & WHERE_INDE
2d6b0 58 45 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  XED)!=0 );.     
2d6c0 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52 45   if( (ws & WHERE
2d6d0 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b  _IDX_ONLY)==0 ){
2d6e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2d6f0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2d700 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69  _NullRow, pTabLi
2d710 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
2d720 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2d730 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52 45   if( (ws & WHERE
2d740 5f 49 4e 44 45 58 45 44 29 20 0a 20 20 20 20 20  _INDEXED) .     
2d750 20 20 7c 7c 20 28 28 77 73 20 26 20 57 48 45 52    || ((ws & WHER
2d760 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 26 26 20 70  E_MULTI_OR) && p
2d770 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76 69 64 78  Level->u.pCovidx
2d780 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
2d790 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2d7a0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
2d7b0 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  Row, pLevel->iId
2d7c0 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xCur);.      }. 
2d7d0 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
2d7e0 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29  >op==OP_Return )
2d7f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2d800 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2d810 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d  P_Gosub, pLevel-
2d820 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  >p1, pLevel->add
2d830 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d  rFirst);.      }
2d840 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
2d850 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
2d860 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72   pLevel->addrFir
2d870 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
2d880 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2d890 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
2d8a0 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65 4d  .    }.    VdbeM
2d8b0 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
2d8c0 20 22 45 6e 64 20 57 48 45 52 45 2d 6c 6f 6f 70   "End WHERE-loop
2d8d0 25 64 3a 20 25 73 22 2c 20 69 2c 0a 20 20 20 20  %d: %s", i,.    
2d8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d8f0 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
2d900 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
2d910 6f 6d 5d 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  om].pTab->zName)
2d920 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
2d930 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69   "break" point i
2d940 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73  s here, just pas
2d950 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2d960 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a   outer loop..  *
2d970 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20  * Set it..  */. 
2d980 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2d990 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e  lveLabel(v, pWIn
2d9a0 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20  fo->iBreak);..  
2d9b0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
2d9c0 6e 4c 65 76 65 6c 3c 3d 70 54 61 62 4c 69 73 74  nLevel<=pTabList
2d9d0 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28  ->nSrc );.  for(
2d9e0 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
2d9f0 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d  fo->a; i<pWInfo-
2da00 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c  >nLevel; i++, pL
2da10 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  evel++){.    int
2da20 20 6b 2c 20 6c 61 73 74 3b 0a 20 20 20 20 56 64   k, last;.    Vd
2da30 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 49  beOp *pOp;.    I
2da40 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a  ndex *pIdx = 0;.
2da50 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
2da60 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
2da70 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
2da80 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
2da90 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
2daa0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
2dab0 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
2dac0 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 70 4c  Tab!=0 );.    pL
2dad0 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
2dae0 4c 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a 20 46 6f  Loop;..    /* Fo
2daf0 72 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 2c 20  r a co-routine, 
2db00 63 68 61 6e 67 65 20 61 6c 6c 20 4f 50 5f 43 6f  change all OP_Co
2db10 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 73 20  lumn references 
2db20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a  to the table of.
2db30 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 2d 72 6f      ** the co-ro
2db40 75 74 69 6e 65 20 69 6e 74 6f 20 4f 50 5f 43 6f  utine into OP_Co
2db50 70 79 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6e  py of result con
2db60 74 61 69 6e 65 64 20 69 6e 20 61 20 72 65 67 69  tained in a regi
2db70 73 74 65 72 2e 0a 20 20 20 20 2a 2a 20 4f 50 5f  ster..    ** OP_
2db80 52 6f 77 69 64 20 62 65 63 6f 6d 65 73 20 4f 50  Rowid becomes OP
2db90 5f 4e 75 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  _Null..    */.  
2dba0 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e    if( pTabItem->
2dbb0 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
2dbc0 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
2dbd0 65 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  e( pParse->db->m
2dbe0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
2dbf0 20 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43 6f       translateCo
2dc00 6c 75 6d 6e 54 6f 43 6f 70 79 28 70 50 61 72 73  lumnToCopy(pPars
2dc10 65 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42  e, pLevel->addrB
2dc20 6f 64 79 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  ody, pLevel->iTa
2dc30 62 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20  bCur,.          
2dc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc50 20 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67 52    pTabItem->regR
2dc60 65 73 75 6c 74 2c 20 30 29 3b 0a 20 20 20 20 20  esult, 0);.     
2dc70 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
2dc80 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
2dc90 20 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e   scan uses an in
2dca0 64 65 78 2c 20 6d 61 6b 65 20 56 44 42 45 20 63  dex, make VDBE c
2dcb0 6f 64 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ode substitution
2dcc0 73 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20  s to read data. 
2dcd0 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69     ** from the i
2dce0 6e 64 65 78 20 69 6e 73 74 65 61 64 20 6f 66 20  ndex instead of 
2dcf0 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 20 77  from the table w
2dd00 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 20 20  here possible.  
2dd10 49 6e 20 73 6f 6d 65 20 63 61 73 65 73 0a 20 20  In some cases.  
2dd20 20 20 2a 2a 20 74 68 69 73 20 6f 70 74 69 6d 69    ** this optimi
2dd30 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e 74 73 20  zation prevents 
2dd40 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 65  the table from e
2dd50 76 65 72 20 62 65 69 6e 67 20 72 65 61 64 2c 20  ver being read, 
2dd60 77 68 69 63 68 20 63 61 6e 0a 20 20 20 20 2a 2a  which can.    **
2dd70 20 79 69 65 6c 64 20 61 20 73 69 67 6e 69 66 69   yield a signifi
2dd80 63 61 6e 74 20 70 65 72 66 6f 72 6d 61 6e 63 65  cant performance
2dd90 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a 2a 20 0a   boost..    ** .
2dda0 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20      ** Calls to 
2ddb0 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
2ddc0 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71  or in between sq
2ddd0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20  lite3WhereBegin 
2dde0 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  and.    ** sqlit
2ddf0 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20  e3WhereEnd will 
2de00 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64  have created cod
2de10 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  e that reference
2de20 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  s the table.    
2de30 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  ** directly.  Th
2de40 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c  is loop scans al
2de50 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b  l that code look
2de60 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a  ing for opcodes.
2de70 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65      ** that refe
2de80 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20  rence the table 
2de90 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65  and converts the
2dea0 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74  m into opcodes t
2deb0 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  hat.    ** refer
2dec0 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a  ence the index..
2ded0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
2dee0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2def0 28 57 48 45 52 45 5f 49 4e 44 45 58 45 44 7c 57  (WHERE_INDEXED|W
2df00 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 20 29  HERE_IDX_ONLY) )
2df10 7b 0a 20 20 20 20 20 20 70 49 64 78 20 3d 20 70  {.      pIdx = p
2df20 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  Loop->u.btree.pI
2df30 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ndex;.    }else 
2df40 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
2df50 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs & WHERE_MULTI
2df60 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 70 49 64  _OR ){.      pId
2df70 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43  x = pLevel->u.pC
2df80 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20  ovidx;.    }.   
2df90 20 69 66 28 20 70 49 64 78 0a 20 20 20 20 20 26   if( pIdx.     &
2dfa0 26 20 28 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50  & (pWInfo->eOneP
2dfb0 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46  ass==ONEPASS_OFF
2dfc0 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 49   || !HasRowid(pI
2dfd0 64 78 2d 3e 70 54 61 62 6c 65 29 29 0a 20 20 20  dx->pTable)).   
2dfe0 20 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63    && !db->malloc
2dff0 46 61 69 6c 65 64 0a 20 20 20 20 29 7b 0a 20 20  Failed.    ){.  
2e000 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74      last = sqlit
2e010 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2e020 72 28 76 29 3b 0a 20 20 20 20 20 20 6b 20 3d 20  r(v);.      k = 
2e030 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79  pLevel->addrBody
2e040 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71  ;.      pOp = sq
2e050 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
2e060 2c 20 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  , k);.      for(
2e070 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70  ; k<last; k++, p
2e080 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  Op++){.        i
2e090 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76  f( pOp->p1!=pLev
2e0a0 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f  el->iTabCur ) co
2e0b0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2e0c0 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
2e0d0 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  =OP_Column ){.  
2e0e0 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20          int x = 
2e0f0 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20  pOp->p2;.       
2e100 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
2e110 3e 70 54 61 62 6c 65 3d 3d 70 54 61 62 20 29 3b  >pTable==pTab );
2e120 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
2e130 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
2e140 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 49 6e  {.            In
2e150 64 65 78 20 2a 70 50 6b 20 3d 20 73 71 6c 69 74  dex *pPk = sqlit
2e160 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65  e3PrimaryKeyInde
2e170 78 28 70 54 61 62 29 3b 0a 20 20 20 20 20 20 20  x(pTab);.       
2e180 20 20 20 20 20 78 20 3d 20 70 50 6b 2d 3e 61 69       x = pPk->ai
2e190 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20 20 20 20 20  Column[x];.     
2e1a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 78         assert( x
2e1b0 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  >=0 );.         
2e1c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 78 20 3d   }.          x =
2e1d0 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 4f 66   sqlite3ColumnOf
2e1e0 49 6e 64 65 78 28 70 49 64 78 2c 20 78 29 3b 0a  Index(pIdx, x);.
2e1f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78 3e            if( x>
2e200 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2e210 20 20 70 4f 70 2d 3e 70 32 20 3d 20 78 3b 0a 20    pOp->p2 = x;. 
2e220 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
2e230 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  p1 = pLevel->iId
2e240 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  xCur;.          
2e250 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  }.          asse
2e260 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c  rt( (pLoop->wsFl
2e270 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
2e280 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78 3e 3d 30  ONLY)==0 || x>=0
2e290 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2e2a0 7c 7c 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50  || pWInfo->eOneP
2e2b0 61 73 73 20 29 3b 0a 20 20 20 20 20 20 20 20 7d  ass );.        }
2e2c0 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70  else if( pOp->op
2e2d0 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29  code==OP_Rowid )
2e2e0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  {.          pOp-
2e2f0 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
2e300 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
2e310 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
2e320 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20  P_IdxRowid;.    
2e330 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
2e340 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 66  p->opcode==OP_If
2e350 4e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20  NullRow ){.     
2e360 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70       pOp->p1 = p
2e370 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
2e380 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e390 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
2e3a0 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a  * Final cleanup.
2e3b0 20 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e    */.  pParse->n
2e3c0 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e  QueryLoop = pWIn
2e3d0 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c  fo->savedNQueryL
2e3e0 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f  oop;.  whereInfo
2e3f0 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
2e400 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a        ;.  return;.}.