/ Hex Artifact Content
Login

Artifact a1c2fde60e806f1e045fdf745bfa449e3be82f55:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61  Int.h"../* Forwa
0360: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f  rd declaration o
0370: 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  f methods */.sta
0380: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
0390: 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 2a  pResize(sqlite3*
03a0: 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e  , WhereLoop*, in
03b0: 74 29 3b 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72  t);../* Test var
03c0: 69 61 62 6c 65 20 74 68 61 74 20 63 61 6e 20 62  iable that can b
03d0: 65 20 73 65 74 20 74 6f 20 65 6e 61 62 6c 65 20  e set to enable 
03e0: 57 48 45 52 45 20 74 72 61 63 69 6e 67 20 2a 2f  WHERE tracing */
03f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0400: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
0410: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
0420: 47 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c  G)./***/ int sql
0430: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
0440: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   0;.#endif.../*.
0450: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 73  ** Return the es
0460: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
0470: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72  f output rows fr
0480: 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  om a WHERE claus
0490: 65 0a 2a 2f 0a 4c 6f 67 45 73 74 20 73 71 6c 69  e.*/.LogEst sqli
04a0: 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
04b0: 77 43 6f 75 6e 74 28 57 68 65 72 65 49 6e 66 6f  wCount(WhereInfo
04c0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
04d0: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  urn pWInfo->nRow
04e0: 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Out;.}../*.** Re
04f0: 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  turn one of the 
0500: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 78  WHERE_DISTINCT_x
0510: 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20 69  xxxx values to i
0520: 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69 73  ndicate how this
0530: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
0540: 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74 73   returns outputs
0550: 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72   for DISTINCT pr
0560: 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  ocessing..*/.int
0570: 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
0580: 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e 66  istinct(WhereInf
0590: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
05a0: 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44 69  turn pWInfo->eDi
05b0: 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  stinct;.}../*.**
05c0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
05d0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
05e0: 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69 6e   returns rows in
05f0: 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 2e   ORDER BY order.
0600: 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
0610: 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 6e   if the output n
0620: 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74 65  eeds to be sorte
0630: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
0640: 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
0650: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
0660: 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  o){.  return pWI
0670: 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a  nfo->nOBSat;.}..
0680: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
0690: 45 20 69 66 20 74 68 65 20 69 6e 6e 65 72 6d 6f  E if the innermo
06a0: 73 74 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 57  st loop of the W
06b0: 48 45 52 45 20 63 6c 61 75 73 65 20 69 6d 70 6c  HERE clause impl
06c0: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 72 65  ementation.** re
06d0: 74 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52  turns rows in OR
06e0: 44 45 52 20 42 59 20 6f 72 64 65 72 20 66 6f 72  DER BY order for
06f0: 20 63 6f 6d 70 6c 65 74 65 20 72 75 6e 20 6f 66   complete run of
0700: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e   the inner loop.
0710: 0a 2a 2a 0a 2a 2a 20 41 63 72 6f 73 73 20 6d 75  .**.** Across mu
0720: 6c 74 69 70 6c 65 20 69 74 65 72 61 74 69 6f 6e  ltiple iteration
0730: 73 20 6f 66 20 6f 75 74 65 72 20 6c 6f 6f 70 73  s of outer loops
0740: 2c 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77  , the output row
0750: 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 0a 2a 2a  s need not be.**
0760: 20 73 6f 72 74 65 64 2e 20 20 41 73 20 6c 6f 6e   sorted.  As lon
0770: 67 20 61 73 20 72 6f 77 73 20 61 72 65 20 73 6f  g as rows are so
0780: 72 74 65 64 20 66 6f 72 20 6a 75 73 74 20 74 68  rted for just th
0790: 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6c 6f 6f 70  e innermost loop
07a0: 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  , this.** routin
07b0: 65 20 63 61 6e 20 72 65 74 75 72 6e 20 54 52 55  e can return TRU
07c0: 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
07d0: 33 57 68 65 72 65 4f 72 64 65 72 65 64 49 6e 6e  3WhereOrderedInn
07e0: 65 72 4c 6f 6f 70 28 57 68 65 72 65 49 6e 66 6f  erLoop(WhereInfo
07f0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0800: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 62 4f 72 64  urn pWInfo->bOrd
0810: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 0a 7d  eredInnerLoop;.}
0820: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0830: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
0840: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
0850: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
0860: 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65  continue.** imme
0870: 64 69 61 74 65 6c 79 20 77 69 74 68 20 74 68 65  diately with the
0880: 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57   next row of a W
0890: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  HERE clause..*/.
08a0: 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
08b0: 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68  ContinueLabel(Wh
08c0: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
08d0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  {.  assert( pWIn
08e0: 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30  fo->iContinue!=0
08f0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49   );.  return pWI
0900: 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a  nfo->iContinue;.
0910: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
0920: 74 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73  the VDBE address
0930: 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d   or label to jum
0940: 70 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f  p to in order to
0950: 20 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66   break.** out of
0960: 20 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a   a WHERE loop..*
0970: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0980: 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65  reBreakLabel(Whe
0990: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
09a0: 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
09b0: 2d 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a  ->iBreak;.}../*.
09c0: 2a 2a 20 52 65 74 75 72 6e 20 4f 4e 45 50 41 53  ** Return ONEPAS
09d0: 53 5f 4f 46 46 20 28 30 29 20 69 66 20 61 6e 20  S_OFF (0) if an 
09e0: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
09f0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75 6e   statement is un
0a00: 61 62 6c 65 20 74 6f 0a 2a 2a 20 6f 70 65 72 61  able to.** opera
0a10: 74 65 20 64 69 72 65 63 74 6c 79 20 6f 6e 20 74  te directly on t
0a20: 68 65 20 72 6f 77 69 73 20 72 65 74 75 72 6e 65  he rowis returne
0a30: 64 20 62 79 20 61 20 57 48 45 52 45 20 63 6c 61  d by a WHERE cla
0a40: 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  use.  Return.** 
0a50: 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 28  ONEPASS_SINGLE (
0a60: 31 29 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  1) if the statem
0a70: 65 6e 74 20 63 61 6e 20 6f 70 65 72 61 74 69 6f  ent can operatio
0a80: 6e 20 64 69 72 65 63 74 6c 79 20 62 65 63 61 75  n directly becau
0a90: 73 65 20 6f 6e 6c 79 0a 2a 2a 20 61 20 73 69 6e  se only.** a sin
0aa0: 67 6c 65 20 72 6f 77 20 69 73 20 74 6f 20 62 65  gle row is to be
0ab0: 20 63 68 61 6e 67 65 64 2e 20 20 52 65 74 75 72   changed.  Retur
0ac0: 6e 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20  n ONEPASS_MULTI 
0ad0: 28 32 29 20 69 66 20 74 68 65 20 6f 6e 65 2d 70  (2) if the one-p
0ae0: 61 73 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  ass.** optimizat
0af0: 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20  ion can be used 
0b00: 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 0a  on multiple .**.
0b10: 2a 2a 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53  ** If the ONEPAS
0b20: 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  S optimization i
0b30: 73 20 75 73 65 64 20 28 69 66 20 74 68 69 73 20  s used (if this 
0b40: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
0b50: 74 72 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c  true).** then al
0b60: 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 64  so write the ind
0b70: 69 63 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72  ices of open cur
0b80: 73 6f 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45  sors used by ONE
0b90: 50 41 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43  PASS.** into aiC
0ba0: 75 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b  ur[0] and aiCur[
0bb0: 31 5d 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65  1].  iaCur[0] ge
0bc0: 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66  ts the cursor of
0bd0: 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62   the data.** tab
0be0: 6c 65 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20  le and iaCur[1] 
0bf0: 67 65 74 73 20 74 68 65 20 63 75 72 73 6f 72 20  gets the cursor 
0c00: 75 73 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c  used by an auxil
0c10: 69 61 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45  iary index..** E
0c20: 69 74 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20  ither value may 
0c30: 62 65 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e  be -1, indicatin
0c40: 67 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 73  g that cursor is
0c50: 20 6e 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e   not used..** An
0c60: 79 20 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e  y cursors return
0c70: 65 64 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  ed will have bee
0c80: 6e 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  n opened for wri
0c90: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75  ting..**.** aiCu
0ca0: 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31  r[0] and aiCur[1
0cb0: 5d 20 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66  ] both get -1 if
0cc0: 20 74 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73   the where-claus
0cd0: 65 20 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e  e logic is.** un
0ce0: 61 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20  able to use the 
0cf0: 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61  ONEPASS optimiza
0d00: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
0d10: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
0d20: 73 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ss(WhereInfo *pW
0d30: 49 6e 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72  Info, int *aiCur
0d40: 29 7b 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75  ){.  memcpy(aiCu
0d50: 72 2c 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  r, pWInfo->aiCur
0d60: 4f 6e 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28  OnePass, sizeof(
0d70: 69 6e 74 29 2a 32 29 3b 0a 23 69 66 64 65 66 20  int)*2);.#ifdef 
0d80: 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
0d90: 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
0da0: 57 68 65 72 65 54 72 61 63 65 20 26 26 20 70 57  WhereTrace && pW
0db0: 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d  Info->eOnePass!=
0dc0: 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20  ONEPASS_OFF ){. 
0dd0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
0de0: 72 69 6e 74 66 28 22 25 73 20 63 75 72 73 6f 72  rintf("%s cursor
0df0: 73 3a 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  s: %d %d\n",.   
0e00: 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f        pWInfo->eO
0e10: 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
0e20: 53 49 4e 47 4c 45 20 3f 20 22 4f 4e 45 50 41 53  SINGLE ? "ONEPAS
0e30: 53 5f 53 49 4e 47 4c 45 22 20 3a 20 22 4f 4e 45  S_SINGLE" : "ONE
0e40: 50 41 53 53 5f 4d 55 4c 54 49 22 2c 0a 20 20 20  PASS_MULTI",.   
0e50: 20 20 20 20 20 20 61 69 43 75 72 5b 30 5d 2c 20        aiCur[0], 
0e60: 61 69 43 75 72 5b 31 5d 29 3b 0a 20 20 7d 0a 23  aiCur[1]);.  }.#
0e70: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70  endif.  return p
0e80: 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3b  WInfo->eOnePass;
0e90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
0ea0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53  he content of pS
0eb0: 72 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f  rc into pDest.*/
0ec0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
0ed0: 72 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72  reOrMove(WhereOr
0ee0: 53 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72  Set *pDest, Wher
0ef0: 65 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20  eOrSet *pSrc){. 
0f00: 20 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63   pDest->n = pSrc
0f10: 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44  ->n;.  memcpy(pD
0f20: 65 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c  est->a, pSrc->a,
0f30: 20 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66   pDest->n*sizeof
0f40: 28 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pDest->a[0]));.
0f50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
0f60: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65  insert a new pre
0f70: 72 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65  requisite/cost e
0f80: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68  ntry into the Wh
0f90: 65 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a  ereOrSet pSet..*
0fa0: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74  *.** The new ent
0fb0: 72 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ry might overwri
0fc0: 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65  te an existing e
0fd0: 6e 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68  ntry, or it migh
0fe0: 74 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64  t be.** appended
0ff0: 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65  , or it might be
1000: 20 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20   discarded.  Do 
1010: 77 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20  whatever is the 
1020: 72 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73  right thing.** s
1030: 6f 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70  o that pSet keep
1040: 73 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20  s the N_OR_COST 
1050: 62 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65  best entries see
1060: 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61  n so far..*/.sta
1070: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49  tic int whereOrI
1080: 6e 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72  nsert(.  WhereOr
1090: 53 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20  Set *pSet,      
10a0: 2f 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65  /* The WhereOrSe
10b0: 74 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  t to be updated 
10c0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
10d0: 72 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  req,        /* P
10e0: 72 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20  rerequisites of 
10f0: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  the new entry */
1100: 0a 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20  .  LogEst rRun, 
1110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e            /* Run
1120: 2d 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77  -cost of the new
1130: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45   entry */.  LogE
1140: 73 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20  st nOut         
1150: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1160: 6f 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20  outputs for the 
1170: 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a  new entry */.){.
1180: 20 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65    u16 i;.  Where
1190: 4f 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72  OrCost *p;.  for
11a0: 28 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53  (i=pSet->n, p=pS
11b0: 65 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  et->a; i>0; i--,
11c0: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72   p++){.    if( r
11d0: 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20  Run<=p->rRun && 
11e0: 28 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65  (prereq & p->pre
11f0: 72 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a  req)==prereq ){.
1200: 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
1210: 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20  OrInsert_done;. 
1220: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
1230: 72 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70  rRun<=rRun && (p
1240: 2d 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65  ->prereq & prere
1250: 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b  q)==p->prereq ){
1260: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1270: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1280: 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f   pSet->n<N_OR_CO
1290: 53 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70  ST ){.    p = &p
12a0: 53 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b  Set->a[pSet->n++
12b0: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d  ];.    p->nOut =
12c0: 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nOut;.  }else{.
12d0: 20 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b      p = pSet->a;
12e0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
12f0: 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  pSet->n; i++){. 
1300: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e       if( p->rRun
1310: 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e  >pSet->a[i].rRun
1320: 20 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b   ) p = pSet->a +
1330: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   i;.    }.    if
1340: 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20  ( p->rRun<=rRun 
1350: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
1360: 77 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f  whereOrInsert_do
1370: 6e 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20  ne:.  p->prereq 
1380: 3d 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72  = prereq;.  p->r
1390: 52 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66  Run = rRun;.  if
13a0: 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29  ( p->nOut>nOut )
13b0: 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b   p->nOut = nOut;
13c0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
13d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
13e0: 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
13f0: 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75   given cursor nu
1400: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20  mber.  Return 0 
1410: 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73  if.** iCursor is
1420: 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e   not in the set.
1430: 0a 2a 2f 0a 42 69 74 6d 61 73 6b 20 73 71 6c 69  .*/.Bitmask sqli
1440: 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
1450: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
1460: 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72  askSet, int iCur
1470: 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  sor){.  int i;. 
1480: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
1490: 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f  t->n<=(int)sizeo
14a0: 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a  f(Bitmask)*8 );.
14b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61    for(i=0; i<pMa
14c0: 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a  skSet->n; i++){.
14d0: 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74      if( pMaskSet
14e0: 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72  ->ix[i]==iCursor
14f0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1500: 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
1510: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1520: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
1530: 74 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f  te a new mask fo
1540: 72 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72  r cursor iCursor
1550: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ..**.** There is
1560: 20 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20   one cursor per 
1570: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
1580: 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e  M clause.  The n
1590: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c  umber of.** tabl
15a0: 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
15b0: 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
15c0: 20 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79   by a test early
15d0: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   in the.** sqlit
15e0: 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72  e3WhereBegin() r
15f0: 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b  outine.  So we k
1600: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61  now that the pMa
1610: 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61  skSet->ix[].** a
1620: 72 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  rray will never 
1630: 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61  overflow..*/.sta
1640: 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d  tic void createM
1650: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
1660: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
1670: 69 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65  iCursor){.  asse
1680: 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20  rt( pMaskSet->n 
1690: 3c 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73  < ArraySize(pMas
16a0: 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70  kSet->ix) );.  p
16b0: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73  MaskSet->ix[pMas
16c0: 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75  kSet->n++] = iCu
16d0: 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rsor;.}../*.** A
16e0: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
16f0: 78 74 20 57 68 65 72 65 54 65 72 6d 20 74 68 61  xt WhereTerm tha
1700: 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72 64  t matches accord
1710: 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74 65  ing to the crite
1720: 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68  ria.** establish
1730: 65 64 20 77 68 65 6e 20 74 68 65 20 70 53 63 61  ed when the pSca
1740: 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e 69  n object was ini
1750: 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65 72  tialized by wher
1760: 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20  eScanInit()..** 
1770: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
1780: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
1790: 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65 54   matching WhereT
17a0: 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erms..*/.static 
17b0: 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65  WhereTerm *where
17c0: 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53 63  ScanNext(WhereSc
17d0: 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69 6e  an *pScan){.  in
17e0: 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
17f0: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1800: 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
1810: 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 31 36  he term */.  i16
1820: 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   iColumn;       
1830: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    /* The column 
1840: 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  on the LHS of th
1850: 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72 20  e term.  -1 for 
1860: 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  IPK */.  Expr *p
1870: 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  X;            /*
1880: 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62   An expression b
1890: 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20  eing tested */. 
18a0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
18b0: 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68 61  C;    /* Shortha
18c0: 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70 57  nd for pScan->pW
18d0: 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  C */.  WhereTerm
18e0: 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 54   *pTerm;    /* T
18f0: 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74 65  he term being te
1900: 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b 20  sted */.  int k 
1910: 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f  = pScan->k;    /
1920: 2a 20 57 68 65 72 65 20 74 6f 20 73 74 61 72 74  * Where to start
1930: 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20   scanning */..  
1940: 77 68 69 6c 65 28 20 70 53 63 61 6e 2d 3e 69 45  while( pScan->iE
1950: 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45 71  quiv<=pScan->nEq
1960: 75 69 76 20 29 7b 0a 20 20 20 20 69 43 75 72 20  uiv ){.    iCur 
1970: 3d 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b 70  = pScan->aiCur[p
1980: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
1990: 0a 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70  .    iColumn = p
19a0: 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 70  Scan->aiColumn[p
19b0: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d 3b  Scan->iEquiv-1];
19c0: 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e  .    if( iColumn
19d0: 3d 3d 58 4e 5f 45 58 50 52 20 26 26 20 70 53 63  ==XN_EXPR && pSc
19e0: 61 6e 2d 3e 70 49 64 78 45 78 70 72 3d 3d 30 20  an->pIdxExpr==0 
19f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1a00: 77 68 69 6c 65 28 20 28 70 57 43 20 3d 20 70 53  while( (pWC = pS
1a10: 63 61 6e 2d 3e 70 57 43 29 21 3d 30 20 29 7b 0a  can->pWC)!=0 ){.
1a20: 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
1a30: 70 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d  pWC->a+k; k<pWC-
1a40: 3e 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65  >nTerm; k++, pTe
1a50: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
1a60: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
1a70: 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20  rsor==iCur.     
1a80: 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e      && pTerm->u.
1a90: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
1aa0: 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20  umn.         && 
1ab0: 28 69 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 45 58 50  (iColumn!=XN_EXP
1ac0: 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  R.             |
1ad0: 7c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  | sqlite3ExprCom
1ae0: 70 61 72 65 28 70 54 65 72 6d 2d 3e 70 45 78 70  pare(pTerm->pExp
1af0: 72 2d 3e 70 4c 65 66 74 2c 70 53 63 61 6e 2d 3e  r->pLeft,pScan->
1b00: 70 49 64 78 45 78 70 72 2c 69 43 75 72 29 3d 3d  pIdxExpr,iCur)==
1b10: 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  0).         && (
1b20: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 3c 3d 31  pScan->iEquiv<=1
1b30: 20 7c 7c 20 21 45 78 70 72 48 61 73 50 72 6f 70   || !ExprHasProp
1b40: 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70  erty(pTerm->pExp
1b50: 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29  r, EP_FromJoin))
1b60: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
1b70: 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
1b80: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1b90: 5f 45 51 55 49 56 29 21 3d 30 0a 20 20 20 20 20  _EQUIV)!=0.     
1ba0: 20 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e        && pScan->
1bb0: 6e 45 71 75 69 76 3c 41 72 72 61 79 53 69 7a 65  nEquiv<ArraySize
1bc0: 28 70 53 63 61 6e 2d 3e 61 69 43 75 72 29 0a 20  (pScan->aiCur). 
1bd0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
1be0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
1bf0: 69 70 43 6f 6c 6c 61 74 65 28 70 54 65 72 6d 2d  ipCollate(pTerm-
1c00: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 29  >pExpr->pRight))
1c10: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a  ->op==TK_COLUMN.
1c20: 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
1c30: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a           int j;.
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
1c50: 6a 3d 30 3b 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45  j=0; j<pScan->nE
1c60: 71 75 69 76 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  quiv; j++){.    
1c70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
1c80: 63 61 6e 2d 3e 61 69 43 75 72 5b 6a 5d 3d 3d 70  can->aiCur[j]==p
1c90: 58 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20  X->iTable.      
1ca0: 20 20 20 20 20 20 20 20 20 26 26 20 70 53 63 61           && pSca
1cb0: 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d  n->aiColumn[j]==
1cc0: 70 58 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20  pX->iColumn ){. 
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1cf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1d10: 20 20 69 66 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e    if( j==pScan->
1d20: 6e 45 71 75 69 76 20 29 7b 0a 20 20 20 20 20 20  nEquiv ){.      
1d30: 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 61          pScan->a
1d40: 69 43 75 72 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54  iCur[j] = pX->iT
1d50: 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20  able;.          
1d60: 20 20 20 20 70 53 63 61 6e 2d 3e 61 69 43 6f 6c      pScan->aiCol
1d70: 75 6d 6e 5b 6a 5d 20 3d 20 70 58 2d 3e 69 43 6f  umn[j] = pX->iCo
1d80: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  lumn;.          
1d90: 20 20 20 20 70 53 63 61 6e 2d 3e 6e 45 71 75 69      pScan->nEqui
1da0: 76 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  v++;.           
1db0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1dc0: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54           if( (pT
1dd0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1de0: 20 70 53 63 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21   pScan->opMask)!
1df0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1e00: 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20    /* Verify the 
1e10: 61 66 66 69 6e 69 74 79 20 61 6e 64 20 63 6f 6c  affinity and col
1e20: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1e30: 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20  match */.       
1e40: 20 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d 3e       if( pScan->
1e50: 7a 43 6f 6c 6c 4e 61 6d 65 20 26 26 20 28 70 54  zCollName && (pT
1e60: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1e70: 20 57 4f 5f 49 53 4e 55 4c 4c 29 3d 3d 30 20 29   WO_ISNULL)==0 )
1e80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1e90: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 61                Pa
1eb0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
1ec0: 43 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  C->pWInfo->pPars
1ed0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
1ee0: 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78   pX = pTerm->pEx
1ef0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr;.            
1f00: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e    if( !sqlite3In
1f10: 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58  dexAffinityOk(pX
1f20: 2c 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 29  , pScan->idxaff)
1f30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f40: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1f70: 72 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20  rt(pX->pLeft);. 
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f               pCo
1f90: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61  ll = sqlite3Bina
1fa0: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
1fb0: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe0: 20 20 20 20 20 20 20 20 20 20 20 70 58 2d 3e 70             pX->p
1ff0: 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74  Left, pX->pRight
2000: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2010: 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
2020: 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
2030: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20  db->pDfltColl;. 
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2050: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2060: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53  pColl->zName, pS
2070: 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20  can->zCollName) 
2080: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2090: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
20a0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
20b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20c0: 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72         if( (pTer
20d0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
20e0: 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 29 21 3d 30  WO_EQ|WO_IS))!=0
20f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
2100: 20 28 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   (pX = pTerm->pE
2110: 78 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70  xpr->pRight)->op
2120: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  ==TK_COLUMN.    
2130: 20 20 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e           && pX->
2140: 69 54 61 62 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61  iTable==pScan->a
2150: 69 43 75 72 5b 30 5d 0a 20 20 20 20 20 20 20 20  iCur[0].        
2160: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 43 6f 6c       && pX->iCol
2170: 75 6d 6e 3d 3d 70 53 63 61 6e 2d 3e 61 69 43 6f  umn==pScan->aiCo
2180: 6c 75 6d 6e 5b 30 5d 0a 20 20 20 20 20 20 20 20  lumn[0].        
2190: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
21a0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
21b0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
21c0: 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20 20  & WO_IS );.     
21d0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
21e0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
21f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63  .            pSc
2200: 61 6e 2d 3e 6b 20 3d 20 6b 2b 31 3b 0a 20 20 20  an->k = k+1;.   
2210: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2220: 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20  pTerm;.         
2230: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2240: 20 20 20 7d 0a 20 20 20 20 20 20 70 53 63 61 6e     }.      pScan
2250: 2d 3e 70 57 43 20 3d 20 70 53 63 61 6e 2d 3e 70  ->pWC = pScan->p
2260: 57 43 2d 3e 70 4f 75 74 65 72 3b 0a 20 20 20 20  WC->pOuter;.    
2270: 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20    k = 0;.    }. 
2280: 20 20 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20     pScan->pWC = 
2290: 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57 43 3b 0a  pScan->pOrigWC;.
22a0: 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20 70      k = 0;.    p
22b0: 53 63 61 6e 2d 3e 69 45 71 75 69 76 2b 2b 3b 0a  Scan->iEquiv++;.
22c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
22d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
22e0: 69 7a 65 20 61 20 57 48 45 52 45 20 63 6c 61 75  ize a WHERE clau
22f0: 73 65 20 73 63 61 6e 6e 65 72 20 6f 62 6a 65 63  se scanner objec
2300: 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  t.  Return a poi
2310: 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 66  nter to the.** f
2320: 69 72 73 74 20 6d 61 74 63 68 2e 20 20 52 65 74  irst match.  Ret
2330: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 72  urn NULL if ther
2340: 65 20 61 72 65 20 6e 6f 20 6d 61 74 63 68 65 73  e are no matches
2350: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 61 6e  ..**.** The scan
2360: 6e 65 72 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ner will be sear
2370: 63 68 69 6e 67 20 74 68 65 20 57 48 45 52 45 20  ching the WHERE 
2380: 63 6c 61 75 73 65 20 70 57 43 2e 20 20 49 74 20  clause pWC.  It 
2390: 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20 66 6f 72  will look.** for
23a0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f   terms of the fo
23b0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
23c0: 3e 22 20 77 68 65 72 65 20 58 20 69 73 20 63 6f  >" where X is co
23d0: 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20  lumn iColumn of 
23e0: 74 61 62 6c 65 0a 2a 2a 20 69 43 75 72 2e 20 20  table.** iCur.  
23f0: 20 4f 72 20 69 66 20 70 49 64 78 21 3d 30 20 74   Or if pIdx!=0 t
2400: 68 65 6e 20 58 20 69 73 20 63 6f 6c 75 6d 6e 20  hen X is column 
2410: 69 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78  iColumn of index
2420: 20 70 49 64 78 2e 20 20 70 49 64 78 0a 2a 2a 20   pIdx.  pIdx.** 
2430: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74  must be one of t
2440: 68 65 20 69 6e 64 65 78 65 73 20 6f 66 20 74 61  he indexes of ta
2450: 62 6c 65 20 69 43 75 72 2e 0a 2a 2a 0a 2a 2a 20  ble iCur..**.** 
2460: 54 68 65 20 3c 6f 70 3e 20 6d 75 73 74 20 62 65  The <op> must be
2470: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65 72   one of the oper
2480: 61 74 6f 72 73 20 64 65 73 63 72 69 62 65 64 20  ators described 
2490: 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a  by opMask..**.**
24a0: 20 49 66 20 74 68 65 20 73 65 61 72 63 68 20 69   If the search i
24b0: 73 20 66 6f 72 20 58 20 61 6e 64 20 74 68 65 20  s for X and the 
24c0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
24d0: 74 61 69 6e 73 20 74 65 72 6d 73 20 6f 66 20 74  tains terms of t
24e0: 68 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d 59 20 74  he.** form X=Y t
24f0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2500: 20 6d 69 67 68 74 20 61 6c 73 6f 20 72 65 74 75   might also retu
2510: 72 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  rn terms of the 
2520: 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f 70 3e 20  form.** "Y <op> 
2530: 3c 65 78 70 72 3e 22 2e 20 20 54 68 65 20 6e 75  <expr>".  The nu
2540: 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 6f  mber of levels o
2550: 66 20 74 72 61 6e 73 69 74 69 76 69 74 79 20 69  f transitivity i
2560: 73 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a 20 62 75  s limited,.** bu
2570: 74 20 69 73 20 65 6e 6f 75 67 68 20 74 6f 20 68  t is enough to h
2580: 61 6e 64 6c 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f  andle most commo
2590: 6e 6c 79 20 6f 63 63 75 72 72 69 6e 67 20 53 51  nly occurring SQ
25a0: 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  L statements..**
25b0: 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e 6f 74 20  .** If X is not 
25c0: 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  the INTEGER PRIM
25d0: 41 52 59 20 4b 45 59 20 74 68 65 6e 20 58 20 6d  ARY KEY then X m
25e0: 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c  ust be compatibl
25f0: 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78 20  e with.** index 
2600: 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pIdx..*/.static 
2610: 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65  WhereTerm *where
2620: 53 63 61 6e 49 6e 69 74 28 0a 20 20 57 68 65 72  ScanInit(.  Wher
2630: 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c 20 20 20  eScan *pScan,   
2640: 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
2650: 53 63 61 6e 20 6f 62 6a 65 63 74 20 62 65 69 6e  Scan object bein
2660: 67 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  g initialized */
2670: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
2680: 70 57 43 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pWC,       /* Th
2690: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
26a0: 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  o be scanned */.
26b0: 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20    int iCur,     
26c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
26d0: 73 6f 72 20 74 6f 20 73 63 61 6e 20 66 6f 72 20  sor to scan for 
26e0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
26f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2700: 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61 6e 20 66  Column to scan f
2710: 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f 70 4d 61  or */.  u32 opMa
2720: 73 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sk,             
2730: 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73 29 20 74  /* Operator(s) t
2740: 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f 0a 20 20  o scan for */.  
2750: 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20 20  Index *pIdx     
2760: 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20          /* Must 
2770: 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  be compatible wi
2780: 74 68 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f  th this index */
2790: 0a 29 7b 0a 20 20 69 6e 74 20 6a 20 3d 20 30 3b  .){.  int j = 0;
27a0: 0a 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 53  ..  /* memset(pS
27b0: 63 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  can, 0, sizeof(*
27c0: 70 53 63 61 6e 29 29 3b 20 2a 2f 0a 20 20 70 53  pScan)); */.  pS
27d0: 63 61 6e 2d 3e 70 4f 72 69 67 57 43 20 3d 20 70  can->pOrigWC = p
27e0: 57 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 57 43  WC;.  pScan->pWC
27f0: 20 3d 20 70 57 43 3b 0a 20 20 70 53 63 61 6e 2d   = pWC;.  pScan-
2800: 3e 70 49 64 78 45 78 70 72 20 3d 20 30 3b 0a 20  >pIdxExpr = 0;. 
2810: 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20   if( pIdx ){.   
2820: 20 6a 20 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20   j = iColumn;.  
2830: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78    iColumn = pIdx
2840: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
2850: 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d     if( iColumn==
2860: 58 4e 5f 45 58 50 52 20 29 20 70 53 63 61 6e 2d  XN_EXPR ) pScan-
2870: 3e 70 49 64 78 45 78 70 72 20 3d 20 70 49 64 78  >pIdxExpr = pIdx
2880: 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d  ->aColExpr->a[j]
2890: 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  .pExpr;.    if( 
28a0: 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 70  iColumn==pIdx->p
28b0: 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69  Table->iPKey ) i
28c0: 43 6f 6c 75 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49  Column = XN_ROWI
28d0: 44 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64  D;.  }.  if( pId
28e0: 78 20 26 26 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20  x && iColumn>=0 
28f0: 29 7b 0a 20 20 20 20 70 53 63 61 6e 2d 3e 69 64  ){.    pScan->id
2900: 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61  xaff = pIdx->pTa
2910: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d  ble->aCol[iColum
2920: 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  n].affinity;.   
2930: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
2940: 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  e = pIdx->azColl
2950: 5b 6a 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  [j];.  }else{.  
2960: 20 20 70 53 63 61 6e 2d 3e 69 64 78 61 66 66 20    pScan->idxaff 
2970: 3d 20 30 3b 0a 20 20 20 20 70 53 63 61 6e 2d 3e  = 0;.    pScan->
2980: 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20  zCollName = 0;. 
2990: 20 7d 0a 20 20 70 53 63 61 6e 2d 3e 6f 70 4d 61   }.  pScan->opMa
29a0: 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b 0a 20 20 70  sk = opMask;.  p
29b0: 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b 0a 20 20 70  Scan->k = 0;.  p
29c0: 53 63 61 6e 2d 3e 61 69 43 75 72 5b 30 5d 20 3d  Scan->aiCur[0] =
29d0: 20 69 43 75 72 3b 0a 20 20 70 53 63 61 6e 2d 3e   iCur;.  pScan->
29e0: 61 69 43 6f 6c 75 6d 6e 5b 30 5d 20 3d 20 69 43  aiColumn[0] = iC
29f0: 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63 61 6e 2d 3e  olumn;.  pScan->
2a00: 6e 45 71 75 69 76 20 3d 20 31 3b 0a 20 20 70 53  nEquiv = 1;.  pS
2a10: 63 61 6e 2d 3e 69 45 71 75 69 76 20 3d 20 31 3b  can->iEquiv = 1;
2a20: 0a 20 20 72 65 74 75 72 6e 20 77 68 65 72 65 53  .  return whereS
2a30: 63 61 6e 4e 65 78 74 28 70 53 63 61 6e 29 3b 0a  canNext(pScan);.
2a40: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  }../*.** Search 
2a50: 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68  for a term in th
2a60: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
2a70: 68 61 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  hat is of the fo
2a80: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
2a90: 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73  >".** where X is
2aa0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
2ab0: 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74  the iColumn of t
2ac0: 61 62 6c 65 20 69 43 75 72 20 6f 72 20 6f 66 20  able iCur or of 
2ad0: 69 6e 64 65 78 20 70 49 64 78 0a 2a 2a 20 69 66  index pIdx.** if
2ae0: 20 70 49 64 78 21 3d 30 20 61 6e 64 20 3c 6f 70   pIdx!=0 and <op
2af0: 3e 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  > is one of the 
2b00: 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 63  WO_xx operator c
2b10: 6f 64 65 73 20 73 70 65 63 69 66 69 65 64 20 62  odes specified b
2b20: 79 0a 2a 2a 20 74 68 65 20 6f 70 20 70 61 72 61  y.** the op para
2b30: 6d 65 74 65 72 2e 20 20 52 65 74 75 72 6e 20 61  meter.  Return a
2b40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2b50: 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30 20  term.  Return 0 
2b60: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a  if not found..**
2b70: 0a 2a 2a 20 49 66 20 70 49 64 78 21 3d 30 20 74  .** If pIdx!=0 t
2b80: 68 65 6e 20 69 74 20 6d 75 73 74 20 62 65 20 6f  hen it must be o
2b90: 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 65  ne of the indexe
2ba0: 73 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72 2e  s of table iCur.
2bb0: 20 20 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72    .** Search for
2bc0: 20 74 65 72 6d 73 20 6d 61 74 63 68 69 6e 67 20   terms matching 
2bd0: 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63  the iColumn-th c
2be0: 6f 6c 75 6d 6e 20 6f 66 20 70 49 64 78 0a 2a 2a  olumn of pIdx.**
2bf0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 74 68 65   rather than the
2c00: 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75   iColumn-th colu
2c10: 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43 75 72  mn of table iCur
2c20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d  ..**.** The term
2c30: 20 72 65 74 75 72 6e 65 64 20 6d 69 67 68 74 20   returned might 
2c40: 62 79 20 59 3d 3c 65 78 70 72 3e 20 69 66 20 74  by Y=<expr> if t
2c50: 68 65 72 65 20 69 73 20 61 6e 6f 74 68 65 72 20  here is another 
2c60: 63 6f 6e 73 74 72 61 69 6e 74 20 69 6e 0a 2a 2a  constraint in.**
2c70: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2c80: 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65 73  e that specifies
2c90: 20 74 68 61 74 20 58 3d 59 2e 20 20 41 6e 79 20   that X=Y.  Any 
2ca0: 73 75 63 68 20 63 6f 6e 73 74 72 61 69 6e 74 73  such constraints
2cb0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 64 65 6e   will be.** iden
2cc0: 74 69 66 69 65 64 20 62 79 20 74 68 65 20 57 4f  tified by the WO
2cd0: 5f 45 51 55 49 56 20 62 69 74 20 69 6e 20 74 68  _EQUIV bit in th
2ce0: 65 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  e pTerm->eOperat
2cf0: 6f 72 20 66 69 65 6c 64 2e 20 20 54 68 65 0a 2a  or field.  The.*
2d00: 2a 20 61 69 43 75 72 5b 5d 2f 69 61 43 6f 6c 75  * aiCur[]/iaColu
2d10: 6d 6e 5b 5d 20 61 72 72 61 79 73 20 68 6f 6c 64  mn[] arrays hold
2d20: 20 58 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 65   X and all its e
2d30: 71 75 69 76 61 6c 65 6e 74 73 2e 20 54 68 65 72  quivalents. Ther
2d40: 65 20 61 72 65 20 31 31 0a 2a 2a 20 73 6c 6f 74  e are 11.** slot
2d50: 73 20 69 6e 20 61 69 43 75 72 5b 5d 2f 61 69 43  s in aiCur[]/aiC
2d60: 6f 6c 75 6d 6e 5b 5d 20 73 6f 20 74 68 61 74 20  olumn[] so that 
2d70: 6d 65 61 6e 73 20 77 65 20 63 61 6e 20 6c 6f 6f  means we can loo
2d80: 6b 20 66 6f 72 20 58 20 70 6c 75 73 20 75 70 20  k for X plus up 
2d90: 74 6f 20 31 30 0a 2a 2a 20 6f 74 68 65 72 20 65  to 10.** other e
2da0: 71 75 69 76 61 6c 65 6e 74 20 76 61 6c 75 65 73  quivalent values
2db0: 2e 20 20 48 65 6e 63 65 20 61 20 73 65 61 72 63  .  Hence a searc
2dc0: 68 20 66 6f 72 20 58 20 77 69 6c 6c 20 72 65 74  h for X will ret
2dd0: 75 72 6e 20 3c 65 78 70 72 3e 20 69 66 20 58 3d  urn <expr> if X=
2de0: 41 31 0a 2a 2a 20 61 6e 64 20 41 31 3d 41 32 20  A1.** and A1=A2 
2df0: 61 6e 64 20 41 32 3d 41 33 20 61 6e 64 20 2e 2e  and A2=A3 and ..
2e00: 2e 20 61 6e 64 20 41 39 3d 41 31 30 20 61 6e 64  . and A9=A10 and
2e10: 20 41 31 30 3d 3c 65 78 70 72 3e 2e 0a 2a 2a 0a   A10=<expr>..**.
2e20: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
2e30: 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20 69  multiple terms i
2e40: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
2e50: 73 65 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  se of the form "
2e60: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a  X <op> <expr>".*
2e70: 2a 20 74 68 65 6e 20 74 72 79 20 66 6f 72 20 74  * then try for t
2e80: 68 65 20 6f 6e 65 20 77 69 74 68 20 6e 6f 20 64  he one with no d
2e90: 65 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 3c  ependencies on <
2ea0: 65 78 70 72 3e 20 2d 20 69 6e 20 6f 74 68 65 72  expr> - in other
2eb0: 20 77 6f 72 64 73 20 77 68 65 72 65 0a 2a 2a 20   words where.** 
2ec0: 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6e 73  <expr> is a cons
2ed0: 74 61 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 20  tant expression 
2ee0: 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 4f  of some kind.  O
2ef0: 6e 6c 79 20 72 65 74 75 72 6e 20 65 6e 74 72 69  nly return entri
2f00: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72  es of.** the for
2f10: 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68 65  m "X <op> Y" whe
2f20: 72 65 20 59 20 69 73 20 61 20 63 6f 6c 75 6d 6e  re Y is a column
2f30: 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   in another tabl
2f40: 65 20 69 66 20 6e 6f 20 74 65 72 6d 73 20 6f 66  e if no terms of
2f50: 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20  .** the form "X 
2f60: 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d 65 78 70 72  <op> <const-expr
2f70: 3e 22 20 65 78 69 73 74 2e 20 20 20 49 66 20 6e  >" exist.   If n
2f80: 6f 20 74 65 72 6d 73 20 77 69 74 68 20 61 20 63  o terms with a c
2f90: 6f 6e 73 74 61 6e 74 20 52 48 53 0a 2a 2a 20 65  onstant RHS.** e
2fa0: 78 69 73 74 2c 20 74 72 79 20 74 6f 20 72 65 74  xist, try to ret
2fb0: 75 72 6e 20 61 20 74 65 72 6d 20 74 68 61 74 20  urn a term that 
2fc0: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 57 4f 5f  does not use WO_
2fd0: 45 51 55 49 56 2e 0a 2a 2f 0a 57 68 65 72 65 54  EQUIV..*/.WhereT
2fe0: 65 72 6d 20 2a 73 71 6c 69 74 65 33 57 68 65 72  erm *sqlite3Wher
2ff0: 65 46 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65  eFindTerm(.  Whe
3000: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
3010: 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
3020: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 73 65 61  clause to be sea
3030: 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  rched */.  int i
3040: 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
3050: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
3060: 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e  r of LHS */.  in
3070: 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20  t iColumn,      
3080: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75      /* Column nu
3090: 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20  mber of LHS */. 
30a0: 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
30b0: 79 2c 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75  y,     /* RHS mu
30c0: 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77  st not overlap w
30d0: 69 74 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f  ith this mask */
30e0: 0a 20 20 75 33 32 20 6f 70 2c 20 20 20 20 20 20  .  u32 op,      
30f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
3100: 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73   of WO_xx values
3110: 20 64 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72   describing oper
3120: 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20  ator */.  Index 
3130: 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 20 20  *pIdx           
3140: 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61  /* Must be compa
3150: 74 69 62 6c 65 20 77 69 74 68 20 74 68 69 73 20  tible with this 
3160: 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55  index, if not NU
3170: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  LL */.){.  Where
3180: 54 65 72 6d 20 2a 70 52 65 73 75 6c 74 20 3d 20  Term *pResult = 
3190: 30 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  0;.  WhereTerm *
31a0: 70 3b 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73  p;.  WhereScan s
31b0: 63 61 6e 3b 0a 0a 20 20 70 20 3d 20 77 68 65 72  can;..  p = wher
31c0: 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e 2c  eScanInit(&scan,
31d0: 20 70 57 43 2c 20 69 43 75 72 2c 20 69 43 6f 6c   pWC, iCur, iCol
31e0: 75 6d 6e 2c 20 6f 70 2c 20 70 49 64 78 29 3b 0a  umn, op, pIdx);.
31f0: 20 20 6f 70 20 26 3d 20 57 4f 5f 45 51 7c 57 4f    op &= WO_EQ|WO
3200: 5f 49 53 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  _IS;.  while( p 
3210: 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70  ){.    if( (p->p
3220: 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74  rereqRight & not
3230: 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20  Ready)==0 ){.   
3240: 20 20 20 69 66 28 20 70 2d 3e 70 72 65 72 65 71     if( p->prereq
3250: 52 69 67 68 74 3d 3d 30 20 26 26 20 28 70 2d 3e  Right==0 && (p->
3260: 65 4f 70 65 72 61 74 6f 72 26 6f 70 29 21 3d 30  eOperator&op)!=0
3270: 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
3280: 63 61 73 65 28 20 70 2d 3e 65 4f 70 65 72 61 74  case( p->eOperat
3290: 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  or & WO_IS );.  
32a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a        return p;.
32b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
32c0: 28 20 70 52 65 73 75 6c 74 3d 3d 30 20 29 20 70  ( pResult==0 ) p
32d0: 52 65 73 75 6c 74 20 3d 20 70 3b 0a 20 20 20 20  Result = p;.    
32e0: 7d 0a 20 20 20 20 70 20 3d 20 77 68 65 72 65 53  }.    p = whereS
32f0: 63 61 6e 4e 65 78 74 28 26 73 63 61 6e 29 3b 0a  canNext(&scan);.
3300: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52 65    }.  return pRe
3310: 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  sult;.}../*.** T
3320: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 61  his function sea
3330: 72 63 68 65 73 20 70 4c 69 73 74 20 66 6f 72 20  rches pList for 
3340: 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61  an entry that ma
3350: 74 63 68 65 73 20 74 68 65 20 69 43 6f 6c 2d 74  tches the iCol-t
3360: 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 69  h column.** of i
3370: 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a  ndex pIdx..**.**
3380: 20 49 66 20 73 75 63 68 20 61 6e 20 65 78 70 72   If such an expr
3390: 65 73 73 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c  ession is found,
33a0: 20 69 74 73 20 69 6e 64 65 78 20 69 6e 20 70 4c   its index in pL
33b0: 69 73 74 2d 3e 61 5b 5d 20 69 73 20 72 65 74 75  ist->a[] is retu
33c0: 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 6e 6f 20 65  rned. If.** no e
33d0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f 75  xpression is fou
33e0: 6e 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  nd, -1 is return
33f0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
3400: 74 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 0a  t findIndexCol(.
3410: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3430: 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65    /* Parse conte
3440: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
3450: 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20   *pList,        
3460: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
3470: 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 73 65  ssion list to se
3480: 61 72 63 68 20 2a 2f 0a 20 20 69 6e 74 20 69 42  arch */.  int iB
3490: 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ase,            
34a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
34b0: 73 6f 72 20 66 6f 72 20 74 61 62 6c 65 20 61 73  sor for table as
34c0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49  sociated with pI
34d0: 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  dx */.  Index *p
34e0: 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
34f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
3500: 20 74 6f 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e   to match column
3510: 20 6f 66 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f   of */.  int iCo
3520: 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
3530: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
3540: 6d 6e 20 6f 66 20 69 6e 64 65 78 20 74 6f 20 6d  mn of index to m
3550: 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  atch */.){.  int
3560: 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
3570: 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e   *zColl = pIdx->
3580: 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d 3b 0a 0a 20  azColl[iCol];.. 
3590: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
35a0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
35b0: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
35c0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
35d0: 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  late(pList->a[i]
35e0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
35f0: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
3600: 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f  N.     && p->iCo
3610: 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  lumn==pIdx->aiCo
3620: 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20 20 20  lumn[iCol].     
3630: 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42  && p->iTable==iB
3640: 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ase.    ){.     
3650: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20   CollSeq *pColl 
3660: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
3670: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69  lSeq(pParse, pLi
3680: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
3690: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  .      if( pColl
36a0: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
36b0: 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
36c0: 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  me, zColl) ){.  
36d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 3b 0a        return i;.
36e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
36f0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  }..  return -1;.
3700: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3710: 54 52 55 45 20 69 66 20 74 68 65 20 69 43 6f 6c  TRUE if the iCol
3720: 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e  -th column of in
3730: 64 65 78 20 70 49 64 78 20 69 73 20 4e 4f 54 20  dex pIdx is NOT 
3740: 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69  NULL.*/.static i
3750: 6e 74 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f  nt indexColumnNo
3760: 74 4e 75 6c 6c 28 49 6e 64 65 78 20 2a 70 49 64  tNull(Index *pId
3770: 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  x, int iCol){.  
3780: 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28  int j;.  assert(
3790: 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 61 73   pIdx!=0 );.  as
37a0: 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26  sert( iCol>=0 &&
37b0: 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 43 6f 6c   iCol<pIdx->nCol
37c0: 75 6d 6e 20 29 3b 0a 20 20 6a 20 3d 20 70 49 64  umn );.  j = pId
37d0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c  x->aiColumn[iCol
37e0: 5d 3b 0a 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b  ];.  if( j>=0 ){
37f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 70 49 64 78  .    return pIdx
3800: 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 6a  ->pTable->aCol[j
3810: 5d 2e 6e 6f 74 4e 75 6c 6c 3b 0a 20 20 7d 65 6c  ].notNull;.  }el
3820: 73 65 20 69 66 28 20 6a 3d 3d 28 2d 31 29 20 29  se if( j==(-1) )
3830: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
3840: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
3850: 65 72 74 28 20 6a 3d 3d 28 2d 32 29 20 29 3b 0a  ert( j==(-2) );.
3860: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
3870: 2a 20 41 73 73 75 6d 65 20 61 6e 20 69 6e 64 65  * Assume an inde
3880: 78 65 64 20 65 78 70 72 65 73 73 69 6f 6e 20 63  xed expression c
3890: 61 6e 20 61 6c 77 61 79 73 20 79 69 65 6c 64 20  an always yield 
38a0: 61 20 4e 55 4c 4c 20 2a 2f 0a 0a 20 20 7d 0a 7d  a NULL */..  }.}
38b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
38c0: 72 75 65 20 69 66 20 74 68 65 20 44 49 53 54 49  rue if the DISTI
38d0: 4e 43 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c  NCT expression-l
38e0: 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ist passed as th
38f0: 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
3900: 0a 2a 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74  .** is redundant
3910: 2e 0a 2a 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e  ..**.** A DISTIN
3920: 43 54 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e  CT list is redun
3930: 64 61 6e 74 20 69 66 20 61 6e 79 20 73 75 62 73  dant if any subs
3940: 65 74 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  et of the column
3950: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 44 49 53 54  s in the.** DIST
3960: 49 4e 43 54 20 6c 69 73 74 20 61 72 65 20 63 6f  INCT list are co
3970: 6c 6c 65 63 74 69 76 65 6c 79 20 75 6e 69 71 75  llectively uniqu
3980: 65 20 61 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  e and individual
3990: 6c 79 20 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a  ly non-null..*/.
39a0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 44 69 73  static int isDis
39b0: 74 69 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 0a  tinctRedundant(.
39c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
39e0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
39f0: 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61  /.  SrcList *pTa
3a00: 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a  bList,        /*
3a10: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
3a20: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
3a30: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
3a40: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
3a50: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
3a60: 74 20 2a 70 44 69 73 74 69 6e 63 74 20 20 20 20  t *pDistinct    
3a70: 20 20 20 2f 2a 20 54 68 65 20 72 65 73 75 6c 74     /* The result
3a80: 20 73 65 74 20 74 68 61 74 20 6e 65 65 64 73 20   set that needs 
3a90: 74 6f 20 62 65 20 44 49 53 54 49 4e 43 54 20 2a  to be DISTINCT *
3aa0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
3ab0: 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64  ab;.  Index *pId
3ac0: 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  x;.  int i;     
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ae0: 20 20 20 20 20 0a 20 20 69 6e 74 20 69 42 61 73       .  int iBas
3af0: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  e;..  /* If ther
3b00: 65 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f  e is more than o
3b10: 6e 65 20 74 61 62 6c 65 20 6f 72 20 73 75 62 2d  ne table or sub-
3b20: 73 65 6c 65 63 74 20 69 6e 20 74 68 65 20 46 52  select in the FR
3b30: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a  OM clause of.  *
3b40: 2a 20 74 68 69 73 20 71 75 65 72 79 2c 20 74 68  * this query, th
3b50: 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  en it will not b
3b60: 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 73 68  e possible to sh
3b70: 6f 77 20 74 68 61 74 20 74 68 65 20 44 49 53 54  ow that the DIST
3b80: 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73  INCT .  ** claus
3b90: 65 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20  e is redundant. 
3ba0: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73  */.  if( pTabLis
3bb0: 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72 65 74  t->nSrc!=1 ) ret
3bc0: 75 72 6e 20 30 3b 0a 20 20 69 42 61 73 65 20 3d  urn 0;.  iBase =
3bd0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
3be0: 69 43 75 72 73 6f 72 3b 0a 20 20 70 54 61 62 20  iCursor;.  pTab 
3bf0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d  = pTabList->a[0]
3c00: 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20  .pTab;..  /* If 
3c10: 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72 65  any of the expre
3c20: 73 73 69 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b  ssions is an IPK
3c30: 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65   column on table
3c40: 20 69 42 61 73 65 2c 20 74 68 65 6e 20 72 65 74   iBase, then ret
3c50: 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20  urn .  ** true. 
3c60: 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e 69 54  Note: The (p->iT
3c70: 61 62 6c 65 3d 3d 69 42 61 73 65 29 20 70 61 72  able==iBase) par
3c80: 74 20 6f 66 20 74 68 69 73 20 74 65 73 74 20 6d  t of this test m
3c90: 61 79 20 62 65 20 66 61 6c 73 65 20 69 66 20 74  ay be false if t
3ca0: 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
3cb0: 53 45 4c 45 43 54 20 69 73 20 61 20 63 6f 72 72  SELECT is a corr
3cc0: 65 6c 61 74 65 64 20 73 75 62 2d 71 75 65 72 79  elated sub-query
3cd0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
3ce0: 3b 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e  ; i<pDistinct->n
3cf0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
3d00: 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  Expr *p = sqlite
3d10: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
3d20: 28 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d  (pDistinct->a[i]
3d30: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
3d40: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
3d50: 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d  N && p->iTable==
3d60: 69 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c  iBase && p->iCol
3d70: 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31  umn<0 ) return 1
3d80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70  ;.  }..  /* Loop
3d90: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64   through all ind
3da0: 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
3db0: 65 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68  e, checking each
3dc0: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61   to see if it ma
3dd0: 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53  kes.  ** the DIS
3de0: 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20  TINCT qualifier 
3df0: 72 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f  redundant. It do
3e00: 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20  es so if:.  **. 
3e10: 20 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64   **   1. The ind
3e20: 65 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49  ex is itself UNI
3e30: 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20  QUE, and.  **.  
3e40: 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74  **   2. All of t
3e50: 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  he columns in th
3e60: 65 20 69 6e 64 65 78 20 61 72 65 20 65 69 74 68  e index are eith
3e70: 65 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 70  er part of the p
3e80: 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20  Distinct.  **   
3e90: 20 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65     list, or else
3ea0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3eb0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72  e contains a ter
3ec0: 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63  m of the form "c
3ed0: 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20  ol=X",.  **     
3ee0: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f   where X is a co
3ef0: 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68  nstant value. Th
3f00: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
3f10: 65 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a  ences of the.  *
3f20: 2a 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f  *      compariso
3f30: 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73  n and select-lis
3f40: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75  t expressions mu
3f50: 73 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f  st match those o
3f60: 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a  f the index..  *
3f70: 2a 0a 20 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20  *.  **   3. All 
3f80: 6f 66 20 74 68 6f 73 65 20 69 6e 64 65 78 20 63  of those index c
3f90: 6f 6c 75 6d 6e 73 20 66 6f 72 20 77 68 69 63 68  olumns for which
3fa0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3fb0: 65 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20  e does not.  ** 
3fc0: 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 61 20 22       contain a "
3fd0: 63 6f 6c 3d 58 22 20 74 65 72 6d 20 61 72 65 20  col=X" term are 
3fe0: 73 75 62 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54  subject to a NOT
3ff0: 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
4000: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64  ..  */.  for(pId
4010: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
4020: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
4030: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
4040: 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28   !IsUniqueIndex(
4050: 70 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65  pIdx) ) continue
4060: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
4070: 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20  <pIdx->nKeyCol; 
4080: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
4090: 30 3d 3d 73 71 6c 69 74 65 33 57 68 65 72 65 46  0==sqlite3WhereF
40a0: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61  indTerm(pWC, iBa
40b0: 73 65 2c 20 69 2c 20 7e 28 42 69 74 6d 61 73 6b  se, i, ~(Bitmask
40c0: 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64 78 29  )0, WO_EQ, pIdx)
40d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
40e0: 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50 61  findIndexCol(pPa
40f0: 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c 20  rse, pDistinct, 
4100: 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29 3c  iBase, pIdx, i)<
4110: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
4120: 20 20 20 69 66 28 20 69 6e 64 65 78 43 6f 6c 75     if( indexColu
4130: 6d 6e 4e 6f 74 4e 75 6c 6c 28 70 49 64 78 2c 20  mnNotNull(pIdx, 
4140: 69 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  i)==0 ) break;. 
4150: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4160: 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 4b   if( i==pIdx->nK
4170: 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 2f  eyCol ){.      /
4180: 2a 20 54 68 69 73 20 69 6e 64 65 78 20 69 6d 70  * This index imp
4190: 6c 69 65 73 20 74 68 61 74 20 74 68 65 20 44 49  lies that the DI
41a0: 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72  STINCT qualifier
41b0: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a   is redundant. *
41c0: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  /.      return 1
41d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
41e0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  eturn 0;.}.../*.
41f0: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
4200: 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65  logarithm of the
4210: 20 69 6e 70 75 74 20 76 61 6c 75 65 20 74 6f 20   input value to 
4220: 62 61 73 65 20 32 2e 0a 2a 2f 0a 73 74 61 74 69  base 2..*/.stati
4230: 63 20 4c 6f 67 45 73 74 20 65 73 74 4c 6f 67 28  c LogEst estLog(
4240: 4c 6f 67 45 73 74 20 4e 29 7b 0a 20 20 72 65 74  LogEst N){.  ret
4250: 75 72 6e 20 4e 3c 3d 31 30 20 3f 20 30 20 3a 20  urn N<=10 ? 0 : 
4260: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 4e 29  sqlite3LogEst(N)
4270: 20 2d 20 33 33 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   - 33;.}../*.** 
4280: 43 6f 6e 76 65 72 74 20 4f 50 5f 43 6f 6c 75 6d  Convert OP_Colum
4290: 6e 20 6f 70 63 6f 64 65 73 20 74 6f 20 4f 50 5f  n opcodes to OP_
42a0: 43 6f 70 79 20 69 6e 20 70 72 65 76 69 6f 75 73  Copy in previous
42b0: 6c 79 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64  ly generated cod
42c0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
42d0: 75 74 69 6e 65 20 72 75 6e 73 20 6f 76 65 72 20  utine runs over 
42e0: 67 65 6e 65 72 61 74 65 64 20 56 44 42 45 20 63  generated VDBE c
42f0: 6f 64 65 20 61 6e 64 20 74 72 61 6e 73 6c 61 74  ode and translat
4300: 65 73 20 4f 50 5f 43 6f 6c 75 6d 6e 0a 2a 2a 20  es OP_Column.** 
4310: 6f 70 63 6f 64 65 73 20 69 6e 74 6f 20 4f 50 5f  opcodes into OP_
4320: 43 6f 70 79 20 77 68 65 6e 20 74 68 65 20 74 61  Copy when the ta
4330: 62 6c 65 20 69 73 20 62 65 69 6e 67 20 61 63 63  ble is being acc
4340: 65 73 73 65 64 20 76 69 61 20 63 6f 2d 72 6f 75  essed via co-rou
4350: 74 69 6e 65 20 0a 2a 2a 20 69 6e 73 74 65 61 64  tine .** instead
4360: 20 6f 66 20 76 69 61 20 74 61 62 6c 65 20 6c 6f   of via table lo
4370: 6f 6b 75 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  okup..**.** If t
4380: 68 65 20 62 49 6e 63 72 52 6f 77 69 64 20 70 61  he bIncrRowid pa
4390: 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68  rameter is 0, th
43a0: 65 6e 20 61 6e 79 20 4f 50 5f 52 6f 77 69 64 20  en any OP_Rowid 
43b0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 6f 6e 0a  instructions on.
43c0: 2a 2a 20 63 75 72 73 6f 72 20 69 54 61 62 43 75  ** cursor iTabCu
43d0: 72 20 61 72 65 20 74 72 61 6e 73 66 6f 72 6d 65  r are transforme
43e0: 64 20 69 6e 74 6f 20 4f 50 5f 4e 75 6c 6c 2e 20  d into OP_Null. 
43f0: 4f 72 2c 20 69 66 20 62 49 6e 63 72 52 6f 77 69  Or, if bIncrRowi
4400: 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0a 2a  d is non-zero,.*
4410: 2a 20 74 68 65 6e 20 65 61 63 68 20 4f 50 5f 52  * then each OP_R
4420: 6f 77 69 64 20 69 73 20 74 72 61 6e 73 66 6f 72  owid is transfor
4430: 6d 65 64 20 69 6e 74 6f 20 61 6e 20 69 6e 73 74  med into an inst
4440: 72 75 63 74 69 6f 6e 20 74 6f 20 69 6e 63 72 65  ruction to incre
4450: 6d 65 6e 74 20 74 68 65 0a 2a 2a 20 76 61 6c 75  ment the.** valu
4460: 65 20 73 74 6f 72 65 64 20 69 6e 20 69 74 73 20  e stored in its 
4470: 6f 75 74 70 75 74 20 72 65 67 69 73 74 65 72 2e  output register.
4480: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4490: 74 72 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54  translateColumnT
44a0: 6f 43 6f 70 79 28 0a 20 20 56 64 62 65 20 2a 76  oCopy(.  Vdbe *v
44b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
44c0: 54 68 65 20 56 44 42 45 20 63 6f 6e 74 61 69 6e  The VDBE contain
44d0: 69 6e 67 20 63 6f 64 65 20 74 6f 20 74 72 61 6e  ing code to tran
44e0: 73 6c 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69  slate */.  int i
44f0: 53 74 61 72 74 2c 20 20 20 20 20 20 20 20 20 2f  Start,         /
4500: 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d  * Translate from
4510: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 74 6f 20   this opcode to 
4520: 74 68 65 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  the end */.  int
4530: 20 69 54 61 62 43 75 72 2c 20 20 20 20 20 20 20   iTabCur,       
4540: 20 2f 2a 20 4f 50 5f 43 6f 6c 75 6d 6e 2f 4f 50   /* OP_Column/OP
4550: 5f 52 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65  _Rowid reference
4560: 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20  s to this table 
4570: 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 73 74  */.  int iRegist
4580: 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  er,      /* The 
4590: 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20  first column is 
45a0: 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
45b0: 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 63 72 52   */.  int bIncrR
45c0: 6f 77 69 64 20 20 20 20 20 20 2f 2a 20 49 66 20  owid      /* If 
45d0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 72 61 6e 73 66  non-zero, transf
45e0: 6f 72 6d 20 4f 50 5f 72 6f 77 69 64 20 74 6f 20  orm OP_rowid to 
45f0: 4f 50 5f 41 64 64 49 6d 6d 28 31 29 20 2a 2f 0a  OP_AddImm(1) */.
4600: 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70  ){.  VdbeOp *pOp
4610: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
4620: 74 4f 70 28 76 2c 20 69 53 74 61 72 74 29 3b 0a  tOp(v, iStart);.
4630: 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 73 71 6c    int iEnd = sql
4640: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
4650: 64 64 72 28 76 29 3b 0a 20 20 66 6f 72 28 3b 20  ddr(v);.  for(; 
4660: 69 53 74 61 72 74 3c 69 45 6e 64 3b 20 69 53 74  iStart<iEnd; iSt
4670: 61 72 74 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20  art++, pOp++){. 
4680: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d     if( pOp->p1!=
4690: 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e  iTabCur ) contin
46a0: 75 65 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d  ue;.    if( pOp-
46b0: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75  >opcode==OP_Colu
46c0: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 70 4f 70 2d  mn ){.      pOp-
46d0: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 43 6f 70  >opcode = OP_Cop
46e0: 79 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 31  y;.      pOp->p1
46f0: 20 3d 20 70 4f 70 2d 3e 70 32 20 2b 20 69 52 65   = pOp->p2 + iRe
4700: 67 69 73 74 65 72 3b 0a 20 20 20 20 20 20 70 4f  gister;.      pO
4710: 70 2d 3e 70 32 20 3d 20 70 4f 70 2d 3e 70 33 3b  p->p2 = pOp->p3;
4720: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d  .      pOp->p3 =
4730: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
4740: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
4750: 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  P_Rowid ){.     
4760: 20 69 66 28 20 62 49 6e 63 72 52 6f 77 69 64 20   if( bIncrRowid 
4770: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ){.        /* In
4780: 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
4790: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
47a0: 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 74 68  P2 operand of th
47b0: 65 20 4f 50 5f 52 6f 77 69 64 2e 20 2a 2f 0a 20  e OP_Rowid. */. 
47c0: 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f         pOp->opco
47d0: 64 65 20 3d 20 4f 50 5f 41 64 64 49 6d 6d 3b 0a  de = OP_AddImm;.
47e0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
47f0: 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20  = pOp->p2;.     
4800: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 31 3b 0a     pOp->p2 = 1;.
4810: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4820: 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
4830: 20 3d 20 4f 50 5f 4e 75 6c 6c 3b 0a 20 20 20 20   = OP_Null;.    
4840: 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 30 3b      pOp->p1 = 0;
4850: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 33  .        pOp->p3
4860: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
4870: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
4880: 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f   Two routines fo
4890: 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63  r printing the c
48a0: 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c  ontent of an sql
48b0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a  ite3_index_info.
48c0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 55  ** structure.  U
48d0: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
48e0: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
48f0: 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a  ly.  If neither.
4900: 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f  ** SQLITE_TEST o
4910: 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61  r SQLITE_DEBUG a
4920: 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  re defined, then
4930: 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a   these routines.
4940: 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a  ** are no-ops..*
4950: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
4960: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
4970: 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
4980: 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45  ned(WHERETRACE_E
4990: 4e 41 42 4c 45 44 29 0a 73 74 61 74 69 63 20 76  NABLED).static v
49a0: 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 49 4e  oid TRACE_IDX_IN
49b0: 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64  PUTS(sqlite3_ind
49c0: 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  ex_info *p){.  i
49d0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c  nt i;.  if( !sql
49e0: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
49f0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
4a00: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
4a10: 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
4a20: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4a30: 74 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e 74  tf("  constraint
4a40: 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72  [%d]: col=%d ter
4a50: 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73 61  mid=%d op=%d usa
4a60: 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  bled=%d\n",.    
4a70: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
4a80: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69  aConstraint[i].i
4a90: 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70  Column,.       p
4aa0: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
4ab0: 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20  .iTermOffset,.  
4ac0: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
4ad0: 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20  int[i].op,.     
4ae0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
4af0: 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d  [i].usable);.  }
4b00: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
4b10: 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  >nOrderBy; i++){
4b20: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
4b30: 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72  gPrintf("  order
4b40: 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64  by[%d]: col=%d d
4b50: 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  esc=%d\n",.     
4b60: 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
4b70: 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75  OrderBy[i].iColu
4b80: 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f  mn,.       p->aO
4b90: 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b  rderBy[i].desc);
4ba0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
4bb0: 69 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  id TRACE_IDX_OUT
4bc0: 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e 64  PUTS(sqlite3_ind
4bd0: 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69  ex_info *p){.  i
4be0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71 6c  nt i;.  if( !sql
4bf0: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29  ite3WhereTrace )
4c00: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
4c10: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72  =0; i<p->nConstr
4c20: 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  aint; i++){.    
4c30: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4c40: 74 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a  tf("  usage[%d]:
4c50: 20 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74   argvIdx=%d omit
4c60: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
4c70: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e  ,.       p->aCon
4c80: 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e  straintUsage[i].
4c90: 61 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20  argvIndex,.     
4ca0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
4cb0: 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a  Usage[i].omit);.
4cc0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62    }.  sqlite3Deb
4cd0: 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e  ugPrintf("  idxN
4ce0: 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78  um=%d\n", p->idx
4cf0: 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Num);.  sqlite3D
4d00: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64  ebugPrintf("  id
4d10: 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69  xStr=%s\n", p->i
4d20: 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65  dxStr);.  sqlite
4d30: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
4d40: 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d  orderByConsumed=
4d50: 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42  %d\n", p->orderB
4d60: 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71  yConsumed);.  sq
4d70: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4d80: 28 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73  ("  estimatedCos
4d90: 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69  t=%g\n", p->esti
4da0: 6d 61 74 65 64 43 6f 73 74 29 3b 0a 20 20 73 71  matedCost);.  sq
4db0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
4dc0: 28 22 20 20 65 73 74 69 6d 61 74 65 64 52 6f 77  ("  estimatedRow
4dd0: 73 3d 25 6c 6c 64 5c 6e 22 2c 20 70 2d 3e 65 73  s=%lld\n", p->es
4de0: 74 69 6d 61 74 65 64 52 6f 77 73 29 3b 0a 7d 0a  timatedRows);.}.
4df0: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52  #else.#define TR
4e00: 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41  ACE_IDX_INPUTS(A
4e10: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f  ).#define TRACE_
4e20: 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23  IDX_OUTPUTS(A).#
4e30: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
4e40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
4e50: 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a  ATIC_INDEX./*.**
4e60: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
4e70: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4e80: 20 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f   term pTerm is o
4e90: 66 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69  f a form where i
4ea0: 74 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73  t.** could be us
4eb0: 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78  ed with an index
4ec0: 20 74 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c   to access pSrc,
4ed0: 20 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70   assuming an app
4ee0: 72 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65  ropriate.** inde
4ef0: 78 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74  x existed..*/.st
4f00: 61 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e  atic int termCan
4f10: 44 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68  DriveIndex(.  Wh
4f20: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
4f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4f40: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
4f50: 6d 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  m to check */.  
4f60: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
4f70: 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f  tem *pSrc,     /
4f80: 2a 20 54 61 62 6c 65 20 77 65 20 61 72 65 20 74  * Table we are t
4f90: 72 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20  rying to access 
4fa0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
4fb0: 52 65 61 64 79 20 20 20 20 20 20 20 20 20 20 20  Ready           
4fc0: 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e      /* Tables in
4fd0: 20 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20   outer loops of 
4fe0: 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20  the join */.){. 
4ff0: 20 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28   char aff;.  if(
5000: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
5010: 6f 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f  or!=pSrc->iCurso
5020: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
5030: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
5040: 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57  rator & (WO_EQ|W
5050: 4f 5f 49 53 29 29 3d 3d 30 20 29 20 72 65 74 75  O_IS))==0 ) retu
5060: 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54 65  rn 0;.  if( (pTe
5070: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
5080: 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  & notReady)!=0 )
5090: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
50a0: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
50b0: 6c 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20  lumn<0 ) return 
50c0: 30 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d  0;.  aff = pSrc-
50d0: 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72  >pTab->aCol[pTer
50e0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d  m->u.leftColumn]
50f0: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28  .affinity;.  if(
5100: 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66   !sqlite3IndexAf
5110: 66 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e  finityOk(pTerm->
5120: 70 45 78 70 72 2c 20 61 66 66 29 20 29 20 72 65  pExpr, aff) ) re
5130: 74 75 72 6e 20 30 3b 0a 20 20 74 65 73 74 63 61  turn 0;.  testca
5140: 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se( pTerm->pExpr
5150: 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
5160: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
5170: 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  dif...#ifndef SQ
5180: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
5190: 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  TIC_INDEX./*.** 
51a0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
51b0: 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49   construct the I
51c0: 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20  ndex object for 
51d0: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
51e0: 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74  ex.** and to set
51f0: 20 75 70 20 74 68 65 20 57 68 65 72 65 4c 65 76   up the WhereLev
5200: 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c  el object pLevel
5210: 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 64   so that the cod
5220: 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d  e generator.** m
5230: 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65 20  akes use of the 
5240: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e  automatic index.
5250: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5260: 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74  constructAutomat
5270: 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  icIndex(.  Parse
5280: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
5290: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
52a0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
52b0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
52c0: 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pWC,           /
52d0: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
52e0: 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
52f0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
5300: 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c,  /* The FROM 
5310: 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 67  clause term to g
5320: 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65  et the next inde
5330: 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  x */.  Bitmask n
5340: 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20  otReady,        
5350: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
5360: 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
5370: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ot available */.
5380: 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
5390: 65 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  evel          /*
53a0: 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65 78   Write new index
53b0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
53c0: 74 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20  t nKeyCol;      
53d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
53e0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
53f0: 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65  n the constructe
5400: 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65  d index */.  Whe
5410: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
5420: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
5430: 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65  ngle term of the
5440: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
5450: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57  .  WhereTerm *pW
5460: 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f  CEnd;          /
5470: 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b  * End of pWC->a[
5480: 5d 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  ] */.  Index *pI
5490: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
54a0: 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 64 65 73     /* Object des
54b0: 63 72 69 62 69 6e 67 20 74 68 65 20 74 72 61 6e  cribing the tran
54c0: 73 69 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20  sient index */. 
54d0: 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
54f0: 50 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  Prepared stateme
5500: 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  nt under constru
5510: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  ction */.  int a
5520: 64 64 72 49 6e 69 74 3b 20 20 20 20 20 20 20 20  ddrInit;        
5530: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
5540: 73 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c  s of the initial
5550: 69 7a 61 74 69 6f 6e 20 62 79 70 61 73 73 20 6a  ization bypass j
5560: 75 6d 70 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ump */.  Table *
5570: 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  pTable;         
5580: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
5590: 65 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20  e being indexed 
55a0: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 54 6f 70  */.  int addrTop
55b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
55c0: 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 69   /* Top of the i
55d0: 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20 2a  ndex fill loop *
55e0: 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72  /.  int regRecor
55f0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
5600: 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
5610: 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65 63  ing an index rec
5620: 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ord */.  int n; 
5630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5640: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 63       /* Column c
5650: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
5660: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
5670: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
5680: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
5690: 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20 20   mxBitCol;      
56a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
56b0: 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 53  mum column in pS
56c0: 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a 20  rc->colUsed */. 
56d0: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
56e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
56f0: 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  Collating sequen
5700: 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75 6d  ce to on a colum
5710: 6e 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  n */.  WhereLoop
5720: 20 2a 70 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20   *pLoop;        
5730: 20 20 20 2f 2a 20 54 68 65 20 4c 6f 6f 70 20 6f     /* The Loop o
5740: 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
5750: 2a 7a 4e 6f 74 55 73 65 64 3b 20 20 20 20 20 20  *zNotUsed;      
5760: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
5770: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 65 6e 64  space on the end
5780: 20 6f 66 20 70 49 64 78 20 2a 2f 0a 20 20 42 69   of pIdx */.  Bi
5790: 74 6d 61 73 6b 20 69 64 78 43 6f 6c 73 3b 20 20  tmask idxCols;  
57a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
57b0: 6d 61 70 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 75  map of columns u
57c0: 73 65 64 20 66 6f 72 20 69 6e 64 65 78 69 6e 67  sed for indexing
57d0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78   */.  Bitmask ex
57e0: 74 72 61 43 6f 6c 73 3b 20 20 20 20 20 20 20 20  traCols;        
57f0: 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 61    /* Bitmap of a
5800: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e  dditional column
5810: 73 20 2a 2f 0a 20 20 75 38 20 73 65 6e 74 57 61  s */.  u8 sentWa
5820: 72 6e 69 6e 67 20 3d 20 30 3b 20 20 20 20 20 20  rning = 0;      
5830: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
5840: 77 61 72 6e 6e 69 6e 67 20 68 61 73 20 62 65 65  warnning has bee
5850: 6e 20 69 73 73 75 65 64 20 2a 2f 0a 20 20 45 78  n issued */.  Ex
5860: 70 72 20 2a 70 50 61 72 74 69 61 6c 20 3d 20 30  pr *pPartial = 0
5870: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ;         /* Par
5880: 74 69 61 6c 20 49 6e 64 65 78 20 45 78 70 72 65  tial Index Expre
5890: 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ssion */.  int i
58a0: 43 6f 6e 74 69 6e 75 65 20 3d 20 30 3b 20 20 20  Continue = 0;   
58b0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
58c0: 65 72 65 20 74 6f 20 73 6b 69 70 20 65 78 63 6c  ere to skip excl
58d0: 75 64 65 64 20 72 6f 77 73 20 2a 2f 0a 20 20 73  uded rows */.  s
58e0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
58f0: 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f  em *pTabItem;  /
5900: 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  * FROM clause te
5910: 72 6d 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64  rm being indexed
5920: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f   */.  int addrCo
5930: 75 6e 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  unter = 0;      
5940: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 77 68 65    /* Address whe
5950: 72 65 20 69 6e 74 65 67 65 72 20 63 6f 75 6e 74  re integer count
5960: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
5970: 64 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42 61  d */.  int regBa
5980: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
5990: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 72     /* Array of r
59a0: 65 67 69 73 74 65 72 73 20 77 68 65 72 65 20 72  egisters where r
59b0: 65 63 6f 72 64 20 69 73 20 61 73 73 65 6d 62 6c  ecord is assembl
59c0: 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 47 65 6e 65  ed */..  /* Gene
59d0: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 73 6b 69  rate code to ski
59e0: 70 20 6f 76 65 72 20 74 68 65 20 63 72 65 61 74  p over the creat
59f0: 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ion and initiali
5a00: 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  zation of the.  
5a10: 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 64  ** transient ind
5a20: 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64 20 73 75  ex on 2nd and su
5a30: 62 73 65 71 75 65 6e 74 20 69 74 65 72 61 74 69  bsequent iterati
5a40: 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  ons of the loop.
5a50: 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65   */.  v = pParse
5a60: 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
5a70: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 64 64  t( v!=0 );.  add
5a80: 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 43  rInit = sqlite3C
5a90: 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
5aa0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
5ab0: 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
5ac0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
5ad0: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
5ae0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e   added to the in
5af0: 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65  dex.  ** and use
5b00: 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45  d to match WHERE
5b10: 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
5b20: 6e 74 73 20 2a 2f 0a 20 20 6e 4b 65 79 43 6f 6c  nts */.  nKeyCol
5b30: 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d   = 0;.  pTable =
5b40: 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70   pSrc->pTab;.  p
5b50: 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b  WCEnd = &pWC->a[
5b60: 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70  pWC->nTerm];.  p
5b70: 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Loop = pLevel->p
5b80: 57 4c 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73  WLoop;.  idxCols
5b90: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
5ba0: 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c  m=pWC->a; pTerm<
5bb0: 70 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  pWCEnd; pTerm++)
5bc0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
5bd0: 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
5be0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
5bf0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5c00: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
5c10: 6e 29 20 20 20 20 2f 2a 20 70 72 65 72 65 71 20  n)    /* prereq 
5c20: 61 6c 77 61 79 73 20 6e 6f 6e 2d 7a 65 72 6f 20  always non-zero 
5c30: 2a 2f 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  */.         || p
5c40: 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Expr->iRightJoin
5c50: 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75  Table!=pSrc->iCu
5c60: 72 73 6f 72 20 20 20 2f 2a 20 20 20 66 6f 72 20  rsor   /*   for 
5c70: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 20  the right-hand  
5c80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 7c 7c 20   */.         || 
5c90: 70 4c 6f 6f 70 2d 3e 70 72 65 72 65 71 21 3d 30  pLoop->prereq!=0
5ca0: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
5cb0: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 74 61 62          /*   tab
5cc0: 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  le of a LEFT JOI
5cd0: 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f  N */.    if( pLo
5ce0: 6f 70 2d 3e 70 72 65 72 65 71 3d 3d 30 0a 20 20  op->prereq==0.  
5cf0: 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 77 74     && (pTerm->wt
5d00: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
5d10: 54 55 41 4c 29 3d 3d 30 0a 20 20 20 20 20 26 26  TUAL)==0.     &&
5d20: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
5d30: 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
5d40: 4a 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 73 71  Join).     && sq
5d50: 6c 69 74 65 33 45 78 70 72 49 73 54 61 62 6c 65  lite3ExprIsTable
5d60: 43 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 2c 20  Constant(pExpr, 
5d70: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 20 29  pSrc->iCursor) )
5d80: 7b 0a 20 20 20 20 20 20 70 50 61 72 74 69 61 6c  {.      pPartial
5d90: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
5da0: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50  d(pParse->db, pP
5db0: 61 72 74 69 61 6c 2c 0a 20 20 20 20 20 20 20 20  artial,.        
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5de0: 78 70 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64  xprDup(pParse->d
5df0: 62 2c 20 70 45 78 70 72 2c 20 30 29 29 3b 0a 20  b, pExpr, 0));. 
5e00: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65 72     }.    if( ter
5e10: 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
5e20: 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52  Term, pSrc, notR
5e30: 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69  eady) ){.      i
5e40: 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d  nt iCol = pTerm-
5e50: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
5e60: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61       Bitmask cMa
5e70: 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f  sk = iCol>=BMS ?
5e80: 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20   MASKBIT(BMS-1) 
5e90: 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b  : MASKBIT(iCol);
5ea0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
5eb0: 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20   iCol==BMS );.  
5ec0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
5ed0: 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
5ee0: 20 20 20 69 66 28 20 21 73 65 6e 74 57 61 72 6e     if( !sentWarn
5ef0: 69 6e 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ing ){.        s
5f00: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
5f10: 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e  E_WARNING_AUTOIN
5f20: 44 45 58 2c 0a 20 20 20 20 20 20 20 20 20 20 20  DEX,.           
5f30: 20 22 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65   "automatic inde
5f40: 78 20 6f 6e 20 25 73 28 25 73 29 22 2c 20 70 54  x on %s(%s)", pT
5f50: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  able->zName,.   
5f60: 20 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d           pTable-
5f70: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
5f80: 65 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6e 74  e);.        sent
5f90: 57 61 72 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20  Warning = 1;.   
5fa0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
5fb0: 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29  idxCols & cMask)
5fc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
5fd0: 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
5fe0: 7a 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ze(pParse->db, p
5ff0: 4c 6f 6f 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29  Loop, nKeyCol+1)
6000: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
6010: 74 6f 20 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65  to end_auto_inde
6020: 78 5f 63 72 65 61 74 65 3b 0a 20 20 20 20 20 20  x_create;.      
6030: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f    }.        pLoo
6040: 70 2d 3e 61 4c 54 65 72 6d 5b 6e 4b 65 79 43 6f  p->aLTerm[nKeyCo
6050: 6c 2b 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  l++] = pTerm;.  
6060: 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d        idxCols |=
6070: 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a   cMask;.      }.
6080: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
6090: 72 74 28 20 6e 4b 65 79 43 6f 6c 3e 30 20 29 3b  rt( nKeyCol>0 );
60a0: 0a 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65  .  pLoop->u.btre
60b0: 65 2e 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 6e  e.nEq = pLoop->n
60c0: 4c 54 65 72 6d 20 3d 20 6e 4b 65 79 43 6f 6c 3b  LTerm = nKeyCol;
60d0: 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  .  pLoop->wsFlag
60e0: 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s = WHERE_COLUMN
60f0: 5f 45 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f  _EQ | WHERE_IDX_
6100: 4f 4e 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44  ONLY | WHERE_IND
6110: 45 58 45 44 0a 20 20 20 20 20 20 20 20 20 20 20  EXED.           
6120: 20 20 20 20 20 20 20 20 20 20 7c 20 57 48 45 52            | WHER
6130: 45 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 0a 20  E_AUTO_INDEX;.. 
6140: 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
6150: 6d 62 65 72 20 6f 66 20 61 64 64 69 74 69 6f 6e  mber of addition
6160: 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65  al columns neede
6170: 64 20 74 6f 20 63 72 65 61 74 65 20 61 0a 20 20  d to create a.  
6180: 2a 2a 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  ** covering inde
6190: 78 2e 20 20 41 20 22 63 6f 76 65 72 69 6e 67 20  x.  A "covering 
61a0: 69 6e 64 65 78 22 20 69 73 20 61 6e 20 69 6e 64  index" is an ind
61b0: 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
61c0: 20 61 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e   all.  ** column
61d0: 73 20 74 68 61 74 20 61 72 65 20 6e 65 65 64 65  s that are neede
61e0: 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 20  d by the query. 
61f0: 20 57 69 74 68 20 61 20 63 6f 76 65 72 69 6e 67   With a covering
6200: 20 69 6e 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a   index, the.  **
6210: 20 6f 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20   original table 
6220: 6e 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62  never needs to b
6230: 65 20 61 63 63 65 73 73 65 64 2e 20 20 41 75 74  e accessed.  Aut
6240: 6f 6d 61 74 69 63 20 69 6e 64 69 63 65 73 20 6d  omatic indices m
6250: 75 73 74 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f  ust.  ** be a co
6260: 76 65 72 69 6e 67 20 69 6e 64 65 78 20 62 65 63  vering index bec
6270: 61 75 73 65 20 74 68 65 20 69 6e 64 65 78 20 77  ause the index w
6280: 69 6c 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74  ill not be updat
6290: 65 64 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f  ed if the.  ** o
62a0: 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 63 68  riginal table ch
62b0: 61 6e 67 65 73 20 61 6e 64 20 74 68 65 20 69 6e  anges and the in
62c0: 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 63 61  dex and table ca
62d0: 6e 6e 6f 74 20 62 6f 74 68 20 62 65 20 75 73 65  nnot both be use
62e0: 64 0a 20 20 2a 2a 20 69 66 20 74 68 65 79 20 67  d.  ** if they g
62f0: 6f 20 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20  o out of sync.. 
6300: 20 2a 2f 0a 20 20 65 78 74 72 61 43 6f 6c 73 20   */.  extraCols 
6310: 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  = pSrc->colUsed 
6320: 26 20 28 7e 69 64 78 43 6f 6c 73 20 7c 20 4d 41  & (~idxCols | MA
6330: 53 4b 42 49 54 28 42 4d 53 2d 31 29 29 3b 0a 20  SKBIT(BMS-1));. 
6340: 20 6d 78 42 69 74 43 6f 6c 20 3d 20 4d 49 4e 28   mxBitCol = MIN(
6350: 42 4d 53 2d 31 2c 70 54 61 62 6c 65 2d 3e 6e 43  BMS-1,pTable->nC
6360: 6f 6c 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ol);.  testcase(
6370: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42   pTable->nCol==B
6380: 4d 53 2d 31 20 29 3b 0a 20 20 74 65 73 74 63 61  MS-1 );.  testca
6390: 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  se( pTable->nCol
63a0: 3d 3d 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72  ==BMS-2 );.  for
63b0: 28 69 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c  (i=0; i<mxBitCol
63c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
63d0: 65 78 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b  extraCols & MASK
63e0: 42 49 54 28 69 29 20 29 20 6e 4b 65 79 43 6f 6c  BIT(i) ) nKeyCol
63f0: 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  ++;.  }.  if( pS
6400: 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41  rc->colUsed & MA
6410: 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a  SKBIT(BMS-1) ){.
6420: 20 20 20 20 6e 4b 65 79 43 6f 6c 20 2b 3d 20 70      nKeyCol += p
6430: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d  Table->nCol - BM
6440: 53 20 2b 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  S + 1;.  }..  /*
6450: 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49   Construct the I
6460: 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64  ndex object to d
6470: 65 73 63 72 69 62 65 20 74 68 69 73 20 69 6e 64  escribe this ind
6480: 65 78 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73  ex */.  pIdx = s
6490: 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e  qlite3AllocateIn
64a0: 64 65 78 4f 62 6a 65 63 74 28 70 50 61 72 73 65  dexObject(pParse
64b0: 2d 3e 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b 31 2c  ->db, nKeyCol+1,
64c0: 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b 0a   0, &zNotUsed);.
64d0: 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20    if( pIdx==0 ) 
64e0: 67 6f 74 6f 20 65 6e 64 5f 61 75 74 6f 5f 69 6e  goto end_auto_in
64f0: 64 65 78 5f 63 72 65 61 74 65 3b 0a 20 20 70 4c  dex_create;.  pL
6500: 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
6510: 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49  dex = pIdx;.  pI
6520: 64 78 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74  dx->zName = "aut
6530: 6f 2d 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78  o-index";.  pIdx
6540: 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c  ->pTable = pTabl
6550: 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64  e;.  n = 0;.  id
6560: 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72  xCols = 0;.  for
6570: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
6580: 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
6590: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74  rm++){.    if( t
65a0: 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78  ermCanDriveIndex
65b0: 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f  (pTerm, pSrc, no
65c0: 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20  tReady) ){.     
65d0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72   int iCol = pTer
65e0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b  m->u.leftColumn;
65f0: 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63  .      Bitmask c
6600: 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53  Mask = iCol>=BMS
6610: 20 3f 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31   ? MASKBIT(BMS-1
6620: 29 20 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c  ) : MASKBIT(iCol
6630: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
6640: 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29  e( iCol==BMS-1 )
6650: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
6660: 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20  ( iCol==BMS );. 
6670: 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c       if( (idxCol
6680: 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b  s & cMask)==0 ){
6690: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
66a0: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
66b0: 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c  ;.        idxCol
66c0: 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20  s |= cMask;.    
66d0: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
66e0: 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75  mn[n] = pTerm->u
66f0: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
6700: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
6710: 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72  ite3BinaryCompar
6720: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
6730: 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e   pX->pLeft, pX->
6740: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
6750: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
6760: 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c   = pColl ? pColl
6770: 2d 3e 7a 4e 61 6d 65 20 3a 20 73 71 6c 69 74 65  ->zName : sqlite
6780: 33 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20  3StrBINARY;.    
6790: 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d      n++;.      }
67a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
67b0: 65 72 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f  ert( (u32)n==pLo
67c0: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20  op->u.btree.nEq 
67d0: 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64  );..  /* Add add
67e0: 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
67f0: 6e 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74  needed to make t
6800: 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  he automatic ind
6810: 65 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63  ex into.  ** a c
6820: 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f  overing index */
6830: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78  .  for(i=0; i<mx
6840: 42 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  BitCol; i++){.  
6850: 20 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20    if( extraCols 
6860: 26 20 4d 41 53 4b 42 49 54 28 69 29 20 29 7b 0a  & MASKBIT(i) ){.
6870: 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f        pIdx->aiCo
6880: 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20  lumn[n] = i;.   
6890: 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b     pIdx->azColl[
68a0: 6e 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42  n] = sqlite3StrB
68b0: 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 6e 2b 2b  INARY;.      n++
68c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
68d0: 28 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  ( pSrc->colUsed 
68e0: 26 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29  & MASKBIT(BMS-1)
68f0: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d   ){.    for(i=BM
6900: 53 2d 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  S-1; i<pTable->n
6910: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
6920: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
6930: 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49  n] = i;.      pI
6940: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20  dx->azColl[n] = 
6950: 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59  sqlite3StrBINARY
6960: 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  ;.      n++;.   
6970: 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
6980: 20 6e 3d 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20   n==nKeyCol );. 
6990: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
69a0: 6e 5d 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20  n] = XN_ROWID;. 
69b0: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
69c0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e   = sqlite3StrBIN
69d0: 41 52 59 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74  ARY;..  /* Creat
69e0: 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  e the automatic 
69f0: 69 6e 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72  index */.  asser
6a00: 74 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  t( pLevel->iIdxC
6a10: 75 72 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65  ur>=0 );.  pLeve
6a20: 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61  l->iIdxCur = pPa
6a30: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73  rse->nTab++;.  s
6a40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6a50: 28 76 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69  (v, OP_OpenAutoi
6a60: 6e 64 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  ndex, pLevel->iI
6a70: 64 78 43 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b 31  dxCur, nKeyCol+1
6a80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
6a90: 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61  SetP4KeyInfo(pPa
6aa0: 72 73 65 2c 20 70 49 64 78 29 3b 0a 20 20 56 64  rse, pIdx);.  Vd
6ab0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66  beComment((v, "f
6ac0: 6f 72 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e  or %s", pTable->
6ad0: 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46  zName));..  /* F
6ae0: 69 6c 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ill the automati
6af0: 63 20 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e  c index with con
6b00: 74 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tent */.  sqlite
6b10: 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
6b20: 50 61 72 73 65 29 3b 0a 20 20 70 54 61 62 49 74  Parse);.  pTabIt
6b30: 65 6d 20 3d 20 26 70 57 43 2d 3e 70 57 49 6e 66  em = &pWC->pWInf
6b40: 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
6b50: 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
6b60: 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66   if( pTabItem->f
6b70: 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29  g.viaCoroutine )
6b80: 7b 0a 20 20 20 20 69 6e 74 20 72 65 67 59 69 65  {.    int regYie
6b90: 6c 64 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 72  ld = pTabItem->r
6ba0: 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 61 64  egReturn;.    ad
6bb0: 64 72 43 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69  drCounter = sqli
6bc0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6bd0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
6be0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
6bf0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6c00: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72  InitCoroutine, r
6c10: 65 67 59 69 65 6c 64 2c 20 30 2c 20 70 54 61 62  egYield, 0, pTab
6c20: 49 74 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75  Item->addrFillSu
6c30: 62 29 3b 0a 20 20 20 20 61 64 64 72 54 6f 70 20  b);.    addrTop 
6c40: 3d 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  =  sqlite3VdbeAd
6c50: 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64  dOp1(v, OP_Yield
6c60: 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20  , regYield);.   
6c70: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
6c80: 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
6c90: 74 28 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20  t((v, "next row 
6ca0: 6f 66 20 5c 22 25 73 5c 22 22 2c 20 70 54 61 62  of \"%s\"", pTab
6cb0: 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
6cc0: 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  e));.  }else{.  
6cd0: 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
6ce0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
6cf0: 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76   OP_Rewind, pLev
6d00: 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 20 56 64  el->iTabCur); Vd
6d10: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
6d20: 20 7d 0a 20 20 69 66 28 20 70 50 61 72 74 69 61   }.  if( pPartia
6d30: 6c 20 29 7b 0a 20 20 20 20 69 43 6f 6e 74 69 6e  l ){.    iContin
6d40: 75 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ue = sqlite3Vdbe
6d50: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
6d60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
6d70: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 50 61  alse(pParse, pPa
6d80: 72 74 69 61 6c 2c 20 69 43 6f 6e 74 69 6e 75 65  rtial, iContinue
6d90: 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
6da0: 55 4c 4c 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  ULL);.    pLoop-
6db0: 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
6dc0: 45 5f 50 41 52 54 49 41 4c 49 44 58 3b 0a 20 20  E_PARTIALIDX;.  
6dd0: 7d 0a 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20  }.  regRecord = 
6de0: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
6df0: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67  g(pParse);.  reg
6e00: 42 61 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65  Base = sqlite3Ge
6e10: 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 0a  nerateIndexKey(.
6e20: 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 49        pParse, pI
6e30: 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  dx, pLevel->iTab
6e40: 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20  Cur, regRecord, 
6e50: 30 2c 20 30 2c 20 30 2c 20 30 0a 20 20 29 3b 0a  0, 0, 0, 0.  );.
6e60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6e70: 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
6e80: 65 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ert, pLevel->iId
6e90: 78 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29  xCur, regRecord)
6ea0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
6eb0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
6ec0: 47 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29  G_USESEEKRESULT)
6ed0: 3b 0a 20 20 69 66 28 20 70 50 61 72 74 69 61 6c  ;.  if( pPartial
6ee0: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   ) sqlite3VdbeRe
6ef0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43  solveLabel(v, iC
6f00: 6f 6e 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20  ontinue);.  if( 
6f10: 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61  pTabItem->fg.via
6f20: 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20  Coroutine ){.   
6f30: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6f40: 67 65 50 32 28 76 2c 20 61 64 64 72 43 6f 75 6e  geP2(v, addrCoun
6f50: 74 65 72 2c 20 72 65 67 42 61 73 65 2b 6e 29 3b  ter, regBase+n);
6f60: 0a 20 20 20 20 74 72 61 6e 73 6c 61 74 65 43 6f  .    translateCo
6f70: 6c 75 6d 6e 54 6f 43 6f 70 79 28 76 2c 20 61 64  lumnToCopy(v, ad
6f80: 64 72 54 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69  drTop, pLevel->i
6f90: 54 61 62 43 75 72 2c 20 70 54 61 62 49 74 65 6d  TabCur, pTabItem
6fa0: 2d 3e 72 65 67 52 65 73 75 6c 74 2c 20 31 29 3b  ->regResult, 1);
6fb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6fc0: 47 6f 74 6f 28 76 2c 20 61 64 64 72 54 6f 70 29  Goto(v, addrTop)
6fd0: 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e  ;.    pTabItem->
6fe0: 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
6ff0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
7000: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7010: 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
7020: 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c  pLevel->iTabCur,
7030: 20 61 64 64 72 54 6f 70 2b 31 29 3b 20 56 64 62   addrTop+1); Vdb
7040: 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
7050: 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  }.  sqlite3VdbeC
7060: 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54  hangeP5(v, SQLIT
7070: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54  E_STMTSTATUS_AUT
7080: 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c 69 74  OINDEX);.  sqlit
7090: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
70a0: 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20 73 71  , addrTop);.  sq
70b0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
70c0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
70d0: 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
70e0: 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
70f0: 61 72 73 65 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a  arse);.  .  /* J
7100: 75 6d 70 20 68 65 72 65 20 77 68 65 6e 20 73 6b  ump here when sk
7110: 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
7120: 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  alization */.  s
7130: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
7140: 72 65 28 76 2c 20 61 64 64 72 49 6e 69 74 29 3b  re(v, addrInit);
7150: 0a 0a 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78  ..end_auto_index
7160: 5f 63 72 65 61 74 65 3a 0a 20 20 73 71 6c 69 74  _create:.  sqlit
7170: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
7180: 72 73 65 2d 3e 64 62 2c 20 70 50 61 72 74 69 61  rse->db, pPartia
7190: 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  l);.}.#endif /* 
71a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
71b0: 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a  MATIC_INDEX */..
71c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
71d0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
71e0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
71f0: 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20  and populate an 
7200: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
7210: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49 74  fo structure. It
7220: 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
7230: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
7240: 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
7250: 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74  tually release t
7260: 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  he structure.** 
7270: 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20 70  by passing the p
7280: 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
7290: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
72a0: 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65   to sqlite3_free
72b0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ()..*/.static sq
72c0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
72d0: 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49   *allocateIndexI
72e0: 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nfo(.  Parse *pP
72f0: 61 72 73 65 2c 0a 20 20 57 68 65 72 65 43 6c 61  arse,.  WhereCla
7300: 75 73 65 20 2a 70 57 43 2c 0a 20 20 42 69 74 6d  use *pWC,.  Bitm
7310: 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 2c 20 20  ask mUnusable,  
7320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
7330: 67 6e 6f 72 65 20 74 65 72 6d 73 20 77 69 74 68  gnore terms with
7340: 20 74 68 65 73 65 20 70 72 65 72 65 71 73 20 2a   these prereqs *
7350: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
7360: 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 0a 20  st_item *pSrc,. 
7370: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
7380: 72 42 79 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20  rBy.){.  int i, 
7390: 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a  j;.  int nTerm;.
73a0: 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
73b0: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
73c0: 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73  t *pIdxCons;.  s
73d0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
73e0: 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70 49 64  dex_orderby *pId
73f0: 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74 72 75  xOrderBy;.  stru
7400: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
7410: 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
7420: 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65  e *pUsage;.  Whe
7430: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20  reTerm *pTerm;. 
7440: 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20   int nOrderBy;. 
7450: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
7460: 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 0a  nfo *pIdxInfo;..
7470: 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e    /* Count the n
7480: 75 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c  umber of possibl
7490: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
74a0: 6f 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65 72  onstraints refer
74b0: 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69  ring.  ** to thi
74c0: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  s virtual table 
74d0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d  */.  for(i=nTerm
74e0: 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  =0, pTerm=pWC->a
74f0: 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
7500: 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
7510: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65     if( pTerm->le
7520: 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63  ftCursor != pSrc
7530: 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74  ->iCursor ) cont
7540: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54  inue;.    if( pT
7550: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
7560: 20 26 20 6d 55 6e 75 73 61 62 6c 65 20 29 20 63   & mUnusable ) c
7570: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
7580: 65 72 74 28 20 49 73 50 6f 77 65 72 4f 66 54 77  ert( IsPowerOfTw
7590: 6f 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  o(pTerm->eOperat
75a0: 6f 72 20 26 20 7e 57 4f 5f 45 51 55 49 56 29 20  or & ~WO_EQUIV) 
75b0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
75c0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
75d0: 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  r & WO_IN );.   
75e0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
75f0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
7600: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74  _ISNULL );.    t
7610: 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
7620: 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
7630: 53 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  S );.    testcas
7640: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
7650: 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a  tor & WO_ALL );.
7660: 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
7670: 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 28 57 4f  eOperator & ~(WO
7680: 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45 51 55 49 56  _ISNULL|WO_EQUIV
7690: 7c 57 4f 5f 49 53 29 29 3d 3d 30 20 29 20 63 6f  |WO_IS))==0 ) co
76a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
76b0: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
76c0: 20 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f   TERM_VNULL ) co
76d0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
76e0: 72 74 28 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  rt( pTerm->u.lef
76f0: 74 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b  tColumn>=(-1) );
7700: 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20  .    nTerm++;.  
7710: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 4f  }..  /* If the O
7720: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 63  RDER BY clause c
7730: 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c  ontains only col
7740: 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72  umns in the curr
7750: 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75 61  ent .  ** virtua
7760: 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c  l table then all
7770: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
7780: 74 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72  the aOrderBy par
7790: 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73 71  t of.  ** the sq
77a0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
77b0: 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f   structure..  */
77c0: 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b  .  nOrderBy = 0;
77d0: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
77e0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  ){.    int n = p
77f0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
7800: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
7810: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
7820: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64  pr *pExpr = pOrd
7830: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
7840: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
7850: 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
7860: 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   || pExpr->iTabl
7870: 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  e!=pSrc->iCursor
7880: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
7890: 20 20 20 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20      if( i==n){. 
78a0: 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20       nOrderBy = 
78b0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
78c0: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
78d0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
78e0: 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  fo structure.  *
78f0: 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73  /.  pIdxInfo = s
7900: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
7910: 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
7920: 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29  izeof(*pIdxInfo)
7930: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7940: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 73              + (s
7950: 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29  izeof(*pIdxCons)
7960: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67   + sizeof(*pUsag
7970: 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20  e))*nTerm.      
7980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7990: 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70       + sizeof(*p
79a0: 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64  IdxOrderBy)*nOrd
79b0: 65 72 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49  erBy );.  if( pI
79c0: 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  dxInfo==0 ){.   
79d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
79e0: 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66  (pParse, "out of
79f0: 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72   memory");.    r
7a00: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
7a10: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
7a20: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  e structure.  Th
7a30: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
7a40: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63  info structure c
7a50: 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e  ontains.  ** man
7a60: 79 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 72  y fields that ar
7a70: 65 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e 73  e declared "cons
7a80: 74 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78 42  t" to prevent xB
7a90: 65 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20  estIndex from.  
7aa0: 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d  ** changing them
7ab0: 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f  .  We have to do
7ac0: 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74   some funky cast
7ad0: 69 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a  ing in order to.
7ae0: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20    ** initialize 
7af0: 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20 20  those fields..  
7b00: 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20  */.  pIdxCons = 
7b10: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
7b20: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
7b30: 2a 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a  *)&pIdxInfo[1];.
7b40: 20 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20    pIdxOrderBy = 
7b50: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
7b60: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26  index_orderby*)&
7b70: 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b  pIdxCons[nTerm];
7b80: 0a 20 20 70 55 73 61 67 65 20 3d 20 28 73 74 72  .  pUsage = (str
7b90: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
7ba0: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
7bb0: 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79  ge*)&pIdxOrderBy
7bc0: 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28  [nOrderBy];.  *(
7bd0: 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  int*)&pIdxInfo->
7be0: 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54  nConstraint = nT
7bf0: 65 72 6d 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70  erm;.  *(int*)&p
7c00: 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
7c10: 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  y = nOrderBy;.  
7c20: 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33  *(struct sqlite3
7c30: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
7c40: 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  t**)&pIdxInfo->a
7c50: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64  Constraint = pId
7c60: 78 43 6f 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63  xCons;.  *(struc
7c70: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
7c80: 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78 49  orderby**)&pIdxI
7c90: 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20  nfo->aOrderBy = 
7ca0: 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a  pIdxOrderBy;.  *
7cb0: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
7cc0: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
7cd0: 5f 75 73 61 67 65 2a 2a 29 26 70 49 64 78 49 6e  _usage**)&pIdxIn
7ce0: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
7cf0: 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20  sage =.         
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d30: 20 20 20 20 20 20 20 20 20 20 70 55 73 61 67 65            pUsage
7d40: 3b 0a 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20  ;..  for(i=j=0, 
7d50: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
7d60: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
7d70: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75   pTerm++){.    u
7d80: 38 20 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 54  8 op;.    if( pT
7d90: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
7da0: 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  != pSrc->iCursor
7db0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7dc0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
7dd0: 65 71 52 69 67 68 74 20 26 20 6d 55 6e 75 73 61  eqRight & mUnusa
7de0: 62 6c 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ble ) continue;.
7df0: 20 20 20 20 61 73 73 65 72 74 28 20 49 73 50 6f      assert( IsPo
7e00: 77 65 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e  werOfTwo(pTerm->
7e10: 65 4f 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f  eOperator & ~WO_
7e20: 45 51 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65  EQUIV) );.    te
7e30: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
7e40: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
7e50: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
7e60: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
7e70: 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20  or & WO_IS );.  
7e80: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
7e90: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
7ea0: 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  O_ISNULL );.    
7eb0: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
7ec0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
7ed0: 41 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28  ALL );.    if( (
7ee0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
7ef0: 20 26 20 7e 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57   & ~(WO_ISNULL|W
7f00: 4f 5f 45 51 55 49 56 7c 57 4f 5f 49 53 29 29 3d  O_EQUIV|WO_IS))=
7f10: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
7f20: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
7f30: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
7f40: 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
7f50: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
7f60: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d  ->u.leftColumn>=
7f70: 28 2d 31 29 20 29 3b 0a 20 20 20 20 70 49 64 78  (-1) );.    pIdx
7f80: 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20  Cons[j].iColumn 
7f90: 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
7fa0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43  olumn;.    pIdxC
7fb0: 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73  ons[j].iTermOffs
7fc0: 65 74 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d  et = i;.    op =
7fd0: 20 28 75 38 29 70 54 65 72 6d 2d 3e 65 4f 70 65   (u8)pTerm->eOpe
7fe0: 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c 4c 3b 0a  rator & WO_ALL;.
7ff0: 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 49      if( op==WO_I
8000: 4e 20 29 20 6f 70 20 3d 20 57 4f 5f 45 51 3b 0a  N ) op = WO_EQ;.
8010: 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 4d      if( op==WO_M
8020: 41 54 43 48 20 29 7b 0a 20 20 20 20 20 20 6f 70  ATCH ){.      op
8030: 20 3d 20 70 54 65 72 6d 2d 3e 65 4d 61 74 63 68   = pTerm->eMatch
8040: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  Op;.    }.    pI
8050: 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 6f  dxCons[j].op = o
8060: 70 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69  p;.    /* The di
8070: 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20  rect assignment 
8080: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
8090: 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65  line is possible
80a0: 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20   only because.  
80b0: 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64    ** the WO_ and
80c0: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
80d0: 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20  NSTRAINT_ codes 
80e0: 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20  are identical.  
80f0: 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  The.    ** follo
8100: 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72  wing asserts ver
8110: 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ify this fact. *
8120: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  /.    assert( WO
8130: 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _EQ==SQLITE_INDE
8140: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20  X_CONSTRAINT_EQ 
8150: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
8160: 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LT==SQLITE_IND
8170: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54  EX_CONSTRAINT_LT
8180: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8190: 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_LE==SQLITE_IN
81a0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
81b0: 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
81c0: 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_GT==SQLITE_I
81d0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
81e0: 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  GT );.    assert
81f0: 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_GE==SQLITE_
8200: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
8210: 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _GE );.    asser
8220: 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c  t( WO_MATCH==SQL
8230: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
8240: 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20  AINT_MATCH );.  
8250: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
8260: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
8270: 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c  _IN|WO_EQ|WO_LT|
8280: 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_LE|WO_GT|WO_G
8290: 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20  E|WO_MATCH) );. 
82a0: 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f     j++;.  }.  fo
82b0: 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42  r(i=0; i<nOrderB
82c0: 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  y; i++){.    Exp
82d0: 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65  r *pExpr = pOrde
82e0: 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  rBy->a[i].pExpr;
82f0: 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79  .    pIdxOrderBy
8300: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  [i].iColumn = pE
8310: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
8320: 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d    pIdxOrderBy[i]
8330: 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42 79  .desc = pOrderBy
8340: 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
8350: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
8360: 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f 2a 0a  pIdxInfo;.}../*.
8370: 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 62 6a  ** The table obj
8380: 65 63 74 20 72 65 66 65 72 65 6e 63 65 20 70 61  ect reference pa
8390: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
83a0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
83b0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
83c0: 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74 20 61  must represent a
83d0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
83e0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 6e  This function in
83f0: 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73 74 49  vokes the xBestI
8400: 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  ndex().** method
8410: 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20   of the virtual 
8420: 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  table with the s
8430: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
8440: 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  o object that.**
8450: 20 63 6f 6d 65 73 20 69 6e 20 61 73 20 74 68 65   comes in as the
8460: 20 33 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f   3rd argument to
8470: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
8480: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
8490: 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65  r occurs, pParse
84a0: 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69   is populated wi
84b0: 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  th an error mess
84c0: 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e  age and a.** non
84d0: 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72  -zero value is r
84e0: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
84f0: 73 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  se, 0 is returne
8500: 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74  d and the output
8510: 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20  .** part of the 
8520: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
8530: 66 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20  fo structure is 
8540: 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a  left populated..
8550: 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72  **.** Whether or
8560: 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73   not an error is
8570: 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73   returned, it is
8580: 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
8590: 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61  ity of the.** ca
85a0: 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
85b0: 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74  ly free p->idxSt
85c0: 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72  r if p->needToFr
85d0: 65 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74  eeIdxStr indicat
85e0: 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20  es.** that this 
85f0: 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a  is required..*/.
8600: 73 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42  static int vtabB
8610: 65 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a  estIndex(Parse *
8620: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
8630: 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64  Tab, sqlite3_ind
8640: 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73  ex_info *p){.  s
8650: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
8660: 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  ab = sqlite3GetV
8670: 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
8680: 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a  , pTab)->pVtab;.
8690: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54 52 41    int rc;..  TRA
86a0: 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 70 29  CE_IDX_INPUTS(p)
86b0: 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62 2d 3e  ;.  rc = pVtab->
86c0: 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e  pModule->xBestIn
86d0: 64 65 78 28 70 56 74 61 62 2c 20 70 29 3b 0a 20  dex(pVtab, p);. 
86e0: 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
86f0: 54 53 28 70 29 3b 0a 0a 20 20 69 66 28 20 72 63  TS(p);..  if( rc
8700: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
8710: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
8720: 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20  E_NOMEM ){.     
8730: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
8740: 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20  (pParse->db);.  
8750: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74    }else if( !pVt
8760: 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20  ab->zErrMsg ){. 
8770: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
8780: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
8790: 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  ", sqlite3ErrStr
87a0: 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (rc));.    }else
87b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
87c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
87d0: 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72  "%s", pVtab->zEr
87e0: 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rMsg);.    }.  }
87f0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
8800: 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b  pVtab->zErrMsg);
8810: 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  .  pVtab->zErrMs
8820: 67 20 3d 20 30 3b 0a 0a 23 69 66 20 30 0a 20 20  g = 0;..#if 0.  
8830: 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20 69 73  /* This error is
8840: 20 6e 6f 77 20 63 61 75 67 68 74 20 62 79 20 74   now caught by t
8850: 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2a 20  he caller..  ** 
8860: 53 65 61 72 63 68 20 66 6f 72 20 22 78 42 65 73  Search for "xBes
8870: 74 49 6e 64 65 78 20 6d 61 6c 66 75 6e 63 74 69  tIndex malfuncti
8880: 6f 6e 22 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 66  on" below */.  f
8890: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
88a0: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
88b0: 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e      if( !p->aCon
88c0: 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c  straint[i].usabl
88d0: 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61  e && p->aConstra
88e0: 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  intUsage[i].argv
88f0: 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20  Index>0 ){.     
8900: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8910: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
8920: 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78      "table %s: x
8930: 42 65 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e  BestIndex return
8940: 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c  ed an invalid pl
8950: 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  an", pTab->zName
8960: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
8970: 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 70 50  dif..  return pP
8980: 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 23 65  arse->nErr;.}.#e
8990: 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
89a0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
89b0: 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23  TUALTABLE) */..#
89c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
89d0: 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
89e0: 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  T4./*.** Estimat
89f0: 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f  e the location o
8a00: 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6b  f a particular k
8a10: 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b 65 79  ey among all key
8a20: 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64 65 78  s in an.** index
8a30: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72 65 73  .  Store the res
8a40: 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20 61 73  ults in aStat as
8a50: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
8a60: 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20 20 20     aStat[0]     
8a70: 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f 66 20   Est. number of 
8a80: 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e 20 70  rows less than p
8a90: 52 65 63 0a 2a 2a 20 20 20 20 61 53 74 61 74 5b  Rec.**    aStat[
8aa0: 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e 75 6d  1]      Est. num
8ab0: 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71 75 61  ber of rows equa
8ac0: 6c 20 74 6f 20 70 52 65 63 0a 2a 2a 0a 2a 2a 20  l to pRec.**.** 
8ad0: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
8ae0: 20 6f 66 20 74 68 65 20 73 61 6d 70 6c 65 20 74   of the sample t
8af0: 68 61 74 20 69 73 20 74 68 65 20 73 6d 61 6c 6c  hat is the small
8b00: 65 73 74 20 73 61 6d 70 6c 65 20 74 68 61 74 0a  est sample that.
8b10: 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68  ** is greater th
8b20: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 70  an or equal to p
8b30: 52 65 63 2e 20 4e 6f 74 65 20 74 68 61 74 20 74  Rec. Note that t
8b40: 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e 6f 74  his index is not
8b50: 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69 6e 74   an index.** int
8b60: 6f 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20  o the aSample[] 
8b70: 61 72 72 61 79 20 2d 20 69 74 20 69 73 20 61 6e  array - it is an
8b80: 20 69 6e 64 65 78 20 69 6e 74 6f 20 61 20 76 69   index into a vi
8b90: 72 74 75 61 6c 20 73 65 74 20 6f 66 20 73 61 6d  rtual set of sam
8ba0: 70 6c 65 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e  ples.** based on
8bb0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
8bc0: 20 61 53 61 6d 70 6c 65 5b 5d 20 61 6e 64 20 74   aSample[] and t
8bd0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65  he number of fie
8be0: 6c 64 73 20 69 6e 20 72 65 63 6f 72 64 20 0a 2a  lds in record .*
8bf0: 2a 20 70 52 65 63 2e 20 0a 2a 2f 0a 73 74 61 74  * pRec. .*/.stat
8c00: 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65 79 53  ic int whereKeyS
8c10: 74 61 74 73 28 0a 20 20 50 61 72 73 65 20 2a 70  tats(.  Parse *p
8c20: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
8c30: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
8c40: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
8c50: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20  Index *pIdx,    
8c60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
8c70: 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65 72  ndex to consider
8c80: 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20 20   domain of */.  
8c90: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
8ca0: 70 52 65 63 2c 20 20 20 20 20 20 20 2f 2a 20 56  pRec,       /* V
8cb0: 65 63 74 6f 72 20 6f 66 20 76 61 6c 75 65 73 20  ector of values 
8cc0: 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20  to consider */. 
8cd0: 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20 20   int roundUp,   
8ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8cf0: 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72 75 65  Round up if true
8d00: 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20 69 66  .  Round down if
8d10: 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52 6f 77   false */.  tRow
8d20: 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20 20 20  cnt *aStat      
8d30: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
8d40: 73 74 61 74 73 20 77 72 69 74 74 65 6e 20 68 65  stats written he
8d50: 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  re */.){.  Index
8d60: 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20  Sample *aSample 
8d70: 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b  = pIdx->aSample;
8d80: 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20  .  int iCol;    
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8da0: 2a 20 49 6e 64 65 78 20 6f 66 20 72 65 71 75 69  * Index of requi
8db0: 72 65 64 20 73 74 61 74 73 20 69 6e 20 61 6e 45  red stats in anE
8dc0: 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20 69 6e  q[] etc. */.  in
8dd0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
8de0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
8df0: 65 78 20 6f 66 20 66 69 72 73 74 20 73 61 6d 70  ex of first samp
8e00: 6c 65 20 3e 3d 20 70 52 65 63 20 2a 2f 0a 20 20  le >= pRec */.  
8e10: 69 6e 74 20 69 53 61 6d 70 6c 65 3b 20 20 20 20  int iSample;    
8e20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
8e30: 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 6c  mallest sample l
8e40: 61 72 67 65 72 20 74 68 61 6e 20 6f 72 20 65 71  arger than or eq
8e50: 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f 0a 20  ual to pRec */. 
8e60: 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b 20 20   int iMin = 0;  
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8e80: 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20  Smallest sample 
8e90: 6e 6f 74 20 79 65 74 20 74 65 73 74 65 64 20 2a  not yet tested *
8ea0: 2f 0a 20 20 69 6e 74 20 69 54 65 73 74 3b 20 20  /.  int iTest;  
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ec0: 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65 20 74  /* Next sample t
8ed0: 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e 74 20  o test */.  int 
8ee0: 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  res;            
8ef0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
8f00: 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  t of comparison 
8f10: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69  operation */.  i
8f20: 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20 20 20  nt nField;      
8f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8f40: 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69  mber of fields i
8f50: 6e 20 70 52 65 63 20 2a 2f 0a 20 20 74 52 6f 77  n pRec */.  tRow
8f60: 63 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 20  cnt iLower = 0; 
8f70: 20 20 20 20 20 20 20 20 2f 2a 20 61 6e 4c 74 5b          /* anLt[
8f80: 5d 20 2b 20 61 6e 45 71 5b 5d 20 6f 66 20 6c 61  ] + anEq[] of la
8f90: 72 67 65 73 74 20 73 61 6d 70 6c 65 20 70 52 65  rgest sample pRe
8fa0: 63 20 69 73 20 3e 20 2a 2f 0a 0a 23 69 66 6e 64  c is > */..#ifnd
8fb0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
8fc0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
8fd0: 45 52 28 20 70 50 61 72 73 65 20 29 3b 0a 23 65  ER( pParse );.#e
8fe0: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 70  ndif.  assert( p
8ff0: 52 65 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Rec!=0 );.  asse
9000: 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c  rt( pIdx->nSampl
9010: 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
9020: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e 30 20   pRec->nField>0 
9030: 26 26 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3c  && pRec->nField<
9040: 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 43 6f  =pIdx->nSampleCo
9050: 6c 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20 61 20  l );..  /* Do a 
9060: 62 69 6e 61 72 79 20 73 65 61 72 63 68 20 74 6f  binary search to
9070: 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20   find the first 
9080: 73 61 6d 70 6c 65 20 67 72 65 61 74 65 72 20 74  sample greater t
9090: 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 20 20 2a  han or equal.  *
90a0: 2a 20 74 6f 20 70 52 65 63 2e 20 49 66 20 70 52  * to pRec. If pR
90b0: 65 63 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69  ec contains a si
90c0: 6e 67 6c 65 20 66 69 65 6c 64 2c 20 74 68 65 20  ngle field, the 
90d0: 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73 20 74  set of samples t
90e0: 6f 20 73 65 61 72 63 68 0a 20 20 2a 2a 20 69 73  o search.  ** is
90f0: 20 73 69 6d 70 6c 79 20 74 68 65 20 61 53 61 6d   simply the aSam
9100: 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20 49 66 20  ple[] array. If 
9110: 74 68 65 20 73 61 6d 70 6c 65 73 20 69 6e 20 61  the samples in a
9120: 53 61 6d 70 6c 65 5b 5d 20 63 6f 6e 74 61 69 6e  Sample[] contain
9130: 20 6d 6f 72 65 0a 20 20 2a 2a 20 74 68 61 6e 20   more.  ** than 
9140: 6f 6e 65 20 66 69 65 6c 64 73 2c 20 61 6c 6c 20  one fields, all 
9150: 66 69 65 6c 64 73 20 66 6f 6c 6c 6f 77 69 6e 67  fields following
9160: 20 74 68 65 20 66 69 72 73 74 20 61 72 65 20 69   the first are i
9170: 67 6e 6f 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  gnored..  **.  *
9180: 2a 20 49 66 20 70 52 65 63 20 63 6f 6e 74 61 69  * If pRec contai
9190: 6e 73 20 4e 20 66 69 65 6c 64 73 2c 20 77 68 65  ns N fields, whe
91a0: 72 65 20 4e 20 69 73 20 6d 6f 72 65 20 74 68 61  re N is more tha
91b0: 6e 20 6f 6e 65 2c 20 74 68 65 6e 20 61 73 20 77  n one, then as w
91c0: 65 6c 6c 20 61 73 20 74 68 65 0a 20 20 2a 2a 20  ell as the.  ** 
91d0: 73 61 6d 70 6c 65 73 20 69 6e 20 61 53 61 6d 70  samples in aSamp
91e0: 6c 65 5b 5d 20 28 74 72 75 6e 63 61 74 65 64 20  le[] (truncated 
91f0: 74 6f 20 4e 20 66 69 65 6c 64 73 29 2c 20 74 68  to N fields), th
9200: 65 20 73 65 61 72 63 68 20 61 6c 73 6f 20 68 61  e search also ha
9210: 73 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e 73 69 64  s to.  ** consid
9220: 65 72 20 70 72 65 66 69 78 65 73 20 6f 66 20 74  er prefixes of t
9230: 68 6f 73 65 20 73 61 6d 70 6c 65 73 2e 20 46 6f  hose samples. Fo
9240: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
9250: 65 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73  e set of samples
9260: 0a 20 20 2a 2a 20 69 6e 20 61 53 61 6d 70 6c 65  .  ** in aSample
9270: 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   is:.  **.  **  
9280: 20 20 20 61 53 61 6d 70 6c 65 5b 30 5d 20 3d 20     aSample[0] = 
9290: 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20  (a, 5) .  **    
92a0: 20 61 53 61 6d 70 6c 65 5b 31 5d 20 3d 20 28 61   aSample[1] = (a
92b0: 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20  , 10) .  **     
92c0: 61 53 61 6d 70 6c 65 5b 32 5d 20 3d 20 28 62 2c  aSample[2] = (b,
92d0: 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53   5) .  **     aS
92e0: 61 6d 70 6c 65 5b 33 5d 20 3d 20 28 63 2c 20 31  ample[3] = (c, 1
92f0: 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 61 53  00) .  **     aS
9300: 61 6d 70 6c 65 5b 34 5d 20 3d 20 28 63 2c 20 31  ample[4] = (c, 1
9310: 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  05).  **.  ** Th
9320: 65 6e 20 74 68 65 20 73 65 61 72 63 68 20 73 70  en the search sp
9330: 61 63 65 20 73 68 6f 75 6c 64 20 69 64 65 61 6c  ace should ideal
9340: 6c 79 20 62 65 20 74 68 65 20 73 61 6d 70 6c 65  ly be the sample
9350: 73 20 61 62 6f 76 65 20 61 6e 64 20 74 68 65 20  s above and the 
9360: 0a 20 20 2a 2a 20 75 6e 69 71 75 65 20 70 72 65  .  ** unique pre
9370: 66 69 78 65 73 20 5b 61 5d 2c 20 5b 62 5d 20 61  fixes [a], [b] a
9380: 6e 64 20 5b 63 5d 2e 20 42 75 74 20 73 69 6e 63  nd [c]. But sinc
9390: 65 20 74 68 61 74 20 69 73 20 68 61 72 64 20 74  e that is hard t
93a0: 6f 20 6f 72 67 61 6e 69 7a 65 2c 20 0a 20 20 2a  o organize, .  *
93b0: 2a 20 74 68 65 20 63 6f 64 65 20 61 63 74 75 61  * the code actua
93c0: 6c 6c 79 20 73 65 61 72 63 68 65 73 20 74 68 69  lly searches thi
93d0: 73 20 73 65 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  s set:.  **.  **
93e0: 20 20 20 20 20 30 3a 20 28 61 29 20 0a 20 20 2a       0: (a) .  *
93f0: 2a 20 20 20 20 20 31 3a 20 28 61 2c 20 35 29 20  *     1: (a, 5) 
9400: 0a 20 20 2a 2a 20 20 20 20 20 32 3a 20 28 61 2c  .  **     2: (a,
9410: 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20 20 33   10) .  **     3
9420: 3a 20 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20  : (a, 10) .  ** 
9430: 20 20 20 20 34 3a 20 28 62 29 20 0a 20 20 2a 2a      4: (b) .  **
9440: 20 20 20 20 20 35 3a 20 28 62 2c 20 35 29 20 0a       5: (b, 5) .
9450: 20 20 2a 2a 20 20 20 20 20 36 3a 20 28 63 29 20    **     6: (c) 
9460: 0a 20 20 2a 2a 20 20 20 20 20 37 3a 20 28 63 2c  .  **     7: (c,
9470: 20 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20   100) .  **     
9480: 38 3a 20 28 63 2c 20 31 30 35 29 0a 20 20 2a 2a  8: (c, 105).  **
9490: 20 20 20 20 20 39 3a 20 28 63 2c 20 31 30 35 29       9: (c, 105)
94a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65  .  **.  ** For e
94b0: 61 63 68 20 73 61 6d 70 6c 65 20 69 6e 20 74 68  ach sample in th
94c0: 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72 61  e aSample[] arra
94d0: 79 2c 20 4e 20 73 61 6d 70 6c 65 73 20 61 72 65  y, N samples are
94e0: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 0a   present in the.
94f0: 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65 20 73    ** effective s
9500: 61 6d 70 6c 65 20 61 72 72 61 79 2e 20 49 6e 20  ample array. In 
9510: 74 68 65 20 61 62 6f 76 65 2c 20 73 61 6d 70 6c  the above, sampl
9520: 65 73 20 30 20 61 6e 64 20 31 20 61 72 65 20 62  es 0 and 1 are b
9530: 61 73 65 64 20 6f 6e 20 0a 20 20 2a 2a 20 73 61  ased on .  ** sa
9540: 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b 30 5d 2e  mple aSample[0].
9550: 20 53 61 6d 70 6c 65 73 20 32 20 61 6e 64 20 33   Samples 2 and 3
9560: 20 6f 6e 20 61 53 61 6d 70 6c 65 5b 31 5d 20 65   on aSample[1] e
9570: 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 66  tc..  **.  ** Of
9580: 74 65 6e 2c 20 73 61 6d 70 6c 65 20 69 20 6f 66  ten, sample i of
9590: 20 65 61 63 68 20 62 6c 6f 63 6b 20 6f 66 20 4e   each block of N
95a0: 20 65 66 66 65 63 74 69 76 65 20 73 61 6d 70 6c   effective sampl
95b0: 65 73 20 68 61 73 20 28 69 2b 31 29 20 66 69 65  es has (i+1) fie
95c0: 6c 64 73 2e 0a 20 20 2a 2a 20 45 78 63 65 70 74  lds..  ** Except
95d0: 2c 20 65 61 63 68 20 73 61 6d 70 6c 65 20 6d 61  , each sample ma
95e0: 79 20 62 65 20 65 78 74 65 6e 64 65 64 20 74 6f  y be extended to
95f0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 69 74 20   ensure that it 
9600: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
9610: 6f 72 0a 20 20 2a 2a 20 65 71 75 61 6c 20 74 6f  or.  ** equal to
9620: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 61   the previous sa
9630: 6d 70 6c 65 20 69 6e 20 74 68 65 20 61 72 72 61  mple in the arra
9640: 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  y. For example, 
9650: 69 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 0a 20  in the above, . 
9660: 20 2a 2a 20 73 61 6d 70 6c 65 20 32 20 69 73 20   ** sample 2 is 
9670: 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65  the first sample
9680: 20 6f 66 20 61 20 62 6c 6f 63 6b 20 6f 66 20 4e   of a block of N
9690: 20 73 61 6d 70 6c 65 73 2c 20 73 6f 20 61 74 20   samples, so at 
96a0: 66 69 72 73 74 20 69 74 20 0a 20 20 2a 2a 20 61  first it .  ** a
96b0: 70 70 65 61 72 73 20 74 68 61 74 20 69 74 20 73  ppears that it s
96c0: 68 6f 75 6c 64 20 62 65 20 31 20 66 69 65 6c 64  hould be 1 field
96d0: 20 69 6e 20 73 69 7a 65 2e 20 48 6f 77 65 76 65   in size. Howeve
96e0: 72 2c 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 61  r, that would ma
96f0: 6b 65 20 69 74 20 0a 20 20 2a 2a 20 73 6d 61 6c  ke it .  ** smal
9700: 6c 65 72 20 74 68 61 6e 20 73 61 6d 70 6c 65 20  ler than sample 
9710: 31 2c 20 73 6f 20 74 68 65 20 62 69 6e 61 72 79  1, so the binary
9720: 20 73 65 61 72 63 68 20 77 6f 75 6c 64 20 6e 6f   search would no
9730: 74 20 77 6f 72 6b 2e 20 41 73 20 61 20 72 65 73  t work. As a res
9740: 75 6c 74 2c 20 0a 20 20 2a 2a 20 69 74 20 69 73  ult, .  ** it is
9750: 20 65 78 74 65 6e 64 65 64 20 74 6f 20 74 77 6f   extended to two
9760: 20 66 69 65 6c 64 73 2e 20 54 68 65 20 64 75 70   fields. The dup
9770: 6c 69 63 61 74 65 73 20 74 68 61 74 20 74 68 69  licates that thi
9780: 73 20 63 72 65 61 74 65 73 20 64 6f 20 6e 6f 74  s creates do not
9790: 20 0a 20 20 2a 2a 20 63 61 75 73 65 20 61 6e 79   .  ** cause any
97a0: 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
97b0: 20 20 6e 46 69 65 6c 64 20 3d 20 70 52 65 63 2d    nField = pRec-
97c0: 3e 6e 46 69 65 6c 64 3b 0a 20 20 69 43 6f 6c 20  >nField;.  iCol 
97d0: 3d 20 30 3b 0a 20 20 69 53 61 6d 70 6c 65 20 3d  = 0;.  iSample =
97e0: 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 2a   pIdx->nSample *
97f0: 20 6e 46 69 65 6c 64 3b 0a 20 20 64 6f 7b 0a 20   nField;.  do{. 
9800: 20 20 20 69 6e 74 20 69 53 61 6d 70 3b 20 20 20     int iSamp;   
9810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9820: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 53 61   /* Index in aSa
9830: 6d 70 6c 65 5b 5d 20 6f 66 20 74 65 73 74 20 73  mple[] of test s
9840: 61 6d 70 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74  ample */.    int
9850: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
9860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9870: 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 69  mber of fields i
9880: 6e 20 74 65 73 74 20 73 61 6d 70 6c 65 20 2a 2f  n test sample */
9890: 0a 0a 20 20 20 20 69 54 65 73 74 20 3d 20 28 69  ..    iTest = (i
98a0: 4d 69 6e 2b 69 53 61 6d 70 6c 65 29 2f 32 3b 0a  Min+iSample)/2;.
98b0: 20 20 20 20 69 53 61 6d 70 20 3d 20 69 54 65 73      iSamp = iTes
98c0: 74 20 2f 20 6e 46 69 65 6c 64 3b 0a 20 20 20 20  t / nField;.    
98d0: 69 66 28 20 69 53 61 6d 70 3e 30 20 29 7b 0a 20  if( iSamp>0 ){. 
98e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72 6f 70       /* The prop
98f0: 6f 73 65 64 20 65 66 66 65 63 74 69 76 65 20 73  osed effective s
9900: 61 6d 70 6c 65 20 69 73 20 61 20 70 72 65 66 69  ample is a prefi
9910: 78 20 6f 66 20 73 61 6d 70 6c 65 20 61 53 61 6d  x of sample aSam
9920: 70 6c 65 5b 69 53 61 6d 70 5d 2e 0a 20 20 20 20  ple[iSamp]..    
9930: 20 20 2a 2a 20 53 70 65 63 69 66 69 63 61 6c 6c    ** Specificall
9940: 79 2c 20 74 68 65 20 73 68 6f 72 74 65 73 74 20  y, the shortest 
9950: 70 72 65 66 69 78 20 6f 66 20 61 74 20 6c 65 61  prefix of at lea
9960: 73 74 20 28 31 20 2b 20 69 54 65 73 74 25 6e 46  st (1 + iTest%nF
9970: 69 65 6c 64 29 20 0a 20 20 20 20 20 20 2a 2a 20  ield) .      ** 
9980: 66 69 65 6c 64 73 20 74 68 61 74 20 69 73 20 67  fields that is g
9990: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
99a0: 70 72 65 76 69 6f 75 73 20 65 66 66 65 63 74 69  previous effecti
99b0: 76 65 20 73 61 6d 70 6c 65 2e 20 20 2a 2f 0a 20  ve sample.  */. 
99c0: 20 20 20 20 20 66 6f 72 28 6e 3d 28 69 54 65 73       for(n=(iTes
99d0: 74 20 25 20 6e 46 69 65 6c 64 29 20 2b 20 31 3b  t % nField) + 1;
99e0: 20 6e 3c 6e 46 69 65 6c 64 3b 20 6e 2b 2b 29 7b   n<nField; n++){
99f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53 61  .        if( aSa
9a00: 6d 70 6c 65 5b 69 53 61 6d 70 2d 31 5d 2e 61 6e  mple[iSamp-1].an
9a10: 4c 74 5b 6e 2d 31 5d 21 3d 61 53 61 6d 70 6c 65  Lt[n-1]!=aSample
9a20: 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e 2d 31  [iSamp].anLt[n-1
9a30: 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
9a40: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
9a50: 20 20 20 20 6e 20 3d 20 69 54 65 73 74 20 2b 20      n = iTest + 
9a60: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 52  1;.    }..    pR
9a70: 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 3b 0a  ec->nField = n;.
9a80: 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65      res = sqlite
9a90: 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
9aa0: 72 65 28 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70  re(aSample[iSamp
9ab0: 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 53 61  ].n, aSample[iSa
9ac0: 6d 70 5d 2e 70 2c 20 70 52 65 63 29 3b 0a 20 20  mp].p, pRec);.  
9ad0: 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20    if( res<0 ){. 
9ae0: 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53       iLower = aS
9af0: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c  ample[iSamp].anL
9b00: 74 5b 6e 2d 31 5d 20 2b 20 61 53 61 6d 70 6c 65  t[n-1] + aSample
9b10: 5b 69 53 61 6d 70 5d 2e 61 6e 45 71 5b 6e 2d 31  [iSamp].anEq[n-1
9b20: 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20 3d 20  ];.      iMin = 
9b30: 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d 65 6c  iTest+1;.    }el
9b40: 73 65 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26  se if( res==0 &&
9b50: 20 6e 3c 6e 46 69 65 6c 64 20 29 7b 0a 20 20 20   n<nField ){.   
9b60: 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53 61 6d     iLower = aSam
9b70: 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b  ple[iSamp].anLt[
9b80: 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e  n-1];.      iMin
9b90: 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20   = iTest+1;.    
9ba0: 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20    res = -1;.    
9bb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 53 61  }else{.      iSa
9bc0: 6d 70 6c 65 20 3d 20 69 54 65 73 74 3b 0a 20 20  mple = iTest;.  
9bd0: 20 20 20 20 69 43 6f 6c 20 3d 20 6e 2d 31 3b 0a      iCol = n-1;.
9be0: 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
9bf0: 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 53 61 6d  res && iMin<iSam
9c00: 70 6c 65 20 29 3b 0a 20 20 69 20 3d 20 69 53 61  ple );.  i = iSa
9c10: 6d 70 6c 65 20 2f 20 6e 46 69 65 6c 64 3b 0a 0a  mple / nField;..
9c20: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
9c30: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  BUG.  /* The fol
9c40: 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74  lowing assert st
9c50: 61 74 65 6d 65 6e 74 73 20 63 68 65 63 6b 20 74  atements check t
9c60: 68 61 74 20 74 68 65 20 62 69 6e 61 72 79 20 73  hat the binary s
9c70: 65 61 72 63 68 20 63 6f 64 65 0a 20 20 2a 2a 20  earch code.  ** 
9c80: 61 62 6f 76 65 20 66 6f 75 6e 64 20 74 68 65 20  above found the 
9c90: 72 69 67 68 74 20 61 6e 73 77 65 72 2e 20 54 68  right answer. Th
9ca0: 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20  is block serves 
9cb0: 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74 68 65 72  no purpose other
9cc0: 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20 69 6e  .  ** than to in
9cd0: 76 6f 6b 65 20 74 68 65 20 61 73 73 65 72 74 73  voke the asserts
9ce0: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72  .  */.  if( pPar
9cf0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
9d00: 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69  iled==0 ){.    i
9d10: 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
9d20: 20 20 20 2f 2a 20 49 66 20 28 72 65 73 3d 3d 30     /* If (res==0
9d30: 29 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  ) is true, then 
9d40: 70 52 65 63 20 6d 75 73 74 20 62 65 20 65 71 75  pRec must be equ
9d50: 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69 2e 20  al to sample i. 
9d60: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
9d70: 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   i<pIdx->nSample
9d80: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9d90: 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64 2d 31  ( iCol==nField-1
9da0: 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d 3e   );.      pRec->
9db0: 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b  nField = nField;
9dc0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
9dd0: 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  ==sqlite3VdbeRec
9de0: 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
9df0: 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  le[i].n, aSample
9e00: 5b 69 5d 2e 70 2c 20 70 52 65 63 29 20 0a 20 20  [i].p, pRec) .  
9e10: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
9e20: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
9e30: 69 6c 65 64 20 0a 20 20 20 20 20 20 29 3b 0a 20  iled .      );. 
9e40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9e50: 2f 2a 20 55 6e 6c 65 73 73 20 69 3d 3d 70 49 64  /* Unless i==pId
9e60: 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 69 6e 64 69  x->nSample, indi
9e70: 63 61 74 69 6e 67 20 74 68 61 74 20 70 52 65 63  cating that pRec
9e80: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
9e90: 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 73 61 6d        ** all sam
9ea0: 70 6c 65 73 20 69 6e 20 74 68 65 20 61 53 61 6d  ples in the aSam
9eb0: 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20 70 52 65  ple[] array, pRe
9ec0: 63 20 6d 75 73 74 20 62 65 20 73 6d 61 6c 6c 65  c must be smalle
9ed0: 72 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20  r than the.     
9ee0: 20 2a 2a 20 28 69 43 6f 6c 2b 31 29 20 66 69 65   ** (iCol+1) fie
9ef0: 6c 64 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d  ld prefix of sam
9f00: 70 6c 65 20 69 2e 20 20 2a 2f 0a 20 20 20 20 20  ple i.  */.     
9f10: 20 61 73 73 65 72 74 28 20 69 3c 3d 70 49 64 78   assert( i<=pIdx
9f20: 2d 3e 6e 53 61 6d 70 6c 65 20 26 26 20 69 3e 3d  ->nSample && i>=
9f30: 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63 2d  0 );.      pRec-
9f40: 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 2b 31  >nField = iCol+1
9f50: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9f60: 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  i==pIdx->nSample
9f70: 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
9f80: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
9f90: 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
9fa0: 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  [i].n, aSample[i
9fb0: 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a 20 20 20  ].p, pRec)>0.   
9fc0: 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72 73          || pPars
9fd0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
9fe0: 6c 65 64 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  led );..      /*
9ff0: 20 69 66 20 69 3d 3d 30 20 61 6e 64 20 69 43 6f   if i==0 and iCo
a000: 6c 3d 3d 30 2c 20 74 68 65 6e 20 72 65 63 6f 72  l==0, then recor
a010: 64 20 70 52 65 63 20 69 73 20 73 6d 61 6c 6c 65  d pRec is smalle
a020: 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d 70 6c  r than all sampl
a030: 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  es.      ** in t
a040: 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72 72  he aSample[] arr
a050: 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ay. Otherwise, i
a060: 66 20 28 69 43 6f 6c 3e 30 29 20 74 68 65 6e 20  f (iCol>0) then 
a070: 70 52 65 63 20 6d 75 73 74 0a 20 20 20 20 20 20  pRec must.      
a080: 2a 2a 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ** be greater th
a090: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
a0a0: 68 65 20 28 69 43 6f 6c 29 20 66 69 65 6c 64 20  he (iCol) field 
a0b0: 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70 6c 65  prefix of sample
a0c0: 20 69 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   i..      ** If 
a0d0: 28 69 3e 30 29 2c 20 74 68 65 6e 20 70 52 65 63  (i>0), then pRec
a0e0: 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 67 72   must also be gr
a0f0: 65 61 74 65 72 20 74 68 61 6e 20 73 61 6d 70 6c  eater than sampl
a100: 65 20 28 69 2d 31 29 2e 20 20 2a 2f 0a 20 20 20  e (i-1).  */.   
a110: 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b     if( iCol>0 ){
a120: 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  .        pRec->n
a130: 46 69 65 6c 64 20 3d 20 69 43 6f 6c 3b 0a 20 20  Field = iCol;.  
a140: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
a150: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
a160: 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69  ompare(aSample[i
a170: 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  ].n, aSample[i].
a180: 70 2c 20 70 52 65 63 29 3c 3d 30 0a 20 20 20 20  p, pRec)<=0.    
a190: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61 72           || pPar
a1a0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
a1b0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a  iled );.      }.
a1c0: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b        if( i>0 ){
a1d0: 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e 6e  .        pRec->n
a1e0: 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64 3b 0a  Field = nField;.
a1f0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a200: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
a210: 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
a220: 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  [i-1].n, aSample
a230: 5b 69 2d 31 5d 2e 70 2c 20 70 52 65 63 29 3c 30  [i-1].p, pRec)<0
a240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
a250: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
a260: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
a270: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
a280: 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53  endif /* ifdef S
a290: 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a  QLITE_DEBUG */..
a2a0: 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
a2b0: 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 70 52      /* Record pR
a2c0: 65 63 20 69 73 20 65 71 75 61 6c 20 74 6f 20 73  ec is equal to s
a2d0: 61 6d 70 6c 65 20 69 20 2a 2f 0a 20 20 20 20 61  ample i */.    a
a2e0: 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69  ssert( iCol==nFi
a2f0: 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20 61 53 74  eld-1 );.    aSt
a300: 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c 65 5b  at[0] = aSample[
a310: 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b 0a 20  i].anLt[iCol];. 
a320: 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20 61 53     aStat[1] = aS
a330: 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b 69 43  ample[i].anEq[iC
a340: 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ol];.  }else{.  
a350: 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
a360: 6e 74 2c 20 74 68 65 20 28 69 43 6f 6c 2b 31 29  nt, the (iCol+1)
a370: 20 66 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66   field prefix of
a380: 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73 20 74   aSample[i] is t
a390: 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 2a 2a  he first .    **
a3a0: 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69 73 20   sample that is 
a3b0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 52 65  greater than pRe
a3c0: 63 2e 20 4f 72 2c 20 69 66 20 69 3d 3d 70 49 64  c. Or, if i==pId
a3d0: 78 2d 3e 6e 53 61 6d 70 6c 65 20 74 68 65 6e 20  x->nSample then 
a3e0: 70 52 65 63 0a 20 20 20 20 2a 2a 20 69 73 20 6c  pRec.    ** is l
a3f0: 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 73  arger than all s
a400: 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61 72  amples in the ar
a410: 72 61 79 2e 20 2a 2f 0a 20 20 20 20 74 52 6f 77  ray. */.    tRow
a420: 63 6e 74 20 69 55 70 70 65 72 2c 20 69 47 61 70  cnt iUpper, iGap
a430: 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 49 64  ;.    if( i>=pId
a440: 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a 20 20  x->nSample ){.  
a450: 20 20 20 20 69 55 70 70 65 72 20 3d 20 73 71 6c      iUpper = sql
a460: 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28  ite3LogEstToInt(
a470: 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  pIdx->aiRowLogEs
a480: 74 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t[0]);.    }else
a490: 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72 20 3d  {.      iUpper =
a4a0: 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 4c 74   aSample[i].anLt
a4b0: 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 0a 20  [iCol];.    }.. 
a4c0: 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e 3d 69     if( iLower>=i
a4d0: 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 69  Upper ){.      i
a4e0: 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  Gap = 0;.    }el
a4f0: 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70 20 3d  se{.      iGap =
a500: 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65 72   iUpper - iLower
a510: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a520: 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20 20  roundUp ){.     
a530: 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a 32 29   iGap = (iGap*2)
a540: 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  /3;.    }else{. 
a550: 20 20 20 20 20 69 47 61 70 20 3d 20 69 47 61 70       iGap = iGap
a560: 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 53  /3;.    }.    aS
a570: 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65 72 20  tat[0] = iLower 
a580: 2b 20 69 47 61 70 3b 0a 20 20 20 20 61 53 74 61  + iGap;.    aSta
a590: 74 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61 41 76  t[1] = pIdx->aAv
a5a0: 67 45 71 5b 69 43 6f 6c 5d 3b 0a 20 20 7d 0a 0a  gEq[iCol];.  }..
a5b0: 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65    /* Restore the
a5c0: 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 76 61   pRec->nField va
a5d0: 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  lue before retur
a5e0: 6e 69 6e 67 2e 20 20 2a 2f 0a 20 20 70 52 65 63  ning.  */.  pRec
a5f0: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c  ->nField = nFiel
a600: 64 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  d;.  return i;.}
a610: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
a620: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
a630: 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 2f 2a 0a 2a  R_STAT4 */../*.*
a640: 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 4e  * If it is not N
a650: 55 4c 4c 2c 20 70 54 65 72 6d 20 69 73 20 61 20  ULL, pTerm is a 
a660: 74 65 72 6d 20 74 68 61 74 20 70 72 6f 76 69 64  term that provid
a670: 65 73 20 61 6e 20 75 70 70 65 72 20 6f 72 20 6c  es an upper or l
a680: 6f 77 65 72 0a 2a 2a 20 62 6f 75 6e 64 20 6f 6e  ower.** bound on
a690: 20 61 20 72 61 6e 67 65 20 73 63 61 6e 2e 20 57   a range scan. W
a6a0: 69 74 68 6f 75 74 20 63 6f 6e 73 69 64 65 72 69  ithout consideri
a6b0: 6e 67 20 70 54 65 72 6d 2c 20 69 74 20 69 73 20  ng pTerm, it is 
a6c0: 65 73 74 69 6d 61 74 65 64 20 0a 2a 2a 20 74 68  estimated .** th
a6d0: 61 74 20 74 68 65 20 73 63 61 6e 20 77 69 6c 6c  at the scan will
a6e0: 20 76 69 73 69 74 20 6e 4e 65 77 20 72 6f 77 73   visit nNew rows
a6f0: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
a700: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
a710: 65 72 0a 2a 2a 20 65 73 74 69 6d 61 74 65 64 20  er.** estimated 
a720: 74 6f 20 62 65 20 76 69 73 69 74 65 64 20 61 66  to be visited af
a730: 74 65 72 20 74 61 6b 69 6e 67 20 70 54 65 72 6d  ter taking pTerm
a740: 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2e 0a 2a   into account..*
a750: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73 65 72  *.** If the user
a760: 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63   explicitly spec
a770: 69 66 69 65 64 20 61 20 6c 69 6b 65 6c 69 68 6f  ified a likeliho
a780: 6f 64 28 29 20 76 61 6c 75 65 20 66 6f 72 20 74  od() value for t
a790: 68 69 73 20 74 65 72 6d 2c 0a 2a 2a 20 74 68 65  his term,.** the
a7a0: 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
a7b0: 75 65 20 69 73 20 74 68 65 20 6c 69 6b 65 6c 69  ue is the likeli
a7c0: 68 6f 6f 64 20 6d 75 6c 74 69 70 6c 69 65 64 20  hood multiplied 
a7d0: 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  by the number of
a7e0: 0a 2a 2a 20 69 6e 70 75 74 20 72 6f 77 73 2e 20  .** input rows. 
a7f0: 4f 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20  Otherwise, this 
a800: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
a810: 20 74 68 61 74 20 61 6e 20 22 49 53 20 4e 4f 54   that an "IS NOT
a820: 20 4e 55 4c 4c 22 20 74 65 72 6d 0a 2a 2a 20 68   NULL" term.** h
a830: 61 73 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20  as a likelihood 
a840: 6f 66 20 30 2e 35 30 2c 20 61 6e 64 20 61 6e 79  of 0.50, and any
a850: 20 6f 74 68 65 72 20 74 65 72 6d 20 61 20 6c 69   other term a li
a860: 6b 65 6c 69 68 6f 6f 64 20 6f 66 20 30 2e 32 35  kelihood of 0.25
a870: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 6f 67 45  ..*/.static LogE
a880: 73 74 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a  st whereRangeAdj
a890: 75 73 74 28 57 68 65 72 65 54 65 72 6d 20 2a 70  ust(WhereTerm *p
a8a0: 54 65 72 6d 2c 20 4c 6f 67 45 73 74 20 6e 4e 65  Term, LogEst nNe
a8b0: 77 29 7b 0a 20 20 4c 6f 67 45 73 74 20 6e 52 65  w){.  LogEst nRe
a8c0: 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20  t = nNew;.  if( 
a8d0: 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28  pTerm ){.    if(
a8e0: 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f   pTerm->truthPro
a8f0: 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52  b<=0 ){.      nR
a900: 65 74 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75  et += pTerm->tru
a910: 74 68 50 72 6f 62 3b 0a 20 20 20 20 7d 65 6c 73  thProb;.    }els
a920: 65 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74  e if( (pTerm->wt
a930: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55  Flags & TERM_VNU
a940: 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LL)==0 ){.      
a950: 6e 52 65 74 20 2d 3d 20 32 30 3b 20 20 20 20 20  nRet -= 20;     
a960: 20 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73     assert( 20==s
a970: 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20  qlite3LogEst(4) 
a980: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
a990: 65 74 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 0a  eturn nRet;.}...
a9a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
a9b0: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
a9c0: 41 54 34 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  AT4./*.** Return
a9d0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 66 6f   the affinity fo
a9e0: 72 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  r a single colum
a9f0: 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 0a 2a  n of an index..*
aa00: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 73 71  /.static char sq
aa10: 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e  lite3IndexColumn
aa20: 41 66 66 69 6e 69 74 79 28 73 71 6c 69 74 65 33  Affinity(sqlite3
aa30: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64   *db, Index *pId
aa40: 78 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  x, int iCol){.  
aa50: 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20  assert( iCol>=0 
aa60: 26 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 43  && iCol<pIdx->nC
aa70: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20 21  olumn );.  if( !
aa80: 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 20 29 7b  pIdx->zColAff ){
aa90: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
aaa0: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72  IndexAffinityStr
aab0: 28 64 62 2c 20 70 49 64 78 29 3d 3d 30 20 29 20  (db, pIdx)==0 ) 
aac0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
aad0: 46 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65  F_BLOB;.  }.  re
aae0: 74 75 72 6e 20 70 49 64 78 2d 3e 7a 43 6f 6c 41  turn pIdx->zColA
aaf0: 66 66 5b 69 43 6f 6c 5d 3b 0a 7d 0a 23 65 6e 64  ff[iCol];.}.#end
ab00: 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  if...#ifdef SQLI
ab10: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
ab20: 4f 52 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a 2a 20  OR_STAT4./* .** 
ab30: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
ab40: 20 63 61 6c 6c 65 64 20 74 6f 20 65 73 74 69 6d   called to estim
ab50: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
ab60: 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62  f rows visited b
ab70: 79 20 61 0a 2a 2a 20 72 61 6e 67 65 2d 73 63 61  y a.** range-sca
ab80: 6e 20 6f 6e 20 61 20 73 6b 69 70 2d 73 63 61 6e  n on a skip-scan
ab90: 20 69 6e 64 65 78 2e 20 46 6f 72 20 65 78 61 6d   index. For exam
aba0: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45  ple:.**.**   CRE
abb0: 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20  ATE INDEX i1 ON 
abc0: 74 31 28 61 2c 20 62 2c 20 63 29 3b 0a 2a 2a 20  t1(a, b, c);.** 
abd0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
abe0: 74 31 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44  t1 WHERE a=? AND
abf0: 20 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44   c BETWEEN ? AND
ac00: 20 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65 20   ?;.**.** Value 
ac10: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73 20 63  pLoop->nOut is c
ac20: 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20  urrently set to 
ac30: 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75  the estimated nu
ac40: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 2a 2a  mber of rows .**
ac50: 20 76 69 73 69 74 65 64 20 66 6f 72 20 73 63 61   visited for sca
ac60: 6e 6e 69 6e 67 20 28 61 3d 3f 20 41 4e 44 20 62  nning (a=? AND b
ac70: 3d 3f 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69  =?). This functi
ac80: 6f 6e 20 72 65 64 75 63 65 73 20 74 68 61 74 20  on reduces that 
ac90: 65 73 74 69 6d 61 74 65 20 0a 2a 2a 20 62 79 20  estimate .** by 
aca0: 73 6f 6d 65 20 66 61 63 74 6f 72 20 74 6f 20 61  some factor to a
acb0: 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 28  ccount for the (
acc0: 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20  c BETWEEN ? AND 
acd0: 3f 29 20 65 78 70 72 65 73 73 69 6f 6e 20 62 61  ?) expression ba
ace0: 73 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74  sed.** on the st
acf0: 61 74 34 20 64 61 74 61 20 66 6f 72 20 74 68 65  at4 data for the
ad00: 20 69 6e 64 65 78 2e 20 74 68 69 73 20 73 63 61   index. this sca
ad10: 6e 20 77 69 6c 6c 20 62 65 20 70 65 66 6f 72 6d  n will be peform
ad20: 65 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20  ed multiple .** 
ad30: 74 69 6d 65 73 20 28 6f 6e 63 65 20 66 6f 72 20  times (once for 
ad40: 65 61 63 68 20 28 61 2c 62 29 20 63 6f 6d 62 69  each (a,b) combi
ad50: 6e 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 74 63  nation that matc
ad60: 68 65 73 20 61 3d 3f 29 20 69 73 20 64 65 61 6c  hes a=?) is deal
ad70: 74 20 77 69 74 68 20 0a 2a 2a 20 62 79 20 74 68  t with .** by th
ad80: 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
ad90: 49 74 20 64 6f 65 73 20 74 68 69 73 20 62 79 20  It does this by 
ada0: 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
adb0: 20 61 6c 6c 20 73 74 61 74 34 20 73 61 6d 70 6c   all stat4 sampl
adc0: 65 73 2c 20 63 6f 6d 70 61 72 69 6e 67 20 76 61  es, comparing va
add0: 6c 75 65 73 0a 2a 2a 20 65 78 74 72 61 63 74 65  lues.** extracte
ade0: 64 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e  d from pLower an
adf0: 64 20 70 55 70 70 65 72 20 77 69 74 68 20 74 68  d pUpper with th
ae00: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
ae10: 63 6f 6c 75 6d 6e 20 69 6e 20 65 61 63 68 0a 2a  column in each.*
ae20: 2a 20 73 61 6d 70 6c 65 2e 20 49 66 20 4c 20 61  * sample. If L a
ae30: 6e 64 20 55 20 61 72 65 20 74 68 65 20 6e 75 6d  nd U are the num
ae40: 62 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 66  ber of samples f
ae50: 6f 75 6e 64 20 74 6f 20 62 65 20 6c 65 73 73 20  ound to be less 
ae60: 74 68 61 6e 20 6f 72 0a 2a 2a 20 65 71 75 61 6c  than or.** equal
ae70: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 73 20 65   to the values e
ae80: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c  xtracted from pL
ae90: 6f 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20  ower and pUpper 
aea0: 72 65 73 70 65 63 74 69 76 65 6c 79 2c 20 61 6e  respectively, an
aeb0: 64 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 74 6f  d.** N is the to
aec0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  tal number of sa
aed0: 6d 70 6c 65 73 2c 20 74 68 65 20 70 4c 6f 6f 70  mples, the pLoop
aee0: 2d 3e 6e 4f 75 74 20 76 61 6c 75 65 20 69 73 20  ->nOut value is 
aef0: 61 64 6a 75 73 74 65 64 0a 2a 2a 20 61 73 20 66  adjusted.** as f
af00: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
af10: 6e 4f 75 74 20 3d 20 6e 4f 75 74 20 2a 20 28 20  nOut = nOut * ( 
af20: 6d 69 6e 28 55 20 2d 20 4c 2c 20 31 29 20 2f 20  min(U - L, 1) / 
af30: 4e 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4c 6f  N ).**.** If pLo
af40: 77 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20  wer is NULL, or 
af50: 61 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62  a value cannot b
af60: 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
af70: 20 74 68 65 20 74 65 72 6d 2c 20 4c 20 69 73 0a   the term, L is.
af80: 2a 2a 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  ** set to zero. 
af90: 49 66 20 70 55 70 70 65 72 20 69 73 20 4e 55 4c  If pUpper is NUL
afa0: 4c 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61  L, or a value ca
afb0: 6e 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65  nnot be extracte
afc0: 64 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20 55 20  d from it,.** U 
afd0: 69 73 20 73 65 74 20 74 6f 20 4e 2e 0a 2a 2a 0a  is set to N..**.
afe0: 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69  ** Normally, thi
aff0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  s function sets 
b000: 2a 70 62 44 6f 6e 65 20 74 6f 20 31 20 62 65 66  *pbDone to 1 bef
b010: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 48  ore returning. H
b020: 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 6e 6f  owever,.** if no
b030: 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 65 78   value can be ex
b040: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 65 69 74  tracted from eit
b050: 68 65 72 20 70 4c 6f 77 65 72 20 6f 72 20 70 55  her pLower or pU
b060: 70 70 65 72 20 28 61 6e 64 20 73 6f 20 74 68 65  pper (and so the
b070: 0a 2a 2a 20 65 73 74 69 6d 61 74 65 20 6f 66 20  .** estimate of 
b080: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
b090: 77 73 20 64 65 6c 69 76 65 72 65 64 20 72 65 6d  ws delivered rem
b0a0: 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 29 2c  ains unchanged),
b0b0: 20 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69 73 20 6c   *pbDone.** is l
b0c0: 65 66 74 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a  eft as is..**.**
b0d0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
b0e0: 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  urs, an SQLite e
b0f0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
b100: 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
b110: 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e  , .** SQLITE_OK.
b120: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
b130: 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63 61  hereRangeSkipSca
b140: 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
b150: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
b160: 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
b170: 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
b180: 74 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  t */.  WhereTerm
b190: 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c   *pLower,   /* L
b1a0: 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  ower bound on th
b1b0: 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e  e range. ex: "x>
b1c0: 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55  123" Might be NU
b1d0: 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  LL */.  WhereTer
b1e0: 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20  m *pUpper,   /* 
b1f0: 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Upper bound on t
b200: 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
b210: 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e  <455" Might be N
b220: 55 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  ULL */.  WhereLo
b230: 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 2f 2a  op *pLoop,    /*
b240: 20 55 70 64 61 74 65 20 74 68 65 20 2e 6e 4f 75   Update the .nOu
b250: 74 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  t value of this 
b260: 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  loop */.  int *p
b270: 62 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20 2f  bDone          /
b280: 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66  * Set to true if
b290: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 65 78   at least one ex
b2a0: 70 72 2e 20 76 61 6c 75 65 20 65 78 74 72 61 63  pr. value extrac
b2b0: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65  ted */.){.  Inde
b2c0: 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  x *p = pLoop->u.
b2d0: 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20  btree.pIndex;.  
b2e0: 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d  int nEq = pLoop-
b2f0: 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20  >u.btree.nEq;.  
b300: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
b310: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
b320: 6e 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a 20 20 69  nLower = -1;.  i
b330: 6e 74 20 6e 55 70 70 65 72 20 3d 20 70 2d 3e 6e  nt nUpper = p->n
b340: 53 61 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e 74 20  Sample+1;.  int 
b350: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
b360: 20 20 75 38 20 61 66 66 20 3d 20 73 71 6c 69 74    u8 aff = sqlit
b370: 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66  e3IndexColumnAff
b380: 69 6e 69 74 79 28 64 62 2c 20 70 2c 20 6e 45 71  inity(db, p, nEq
b390: 29 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  );.  CollSeq *pC
b3a0: 6f 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65  oll;.  .  sqlite
b3b0: 33 5f 76 61 6c 75 65 20 2a 70 31 20 3d 20 30 3b  3_value *p1 = 0;
b3c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
b3d0: 75 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f  ue extracted fro
b3e0: 6d 20 70 4c 6f 77 65 72 20 2a 2f 0a 20 20 73 71  m pLower */.  sq
b3f0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 32 20  lite3_value *p2 
b400: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
b410: 20 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64   Value extracted
b420: 20 66 72 6f 6d 20 70 55 70 70 65 72 20 2a 2f 0a   from pUpper */.
b430: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
b440: 2a 70 56 61 6c 20 3d 20 30 3b 20 20 20 20 20 20  *pVal = 0;      
b450: 20 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61    /* Value extra
b460: 63 74 65 64 20 66 72 6f 6d 20 72 65 63 6f 72 64  cted from record
b470: 20 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73   */..  pColl = s
b480: 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
b490: 53 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 61  Seq(pParse, p->a
b4a0: 7a 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20 20 69  zColl[nEq]);.  i
b4b0: 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20  f( pLower ){.   
b4c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
b4d0: 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  t4ValueFromExpr(
b4e0: 70 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2d 3e  pParse, pLower->
b4f0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61  pExpr->pRight, a
b500: 66 66 2c 20 26 70 31 29 3b 0a 20 20 20 20 6e 4c  ff, &p1);.    nL
b510: 6f 77 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  ower = 0;.  }.  
b520: 69 66 28 20 70 55 70 70 65 72 20 26 26 20 72 63  if( pUpper && rc
b530: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
b540: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53     rc = sqlite3S
b550: 74 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70  tat4ValueFromExp
b560: 72 28 70 50 61 72 73 65 2c 20 70 55 70 70 65 72  r(pParse, pUpper
b570: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  ->pExpr->pRight,
b580: 20 61 66 66 2c 20 26 70 32 29 3b 0a 20 20 20 20   aff, &p2);.    
b590: 6e 55 70 70 65 72 20 3d 20 70 32 20 3f 20 30 20  nUpper = p2 ? 0 
b5a0: 3a 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a 20 20  : p->nSample;.  
b5b0: 7d 0a 0a 20 20 69 66 28 20 70 31 20 7c 7c 20 70  }..  if( p1 || p
b5c0: 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  2 ){.    int i;.
b5d0: 20 20 20 20 69 6e 74 20 6e 44 69 66 66 3b 0a 20      int nDiff;. 
b5e0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
b5f0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70  SQLITE_OK && i<p
b600: 2d 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b  ->nSample; i++){
b610: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
b620: 74 65 33 53 74 61 74 34 43 6f 6c 75 6d 6e 28 64  te3Stat4Column(d
b630: 62 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d  b, p->aSample[i]
b640: 2e 70 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69  .p, p->aSample[i
b650: 5d 2e 6e 2c 20 6e 45 71 2c 20 26 70 56 61 6c 29  ].n, nEq, &pVal)
b660: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
b670: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31 20  SQLITE_OK && p1 
b680: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
b690: 65 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  es = sqlite3MemC
b6a0: 6f 6d 70 61 72 65 28 70 31 2c 20 70 56 61 6c 2c  ompare(p1, pVal,
b6b0: 20 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20   pColl);.       
b6c0: 20 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 4c   if( res>=0 ) nL
b6d0: 6f 77 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  ower++;.      }.
b6e0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
b6f0: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 32 20 29 7b  LITE_OK && p2 ){
b700: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73  .        int res
b710: 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d   = sqlite3MemCom
b720: 70 61 72 65 28 70 32 2c 20 70 56 61 6c 2c 20 70  pare(p2, pVal, p
b730: 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  Coll);.        i
b740: 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 55 70 70  f( res>=0 ) nUpp
b750: 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  er++;.      }.  
b760: 20 20 7d 0a 20 20 20 20 6e 44 69 66 66 20 3d 20    }.    nDiff = 
b770: 28 6e 55 70 70 65 72 20 2d 20 6e 4c 6f 77 65 72  (nUpper - nLower
b780: 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 66 66  );.    if( nDiff
b790: 3c 3d 30 20 29 20 6e 44 69 66 66 20 3d 20 31 3b  <=0 ) nDiff = 1;
b7a0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
b7b0: 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70  e is both an upp
b7c0: 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75  er and lower bou
b7d0: 6e 64 20 73 70 65 63 69 66 69 65 64 2c 20 61 6e  nd specified, an
b7e0: 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f  d the .    ** co
b7f0: 6d 70 61 72 69 73 6f 6e 73 20 69 6e 64 69 63 61  mparisons indica
b800: 74 65 20 74 68 61 74 20 74 68 65 79 20 61 72 65  te that they are
b810: 20 63 6c 6f 73 65 20 74 6f 67 65 74 68 65 72 2c   close together,
b820: 20 75 73 65 20 74 68 65 20 66 61 6c 6c 62 61 63   use the fallbac
b830: 6b 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20  k.    ** method 
b840: 28 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65  (assume that the
b850: 20 73 63 61 6e 20 76 69 73 69 74 73 20 31 2f 36   scan visits 1/6
b860: 34 20 6f 66 20 74 68 65 20 72 6f 77 73 29 20 66  4 of the rows) f
b870: 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 20 20  or estimating.  
b880: 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20    ** the number 
b890: 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 2e  of rows visited.
b8a0: 20 4f 74 68 65 72 77 69 73 65 2c 20 65 73 74 69   Otherwise, esti
b8b0: 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
b8c0: 6f 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 75  of rows.    ** u
b8d0: 73 69 6e 67 20 74 68 65 20 6d 65 74 68 6f 64 20  sing the method 
b8e0: 64 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65  described in the
b8f0: 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20   header comment 
b900: 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  for this functio
b910: 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 44  n. */.    if( nD
b920: 69 66 66 21 3d 31 20 7c 7c 20 70 55 70 70 65 72  iff!=1 || pUpper
b930: 3d 3d 30 20 7c 7c 20 70 4c 6f 77 65 72 3d 3d 30  ==0 || pLower==0
b940: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41   ){.      int nA
b950: 64 6a 75 73 74 20 3d 20 28 73 71 6c 69 74 65 33  djust = (sqlite3
b960: 4c 6f 67 45 73 74 28 70 2d 3e 6e 53 61 6d 70 6c  LogEst(p->nSampl
b970: 65 29 20 2d 20 73 71 6c 69 74 65 33 4c 6f 67 45  e) - sqlite3LogE
b980: 73 74 28 6e 44 69 66 66 29 29 3b 0a 20 20 20 20  st(nDiff));.    
b990: 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2d 3d    pLoop->nOut -=
b9a0: 20 6e 41 64 6a 75 73 74 3b 0a 20 20 20 20 20 20   nAdjust;.      
b9b0: 2a 70 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  *pbDone = 1;.   
b9c0: 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
b9d0: 31 30 2c 20 28 22 72 61 6e 67 65 20 73 6b 69 70  10, ("range skip
b9e0: 2d 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25  -scan regions: %
b9f0: 75 2e 2e 25 75 20 20 61 64 6a 75 73 74 3d 25 64  u..%u  adjust=%d
ba00: 20 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   est=%d\n",.    
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba20: 20 20 20 20 20 20 20 6e 4c 6f 77 65 72 2c 20 6e         nLower, n
ba30: 55 70 70 65 72 2c 20 6e 41 64 6a 75 73 74 2a 2d  Upper, nAdjust*-
ba40: 31 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29 29  1, pLoop->nOut))
ba50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65  ;.    }..  }else
ba60: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  {.    assert( *p
ba70: 62 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20 7d 0a  bDone==0 );.  }.
ba80: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
ba90: 72 65 65 28 70 31 29 3b 0a 20 20 73 71 6c 69 74  ree(p1);.  sqlit
baa0: 65 33 56 61 6c 75 65 46 72 65 65 28 70 32 29 3b  e3ValueFree(p2);
bab0: 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
bac0: 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65  ree(pVal);..  re
bad0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
bae0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
baf0: 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54  LE_STAT3_OR_STAT
bb00: 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  4 */../*.** This
bb10: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
bb20: 64 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68  d to estimate th
bb30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
bb40: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69   that will be vi
bb50: 73 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e  sited.** by scan
bb60: 6e 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f  ning an index fo
bb70: 72 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c  r a range of val
bb80: 75 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d  ues. The range m
bb90: 61 79 20 68 61 76 65 20 61 6e 20 75 70 70 65 72  ay have an upper
bba0: 0a 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77  .** bound, a low
bbb0: 65 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74  er bound, or bot
bbc0: 68 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  h. The WHERE cla
bbd0: 75 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 73  use terms that s
bbe0: 65 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20  et the upper.** 
bbf0: 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73  and lower bounds
bc00: 20 61 72 65 20 72 65 70 72 65 73 65 6e 74 65 64   are represented
bc10: 20 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70   by pLower and p
bc20: 55 70 70 65 72 20 72 65 73 70 65 63 74 69 76 65  Upper respective
bc30: 6c 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70  ly. For.** examp
bc40: 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  le, assuming tha
bc50: 74 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20  t index p is on 
bc60: 74 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e  t1(a):.**.**   .
bc70: 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45  .. FROM t1 WHERE
bc80: 20 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f   a > ? AND a < ?
bc90: 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
bca0: 20 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f             |____
bcb0: 5f 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20  _|   |_____|.** 
bcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcd0: 20 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20        |         
bce0: 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  |.**            
bcf0: 20 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20           pLower 
bd00: 20 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20     pUpper.**.** 
bd10: 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  If either of the
bd20: 20 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20   upper or lower 
bd30: 62 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65  bound is not pre
bd40: 73 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20  sent, then NULL 
bd50: 69 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20  is passed in.** 
bd60: 70 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72  place of the cor
bd70: 72 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65  responding Where
bd80: 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  Term..**.** The 
bd90: 76 61 6c 75 65 20 69 6e 20 28 70 42 75 69 6c 64  value in (pBuild
bda0: 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65  er->pNew->u.btre
bdb0: 65 2e 6e 45 71 29 20 69 73 20 74 68 65 20 6e 75  e.nEq) is the nu
bdc0: 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
bdd0: 78 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75 62 6a  x.** column subj
bde0: 65 63 74 20 74 6f 20 74 68 65 20 72 61 6e 67 65  ect to the range
bdf0: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c   constraint. Or,
be00: 20 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74   equivalently, t
be10: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
be20: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
be30: 69 6e 74 73 20 6f 70 74 69 6d 69 7a 65 64 20 62  ints optimized b
be40: 79 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69  y the proposed i
be50: 6e 64 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65  ndex scan. For e
be60: 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d  xample,.** assum
be70: 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73 20 6f  ing index p is o
be80: 6e 20 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20  n t1(a, b), and 
be90: 74 68 65 20 53 51 4c 20 71 75 65 72 79 20 69 73  the SQL query is
bea0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52  :.**.**   ... FR
beb0: 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20  OM t1 WHERE a = 
bec0: 3f 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20  ? AND b > ? AND 
bed0: 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  b < ? ....**.** 
bee0: 74 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20  then nEq is set 
bef0: 74 6f 20 31 20 28 61 73 20 74 68 65 20 72 61 6e  to 1 (as the ran
bf00: 67 65 20 72 65 73 74 72 69 63 74 65 64 20 63 6f  ge restricted co
bf10: 6c 75 6d 6e 2c 20 62 2c 20 69 73 20 74 68 65 20  lumn, b, is the 
bf20: 73 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d  second .** left-
bf30: 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  most column of t
bf40: 68 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69  he index). Or, i
bf50: 66 20 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a  f the query is:.
bf60: 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
bf70: 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20   t1 WHERE a > ? 
bf80: 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND a < ? ....**
bf90: 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20  .** then nEq is 
bfa0: 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20  set to 0..**.** 
bfb0: 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
bfc0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70  on is called, *p
bfd0: 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74  nOut is set to t
bfe0: 68 65 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  he sqlite3LogEst
bff0: 28 29 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d  () of the.** num
c000: 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74  ber of rows that
c010: 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20   the index scan 
c020: 69 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 76  is expected to v
c030: 69 73 69 74 20 77 69 74 68 6f 75 74 20 0a 2a 2a  isit without .**
c040: 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 68 65   considering the
c050: 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
c060: 74 73 2e 20 49 66 20 6e 45 71 20 69 73 20 30 2c  ts. If nEq is 0,
c070: 20 74 68 65 6e 20 2a 70 6e 4f 75 74 20 69 73 20   then *pnOut is 
c080: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a  the number of .*
c090: 2a 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e  * rows in the in
c0a0: 64 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f  dex. Assuming no
c0b0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a   error occurs, *
c0c0: 70 6e 4f 75 74 20 69 73 20 61 64 6a 75 73 74 65  pnOut is adjuste
c0d0: 64 20 28 72 65 64 75 63 65 64 29 0a 2a 2a 20 74  d (reduced).** t
c0e0: 6f 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68  o account for th
c0f0: 65 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69  e range constrai
c100: 6e 74 73 20 70 4c 6f 77 65 72 20 61 6e 64 20 70  nts pLower and p
c110: 55 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e  Upper..** .** In
c120: 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20   the absence of 
c130: 73 71 6c 69 74 65 5f 73 74 61 74 34 20 41 4e 41  sqlite_stat4 ANA
c140: 4c 59 5a 45 20 64 61 74 61 2c 20 6f 72 20 69 66  LYZE data, or if
c150: 20 73 75 63 68 20 64 61 74 61 20 63 61 6e 6e 6f   such data canno
c160: 74 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20 61 20  t be.** used, a 
c170: 73 69 6e 67 6c 65 20 72 61 6e 67 65 20 69 6e 65  single range ine
c180: 71 75 61 6c 69 74 79 20 72 65 64 75 63 65 73 20  quality reduces 
c190: 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65  the search space
c1a0: 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20   by a factor of 
c1b0: 34 2e 20 0a 2a 2a 20 61 6e 64 20 61 20 70 61 69  4. .** and a pai
c1c0: 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73  r of constraints
c1d0: 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72   (x>? AND x<?) r
c1e0: 65 64 75 63 65 73 20 74 68 65 20 65 78 70 65 63  educes the expec
c1f0: 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  ted number of.**
c200: 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79   rows visited by
c210: 20 61 20 66 61 63 74 6f 72 20 6f 66 20 36 34 2e   a factor of 64.
c220: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
c230: 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74  hereRangeScanEst
c240: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
c250: 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  e,       /* Pars
c260: 69 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72  ing & code gener
c270: 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
c280: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  .  WhereLoopBuil
c290: 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20  der *pBuilder,. 
c2a0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77   WhereTerm *pLow
c2b0: 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62  er,   /* Lower b
c2c0: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
c2d0: 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d  e. ex: "x>123" M
c2e0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
c2f0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70    WhereTerm *pUp
c300: 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20  per,   /* Upper 
c310: 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
c320: 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20  ge. ex: "x<455" 
c330: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
c340: 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
c350: 6f 6f 70 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66  oop     /* Modif
c360: 79 20 74 68 65 20 2e 6e 4f 75 74 20 61 6e 64 20  y the .nOut and 
c370: 6d 61 79 62 65 20 2e 72 52 75 6e 20 66 69 65 6c  maybe .rRun fiel
c380: 64 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ds */.){.  int r
c390: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
c3a0: 20 69 6e 74 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f   int nOut = pLoo
c3b0: 70 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67 45 73  p->nOut;.  LogEs
c3c0: 74 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20  t nNew;..#ifdef 
c3d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
c3e0: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 49  AT3_OR_STAT4.  I
c3f0: 6e 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d  ndex *p = pLoop-
c400: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b  >u.btree.pIndex;
c410: 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f  .  int nEq = pLo
c420: 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b  op->u.btree.nEq;
c430: 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70  ..  if( p->nSamp
c440: 6c 65 3e 30 20 26 26 20 6e 45 71 3c 70 2d 3e 6e  le>0 && nEq<p->n
c450: 53 61 6d 70 6c 65 43 6f 6c 20 29 7b 0a 20 20 20  SampleCol ){.   
c460: 20 69 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c 64   if( nEq==pBuild
c470: 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 7b  er->nRecValid ){
c480: 0a 20 20 20 20 20 20 55 6e 70 61 63 6b 65 64 52  .      UnpackedR
c490: 65 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42  ecord *pRec = pB
c4a0: 75 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20  uilder->pRec;.  
c4b0: 20 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d      tRowcnt a[2]
c4c0: 3b 0a 20 20 20 20 20 20 75 38 20 61 66 66 3b 0a  ;.      u8 aff;.
c4d0: 0a 20 20 20 20 20 20 2f 2a 20 56 61 72 69 61 62  .      /* Variab
c4e0: 6c 65 20 69 4c 6f 77 65 72 20 77 69 6c 6c 20 62  le iLower will b
c4f0: 65 20 73 65 74 20 74 6f 20 74 68 65 20 65 73 74  e set to the est
c500: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d  imate of the num
c510: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a  ber of rows in .
c520: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64        ** the ind
c530: 65 78 20 74 68 61 74 20 61 72 65 20 6c 65 73 73  ex that are less
c540: 20 74 68 61 6e 20 74 68 65 20 6c 6f 77 65 72 20   than the lower 
c550: 62 6f 75 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  bound of the ran
c560: 67 65 20 71 75 65 72 79 2e 20 54 68 65 0a 20 20  ge query. The.  
c570: 20 20 20 20 2a 2a 20 6c 6f 77 65 72 20 62 6f 75      ** lower bou
c580: 6e 64 20 62 65 69 6e 67 20 74 68 65 20 63 6f 6e  nd being the con
c590: 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 24 50  catenation of $P
c5a0: 20 61 6e 64 20 24 4c 2c 20 77 68 65 72 65 20 24   and $L, where $
c5b0: 50 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a  P is the.      *
c5c0: 2a 20 6b 65 79 2d 70 72 65 66 69 78 20 66 6f 72  * key-prefix for
c5d0: 6d 65 64 20 62 79 20 74 68 65 20 6e 45 71 20 76  med by the nEq v
c5e0: 61 6c 75 65 73 20 6d 61 74 63 68 65 64 20 61 67  alues matched ag
c5f0: 61 69 6e 73 74 20 74 68 65 20 6e 45 71 20 6c 65  ainst the nEq le
c600: 66 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a  ft-most.      **
c610: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
c620: 69 6e 64 65 78 2c 20 61 6e 64 20 24 4c 20 69 73  index, and $L is
c630: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70 4c   the value in pL
c640: 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ower..      **. 
c650: 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70       ** Or, if p
c660: 4c 6f 77 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72  Lower is NULL or
c670: 20 24 4c 20 63 61 6e 6e 6f 74 20 62 65 20 65 78   $L cannot be ex
c680: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 69 74 20  tracted from it 
c690: 28 62 65 63 61 75 73 65 20 69 74 0a 20 20 20 20  (because it.    
c6a0: 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 20 73 69    ** is not a si
c6b0: 6d 70 6c 65 20 76 61 72 69 61 62 6c 65 20 6f 72  mple variable or
c6c0: 20 6c 69 74 65 72 61 6c 20 76 61 6c 75 65 29 2c   literal value),
c6d0: 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64   the lower bound
c6e0: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
c6f0: 20 72 61 6e 67 65 20 69 73 20 24 50 2e 20 44 75   range is $P. Du
c700: 65 20 74 6f 20 61 20 71 75 69 72 6b 20 69 6e 20  e to a quirk in 
c710: 74 68 65 20 77 61 79 20 77 68 65 72 65 4b 65 79  the way whereKey
c720: 53 74 61 74 73 28 29 20 77 6f 72 6b 73 2c 20 65  Stats() works, e
c730: 76 65 6e 0a 20 20 20 20 20 20 2a 2a 20 69 66 20  ven.      ** if 
c740: 24 4c 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  $L is available,
c750: 20 77 68 65 72 65 4b 65 79 53 74 61 74 73 28 29   whereKeyStats()
c760: 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 62   is called for b
c770: 6f 74 68 20 28 24 50 29 20 61 6e 64 20 0a 20 20  oth ($P) and .  
c780: 20 20 20 20 2a 2a 20 28 24 50 3a 24 4c 29 20 61      ** ($P:$L) a
c790: 6e 64 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66  nd the larger of
c7a0: 20 74 68 65 20 74 77 6f 20 72 65 74 75 72 6e 65   the two returne
c7b0: 64 20 76 61 6c 75 65 73 20 69 73 20 75 73 65 64  d values is used
c7c0: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
c7d0: 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69   ** Similarly, i
c7e0: 55 70 70 65 72 20 69 73 20 74 6f 20 62 65 20 73  Upper is to be s
c7f0: 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61  et to the estima
c800: 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
c810: 20 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20 2a   of rows.      *
c820: 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  * less than the 
c830: 75 70 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 74  upper bound of t
c840: 68 65 20 72 61 6e 67 65 20 71 75 65 72 79 2e 20  he range query. 
c850: 57 68 65 72 65 20 74 68 65 20 75 70 70 65 72 20  Where the upper 
c860: 62 6f 75 6e 64 0a 20 20 20 20 20 20 2a 2a 20 69  bound.      ** i
c870: 73 20 65 69 74 68 65 72 20 28 24 50 29 20 6f 72  s either ($P) or
c880: 20 28 24 50 3a 24 55 29 2e 20 41 67 61 69 6e 2c   ($P:$U). Again,
c890: 20 65 76 65 6e 20 69 66 20 24 55 20 69 73 20 61   even if $U is a
c8a0: 76 61 69 6c 61 62 6c 65 2c 20 62 6f 74 68 20 76  vailable, both v
c8b0: 61 6c 75 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f  alues.      ** o
c8c0: 66 20 69 55 70 70 65 72 20 61 72 65 20 72 65 71  f iUpper are req
c8d0: 75 65 73 74 65 64 20 6f 66 20 77 68 65 72 65 4b  uested of whereK
c8e0: 65 79 53 74 61 74 73 28 29 20 61 6e 64 20 74 68  eyStats() and th
c8f0: 65 20 73 6d 61 6c 6c 65 72 20 75 73 65 64 2e 0a  e smaller used..
c900: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
c910: 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
c920: 72 6f 77 73 20 62 65 74 77 65 65 6e 20 74 68 65  rows between the
c930: 20 74 77 6f 20 62 6f 75 6e 64 73 20 69 73 20 74   two bounds is t
c940: 68 65 6e 20 6a 75 73 74 20 69 55 70 70 65 72 2d  hen just iUpper-
c950: 69 4c 6f 77 65 72 2e 0a 20 20 20 20 20 20 2a 2f  iLower..      */
c960: 0a 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69  .      tRowcnt i
c970: 4c 6f 77 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f  Lower;     /* Ro
c980: 77 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  ws less than the
c990: 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a   lower bound */.
c9a0: 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 69 55        tRowcnt iU
c9b0: 70 70 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77  pper;     /* Row
c9c0: 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
c9d0: 75 70 70 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20  upper bound */. 
c9e0: 20 20 20 20 20 69 6e 74 20 69 4c 77 72 49 64 78       int iLwrIdx
c9f0: 20 3d 20 2d 32 3b 20 20 20 2f 2a 20 61 53 61 6d   = -2;   /* aSam
ca00: 70 6c 65 5b 5d 20 66 6f 72 20 74 68 65 20 6c 6f  ple[] for the lo
ca10: 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20  wer bound */.   
ca20: 20 20 20 69 6e 74 20 69 55 70 72 49 64 78 20 3d     int iUprIdx =
ca30: 20 2d 31 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c   -1;   /* aSampl
ca40: 65 5b 5d 20 66 6f 72 20 74 68 65 20 75 70 70 65  e[] for the uppe
ca50: 72 20 62 6f 75 6e 64 20 2a 2f 0a 0a 20 20 20 20  r bound */..    
ca60: 20 20 69 66 28 20 70 52 65 63 20 29 7b 0a 20 20    if( pRec ){.  
ca70: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ca80: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 21 3d 70 42  pRec->nField!=pB
ca90: 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69  uilder->nRecVali
caa0: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65  d );.        pRe
cab0: 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 42 75 69  c->nField = pBui
cac0: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b  lder->nRecValid;
cad0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
cae0: 66 66 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ff = sqlite3Inde
caf0: 78 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28  xColumnAffinity(
cb00: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 6e  pParse->db, p, n
cb10: 45 71 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Eq);.      asser
cb20: 74 28 20 6e 45 71 21 3d 70 2d 3e 6e 4b 65 79 43  t( nEq!=p->nKeyC
cb30: 6f 6c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54  ol || aff==SQLIT
cb40: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b  E_AFF_INTEGER );
cb50: 0a 20 20 20 20 20 20 2f 2a 20 44 65 74 65 72 6d  .      /* Determ
cb60: 69 6e 65 20 69 4c 6f 77 65 72 20 61 6e 64 20 69  ine iLower and i
cb70: 55 70 70 65 72 20 75 73 69 6e 67 20 28 24 50 29  Upper using ($P)
cb80: 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20   only. */.      
cb90: 69 66 28 20 6e 45 71 3d 3d 30 20 29 7b 0a 20 20  if( nEq==0 ){.  
cba0: 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 30        iLower = 0
cbb0: 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72  ;.        iUpper
cbc0: 20 3d 20 70 2d 3e 6e 52 6f 77 45 73 74 30 3b 0a   = p->nRowEst0;.
cbd0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
cbe0: 20 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68       /* Note: th
cbf0: 69 73 20 63 61 6c 6c 20 63 6f 75 6c 64 20 62 65  is call could be
cc00: 20 6f 70 74 69 6d 69 7a 65 64 20 61 77 61 79 20   optimized away 
cc10: 2d 20 73 69 6e 63 65 20 74 68 65 20 73 61 6d 65  - since the same
cc20: 20 76 61 6c 75 65 73 20 6d 75 73 74 20 0a 20 20   values must .  
cc30: 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 62 65        ** have be
cc40: 65 6e 20 72 65 71 75 65 73 74 65 64 20 77 68 65  en requested whe
cc50: 6e 20 74 65 73 74 69 6e 67 20 6b 65 79 20 24 50  n testing key $P
cc60: 20 69 6e 20 77 68 65 72 65 45 71 75 61 6c 53 63   in whereEqualSc
cc70: 61 6e 45 73 74 28 29 2e 20 20 2a 2f 0a 20 20 20  anEst().  */.   
cc80: 20 20 20 20 20 77 68 65 72 65 4b 65 79 53 74 61       whereKeySta
cc90: 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
cca0: 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20 20 20  ec, 0, a);.     
ccb0: 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 5b 30 5d     iLower = a[0]
ccc0: 3b 0a 20 20 20 20 20 20 20 20 69 55 70 70 65 72  ;.        iUpper
ccd0: 20 3d 20 61 5b 30 5d 20 2b 20 61 5b 31 5d 3b 0a   = a[0] + a[1];.
cce0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
ccf0: 73 73 65 72 74 28 20 70 4c 6f 77 65 72 3d 3d 30  ssert( pLower==0
cd00: 20 7c 7c 20 28 70 4c 6f 77 65 72 2d 3e 65 4f 70   || (pLower->eOp
cd10: 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 47 54 7c  erator & (WO_GT|
cd20: 57 4f 5f 47 45 29 29 21 3d 30 20 29 3b 0a 20 20  WO_GE))!=0 );.  
cd30: 20 20 20 20 61 73 73 65 72 74 28 20 70 55 70 70      assert( pUpp
cd40: 65 72 3d 3d 30 20 7c 7c 20 28 70 55 70 70 65 72  er==0 || (pUpper
cd50: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
cd60: 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 29 21 3d 30 20  O_LT|WO_LE))!=0 
cd70: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
cd80: 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d   p->aSortOrder!=
cd90: 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
cda0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71  ->aSortOrder[nEq
cdb0: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ] ){.        /* 
cdc0: 54 68 65 20 72 6f 6c 65 73 20 6f 66 20 70 4c 6f  The roles of pLo
cdd0: 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 61  wer and pUpper a
cde0: 72 65 20 73 77 61 70 70 65 64 20 66 6f 72 20 61  re swapped for a
cdf0: 20 44 45 53 43 20 69 6e 64 65 78 20 2a 2f 0a 20   DESC index */. 
ce00: 20 20 20 20 20 20 20 53 57 41 50 28 57 68 65 72         SWAP(Wher
ce10: 65 54 65 72 6d 2a 2c 20 70 4c 6f 77 65 72 2c 20  eTerm*, pLower, 
ce20: 70 55 70 70 65 72 29 3b 0a 20 20 20 20 20 20 7d  pUpper);.      }
ce30: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f  ..      /* If po
ce40: 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20  ssible, improve 
ce50: 6f 6e 20 74 68 65 20 69 4c 6f 77 65 72 20 65 73  on the iLower es
ce60: 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50  timate using ($P
ce70: 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69  :$L). */.      i
ce80: 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20  f( pLower ){.   
ce90: 20 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20       int bOk;   
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ceb0: 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75   /* True if valu
cec0: 65 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66  e is extracted f
ced0: 72 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20  rom pExpr */.   
cee0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
cef0: 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72   = pLower->pExpr
cf00: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
cf10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
cf20: 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65  at4ProbeSetValue
cf30: 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65  (pParse, p, &pRe
cf40: 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e  c, pExpr, aff, n
cf50: 45 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20  Eq, &bOk);.     
cf60: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
cf70: 45 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20  E_OK && bOk ){. 
cf80: 20 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74           tRowcnt
cf90: 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   iNew;.         
cfa0: 20 69 4c 77 72 49 64 78 20 3d 20 77 68 65 72 65   iLwrIdx = where
cfb0: 4b 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c  KeyStats(pParse,
cfc0: 20 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b   p, pRec, 0, a);
cfd0: 0a 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20  .          iNew 
cfe0: 3d 20 61 5b 30 5d 20 2b 20 28 28 70 4c 6f 77 65  = a[0] + ((pLowe
cff0: 72 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  r->eOperator & (
d000: 57 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20  WO_GT|WO_LE)) ? 
d010: 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20  a[1] : 0);.     
d020: 20 20 20 20 20 69 66 28 20 69 4e 65 77 3e 69 4c       if( iNew>iL
d030: 6f 77 65 72 20 29 20 69 4c 6f 77 65 72 20 3d 20  ower ) iLower = 
d040: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
d050: 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20  nOut--;.        
d060: 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20    pLower = 0;.  
d070: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
d080: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70 6f 73  .      /* If pos
d090: 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76 65 20 6f  sible, improve o
d0a0: 6e 20 74 68 65 20 69 55 70 70 65 72 20 65 73 74  n the iUpper est
d0b0: 69 6d 61 74 65 20 75 73 69 6e 67 20 28 24 50 3a  imate using ($P:
d0c0: 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  $U). */.      if
d0d0: 28 20 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20  ( pUpper ){.    
d0e0: 20 20 20 20 69 6e 74 20 62 4f 6b 3b 20 20 20 20      int bOk;    
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d100: 2f 2a 20 54 72 75 65 20 69 66 20 76 61 6c 75 65  /* True if value
d110: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
d120: 6f 6d 20 70 45 78 70 72 20 2a 2f 0a 20 20 20 20  om pExpr */.    
d130: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
d140: 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72 2d  = pUpper->pExpr-
d150: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  >pRight;.       
d160: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61   rc = sqlite3Sta
d170: 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75 65 28  t4ProbeSetValue(
d180: 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52 65 63  pParse, p, &pRec
d190: 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 6e 45  , pExpr, aff, nE
d1a0: 71 2c 20 26 62 4f 6b 29 3b 0a 20 20 20 20 20 20  q, &bOk);.      
d1b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d1c0: 5f 4f 4b 20 26 26 20 62 4f 6b 20 29 7b 0a 20 20  _OK && bOk ){.  
d1d0: 20 20 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20          tRowcnt 
d1e0: 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  iNew;.          
d1f0: 69 55 70 72 49 64 78 20 3d 20 77 68 65 72 65 4b  iUprIdx = whereK
d200: 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
d210: 70 2c 20 70 52 65 63 2c 20 31 2c 20 61 29 3b 0a  p, pRec, 1, a);.
d220: 20 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d            iNew =
d230: 20 61 5b 30 5d 20 2b 20 28 28 70 55 70 70 65 72   a[0] + ((pUpper
d240: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
d250: 4f 5f 47 54 7c 57 4f 5f 4c 45 29 29 20 3f 20 61  O_GT|WO_LE)) ? a
d260: 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  [1] : 0);.      
d270: 20 20 20 20 69 66 28 20 69 4e 65 77 3c 69 55 70      if( iNew<iUp
d280: 70 65 72 20 29 20 69 55 70 70 65 72 20 3d 20 69  per ) iUpper = i
d290: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  New;.          n
d2a0: 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  Out--;.         
d2b0: 20 70 55 70 70 65 72 20 3d 20 30 3b 0a 20 20 20   pUpper = 0;.   
d2c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
d2d0: 20 20 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e        pBuilder->
d2e0: 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 20  pRec = pRec;.   
d2f0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d300: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
d310: 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f 77 65  if( iUpper>iLowe
d320: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  r ){.          n
d330: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  New = sqlite3Log
d340: 45 73 74 28 69 55 70 70 65 72 20 2d 20 69 4c 6f  Est(iUpper - iLo
d350: 77 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wer);.          
d360: 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66 20 62  /* TUNING:  If b
d370: 6f 74 68 20 69 55 70 70 65 72 20 61 6e 64 20 69  oth iUpper and i
d380: 4c 6f 77 65 72 20 61 72 65 20 64 65 72 69 76 65  Lower are derive
d390: 64 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 0a  d from the same.
d3a0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61 6d            ** sam
d3b0: 70 6c 65 2c 20 74 68 65 6e 20 61 73 73 75 6d 65  ple, then assume
d3c0: 20 74 68 65 79 20 61 72 65 20 34 78 20 6d 6f 72   they are 4x mor
d3d0: 65 20 73 65 6c 65 63 74 69 76 65 2e 20 20 54 68  e selective.  Th
d3e0: 69 73 20 62 72 69 6e 67 73 0a 20 20 20 20 20 20  is brings.      
d3f0: 20 20 20 20 2a 2a 20 74 68 65 20 65 73 74 69 6d      ** the estim
d400: 61 74 65 64 20 73 65 6c 65 63 74 69 76 69 74 79  ated selectivity
d410: 20 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20 77 69   more in line wi
d420: 74 68 20 77 68 61 74 20 69 74 20 77 6f 75 6c 64  th what it would
d430: 20 62 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   be.          **
d440: 20 69 66 20 65 73 74 69 6d 61 74 65 64 20 77 69   if estimated wi
d450: 74 68 6f 75 74 20 74 68 65 20 75 73 65 20 6f 66  thout the use of
d460: 20 53 54 41 54 33 2f 34 20 74 61 62 6c 65 73 2e   STAT3/4 tables.
d470: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
d480: 28 20 69 4c 77 72 49 64 78 3d 3d 69 55 70 72 49  ( iLwrIdx==iUprI
d490: 64 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32 30 3b  dx ) nNew -= 20;
d4a0: 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d 73 71    assert( 20==sq
d4b0: 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29 20 29  lite3LogEst(4) )
d4c0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
d4d0: 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65 77 20  .          nNew 
d4e0: 3d 20 31 30 3b 20 20 20 20 20 20 20 20 61 73 73  = 10;        ass
d4f0: 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74 65 33  ert( 10==sqlite3
d500: 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20 20 20  LogEst(2) );.   
d510: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
d520: 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 7b 0a  f( nNew<nOut ){.
d530: 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74 20 3d            nOut =
d540: 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   nNew;.        }
d550: 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52  .        WHERETR
d560: 41 43 45 28 30 78 31 30 2c 20 28 22 53 54 41 54  ACE(0x10, ("STAT
d570: 34 20 72 61 6e 67 65 20 73 63 61 6e 3a 20 25 75  4 range scan: %u
d580: 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e 22 2c  ..%u  est=%d\n",
d590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d5a0: 20 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32              (u32
d5b0: 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29 69 55  )iLower, (u32)iU
d5c0: 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a 20 20  pper, nOut));.  
d5d0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
d5e0: 0a 20 20 20 20 20 20 69 6e 74 20 62 44 6f 6e 65  .      int bDone
d5f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
d600: 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69 70 53   whereRangeSkipS
d610: 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70  canEst(pParse, p
d620: 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 2c 20 70  Lower, pUpper, p
d630: 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b 0a 20  Loop, &bDone);. 
d640: 20 20 20 20 20 69 66 28 20 62 44 6f 6e 65 20 29       if( bDone )
d650: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
d660: 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 55 4e  }.  }.#else.  UN
d670: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
d680: 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44  Parse);.  UNUSED
d690: 5f 50 41 52 41 4d 45 54 45 52 28 70 42 75 69 6c  _PARAMETER(pBuil
d6a0: 64 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  der);.  assert( 
d6b0: 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72  pLower || pUpper
d6c0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
d6d0: 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30 20 7c  ert( pUpper==0 |
d6e0: 7c 20 28 70 55 70 70 65 72 2d 3e 77 74 46 6c 61  | (pUpper->wtFla
d6f0: 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 29  gs & TERM_VNULL)
d700: 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20 3d 20  ==0 );.  nNew = 
d710: 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75 73 74  whereRangeAdjust
d720: 28 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29 3b 0a  (pLower, nOut);.
d730: 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65 52 61    nNew = whereRa
d740: 6e 67 65 41 64 6a 75 73 74 28 70 55 70 70 65 72  ngeAdjust(pUpper
d750: 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a 20 54  , nNew);..  /* T
d760: 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20  UNING: If there 
d770: 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65 72  is both an upper
d780: 20 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d 69 74   and lower limit
d790: 20 61 6e 64 20 6e 65 69 74 68 65 72 20 6c 69 6d   and neither lim
d7a0: 69 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e 20 61  it.  ** has an a
d7b0: 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66 69 6e  pplication-defin
d7c0: 65 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c  ed likelihood(),
d7d0: 20 61 73 73 75 6d 65 20 74 68 65 20 72 61 6e 67   assume the rang
d7e0: 65 20 69 73 0a 20 20 2a 2a 20 72 65 64 75 63 65  e is.  ** reduce
d7f0: 64 20 62 79 20 61 6e 20 61 64 64 69 74 69 6f 6e  d by an addition
d800: 61 6c 20 37 35 25 2e 20 54 68 69 73 20 6d 65 61  al 75%. This mea
d810: 6e 73 20 74 68 61 74 2c 20 62 79 20 64 65 66 61  ns that, by defa
d820: 75 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65 6e 64  ult, an open-end
d830: 65 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20 71 75  ed.  ** range qu
d840: 65 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20 3e 20  ery (e.g. col > 
d850: 3f 29 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f  ?) is assumed to
d860: 20 6d 61 74 63 68 20 31 2f 34 20 6f 66 20 74 68   match 1/4 of th
d870: 65 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20 20  e rows in the.  
d880: 2a 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c 65 20  ** index. While 
d890: 61 20 63 6c 6f 73 65 64 20 72 61 6e 67 65 20 28  a closed range (
d8a0: 65 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45 45 4e  e.g. col BETWEEN
d8b0: 20 3f 20 41 4e 44 20 3f 29 20 69 73 20 65 73 74   ? AND ?) is est
d8c0: 69 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 6d  imated to.  ** m
d8d0: 61 74 63 68 20 31 2f 36 34 20 6f 66 20 74 68 65  atch 1/64 of the
d8e0: 20 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20 69 66   index. */ .  if
d8f0: 28 20 70 4c 6f 77 65 72 20 26 26 20 70 4c 6f 77  ( pLower && pLow
d900: 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30 20  er->truthProb>0 
d910: 26 26 20 70 55 70 70 65 72 20 26 26 20 70 55 70  && pUpper && pUp
d920: 70 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e 30  per->truthProb>0
d930: 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d 3d 20   ){.    nNew -= 
d940: 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75 74 20  20;.  }..  nOut 
d950: 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29 20 2b  -= (pLower!=0) +
d960: 20 28 70 55 70 70 65 72 21 3d 30 29 3b 0a 20 20   (pUpper!=0);.  
d970: 69 66 28 20 6e 4e 65 77 3c 31 30 20 29 20 6e 4e  if( nNew<10 ) nN
d980: 65 77 20 3d 20 31 30 3b 0a 20 20 69 66 28 20 6e  ew = 10;.  if( n
d990: 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75 74 20  New<nOut ) nOut 
d9a0: 3d 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65 66 69  = nNew;.#if defi
d9b0: 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45  ned(WHERETRACE_E
d9c0: 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20 70 4c  NABLED).  if( pL
d9d0: 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29  oop->nOut>nOut )
d9e0: 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  {.    WHERETRACE
d9f0: 28 30 78 31 30 2c 28 22 52 61 6e 67 65 20 73 63  (0x10,("Range sc
da00: 61 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74 20 66  an lowers nOut f
da10: 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e 22 2c  rom %d to %d\n",
da20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
da30: 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74       pLoop->nOut
da40: 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a 23 65  , nOut));.  }.#e
da50: 6e 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 4f  ndif.  pLoop->nO
da60: 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e 4f 75  ut = (LogEst)nOu
da70: 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t;.  return rc;.
da80: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
da90: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
daa0: 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74  _STAT4./*.** Est
dab0: 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
dac0: 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
dad0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  ll be returned b
dae0: 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 65 71  ased on.** an eq
daf0: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
db00: 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20 77 68  t x=VALUE and wh
db10: 65 72 65 20 74 68 61 74 20 56 41 4c 55 45 20 6f  ere that VALUE o
db20: 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20  ccurs in.** the 
db30: 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 2e 20  histogram data. 
db40: 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72 6b 73   This only works
db50: 20 77 68 65 6e 20 78 20 69 73 20 74 68 65 20 6c   when x is the l
db60: 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f 6c 75  eft-most.** colu
db70: 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 61  mn of an index a
db80: 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74 33 20  nd sqlite_stat3 
db90: 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20 69  histogram data i
dba0: 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 66  s available.** f
dbb0: 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e 20 20  or that index.  
dbc0: 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55 4c 4c  When pExpr==NULL
dbd0: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   that means the 
dbe0: 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a 2a 2a  constraint is.**
dbf0: 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69 6e 73   "x IS NULL" ins
dc00: 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c 55 45  tead of "x=VALUE
dc10: 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  "..**.** Write t
dc20: 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77  he estimated row
dc30: 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52   count into *pnR
dc40: 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ow and return SQ
dc50: 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20  LITE_OK. .** If 
dc60: 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61  unable to make a
dc70: 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76  n estimate, leav
dc80: 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67  e *pnRow unchang
dc90: 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ed and return.**
dca0: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
dcb0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
dcc0: 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20  n fail if it is 
dcd0: 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61  unable to load a
dce0: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
dcf0: 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20  nce.** required 
dd00: 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61  for string compa
dd10: 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61  rison, or if una
dd20: 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
dd30: 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20  memory.** for a 
dd40: 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72  UTF conversion r
dd50: 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70  equired for comp
dd60: 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72  arison.  The err
dd70: 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20  or is stored.** 
dd80: 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
dd90: 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
dda0: 69 63 20 69 6e 74 20 77 68 65 72 65 45 71 75 61  ic int whereEqua
ddb0: 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72 73  lScanEst(.  Pars
ddc0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
ddd0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63 6f   /* Parsing & co
dde0: 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f  de generating co
ddf0: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
de00: 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
de10: 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 20 2a 70  ilder,.  Expr *p
de20: 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  Expr,         /*
de30: 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20   Expression for 
de40: 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56  VALUE in the x=V
de50: 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20  ALUE constraint 
de60: 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a 70 6e  */.  tRowcnt *pn
de70: 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57 72 69  Row       /* Wri
de80: 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72  te the revised r
de90: 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65  ow estimate here
dea0: 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78 20 2a   */.){.  Index *
deb0: 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  p = pBuilder->pN
dec0: 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64  ew->u.btree.pInd
ded0: 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20  ex;.  int nEq = 
dee0: 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e  pBuilder->pNew->
def0: 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 55  u.btree.nEq;.  U
df00: 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
df10: 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  Rec = pBuilder->
df20: 70 52 65 63 3b 0a 20 20 75 38 20 61 66 66 3b 20  pRec;.  u8 aff; 
df30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df40: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69    /* Column affi
df50: 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nity */.  int rc
df60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
df70: 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69      /* Subfuncti
df80: 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  on return code *
df90: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d  /.  tRowcnt a[2]
dfa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
dfb0: 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20   Statistics */. 
dfc0: 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73   int bOk;..  ass
dfd0: 65 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20  ert( nEq>=1 );. 
dfe0: 20 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 70 2d   assert( nEq<=p-
dff0: 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  >nColumn );.  as
e000: 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65  sert( p->aSample
e010: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e020: 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b   p->nSample>0 );
e030: 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c  .  assert( pBuil
e040: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e  der->nRecValid<n
e050: 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76  Eq );..  /* If v
e060: 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61 76  alues are not av
e070: 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20  ailable for all 
e080: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69 6e  fields of the in
e090: 64 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74 0a  dex to the left.
e0a0: 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65    ** of this one
e0b0: 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63 61  , no estimate ca
e0c0: 6e 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75 72  n be made. Retur
e0d0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
e0e0: 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69  D. */.  if( pBui
e0f0: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c  lder->nRecValid<
e100: 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20 72  (nEq-1) ){.    r
e110: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
e120: 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  FOUND;.  }..  /*
e130: 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
e140: 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54  mization only. T
e150: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
e160: 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
e170: 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f  alue().  ** belo
e180: 77 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 74  w would return t
e190: 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 20  he same value.  
e1a0: 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d 70 2d  */.  if( nEq>=p-
e1b0: 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
e1c0: 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  *pnRow = 1;.    
e1d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e1e0: 3b 0a 20 20 7d 0a 0a 20 20 61 66 66 20 3d 20 73  ;.  }..  aff = s
e1f0: 71 6c 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d  qlite3IndexColum
e200: 6e 41 66 66 69 6e 69 74 79 28 70 50 61 72 73 65  nAffinity(pParse
e210: 2d 3e 64 62 2c 20 70 2c 20 6e 45 71 2d 31 29 3b  ->db, p, nEq-1);
e220: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53  .  rc = sqlite3S
e230: 74 61 74 34 50 72 6f 62 65 53 65 74 56 61 6c 75  tat4ProbeSetValu
e240: 65 28 70 50 61 72 73 65 2c 20 70 2c 20 26 70 52  e(pParse, p, &pR
e250: 65 63 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20  ec, pExpr, aff, 
e260: 6e 45 71 2d 31 2c 20 26 62 4f 6b 29 3b 0a 20 20  nEq-1, &bOk);.  
e270: 70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d  pBuilder->pRec =
e280: 20 70 52 65 63 3b 0a 20 20 69 66 28 20 72 63 21   pRec;.  if( rc!
e290: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
e2a0: 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 62 4f  urn rc;.  if( bO
e2b0: 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  k==0 ) return SQ
e2c0: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20  LITE_NOTFOUND;. 
e2d0: 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56   pBuilder->nRecV
e2e0: 61 6c 69 64 20 3d 20 6e 45 71 3b 0a 0a 20 20 77  alid = nEq;..  w
e2f0: 68 65 72 65 4b 65 79 53 74 61 74 73 28 70 50 61  hereKeyStats(pPa
e300: 72 73 65 2c 20 70 2c 20 70 52 65 63 2c 20 30 2c  rse, p, pRec, 0,
e310: 20 61 29 3b 0a 20 20 57 48 45 52 45 54 52 41 43   a);.  WHERETRAC
e320: 45 28 30 78 31 30 2c 28 22 65 71 75 61 6c 69 74  E(0x10,("equalit
e330: 79 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 20 25  y scan regions %
e340: 73 28 25 64 29 3a 20 25 64 5c 6e 22 2c 0a 20 20  s(%d): %d\n",.  
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e360: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 6e 45 71 2d 31   p->zName, nEq-1
e370: 2c 20 28 69 6e 74 29 61 5b 31 5d 29 29 3b 0a 20  , (int)a[1]));. 
e380: 20 2a 70 6e 52 6f 77 20 3d 20 61 5b 31 5d 3b 0a   *pnRow = a[1];.
e390: 20 20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a    .  return rc;.
e3a0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
e3b0: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
e3c0: 4f 52 5f 53 54 41 54 34 20 2a 2f 0a 0a 23 69 66  OR_STAT4 */..#if
e3d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e3e0: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
e3f0: 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20  ./*.** Estimate 
e400: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
e410: 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
e420: 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20 6f  returned based o
e430: 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e 73 74  n.** an IN const
e440: 72 61 69 6e 74 20 77 68 65 72 65 20 74 68 65 20  raint where the 
e450: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
e460: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
e470: 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73 74 20  or.** is a list 
e480: 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78 61 6d  of values.  Exam
e490: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
e4a0: 20 20 57 48 45 52 45 20 78 20 49 4e 20 28 31 2c    WHERE x IN (1,
e4b0: 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69  2,3,4).**.** Wri
e4c0: 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  te the estimated
e4d0: 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20   row count into 
e4e0: 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72  *pnRow and retur
e4f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a  n SQLITE_OK. .**
e500: 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61   If unable to ma
e510: 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20  ke an estimate, 
e520: 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63  leave *pnRow unc
e530: 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72  hanged and retur
e540: 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  n.** non-zero..*
e550: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
e560: 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74  e can fail if it
e570: 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f   is unable to lo
e580: 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  ad a collating s
e590: 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69  equence.** requi
e5a0: 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63  red for string c
e5b0: 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66  omparison, or if
e5c0: 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
e5d0: 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  ate memory.** fo
e5e0: 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69  r a UTF conversi
e5f0: 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  on required for 
e600: 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65  comparison.  The
e610: 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64   error is stored
e620: 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73  .** in the pPars
e630: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
e640: 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65  static int where
e650: 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50 61 72  InScanEst(.  Par
e660: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e670: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20 63    /* Parsing & c
e680: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
e690: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
e6a0: 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42  eLoopBuilder *pB
e6b0: 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 4c 69  uilder,.  ExprLi
e6c0: 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f  st *pList,     /
e6d0: 2a 20 54 68 65 20 76 61 6c 75 65 20 6c 69 73 74  * The value list
e6e0: 20 6f 6e 20 74 68 65 20 52 48 53 20 6f 66 20 22   on the RHS of "
e6f0: 78 20 49 4e 20 28 76 31 2c 76 32 2c 76 33 2c 2e  x IN (v1,v2,v3,.
e700: 2e 2e 29 22 20 2a 2f 0a 20 20 74 52 6f 77 63 6e  ..)" */.  tRowcn
e710: 74 20 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 2f  t *pnRow       /
e720: 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69  * Write the revi
e730: 73 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65  sed row estimate
e740: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e   here */.){.  In
e750: 64 65 78 20 2a 70 20 3d 20 70 42 75 69 6c 64 65  dex *p = pBuilde
e760: 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
e770: 2e 70 49 6e 64 65 78 3b 0a 20 20 69 36 34 20 6e  .pIndex;.  i64 n
e780: 52 6f 77 30 20 3d 20 73 71 6c 69 74 65 33 4c 6f  Row0 = sqlite3Lo
e790: 67 45 73 74 54 6f 49 6e 74 28 70 2d 3e 61 69 52  gEstToInt(p->aiR
e7a0: 6f 77 4c 6f 67 45 73 74 5b 30 5d 29 3b 0a 20 20  owLogEst[0]);.  
e7b0: 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20  int nRecValid = 
e7c0: 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
e7d0: 6c 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  lid;.  int rc = 
e7e0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f  SQLITE_OK;     /
e7f0: 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e 20 72 65  * Subfunction re
e800: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 74  turn code */.  t
e810: 52 6f 77 63 6e 74 20 6e 45 73 74 3b 20 20 20 20  Rowcnt nEst;    
e820: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
e830: 20 6f 66 20 72 6f 77 73 20 66 6f 72 20 61 20 73   of rows for a s
e840: 69 6e 67 6c 65 20 74 65 72 6d 20 2a 2f 0a 20 20  ingle term */.  
e850: 74 52 6f 77 63 6e 74 20 6e 52 6f 77 45 73 74 20  tRowcnt nRowEst 
e860: 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 65 77 20 65  = 0;    /* New e
e870: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
e880: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 2a 2f  umber of rows */
e890: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
e8a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
e8b0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
e8c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d   assert( p->aSam
e8d0: 70 6c 65 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  ple!=0 );.  for(
e8e0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
e8f0: 4f 4b 20 26 26 20 69 3c 70 4c 69 73 74 2d 3e 6e  OK && i<pList->n
e900: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
e910: 6e 45 73 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20  nEst = nRow0;.  
e920: 20 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61    rc = whereEqua
e930: 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  lScanEst(pParse,
e940: 20 70 42 75 69 6c 64 65 72 2c 20 70 4c 69 73 74   pBuilder, pList
e950: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 26 6e  ->a[i].pExpr, &n
e960: 45 73 74 29 3b 0a 20 20 20 20 6e 52 6f 77 45 73  Est);.    nRowEs
e970: 74 20 2b 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70  t += nEst;.    p
e980: 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
e990: 69 64 20 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a  id = nRecValid;.
e9a0: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
e9b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e9c0: 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20 6e 52  if( nRowEst > nR
e9d0: 6f 77 30 20 29 20 6e 52 6f 77 45 73 74 20 3d 20  ow0 ) nRowEst = 
e9e0: 6e 52 6f 77 30 3b 0a 20 20 20 20 2a 70 6e 52 6f  nRow0;.    *pnRo
e9f0: 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 20  w = nRowEst;.   
ea00: 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31 30   WHERETRACE(0x10
ea10: 2c 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61  ,("IN row estima
ea20: 74 65 3a 20 65 73 74 3d 25 64 5c 6e 22 2c 20 6e  te: est=%d\n", n
ea30: 52 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20  RowEst));.  }.  
ea40: 61 73 73 65 72 74 28 20 70 42 75 69 6c 64 65 72  assert( pBuilder
ea50: 2d 3e 6e 52 65 63 56 61 6c 69 64 3d 3d 6e 52 65  ->nRecValid==nRe
ea60: 63 56 61 6c 69 64 20 29 3b 0a 20 20 72 65 74 75  cValid );.  retu
ea70: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
ea80: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
ea90: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20  _STAT3_OR_STAT4 
eaa0: 2a 2f 0a 0a 0a 23 69 66 64 65 66 20 57 48 45 52  */...#ifdef WHER
eab0: 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f  ETRACE_ENABLED./
eac0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63  *.** Print the c
ead0: 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 68 65 72  ontent of a Wher
eae0: 65 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eTerm object.*/.
eaf0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
eb00: 65 54 65 72 6d 50 72 69 6e 74 28 57 68 65 72 65  eTermPrint(Where
eb10: 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 69 6e 74  Term *pTerm, int
eb20: 20 69 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70   iTerm){.  if( p
eb30: 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Term==0 ){.    s
eb40: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
eb50: 66 28 22 54 45 52 4d 2d 25 2d 33 64 20 4e 55 4c  f("TERM-%-3d NUL
eb60: 4c 5c 6e 22 2c 20 69 54 65 72 6d 29 3b 0a 20 20  L\n", iTerm);.  
eb70: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
eb80: 7a 54 79 70 65 5b 34 5d 3b 0a 20 20 20 20 63 68  zType[4];.    ch
eb90: 61 72 20 7a 4c 65 66 74 5b 35 30 5d 3b 0a 20 20  ar zLeft[50];.  
eba0: 20 20 6d 65 6d 63 70 79 28 7a 54 79 70 65 2c 20    memcpy(zType, 
ebb0: 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20 20 20 20 69  "...", 4);.    i
ebc0: 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
ebd0: 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
ebe0: 20 29 20 7a 54 79 70 65 5b 30 5d 20 3d 20 27 56   ) zType[0] = 'V
ebf0: 27 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ';.    if( pTerm
ec00: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
ec10: 5f 45 51 55 49 56 20 20 29 20 7a 54 79 70 65 5b  _EQUIV  ) zType[
ec20: 31 5d 20 3d 20 27 45 27 3b 0a 20 20 20 20 69 66  1] = 'E';.    if
ec30: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
ec40: 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
ec50: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 7a  EP_FromJoin) ) z
ec60: 54 79 70 65 5b 32 5d 20 3d 20 27 4c 27 3b 0a 20  Type[2] = 'L';. 
ec70: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
ec80: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e  perator & WO_SIN
ec90: 47 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  GLE ){.      sql
eca0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
ecb0: 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65 66  zeof(zLeft),zLef
ecc0: 74 2c 22 6c 65 66 74 3d 7b 25 64 3a 25 64 7d 22  t,"left={%d:%d}"
ecd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ece0: 20 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e           pTerm->
ecf0: 6c 65 66 74 43 75 72 73 6f 72 2c 20 70 54 65 72  leftCursor, pTer
ed00: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 29  m->u.leftColumn)
ed10: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
ed20: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
ed30: 72 20 26 20 57 4f 5f 4f 52 29 21 3d 30 20 26 26  r & WO_OR)!=0 &&
ed40: 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66   pTerm->u.pOrInf
ed50: 6f 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  o!=0 ){.      sq
ed60: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
ed70: 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65  izeof(zLeft),zLe
ed80: 66 74 2c 22 69 6e 64 65 78 61 62 6c 65 3d 30 78  ft,"indexable=0x
ed90: 25 6c 6c 64 22 2c 20 0a 20 20 20 20 20 20 20 20  %lld", .        
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
edb0: 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
edc0: 3e 69 6e 64 65 78 61 62 6c 65 29 3b 0a 20 20 20  >indexable);.   
edd0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
ede0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
edf0: 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c 7a 4c 65  izeof(zLeft),zLe
ee00: 66 74 2c 22 6c 65 66 74 3d 25 64 22 2c 20 70 54  ft,"left=%d", pT
ee10: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
ee20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
ee30: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
ee40: 20 20 20 20 20 20 20 22 54 45 52 4d 2d 25 2d 33         "TERM-%-3
ee50: 64 20 25 70 20 25 73 20 25 2d 31 32 73 20 70 72  d %p %s %-12s pr
ee60: 6f 62 3d 25 2d 33 64 20 6f 70 3d 30 78 25 30 33  ob=%-3d op=0x%03
ee70: 78 20 77 74 46 6c 61 67 73 3d 30 78 25 30 34 78  x wtFlags=0x%04x
ee80: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 54 65 72  \n",.       iTer
ee90: 6d 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70 65 2c  m, pTerm, zType,
eea0: 20 7a 4c 65 66 74 2c 20 70 54 65 72 6d 2d 3e 74   zLeft, pTerm->t
eeb0: 72 75 74 68 50 72 6f 62 2c 0a 20 20 20 20 20 20  ruthProb,.      
eec0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
eed0: 72 2c 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  r, pTerm->wtFlag
eee0: 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 54  s);.    sqlite3T
eef0: 72 65 65 56 69 65 77 45 78 70 72 28 30 2c 20 70  reeViewExpr(0, p
ef00: 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30 29 3b  Term->pExpr, 0);
ef10: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
ef20: 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
ef30: 5f 45 4e 41 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 53  _ENABLED./*.** S
ef40: 68 6f 77 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  how the complete
ef50: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 57 68   content of a Wh
ef60: 65 72 65 43 6c 61 75 73 65 0a 2a 2f 0a 76 6f 69  ereClause.*/.voi
ef70: 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c  d sqlite3WhereCl
ef80: 61 75 73 65 50 72 69 6e 74 28 57 68 65 72 65 43  ausePrint(WhereC
ef90: 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69  lause *pWC){.  i
efa0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
efb0: 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69   i<pWC->nTerm; i
efc0: 2b 2b 29 7b 0a 20 20 20 20 77 68 65 72 65 54 65  ++){.    whereTe
efd0: 72 6d 50 72 69 6e 74 28 26 70 57 43 2d 3e 61 5b  rmPrint(&pWC->a[
efe0: 69 5d 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 23 65  i], i);.  }.}.#e
eff0: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 57 48 45  ndif..#ifdef WHE
f000: 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  RETRACE_ENABLED.
f010: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 57 68  /*.** Print a Wh
f020: 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 66  ereLoop object f
f030: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 70 75 72  or debugging pur
f040: 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  poses.*/.static 
f050: 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f 70 50 72  void whereLoopPr
f060: 69 6e 74 28 57 68 65 72 65 4c 6f 6f 70 20 2a 70  int(WhereLoop *p
f070: 2c 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70  , WhereClause *p
f080: 57 43 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  WC){.  WhereInfo
f090: 20 2a 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e   *pWInfo = pWC->
f0a0: 70 57 49 6e 66 6f 3b 0a 20 20 69 6e 74 20 6e 62  pWInfo;.  int nb
f0b0: 20 3d 20 31 2b 28 70 57 49 6e 66 6f 2d 3e 70 54   = 1+(pWInfo->pT
f0c0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2b 33 29 2f  abList->nSrc+3)/
f0d0: 34 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  4;.  struct SrcL
f0e0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
f0f0: 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69  = pWInfo->pTabLi
f100: 73 74 2d 3e 61 20 2b 20 70 2d 3e 69 54 61 62 3b  st->a + p->iTab;
f110: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
f120: 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
f130: 42 69 74 6d 61 73 6b 20 6d 41 6c 6c 20 3d 20 28  Bitmask mAll = (
f140: 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 6e  ((Bitmask)1)<<(n
f150: 62 2a 34 29 29 20 2d 20 31 3b 0a 20 20 73 71 6c  b*4)) - 1;.  sql
f160: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
f170: 22 25 63 25 32 64 2e 25 30 2a 6c 6c 78 2e 25 30  "%c%2d.%0*llx.%0
f180: 2a 6c 6c 78 22 2c 20 70 2d 3e 63 49 64 2c 0a 20  *llx", p->cId,. 
f190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1a0: 20 20 20 20 70 2d 3e 69 54 61 62 2c 20 6e 62 2c      p->iTab, nb,
f1b0: 20 70 2d 3e 6d 61 73 6b 53 65 6c 66 2c 20 6e 62   p->maskSelf, nb
f1c0: 2c 20 70 2d 3e 70 72 65 72 65 71 20 26 20 6d 41  , p->prereq & mA
f1d0: 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  ll);.  sqlite3De
f1e0: 62 75 67 50 72 69 6e 74 66 28 22 20 25 31 32 73  bugPrintf(" %12s
f1f0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
f200: 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 7a          pItem->z
f210: 41 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a  Alias ? pItem->z
f220: 41 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e  Alias : pTab->zN
f230: 61 6d 65 29 3b 0a 20 20 69 66 28 20 28 70 2d 3e  ame);.  if( (p->
f240: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
f250: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 3d 3d 30  VIRTUALTABLE)==0
f260: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
f270: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  ar *zName;.    i
f280: 66 28 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  f( p->u.btree.pI
f290: 6e 64 65 78 20 26 26 20 28 7a 4e 61 6d 65 20 3d  ndex && (zName =
f2a0: 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64   p->u.btree.pInd
f2b0: 65 78 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  ex->zName)!=0 ){
f2c0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
f2d0: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
f2e0: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 22 2c 20 31  e_autoindex_", 1
f2f0: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  7)==0 ){.       
f300: 20 69 6e 74 20 69 20 3d 20 73 71 6c 69 74 65 33   int i = sqlite3
f310: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 20  Strlen30(zName) 
f320: 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69  - 1;.        whi
f330: 6c 65 28 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f  le( zName[i]!='_
f340: 27 20 29 20 69 2d 2d 3b 0a 20 20 20 20 20 20 20  ' ) i--;.       
f350: 20 7a 4e 61 6d 65 20 2b 3d 20 69 3b 0a 20 20 20   zName += i;.   
f360: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
f370: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2e  e3DebugPrintf(".
f380: 25 2d 31 36 73 20 25 32 64 22 2c 20 7a 4e 61 6d  %-16s %2d", zNam
f390: 65 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  e, p->u.btree.nE
f3a0: 71 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  q);.    }else{. 
f3b0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
f3c0: 67 50 72 69 6e 74 66 28 22 25 32 30 73 22 2c 22  gPrintf("%20s","
f3d0: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ");.    }.  }els
f3e0: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a  e{.    char *z;.
f3f0: 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 76 74 61      if( p->u.vta
f400: 62 2e 69 64 78 53 74 72 20 29 7b 0a 20 20 20 20  b.idxStr ){.    
f410: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
f420: 72 69 6e 74 66 28 22 28 25 64 2c 5c 22 25 73 5c  rintf("(%d,\"%s\
f430: 22 2c 25 78 29 22 2c 0a 20 20 20 20 20 20 20 20  ",%x)",.        
f440: 20 20 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61          p->u.vta
f450: 62 2e 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76  b.idxNum, p->u.v
f460: 74 61 62 2e 69 64 78 53 74 72 2c 20 70 2d 3e 75  tab.idxStr, p->u
f470: 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b  .vtab.omitMask);
f480: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f490: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
f4a0: 72 69 6e 74 66 28 22 28 25 64 2c 25 78 29 22 2c  rintf("(%d,%x)",
f4b0: 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 4e 75   p->u.vtab.idxNu
f4c0: 6d 2c 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  m, p->u.vtab.omi
f4d0: 74 4d 61 73 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  tMask);.    }.  
f4e0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
f4f0: 69 6e 74 66 28 22 20 25 2d 31 39 73 22 2c 20 7a  intf(" %-19s", z
f500: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
f510: 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 20 20 69 66  ree(z);.  }.  if
f520: 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  ( p->wsFlags & W
f530: 48 45 52 45 5f 53 4b 49 50 53 43 41 4e 20 29 7b  HERE_SKIPSCAN ){
f540: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
f550: 67 50 72 69 6e 74 66 28 22 20 66 20 25 30 35 78  gPrintf(" f %05x
f560: 20 25 64 2d 25 64 22 2c 20 70 2d 3e 77 73 46 6c   %d-%d", p->wsFl
f570: 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 2c 70  ags, p->nLTerm,p
f580: 2d 3e 6e 53 6b 69 70 29 3b 0a 20 20 7d 65 6c 73  ->nSkip);.  }els
f590: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  e{.    sqlite3De
f5a0: 62 75 67 50 72 69 6e 74 66 28 22 20 66 20 25 30  bugPrintf(" f %0
f5b0: 35 78 20 4e 20 25 64 22 2c 20 70 2d 3e 77 73 46  5x N %d", p->wsF
f5c0: 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54 65 72 6d 29  lags, p->nLTerm)
f5d0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
f5e0: 65 62 75 67 50 72 69 6e 74 66 28 22 20 63 6f 73  ebugPrintf(" cos
f5f0: 74 20 25 64 2c 25 64 2c 25 64 5c 6e 22 2c 20 70  t %d,%d,%d\n", p
f600: 2d 3e 72 53 65 74 75 70 2c 20 70 2d 3e 72 52 75  ->rSetup, p->rRu
f610: 6e 2c 20 70 2d 3e 6e 4f 75 74 29 3b 0a 20 20 69  n, p->nOut);.  i
f620: 66 28 20 70 2d 3e 6e 4c 54 65 72 6d 20 26 26 20  f( p->nLTerm && 
f630: 28 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  (sqlite3WhereTra
f640: 63 65 20 26 20 30 78 31 30 30 29 21 3d 30 20 29  ce & 0x100)!=0 )
f650: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
f660: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
f670: 4c 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  LTerm; i++){.   
f680: 20 20 20 77 68 65 72 65 54 65 72 6d 50 72 69 6e     whereTermPrin
f690: 74 28 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2c 20  t(p->aLTerm[i], 
f6a0: 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  i);.    }.  }.}.
f6b0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f  #endif../*.** Co
f6c0: 6e 76 65 72 74 20 62 75 6c 6b 20 6d 65 6d 6f 72  nvert bulk memor
f6d0: 79 20 69 6e 74 6f 20 61 20 76 61 6c 69 64 20 57  y into a valid W
f6e0: 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 63 61  hereLoop that ca
f6f0: 6e 20 62 65 20 70 61 73 73 65 64 0a 2a 2a 20 74  n be passed.** t
f700: 6f 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72  o whereLoopClear
f710: 20 68 61 72 6d 6c 65 73 73 6c 79 2e 0a 2a 2f 0a   harmlessly..*/.
f720: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
f730: 65 4c 6f 6f 70 49 6e 69 74 28 57 68 65 72 65 4c  eLoopInit(WhereL
f740: 6f 6f 70 20 2a 70 29 7b 0a 20 20 70 2d 3e 61 4c  oop *p){.  p->aL
f750: 54 65 72 6d 20 3d 20 70 2d 3e 61 4c 54 65 72 6d  Term = p->aLTerm
f760: 53 70 61 63 65 3b 0a 20 20 70 2d 3e 6e 4c 54 65  Space;.  p->nLTe
f770: 72 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 4c 53  rm = 0;.  p->nLS
f780: 6c 6f 74 20 3d 20 41 72 72 61 79 53 69 7a 65 28  lot = ArraySize(
f790: 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 3b  p->aLTermSpace);
f7a0: 0a 20 20 70 2d 3e 77 73 46 6c 61 67 73 20 3d 20  .  p->wsFlags = 
f7b0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  0;.}../*.** Clea
f7c0: 72 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 2e  r the WhereLoop.
f7d0: 75 20 75 6e 69 6f 6e 2e 20 20 4c 65 61 76 65 20  u union.  Leave 
f7e0: 57 68 65 72 65 4c 6f 6f 70 2e 70 4c 54 65 72 6d  WhereLoop.pLTerm
f7f0: 20 69 6e 74 61 63 74 2e 0a 2a 2f 0a 73 74 61 74   intact..*/.stat
f800: 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
f810: 70 43 6c 65 61 72 55 6e 69 6f 6e 28 73 71 6c 69  pClearUnion(sqli
f820: 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f  te3 *db, WhereLo
f830: 6f 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  op *p){.  if( p-
f840: 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
f850: 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 7c 57  E_VIRTUALTABLE|W
f860: 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
f870: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e   ){.    if( (p->
f880: 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
f890: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
f8a0: 20 26 26 20 70 2d 3e 75 2e 76 74 61 62 2e 6e 65   && p->u.vtab.ne
f8b0: 65 64 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  edFree ){.      
f8c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
f8d0: 75 2e 76 74 61 62 2e 69 64 78 53 74 72 29 3b 0a  u.vtab.idxStr);.
f8e0: 20 20 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e        p->u.vtab.
f8f0: 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20  needFree = 0;.  
f900: 20 20 20 20 70 2d 3e 75 2e 76 74 61 62 2e 69 64      p->u.vtab.id
f910: 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 7d 65  xStr = 0;.    }e
f920: 6c 73 65 20 69 66 28 20 28 70 2d 3e 77 73 46 6c  lse if( (p->wsFl
f930: 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54 4f  ags & WHERE_AUTO
f940: 5f 49 4e 44 45 58 29 21 3d 30 20 26 26 20 70 2d  _INDEX)!=0 && p-
f950: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 21  >u.btree.pIndex!
f960: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
f970: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
f980: 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 2d  >u.btree.pIndex-
f990: 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20  >zColAff);.     
f9a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
f9b0: 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  b, p->u.btree.pI
f9c0: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ndex);.      p->
f9d0: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d  u.btree.pIndex =
f9e0: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
f9f0: 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74  ./*.** Deallocat
fa00: 65 20 69 6e 74 65 72 6e 61 6c 20 6d 65 6d 6f 72  e internal memor
fa10: 79 20 75 73 65 64 20 62 79 20 61 20 57 68 65 72  y used by a Wher
fa20: 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a  eLoop object.*/.
fa30: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
fa40: 65 4c 6f 6f 70 43 6c 65 61 72 28 73 71 6c 69 74  eLoopClear(sqlit
fa50: 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f  e3 *db, WhereLoo
fa60: 70 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  p *p){.  if( p->
fa70: 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72  aLTerm!=p->aLTer
fa80: 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33  mSpace ) sqlite3
fa90: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c  DbFree(db, p->aL
faa0: 54 65 72 6d 29 3b 0a 20 20 77 68 65 72 65 4c 6f  Term);.  whereLo
fab0: 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62 2c  opClearUnion(db,
fac0: 20 70 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70   p);.  whereLoop
fad0: 49 6e 69 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Init(p);.}../*.*
fae0: 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6d  * Increase the m
faf0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
fb00: 20 66 6f 72 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65   for pLoop->aLTe
fb10: 72 6d 5b 5d 20 74 6f 20 62 65 20 61 74 20 6c 65  rm[] to be at le
fb20: 61 73 74 20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ast n..*/.static
fb30: 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 52 65   int whereLoopRe
fb40: 73 69 7a 65 28 73 71 6c 69 74 65 33 20 2a 64 62  size(sqlite3 *db
fb50: 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 2c 20  , WhereLoop *p, 
fb60: 69 6e 74 20 6e 29 7b 0a 20 20 57 68 65 72 65 54  int n){.  WhereT
fb70: 65 72 6d 20 2a 2a 70 61 4e 65 77 3b 0a 20 20 69  erm **paNew;.  i
fb80: 66 28 20 70 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 20  f( p->nLSlot>=n 
fb90: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
fba0: 4f 4b 3b 0a 20 20 6e 20 3d 20 28 6e 2b 37 29 26  OK;.  n = (n+7)&
fbb0: 7e 37 3b 0a 20 20 70 61 4e 65 77 20 3d 20 73 71  ~7;.  paNew = sq
fbc0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
fbd0: 4e 4e 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 2d  NN(db, sizeof(p-
fbe0: 3e 61 4c 54 65 72 6d 5b 30 5d 29 2a 6e 29 3b 0a  >aLTerm[0])*n);.
fbf0: 20 20 69 66 28 20 70 61 4e 65 77 3d 3d 30 20 29    if( paNew==0 )
fc00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
fc10: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d  OMEM_BKPT;.  mem
fc20: 63 70 79 28 70 61 4e 65 77 2c 20 70 2d 3e 61 4c  cpy(paNew, p->aL
fc30: 54 65 72 6d 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  Term, sizeof(p->
fc40: 61 4c 54 65 72 6d 5b 30 5d 29 2a 70 2d 3e 6e 4c  aLTerm[0])*p->nL
fc50: 53 6c 6f 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Slot);.  if( p->
fc60: 61 4c 54 65 72 6d 21 3d 70 2d 3e 61 4c 54 65 72  aLTerm!=p->aLTer
fc70: 6d 53 70 61 63 65 20 29 20 73 71 6c 69 74 65 33  mSpace ) sqlite3
fc80: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 4c  DbFree(db, p->aL
fc90: 54 65 72 6d 29 3b 0a 20 20 70 2d 3e 61 4c 54 65  Term);.  p->aLTe
fca0: 72 6d 20 3d 20 70 61 4e 65 77 3b 0a 20 20 70 2d  rm = paNew;.  p-
fcb0: 3e 6e 4c 53 6c 6f 74 20 3d 20 6e 3b 0a 20 20 72  >nLSlot = n;.  r
fcc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fcd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66  .}../*.** Transf
fce0: 65 72 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  er content from 
fcf0: 74 68 65 20 73 65 63 6f 6e 64 20 70 4c 6f 6f 70  the second pLoop
fd00: 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74 2e   into the first.
fd10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
fd20: 68 65 72 65 4c 6f 6f 70 58 66 65 72 28 73 71 6c  hereLoopXfer(sql
fd30: 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c  ite3 *db, WhereL
fd40: 6f 6f 70 20 2a 70 54 6f 2c 20 57 68 65 72 65 4c  oop *pTo, WhereL
fd50: 6f 6f 70 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 77  oop *pFrom){.  w
fd60: 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69  hereLoopClearUni
fd70: 6f 6e 28 64 62 2c 20 70 54 6f 29 3b 0a 20 20 69  on(db, pTo);.  i
fd80: 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
fd90: 7a 65 28 64 62 2c 20 70 54 6f 2c 20 70 46 72 6f  ze(db, pTo, pFro
fda0: 6d 2d 3e 6e 4c 54 65 72 6d 29 20 29 7b 0a 20 20  m->nLTerm) ){.  
fdb0: 20 20 6d 65 6d 73 65 74 28 26 70 54 6f 2d 3e 75    memset(&pTo->u
fdc0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 54 6f 2d  , 0, sizeof(pTo-
fdd0: 3e 75 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >u));.    return
fde0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
fdf0: 50 54 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79  PT;.  }.  memcpy
fe00: 28 70 54 6f 2c 20 70 46 72 6f 6d 2c 20 57 48 45  (pTo, pFrom, WHE
fe10: 52 45 5f 4c 4f 4f 50 5f 58 46 45 52 5f 53 5a 29  RE_LOOP_XFER_SZ)
fe20: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2d 3e  ;.  memcpy(pTo->
fe30: 61 4c 54 65 72 6d 2c 20 70 46 72 6f 6d 2d 3e 61  aLTerm, pFrom->a
fe40: 4c 54 65 72 6d 2c 20 70 54 6f 2d 3e 6e 4c 54 65  LTerm, pTo->nLTe
fe50: 72 6d 2a 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 61  rm*sizeof(pTo->a
fe60: 4c 54 65 72 6d 5b 30 5d 29 29 3b 0a 20 20 69 66  LTerm[0]));.  if
fe70: 28 20 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73  ( pFrom->wsFlags
fe80: 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   & WHERE_VIRTUAL
fe90: 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 70 46 72  TABLE ){.    pFr
fea0: 6f 6d 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46  om->u.vtab.needF
feb0: 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ree = 0;.  }else
fec0: 20 69 66 28 20 28 70 46 72 6f 6d 2d 3e 77 73 46   if( (pFrom->wsF
fed0: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41 55 54  lags & WHERE_AUT
fee0: 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29 7b 0a 20  O_INDEX)!=0 ){. 
fef0: 20 20 20 70 46 72 6f 6d 2d 3e 75 2e 62 74 72 65     pFrom->u.btre
ff00: 65 2e 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  e.pIndex = 0;.  
ff10: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
ff20: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
ff30: 65 6c 65 74 65 20 61 20 57 68 65 72 65 4c 6f 6f  elete a WhereLoo
ff40: 70 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74 61 74  p object.*/.stat
ff50: 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c 6f 6f  ic void whereLoo
ff60: 70 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  pDelete(sqlite3 
ff70: 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
ff80: 70 29 7b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43  p){.  whereLoopC
ff90: 6c 65 61 72 28 64 62 2c 20 70 29 3b 0a 20 20 73  lear(db, p);.  s
ffa0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
ffb0: 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72   p);.}../*.** Fr
ffc0: 65 65 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73  ee a WhereInfo s
ffd0: 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74  tructure.*/.stat
ffe0: 69 63 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66  ic void whereInf
fff0: 6f 46 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64  oFree(sqlite3 *d
10000 62 2c 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  b, WhereInfo *pW
10010 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57  Info){.  if( ALW
10020 41 59 53 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20  AYS(pWInfo) ){. 
10030 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
10040 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d  r(i=0; i<pWInfo-
10050 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20  >nLevel; i++){. 
10060 20 20 20 20 20 57 68 65 72 65 4c 65 76 65 6c 20       WhereLevel 
10070 2a 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66  *pLevel = &pWInf
10080 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69  o->a[i];.      i
10090 66 28 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f  f( pLevel->pWLoo
100a0 70 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70 57  p && (pLevel->pW
100b0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
100c0 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 29 20 29  WHERE_IN_ABLE) )
100d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
100e0 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76  3DbFree(db, pLev
100f0 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
10100 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10110 0a 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72  .    sqlite3Wher
10120 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 57  eClauseClear(&pW
10130 49 6e 66 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20  Info->sWC);.    
10140 77 68 69 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70  while( pWInfo->p
10150 4c 6f 6f 70 73 20 29 7b 0a 20 20 20 20 20 20 57  Loops ){.      W
10160 68 65 72 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57  hereLoop *p = pW
10170 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20  Info->pLoops;.  
10180 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f      pWInfo->pLoo
10190 70 73 20 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f  ps = p->pNextLoo
101a0 70 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f  p;.      whereLo
101b0 6f 70 44 65 6c 65 74 65 28 64 62 2c 20 70 29 3b  opDelete(db, p);
101c0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
101d0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49  e3DbFree(db, pWI
101e0 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  nfo);.  }.}../*.
101f0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
10200 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
10210 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
10220 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 58 20  .**.**   (1)  X 
10230 68 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20  has the same or 
10240 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 74 20  lower cost that 
10250 59 0a 2a 2a 20 20 20 28 32 29 20 20 58 20 69 73  Y.**   (2)  X is
10260 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
10270 20 6f 66 20 59 0a 2a 2a 20 20 20 28 33 29 20 20   of Y.**   (3)  
10280 58 20 73 6b 69 70 73 20 61 74 20 6c 65 61 73 74  X skips at least
10290 20 61 73 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73   as many columns
102a0 20 61 73 20 59 0a 2a 2a 0a 2a 2a 20 42 79 20 22   as Y.**.** By "
102b0 70 72 6f 70 65 72 20 73 75 62 73 65 74 22 20 77  proper subset" w
102c0 65 20 6d 65 61 6e 20 74 68 61 74 20 58 20 75 73  e mean that X us
102d0 65 73 20 66 65 77 65 72 20 57 48 45 52 45 20 63  es fewer WHERE c
102e0 6c 61 75 73 65 20 74 65 72 6d 73 0a 2a 2a 20 74  lause terms.** t
102f0 68 61 6e 20 59 20 61 6e 64 20 74 68 61 74 20 65  han Y and that e
10300 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73  very WHERE claus
10310 65 20 74 65 72 6d 20 75 73 65 64 20 62 79 20 58  e term used by X
10320 20 69 73 20 61 6c 73 6f 20 75 73 65 64 0a 2a 2a   is also used.**
10330 20 62 79 20 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   by Y..**.** If 
10340 58 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75  X is a proper su
10350 62 73 65 74 20 6f 66 20 59 20 74 68 65 6e 20 59  bset of Y then Y
10360 20 69 73 20 61 20 62 65 74 74 65 72 20 63 68 6f   is a better cho
10370 69 63 65 20 61 6e 64 20 6f 75 67 68 74 0a 2a 2a  ice and ought.**
10380 20 74 6f 20 68 61 76 65 20 61 20 6c 6f 77 65 72   to have a lower
10390 20 63 6f 73 74 2e 20 20 54 68 69 73 20 72 6f 75   cost.  This rou
103a0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 54 52 55  tine returns TRU
103b0 45 20 77 68 65 6e 20 74 68 61 74 20 63 6f 73 74  E when that cost
103c0 20 0a 2a 2a 20 72 65 6c 61 74 69 6f 6e 73 68 69   .** relationshi
103d0 70 20 69 73 20 69 6e 76 65 72 74 65 64 20 61 6e  p is inverted an
103e0 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 64  d needs to be ad
103f0 6a 75 73 74 65 64 2e 20 20 54 68 65 20 74 68 69  justed.  The thi
10400 72 64 20 72 75 6c 65 0a 2a 2a 20 77 61 73 20 61  rd rule.** was a
10410 64 64 65 64 20 62 65 63 61 75 73 65 20 69 66 20  dded because if 
10420 58 20 75 73 65 73 20 73 6b 69 70 2d 73 63 61 6e  X uses skip-scan
10430 20 6c 65 73 73 20 74 68 61 6e 20 59 20 69 74 20   less than Y it 
10440 73 74 69 6c 6c 20 6d 69 67 68 74 0a 2a 2a 20 64  still might.** d
10450 65 73 65 72 76 65 20 61 20 6c 6f 77 65 72 20 63  eserve a lower c
10460 6f 73 74 20 65 76 65 6e 20 69 66 20 69 74 20 69  ost even if it i
10470 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65  s a proper subse
10480 74 20 6f 66 20 59 2e 0a 2a 2f 0a 73 74 61 74 69  t of Y..*/.stati
10490 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 43  c int whereLoopC
104a0 68 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73  heaperProperSubs
104b0 65 74 28 0a 20 20 63 6f 6e 73 74 20 57 68 65 72  et(.  const Wher
104c0 65 4c 6f 6f 70 20 2a 70 58 2c 20 20 20 20 20 20  eLoop *pX,      
104d0 20 2f 2a 20 46 69 72 73 74 20 57 68 65 72 65 4c   /* First WhereL
104e0 6f 6f 70 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  oop to compare *
104f0 2f 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c  /.  const WhereL
10500 6f 6f 70 20 2a 70 59 20 20 20 20 20 20 20 20 2f  oop *pY        /
10510 2a 20 43 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  * Compare agains
10520 74 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70  t this WhereLoop
10530 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
10540 6a 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6e 4c 54  j;.  if( pX->nLT
10550 65 72 6d 2d 70 58 2d 3e 6e 53 6b 69 70 20 3e 3d  erm-pX->nSkip >=
10560 20 70 59 2d 3e 6e 4c 54 65 72 6d 2d 70 59 2d 3e   pY->nLTerm-pY->
10570 6e 53 6b 69 70 20 29 7b 0a 20 20 20 20 72 65 74  nSkip ){.    ret
10580 75 72 6e 20 30 3b 20 2f 2a 20 58 20 69 73 20 6e  urn 0; /* X is n
10590 6f 74 20 61 20 73 75 62 73 65 74 20 6f 66 20 59  ot a subset of Y
105a0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 59   */.  }.  if( pY
105b0 2d 3e 6e 53 6b 69 70 20 3e 20 70 58 2d 3e 6e 53  ->nSkip > pX->nS
105c0 6b 69 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  kip ) return 0;.
105d0 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e    if( pX->rRun >
105e0 3d 20 70 59 2d 3e 72 52 75 6e 20 29 7b 0a 20 20  = pY->rRun ){.  
105f0 20 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e    if( pX->rRun >
10600 20 70 59 2d 3e 72 52 75 6e 20 29 20 72 65 74 75   pY->rRun ) retu
10610 72 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f  rn 0;    /* X co
10620 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20  sts more than Y 
10630 2a 2f 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 6e  */.    if( pX->n
10640 4f 75 74 20 3e 20 70 59 2d 3e 6e 4f 75 74 20 29  Out > pY->nOut )
10650 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a   return 0;    /*
10660 20 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68   X costs more th
10670 61 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f  an Y */.  }.  fo
10680 72 28 69 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31  r(i=pX->nLTerm-1
10690 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
106a0 20 20 69 66 28 20 70 58 2d 3e 61 4c 54 65 72 6d    if( pX->aLTerm
106b0 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
106c0 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 59 2d  e;.    for(j=pY-
106d0 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b  >nLTerm-1; j>=0;
106e0 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28   j--){.      if(
106f0 20 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d   pY->aLTerm[j]==
10700 70 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 29 20  pX->aLTerm[i] ) 
10710 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
10720 20 69 66 28 20 6a 3c 30 20 29 20 72 65 74 75 72   if( j<0 ) retur
10730 6e 20 30 3b 20 20 2f 2a 20 58 20 6e 6f 74 20 61  n 0;  /* X not a
10740 20 73 75 62 73 65 74 20 6f 66 20 59 20 73 69 6e   subset of Y sin
10750 63 65 20 74 65 72 6d 20 58 5b 69 5d 20 6e 6f 74  ce term X[i] not
10760 20 75 73 65 64 20 62 79 20 59 20 2a 2f 0a 20 20   used by Y */.  
10770 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f  }.  return 1;  /
10780 2a 20 41 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e 73  * All conditions
10790 20 6d 65 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a   meet */.}../*.*
107a0 2a 20 54 72 79 20 74 6f 20 61 64 6a 75 73 74 20  * Try to adjust 
107b0 74 68 65 20 63 6f 73 74 20 6f 66 20 57 68 65 72  the cost of Wher
107c0 65 4c 6f 6f 70 20 70 54 65 6d 70 6c 61 74 65 20  eLoop pTemplate 
107d0 75 70 77 61 72 64 73 20 6f 72 20 64 6f 77 6e 77  upwards or downw
107e0 61 72 64 73 20 73 6f 0a 2a 2a 20 74 68 61 74 3a  ards so.** that:
107f0 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 70 54 65  .**.**   (1) pTe
10800 6d 70 6c 61 74 65 20 63 6f 73 74 73 20 6c 65 73  mplate costs les
10810 73 20 74 68 61 6e 20 61 6e 79 20 6f 74 68 65 72  s than any other
10820 20 57 68 65 72 65 4c 6f 6f 70 73 20 74 68 61 74   WhereLoops that
10830 20 61 72 65 20 61 20 70 72 6f 70 65 72 0a 2a 2a   are a proper.**
10840 20 20 20 20 20 20 20 73 75 62 73 65 74 20 6f 66         subset of
10850 20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a   pTemplate.**.**
10860 20 20 20 28 32 29 20 70 54 65 6d 70 6c 61 74 65     (2) pTemplate
10870 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e   costs more than
10880 20 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65   any other Where
10890 4c 6f 6f 70 73 20 66 6f 72 20 77 68 69 63 68 20  Loops for which 
108a0 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 20 20 20 20  pTemplate.**    
108b0 20 20 20 69 73 20 61 20 70 72 6f 70 65 72 20 73     is a proper s
108c0 75 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ubset..**.** To 
108d0 73 61 79 20 22 57 68 65 72 65 4c 6f 6f 70 20 58  say "WhereLoop X
108e0 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62   is a proper sub
108f0 73 65 74 20 6f 66 20 59 22 20 6d 65 61 6e 73 20  set of Y" means 
10900 74 68 61 74 20 58 20 75 73 65 73 20 66 65 77 65  that X uses fewe
10910 72 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73  r.** WHERE claus
10920 65 20 74 65 72 6d 73 20 74 68 61 6e 20 59 20 61  e terms than Y a
10930 6e 64 20 74 68 61 74 20 65 76 65 72 79 20 57 48  nd that every WH
10940 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
10950 75 73 65 64 20 62 79 20 58 20 69 73 0a 2a 2a 20  used by X is.** 
10960 61 6c 73 6f 20 75 73 65 64 20 62 79 20 59 2e 0a  also used by Y..
10970 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
10980 68 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f  hereLoopAdjustCo
10990 73 74 28 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f  st(const WhereLo
109a0 6f 70 20 2a 70 2c 20 57 68 65 72 65 4c 6f 6f 70  op *p, WhereLoop
109b0 20 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20   *pTemplate){.  
109c0 69 66 28 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e  if( (pTemplate->
109d0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
109e0 49 4e 44 45 58 45 44 29 3d 3d 30 20 29 20 72 65  INDEXED)==0 ) re
109f0 74 75 72 6e 3b 0a 20 20 66 6f 72 28 3b 20 70 3b  turn;.  for(; p;
10a00 20 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29   p=p->pNextLoop)
10a10 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61  {.    if( p->iTa
10a20 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54  b!=pTemplate->iT
10a30 61 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ab ) continue;. 
10a40 20 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61     if( (p->wsFla
10a50 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  gs & WHERE_INDEX
10a60 45 44 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ED)==0 ) continu
10a70 65 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72 65  e;.    if( where
10a80 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65  LoopCheaperPrope
10a90 72 53 75 62 73 65 74 28 70 2c 20 70 54 65 6d 70  rSubset(p, pTemp
10aa0 6c 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  late) ){.      /
10ab0 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61  * Adjust pTempla
10ac0 74 65 20 63 6f 73 74 20 64 6f 77 6e 77 61 72 64  te cost downward
10ad0 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 63   so that it is c
10ae0 68 65 61 70 65 72 20 74 68 61 6e 20 69 74 73 20  heaper than its 
10af0 0a 20 20 20 20 20 20 2a 2a 20 73 75 62 73 65 74  .      ** subset
10b00 20 70 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48 45   p. */.      WHE
10b10 52 45 54 52 41 43 45 28 30 78 38 30 2c 28 22 73  RETRACE(0x80,("s
10b20 75 62 73 65 74 20 63 6f 73 74 20 61 64 6a 75 73  ubset cost adjus
10b30 74 6d 65 6e 74 20 25 64 2c 25 64 20 74 6f 20 25  tment %d,%d to %
10b40 64 2c 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d,%d\n",.       
10b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b60 70 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c  pTemplate->rRun,
10b70 20 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74   pTemplate->nOut
10b80 2c 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f  , p->rRun, p->nO
10b90 75 74 2d 31 29 29 3b 0a 20 20 20 20 20 20 70 54  ut-1));.      pT
10ba0 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20  emplate->rRun = 
10bb0 70 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70  p->rRun;.      p
10bc0 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d  Template->nOut =
10bd0 20 70 2d 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20   p->nOut - 1;.  
10be0 20 20 7d 65 6c 73 65 20 69 66 28 20 77 68 65 72    }else if( wher
10bf0 65 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70  eLoopCheaperProp
10c00 65 72 53 75 62 73 65 74 28 70 54 65 6d 70 6c 61  erSubset(pTempla
10c10 74 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20  te, p) ){.      
10c20 2f 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c  /* Adjust pTempl
10c30 61 74 65 20 63 6f 73 74 20 75 70 77 61 72 64 20  ate cost upward 
10c40 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 63 6f  so that it is co
10c50 73 74 6c 69 65 72 20 74 68 61 6e 20 70 20 73 69  stlier than p si
10c60 6e 63 65 0a 20 20 20 20 20 20 2a 2a 20 70 54 65  nce.      ** pTe
10c70 6d 70 6c 61 74 65 20 69 73 20 61 20 70 72 6f 70  mplate is a prop
10c80 65 72 20 73 75 62 73 65 74 20 6f 66 20 70 20 2a  er subset of p *
10c90 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41  /.      WHERETRA
10ca0 43 45 28 30 78 38 30 2c 28 22 73 75 62 73 65 74  CE(0x80,("subset
10cb0 20 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74   cost adjustment
10cc0 20 25 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c   %d,%d to %d,%d\
10cd0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
10ce0 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70             pTemp
10cf0 6c 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d  late->rRun, pTem
10d00 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e  plate->nOut, p->
10d10 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29  rRun, p->nOut+1)
10d20 29 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61  );.      pTempla
10d30 74 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52  te->rRun = p->rR
10d40 75 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c  un;.      pTempl
10d50 61 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e  ate->nOut = p->n
10d60 4f 75 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20  Out + 1;.    }. 
10d70 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72   }.}../*.** Sear
10d80 63 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57  ch the list of W
10d90 68 65 72 65 4c 6f 6f 70 73 20 69 6e 20 2a 70 70  hereLoops in *pp
10da0 50 72 65 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  Prev looking for
10db0 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 62 65   one that can be
10dc0 0a 2a 2a 20 73 75 70 70 6c 61 6e 74 65 64 20 62  .** supplanted b
10dd0 79 20 70 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a  y pTemplate..**.
10de0 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ** Return NULL i
10df0 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20  f the WhereLoop 
10e00 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e  list contains an
10e10 20 65 6e 74 72 79 20 74 68 61 74 20 63 61 6e 20   entry that can 
10e20 73 75 70 70 6c 61 6e 74 0a 2a 2a 20 70 54 65 6d  supplant.** pTem
10e30 70 6c 61 74 65 2c 20 69 6e 20 6f 74 68 65 72 20  plate, in other 
10e40 77 6f 72 64 73 20 69 66 20 70 54 65 6d 70 6c 61  words if pTempla
10e50 74 65 20 64 6f 65 73 20 6e 6f 74 20 62 65 6c 6f  te does not belo
10e60 6e 67 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ng on the list..
10e70 2a 2a 0a 2a 2a 20 49 66 20 70 58 20 69 73 20 61  **.** If pX is a
10e80 20 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20   WhereLoop that 
10e90 70 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 73 75  pTemplate can su
10ea0 70 70 6c 61 6e 74 2c 20 74 68 65 6e 20 72 65 74  pplant, then ret
10eb0 75 72 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20  urn the.** link 
10ec0 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 70  that points to p
10ed0 58 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 65 6d  X..**.** If pTem
10ee0 70 6c 61 74 65 20 63 61 6e 6e 6f 74 20 73 75 70  plate cannot sup
10ef0 70 6c 61 6e 74 20 61 6e 79 20 65 78 69 73 74 69  plant any existi
10f00 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ng element of th
10f10 65 20 6c 69 73 74 20 62 75 74 20 6e 65 65 64 73  e list but needs
10f20 0a 2a 2a 20 74 6f 20 62 65 20 61 64 64 65 64 20  .** to be added 
10f30 74 6f 20 74 68 65 20 6c 69 73 74 2c 20 74 68 65  to the list, the
10f40 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  n return a point
10f50 65 72 20 74 6f 20 74 68 65 20 74 61 69 6c 20 6f  er to the tail o
10f60 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73  f the list..*/.s
10f70 74 61 74 69 63 20 57 68 65 72 65 4c 6f 6f 70 20  tatic WhereLoop 
10f80 2a 2a 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c  **whereLoopFindL
10f90 65 73 73 65 72 28 0a 20 20 57 68 65 72 65 4c 6f  esser(.  WhereLo
10fa0 6f 70 20 2a 2a 70 70 50 72 65 76 2c 0a 20 20 63  op **ppPrev,.  c
10fb0 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a  onst WhereLoop *
10fc0 70 54 65 6d 70 6c 61 74 65 0a 29 7b 0a 20 20 57  pTemplate.){.  W
10fd0 68 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66  hereLoop *p;.  f
10fe0 6f 72 28 70 3d 28 2a 70 70 50 72 65 76 29 3b 20  or(p=(*ppPrev); 
10ff0 70 3b 20 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e  p; ppPrev=&p->pN
11000 65 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72  extLoop, p=*ppPr
11010 65 76 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  ev){.    if( p->
11020 69 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d  iTab!=pTemplate-
11030 3e 69 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72  >iTab || p->iSor
11040 74 49 64 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d  tIdx!=pTemplate-
11050 3e 69 53 6f 72 74 49 64 78 20 29 7b 0a 20 20 20  >iSortIdx ){.   
11060 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20     /* If either 
11070 74 68 65 20 69 54 61 62 20 6f 72 20 69 53 6f 72  the iTab or iSor
11080 74 49 64 78 20 76 61 6c 75 65 73 20 66 6f 72 20  tIdx values for 
11090 74 77 6f 20 57 68 65 72 65 4c 6f 6f 70 20 61 72  two WhereLoop ar
110a0 65 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20  e different.    
110b0 20 20 2a 2a 20 74 68 65 6e 20 74 68 6f 73 65 20    ** then those 
110c0 57 68 65 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20  WhereLoops need 
110d0 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  to be considered
110e0 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20 4e 65   separately.  Ne
110f0 69 74 68 65 72 20 69 73 0a 20 20 20 20 20 20 2a  ither is.      *
11100 2a 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f  * a candidate to
11110 20 72 65 70 6c 61 63 65 20 74 68 65 20 6f 74 68   replace the oth
11120 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  er. */.      con
11130 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
11140 20 2f 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65   /* In the curre
11150 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  nt implementatio
11160 6e 2c 20 74 68 65 20 72 53 65 74 75 70 20 76 61  n, the rSetup va
11170 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 7a 65  lue is either ze
11180 72 6f 0a 20 20 20 20 2a 2a 20 6f 72 20 74 68 65  ro.    ** or the
11190 20 63 6f 73 74 20 6f 66 20 62 75 69 6c 64 69 6e   cost of buildin
111a0 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  g an automatic i
111b0 6e 64 65 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64  ndex (NlogN) and
111c0 20 74 68 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a   the NlogN.    *
111d0 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 66 6f  * is the same fo
111e0 72 20 63 6f 6d 70 61 74 69 62 6c 65 20 57 68 65  r compatible Whe
111f0 72 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20  reLoops. */.    
11200 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75  assert( p->rSetu
11210 70 3d 3d 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74  p==0 || pTemplat
11220 65 2d 3e 72 53 65 74 75 70 3d 3d 30 20 0a 20 20  e->rSetup==0 .  
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
11240 7c 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65  | p->rSetup==pTe
11250 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29  mplate->rSetup )
11260 3b 0a 0a 20 20 20 20 2f 2a 20 77 68 65 72 65 4c  ;..    /* whereL
11270 6f 6f 70 41 64 64 42 74 72 65 65 28 29 20 61 6c  oopAddBtree() al
11280 77 61 79 73 20 67 65 6e 65 72 61 74 65 73 20 61  ways generates a
11290 6e 64 20 69 6e 73 65 72 74 73 20 74 68 65 20 61  nd inserts the a
112a0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 20  utomatic index. 
112b0 20 20 20 2a 2a 20 63 61 73 65 20 66 69 72 73 74     ** case first
112c0 2e 20 20 48 65 6e 63 65 20 63 6f 6d 70 61 74 69  .  Hence compati
112d0 62 6c 65 20 63 61 6e 64 69 64 61 74 65 20 57 68  ble candidate Wh
112e0 65 72 65 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68  ereLoops never h
112f0 61 76 65 20 61 20 6c 61 72 67 65 72 0a 20 20 20  ave a larger.   
11300 20 2a 2a 20 72 53 65 74 75 70 2e 20 43 61 6c 6c   ** rSetup. Call
11310 20 74 68 69 73 20 53 45 54 55 50 2d 49 4e 56 41   this SETUP-INVA
11320 52 49 41 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73  RIANT */.    ass
11330 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d  ert( p->rSetup>=
11340 70 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75  pTemplate->rSetu
11350 70 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e 79  p );..    /* Any
11360 20 6c 6f 6f 70 20 75 73 69 6e 67 20 61 6e 20 61   loop using an a
11370 70 70 6c 69 61 74 69 6f 6e 2d 64 65 66 69 6e 65  ppliation-define
11380 64 20 69 6e 64 65 78 20 28 6f 72 20 50 52 49 4d  d index (or PRIM
11390 41 52 59 20 4b 45 59 20 6f 72 0a 20 20 20 20 2a  ARY KEY or.    *
113a0 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
113b0 69 6e 74 29 20 77 69 74 68 20 6f 6e 65 20 6f 72  int) with one or
113c0 20 6d 6f 72 65 20 3d 3d 20 63 6f 6e 73 74 72 61   more == constra
113d0 69 6e 74 73 20 69 73 20 62 65 74 74 65 72 0a 20  ints is better. 
113e0 20 20 20 2a 2a 20 74 68 61 6e 20 61 6e 20 61 75     ** than an au
113f0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 55  tomatic index. U
11400 6e 6c 65 73 73 20 69 74 20 69 73 20 61 20 73 6b  nless it is a sk
11410 69 70 2d 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20  ip-scan. */.    
11420 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
11430 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
11440 45 58 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  EX)!=0.     && (
11450 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 53 6b 69 70  pTemplate->nSkip
11460 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )==0.     && (pT
11470 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73  emplate->wsFlags
11480 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
11490 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54  )!=0.     && (pT
114a0 65 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73  emplate->wsFlags
114b0 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
114c0 45 51 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  EQ)!=0.     && (
114d0 70 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d  p->prereq & pTem
114e0 70 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d  plate->prereq)==
114f0 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65  pTemplate->prere
11500 71 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62  q.    ){.      b
11510 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
11520 20 2f 2a 20 49 66 20 65 78 69 73 74 69 6e 67 20   /* If existing 
11530 57 68 65 72 65 4c 6f 6f 70 20 70 20 69 73 20 62  WhereLoop p is b
11540 65 74 74 65 72 20 74 68 61 6e 20 70 54 65 6d 70  etter than pTemp
11550 6c 61 74 65 2c 20 70 54 65 6d 70 6c 61 74 65 20  late, pTemplate 
11560 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 64 69  can be.    ** di
11570 73 63 61 72 64 65 64 2e 20 20 57 68 65 72 65 4c  scarded.  WhereL
11580 6f 6f 70 20 70 20 69 73 20 62 65 74 74 65 72 20  oop p is better 
11590 69 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29  if:.    **   (1)
115a0 20 20 70 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20    p has no more 
115b0 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61  dependencies tha
115c0 6e 20 70 54 65 6d 70 6c 61 74 65 2c 20 61 6e 64  n pTemplate, and
115d0 0a 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20 70  .    **   (2)  p
115e0 20 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72   has an equal or
115f0 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e   lower cost than
11600 20 70 54 65 6d 70 6c 61 74 65 0a 20 20 20 20 2a   pTemplate.    *
11610 2f 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72  /.    if( (p->pr
11620 65 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65  ereq & pTemplate
11630 2d 3e 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72  ->prereq)==p->pr
11640 65 72 65 71 20 20 20 20 2f 2a 20 28 31 29 20 20  ereq    /* (1)  
11650 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 53  */.     && p->rS
11660 65 74 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d  etup<=pTemplate-
11670 3e 72 53 65 74 75 70 20 20 20 20 20 20 20 20 20  >rSetup         
11680 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 61 29           /* (2a)
11690 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72   */.     && p->r
116a0 52 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Run<=pTemplate->
116b0 72 52 75 6e 20 20 20 20 20 20 20 20 20 20 20 20  rRun            
116c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62            /* (2b
116d0 29 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e  ) */.     && p->
116e0 6e 4f 75 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d  nOut<=pTemplate-
116f0 3e 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  >nOut           
11700 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
11710 63 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20  c) */.    ){.   
11720 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
11730 20 44 69 73 63 61 72 64 20 70 54 65 6d 70 6c 61   Discard pTempla
11740 74 65 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20  te */.    }..   
11750 20 2f 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65   /* If pTemplate
11760 20 69 73 20 61 6c 77 61 79 73 20 62 65 74 74 65   is always bette
11770 72 20 74 68 61 6e 20 70 2c 20 74 68 65 6e 20 63  r than p, then c
11780 61 75 73 65 20 70 20 74 6f 20 62 65 20 6f 76 65  ause p to be ove
11790 72 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20  rwritten.    ** 
117a0 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 2e 20  with pTemplate. 
117b0 20 70 54 65 6d 70 6c 61 74 65 20 69 73 20 62 65   pTemplate is be
117c0 74 74 65 72 20 74 68 61 6e 20 70 20 69 66 3a 0a  tter than p if:.
117d0 20 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70 54      **   (1)  pT
117e0 65 6d 70 6c 61 74 65 20 68 61 73 20 6e 6f 20 6d  emplate has no m
117f0 6f 72 65 20 64 65 70 65 6e 64 65 6e 63 65 73 20  ore dependences 
11800 74 68 61 6e 20 70 2c 20 61 6e 64 0a 20 20 20 20  than p, and.    
11810 2a 2a 20 20 20 28 32 29 20 20 70 54 65 6d 70 6c  **   (2)  pTempl
11820 61 74 65 20 68 61 73 20 61 6e 20 65 71 75 61 6c  ate has an equal
11830 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74   or lower cost t
11840 68 61 6e 20 70 2e 0a 20 20 20 20 2a 2f 0a 20 20  han p..    */.  
11850 20 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71    if( (p->prereq
11860 20 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72   & pTemplate->pr
11870 65 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65  ereq)==pTemplate
11880 2d 3e 70 72 65 72 65 71 20 20 20 2f 2a 20 28 31  ->prereq   /* (1
11890 29 20 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d  )  */.     && p-
118a0 3e 72 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65  >rRun>=pTemplate
118b0 2d 3e 72 52 75 6e 20 20 20 20 20 20 20 20 20 20  ->rRun          
118c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118d0 20 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20     /* (2a) */.  
118e0 20 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70     && p->nOut>=p
118f0 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20  Template->nOut  
11900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
11920 62 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20  b) */.    ){.   
11930 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53     assert( p->rS
11940 65 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  etup>=pTemplate-
11950 3e 72 53 65 74 75 70 20 29 3b 20 2f 2a 20 53 45  >rSetup ); /* SE
11960 54 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 61 62  TUP-INVARIANT ab
11970 6f 76 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65  ove */.      bre
11980 61 6b 3b 20 20 20 2f 2a 20 43 61 75 73 65 20 70  ak;   /* Cause p
11990 20 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74   to be overwritt
119a0 65 6e 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20  en by pTemplate 
119b0 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  */.    }.  }.  r
119c0 65 74 75 72 6e 20 70 70 50 72 65 76 3b 0a 7d 0a  eturn ppPrev;.}.
119d0 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72  ./*.** Insert or
119e0 20 72 65 70 6c 61 63 65 20 61 20 57 68 65 72 65   replace a Where
119f0 4c 6f 6f 70 20 65 6e 74 72 79 20 75 73 69 6e 67  Loop entry using
11a00 20 74 68 65 20 74 65 6d 70 6c 61 74 65 20 73 75   the template su
11a10 70 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  pplied..**.** An
11a20 20 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c   existing WhereL
11a30 6f 6f 70 20 65 6e 74 72 79 20 6d 69 67 68 74 20  oop entry might 
11a40 62 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69  be overwritten i
11a50 66 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61  f the new templa
11a60 74 65 0a 2a 2a 20 69 73 20 62 65 74 74 65 72 20  te.** is better 
11a70 61 6e 64 20 68 61 73 20 66 65 77 65 72 20 64 65  and has fewer de
11a80 70 65 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72 20  pendencies.  Or 
11a90 74 68 65 20 74 65 6d 70 6c 61 74 65 20 77 69 6c  the template wil
11aa0 6c 20 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20  l be ignored.** 
11ab0 61 6e 64 20 6e 6f 20 69 6e 73 65 72 74 20 77 69  and no insert wi
11ac0 6c 6c 20 6f 63 63 75 72 20 69 66 20 61 6e 20 65  ll occur if an e
11ad0 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f  xisting WhereLoo
11ae0 70 20 69 73 20 66 61 73 74 65 72 20 61 6e 64 20  p is faster and 
11af0 68 61 73 0a 2a 2a 20 66 65 77 65 72 20 64 65 70  has.** fewer dep
11b00 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74  endencies than t
11b10 68 65 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74  he template.  Ot
11b20 68 65 72 77 69 73 65 20 61 20 6e 65 77 20 57 68  herwise a new Wh
11b30 65 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64  ereLoop is.** ad
11b40 64 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ded based on the
11b50 20 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a   template..**.**
11b60 20 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f   If pBuilder->pO
11b70 72 53 65 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  rSet is not NULL
11b80 20 74 68 65 6e 20 77 65 20 63 61 72 65 20 61 62   then we care ab
11b90 6f 75 74 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  out only the.** 
11ba0 70 72 65 72 65 71 75 69 73 69 74 65 73 20 61 6e  prerequisites an
11bb0 64 20 72 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20  d rRun and nOut 
11bc0 63 6f 73 74 73 20 6f 66 20 74 68 65 20 4e 20 62  costs of the N b
11bd0 65 73 74 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74  est loops.  That
11be0 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
11bf0 69 73 20 67 61 74 68 65 72 65 64 20 69 6e 20 74  is gathered in t
11c00 68 65 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  he pBuilder->pOr
11c10 53 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69  Set object.  Thi
11c20 73 20 73 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f  s special.** pro
11c30 63 65 73 73 69 6e 67 20 6d 6f 64 65 20 69 73 20  cessing mode is 
11c40 75 73 65 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52  used only for OR
11c50 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
11c60 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ng..**.** When a
11c70 63 63 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74  ccumulating mult
11c80 69 70 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e  iple loops (when
11c90 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65   pBuilder->pOrSe
11ca0 74 20 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a  t is NULL) we.**
11cb0 20 73 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65   still might ove
11cc0 72 77 72 69 74 65 20 73 69 6d 69 6c 61 72 20 6c  rwrite similar l
11cd0 6f 6f 70 73 20 77 69 74 68 20 74 68 65 20 6e 65  oops with the ne
11ce0 77 20 74 65 6d 70 6c 61 74 65 20 69 66 20 74 68  w template if th
11cf0 65 0a 2a 2a 20 6e 65 77 20 74 65 6d 70 6c 61 74  e.** new templat
11d00 65 20 69 73 20 62 65 74 74 65 72 2e 20 20 4c 6f  e is better.  Lo
11d10 6f 70 73 20 6d 61 79 20 62 65 20 6f 76 65 72 77  ops may be overw
11d20 72 69 74 74 65 6e 20 69 66 20 74 68 65 20 66 6f  ritten if the fo
11d30 6c 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64  llowing .** cond
11d40 69 74 69 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a  itions are met:.
11d50 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
11d60 65 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  ey have the same
11d70 20 69 54 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29   iTab..**    (2)
11d80 20 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20    They have the 
11d90 73 61 6d 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a  same iSortIdx..*
11da0 2a 20 20 20 20 28 33 29 20 20 54 68 65 20 74 65  *    (3)  The te
11db0 6d 70 6c 61 74 65 20 68 61 73 20 73 61 6d 65 20  mplate has same 
11dc0 6f 72 20 66 65 77 65 72 20 64 65 70 65 6e 64 65  or fewer depende
11dd0 6e 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 63  ncies than the c
11de0 75 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20  urrent loop.**  
11df0 20 20 28 34 29 20 20 54 68 65 20 74 65 6d 70 6c    (4)  The templ
11e00 61 74 65 20 68 61 73 20 74 68 65 20 73 61 6d 65  ate has the same
11e10 20 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74   or lower cost t
11e20 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  han the current 
11e30 6c 6f 6f 70 0a 2a 2f 0a 73 74 61 74 69 63 20 69  loop.*/.static i
11e40 6e 74 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65  nt whereLoopInse
11e50 72 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c  rt(WhereLoopBuil
11e60 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 57  der *pBuilder, W
11e70 68 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c  hereLoop *pTempl
11e80 61 74 65 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f  ate){.  WhereLoo
11e90 70 20 2a 2a 70 70 50 72 65 76 2c 20 2a 70 3b 0a  p **ppPrev, *p;.
11ea0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
11eb0 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
11ec0 70 57 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65  pWInfo;.  sqlite
11ed0 33 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e  3 *db = pWInfo->
11ee0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
11ef0 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  t rc;..  /* If p
11f00 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20  Builder->pOrSet 
11f10 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e  is defined, then
11f20 20 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61 63 6b   only keep track
11f30 20 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20   of the costs.  
11f40 2a 2a 20 61 6e 64 20 70 72 65 72 65 71 73 2e 0a  ** and prereqs..
11f50 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c    */.  if( pBuil
11f60 64 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29  der->pOrSet!=0 )
11f70 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 6c  {.    if( pTempl
11f80 61 74 65 2d 3e 6e 4c 54 65 72 6d 20 29 7b 0a 23  ate->nLTerm ){.#
11f90 69 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  if WHERETRACE_EN
11fa0 41 42 4c 45 44 0a 20 20 20 20 20 20 75 31 36 20  ABLED.      u16 
11fb0 6e 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f  n = pBuilder->pO
11fc0 72 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 20 20 69  rSet->n;.      i
11fd0 6e 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20  nt x =.#endif.  
11fe0 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72      whereOrInser
11ff0 74 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  t(pBuilder->pOrS
12000 65 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70  et, pTemplate->p
12010 72 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74 65  rereq, pTemplate
12020 2d 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20 20  ->rRun,.        
12030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12040 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d              pTem
12050 70 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69  plate->nOut);.#i
12060 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
12070 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
12080 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
12090 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
120a0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
120b0 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 78  te3DebugPrintf(x
120c0 3f 22 20 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22  ?"   or-%d:  ":"
120d0 20 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b     or-X:  ", n);
120e0 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f  .        whereLo
120f0 6f 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74  opPrint(pTemplat
12100 65 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  e, pBuilder->pWC
12110 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
12120 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  f.    }.    retu
12130 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12140 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72  }..  /* Look for
12150 20 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65   an existing Whe
12160 72 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63  reLoop to replac
12170 65 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65  e with pTemplate
12180 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f  .  */.  whereLoo
12190 70 41 64 6a 75 73 74 43 6f 73 74 28 70 57 49 6e  pAdjustCost(pWIn
121a0 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d  fo->pLoops, pTem
121b0 70 6c 61 74 65 29 3b 0a 20 20 70 70 50 72 65 76  plate);.  ppPrev
121c0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64   = whereLoopFind
121d0 4c 65 73 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e  Lesser(&pWInfo->
121e0 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74  pLoops, pTemplat
121f0 65 29 3b 0a 0a 20 20 69 66 28 20 70 70 50 72 65  e);..  if( ppPre
12200 76 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  v==0 ){.    /* T
12210 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69  here already exi
12220 73 74 73 20 61 20 57 68 65 72 65 4c 6f 6f 70 20  sts a WhereLoop 
12230 6f 6e 20 74 68 65 20 6c 69 73 74 20 74 68 61 74  on the list that
12240 20 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a   is better.    *
12250 2a 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65  * than pTemplate
12260 2c 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65  , so just ignore
12270 20 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69   pTemplate */.#i
12280 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
12290 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20  BLED /* 0x8 */. 
122a0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
122b0 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
122c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
122d0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 73  ebugPrintf("   s
122e0 6b 69 70 3a 20 22 29 3b 0a 20 20 20 20 20 20 77  kip: ");.      w
122f0 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54  hereLoopPrint(pT
12300 65 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65  emplate, pBuilde
12310 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23  r->pWC);.    }.#
12320 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
12330 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20   SQLITE_OK;  .  
12340 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a  }else{.    p = *
12350 70 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f  ppPrev;.  }..  /
12360 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68  * If we reach th
12370 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e  is point it mean
12380 73 20 74 68 61 74 20 65 69 74 68 65 72 20 70 5b  s that either p[
12390 5d 20 73 68 6f 75 6c 64 20 62 65 20 6f 76 65 72  ] should be over
123a0 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74  written.  ** wit
123b0 68 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66  h pTemplate[] if
123c0 20 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72 20   p[] exists, or 
123d0 69 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20  if p==NULL then 
123e0 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a 20  allocate a new. 
123f0 20 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e   ** WhereLoop an
12400 64 20 69 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a  d insert it..  *
12410 2f 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45  /.#if WHERETRACE
12420 5f 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20  _ENABLED /* 0x8 
12430 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
12440 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38  WhereTrace & 0x8
12450 20 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30   ){.    if( p!=0
12460 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
12470 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 72 65  3DebugPrintf("re
12480 70 6c 61 63 65 3a 20 22 29 3b 0a 20 20 20 20 20  place: ");.     
12490 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
124a0 70 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43  p, pBuilder->pWC
124b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
124c0 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
124d0 22 20 20 20 20 61 64 64 3a 20 22 29 3b 0a 20 20  "    add: ");.  
124e0 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74    whereLoopPrint
124f0 28 70 54 65 6d 70 6c 61 74 65 2c 20 70 42 75 69  (pTemplate, pBui
12500 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20 20 7d 0a  lder->pWC);.  }.
12510 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 3d 3d  #endif.  if( p==
12520 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f  0 ){.    /* Allo
12530 63 61 74 65 20 61 20 6e 65 77 20 57 68 65 72 65  cate a new Where
12540 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74 6f 20 74  Loop to add to t
12550 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c 69  he end of the li
12560 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70 50 72 65  st */.    *ppPre
12570 76 20 3d 20 70 20 3d 20 73 71 6c 69 74 65 33 44  v = p = sqlite3D
12580 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c  bMallocRawNN(db,
12590 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f   sizeof(WhereLoo
125a0 70 29 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  p));.    if( p==
125b0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
125c0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
125d0 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28    whereLoopInit(
125e0 70 29 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74  p);.    p->pNext
125f0 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Loop = 0;.  }els
12600 65 7b 0a 20 20 20 20 2f 2a 20 57 65 20 77 69 6c  e{.    /* We wil
12610 6c 20 62 65 20 6f 76 65 72 77 72 69 74 69 6e 67  l be overwriting
12620 20 57 68 65 72 65 4c 6f 6f 70 20 70 5b 5d 2e 20   WhereLoop p[]. 
12630 20 42 75 74 20 62 65 66 6f 72 65 20 77 65 20 64   But before we d
12640 6f 2c 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20  o, first.    ** 
12650 67 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20 72  go through the r
12660 65 73 74 20 6f 66 20 74 68 65 20 6c 69 73 74 20  est of the list 
12670 61 6e 64 20 64 65 6c 65 74 65 20 61 6e 79 20 6f  and delete any o
12680 74 68 65 72 20 65 6e 74 72 69 65 73 20 62 65 73  ther entries bes
12690 69 64 65 73 0a 20 20 20 20 2a 2a 20 70 5b 5d 20  ides.    ** p[] 
126a0 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73 75  that are also su
126b0 70 70 6c 61 74 65 64 20 62 79 20 70 54 65 6d 70  pplated by pTemp
126c0 6c 61 74 65 20 2a 2f 0a 20 20 20 20 57 68 65 72  late */.    Wher
126d0 65 4c 6f 6f 70 20 2a 2a 70 70 54 61 69 6c 20 3d  eLoop **ppTail =
126e0 20 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a   &p->pNextLoop;.
126f0 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
12700 54 6f 44 65 6c 3b 0a 20 20 20 20 77 68 69 6c 65  ToDel;.    while
12710 28 20 2a 70 70 54 61 69 6c 20 29 7b 0a 20 20 20  ( *ppTail ){.   
12720 20 20 20 70 70 54 61 69 6c 20 3d 20 77 68 65 72     ppTail = wher
12730 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73 65 72 28  eLoopFindLesser(
12740 70 70 54 61 69 6c 2c 20 70 54 65 6d 70 6c 61 74  ppTail, pTemplat
12750 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 70  e);.      if( pp
12760 54 61 69 6c 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Tail==0 ) break;
12770 0a 20 20 20 20 20 20 70 54 6f 44 65 6c 20 3d 20  .      pToDel = 
12780 2a 70 70 54 61 69 6c 3b 0a 20 20 20 20 20 20 69  *ppTail;.      i
12790 66 28 20 70 54 6f 44 65 6c 3d 3d 30 20 29 20 62  f( pToDel==0 ) b
127a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 2a 70 70 54  reak;.      *ppT
127b0 61 69 6c 20 3d 20 70 54 6f 44 65 6c 2d 3e 70 4e  ail = pToDel->pN
127c0 65 78 74 4c 6f 6f 70 3b 0a 23 69 66 20 57 48 45  extLoop;.#if WHE
127d0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
127e0 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20 20 20 20  /* 0x8 */.      
127f0 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72 65  if( sqlite3Where
12800 54 72 61 63 65 20 26 20 30 78 38 20 29 7b 0a 20  Trace & 0x8 ){. 
12810 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
12820 62 75 67 50 72 69 6e 74 66 28 22 20 64 65 6c 65  bugPrintf(" dele
12830 74 65 3a 20 22 29 3b 0a 20 20 20 20 20 20 20 20  te: ");.        
12840 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
12850 54 6f 44 65 6c 2c 20 70 42 75 69 6c 64 65 72 2d  ToDel, pBuilder-
12860 3e 70 57 43 29 3b 0a 20 20 20 20 20 20 7d 0a 23  >pWC);.      }.#
12870 65 6e 64 69 66 0a 20 20 20 20 20 20 77 68 65 72  endif.      wher
12880 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64 62 2c 20  eLoopDelete(db, 
12890 70 54 6f 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20  pToDel);.    }. 
128a0 20 7d 0a 20 20 72 63 20 3d 20 77 68 65 72 65 4c   }.  rc = whereL
128b0 6f 6f 70 58 66 65 72 28 64 62 2c 20 70 2c 20 70  oopXfer(db, p, p
128c0 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20 69 66 28  Template);.  if(
128d0 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
128e0 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
128f0 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 49 6e 64  E)==0 ){.    Ind
12900 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 2d 3e  ex *pIndex = p->
12910 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
12920 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26      if( pIndex &
12930 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3d 3d  & pIndex->tnum==
12940 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  0 ){.      p->u.
12950 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20 30  btree.pIndex = 0
12960 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
12970 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12980 2a 20 41 64 6a 75 73 74 20 74 68 65 20 57 68 65  * Adjust the Whe
12990 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76 61 6c 75  reLoop.nOut valu
129a0 65 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 61 63  e downward to ac
129b0 63 6f 75 6e 74 20 66 6f 72 20 74 65 72 6d 73 20  count for terms 
129c0 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45 52 45 20  of the.** WHERE 
129d0 63 6c 61 75 73 65 20 74 68 61 74 20 72 65 66 65  clause that refe
129e0 72 65 6e 63 65 20 74 68 65 20 6c 6f 6f 70 20 62  rence the loop b
129f0 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
12a00 20 75 73 65 64 20 62 79 20 61 6e 0a 2a 2a 20 69   used by an.** i
12a10 6e 64 65 78 2e 0a 2a 0a 2a 2a 20 46 6f 72 20 65  ndex..*.** For e
12a20 76 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73  very WHERE claus
12a30 65 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 6e  e term that is n
12a40 6f 74 20 75 73 65 64 20 62 79 20 74 68 65 20 69  ot used by the i
12a50 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77 68 69 63  ndex.** and whic
12a60 68 20 68 61 73 20 61 20 74 72 75 74 68 20 70 72  h has a truth pr
12a70 6f 62 61 62 69 6c 69 74 79 20 61 73 73 69 67 6e  obability assign
12a80 65 64 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  ed by one of the
12a90 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 2c 0a 2a   likelihood(),.*
12aa0 2a 20 6c 69 6b 65 6c 79 28 29 2c 20 6f 72 20 75  * likely(), or u
12ab0 6e 6c 69 6b 65 6c 79 28 29 20 53 51 4c 20 66 75  nlikely() SQL fu
12ac0 6e 63 74 69 6f 6e 73 2c 20 72 65 64 75 63 65 20  nctions, reduce 
12ad0 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75  the estimated nu
12ae0 6d 62 65 72 0a 2a 2a 20 6f 66 20 6f 75 74 70 75  mber.** of outpu
12af0 74 20 72 6f 77 73 20 62 79 20 74 68 65 20 70 72  t rows by the pr
12b00 6f 62 61 62 69 6c 69 74 79 20 73 70 65 63 69 66  obability specif
12b10 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 55 4e 49 4e  ied..**.** TUNIN
12b20 47 3a 20 20 46 6f 72 20 65 76 65 72 79 20 57 48  G:  For every WH
12b30 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ERE clause term 
12b40 74 68 61 74 20 69 73 20 6e 6f 74 20 75 73 65 64  that is not used
12b50 20 62 79 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a   by the index.**
12b60 20 61 6e 64 20 77 68 69 63 68 20 64 6f 65 73 20   and which does 
12b70 6e 6f 74 20 68 61 76 65 20 61 6e 20 61 73 73 69  not have an assi
12b80 67 6e 65 64 20 74 72 75 74 68 20 70 72 6f 62 61  gned truth proba
12b90 62 69 6c 69 74 79 2c 20 68 65 75 72 69 73 74 69  bility, heuristi
12ba0 63 73 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20  cs.** described 
12bb0 62 65 6c 6f 77 20 61 72 65 20 75 73 65 64 20 74  below are used t
12bc0 6f 20 74 72 79 20 74 6f 20 65 73 74 69 6d 61 74  o try to estimat
12bd0 65 20 74 68 65 20 74 72 75 74 68 20 70 72 6f 62  e the truth prob
12be0 61 62 69 6c 69 74 79 2e 0a 2a 2a 20 54 4f 44 4f  ability..** TODO
12bf0 20 2d 2d 3e 20 50 65 72 68 61 70 73 20 74 68 69   --> Perhaps thi
12c00 73 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74  s is something t
12c10 68 61 74 20 63 6f 75 6c 64 20 62 65 20 69 6d 70  hat could be imp
12c20 72 6f 76 65 64 20 62 79 20 62 65 74 74 65 72 0a  roved by better.
12c30 2a 2a 20 74 61 62 6c 65 20 73 74 61 74 69 73 74  ** table statist
12c40 69 63 73 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69  ics..**.** Heuri
12c50 73 74 69 63 20 31 3a 20 20 45 73 74 69 6d 61 74  stic 1:  Estimat
12c60 65 20 74 68 65 20 74 72 75 74 68 20 70 72 6f 62  e the truth prob
12c70 61 62 69 6c 69 74 79 20 61 73 20 39 33 2e 37 35  ability as 93.75
12c80 25 2e 20 20 54 68 65 20 39 33 2e 37 35 25 0a 2a  %.  The 93.75%.*
12c90 2a 20 76 61 6c 75 65 20 63 6f 72 72 65 73 70 6f  * value correspo
12ca0 6e 64 73 20 74 6f 20 2d 31 20 69 6e 20 4c 6f 67  nds to -1 in Log
12cb0 45 73 74 20 6e 6f 74 61 74 69 6f 6e 2c 20 73 6f  Est notation, so
12cc0 20 74 68 69 73 20 6d 65 61 6e 73 20 64 65 63 72   this means decr
12cd0 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20 57 68 65  ement.** the Whe
12ce0 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 66 69 65 6c  reLoop.nOut fiel
12cf0 64 20 66 6f 72 20 65 76 65 72 79 20 73 75 63 68  d for every such
12d00 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
12d10 72 6d 2e 0a 2a 2a 0a 2a 2a 20 48 65 75 72 69 73  rm..**.** Heuris
12d20 74 69 63 20 32 3a 20 20 49 66 20 74 68 65 72 65  tic 2:  If there
12d30 20 65 78 69 73 74 73 20 6f 6e 65 20 6f 72 20 6d   exists one or m
12d40 6f 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ore WHERE clause
12d50 20 74 65 72 6d 73 20 6f 66 20 74 68 65 0a 2a 2a   terms of the.**
12d60 20 66 6f 72 6d 20 22 78 3d 3d 45 58 50 52 22 20   form "x==EXPR" 
12d70 61 6e 64 20 45 58 50 52 20 69 73 20 6e 6f 74 20  and EXPR is not 
12d80 61 20 63 6f 6e 73 74 61 6e 74 20 30 20 6f 72 20  a constant 0 or 
12d90 31 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  1, then make sur
12da0 65 20 74 68 65 0a 2a 2a 20 66 69 6e 61 6c 20 6f  e the.** final o
12db0 75 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d 61  utput row estima
12dc0 74 65 20 69 73 20 6e 6f 20 67 72 65 61 74 65 72  te is no greater
12dd0 20 74 68 61 6e 20 31 2f 34 20 6f 66 20 74 68 65   than 1/4 of the
12de0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 0a 2a 2a   total number.**
12df0 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
12e00 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72  table.  In other
12e10 20 77 6f 72 64 73 2c 20 61 73 73 75 6d 65 20 74   words, assume t
12e20 68 61 74 20 78 3d 3d 45 58 50 52 20 77 69 6c 6c  hat x==EXPR will
12e30 20 66 69 6c 74 65 72 0a 2a 2a 20 6f 75 74 20 61   filter.** out a
12e40 74 20 6c 65 61 73 74 20 33 20 6f 75 74 20 6f 66  t least 3 out of
12e50 20 34 20 72 6f 77 73 2e 20 20 49 66 20 45 58 50   4 rows.  If EXP
12e60 52 20 69 73 20 2d 31 20 6f 72 20 30 20 6f 72 20  R is -1 or 0 or 
12e70 31 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 74 68  1, then maybe th
12e80 65 0a 2a 2a 20 22 78 22 20 63 6f 6c 75 6d 6e 20  e.** "x" column 
12e90 69 73 20 62 6f 6f 6c 65 61 6e 20 6f 72 20 65 6c  is boolean or el
12ea0 73 65 20 2d 31 20 6f 72 20 30 20 6f 72 20 31 20  se -1 or 0 or 1 
12eb0 69 73 20 61 20 63 6f 6d 6d 6f 6e 20 64 65 66 61  is a common defa
12ec0 75 6c 74 20 76 61 6c 75 65 0a 2a 2a 20 6f 6e 20  ult value.** on 
12ed0 74 68 65 20 22 78 22 20 63 6f 6c 75 6d 6e 20 61  the "x" column a
12ee0 6e 64 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61  nd so in that ca
12ef0 73 65 20 6f 6e 6c 79 20 63 61 70 20 74 68 65 20  se only cap the 
12f00 6f 75 74 70 75 74 20 72 6f 77 20 65 73 74 69 6d  output row estim
12f10 61 74 65 0a 2a 2a 20 61 74 20 31 2f 32 20 69 6e  ate.** at 1/2 in
12f20 73 74 65 61 64 20 6f 66 20 31 2f 34 2e 0a 2a 2f  stead of 1/4..*/
12f30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
12f40 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75  reLoopOutputAdju
12f50 73 74 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73  st(.  WhereClaus
12f60 65 20 2a 70 57 43 2c 20 20 20 20 20 20 2f 2a 20  e *pWC,      /* 
12f70 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
12f80 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
12f90 2a 70 4c 6f 6f 70 2c 20 20 20 20 20 20 2f 2a 20  *pLoop,      /* 
12fa0 54 68 65 20 6c 6f 6f 70 20 74 6f 20 61 64 6a 75  The loop to adju
12fb0 73 74 20 64 6f 77 6e 77 61 72 64 20 2a 2f 0a 20  st downward */. 
12fc0 20 4c 6f 67 45 73 74 20 6e 52 6f 77 20 20 20 20   LogEst nRow    
12fd0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12fe0 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
12ff0 20 65 6e 74 69 72 65 20 74 61 62 6c 65 20 2a 2f   entire table */
13000 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  .){.  WhereTerm 
13010 2a 70 54 65 72 6d 2c 20 2a 70 58 3b 0a 20 20 42  *pTerm, *pX;.  B
13020 69 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c 6f 77 65  itmask notAllowe
13030 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e 70 72 65  d = ~(pLoop->pre
13040 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53  req|pLoop->maskS
13050 65 6c 66 29 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  elf);.  int i, j
13060 2c 20 6b 3b 0a 20 20 4c 6f 67 45 73 74 20 69 52  , k;.  LogEst iR
13070 65 64 75 63 65 20 3d 20 30 3b 20 20 20 20 2f 2a  educe = 0;    /*
13080 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 73 68 6f   pLoop->nOut sho
13090 75 6c 64 20 6e 6f 74 20 65 78 63 65 65 64 20 6e  uld not exceed n
130a0 52 6f 77 2d 69 52 65 64 75 63 65 20 2a 2f 0a 0a  Row-iReduce */..
130b0 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
130c0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
130d0 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 3d 3d 30  E_AUTO_INDEX)==0
130e0 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d   );.  for(i=pWC-
130f0 3e 6e 54 65 72 6d 2c 20 70 54 65 72 6d 3d 70 57  >nTerm, pTerm=pW
13100 43 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  C->a; i>0; i--, 
13110 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pTerm++){.    if
13120 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
13130 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
13140 29 21 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=0 ) break;.  
13150 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72    if( (pTerm->pr
13160 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f 6f 70 2d  ereqAll & pLoop-
13170 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d 30 20 29 20  >maskSelf)==0 ) 
13180 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
13190 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
131a0 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f 77 65 64  All & notAllowed
131b0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
131c0 0a 20 20 20 20 66 6f 72 28 6a 3d 70 4c 6f 6f 70  .    for(j=pLoop
131d0 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30  ->nLTerm-1; j>=0
131e0 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 70 58  ; j--){.      pX
131f0 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d   = pLoop->aLTerm
13200 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [j];.      if( p
13210 58 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  X==0 ) continue;
13220 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70  .      if( pX==p
13230 54 65 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  Term ) break;.  
13240 20 20 20 20 69 66 28 20 70 58 2d 3e 69 50 61 72      if( pX->iPar
13250 65 6e 74 3e 3d 30 20 26 26 20 28 26 70 57 43 2d  ent>=0 && (&pWC-
13260 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e 74 5d 29  >a[pX->iParent])
13270 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b  ==pTerm ) break;
13280 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
13290 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  <0 ){.      if( 
132a0 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
132b0 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  <=0 ){.        /
132c0 2a 20 49 66 20 61 20 74 72 75 74 68 20 70 72 6f  * If a truth pro
132d0 62 61 62 69 6c 69 74 79 20 69 73 20 73 70 65 63  bability is spec
132e0 69 66 69 65 64 20 75 73 69 6e 67 20 74 68 65 20  ified using the 
132f0 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 68 69 6e  likelihood() hin
13300 74 73 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ts,.        ** t
13310 68 65 6e 20 75 73 65 20 74 68 65 20 70 72 6f 62  hen use the prob
13320 61 62 69 6c 69 74 79 20 70 72 6f 76 69 64 65 64  ability provided
13330 20 62 79 20 74 68 65 20 61 70 70 6c 69 63 61 74   by the applicat
13340 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
13350 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b 3d 20 70  pLoop->nOut += p
13360 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b  Term->truthProb;
13370 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13380 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20        /* In the 
13390 61 62 73 65 6e 63 65 20 6f 66 20 65 78 70 6c 69  absence of expli
133a0 63 69 74 20 74 72 75 74 68 20 70 72 6f 62 61 62  cit truth probab
133b0 69 6c 69 74 69 65 73 2c 20 75 73 65 20 68 65 75  ilities, use heu
133c0 72 69 73 74 69 63 73 20 74 6f 0a 20 20 20 20 20  ristics to.     
133d0 20 20 20 2a 2a 20 67 75 65 73 73 20 61 20 72 65     ** guess a re
133e0 61 73 6f 6e 61 62 6c 65 20 74 72 75 74 68 20 70  asonable truth p
133f0 72 6f 62 61 62 69 6c 69 74 79 2e 20 2a 2f 0a 20  robability. */. 
13400 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f         pLoop->nO
13410 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 66  ut--;.        if
13420 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
13430 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29  or&(WO_EQ|WO_IS)
13440 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78   ){.          Ex
13450 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65  pr *pRight = pTe
13460 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
13470 74 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  t;.          tes
13480 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 70 45  tcase( pTerm->pE
13490 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29  xpr->op==TK_IS )
134a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
134b0 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
134c0 65 67 65 72 28 70 52 69 67 68 74 2c 20 26 6b 29  eger(pRight, &k)
134d0 20 26 26 20 6b 3e 3d 28 2d 31 29 20 26 26 20 6b   && k>=(-1) && k
134e0 3c 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  <=1 ){.         
134f0 20 20 20 6b 20 3d 20 31 30 3b 0a 20 20 20 20 20     k = 10;.     
13500 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13510 20 20 20 20 20 20 20 20 6b 20 3d 20 32 30 3b 0a          k = 20;.
13520 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
13530 20 20 20 20 20 20 69 66 28 20 69 52 65 64 75 63        if( iReduc
13540 65 3c 6b 20 29 20 69 52 65 64 75 63 65 20 3d 20  e<k ) iReduce = 
13550 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
13560 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
13570 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74   if( pLoop->nOut
13580 20 3e 20 6e 52 6f 77 2d 69 52 65 64 75 63 65 20   > nRow-iReduce 
13590 29 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d  )  pLoop->nOut =
135a0 20 6e 52 6f 77 20 2d 20 69 52 65 64 75 63 65 3b   nRow - iReduce;
135b0 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 65 72 6d 20  .}../* .** Term 
135c0 70 54 65 72 6d 20 69 73 20 61 20 76 65 63 74 6f  pTerm is a vecto
135d0 72 20 72 61 6e 67 65 20 63 6f 6d 70 61 72 69 73  r range comparis
135e0 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68  on operation. Th
135f0 65 20 66 69 72 73 74 20 63 6f 6d 70 61 72 69 73  e first comparis
13600 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 76 65 63  on.** in the vec
13610 74 6f 72 20 63 61 6e 20 62 65 20 6f 70 74 69 6d  tor can be optim
13620 69 7a 65 64 20 75 73 69 6e 67 20 63 6f 6c 75 6d  ized using colum
13630 6e 20 6e 45 71 20 6f 66 20 74 68 65 20 69 6e 64  n nEq of the ind
13640 65 78 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ex. This.** func
13650 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65  tion returns the
13660 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
13670 20 76 65 63 74 6f 72 20 65 6c 65 6d 65 6e 74 73   vector elements
13680 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
13690 64 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20  d.** as part of 
136a0 74 68 65 20 72 61 6e 67 65 20 63 6f 6d 70 61 72  the range compar
136b0 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ison..**.** For 
136c0 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
136d0 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  query is:.**.** 
136e0 20 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e    WHERE a = ? AN
136f0 44 20 28 62 2c 20 63 2c 20 64 29 20 3e 20 28 3f  D (b, c, d) > (?
13700 2c 20 3f 2c 20 3f 29 0a 2a 2a 0a 2a 2a 20 61 6e  , ?, ?).**.** an
13710 64 20 74 68 65 20 69 6e 64 65 78 3a 0a 2a 2a 0a  d the index:.**.
13720 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
13730 58 20 2e 2e 2e 20 4f 4e 20 28 61 2c 20 62 2c 20  X ... ON (a, b, 
13740 63 2c 20 64 2c 20 65 29 0a 2a 2a 0a 2a 2a 20 74  c, d, e).**.** t
13750 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
13760 6e 20 77 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b  n would be invok
13770 65 64 20 77 69 74 68 20 6e 45 71 3d 31 2e 20 54  ed with nEq=1. T
13780 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
13790 64 20 69 6e 0a 2a 2a 20 74 68 69 73 20 63 61 73  d in.** this cas
137a0 65 20 69 73 20 33 2e 0a 2a 2f 0a 69 6e 74 20 77  e is 3..*/.int w
137b0 68 65 72 65 52 61 6e 67 65 56 65 63 74 6f 72 4c  hereRangeVectorL
137c0 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  en(.  Parse *pPa
137d0 72 73 65 2c 20 69 6e 74 20 69 43 75 72 2c 20 49  rse, int iCur, I
137e0 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20  ndex *pIdx, int 
137f0 6e 45 71 2c 20 57 68 65 72 65 54 65 72 6d 20 2a  nEq, WhereTerm *
13800 70 54 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 6e  pTerm.){.  int n
13810 43 6d 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Cmp = sqlite3Exp
13820 72 56 65 63 74 6f 72 53 69 7a 65 28 70 54 65 72  rVectorSize(pTer
13830 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  m->pExpr->pLeft)
13840 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 6e 43  ;.  int i;..  nC
13850 6d 70 20 3d 20 4d 49 4e 28 6e 43 6d 70 2c 20 28  mp = MIN(nCmp, (
13860 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 2d 20  pIdx->nColumn - 
13870 6e 45 71 29 29 3b 0a 20 20 66 6f 72 28 69 3d 31  nEq));.  for(i=1
13880 3b 20 69 3c 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a  ; i<nCmp; i++){.
13890 20 20 20 20 2f 2a 20 54 65 73 74 20 69 66 20 63      /* Test if c
138a0 6f 6d 70 61 72 69 73 6f 6e 20 69 20 6f 66 20 70  omparison i of p
138b0 54 65 72 6d 20 69 73 20 63 6f 6d 70 61 74 69 62  Term is compatib
138c0 6c 65 20 77 69 74 68 20 63 6f 6c 75 6d 6e 20 28  le with column (
138d0 69 2b 6e 45 71 29 20 0a 20 20 20 20 2a 2a 20 6f  i+nEq) .    ** o
138e0 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49 66 20  f the index. If 
138f0 6e 6f 74 2c 20 65 78 69 74 20 74 68 65 20 6c 6f  not, exit the lo
13900 6f 70 2e 20 20 2a 2f 0a 20 20 20 20 63 68 61 72  op.  */.    char
13910 20 61 66 66 3b 20 20 20 20 20 20 20 20 20 20 20   aff;           
13920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
13930 70 61 72 69 73 6f 6e 20 61 66 66 69 6e 69 74 79  parison affinity
13940 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 69 64 78   */.    char idx
13950 61 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20  aff = 0;        
13960 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 65 64        /* Indexed
13970 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74   columns affinit
13980 79 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71  y */.    CollSeq
13990 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *pColl;        
139a0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72         /* Compar
139b0 69 73 6f 6e 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  ison collation s
139c0 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20 20 45  equence */.    E
139d0 78 70 72 20 2a 70 4c 68 73 20 3d 20 70 54 65 72  xpr *pLhs = pTer
139e0 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  m->pExpr->pLeft-
139f0 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  >x.pList->a[i].p
13a00 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a  Expr;.    Expr *
13a10 70 52 68 73 20 3d 20 70 54 65 72 6d 2d 3e 70 45  pRhs = pTerm->pE
13a20 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
13a30 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
13a40 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63 74 20   & EP_xIsSelect 
13a50 29 7b 0a 20 20 20 20 20 20 70 52 68 73 20 3d 20  ){.      pRhs = 
13a60 70 52 68 73 2d 3e 78 2e 70 53 65 6c 65 63 74 2d  pRhs->x.pSelect-
13a70 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  >pEList->a[i].pE
13a80 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  xpr;.    }else{.
13a90 20 20 20 20 20 20 70 52 68 73 20 3d 20 70 52 68        pRhs = pRh
13aa0 73 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d  s->x.pList->a[i]
13ab0 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 0a 0a 20  .pExpr;.    }.. 
13ac0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
13ad0 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20   the LHS of the 
13ae0 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20  comparison is a 
13af0 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65  column reference
13b00 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 72   to.    ** the r
13b10 69 67 68 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  ight column of t
13b20 68 65 20 72 69 67 68 74 20 73 6f 75 72 63 65 20  he right source 
13b30 74 61 62 6c 65 2e 20 0a 20 20 20 20 2a 2f 0a 20  table. .    */. 
13b40 20 20 20 69 66 28 20 70 4c 68 73 2d 3e 6f 70 21     if( pLhs->op!
13b50 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a 20 20 20 20  =TK_COLUMN .    
13b60 20 7c 7c 20 70 4c 68 73 2d 3e 69 54 61 62 6c 65   || pLhs->iTable
13b70 21 3d 69 43 75 72 20 0a 20 20 20 20 20 7c 7c 20  !=iCur .     || 
13b80 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  pLhs->iColumn!=p
13b90 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 2b  Idx->aiColumn[i+
13ba0 6e 45 71 5d 20 0a 20 20 20 20 29 7b 0a 20 20 20  nEq] .    ){.   
13bb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
13bc0 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74  .    aff = sqlit
13bd0 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
13be0 79 28 70 52 68 73 2c 20 73 71 6c 69 74 65 33 45  y(pRhs, sqlite3E
13bf0 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 68 73  xprAffinity(pLhs
13c00 29 29 3b 0a 20 20 20 20 69 64 78 61 66 66 20 3d  ));.    idxaff =
13c10 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61   pIdx->pTable->a
13c20 43 6f 6c 5b 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d  Col[pLhs->iColum
13c30 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  n].affinity;.   
13c40 20 69 66 28 20 61 66 66 21 3d 69 64 78 61 66 66   if( aff!=idxaff
13c50 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 70   ) break;..    p
13c60 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69  Coll = sqlite3Bi
13c70 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
13c80 65 71 28 70 50 61 72 73 65 2c 20 70 4c 68 73 2c  eq(pParse, pLhs,
13c90 20 70 52 68 73 29 3b 0a 20 20 20 20 69 66 28 20   pRhs);.    if( 
13ca0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
13cb0 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64  Coll->zName, pId
13cc0 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 2b 6e 45 71 5d  x->azColl[i+nEq]
13cd0 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ) ) break;.  }. 
13ce0 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a   return i;.}../*
13cf0 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 63  .** Adjust the c
13d00 6f 73 74 20 43 20 62 79 20 74 68 65 20 63 6f 73  ost C by the cos
13d10 74 4d 75 6c 74 20 66 61 63 74 65 72 20 54 2e 20  tMult facter T. 
13d20 20 54 68 69 73 20 6f 6e 6c 79 20 6f 63 63 75 72   This only occur
13d30 73 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 65 64  s if.** compiled
13d40 20 77 69 74 68 20 2d 44 53 51 4c 49 54 45 5f 45   with -DSQLITE_E
13d50 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a 2a  NABLE_COSTMULT.*
13d60 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
13d70 45 4e 41 42 4c 45 5f 43 4f 53 54 4d 55 4c 54 0a  ENABLE_COSTMULT.
13d80 23 20 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f  # define ApplyCo
13d90 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54  stMultiplier(C,T
13da0 29 20 20 43 20 2b 3d 20 54 0a 23 65 6c 73 65 0a  )  C += T.#else.
13db0 23 20 64 65 66 69 6e 65 20 41 70 70 6c 79 43 6f  # define ApplyCo
13dc0 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 43 2c 54  stMultiplier(C,T
13dd0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
13de0 57 65 20 68 61 76 65 20 73 6f 20 66 61 72 20 6d  We have so far m
13df0 61 74 63 68 65 64 20 70 42 75 69 6c 64 65 72 2d  atched pBuilder-
13e00 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  >pNew->u.btree.n
13e10 45 71 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  Eq terms of the 
13e20 0a 2a 2a 20 69 6e 64 65 78 20 70 49 6e 64 65 78  .** index pIndex
13e30 2e 20 54 72 79 20 74 6f 20 6d 61 74 63 68 20 6f  . Try to match o
13e40 6e 65 20 6d 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 57  ne more..**.** W
13e50 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
13e60 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 70 42 75  n is called, pBu
13e70 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 6e 4f 75  ilder->pNew->nOu
13e80 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 0a  t contains the .
13e90 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
13ea0 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 62 65  s expected to be
13eb0 20 76 69 73 69 74 65 64 20 62 79 20 66 69 6c 74   visited by filt
13ec0 65 72 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  ering using the 
13ed0 6e 45 71 20 0a 2a 2a 20 74 65 72 6d 73 20 6f 6e  nEq .** terms on
13ee0 6c 79 2e 20 49 66 20 69 74 20 69 73 20 6d 6f 64  ly. If it is mod
13ef0 69 66 69 65 64 2c 20 74 68 69 73 20 76 61 6c 75  ified, this valu
13f00 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 62 65  e is restored be
13f10 66 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75  fore this .** fu
13f20 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
13f30 2a 2a 0a 2a 2a 20 49 66 20 70 50 72 6f 62 65 2d  **.** If pProbe-
13f40 3e 74 6e 75 6d 3d 3d 30 2c 20 74 68 61 74 20 6d  >tnum==0, that m
13f50 65 61 6e 73 20 70 49 6e 64 65 78 20 69 73 20 61  eans pIndex is a
13f60 20 66 61 6b 65 20 69 6e 64 65 78 20 75 73 65 64   fake index used
13f70 20 66 6f 72 20 74 68 65 0a 2a 2a 20 49 4e 54 45   for the.** INTE
13f80 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
13f90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
13fa0 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
13fb0 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 4c 6f  Index(.  WhereLo
13fc0 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
13fd0 64 65 72 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  der,     /* The 
13fe0 57 68 65 72 65 4c 6f 6f 70 20 66 61 63 74 6f 72  WhereLoop factor
13ff0 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  y */.  struct Sr
14000 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
14010 2c 20 20 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63  ,      /* FROM c
14020 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67  lause term being
14030 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 49   analyzed */.  I
14040 6e 64 65 78 20 2a 70 50 72 6f 62 65 2c 20 20 20  ndex *pProbe,   
14050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14060 2a 20 41 6e 20 69 6e 64 65 78 20 6f 6e 20 70 53  * An index on pS
14070 72 63 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e  rc */.  LogEst n
14080 49 6e 4d 75 6c 20 20 20 20 20 20 20 20 20 20 20  InMul           
14090 20 20 20 20 20 20 20 20 2f 2a 20 6c 6f 67 28 4e          /* log(N
140a0 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69  umber of iterati
140b0 6f 6e 73 20 64 75 65 20 74 6f 20 49 4e 29 20 2a  ons due to IN) *
140c0 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  /.){.  WhereInfo
140d0 20 2a 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c   *pWInfo = pBuil
140e0 64 65 72 2d 3e 70 57 49 6e 66 6f 3b 20 20 2f 2a  der->pWInfo;  /*
140f0 20 57 48 45 52 45 20 61 6e 61 6c 79 73 65 20 63   WHERE analyse c
14100 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50 61 72 73  ontext */.  Pars
14110 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49 6e  e *pParse = pWIn
14120 66 6f 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20  fo->pParse;     
14130 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
14140 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
14150 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
14160 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61  >db;       /* Da
14170 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
14180 6e 20 6d 61 6c 6c 6f 63 20 63 6f 6e 74 65 78 74  n malloc context
14190 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20   */.  WhereLoop 
141a0 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
141b0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61 74        /* Templat
141c0 65 20 57 68 65 72 65 4c 6f 6f 70 20 75 6e 64 65  e WhereLoop unde
141d0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
141e0 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
141f0 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
14200 20 20 20 20 2f 2a 20 41 20 57 68 65 72 65 54 65      /* A WhereTe
14210 72 6d 20 75 6e 64 65 72 20 63 6f 6e 73 69 64 65  rm under conside
14220 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
14230 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  opMask;         
14240 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
14250 61 6c 69 64 20 6f 70 65 72 61 74 6f 72 73 20 66  alid operators f
14260 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  or constraints *
14270 2f 0a 20 20 57 68 65 72 65 53 63 61 6e 20 73 63  /.  WhereScan sc
14280 61 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  an;             
14290 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
142a0 66 6f 72 20 57 48 45 52 45 20 74 65 72 6d 73 20  for WHERE terms 
142b0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 73 61 76  */.  Bitmask sav
142c0 65 64 5f 70 72 65 72 65 71 3b 20 20 20 20 20 20  ed_prereq;      
142d0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
142e0 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e   value of pNew->
142f0 70 72 65 72 65 71 20 2a 2f 0a 20 20 75 31 36 20  prereq */.  u16 
14300 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 20 20 20  saved_nLTerm;   
14310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
14320 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
14330 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 2a 2f   pNew->nLTerm */
14340 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 45 71  .  u16 saved_nEq
14350 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14360 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76     /* Original v
14370 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 75 2e  alue of pNew->u.
14380 62 74 72 65 65 2e 6e 45 71 20 2a 2f 0a 20 20 75  btree.nEq */.  u
14390 31 36 20 73 61 76 65 64 5f 6e 42 74 6d 3b 20 20  16 saved_nBtm;  
143a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
143b0 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
143c0 20 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65   of pNew->u.btre
143d0 65 2e 6e 42 74 6d 20 2a 2f 0a 20 20 75 31 36 20  e.nBtm */.  u16 
143e0 73 61 76 65 64 5f 6e 54 6f 70 3b 20 20 20 20 20  saved_nTop;     
143f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
14400 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  riginal value of
14410 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
14420 54 6f 70 20 2a 2f 0a 20 20 75 31 36 20 73 61 76  Top */.  u16 sav
14430 65 64 5f 6e 53 6b 69 70 3b 20 20 20 20 20 20 20  ed_nSkip;       
14440 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
14450 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e  inal value of pN
14460 65 77 2d 3e 6e 53 6b 69 70 20 2a 2f 0a 20 20 75  ew->nSkip */.  u
14470 33 32 20 73 61 76 65 64 5f 77 73 46 6c 61 67 73  32 saved_wsFlags
14480 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
14490 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
144a0 20 6f 66 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67   of pNew->wsFlag
144b0 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 73 61  s */.  LogEst sa
144c0 76 65 64 5f 6e 4f 75 74 3b 20 20 20 20 20 20 20  ved_nOut;       
144d0 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
144e0 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
144f0 2d 3e 6e 4f 75 74 20 2a 2f 0a 20 20 69 6e 74 20  ->nOut */.  int 
14500 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
14510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
14520 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
14530 4c 6f 67 45 73 74 20 72 53 69 7a 65 3b 20 20 20  LogEst rSize;   
14540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14550 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77  /* Number of row
14560 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
14570 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67 53  /.  LogEst rLogS
14580 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
14590 20 20 20 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d      /* Logarithm
145a0 20 6f 66 20 74 61 62 6c 65 20 73 69 7a 65 20 2a   of table size *
145b0 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
145c0 54 6f 70 20 3d 20 30 2c 20 2a 70 42 74 6d 20 3d  Top = 0, *pBtm =
145d0 20 30 3b 20 2f 2a 20 54 6f 70 20 61 6e 64 20 62   0; /* Top and b
145e0 6f 74 74 6f 6d 20 72 61 6e 67 65 20 63 6f 6e 73  ottom range cons
145f0 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 70 4e  traints */..  pN
14600 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
14610 4e 65 77 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  New;.  if( db->m
14620 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
14630 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
14640 4d 5f 42 4b 50 54 3b 0a 0a 20 20 61 73 73 65 72  M_BKPT;..  asser
14650 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67  t( (pNew->wsFlag
14660 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
14670 4c 54 41 42 4c 45 29 3d 3d 30 20 29 3b 0a 20 20  LTABLE)==0 );.  
14680 61 73 73 65 72 74 28 20 28 70 4e 65 77 2d 3e 77  assert( (pNew->w
14690 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  sFlags & WHERE_T
146a0 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a  OP_LIMIT)==0 );.
146b0 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46 6c    if( pNew->wsFl
146c0 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
146d0 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 6f 70 4d  LIMIT ){.    opM
146e0 61 73 6b 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  ask = WO_LT|WO_L
146f0 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
14700 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 75 2e  assert( pNew->u.
14710 62 74 72 65 65 2e 6e 42 74 6d 3d 3d 30 20 29 3b  btree.nBtm==0 );
14720 0a 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 57 4f  .    opMask = WO
14730 5f 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c  _EQ|WO_IN|WO_GT|
14740 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_GE|WO_LT|WO_L
14750 45 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49  E|WO_ISNULL|WO_I
14760 53 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 72  S;.  }.  if( pPr
14770 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20  obe->bUnordered 
14780 29 20 6f 70 4d 61 73 6b 20 26 3d 20 7e 28 57 4f  ) opMask &= ~(WO
14790 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c  _GT|WO_GE|WO_LT|
147a0 57 4f 5f 4c 45 29 3b 0a 0a 20 20 61 73 73 65 72  WO_LE);..  asser
147b0 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  t( pNew->u.btree
147c0 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f  .nEq<pProbe->nCo
147d0 6c 75 6d 6e 20 29 3b 0a 0a 20 20 73 61 76 65 64  lumn );..  saved
147e0 5f 6e 45 71 20 3d 20 70 4e 65 77 2d 3e 75 2e 62  _nEq = pNew->u.b
147f0 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73 61 76 65  tree.nEq;.  save
14800 64 5f 6e 42 74 6d 20 3d 20 70 4e 65 77 2d 3e 75  d_nBtm = pNew->u
14810 2e 62 74 72 65 65 2e 6e 42 74 6d 3b 0a 20 20 73  .btree.nBtm;.  s
14820 61 76 65 64 5f 6e 54 6f 70 20 3d 20 70 4e 65 77  aved_nTop = pNew
14830 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 3b 0a  ->u.btree.nTop;.
14840 20 20 73 61 76 65 64 5f 6e 53 6b 69 70 20 3d 20    saved_nSkip = 
14850 70 4e 65 77 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73  pNew->nSkip;.  s
14860 61 76 65 64 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e  aved_nLTerm = pN
14870 65 77 2d 3e 6e 4c 54 65 72 6d 3b 0a 20 20 73 61  ew->nLTerm;.  sa
14880 76 65 64 5f 77 73 46 6c 61 67 73 20 3d 20 70 4e  ved_wsFlags = pN
14890 65 77 2d 3e 77 73 46 6c 61 67 73 3b 0a 20 20 73  ew->wsFlags;.  s
148a0 61 76 65 64 5f 70 72 65 72 65 71 20 3d 20 70 4e  aved_prereq = pN
148b0 65 77 2d 3e 70 72 65 72 65 71 3b 0a 20 20 73 61  ew->prereq;.  sa
148c0 76 65 64 5f 6e 4f 75 74 20 3d 20 70 4e 65 77 2d  ved_nOut = pNew-
148d0 3e 6e 4f 75 74 3b 0a 20 20 70 54 65 72 6d 20 3d  >nOut;.  pTerm =
148e0 20 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26   whereScanInit(&
148f0 73 63 61 6e 2c 20 70 42 75 69 6c 64 65 72 2d 3e  scan, pBuilder->
14900 70 57 43 2c 20 70 53 72 63 2d 3e 69 43 75 72 73  pWC, pSrc->iCurs
14910 6f 72 2c 20 73 61 76 65 64 5f 6e 45 71 2c 0a 20  or, saved_nEq,. 
14920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14930 20 20 20 20 20 20 20 6f 70 4d 61 73 6b 2c 20 70         opMask, p
14940 50 72 6f 62 65 29 3b 0a 20 20 70 4e 65 77 2d 3e  Probe);.  pNew->
14950 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 72 53  rSetup = 0;.  rS
14960 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  ize = pProbe->ai
14970 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20 20  RowLogEst[0];.  
14980 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73 74 4c 6f  rLogSize = estLo
14990 67 28 72 53 69 7a 65 29 3b 0a 20 20 66 6f 72 28  g(rSize);.  for(
149a0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
149b0 26 26 20 70 54 65 72 6d 21 3d 30 3b 20 70 54 65  && pTerm!=0; pTe
149c0 72 6d 20 3d 20 77 68 65 72 65 53 63 61 6e 4e 65  rm = whereScanNe
149d0 78 74 28 26 73 63 61 6e 29 29 7b 0a 20 20 20 20  xt(&scan)){.    
149e0 75 31 36 20 65 4f 70 20 3d 20 70 54 65 72 6d 2d  u16 eOp = pTerm-
149f0 3e 65 4f 70 65 72 61 74 6f 72 3b 20 20 20 2f 2a  >eOperator;   /*
14a00 20 53 68 6f 72 74 68 61 6e 64 20 66 6f 72 20 70   Shorthand for p
14a10 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
14a20 2a 2f 0a 20 20 20 20 4c 6f 67 45 73 74 20 72 43  */.    LogEst rC
14a30 6f 73 74 49 64 78 3b 0a 20 20 20 20 4c 6f 67 45  ostIdx;.    LogE
14a40 73 74 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65  st nOutUnadjuste
14a50 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 4f 75  d;        /* nOu
14a60 74 20 62 65 66 6f 72 65 20 49 4e 28 29 20 61 6e  t before IN() an
14a70 64 20 57 48 45 52 45 20 61 64 6a 75 73 74 6d 65  d WHERE adjustme
14a80 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  nts */.    int n
14a90 49 6e 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  In = 0;.#ifdef S
14aa0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
14ab0 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 20 20  T3_OR_STAT4.    
14ac0 69 6e 74 20 6e 52 65 63 56 61 6c 69 64 20 3d 20  int nRecValid = 
14ad0 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61  pBuilder->nRecVa
14ae0 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  lid;.#endif.    
14af0 69 66 28 20 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e  if( (eOp==WO_ISN
14b00 55 4c 4c 20 7c 7c 20 28 70 54 65 72 6d 2d 3e 77  ULL || (pTerm->w
14b10 74 46 6c 61 67 73 26 54 45 52 4d 5f 56 4e 55 4c  tFlags&TERM_VNUL
14b20 4c 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 69  L)!=0).     && i
14b30 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c  ndexColumnNotNul
14b40 6c 28 70 50 72 6f 62 65 2c 20 73 61 76 65 64 5f  l(pProbe, saved_
14b50 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  nEq).    ){.    
14b60 20 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 69    continue; /* i
14b70 67 6e 6f 72 65 20 49 53 20 5b 4e 4f 54 5d 20 4e  gnore IS [NOT] N
14b80 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  ULL constraints 
14b90 6f 6e 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75  on NOT NULL colu
14ba0 6d 6e 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  mns */.    }.   
14bb0 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72   if( pTerm->prer
14bc0 65 71 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e  eqRight & pNew->
14bd0 6d 61 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69  maskSelf ) conti
14be0 6e 75 65 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20  nue;..    /* Do 
14bf0 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 75 70  not allow the up
14c00 70 65 72 20 62 6f 75 6e 64 20 6f 66 20 61 20 4c  per bound of a L
14c10 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  IKE optimization
14c20 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
14c30 74 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 69 78 20  t.    ** to mix 
14c40 77 69 74 68 20 61 20 6c 6f 77 65 72 20 72 61 6e  with a lower ran
14c50 67 65 20 62 6f 75 6e 64 20 66 72 6f 6d 20 73 6f  ge bound from so
14c60 6d 65 20 6f 74 68 65 72 20 73 6f 75 72 63 65 20  me other source 
14c70 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  */.    if( pTerm
14c80 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
14c90 5f 4c 49 4b 45 4f 50 54 20 26 26 20 70 54 65 72  _LIKEOPT && pTer
14ca0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
14cb0 5f 4c 54 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  _LT ) continue;.
14cc0 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61  .    /* Do not a
14cd0 6c 6c 6f 77 20 49 53 20 63 6f 6e 73 74 72 61 69  llow IS constrai
14ce0 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 57 48 45  nts from the WHE
14cf0 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
14d00 75 73 65 64 20 62 79 20 74 68 65 0a 20 20 20 20  used by the.    
14d10 2a 2a 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  ** right table o
14d20 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20  f a LEFT JOIN.  
14d30 4f 6e 6c 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  Only constraints
14d40 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73   in the ON claus
14d50 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6c 6c  e are.    ** all
14d60 6f 77 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20  owed */.    if( 
14d70 28 70 53 72 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79  (pSrc->fg.jointy
14d80 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
14d90 0a 20 20 20 20 20 26 26 20 21 45 78 70 72 48 61  .     && !ExprHa
14da0 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d  sProperty(pTerm-
14db0 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  >pExpr, EP_FromJ
14dc0 6f 69 6e 29 0a 20 20 20 20 20 26 26 20 28 65 4f  oin).     && (eO
14dd0 70 20 26 20 28 57 4f 5f 49 53 7c 57 4f 5f 49 53  p & (WO_IS|WO_IS
14de0 4e 55 4c 4c 29 29 21 3d 30 0a 20 20 20 20 29 7b  NULL))!=0.    ){
14df0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
14e00 20 65 4f 70 20 26 20 57 4f 5f 49 53 20 29 3b 0a   eOp & WO_IS );.
14e10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
14e20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  eOp & WO_ISNULL 
14e30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  );.      continu
14e40 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4e  e;.    }..    pN
14e50 65 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61  ew->wsFlags = sa
14e60 76 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20  ved_wsFlags;.   
14e70 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
14e80 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a  Eq = saved_nEq;.
14e90 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
14ea0 65 2e 6e 42 74 6d 20 3d 20 73 61 76 65 64 5f 6e  e.nBtm = saved_n
14eb0 42 74 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  Btm;.    pNew->u
14ec0 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 73 61  .btree.nTop = sa
14ed0 76 65 64 5f 6e 54 6f 70 3b 0a 20 20 20 20 70 4e  ved_nTop;.    pN
14ee0 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76  ew->nLTerm = sav
14ef0 65 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69  ed_nLTerm;.    i
14f00 66 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69  f( whereLoopResi
14f10 7a 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65  ze(db, pNew, pNe
14f20 77 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62  w->nLTerm+1) ) b
14f30 72 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a  reak; /* OOM */.
14f40 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d      pNew->aLTerm
14f50 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d  [pNew->nLTerm++]
14f60 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e   = pTerm;.    pN
14f70 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61  ew->prereq = (sa
14f80 76 65 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65  ved_prereq | pTe
14f90 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29  rm->prereqRight)
14fa0 20 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65   & ~pNew->maskSe
14fb0 6c 66 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  lf;..    assert(
14fc0 20 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20   nInMul==0.     
14fd0 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46     || (pNew->wsF
14fe0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
14ff0 55 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20 20  UMN_NULL)!=0 .  
15000 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e        || (pNew->
15010 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
15020 43 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20  COLUMN_IN)!=0 . 
15030 20 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d         || (pNew-
15040 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
15050 5f 53 4b 49 50 53 43 41 4e 29 21 3d 30 20 0a 20  _SKIPSCAN)!=0 . 
15060 20 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 65     );..    if( e
15070 4f 70 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20  Op & WO_IN ){.  
15080 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
15090 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
150a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
150b0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
150c0 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66  UMN_IN;.      if
150d0 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
150e0 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
150f0 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20  elect) ){.      
15100 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45    /* "x IN (SELE
15110 43 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e  CT ...)":  TUNIN
15120 47 3a 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  G: the SELECT re
15130 74 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f  turns 25 rows */
15140 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34  .        nIn = 4
15150 36 3b 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d  6;  assert( 46==
15160 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35  sqlite3LogEst(25
15170 29 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ) );.      }else
15180 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70   if( ALWAYS(pExp
15190 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70 45  r->x.pList && pE
151a0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
151b0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
151c0 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c 75 65 2c  /* "x IN (value,
151d0 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f   value, ...)" */
151e0 0a 20 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 73  .        nIn = s
151f0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70 45 78  qlite3LogEst(pEx
15200 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
15210 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  pr);.      }.   
15220 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e 3e 30     assert( nIn>0
15230 20 29 3b 20 20 2f 2a 20 52 48 53 20 61 6c 77 61   );  /* RHS alwa
15240 79 73 20 68 61 73 20 32 20 6f 72 20 6d 6f 72 65  ys has 2 or more
15250 20 74 65 72 6d 73 2e 2e 2e 20 20 54 68 65 20 70   terms...  The p
15260 61 72 73 65 72 0a 20 20 20 20 20 20 20 20 20 20  arser.          
15270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
15280 20 63 68 61 6e 67 65 73 20 22 78 20 49 4e 20 28   changes "x IN (
15290 3f 29 22 20 69 6e 74 6f 20 22 78 3d 3f 22 2e 20  ?)" into "x=?". 
152a0 2a 2f 0a 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  */..    }else if
152b0 28 20 65 4f 70 20 26 20 28 57 4f 5f 45 51 7c 57  ( eOp & (WO_EQ|W
152c0 4f 5f 49 53 29 20 29 7b 0a 20 20 20 20 20 20 69  O_IS) ){.      i
152d0 6e 74 20 69 43 6f 6c 20 3d 20 70 50 72 6f 62 65  nt iCol = pProbe
152e0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61 76 65 64  ->aiColumn[saved
152f0 5f 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 4e 65  _nEq];.      pNe
15300 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  w->wsFlags |= WH
15310 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20  ERE_COLUMN_EQ;. 
15320 20 20 20 20 20 61 73 73 65 72 74 28 20 73 61 76       assert( sav
15330 65 64 5f 6e 45 71 3d 3d 70 4e 65 77 2d 3e 75 2e  ed_nEq==pNew->u.
15340 62 74 72 65 65 2e 6e 45 71 20 29 3b 0a 20 20 20  btree.nEq );.   
15350 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 58 4e 5f     if( iCol==XN_
15360 52 4f 57 49 44 20 0a 20 20 20 20 20 20 20 7c 7c  ROWID .       ||
15370 20 28 69 43 6f 6c 3e 30 20 26 26 20 6e 49 6e 4d   (iCol>0 && nInM
15380 75 6c 3d 3d 30 20 26 26 20 73 61 76 65 64 5f 6e  ul==0 && saved_n
15390 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79  Eq==pProbe->nKey
153a0 43 6f 6c 2d 31 29 0a 20 20 20 20 20 20 29 7b 0a  Col-1).      ){.
153b0 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
153c0 3e 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 75  >=0 && pProbe->u
153d0 6e 69 71 4e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b  niqNotNull==0 ){
153e0 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
153f0 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
15400 45 5f 55 4e 51 5f 57 41 4e 54 45 44 3b 0a 20 20  E_UNQ_WANTED;.  
15410 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15420 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46         pNew->wsF
15430 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e  lags |= WHERE_ON
15440 45 52 4f 57 3b 0a 20 20 20 20 20 20 20 20 7d 0a  EROW;.        }.
15450 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
15460 65 20 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49  e if( eOp & WO_I
15470 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70  SNULL ){.      p
15480 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
15490 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
154a0 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  L;.    }else if(
154b0 20 65 4f 70 20 26 20 28 57 4f 5f 47 54 7c 57 4f   eOp & (WO_GT|WO
154c0 5f 47 45 29 20 29 7b 0a 20 20 20 20 20 20 74 65  _GE) ){.      te
154d0 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
154e0 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 74 65 73  _GT );.      tes
154f0 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f  tcase( eOp & WO_
15500 47 45 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  GE );.      pNew
15510 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45  ->wsFlags |= WHE
15520 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
15530 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b  WHERE_BTM_LIMIT;
15540 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  .      pNew->u.b
15550 74 72 65 65 2e 6e 42 74 6d 20 3d 20 77 68 65 72  tree.nBtm = wher
15560 65 52 61 6e 67 65 56 65 63 74 6f 72 4c 65 6e 28  eRangeVectorLen(
15570 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
15580 65 2c 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  e, pSrc->iCursor
15590 2c 20 70 50 72 6f 62 65 2c 20 73 61 76 65 64 5f  , pProbe, saved_
155a0 6e 45 71 2c 20 70 54 65 72 6d 0a 20 20 20 20 20  nEq, pTerm.     
155b0 20 29 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d   );.      pBtm =
155c0 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54   pTerm;.      pT
155d0 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  op = 0;.      if
155e0 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
155f0 20 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20   & TERM_LIKEOPT 
15600 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 61  ){.        /* Ra
15610 6e 67 65 20 63 6f 6e 74 72 61 69 6e 74 73 20 74  nge contraints t
15620 68 61 74 20 63 6f 6d 65 20 66 72 6f 6d 20 74 68  hat come from th
15630 65 20 4c 49 4b 45 20 6f 70 74 69 6d 69 7a 61 74  e LIKE optimizat
15640 69 6f 6e 20 61 72 65 0a 20 20 20 20 20 20 20 20  ion are.        
15650 2a 2a 20 61 6c 77 61 79 73 20 75 73 65 64 20 69  ** always used i
15660 6e 20 70 61 69 72 73 2e 20 2a 2f 0a 20 20 20 20  n pairs. */.    
15670 20 20 20 20 70 54 6f 70 20 3d 20 26 70 54 65 72      pTop = &pTer
15680 6d 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  m[1];.        as
15690 73 65 72 74 28 20 28 70 54 6f 70 2d 28 70 54 65  sert( (pTop-(pTe
156a0 72 6d 2d 3e 70 57 43 2d 3e 61 29 29 3c 70 54 65  rm->pWC->a))<pTe
156b0 72 6d 2d 3e 70 57 43 2d 3e 6e 54 65 72 6d 20 29  rm->pWC->nTerm )
156c0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
156d0 28 20 70 54 6f 70 2d 3e 77 74 46 6c 61 67 73 20  ( pTop->wtFlags 
156e0 26 20 54 45 52 4d 5f 4c 49 4b 45 4f 50 54 20 29  & TERM_LIKEOPT )
156f0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
15700 28 20 70 54 6f 70 2d 3e 65 4f 70 65 72 61 74 6f  ( pTop->eOperato
15710 72 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20  r==WO_LT );.    
15720 20 20 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f      if( whereLoo
15730 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77  pResize(db, pNew
15740 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31  , pNew->nLTerm+1
15750 29 20 29 20 62 72 65 61 6b 3b 20 2f 2a 20 4f 4f  ) ) break; /* OO
15760 4d 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65  M */.        pNe
15770 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e  w->aLTerm[pNew->
15780 6e 4c 54 65 72 6d 2b 2b 5d 20 3d 20 70 54 6f 70  nLTerm++] = pTop
15790 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
157a0 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
157b0 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _TOP_LIMIT;.    
157c0 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65      pNew->u.btre
157d0 65 2e 6e 54 6f 70 20 3d 20 31 3b 0a 20 20 20 20  e.nTop = 1;.    
157e0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
157f0 20 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70       assert( eOp
15800 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29   & (WO_LT|WO_LE)
15810 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
15820 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c 54 20  se( eOp & WO_LT 
15830 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
15840 65 28 20 65 4f 70 20 26 20 57 4f 5f 4c 45 20 29  e( eOp & WO_LE )
15850 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
15860 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
15870 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52  OLUMN_RANGE|WHER
15880 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_TOP_LIMIT;.   
15890 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
158a0 2e 6e 54 6f 70 20 3d 20 77 68 65 72 65 52 61 6e  .nTop = whereRan
158b0 67 65 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20 20  geVectorLen(.   
158c0 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70         pParse, p
158d0 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50  Src->iCursor, pP
158e0 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c  robe, saved_nEq,
158f0 20 70 54 65 72 6d 0a 20 20 20 20 20 20 29 3b 0a   pTerm.      );.
15900 20 20 20 20 20 20 70 54 6f 70 20 3d 20 70 54 65        pTop = pTe
15910 72 6d 3b 0a 20 20 20 20 20 20 70 42 74 6d 20 3d  rm;.      pBtm =
15920 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
15930 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
15940 54 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20  T)!=0 ?.        
15950 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65               pNe
15960 77 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e  w->aLTerm[pNew->
15970 6e 4c 54 65 72 6d 2d 32 5d 20 3a 20 30 3b 0a 20  nLTerm-2] : 0;. 
15980 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
15990 74 68 69 73 20 70 6f 69 6e 74 20 70 4e 65 77 2d  this point pNew-
159a0 3e 6e 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  >nOut is set to 
159b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
159c0 77 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a 20  ws expected to. 
159d0 20 20 20 2a 2a 20 62 65 20 76 69 73 69 74 65 64     ** be visited
159e0 20 62 79 20 74 68 65 20 69 6e 64 65 78 20 73 63   by the index sc
159f0 61 6e 20 62 65 66 6f 72 65 20 63 6f 6e 73 69 64  an before consid
15a00 65 72 69 6e 67 20 74 65 72 6d 20 70 54 65 72 6d  ering term pTerm
15a10 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  , or the.    ** 
15a20 76 61 6c 75 65 73 20 6f 66 20 6e 49 6e 20 61 6e  values of nIn an
15a30 64 20 6e 49 6e 4d 75 6c 2e 20 49 6e 20 6f 74 68  d nInMul. In oth
15a40 65 72 20 77 6f 72 64 73 2c 20 61 73 73 75 6d 69  er words, assumi
15a50 6e 67 20 74 68 61 74 20 61 6c 6c 20 0a 20 20 20  ng that all .   
15a60 20 2a 2a 20 22 78 20 49 4e 28 2e 2e 2e 29 22 20   ** "x IN(...)" 
15a70 74 65 72 6d 73 20 61 72 65 20 72 65 70 6c 61 63  terms are replac
15a80 65 64 20 77 69 74 68 20 22 78 20 3d 20 3f 22 2e  ed with "x = ?".
15a90 20 54 68 69 73 20 62 6c 6f 63 6b 20 75 70 64 61   This block upda
15aa0 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 76  tes.    ** the v
15ab0 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f  alue of pNew->nO
15ac0 75 74 20 74 6f 20 61 63 63 6f 75 6e 74 20 66 6f  ut to account fo
15ad0 72 20 70 54 65 72 6d 20 28 62 75 74 20 6e 6f 74  r pTerm (but not
15ae0 20 6e 49 6e 2f 6e 49 6e 4d 75 6c 29 2e 20 20 2a   nIn/nInMul).  *
15af0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  /.    assert( pN
15b00 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76 65 64 5f  ew->nOut==saved_
15b10 6e 4f 75 74 20 29 3b 0a 20 20 20 20 69 66 28 20  nOut );.    if( 
15b20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
15b30 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
15b40 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  GE ){.      /* A
15b50 64 6a 75 73 74 20 6e 4f 75 74 20 75 73 69 6e 67  djust nOut using
15b60 20 73 74 61 74 33 2f 73 74 61 74 34 20 64 61 74   stat3/stat4 dat
15b70 61 2e 20 4f 72 2c 20 69 66 20 74 68 65 72 65 20  a. Or, if there 
15b80 69 73 20 6e 6f 20 73 74 61 74 33 2f 73 74 61 74  is no stat3/stat
15b90 34 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 2c  4.      ** data,
15ba0 20 75 73 69 6e 67 20 73 6f 6d 65 20 6f 74 68 65   using some othe
15bb0 72 20 65 73 74 69 6d 61 74 65 2e 20 20 2a 2f 0a  r estimate.  */.
15bc0 20 20 20 20 20 20 77 68 65 72 65 52 61 6e 67 65        whereRange
15bd0 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
15be0 70 42 75 69 6c 64 65 72 2c 20 70 42 74 6d 2c 20  pBuilder, pBtm, 
15bf0 70 54 6f 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20  pTop, pNew);.   
15c00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
15c10 74 20 6e 45 71 20 3d 20 2b 2b 70 4e 65 77 2d 3e  t nEq = ++pNew->
15c20 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 20  u.btree.nEq;.   
15c30 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 20 26     assert( eOp &
15c40 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 45   (WO_ISNULL|WO_E
15c50 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 29 20 29  Q|WO_IN|WO_IS) )
15c60 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
15c70 20 70 4e 65 77 2d 3e 6e 4f 75 74 3d 3d 73 61 76   pNew->nOut==sav
15c80 65 64 5f 6e 4f 75 74 20 29 3b 0a 20 20 20 20 20  ed_nOut );.     
15c90 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74   if( pTerm->trut
15ca0 68 50 72 6f 62 3c 3d 30 20 26 26 20 70 50 72 6f  hProb<=0 && pPro
15cb0 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 73 61 76  be->aiColumn[sav
15cc0 65 64 5f 6e 45 71 5d 3e 3d 30 20 29 7b 0a 20 20  ed_nEq]>=0 ){.  
15cd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 65        assert( (e
15ce0 4f 70 20 26 20 57 4f 5f 49 4e 29 20 7c 7c 20 6e  Op & WO_IN) || n
15cf0 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  In==0 );.       
15d00 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
15d10 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20   WO_IN );.      
15d20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20    pNew->nOut += 
15d30 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62  pTerm->truthProb
15d40 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
15d50 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20 20 20  nOut -= nIn;.   
15d60 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66     }else{.#ifdef
15d70 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
15d80 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20  TAT3_OR_STAT4.  
15d90 20 20 20 20 20 20 74 52 6f 77 63 6e 74 20 6e 4f        tRowcnt nO
15da0 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ut = 0;.        
15db0 69 66 28 20 6e 49 6e 4d 75 6c 3d 3d 30 20 0a 20  if( nInMul==0 . 
15dc0 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62          && pProb
15dd0 65 2d 3e 6e 53 61 6d 70 6c 65 20 0a 20 20 20 20  e->nSample .    
15de0 20 20 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e       && pNew->u.
15df0 62 74 72 65 65 2e 6e 45 71 3c 3d 70 50 72 6f 62  btree.nEq<=pProb
15e00 65 2d 3e 6e 53 61 6d 70 6c 65 43 6f 6c 0a 20 20  e->nSampleCol.  
15e10 20 20 20 20 20 20 20 26 26 20 28 28 65 4f 70 20         && ((eOp 
15e20 26 20 57 4f 5f 49 4e 29 3d 3d 30 20 7c 7c 20 21  & WO_IN)==0 || !
15e30 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
15e40 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
15e50 5f 78 49 73 53 65 6c 65 63 74 29 29 0a 20 20 20  _xIsSelect)).   
15e60 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
15e70 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
15e80 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
15e90 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f 70          if( (eOp
15ea0 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e   & (WO_EQ|WO_ISN
15eb0 55 4c 4c 7c 57 4f 5f 49 53 29 29 21 3d 30 20 29  ULL|WO_IS))!=0 )
15ec0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
15ed0 73 74 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f  stcase( eOp & WO
15ee0 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 20  _EQ );.         
15ef0 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
15f00 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
15f10 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
15f20 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c  ( eOp & WO_ISNUL
15f30 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  L );.           
15f40 20 72 63 20 3d 20 77 68 65 72 65 45 71 75 61 6c   rc = whereEqual
15f50 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c 20  ScanEst(pParse, 
15f60 70 42 75 69 6c 64 65 72 2c 20 70 45 78 70 72 2d  pBuilder, pExpr-
15f70 3e 70 52 69 67 68 74 2c 20 26 6e 4f 75 74 29 3b  >pRight, &nOut);
15f80 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
15f90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
15fa0 20 3d 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73   = whereInScanEs
15fb0 74 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64  t(pParse, pBuild
15fc0 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  er, pExpr->x.pLi
15fd0 73 74 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20  st, &nOut);.    
15fe0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15ff0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16000 5f 4e 4f 54 46 4f 55 4e 44 20 29 20 72 63 20 3d  _NOTFOUND ) rc =
16010 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
16020 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
16030 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b  LITE_OK ) break;
16040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
16050 70 20 6f 75 74 20 6f 66 20 74 68 65 20 70 54 65  p out of the pTe
16060 72 6d 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20  rm loop */.     
16070 20 20 20 20 20 69 66 28 20 6e 4f 75 74 20 29 7b       if( nOut ){
16080 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65  .            pNe
16090 77 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65  w->nOut = sqlite
160a0 33 4c 6f 67 45 73 74 28 6e 4f 75 74 29 3b 0a 20  3LogEst(nOut);. 
160b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
160c0 4e 65 77 2d 3e 6e 4f 75 74 3e 73 61 76 65 64 5f  New->nOut>saved_
160d0 6e 4f 75 74 20 29 20 70 4e 65 77 2d 3e 6e 4f 75  nOut ) pNew->nOu
160e0 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
160f0 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77              pNew
16100 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 6e 3b 0a 20  ->nOut -= nIn;. 
16110 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16120 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
16130 20 6e 4f 75 74 3d 3d 30 20 29 0a 23 65 6e 64 69   nOut==0 ).#endi
16140 66 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  f.        {.    
16150 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
16160 20 2b 3d 20 28 70 50 72 6f 62 65 2d 3e 61 69 52   += (pProbe->aiR
16170 6f 77 4c 6f 67 45 73 74 5b 6e 45 71 5d 20 2d 20  owLogEst[nEq] - 
16180 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67  pProbe->aiRowLog
16190 45 73 74 5b 6e 45 71 2d 31 5d 29 3b 0a 20 20 20  Est[nEq-1]);.   
161a0 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 20 26         if( eOp &
161b0 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20   WO_ISNULL ){.  
161c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e            /* TUN
161d0 49 4e 47 3a 20 49 66 20 74 68 65 72 65 20 69 73  ING: If there is
161e0 20 6e 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29   no likelihood()
161f0 20 76 61 6c 75 65 2c 20 61 73 73 75 6d 65 20 74   value, assume t
16200 68 61 74 20 61 20 0a 20 20 20 20 20 20 20 20 20  hat a .         
16210 20 20 20 2a 2a 20 22 63 6f 6c 20 49 53 20 4e 55     ** "col IS NU
16220 4c 4c 22 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  LL" expression m
16230 61 74 63 68 65 73 20 74 77 69 63 65 20 61 73 20  atches twice as 
16240 6d 61 6e 79 20 72 6f 77 73 20 0a 20 20 20 20 20  many rows .     
16250 20 20 20 20 20 20 20 2a 2a 20 61 73 20 28 63 6f         ** as (co
16260 6c 3d 3f 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20  l=?). */.       
16270 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
16280 2b 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20  += 10;.         
16290 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
162a0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
162b0 2f 2a 20 53 65 74 20 72 43 6f 73 74 49 64 78 20  /* Set rCostIdx 
162c0 74 6f 20 74 68 65 20 63 6f 73 74 20 6f 66 20 76  to the cost of v
162d0 69 73 69 74 69 6e 67 20 73 65 6c 65 63 74 65 64  isiting selected
162e0 20 72 6f 77 73 20 69 6e 20 69 6e 64 65 78 2e 20   rows in index. 
162f0 41 64 64 0a 20 20 20 20 2a 2a 20 69 74 20 74 6f  Add.    ** it to
16300 20 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 77 68 69   pNew->rRun, whi
16310 63 68 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ch is currently 
16320 73 65 74 20 74 6f 20 74 68 65 20 63 6f 73 74 20  set to the cost 
16330 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  of the index.   
16340 20 2a 2a 20 73 65 65 6b 20 6f 6e 6c 79 2e 20 54   ** seek only. T
16350 68 65 6e 2c 20 69 66 20 74 68 69 73 20 69 73 20  hen, if this is 
16360 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  a non-covering i
16370 6e 64 65 78 2c 20 61 64 64 20 74 68 65 20 63 6f  ndex, add the co
16380 73 74 20 6f 66 0a 20 20 20 20 2a 2a 20 76 69 73  st of.    ** vis
16390 69 74 69 6e 67 20 74 68 65 20 72 6f 77 73 20 69  iting the rows i
163a0 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  n the main table
163b0 2e 20 20 2a 2f 0a 20 20 20 20 72 43 6f 73 74 49  .  */.    rCostI
163c0 64 78 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  dx = pNew->nOut 
163d0 2b 20 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65  + 1 + (15*pProbe
163e0 2d 3e 73 7a 49 64 78 52 6f 77 29 2f 70 53 72 63  ->szIdxRow)/pSrc
163f0 2d 3e 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77  ->pTab->szTabRow
16400 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e  ;.    pNew->rRun
16410 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
16420 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 20 72 43  Add(rLogSize, rC
16430 6f 73 74 49 64 78 29 3b 0a 20 20 20 20 69 66 28  ostIdx);.    if(
16440 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20   (pNew->wsFlags 
16450 26 20 28 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  & (WHERE_IDX_ONL
16460 59 7c 57 48 45 52 45 5f 49 50 4b 29 29 3d 3d 30  Y|WHERE_IPK))==0
16470 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   ){.      pNew->
16480 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
16490 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52  gEstAdd(pNew->rR
164a0 75 6e 2c 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b  un, pNew->nOut +
164b0 20 31 36 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   16);.    }.    
164c0 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
164d0 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20  ier(pNew->rRun, 
164e0 70 50 72 6f 62 65 2d 3e 70 54 61 62 6c 65 2d 3e  pProbe->pTable->
164f0 63 6f 73 74 4d 75 6c 74 29 3b 0a 0a 20 20 20 20  costMult);..    
16500 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 20 3d  nOutUnadjusted =
16510 20 70 4e 65 77 2d 3e 6e 4f 75 74 3b 0a 20 20 20   pNew->nOut;.   
16520 20 70 4e 65 77 2d 3e 72 52 75 6e 20 2b 3d 20 6e   pNew->rRun += n
16530 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20  InMul + nIn;.   
16540 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 6e   pNew->nOut += n
16550 49 6e 4d 75 6c 20 2b 20 6e 49 6e 3b 0a 20 20 20  InMul + nIn;.   
16560 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74   whereLoopOutput
16570 41 64 6a 75 73 74 28 70 42 75 69 6c 64 65 72 2d  Adjust(pBuilder-
16580 3e 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a  >pWC, pNew, rSiz
16590 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65  e);.    rc = whe
165a0 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
165b0 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 0a 20  ilder, pNew);.. 
165c0 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77 73 46     if( pNew->wsF
165d0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c  lags & WHERE_COL
165e0 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  UMN_RANGE ){.   
165f0 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20     pNew->nOut = 
16600 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20  saved_nOut;.    
16610 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65  }else{.      pNe
16620 77 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 55 6e  w->nOut = nOutUn
16630 61 64 6a 75 73 74 65 64 3b 0a 20 20 20 20 7d 0a  adjusted;.    }.
16640 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d 3e  .    if( (pNew->
16650 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
16660 54 4f 50 5f 4c 49 4d 49 54 29 3d 3d 30 0a 20 20  TOP_LIMIT)==0.  
16670 20 20 20 26 26 20 70 4e 65 77 2d 3e 75 2e 62 74     && pNew->u.bt
16680 72 65 65 2e 6e 45 71 3c 70 50 72 6f 62 65 2d 3e  ree.nEq<pProbe->
16690 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20 29 7b 0a 20  nColumn.    ){. 
166a0 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 41 64       whereLoopAd
166b0 64 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69  dBtreeIndex(pBui
166c0 6c 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f  lder, pSrc, pPro
166d0 62 65 2c 20 6e 49 6e 4d 75 6c 2b 6e 49 6e 29 3b  be, nInMul+nIn);
166e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d  .    }.    pNew-
166f0 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e 4f  >nOut = saved_nO
16700 75 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ut;.#ifdef SQLIT
16710 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
16720 52 5f 53 54 41 54 34 0a 20 20 20 20 70 42 75 69  R_STAT4.    pBui
16730 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20  lder->nRecValid 
16740 3d 20 6e 52 65 63 56 61 6c 69 64 3b 0a 23 65 6e  = nRecValid;.#en
16750 64 69 66 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e  dif.  }.  pNew->
16760 70 72 65 72 65 71 20 3d 20 73 61 76 65 64 5f 70  prereq = saved_p
16770 72 65 72 65 71 3b 0a 20 20 70 4e 65 77 2d 3e 75  rereq;.  pNew->u
16780 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76  .btree.nEq = sav
16790 65 64 5f 6e 45 71 3b 0a 20 20 70 4e 65 77 2d 3e  ed_nEq;.  pNew->
167a0 75 2e 62 74 72 65 65 2e 6e 42 74 6d 20 3d 20 73  u.btree.nBtm = s
167b0 61 76 65 64 5f 6e 42 74 6d 3b 0a 20 20 70 4e 65  aved_nBtm;.  pNe
167c0 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20  w->u.btree.nTop 
167d0 3d 20 73 61 76 65 64 5f 6e 54 6f 70 3b 0a 20 20  = saved_nTop;.  
167e0 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 73 61  pNew->nSkip = sa
167f0 76 65 64 5f 6e 53 6b 69 70 3b 0a 20 20 70 4e 65  ved_nSkip;.  pNe
16800 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76  w->wsFlags = sav
16810 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 70 4e  ed_wsFlags;.  pN
16820 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64  ew->nOut = saved
16830 5f 6e 4f 75 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e  _nOut;.  pNew->n
16840 4c 54 65 72 6d 20 3d 20 73 61 76 65 64 5f 6e 4c  LTerm = saved_nL
16850 54 65 72 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73  Term;..  /* Cons
16860 69 64 65 72 20 75 73 69 6e 67 20 61 20 73 6b 69  ider using a ski
16870 70 2d 73 63 61 6e 20 69 66 20 74 68 65 72 65 20  p-scan if there 
16880 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61  are no WHERE cla
16890 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  use constraints.
168a0 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 66    ** available f
168b0 6f 72 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  or the left-most
168c0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 69 6e   terms of the in
168d0 64 65 78 2c 20 61 6e 64 20 69 66 20 74 68 65 20  dex, and if the 
168e0 61 76 65 72 61 67 65 0a 20 20 2a 2a 20 6e 75 6d  average.  ** num
168f0 62 65 72 20 6f 66 20 72 65 70 65 61 74 73 20 69  ber of repeats i
16900 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  n the left-most 
16910 74 65 72 6d 73 20 69 73 20 61 74 20 6c 65 61 73  terms is at leas
16920 74 20 31 38 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  t 18. .  **.  **
16930 20 54 68 65 20 6d 61 67 69 63 20 6e 75 6d 62 65   The magic numbe
16940 72 20 31 38 20 69 73 20 73 65 6c 65 63 74 65 64  r 18 is selected
16950 20 6f 6e 20 74 68 65 20 62 61 73 69 73 20 74 68   on the basis th
16960 61 74 20 73 63 61 6e 6e 69 6e 67 20 31 37 20 72  at scanning 17 r
16970 6f 77 73 0a 20 20 2a 2a 20 69 73 20 61 6c 6d 6f  ows.  ** is almo
16980 73 74 20 61 6c 77 61 79 73 20 71 75 69 63 6b 65  st always quicke
16990 72 20 74 68 61 6e 20 61 6e 20 69 6e 64 65 78 20  r than an index 
169a0 73 65 65 6b 20 28 65 76 65 6e 20 74 68 6f 75 67  seek (even thoug
169b0 68 20 69 66 20 74 68 65 20 69 6e 64 65 78 0a 20  h if the index. 
169c0 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 66 65 77   ** contains few
169d0 65 72 20 74 68 61 6e 20 32 5e 31 37 20 72 6f 77  er than 2^17 row
169e0 73 20 77 65 20 61 73 73 75 6d 65 20 6f 74 68 65  s we assume othe
169f0 72 77 69 73 65 20 69 6e 20 6f 74 68 65 72 20 70  rwise in other p
16a00 61 72 74 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65  arts of.  ** the
16a10 20 63 6f 64 65 29 2e 20 41 6e 64 2c 20 65 76 65   code). And, eve
16a20 6e 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  n if it is not, 
16a30 69 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  it should not be
16a40 20 74 6f 6f 20 6d 75 63 68 20 73 6c 6f 77 65 72   too much slower
16a50 2e 20 0a 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f  . .  ** On the o
16a60 74 68 65 72 20 68 61 6e 64 2c 20 74 68 65 20 65  ther hand, the e
16a70 78 74 72 61 20 73 65 65 6b 73 20 63 6f 75 6c 64  xtra seeks could
16a80 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 73 69   end up being si
16a90 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a  gnificantly.  **
16aa0 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 2e   more expensive.
16ab0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 34    */.  assert( 4
16ac0 32 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74  2==sqlite3LogEst
16ad0 28 31 38 29 20 29 3b 0a 20 20 69 66 28 20 73 61  (18) );.  if( sa
16ae0 76 65 64 5f 6e 45 71 3d 3d 73 61 76 65 64 5f 6e  ved_nEq==saved_n
16af0 53 6b 69 70 0a 20 20 20 26 26 20 73 61 76 65 64  Skip.   && saved
16b00 5f 6e 45 71 2b 31 3c 70 50 72 6f 62 65 2d 3e 6e  _nEq+1<pProbe->n
16b10 4b 65 79 43 6f 6c 0a 20 20 20 26 26 20 70 50 72  KeyCol.   && pPr
16b20 6f 62 65 2d 3e 6e 6f 53 6b 69 70 53 63 61 6e 3d  obe->noSkipScan=
16b30 3d 30 0a 20 20 20 26 26 20 70 50 72 6f 62 65 2d  =0.   && pProbe-
16b40 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76  >aiRowLogEst[sav
16b50 65 64 5f 6e 45 71 2b 31 5d 3e 3d 34 32 20 20 2f  ed_nEq+1]>=42  /
16b60 2a 20 54 55 4e 49 4e 47 3a 20 4d 69 6e 69 6d 75  * TUNING: Minimu
16b70 6d 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20  m for skip-scan 
16b80 2a 2f 0a 20 20 20 26 26 20 28 72 63 20 3d 20 77  */.   && (rc = w
16b90 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64  hereLoopResize(d
16ba0 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d 3e 6e  b, pNew, pNew->n
16bb0 4c 54 65 72 6d 2b 31 29 29 3d 3d 53 51 4c 49 54  LTerm+1))==SQLIT
16bc0 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 4c 6f  E_OK.  ){.    Lo
16bd0 67 45 73 74 20 6e 49 74 65 72 3b 0a 20 20 20 20  gEst nIter;.    
16be0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
16bf0 71 2b 2b 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  q++;.    pNew->n
16c00 53 6b 69 70 2b 2b 3b 0a 20 20 20 20 70 4e 65 77  Skip++;.    pNew
16c10 2d 3e 61 4c 54 65 72 6d 5b 70 4e 65 77 2d 3e 6e  ->aLTerm[pNew->n
16c20 4c 54 65 72 6d 2b 2b 5d 20 3d 20 30 3b 0a 20 20  LTerm++] = 0;.  
16c30 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
16c40 7c 3d 20 57 48 45 52 45 5f 53 4b 49 50 53 43 41  |= WHERE_SKIPSCA
16c50 4e 3b 0a 20 20 20 20 6e 49 74 65 72 20 3d 20 70  N;.    nIter = p
16c60 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45  Probe->aiRowLogE
16c70 73 74 5b 73 61 76 65 64 5f 6e 45 71 5d 20 2d 20  st[saved_nEq] - 
16c80 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67  pProbe->aiRowLog
16c90 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b 31 5d  Est[saved_nEq+1]
16ca0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74  ;.    pNew->nOut
16cb0 20 2d 3d 20 6e 49 74 65 72 3b 0a 20 20 20 20 2f   -= nIter;.    /
16cc0 2a 20 54 55 4e 49 4e 47 3a 20 20 42 65 63 61 75  * TUNING:  Becau
16cd0 73 65 20 75 6e 63 65 72 74 61 69 6e 74 69 65 73  se uncertainties
16ce0 20 69 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65   in the estimate
16cf0 73 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 20  s for skip-scan 
16d00 71 75 65 72 69 65 73 2c 0a 20 20 20 20 2a 2a 20  queries,.    ** 
16d10 61 64 64 20 61 20 31 2e 33 37 35 20 66 75 64 67  add a 1.375 fudg
16d20 65 20 66 61 63 74 6f 72 20 74 6f 20 6d 61 6b 65  e factor to make
16d30 20 73 6b 69 70 2d 73 63 61 6e 20 73 6c 69 67 68   skip-scan sligh
16d40 74 6c 79 20 6c 65 73 73 20 6c 69 6b 65 6c 79 2e  tly less likely.
16d50 20 2a 2f 0a 20 20 20 20 6e 49 74 65 72 20 2b 3d   */.    nIter +=
16d60 20 35 3b 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f   5;.    whereLoo
16d70 70 41 64 64 42 74 72 65 65 49 6e 64 65 78 28 70  pAddBtreeIndex(p
16d80 42 75 69 6c 64 65 72 2c 20 70 53 72 63 2c 20 70  Builder, pSrc, p
16d90 50 72 6f 62 65 2c 20 6e 49 74 65 72 20 2b 20 6e  Probe, nIter + n
16da0 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 70 4e 65 77  InMul);.    pNew
16db0 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
16dc0 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  Out;.    pNew->u
16dd0 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 73 61 76  .btree.nEq = sav
16de0 65 64 5f 6e 45 71 3b 0a 20 20 20 20 70 4e 65 77  ed_nEq;.    pNew
16df0 2d 3e 6e 53 6b 69 70 20 3d 20 73 61 76 65 64 5f  ->nSkip = saved_
16e00 6e 53 6b 69 70 3b 0a 20 20 20 20 70 4e 65 77 2d  nSkip;.    pNew-
16e10 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76 65 64  >wsFlags = saved
16e20 5f 77 73 46 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20  _wsFlags;.  }.. 
16e30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16e40 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 72 75 65  *.** Return True
16e50 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69 62   if it is possib
16e60 6c 65 20 74 68 61 74 20 70 49 6e 64 65 78 20 6d  le that pIndex m
16e70 69 67 68 74 20 62 65 20 75 73 65 66 75 6c 20 69  ight be useful i
16e80 6e 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 69 6e  n.** implementin
16e90 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  g the ORDER BY c
16ea0 6c 61 75 73 65 20 69 6e 20 70 42 75 69 6c 64 65  lause in pBuilde
16eb0 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
16ec0 46 61 6c 73 65 20 69 66 20 70 42 75 69 6c 64 65  False if pBuilde
16ed0 72 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  r does not conta
16ee0 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  in an ORDER BY c
16ef0 6c 61 75 73 65 20 6f 72 0a 2a 2a 20 69 66 20 74  lause or.** if t
16f00 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 66  here is no way f
16f10 6f 72 20 70 49 6e 64 65 78 20 74 6f 20 62 65 20  or pIndex to be 
16f20 75 73 65 66 75 6c 20 69 6e 20 69 6d 70 6c 65 6d  useful in implem
16f30 65 6e 74 69 6e 67 20 74 68 61 74 0a 2a 2a 20 4f  enting that.** O
16f40 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 0a  RDER BY clause..
16f50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
16f60 64 65 78 4d 69 67 68 74 48 65 6c 70 57 69 74 68  dexMightHelpWith
16f70 4f 72 64 65 72 42 79 28 0a 20 20 57 68 65 72 65  OrderBy(.  Where
16f80 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
16f90 69 6c 64 65 72 2c 0a 20 20 49 6e 64 65 78 20 2a  ilder,.  Index *
16fa0 70 49 6e 64 65 78 2c 0a 20 20 69 6e 74 20 69 43  pIndex,.  int iC
16fb0 75 72 73 6f 72 0a 29 7b 0a 20 20 45 78 70 72 4c  ursor.){.  ExprL
16fc0 69 73 74 20 2a 70 4f 42 3b 0a 20 20 45 78 70 72  ist *pOB;.  Expr
16fd0 4c 69 73 74 20 2a 61 43 6f 6c 45 78 70 72 3b 0a  List *aColExpr;.
16fe0 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20    int ii, jj;.. 
16ff0 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 62 55 6e   if( pIndex->bUn
17000 6f 72 64 65 72 65 64 20 29 20 72 65 74 75 72 6e  ordered ) return
17010 20 30 3b 0a 20 20 69 66 28 20 28 70 4f 42 20 3d   0;.  if( (pOB =
17020 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66   pBuilder->pWInf
17030 6f 2d 3e 70 4f 72 64 65 72 42 79 29 3d 3d 30 20  o->pOrderBy)==0 
17040 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f  ) return 0;.  fo
17050 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e  r(ii=0; ii<pOB->
17060 6e 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20  nExpr; ii++){.  
17070 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
17080 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
17090 6f 6c 6c 61 74 65 28 70 4f 42 2d 3e 61 5b 69 69  ollate(pOB->a[ii
170a0 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
170b0 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
170c0 43 4f 4c 55 4d 4e 20 26 26 20 70 45 78 70 72 2d  COLUMN && pExpr-
170d0 3e 69 54 61 62 6c 65 3d 3d 69 43 75 72 73 6f 72  >iTable==iCursor
170e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45   ){.      if( pE
170f0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
17100 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
17110 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49   for(jj=0; jj<pI
17120 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a  ndex->nKeyCol; j
17130 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
17140 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
17150 3d 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  ==pIndex->aiColu
17160 6d 6e 5b 6a 6a 5d 20 29 20 72 65 74 75 72 6e 20  mn[jj] ) return 
17170 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
17180 65 6c 73 65 20 69 66 28 20 28 61 43 6f 6c 45 78  else if( (aColEx
17190 70 72 20 3d 20 70 49 6e 64 65 78 2d 3e 61 43 6f  pr = pIndex->aCo
171a0 6c 45 78 70 72 29 21 3d 30 20 29 7b 0a 20 20 20  lExpr)!=0 ){.   
171b0 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c     for(jj=0; jj<
171c0 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  pIndex->nKeyCol;
171d0 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   jj++){.        
171e0 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f  if( pIndex->aiCo
171f0 6c 75 6d 6e 5b 6a 6a 5d 21 3d 58 4e 5f 45 58 50  lumn[jj]!=XN_EXP
17200 52 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  R ) continue;.  
17210 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
17220 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78  3ExprCompare(pEx
17230 70 72 2c 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a  pr,aColExpr->a[j
17240 6a 5d 2e 70 45 78 70 72 2c 69 43 75 72 73 6f 72  j].pExpr,iCursor
17250 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
17260 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
17270 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
17280 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
17290 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
172a0 75 72 6e 20 61 20 62 69 74 6d 61 73 6b 20 77 68  urn a bitmask wh
172b0 65 72 65 20 31 73 20 69 6e 64 69 63 61 74 65 20  ere 1s indicate 
172c0 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 73 70  that the corresp
172d0 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66  onding column of
172e0 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 69 73  .** the table is
172f0 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65   used by an inde
17300 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72  x.  Only the fir
17310 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72  st 63 columns ar
17320 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f  e considered..*/
17330 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
17340 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49  columnsInIndex(I
17350 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42  ndex *pIdx){.  B
17360 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20  itmask m = 0;.  
17370 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70  int j;.  for(j=p
17380 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20  Idx->nColumn-1; 
17390 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20  j>=0; j--){.    
173a0 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69  int x = pIdx->ai
173b0 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69  Column[j];.    i
173c0 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( x>=0 ){.     
173d0 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d   testcase( x==BM
173e0 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
173f0 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20  tcase( x==BMS-2 
17400 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3c 42  );.      if( x<B
17410 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b  MS-1 ) m |= MASK
17420 42 49 54 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20  BIT(x);.    }.  
17430 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a  }.  return m;.}.
17440 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  ./* Check to see
17450 20 69 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e   if a partial in
17460 64 65 78 20 77 69 74 68 20 70 50 61 72 74 49 6e  dex with pPartIn
17470 64 65 78 57 68 65 72 65 20 63 61 6e 20 62 65 20  dexWhere can be 
17480 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63  used.** in the c
17490 75 72 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52  urrent query.  R
174a0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
174b0 20 63 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73   can be and fals
174c0 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  e if not..*/.sta
174d0 74 69 63 20 69 6e 74 20 77 68 65 72 65 55 73 61  tic int whereUsa
174e0 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28  blePartialIndex(
174f0 69 6e 74 20 69 54 61 62 2c 20 57 68 65 72 65 43  int iTab, WhereC
17500 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
17510 20 2a 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74   *pWhere){.  int
17520 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   i;.  WhereTerm 
17530 2a 70 54 65 72 6d 3b 0a 20 20 77 68 69 6c 65 28  *pTerm;.  while(
17540 20 70 57 68 65 72 65 2d 3e 6f 70 3d 3d 54 4b 5f   pWhere->op==TK_
17550 41 4e 44 20 29 7b 0a 20 20 20 20 69 66 28 20 21  AND ){.    if( !
17560 77 68 65 72 65 55 73 61 62 6c 65 50 61 72 74 69  whereUsableParti
17570 61 6c 49 6e 64 65 78 28 69 54 61 62 2c 70 57 43  alIndex(iTab,pWC
17580 2c 70 57 68 65 72 65 2d 3e 70 4c 65 66 74 29 20  ,pWhere->pLeft) 
17590 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
175a0 70 57 68 65 72 65 20 3d 20 70 57 68 65 72 65 2d  pWhere = pWhere-
175b0 3e 70 52 69 67 68 74 3b 0a 20 20 7d 0a 20 20 66  >pRight;.  }.  f
175c0 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70 57  or(i=0, pTerm=pW
175d0 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
175e0 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
175f0 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
17600 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pr = pTerm->pExp
17610 72 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  r;.    if( sqlit
17620 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
17630 72 28 70 45 78 70 72 2c 20 70 57 68 65 72 65 2c  r(pExpr, pWhere,
17640 20 69 54 61 62 29 20 0a 20 20 20 20 20 26 26 20   iTab) .     && 
17650 28 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  (!ExprHasPropert
17660 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  y(pExpr, EP_From
17670 4a 6f 69 6e 29 20 7c 7c 20 70 45 78 70 72 2d 3e  Join) || pExpr->
17680 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3d  iRightJoinTable=
17690 3d 69 54 61 62 29 0a 20 20 20 20 29 7b 0a 20 20  =iTab).    ){.  
176a0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
176b0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
176c0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   0;.}../*.** Add
176d0 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20 6f   all WhereLoop o
176e0 62 6a 65 63 74 73 20 66 6f 72 20 61 20 73 69 6e  bjects for a sin
176f0 67 6c 65 20 74 61 62 6c 65 20 6f 66 20 74 68 65  gle table of the
17700 20 6a 6f 69 6e 20 77 68 65 72 65 20 74 68 65 20   join where the 
17710 74 61 62 6c 65 0a 2a 2a 20 69 73 20 69 64 65 6e  table.** is iden
17720 74 69 66 69 65 64 20 62 79 20 70 42 75 69 6c 64  tified by pBuild
17730 65 72 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20  er->pNew->iTab. 
17740 20 54 68 61 74 20 74 61 62 6c 65 20 69 73 20 67   That table is g
17750 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 0a  uaranteed to be.
17760 2a 2a 20 61 20 62 2d 74 72 65 65 20 74 61 62 6c  ** a b-tree tabl
17770 65 2c 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c  e, not a virtual
17780 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
17790 65 20 63 6f 73 74 73 20 28 57 68 65 72 65 4c 6f  e costs (WhereLo
177a0 6f 70 2e 72 52 75 6e 29 20 6f 66 20 74 68 65 20  op.rRun) of the 
177b0 62 2d 74 72 65 65 20 6c 6f 6f 70 73 20 61 64 64  b-tree loops add
177c0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
177d0 69 6f 6e 0a 2a 2a 20 61 72 65 20 63 61 6c 63 75  ion.** are calcu
177e0 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  lated as follows
177f0 3a 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 66 75  :.**.** For a fu
17800 6c 6c 20 73 63 61 6e 2c 20 61 73 73 75 6d 69 6e  ll scan, assumin
17810 67 20 74 68 65 20 74 61 62 6c 65 20 28 6f 72 20  g the table (or 
17820 69 6e 64 65 78 29 20 63 6f 6e 74 61 69 6e 73 20  index) contains 
17830 6e 52 6f 77 20 72 6f 77 73 3a 0a 2a 2a 0a 2a 2a  nRow rows:.**.**
17840 20 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77       cost = nRow
17850 20 2a 20 33 2e 30 20 20 20 20 20 20 20 20 20 20   * 3.0          
17860 20 20 20 20 20 20 20 20 20 20 2f 2f 20 66 75 6c            // ful
17870 6c 2d 74 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20  l-table scan.** 
17880 20 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20      cost = nRow 
17890 2a 20 4b 20 20 20 20 20 20 20 20 20 20 20 20 20  * K             
178a0 20 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e           // scan
178b0 20 6f 66 20 63 6f 76 65 72 69 6e 67 20 69 6e 64   of covering ind
178c0 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d  ex.**     cost =
178d0 20 6e 52 6f 77 20 2a 20 28 4b 2b 33 2e 30 29 20   nRow * (K+3.0) 
178e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
178f0 2f 20 73 63 61 6e 20 6f 66 20 6e 6f 6e 2d 63 6f  / scan of non-co
17900 76 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a  vering index.**.
17910 2a 2a 20 77 68 65 72 65 20 4b 20 69 73 20 61 20  ** where K is a 
17920 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e  value between 1.
17930 31 20 61 6e 64 20 33 2e 30 20 73 65 74 20 62 61  1 and 3.0 set ba
17940 73 65 64 20 6f 6e 20 74 68 65 20 72 65 6c 61 74  sed on the relat
17950 69 76 65 20 0a 2a 2a 20 65 73 74 69 6d 61 74 65  ive .** estimate
17960 64 20 61 76 65 72 61 67 65 20 73 69 7a 65 20 6f  d average size o
17970 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  f the index and 
17980 74 61 62 6c 65 20 72 65 63 6f 72 64 73 2e 0a 2a  table records..*
17990 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65  *.** For an inde
179a0 78 20 73 63 61 6e 2c 20 77 68 65 72 65 20 6e 56  x scan, where nV
179b0 69 73 69 74 20 69 73 20 74 68 65 20 6e 75 6d 62  isit is the numb
179c0 65 72 20 6f 66 20 69 6e 64 65 78 20 72 6f 77 73  er of index rows
179d0 20 76 69 73 69 74 65 64 0a 2a 2a 20 62 79 20 74   visited.** by t
179e0 68 65 20 73 63 61 6e 2c 20 61 6e 64 20 6e 53 65  he scan, and nSe
179f0 65 6b 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ek is the number
17a00 20 6f 66 20 73 65 65 6b 20 6f 70 65 72 61 74 69   of seek operati
17a10 6f 6e 73 20 72 65 71 75 69 72 65 64 20 6f 6e 20  ons required on 
17a20 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 62 2d  .** the index b-
17a30 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  tree:.**.**     
17a40 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20 2a 20 28  cost = nSeek * (
17a50 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 4b 20 2a 20  log(nRow) + K * 
17a60 6e 56 69 73 69 74 29 20 20 20 20 20 20 20 20 20  nVisit)         
17a70 20 2f 2f 20 63 6f 76 65 72 69 6e 67 20 69 6e 64   // covering ind
17a80 65 78 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d  ex.**     cost =
17a90 20 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52   nSeek * (log(nR
17aa0 6f 77 29 20 2b 20 28 4b 2b 33 2e 30 29 20 2a 20  ow) + (K+3.0) * 
17ab0 6e 56 69 73 69 74 29 20 20 20 20 2f 2f 20 6e 6f  nVisit)    // no
17ac0 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  n-covering index
17ad0 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
17ae0 20 6e 53 65 65 6b 20 69 73 20 31 2e 20 6e 53 65   nSeek is 1. nSe
17af0 65 6b 20 76 61 6c 75 65 73 20 67 72 65 61 74 65  ek values greate
17b00 72 20 74 68 61 6e 20 31 20 63 6f 6d 65 20 61 62  r than 1 come ab
17b10 6f 75 74 20 69 66 20 74 68 65 20 0a 2a 2a 20 57  out if the .** W
17b20 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 63 6c  HERE clause incl
17b30 75 64 65 73 20 22 78 20 49 4e 20 28 2e 2e 2e 2e  udes "x IN (....
17b40 29 22 20 74 65 72 6d 73 20 75 73 65 64 20 69 6e  )" terms used in
17b50 20 70 6c 61 63 65 20 6f 66 20 22 78 3d 3f 22 2e   place of "x=?".
17b60 20 4f 72 20 77 68 65 6e 20 0a 2a 2a 20 69 6d 70   Or when .** imp
17b70 6c 69 63 69 74 20 22 78 20 49 4e 20 28 53 45 4c  licit "x IN (SEL
17b80 45 43 54 20 78 20 46 52 4f 4d 20 74 62 6c 29 22  ECT x FROM tbl)"
17b90 20 74 65 72 6d 73 20 61 72 65 20 61 64 64 65 64   terms are added
17ba0 20 66 6f 72 20 73 6b 69 70 2d 73 63 61 6e 73 2e   for skip-scans.
17bb0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d  .**.** The estim
17bc0 61 74 65 64 20 76 61 6c 75 65 73 20 28 6e 52 6f  ated values (nRo
17bd0 77 2c 20 6e 56 69 73 69 74 2c 20 6e 53 65 65 6b  w, nVisit, nSeek
17be0 29 20 6f 66 74 65 6e 20 63 6f 6e 74 61 69 6e 20  ) often contain 
17bf0 61 20 6c 61 72 67 65 20 61 6d 6f 75 6e 74 0a 2a  a large amount.*
17c00 2a 20 6f 66 20 75 6e 63 65 72 74 61 69 6e 74 79  * of uncertainty
17c10 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73  .  For this reas
17c20 6f 6e 2c 20 73 63 6f 72 69 6e 67 20 69 73 20 64  on, scoring is d
17c30 65 73 69 67 6e 65 64 20 74 6f 20 70 69 63 6b 20  esigned to pick 
17c40 70 6c 61 6e 73 20 74 68 61 74 0a 2a 2a 20 22 64  plans that.** "d
17c50 6f 20 74 68 65 20 6c 65 61 73 74 20 68 61 72 6d  o the least harm
17c60 22 20 69 66 20 74 68 65 20 65 73 74 69 6d 61 74  " if the estimat
17c70 65 73 20 61 72 65 20 69 6e 61 63 63 75 72 61 74  es are inaccurat
17c80 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  e.  For example,
17c90 20 61 0a 2a 2a 20 6c 6f 67 28 6e 52 6f 77 29 20   a.** log(nRow) 
17ca0 66 61 63 74 6f 72 20 69 73 20 6f 6d 69 74 74 65  factor is omitte
17cb0 64 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 63 6f 76  d from a non-cov
17cc0 65 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e  ering index scan
17cd0 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 2a 2a 20   in order to.** 
17ce0 62 69 61 73 20 74 68 65 20 73 63 6f 72 69 6e 67  bias the scoring
17cf0 20 69 6e 20 66 61 76 6f 72 20 6f 66 20 75 73 69   in favor of usi
17d00 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 73 69 6e  ng an index, sin
17d10 63 65 20 74 68 65 20 77 6f 72 73 74 2d 63 61 73  ce the worst-cas
17d20 65 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65  e.** performance
17d30 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64   of using an ind
17d40 65 78 20 69 73 20 66 61 72 20 62 65 74 74 65 72  ex is far better
17d50 20 74 68 61 6e 20 74 68 65 20 77 6f 72 73 74 2d   than the worst-
17d60 63 61 73 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  case performance
17d70 0a 2a 2a 20 6f 66 20 61 20 66 75 6c 6c 20 74 61  .** of a full ta
17d80 62 6c 65 20 73 63 61 6e 2e 0a 2a 2f 0a 73 74 61  ble scan..*/.sta
17d90 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
17da0 70 41 64 64 42 74 72 65 65 28 0a 20 20 57 68 65  pAddBtree(.  Whe
17db0 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
17dc0 42 75 69 6c 64 65 72 2c 20 2f 2a 20 57 48 45 52  Builder, /* WHER
17dd0 45 20 63 6c 61 75 73 65 20 69 6e 66 6f 72 6d 61  E clause informa
17de0 74 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tion */.  Bitmas
17df0 6b 20 6d 50 72 65 72 65 71 20 20 20 20 20 20 20  k mPrereq       
17e00 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 70        /* Extra p
17e10 72 65 72 65 71 75 65 73 69 74 65 73 20 66 6f 72  rerequesites for
17e20 20 75 73 69 6e 67 20 74 68 69 73 20 74 61 62 6c   using this tabl
17e30 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 49  e */.){.  WhereI
17e40 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
17e50 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20 61        /* WHERE a
17e60 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74 20  nalysis context 
17e70 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72 6f  */.  Index *pPro
17e80 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  be;             
17e90 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65 20   /* An index we 
17ea0 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 2a  are evaluating *
17eb0 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b 3b 20 20  /.  Index sPk;  
17ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ed0 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64 65 78 20  /* A fake index 
17ee0 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 70  object for the p
17ef0 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f 0a 20 20  rimary key */.  
17f00 4c 6f 67 45 73 74 20 61 69 52 6f 77 45 73 74 50  LogEst aiRowEstP
17f10 6b 5b 32 5d 3b 20 20 20 20 20 20 20 2f 2a 20 54  k[2];       /* T
17f20 68 65 20 61 69 52 6f 77 4c 6f 67 45 73 74 5b 5d  he aiRowLogEst[]
17f30 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
17f40 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 31  Pk index */.  i1
17f50 36 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d  6 aiColumnPk = -
17f60 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  1;        /* The
17f70 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65   aColumn[] value
17f80 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64   for the sPk ind
17f90 65 78 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  ex */.  SrcList 
17fa0 2a 70 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20  *pTabList;      
17fb0 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20      /* The FROM 
17fc0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
17fd0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
17fe0 2a 70 53 72 63 3b 20 20 2f 2a 20 54 68 65 20 46  *pSrc;  /* The F
17ff0 52 4f 4d 20 63 6c 61 75 73 65 20 62 74 72 65 65  ROM clause btree
18000 20 74 65 72 6d 20 74 6f 20 61 64 64 20 2a 2f 0a   term to add */.
18010 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65    WhereLoop *pNe
18020 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  w;            /*
18030 20 54 65 6d 70 6c 61 74 65 20 57 68 65 72 65 4c   Template WhereL
18040 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  oop object */.  
18050 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
18060 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 52  OK;         /* R
18070 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
18080 69 6e 74 20 69 53 6f 72 74 49 64 78 20 3d 20 31  int iSortIdx = 1
18090 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
180a0 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ndex number */. 
180b0 20 69 6e 74 20 62 3b 20 20 20 20 20 20 20 20 20   int b;         
180c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
180d0 41 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20  A boolean value 
180e0 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 53 69 7a  */.  LogEst rSiz
180f0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
18100 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f   /* number of ro
18110 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
18120 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 72 4c 6f 67  */.  LogEst rLog
18130 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
18140 20 2f 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66   /* Logarithm of
18150 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
18160 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
18170 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
18180 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
18190 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 64 20    /* The parsed 
181a0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
181b0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
181c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
181d0 20 54 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65   Table being que
181e0 72 69 65 64 20 2a 2f 0a 20 20 0a 20 20 70 4e 65  ried */.  .  pNe
181f0 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e  w = pBuilder->pN
18200 65 77 3b 0a 20 20 70 57 49 6e 66 6f 20 3d 20 70  ew;.  pWInfo = p
18210 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 3b  Builder->pWInfo;
18220 0a 20 20 70 54 61 62 4c 69 73 74 20 3d 20 70 57  .  pTabList = pW
18230 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a  Info->pTabList;.
18240 20 20 70 53 72 63 20 3d 20 70 54 61 62 4c 69 73    pSrc = pTabLis
18250 74 2d 3e 61 20 2b 20 70 4e 65 77 2d 3e 69 54 61  t->a + pNew->iTa
18260 62 3b 0a 20 20 70 54 61 62 20 3d 20 70 53 72 63  b;.  pTab = pSrc
18270 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43 20 3d 20  ->pTab;.  pWC = 
18280 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20  pBuilder->pWC;. 
18290 20 61 73 73 65 72 74 28 20 21 49 73 56 69 72 74   assert( !IsVirt
182a0 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20  ual(pSrc->pTab) 
182b0 29 3b 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e  );..  if( pSrc->
182c0 70 49 42 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  pIBIndex ){.    
182d0 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42 59  /* An INDEXED BY
182e0 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65   clause specifie
182f0 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  s a particular i
18300 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a 20  ndex to use */. 
18310 20 20 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63     pProbe = pSrc
18320 2d 3e 70 49 42 49 6e 64 65 78 3b 0a 20 20 7d 65  ->pIBIndex;.  }e
18330 6c 73 65 20 69 66 28 20 21 48 61 73 52 6f 77 69  lse if( !HasRowi
18340 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 70  d(pTab) ){.    p
18350 50 72 6f 62 65 20 3d 20 70 54 61 62 2d 3e 70 49  Probe = pTab->pI
18360 6e 64 65 78 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ndex;.  }else{. 
18370 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e     /* There is n
18380 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  o INDEXED BY cla
18390 75 73 65 2e 20 20 43 72 65 61 74 65 20 61 20 66  use.  Create a f
183a0 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74  ake Index object
183b0 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a   in local.    **
183c0 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20 74 6f   variable sPk to
183d0 20 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 72   represent the r
183e0 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b 65 79  owid primary key
183f0 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 74 68   index.  Make th
18400 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65 20 69  is.    ** fake i
18410 6e 64 65 78 20 74 68 65 20 66 69 72 73 74 20 69  ndex the first i
18420 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49 6e 64  n a chain of Ind
18430 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74 68 20  ex objects with 
18440 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61 6c 0a  all of the real.
18450 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74      ** indices t
18460 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20  o follow */.    
18470 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b 20 20  Index *pFirst;  
18480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18490 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65 61 6c  /* First of real
184a0 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68 65 20   indices on the 
184b0 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d  table */.    mem
184c0 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a  set(&sPk, 0, siz
184d0 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20  eof(Index));.   
184e0 20 73 50 6b 2e 6e 4b 65 79 43 6f 6c 20 3d 20 31   sPk.nKeyCol = 1
184f0 3b 0a 20 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d  ;.    sPk.nColum
18500 6e 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61  n = 1;.    sPk.a
18510 69 43 6f 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c  iColumn = &aiCol
18520 75 6d 6e 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61  umnPk;.    sPk.a
18530 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20 61 69 52  iRowLogEst = aiR
18540 6f 77 45 73 74 50 6b 3b 0a 20 20 20 20 73 50 6b  owEstPk;.    sPk
18550 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65  .onError = OE_Re
18560 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70  place;.    sPk.p
18570 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20  Table = pTab;.  
18580 20 20 73 50 6b 2e 73 7a 49 64 78 52 6f 77 20 3d    sPk.szIdxRow =
18590 20 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b   pTab->szTabRow;
185a0 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b  .    aiRowEstPk[
185b0 30 5d 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77 4c  0] = pTab->nRowL
185c0 6f 67 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77  ogEst;.    aiRow
185d0 45 73 74 50 6b 5b 31 5d 20 3d 20 30 3b 0a 20 20  EstPk[1] = 0;.  
185e0 20 20 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d    pFirst = pSrc-
185f0 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20  >pTab->pIndex;. 
18600 20 20 20 69 66 28 20 70 53 72 63 2d 3e 66 67 2e     if( pSrc->fg.
18610 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b  notIndexed==0 ){
18620 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65  .      /* The re
18630 61 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 74 68  al indices of th
18640 65 20 74 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79  e table are only
18650 20 63 6f 6e 73 69 64 65 72 65 64 20 69 66 20 74   considered if t
18660 68 65 0a 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20  he.      ** NOT 
18670 49 4e 44 45 58 45 44 20 71 75 61 6c 69 66 69 65  INDEXED qualifie
18680 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f  r is omitted fro
18690 6d 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  m the FROM claus
186a0 65 20 2a 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70  e */.      sPk.p
186b0 4e 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20  Next = pFirst;. 
186c0 20 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20     }.    pProbe 
186d0 3d 20 26 73 50 6b 3b 0a 20 20 7d 0a 20 20 72 53  = &sPk;.  }.  rS
186e0 69 7a 65 20 3d 20 70 54 61 62 2d 3e 6e 52 6f 77  ize = pTab->nRow
186f0 4c 6f 67 45 73 74 3b 0a 20 20 72 4c 6f 67 53 69  LogEst;.  rLogSi
18700 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53 69 7a  ze = estLog(rSiz
18710 65 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  e);..#ifndef SQL
18720 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
18730 49 43 5f 49 4e 44 45 58 0a 20 20 2f 2a 20 41 75  IC_INDEX.  /* Au
18740 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20  tomatic indexes 
18750 2a 2f 0a 20 20 69 66 28 20 21 70 42 75 69 6c 64  */.  if( !pBuild
18760 65 72 2d 3e 70 4f 72 53 65 74 20 20 20 20 20 20  er->pOrSet      
18770 2f 2a 20 4e 6f 74 20 70 61 72 74 20 6f 66 20 61  /* Not part of a
18780 6e 20 4f 52 20 6f 70 74 69 6d 69 7a 61 74 69 6f  n OR optimizatio
18790 6e 20 2a 2f 0a 20 20 20 26 26 20 28 70 57 49 6e  n */.   && (pWIn
187a0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
187b0 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41   WHERE_OR_SUBCLA
187c0 55 53 45 29 3d 3d 30 0a 20 20 20 26 26 20 28 70  USE)==0.   && (p
187d0 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64  WInfo->pParse->d
187e0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
187f0 45 5f 41 75 74 6f 49 6e 64 65 78 29 21 3d 30 0a  E_AutoIndex)!=0.
18800 20 20 20 26 26 20 70 53 72 63 2d 3e 70 49 42 49     && pSrc->pIBI
18810 6e 64 65 78 3d 3d 30 20 20 20 20 20 20 2f 2a 20  ndex==0      /* 
18820 48 61 73 20 6e 6f 20 49 4e 44 45 58 45 44 20 42  Has no INDEXED B
18830 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 26  Y clause */.   &
18840 26 20 21 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49  & !pSrc->fg.notI
18850 6e 64 65 78 65 64 20 20 20 2f 2a 20 48 61 73 20  ndexed   /* Has 
18860 6e 6f 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63  no NOT INDEXED c
18870 6c 61 75 73 65 20 2a 2f 0a 20 20 20 26 26 20 48  lause */.   && H
18880 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 20 20  asRowid(pTab)   
18890 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 57 49 54        /* Not WIT
188a0 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
188b0 2e 20 28 46 49 58 4d 45 3a 20 57 68 79 20 6e 6f  . (FIXME: Why no
188c0 74 3f 29 20 2a 2f 0a 20 20 20 26 26 20 21 70 53  t?) */.   && !pS
188d0 72 63 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61  rc->fg.isCorrela
188e0 74 65 64 20 2f 2a 20 4e 6f 74 20 61 20 63 6f 72  ted /* Not a cor
188f0 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79  related subquery
18900 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63 2d   */.   && !pSrc-
18910 3e 66 67 2e 69 73 52 65 63 75 72 73 69 76 65 20  >fg.isRecursive 
18920 20 2f 2a 20 4e 6f 74 20 61 20 72 65 63 75 72 73   /* Not a recurs
18930 69 76 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65  ive common table
18940 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a   expression. */.
18950 20 20 29 7b 0a 20 20 20 20 2f 2a 20 47 65 6e 65    ){.    /* Gene
18960 72 61 74 65 20 61 75 74 6f 2d 69 6e 64 65 78 20  rate auto-index 
18970 57 68 65 72 65 4c 6f 6f 70 73 20 2a 2f 0a 20 20  WhereLoops */.  
18980 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
18990 72 6d 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  rm;.    WhereTer
189a0 6d 20 2a 70 57 43 45 6e 64 20 3d 20 70 57 43 2d  m *pWCEnd = pWC-
189b0 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72 6d 3b  >a + pWC->nTerm;
189c0 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  .    for(pTerm=p
189d0 57 43 2d 3e 61 3b 20 72 63 3d 3d 53 51 4c 49 54  WC->a; rc==SQLIT
189e0 45 5f 4f 4b 20 26 26 20 70 54 65 72 6d 3c 70 57  E_OK && pTerm<pW
189f0 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
18a00 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
18a10 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20 70  >prereqRight & p
18a20 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 20 29 20  New->maskSelf ) 
18a30 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
18a40 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76 65  if( termCanDrive
18a50 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53 72  Index(pTerm, pSr
18a60 63 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  c, 0) ){.       
18a70 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
18a80 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  Eq = 1;.        
18a90 70 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b  pNew->nSkip = 0;
18aa0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  .        pNew->u
18ab0 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20 3d 20  .btree.pIndex = 
18ac0 30 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  0;.        pNew-
18ad0 3e 6e 4c 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  >nLTerm = 1;.   
18ae0 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72       pNew->aLTer
18af0 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m[0] = pTerm;.  
18b00 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a        /* TUNING:
18b10 20 4f 6e 65 2d 74 69 6d 65 20 63 6f 73 74 20 66   One-time cost f
18b20 6f 72 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 65  or computing the
18b30 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
18b40 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 65   is.        ** e
18b50 73 74 69 6d 61 74 65 64 20 74 6f 20 62 65 20 58  stimated to be X
18b60 2a 4e 2a 6c 6f 67 32 28 4e 29 20 77 68 65 72 65  *N*log2(N) where
18b70 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
18b80 20 6f 66 20 72 6f 77 73 20 69 6e 0a 20 20 20 20   of rows in.    
18b90 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65      ** the table
18ba0 20 62 65 69 6e 67 20 69 6e 64 65 78 65 64 20 61   being indexed a
18bb0 6e 64 20 77 68 65 72 65 20 58 20 69 73 20 37 20  nd where X is 7 
18bc0 28 4c 6f 67 45 73 74 3d 32 38 29 20 66 6f 72 20  (LogEst=28) for 
18bd0 6e 6f 72 6d 61 6c 0a 20 20 20 20 20 20 20 20 2a  normal.        *
18be0 2a 20 74 61 62 6c 65 73 20 6f 72 20 31 2e 33 37  * tables or 1.37
18bf0 35 20 28 4c 6f 67 45 73 74 3d 34 29 20 66 6f 72  5 (LogEst=4) for
18c00 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75   views and subqu
18c10 65 72 69 65 73 2e 20 20 54 68 65 20 76 61 6c 75  eries.  The valu
18c20 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  e.        ** of 
18c30 58 20 69 73 20 73 6d 61 6c 6c 65 72 20 66 6f 72  X is smaller for
18c40 20 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75   views and subqu
18c50 65 72 69 65 73 20 73 6f 20 74 68 61 74 20 74 68  eries so that th
18c60 65 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 0a  e query planner.
18c70 20 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20          ** will 
18c80 62 65 20 6d 6f 72 65 20 61 67 67 72 65 73 73 69  be more aggressi
18c90 76 65 20 61 62 6f 75 74 20 67 65 6e 65 72 61 74  ve about generat
18ca0 69 6e 67 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  ing automatic in
18cb0 64 65 78 65 73 20 66 6f 72 0a 20 20 20 20 20 20  dexes for.      
18cc0 20 20 2a 2a 20 74 68 6f 73 65 20 6f 62 6a 65 63    ** those objec
18cd0 74 73 2c 20 73 69 6e 63 65 20 74 68 65 72 65 20  ts, since there 
18ce0 69 73 20 6e 6f 20 6f 70 70 6f 72 74 75 6e 69 74  is no opportunit
18cf0 79 20 74 6f 20 61 64 64 20 73 63 68 65 6d 61 0a  y to add schema.
18d00 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78          ** index
18d10 65 73 20 6f 6e 20 73 75 62 71 75 65 72 69 65 73  es on subqueries
18d20 20 61 6e 64 20 76 69 65 77 73 2e 20 2a 2f 0a 20   and views. */. 
18d30 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65         pNew->rSe
18d40 74 75 70 20 3d 20 72 4c 6f 67 53 69 7a 65 20 2b  tup = rLogSize +
18d50 20 72 53 69 7a 65 20 2b 20 34 3b 0a 20 20 20 20   rSize + 4;.    
18d60 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
18d70 65 6c 65 63 74 3d 3d 30 20 26 26 20 28 70 54 61  elect==0 && (pTa
18d80 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
18d90 5f 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 20 29  _Ephemeral)==0 )
18da0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  {.          pNew
18db0 2d 3e 72 53 65 74 75 70 20 2b 3d 20 32 34 3b 0a  ->rSetup += 24;.
18dc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18dd0 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69    ApplyCostMulti
18de0 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 53 65 74  plier(pNew->rSet
18df0 75 70 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75  up, pTab->costMu
18e00 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  lt);.        if(
18e10 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 3c 30 20   pNew->rSetup<0 
18e20 29 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d  ) pNew->rSetup =
18e30 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   0;.        /* T
18e40 55 4e 49 4e 47 3a 20 45 61 63 68 20 69 6e 64 65  UNING: Each inde
18e50 78 20 6c 6f 6f 6b 75 70 20 79 69 65 6c 64 73 20  x lookup yields 
18e60 32 30 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  20 rows in the t
18e70 61 62 6c 65 2e 20 20 54 68 69 73 0a 20 20 20 20  able.  This.    
18e80 20 20 20 20 2a 2a 20 69 73 20 6d 6f 72 65 20 74      ** is more t
18e90 68 61 6e 20 74 68 65 20 75 73 75 61 6c 20 67 75  han the usual gu
18ea0 65 73 73 20 6f 66 20 31 30 20 72 6f 77 73 2c 20  ess of 10 rows, 
18eb0 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6e 6f  since we have no
18ec0 20 77 61 79 0a 20 20 20 20 20 20 20 20 2a 2a 20   way.        ** 
18ed0 6f 66 20 6b 6e 6f 77 69 6e 67 20 68 6f 77 20 73  of knowing how s
18ee0 65 6c 65 63 74 69 76 65 20 74 68 65 20 69 6e 64  elective the ind
18ef0 65 78 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65  ex will ultimate
18f00 6c 79 20 62 65 2e 20 20 49 74 20 77 6f 75 6c 64  ly be.  It would
18f10 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20  .        ** not 
18f20 62 65 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20  be unreasonable 
18f30 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 76 61 6c  to make this val
18f40 75 65 20 6d 75 63 68 20 6c 61 72 67 65 72 2e 20  ue much larger. 
18f50 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
18f60 3e 6e 4f 75 74 20 3d 20 34 33 3b 20 20 61 73 73  >nOut = 43;  ass
18f70 65 72 74 28 20 34 33 3d 3d 73 71 6c 69 74 65 33  ert( 43==sqlite3
18f80 4c 6f 67 45 73 74 28 32 30 29 20 29 3b 0a 20 20  LogEst(20) );.  
18f90 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
18fa0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
18fb0 41 64 64 28 72 4c 6f 67 53 69 7a 65 2c 70 4e 65  Add(rLogSize,pNe
18fc0 77 2d 3e 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  w->nOut);.      
18fd0 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20    pNew->wsFlags 
18fe0 3d 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  = WHERE_AUTO_IND
18ff0 45 58 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  EX;.        pNew
19000 2d 3e 70 72 65 72 65 71 20 3d 20 6d 50 72 65 72  ->prereq = mPrer
19010 65 71 20 7c 20 70 54 65 72 6d 2d 3e 70 72 65 72  eq | pTerm->prer
19020 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20  eqRight;.       
19030 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
19040 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
19050 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pNew);.      }. 
19060 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
19070 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  /* SQLITE_OMIT_A
19080 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a  UTOMATIC_INDEX *
19090 2f 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65  /..  /* Loop ove
190a0 72 20 61 6c 6c 20 69 6e 64 69 63 65 73 0a 20 20  r all indices.  
190b0 2a 2f 0a 20 20 66 6f 72 28 3b 20 72 63 3d 3d 53  */.  for(; rc==S
190c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 72 6f  QLITE_OK && pPro
190d0 62 65 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f 62  be; pProbe=pProb
190e0 65 2d 3e 70 4e 65 78 74 2c 20 69 53 6f 72 74 49  e->pNext, iSortI
190f0 64 78 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  dx++){.    if( p
19100 50 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57  Probe->pPartIdxW
19110 68 65 72 65 21 3d 30 0a 20 20 20 20 20 26 26 20  here!=0.     && 
19120 21 77 68 65 72 65 55 73 61 62 6c 65 50 61 72 74  !whereUsablePart
19130 69 61 6c 49 6e 64 65 78 28 70 53 72 63 2d 3e 69  ialIndex(pSrc->i
19140 43 75 72 73 6f 72 2c 20 70 57 43 2c 20 70 50 72  Cursor, pWC, pPr
19150 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68 65  obe->pPartIdxWhe
19160 72 65 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73  re) ){.      tes
19170 74 63 61 73 65 28 20 70 4e 65 77 2d 3e 69 54 61  tcase( pNew->iTa
19180 62 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  b!=pSrc->iCursor
19190 20 29 3b 20 20 2f 2a 20 53 65 65 20 74 69 63 6b   );  /* See tick
191a0 65 74 20 5b 39 38 64 39 37 33 62 38 66 35 5d 20  et [98d973b8f5] 
191b0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  */.      continu
191c0 65 3b 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 69  e;  /* Partial i
191d0 6e 64 65 78 20 69 6e 61 70 70 72 6f 70 72 69 61  ndex inappropria
191e0 74 65 20 66 6f 72 20 74 68 69 73 20 71 75 65 72  te for this quer
191f0 79 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 72  y */.    }.    r
19200 53 69 7a 65 20 3d 20 70 50 72 6f 62 65 2d 3e 61  Size = pProbe->a
19210 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 3b 0a 20  iRowLogEst[0];. 
19220 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
19230 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 70 4e  .nEq = 0;.    pN
19240 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74 6d  ew->u.btree.nBtm
19250 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
19260 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 30  u.btree.nTop = 0
19270 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69  ;.    pNew->nSki
19280 70 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  p = 0;.    pNew-
19290 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20  >nLTerm = 0;.   
192a0 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78 20   pNew->iSortIdx 
192b0 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 72  = 0;.    pNew->r
192c0 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20 20 70  Setup = 0;.    p
192d0 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 6d 50  New->prereq = mP
192e0 72 65 72 65 71 3b 0a 20 20 20 20 70 4e 65 77 2d  rereq;.    pNew-
192f0 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20  >nOut = rSize;. 
19300 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
19310 2e 70 49 6e 64 65 78 20 3d 20 70 50 72 6f 62 65  .pIndex = pProbe
19320 3b 0a 20 20 20 20 62 20 3d 20 69 6e 64 65 78 4d  ;.    b = indexM
19330 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65  ightHelpWithOrde
19340 72 42 79 28 70 42 75 69 6c 64 65 72 2c 20 70 50  rBy(pBuilder, pP
19350 72 6f 62 65 2c 20 70 53 72 63 2d 3e 69 43 75 72  robe, pSrc->iCur
19360 73 6f 72 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65  sor);.    /* The
19370 20 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44   ONEPASS_DESIRED
19380 20 66 6c 61 67 73 20 6e 65 76 65 72 20 6f 63 63   flags never occ
19390 75 72 73 20 74 6f 67 65 74 68 65 72 20 77 69 74  urs together wit
193a0 68 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 20 20  h ORDER BY */.  
193b0 20 20 61 73 73 65 72 74 28 20 28 70 57 49 6e 66    assert( (pWInf
193c0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
193d0 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
193e0 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 62 3d 3d  SIRED)==0 || b==
193f0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 72  0 );.    if( pPr
19400 6f 62 65 2d 3e 74 6e 75 6d 3c 3d 30 20 29 7b 0a  obe->tnum<=0 ){.
19410 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
19420 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
19430 65 78 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77  ex */.      pNew
19440 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52  ->wsFlags = WHER
19450 45 5f 49 50 4b 3b 0a 0a 20 20 20 20 20 20 2f 2a  E_IPK;..      /*
19460 20 46 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   Full table scan
19470 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   */.      pNew->
19480 69 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69  iSortIdx = b ? i
19490 53 6f 72 74 49 64 78 20 3a 20 30 3b 0a 20 20 20  SortIdx : 0;.   
194a0 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43 6f     /* TUNING: Co
194b0 73 74 20 6f 66 20 66 75 6c 6c 20 74 61 62 6c 65  st of full table
194c0 20 73 63 61 6e 20 69 73 20 28 4e 2a 33 2e 30 29   scan is (N*3.0)
194d0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65 77 2d  . */.      pNew-
194e0 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20  >rRun = rSize + 
194f0 31 36 3b 0a 20 20 20 20 20 20 41 70 70 6c 79 43  16;.      ApplyC
19500 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e  ostMultiplier(pN
19510 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62 2d 3e  ew->rRun, pTab->
19520 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20 20 20  costMult);.     
19530 20 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74   whereLoopOutput
19540 41 64 6a 75 73 74 28 70 57 43 2c 20 70 4e 65 77  Adjust(pWC, pNew
19550 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  , rSize);.      
19560 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49 6e  rc = whereLoopIn
19570 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20 70  sert(pBuilder, p
19580 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  New);.      pNew
19590 2d 3e 6e 4f 75 74 20 3d 20 72 53 69 7a 65 3b 0a  ->nOut = rSize;.
195a0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62        if( rc ) b
195b0 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  reak;.    }else{
195c0 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
195d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 6f  ;.      if( pPro
195e0 62 65 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 29  be->isCovering )
195f0 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
19600 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  wsFlags = WHERE_
19610 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 48 45 52 45  IDX_ONLY | WHERE
19620 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20 20 20  _INDEXED;.      
19630 20 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d    m = 0;.      }
19640 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 20  else{.        m 
19650 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20  = pSrc->colUsed 
19660 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65  & ~columnsInInde
19670 78 28 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20  x(pProbe);.     
19680 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
19690 20 3d 20 28 6d 3d 3d 30 29 20 3f 20 28 57 48 45   = (m==0) ? (WHE
196a0 52 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52  RE_IDX_ONLY|WHER
196b0 45 5f 49 4e 44 45 58 45 44 29 20 3a 20 57 48 45  E_INDEXED) : WHE
196c0 52 45 5f 49 4e 44 45 58 45 44 3b 0a 20 20 20 20  RE_INDEXED;.    
196d0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 75    }..      /* Fu
196e0 6c 6c 20 73 63 61 6e 20 76 69 61 20 69 6e 64 65  ll scan via inde
196f0 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62  x */.      if( b
19700 0a 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73 52  .       || !HasR
19710 6f 77 69 64 28 70 54 61 62 29 0a 20 20 20 20 20  owid(pTab).     
19720 20 20 7c 7c 20 70 50 72 6f 62 65 2d 3e 70 50 61    || pProbe->pPa
19730 72 74 49 64 78 57 68 65 72 65 21 3d 30 0a 20 20  rtIdxWhere!=0.  
19740 20 20 20 20 20 7c 7c 20 28 20 6d 3d 3d 30 0a 20       || ( m==0. 
19750 20 20 20 20 20 20 20 20 26 26 20 70 50 72 6f 62          && pProb
19760 65 2d 3e 62 55 6e 6f 72 64 65 72 65 64 3d 3d 30  e->bUnordered==0
19770 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50  .         && (pP
19780 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 3c 70  robe->szIdxRow<p
19790 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 29 0a 20  Tab->szTabRow). 
197a0 20 20 20 20 20 20 20 20 26 26 20 28 70 57 49 6e          && (pWIn
197b0 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26  fo->wctrlFlags &
197c0 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44   WHERE_ONEPASS_D
197d0 45 53 49 52 45 44 29 3d 3d 30 0a 20 20 20 20 20  ESIRED)==0.     
197e0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 47 6c      && sqlite3Gl
197f0 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43  obalConfig.bUseC
19800 69 73 0a 20 20 20 20 20 20 20 20 20 26 26 20 4f  is.         && O
19810 70 74 69 6d 69 7a 61 74 69 6f 6e 45 6e 61 62 6c  ptimizationEnabl
19820 65 64 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73  ed(pWInfo->pPars
19830 65 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 43 6f  e->db, SQLITE_Co
19840 76 65 72 49 64 78 53 63 61 6e 29 0a 20 20 20 20  verIdxScan).    
19850 20 20 20 20 20 20 29 0a 20 20 20 20 20 20 29 7b        ).      ){
19860 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69  .        pNew->i
19870 53 6f 72 74 49 64 78 20 3d 20 62 20 3f 20 69 53  SortIdx = b ? iS
19880 6f 72 74 49 64 78 20 3a 20 30 3b 0a 0a 20 20 20  ortIdx : 0;..   
19890 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74       /* The cost
198a0 20 6f 66 20 76 69 73 69 74 69 6e 67 20 74 68 65   of visiting the
198b0 20 69 6e 64 65 78 20 72 6f 77 73 20 69 73 20 4e   index rows is N
198c0 2a 4b 2c 20 77 68 65 72 65 20 4b 20 69 73 0a 20  *K, where K is. 
198d0 20 20 20 20 20 20 20 2a 2a 20 62 65 74 77 65 65         ** betwee
198e0 6e 20 31 2e 31 20 61 6e 64 20 33 2e 30 2c 20 64  n 1.1 and 3.0, d
198f0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
19900 72 65 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f  relative sizes o
19910 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
19920 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65   index and table
19930 20 72 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20   rows. */.      
19940 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 72    pNew->rRun = r
19950 53 69 7a 65 20 2b 20 31 20 2b 20 28 31 35 2a 70  Size + 1 + (15*p
19960 50 72 6f 62 65 2d 3e 73 7a 49 64 78 52 6f 77 29  Probe->szIdxRow)
19970 2f 70 54 61 62 2d 3e 73 7a 54 61 62 52 6f 77 3b  /pTab->szTabRow;
19980 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 21 3d  .        if( m!=
19990 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
199a0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 6e  * If this is a n
199b0 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69 6e 64 65  on-covering inde
199c0 78 20 73 63 61 6e 2c 20 61 64 64 20 69 6e 20 74  x scan, add in t
199d0 68 65 20 63 6f 73 74 20 6f 66 0a 20 20 20 20 20  he cost of.     
199e0 20 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 61       ** doing ta
199f0 62 6c 65 20 6c 6f 6f 6b 75 70 73 2e 20 20 54 68  ble lookups.  Th
19a00 65 20 63 6f 73 74 20 77 69 6c 6c 20 62 65 20 33  e cost will be 3
19a10 78 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  x the number of.
19a20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 6f            ** loo
19a30 6b 75 70 73 2e 20 20 54 61 6b 65 20 69 6e 74 6f  kups.  Take into
19a40 20 61 63 63 6f 75 6e 74 20 57 48 45 52 45 20 63   account WHERE c
19a50 6c 61 75 73 65 20 74 65 72 6d 73 20 74 68 61 74  lause terms that
19a60 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 20 20   can be.        
19a70 20 20 2a 2a 20 73 61 74 69 73 66 69 65 64 20 75    ** satisfied u
19a80 73 69 6e 67 20 6a 75 73 74 20 74 68 65 20 69 6e  sing just the in
19a90 64 65 78 2c 20 61 6e 64 20 74 68 61 74 20 64 6f  dex, and that do
19aa0 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 20   not require a. 
19ab0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c           ** tabl
19ac0 65 20 6c 6f 6f 6b 75 70 2e 20 2a 2f 0a 20 20 20  e lookup. */.   
19ad0 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 6e 4c         LogEst nL
19ae0 6f 6f 6b 75 70 20 3d 20 72 53 69 7a 65 20 2b 20  ookup = rSize + 
19af0 31 36 3b 20 20 2f 2a 20 42 61 73 65 20 63 6f 73  16;  /* Base cos
19b00 74 3a 20 20 4e 2a 33 20 2a 2f 0a 20 20 20 20 20  t:  N*3 */.     
19b10 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
19b20 20 20 20 20 20 20 20 69 6e 74 20 69 43 75 72 20         int iCur 
19b30 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b  = pSrc->iCursor;
19b40 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65  .          Where
19b50 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 26 70  Clause *pWC = &p
19b60 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 20 20  WInfo->sWC;.    
19b70 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
19b80 69 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69  ii<pWC->nTerm; i
19b90 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
19ba0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
19bb0 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 69 5d  rm = &pWC->a[ii]
19bc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
19bd0 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f  ( !sqlite3ExprCo
19be0 76 65 72 65 64 42 79 49 6e 64 65 78 28 70 54 65  veredByIndex(pTe
19bf0 72 6d 2d 3e 70 45 78 70 72 2c 20 69 43 75 72 2c  rm->pExpr, iCur,
19c00 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20 20 20   pProbe) ){.    
19c10 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
19c20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
19c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 54             /* pT
19c40 65 72 6d 20 63 61 6e 20 62 65 20 65 76 61 6c 75  erm can be evalu
19c50 61 74 65 64 20 75 73 69 6e 67 20 6a 75 73 74 20  ated using just 
19c60 74 68 65 20 69 6e 64 65 78 2e 20 20 53 6f 20 72  the index.  So r
19c70 65 64 75 63 65 0a 20 20 20 20 20 20 20 20 20 20  educe.          
19c80 20 20 2a 2a 20 74 68 65 20 65 78 70 65 63 74 65    ** the expecte
19c90 64 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c  d number of tabl
19ca0 65 20 6c 6f 6f 6b 75 70 73 20 61 63 63 6f 72 64  e lookups accord
19cb0 69 6e 67 6c 79 20 2a 2f 0a 20 20 20 20 20 20 20  ingly */.       
19cc0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
19cd0 74 72 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a  truthProb<=0 ){.
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c                nL
19cf0 6f 6f 6b 75 70 20 2b 3d 20 70 54 65 72 6d 2d 3e  ookup += pTerm->
19d00 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20  truthProb;.     
19d10 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
19d20 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f              nLoo
19d30 6b 75 70 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  kup--;.         
19d40 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
19d50 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
19d60 45 51 7c 57 4f 5f 49 53 29 20 29 20 6e 4c 6f 6f  EQ|WO_IS) ) nLoo
19d70 6b 75 70 20 2d 3d 20 31 39 3b 0a 20 20 20 20 20  kup -= 19;.     
19d80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
19d90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 0a     }.          .
19da0 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
19db0 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rRun = sqlite3Lo
19dc0 67 45 73 74 41 64 64 28 70 4e 65 77 2d 3e 72 52  gEstAdd(pNew->rR
19dd0 75 6e 2c 20 6e 4c 6f 6f 6b 75 70 29 3b 0a 20 20  un, nLookup);.  
19de0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
19df0 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74 69 70 6c  ApplyCostMultipl
19e00 69 65 72 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20  ier(pNew->rRun, 
19e10 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b  pTab->costMult);
19e20 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f  .        whereLo
19e30 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28 70  opOutputAdjust(p
19e40 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65 29  WC, pNew, rSize)
19e50 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
19e60 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
19e70 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
19e80 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f          pNew->nO
19e90 75 74 20 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20  ut = rSize;.    
19ea0 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
19eb0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
19ec0 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72  }..    rc = wher
19ed0 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64  eLoopAddBtreeInd
19ee0 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70 53 72  ex(pBuilder, pSr
19ef0 63 2c 20 70 50 72 6f 62 65 2c 20 30 29 3b 0a 23  c, pProbe, 0);.#
19f00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
19f10 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41  BLE_STAT3_OR_STA
19f20 54 34 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74  T4.    sqlite3St
19f30 61 74 34 50 72 6f 62 65 46 72 65 65 28 70 42 75  at4ProbeFree(pBu
19f40 69 6c 64 65 72 2d 3e 70 52 65 63 29 3b 0a 20 20  ilder->pRec);.  
19f50 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63    pBuilder->nRec
19f60 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 70  Valid = 0;.    p
19f70 42 75 69 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20  Builder->pRec = 
19f80 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  0;.#endif..    /
19f90 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61  * If there was a
19fa0 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
19fb0 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74  use, then only t
19fc0 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69 73  hat one index is
19fd0 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72  .    ** consider
19fe0 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
19ff0 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 20 29 20  Src->pIBIndex ) 
1a000 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
1a010 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
1a020 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1a030 49 52 54 55 41 4c 54 41 42 4c 45 0a 0a 2f 2a 0a  IRTUALTABLE../*.
1a040 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 64 78  ** Argument pIdx
1a050 49 6e 66 6f 20 69 73 20 61 6c 72 65 61 64 79 20  Info is already 
1a060 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61  populated with a
1a070 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  ll constraints t
1a080 68 61 74 20 6d 61 79 0a 2a 2a 20 62 65 20 75 73  hat may.** be us
1a090 65 64 20 62 79 20 74 68 65 20 76 69 72 74 75 61  ed by the virtua
1a0a0 6c 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69  l table identifi
1a0b0 65 64 20 62 79 20 70 42 75 69 6c 64 65 72 2d 3e  ed by pBuilder->
1a0c0 70 4e 65 77 2d 3e 69 54 61 62 2e 20 54 68 69 73  pNew->iTab. This
1a0d0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6d 61 72  .** function mar
1a0e0 6b 73 20 61 20 73 75 62 73 65 74 20 6f 66 20 74  ks a subset of t
1a0f0 68 6f 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73  hose constraints
1a100 20 75 73 61 62 6c 65 2c 20 69 6e 76 6f 6b 65 73   usable, invokes
1a110 20 74 68 65 0a 2a 2a 20 78 42 65 73 74 49 6e 64   the.** xBestInd
1a120 65 78 20 6d 65 74 68 6f 64 20 61 6e 64 20 61 64  ex method and ad
1a130 64 73 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ds the returned 
1a140 70 6c 61 6e 20 74 6f 20 70 42 75 69 6c 64 65 72  plan to pBuilder
1a150 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 6f 6e 73 74 72  ..**.** A constr
1a160 61 69 6e 74 20 69 73 20 6d 61 72 6b 65 64 20 75  aint is marked u
1a170 73 61 62 6c 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20  sable if:.**.** 
1a180 20 20 2a 20 41 72 67 75 6d 65 6e 74 20 6d 55 73    * Argument mUs
1a190 61 62 6c 65 20 69 6e 64 69 63 61 74 65 73 20 74  able indicates t
1a1a0 68 61 74 20 69 74 73 20 70 72 65 72 65 71 75 69  hat its prerequi
1a1b0 73 69 74 65 73 20 61 72 65 20 61 76 61 69 6c 61  sites are availa
1a1c0 62 6c 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20  ble, and.**.**  
1a1d0 20 2a 20 49 74 20 69 73 20 6e 6f 74 20 6f 6e 65   * It is not one
1a1e0 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
1a1f0 73 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  s specified in t
1a200 68 65 20 6d 45 78 63 6c 75 64 65 20 6d 61 73 6b  he mExclude mask
1a210 20 70 61 73 73 65 64 0a 2a 2a 20 20 20 20 20 61   passed.**     a
1a220 73 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67  s the fourth arg
1a230 75 6d 65 6e 74 20 28 77 68 69 63 68 20 69 6e 20  ument (which in 
1a240 70 72 61 63 74 69 63 65 20 69 73 20 65 69 74 68  practice is eith
1a250 65 72 20 57 4f 5f 49 4e 20 6f 72 20 30 29 2e 0a  er WO_IN or 0)..
1a260 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 6d  **.** Argument m
1a270 50 72 65 72 65 71 20 69 73 20 61 20 6d 61 73 6b  Prereq is a mask
1a280 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
1a290 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20  must be scanned 
1a2a0 62 65 66 6f 72 65 20 74 68 65 0a 2a 2a 20 76 69  before the.** vi
1a2b0 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 20 71  rtual table in q
1a2c0 75 65 73 74 69 6f 6e 2e 20 54 68 65 73 65 20 61  uestion. These a
1a2d0 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  re added to the 
1a2e0 70 6c 61 6e 73 20 70 72 65 72 65 71 75 69 73 69  plans prerequisi
1a2f0 74 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 69 74  tes.** before it
1a300 20 69 73 20 61 64 64 65 64 20 74 6f 20 70 42 75   is added to pBu
1a310 69 6c 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74  ilder..**.** Out
1a320 70 75 74 20 70 61 72 61 6d 65 74 65 72 20 2a 70  put parameter *p
1a330 62 49 6e 20 69 73 20 73 65 74 20 74 6f 20 74 72  bIn is set to tr
1a340 75 65 20 69 66 20 74 68 65 20 70 6c 61 6e 20 61  ue if the plan a
1a350 64 64 65 64 20 74 6f 20 70 42 75 69 6c 64 65 72  dded to pBuilder
1a360 0a 2a 2a 20 75 73 65 73 20 6f 6e 65 20 6f 72 20  .** uses one or 
1a370 6d 6f 72 65 20 57 4f 5f 49 4e 20 74 65 72 6d 73  more WO_IN terms
1a380 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
1a390 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
1a3a0 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  int whereLoopAdd
1a3b0 56 69 72 74 75 61 6c 4f 6e 65 28 0a 20 20 57 68  VirtualOne(.  Wh
1a3c0 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a  ereLoopBuilder *
1a3d0 70 42 75 69 6c 64 65 72 2c 0a 20 20 42 69 74 6d  pBuilder,.  Bitm
1a3e0 61 73 6b 20 6d 50 72 65 72 65 71 2c 20 20 20 20  ask mPrereq,    
1a3f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1a400 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 74 68  ask of tables th
1a410 61 74 20 6d 75 73 74 20 62 65 20 75 73 65 64 2e  at must be used.
1a420 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55   */.  Bitmask mU
1a430 73 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  sable,          
1a440 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
1a450 20 75 73 61 62 6c 65 20 74 61 62 6c 65 73 20 2a   usable tables *
1a460 2f 0a 20 20 75 31 36 20 6d 45 78 63 6c 75 64 65  /.  u16 mExclude
1a470 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a480 20 20 20 20 2f 2a 20 45 78 63 6c 75 64 65 20 74      /* Exclude t
1a490 65 72 6d 73 20 75 73 69 6e 67 20 74 68 65 73 65  erms using these
1a4a0 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   operators */.  
1a4b0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
1a4c0 66 6f 20 2a 70 49 64 78 49 6e 66 6f 2c 20 20 20  fo *pIdxInfo,   
1a4d0 2f 2a 20 50 6f 70 75 6c 61 74 65 64 20 6f 62 6a  /* Populated obj
1a4e0 65 63 74 20 66 6f 72 20 78 42 65 73 74 49 6e 64  ect for xBestInd
1a4f0 65 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 49  ex */.  int *pbI
1a500 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n               
1a510 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1a520 54 72 75 65 20 69 66 20 70 6c 61 6e 20 75 73 65  True if plan use
1a530 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20 6f 70 20  s an IN(...) op 
1a540 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 43 6c 61  */.){.  WhereCla
1a550 75 73 65 20 2a 70 57 43 20 3d 20 70 42 75 69 6c  use *pWC = pBuil
1a560 64 65 72 2d 3e 70 57 43 3b 0a 20 20 73 74 72 75  der->pWC;.  stru
1a570 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
1a580 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64  _constraint *pId
1a590 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20  xCons;.  struct 
1a5a0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
1a5b0 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a  nstraint_usage *
1a5c0 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66  pUsage = pIdxInf
1a5d0 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
1a5e0 61 67 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  age;.  int i;.  
1a5f0 69 6e 74 20 6d 78 54 65 72 6d 3b 0a 20 20 69 6e  int mxTerm;.  in
1a600 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1a610 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  ;.  WhereLoop *p
1a620 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
1a630 70 4e 65 77 3b 0a 20 20 50 61 72 73 65 20 2a 70  pNew;.  Parse *p
1a640 50 61 72 73 65 20 3d 20 70 42 75 69 6c 64 65 72  Parse = pBuilder
1a650 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  ->pWInfo->pParse
1a660 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  ;.  struct SrcLi
1a670 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 20 3d 20  st_item *pSrc = 
1a680 26 70 42 75 69 6c 64 65 72 2d 3e 70 57 49 6e 66  &pBuilder->pWInf
1a690 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
1a6a0 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20 20 69 6e  New->iTab];.  in
1a6b0 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  t nConstraint = 
1a6c0 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74  pIdxInfo->nConst
1a6d0 72 61 69 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74  raint;..  assert
1a6e0 28 20 28 6d 55 73 61 62 6c 65 20 26 20 6d 50 72  ( (mUsable & mPr
1a6f0 65 72 65 71 29 3d 3d 6d 50 72 65 72 65 71 20 29  ereq)==mPrereq )
1a700 3b 0a 20 20 2a 70 62 49 6e 20 3d 20 30 3b 0a 20  ;.  *pbIn = 0;. 
1a710 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20   pNew->prereq = 
1a720 6d 50 72 65 72 65 71 3b 0a 0a 20 20 2f 2a 20 53  mPrereq;..  /* S
1a730 65 74 20 74 68 65 20 75 73 61 62 6c 65 20 66 6c  et the usable fl
1a740 61 67 20 6f 6e 20 74 68 65 20 73 75 62 73 65 74  ag on the subset
1a750 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   of constraints 
1a760 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 0a 20  identified by . 
1a770 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 6d 55   ** arguments mU
1a780 73 61 62 6c 65 20 61 6e 64 20 6d 45 78 63 6c 75  sable and mExclu
1a790 64 65 2e 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e  de. */.  pIdxCon
1a7a0 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c  s = *(struct sql
1a7b0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
1a7c0 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
1a7d0 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->aConstraint;.
1a7e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
1a7f0 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
1a800 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20  IdxCons++){.    
1a810 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
1a820 20 3d 20 26 70 57 43 2d 3e 61 5b 70 49 64 78 43   = &pWC->a[pIdxC
1a830 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74  ons->iTermOffset
1a840 5d 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 2d  ];.    pIdxCons-
1a850 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  >usable = 0;.   
1a860 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
1a870 72 65 71 52 69 67 68 74 20 26 20 6d 55 73 61 62  reqRight & mUsab
1a880 6c 65 29 3d 3d 70 54 65 72 6d 2d 3e 70 72 65 72  le)==pTerm->prer
1a890 65 71 52 69 67 68 74 20 0a 20 20 20 20 20 26 26  eqRight .     &&
1a8a0 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74   (pTerm->eOperat
1a8b0 6f 72 20 26 20 6d 45 78 63 6c 75 64 65 29 3d 3d  or & mExclude)==
1a8c0 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70  0.    ){.      p
1a8d0 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
1a8e0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
1a8f0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
1a900 74 68 65 20 6f 75 74 70 75 74 20 66 69 65 6c 64  the output field
1a910 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  s of the sqlite3
1a920 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
1a930 63 74 75 72 65 20 2a 2f 0a 20 20 6d 65 6d 73 65  cture */.  memse
1a940 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a  t(pUsage, 0, siz
1a950 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 6e  eof(pUsage[0])*n
1a960 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 61  Constraint);.  a
1a970 73 73 65 72 74 28 20 70 49 64 78 49 6e 66 6f 2d  ssert( pIdxInfo-
1a980 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74  >needToFreeIdxSt
1a990 72 3d 3d 30 20 29 3b 0a 20 20 70 49 64 78 49 6e  r==0 );.  pIdxIn
1a9a0 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a  fo->idxStr = 0;.
1a9b0 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e    pIdxInfo->idxN
1a9c0 75 6d 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e  um = 0;.  pIdxIn
1a9d0 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
1a9e0 6d 65 64 20 3d 20 30 3b 0a 20 20 70 49 64 78 49  med = 0;.  pIdxI
1a9f0 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
1aa00 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f  st = SQLITE_BIG_
1aa10 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65 29 32 3b  DBL / (double)2;
1aa20 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  .  pIdxInfo->est
1aa30 69 6d 61 74 65 64 52 6f 77 73 20 3d 20 32 35 3b  imatedRows = 25;
1aa40 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  .  pIdxInfo->idx
1aa50 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 49 64  Flags = 0;.  pId
1aa60 78 49 6e 66 6f 2d 3e 63 6f 6c 55 73 65 64 20 3d  xInfo->colUsed =
1aa70 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
1aa80 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 0a  pSrc->colUsed;..
1aa90 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20    /* Invoke the 
1aaa0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 78 42  virtual table xB
1aab0 65 73 74 49 6e 64 65 78 28 29 20 6d 65 74 68 6f  estIndex() metho
1aac0 64 20 2a 2f 0a 20 20 72 63 20 3d 20 76 74 61 62  d */.  rc = vtab
1aad0 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65  BestIndex(pParse
1aae0 2c 20 70 53 72 63 2d 3e 70 54 61 62 2c 20 70 49  , pSrc->pTab, pI
1aaf0 64 78 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20 72  dxInfo);.  if( r
1ab00 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
1ab10 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31 3b 0a 20    mxTerm = -1;. 
1ab20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e   assert( pNew->n
1ab30 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74 72 61 69  LSlot>=nConstrai
1ab40 6e 74 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt );.  for(i=0;
1ab50 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20   i<nConstraint; 
1ab60 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c 54 65 72  i++) pNew->aLTer
1ab70 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 70 4e 65 77  m[i] = 0;.  pNew
1ab80 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d 61 73  ->u.vtab.omitMas
1ab90 6b 20 3d 20 30 3b 0a 20 20 70 49 64 78 43 6f 6e  k = 0;.  pIdxCon
1aba0 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c  s = *(struct sql
1abb0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
1abc0 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66  raint**)&pIdxInf
1abd0 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  o->aConstraint;.
1abe0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
1abf0 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
1ac00 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20  IdxCons++){.    
1ac10 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20 20 20 69  int iTerm;.    i
1ac20 66 28 20 28 69 54 65 72 6d 20 3d 20 70 55 73 61  f( (iTerm = pUsa
1ac30 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 20  ge[i].argvIndex 
1ac40 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20  - 1)>=0 ){.     
1ac50 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1ac60 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d  m;.      int j =
1ac70 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d   pIdxCons->iTerm
1ac80 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 69 66  Offset;.      if
1ac90 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e 73 74 72  ( iTerm>=nConstr
1aca0 61 69 6e 74 0a 20 20 20 20 20 20 20 7c 7c 20 6a  aint.       || j
1acb0 3c 30 0a 20 20 20 20 20 20 20 7c 7c 20 6a 3e 3d  <0.       || j>=
1acc0 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20 20 20 20  pWC->nTerm.     
1acd0 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c 54 65 72    || pNew->aLTer
1ace0 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20 20 20 20  m[iTerm]!=0.    
1acf0 20 20 20 7c 7c 20 70 49 64 78 43 6f 6e 73 2d 3e     || pIdxCons->
1ad00 75 73 61 62 6c 65 3d 3d 30 0a 20 20 20 20 20 20  usable==0.      
1ad10 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1ad20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1ad30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1ad40 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25 73  orMsg(pParse,"%s
1ad50 2e 78 42 65 73 74 49 6e 64 65 78 20 6d 61 6c 66  .xBestIndex malf
1ad60 75 6e 63 74 69 6f 6e 22 2c 70 53 72 63 2d 3e 70  unction",pSrc->p
1ad70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
1ad80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1ad90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
1ada0 73 74 63 61 73 65 28 20 69 54 65 72 6d 3d 3d 6e  stcase( iTerm==n
1adb0 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20 29 3b 0a  Constraint-1 );.
1adc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1add0 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74 65  j==0 );.      te
1ade0 73 74 63 61 73 65 28 20 6a 3d 3d 70 57 43 2d 3e  stcase( j==pWC->
1adf0 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20 20 20 20  nTerm-1 );.     
1ae00 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
1ae10 5b 6a 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  [j];.      pNew-
1ae20 3e 70 72 65 72 65 71 20 7c 3d 20 70 54 65 72 6d  >prereq |= pTerm
1ae30 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
1ae40 20 20 20 20 20 61 73 73 65 72 74 28 20 69 54 65       assert( iTe
1ae50 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c 6f 74 20  rm<pNew->nLSlot 
1ae60 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  );.      pNew->a
1ae70 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20 3d 20 70  LTerm[iTerm] = p
1ae80 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  Term;.      if( 
1ae90 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20 29 20 6d  iTerm>mxTerm ) m
1aea0 78 54 65 72 6d 20 3d 20 69 54 65 72 6d 3b 0a 20  xTerm = iTerm;. 
1aeb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
1aec0 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20 20 20 20  Term==15 );.    
1aed0 20 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72    testcase( iTer
1aee0 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20 20 20 69  m==16 );.      i
1aef0 66 28 20 69 54 65 72 6d 3c 31 36 20 26 26 20 70  f( iTerm<16 && p
1af00 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 20 29 20  Usage[i].omit ) 
1af10 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69  pNew->u.vtab.omi
1af20 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69 54 65 72  tMask |= 1<<iTer
1af30 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54  m;.      if( (pT
1af40 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
1af50 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b 0a 20 20   WO_IN)!=0 ){.  
1af60 20 20 20 20 20 20 2f 2a 20 41 20 76 69 72 74 75        /* A virtu
1af70 61 6c 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  al table that is
1af80 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20   constrained by 
1af90 61 6e 20 49 4e 20 63 6c 61 75 73 65 20 6d 61 79  an IN clause may
1afa0 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   not.        ** 
1afb0 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f 52 44 45  consume the ORDE
1afc0 52 20 42 59 20 63 6c 61 75 73 65 20 62 65 63 61  R BY clause beca
1afd0 75 73 65 20 28 31 29 20 74 68 65 20 6f 72 64 65  use (1) the orde
1afe0 72 20 6f 66 20 49 4e 20 74 65 72 6d 73 0a 20 20  r of IN terms.  
1aff0 20 20 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20        ** is not 
1b000 6e 65 63 65 73 73 61 72 69 6c 79 20 72 65 6c 61  necessarily rela
1b010 74 65 64 20 74 6f 20 74 68 65 20 6f 72 64 65 72  ted to the order
1b020 20 6f 66 20 6f 75 74 70 75 74 20 74 65 72 6d 73   of output terms
1b030 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
1b040 28 32 29 20 4d 75 6c 74 69 70 6c 65 20 6f 75 74  (2) Multiple out
1b050 70 75 74 73 20 66 72 6f 6d 20 61 20 73 69 6e 67  puts from a sing
1b060 6c 65 20 49 4e 20 76 61 6c 75 65 20 77 69 6c 6c  le IN value will
1b070 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20 20 20 20   not merge.     
1b080 20 20 20 2a 2a 20 74 6f 67 65 74 68 65 72 2e 20     ** together. 
1b090 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 49 64 78   */.        pIdx
1b0a0 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e  Info->orderByCon
1b0b0 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  sumed = 0;.     
1b0c0 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78     pIdxInfo->idx
1b0d0 46 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  Flags &= ~SQLITE
1b0e0 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51  _INDEX_SCAN_UNIQ
1b0f0 55 45 3b 0a 20 20 20 20 20 20 20 20 2a 70 62 49  UE;.        *pbI
1b100 6e 20 3d 20 31 3b 20 61 73 73 65 72 74 28 20 28  n = 1; assert( (
1b110 6d 45 78 63 6c 75 64 65 20 26 20 57 4f 5f 49 4e  mExclude & WO_IN
1b120 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a  )==0 );.      }.
1b130 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 4e 65      }.  }..  pNe
1b140 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6d 78 54 65  w->nLTerm = mxTe
1b150 72 6d 2b 31 3b 0a 20 20 61 73 73 65 72 74 28 20  rm+1;.  assert( 
1b160 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 3c 3d 70 4e  pNew->nLTerm<=pN
1b170 65 77 2d 3e 6e 4c 53 6c 6f 74 20 29 3b 0a 20 20  ew->nLSlot );.  
1b180 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78  pNew->u.vtab.idx
1b190 4e 75 6d 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  Num = pIdxInfo->
1b1a0 69 64 78 4e 75 6d 3b 0a 20 20 70 4e 65 77 2d 3e  idxNum;.  pNew->
1b1b0 75 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20  u.vtab.needFree 
1b1c0 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64  = pIdxInfo->need
1b1d0 54 6f 46 72 65 65 49 64 78 53 74 72 3b 0a 20 20  ToFreeIdxStr;.  
1b1e0 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  pIdxInfo->needTo
1b1f0 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a  FreeIdxStr = 0;.
1b200 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69    pNew->u.vtab.i
1b210 64 78 53 74 72 20 3d 20 70 49 64 78 49 6e 66 6f  dxStr = pIdxInfo
1b220 2d 3e 69 64 78 53 74 72 3b 0a 20 20 70 4e 65 77  ->idxStr;.  pNew
1b230 2d 3e 75 2e 76 74 61 62 2e 69 73 4f 72 64 65 72  ->u.vtab.isOrder
1b240 65 64 20 3d 20 28 69 38 29 28 70 49 64 78 49 6e  ed = (i8)(pIdxIn
1b250 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75  fo->orderByConsu
1b260 6d 65 64 20 3f 0a 20 20 20 20 20 20 70 49 64 78  med ?.      pIdx
1b270 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3a  Info->nOrderBy :
1b280 20 30 29 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65   0);.  pNew->rSe
1b290 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  tup = 0;.  pNew-
1b2a0 3e 72 52 75 6e 20 3d 20 73 71 6c 69 74 65 33 4c  >rRun = sqlite3L
1b2b0 6f 67 45 73 74 46 72 6f 6d 44 6f 75 62 6c 65 28  ogEstFromDouble(
1b2c0 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61  pIdxInfo->estima
1b2d0 74 65 64 43 6f 73 74 29 3b 0a 20 20 70 4e 65 77  tedCost);.  pNew
1b2e0 2d 3e 6e 4f 75 74 20 3d 20 73 71 6c 69 74 65 33  ->nOut = sqlite3
1b2f0 4c 6f 67 45 73 74 28 70 49 64 78 49 6e 66 6f 2d  LogEst(pIdxInfo-
1b300 3e 65 73 74 69 6d 61 74 65 64 52 6f 77 73 29 3b  >estimatedRows);
1b310 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 57  ..  /* Set the W
1b320 48 45 52 45 5f 4f 4e 45 52 4f 57 20 66 6c 61 67  HERE_ONEROW flag
1b330 20 69 66 20 74 68 65 20 78 42 65 73 74 49 6e 64   if the xBestInd
1b340 65 78 28 29 20 6d 65 74 68 6f 64 20 69 6e 64 69  ex() method indi
1b350 63 61 74 65 64 0a 20 20 2a 2a 20 74 68 61 74 20  cated.  ** that 
1b360 74 68 65 20 73 63 61 6e 20 77 69 6c 6c 20 76 69  the scan will vi
1b370 73 69 74 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  sit at most one 
1b380 72 6f 77 2e 20 43 6c 65 61 72 20 69 74 20 6f 74  row. Clear it ot
1b390 68 65 72 77 69 73 65 2e 20 2a 2f 0a 20 20 69 66  herwise. */.  if
1b3a0 28 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 46  ( pIdxInfo->idxF
1b3b0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 4e  lags & SQLITE_IN
1b3c0 44 45 58 5f 53 43 41 4e 5f 55 4e 49 51 55 45 20  DEX_SCAN_UNIQUE 
1b3d0 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 77 73 46  ){.    pNew->wsF
1b3e0 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 4e  lags |= WHERE_ON
1b3f0 45 52 4f 57 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  EROW;.  }else{. 
1b400 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
1b410 20 26 3d 20 7e 57 48 45 52 45 5f 4f 4e 45 52 4f   &= ~WHERE_ONERO
1b420 57 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 77 68  W;.  }.  rc = wh
1b430 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
1b440 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
1b450 20 69 66 28 20 70 4e 65 77 2d 3e 75 2e 76 74 61   if( pNew->u.vta
1b460 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20 20  b.needFree ){.  
1b470 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1b480 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  New->u.vtab.idxS
1b490 74 72 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  tr);.    pNew->u
1b4a0 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
1b4b0 20 30 3b 0a 20 20 7d 0a 20 20 57 48 45 52 45 54   0;.  }.  WHERET
1b4c0 52 41 43 45 28 30 78 66 66 66 66 2c 20 28 22 20  RACE(0xffff, (" 
1b4d0 20 62 49 6e 3d 25 64 20 70 72 65 72 65 71 49 6e   bIn=%d prereqIn
1b4e0 3d 25 30 34 6c 6c 78 20 70 72 65 72 65 71 4f 75  =%04llx prereqOu
1b4f0 74 3d 25 30 34 6c 6c 78 5c 6e 22 2c 0a 20 20 20  t=%04llx\n",.   
1b500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b510 20 20 20 2a 70 62 49 6e 2c 20 28 73 71 6c 69 74     *pbIn, (sqlit
1b520 65 33 5f 75 69 6e 74 36 34 29 6d 50 72 65 72 65  e3_uint64)mPrere
1b530 71 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  q,.             
1b540 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
1b550 33 5f 75 69 6e 74 36 34 29 28 70 4e 65 77 2d 3e  3_uint64)(pNew->
1b560 70 72 65 72 65 71 20 26 20 7e 6d 50 72 65 72 65  prereq & ~mPrere
1b570 71 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  q)));..  return 
1b580 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64  rc;.}.../*.** Ad
1b590 64 20 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 20  d all WhereLoop 
1b5a0 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 20 74 61  objects for a ta
1b5b0 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20  ble of the join 
1b5c0 69 64 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a  identified by.**
1b5d0 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 2d   pBuilder->pNew-
1b5e0 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74 61 62  >iTab.  That tab
1b5f0 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  le is guaranteed
1b600 20 74 6f 20 62 65 20 61 20 76 69 72 74 75 61 6c   to be a virtual
1b610 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
1b620 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 4c 45   there are no LE
1b630 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f 49 4e  FT or CROSS JOIN
1b640 20 6a 6f 69 6e 73 20 69 6e 20 74 68 65 20 71 75   joins in the qu
1b650 65 72 79 2c 20 62 6f 74 68 20 6d 50 72 65 72 65  ery, both mPrere
1b660 71 20 61 6e 64 0a 2a 2a 20 6d 55 6e 75 73 61 62  q and.** mUnusab
1b670 6c 65 20 61 72 65 20 73 65 74 20 74 6f 20 30 2e  le are set to 0.
1b680 20 4f 74 68 65 72 77 69 73 65 2c 20 6d 50 72 65   Otherwise, mPre
1b690 72 65 71 20 69 73 20 61 20 6d 61 73 6b 20 6f 66  req is a mask of
1b6a0 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65   all FROM clause
1b6b0 0a 2a 2a 20 65 6e 74 72 69 65 73 20 74 68 61 74  .** entries that
1b6c0 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74 68   occur before th
1b6d0 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
1b6e0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1b6f0 73 65 20 61 6e 64 20 61 72 65 0a 2a 2a 20 73 65  se and are.** se
1b700 70 61 72 61 74 65 64 20 66 72 6f 6d 20 69 74 20  parated from it 
1b710 62 79 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  by at least one 
1b720 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a 4f  LEFT or CROSS JO
1b730 49 4e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 74  IN. Similarly, t
1b740 68 65 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20  he.** mUnusable 
1b750 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20 61 6c  mask contains al
1b760 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e  l FROM clause en
1b770 74 72 69 65 73 20 74 68 61 74 20 6f 63 63 75 72  tries that occur
1b780 20 61 66 74 65 72 20 74 68 65 0a 2a 2a 20 76 69   after the.** vi
1b790 72 74 75 61 6c 20 74 61 62 6c 65 20 61 6e 64 20  rtual table and 
1b7a0 61 72 65 20 73 65 70 61 72 61 74 65 64 20 66 72  are separated fr
1b7b0 6f 6d 20 69 74 20 62 79 20 61 74 20 6c 65 61 73  om it by at leas
1b7c0 74 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20 0a 2a  t one LEFT or .*
1b7d0 2a 20 43 52 4f 53 53 20 4a 4f 49 4e 2e 20 0a 2a  * CROSS JOIN. .*
1b7e0 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
1b7f0 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20 77  , if the query w
1b800 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e  ere:.**.**   ...
1b810 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 4c 45 46   FROM t1, t2 LEF
1b820 54 20 4a 4f 49 4e 20 74 33 2c 20 74 34 2c 20 76  T JOIN t3, t4, v
1b830 74 20 43 52 4f 53 53 20 4a 4f 49 4e 20 74 35 2c  t CROSS JOIN t5,
1b840 20 74 36 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20   t6;.**.** then 
1b850 6d 50 72 65 72 65 71 20 63 6f 72 72 65 73 70 6f  mPrereq correspo
1b860 6e 64 73 20 74 6f 20 28 74 31 2c 20 74 32 29 20  nds to (t1, t2) 
1b870 61 6e 64 20 6d 55 6e 75 73 61 62 6c 65 20 74 6f  and mUnusable to
1b880 20 28 74 35 2c 20 74 36 29 2e 0a 2a 2a 0a 2a 2a   (t5, t6)..**.**
1b890 20 41 6c 6c 20 74 68 65 20 74 61 62 6c 65 73 20   All the tables 
1b8a0 69 6e 20 6d 50 72 65 72 65 71 20 6d 75 73 74 20  in mPrereq must 
1b8b0 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72  be scanned befor
1b8c0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 69  e the current vi
1b8d0 72 74 75 61 6c 20 0a 2a 2a 20 74 61 62 6c 65 2e  rtual .** table.
1b8e0 20 53 6f 20 61 6e 79 20 74 65 72 6d 73 20 66 6f   So any terms fo
1b8f0 72 20 77 68 69 63 68 20 61 6c 6c 20 70 72 65 72  r which all prer
1b900 65 71 75 69 73 69 74 65 73 20 61 72 65 20 73 61  equisites are sa
1b910 74 69 73 66 69 65 64 20 62 79 20 0a 2a 2a 20 6d  tisfied by .** m
1b920 50 72 65 72 65 71 20 6d 61 79 20 62 65 20 73 70  Prereq may be sp
1b930 65 63 69 66 69 65 64 20 61 73 20 22 75 73 61 62  ecified as "usab
1b940 6c 65 22 20 69 6e 20 61 6c 6c 20 63 61 6c 6c 73  le" in all calls
1b950 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 2e 20   to xBestIndex. 
1b960 0a 2a 2a 20 43 6f 6e 76 65 72 73 65 6c 79 2c 20  .** Conversely, 
1b970 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 6d 55  all tables in mU
1b980 6e 75 73 61 62 6c 65 20 6d 75 73 74 20 62 65 20  nusable must be 
1b990 73 63 61 6e 6e 65 64 20 61 66 74 65 72 20 74 68  scanned after th
1b9a0 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 76 69 72  e current.** vir
1b9b0 74 75 61 6c 20 74 61 62 6c 65 2c 20 73 6f 20 61  tual table, so a
1b9c0 6e 79 20 74 65 72 6d 73 20 66 6f 72 20 77 68 69  ny terms for whi
1b9d0 63 68 20 74 68 65 20 70 72 65 72 65 71 75 69 73  ch the prerequis
1b9e0 69 74 65 73 20 6f 76 65 72 6c 61 70 20 77 69 74  ites overlap wit
1b9f0 68 0a 2a 2a 20 6d 55 6e 75 73 61 62 6c 65 20 73  h.** mUnusable s
1ba00 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
1ba10 63 6f 6e 66 69 67 75 72 65 64 20 61 73 20 22 6e  configured as "n
1ba20 6f 74 2d 75 73 61 62 6c 65 22 20 66 6f 72 20 78  ot-usable" for x
1ba30 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2f 0a 73 74  BestIndex..*/.st
1ba40 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f  atic int whereLo
1ba50 6f 70 41 64 64 56 69 72 74 75 61 6c 28 0a 20 20  opAddVirtual(.  
1ba60 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
1ba70 20 2a 70 42 75 69 6c 64 65 72 2c 20 20 2f 2a 20   *pBuilder,  /* 
1ba80 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 66  WHERE clause inf
1ba90 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69  ormation */.  Bi
1baa0 74 6d 61 73 6b 20 6d 50 72 65 72 65 71 2c 20 20  tmask mPrereq,  
1bab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
1bac0 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20 62  bles that must b
1bad0 65 20 73 63 61 6e 6e 65 64 20 62 65 66 6f 72 65  e scanned before
1bae0 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 42   this one */.  B
1baf0 69 74 6d 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65  itmask mUnusable
1bb00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1bb10 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73 74 20  ables that must 
1bb20 62 65 20 73 63 61 6e 6e 65 64 20 61 66 74 65 72  be scanned after
1bb30 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 29 7b 0a   this one */.){.
1bb40 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1bb50 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f  E_OK;          /
1bb60 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1bb70 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
1bb80 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
1bb90 2f 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69  /* WHERE analysi
1bba0 73 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  s context */.  P
1bbb0 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
1bbc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1bbd0 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
1bbe0 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
1bbf0 75 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20  use *pWC;       
1bc00 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
1bc10 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
1bc20 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1bc30 6d 20 2a 70 53 72 63 3b 20 20 20 2f 2a 20 54 68  m *pSrc;   /* Th
1bc40 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
1bc50 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  rm to search */.
1bc60 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
1bc70 69 6e 66 6f 20 2a 70 3b 20 20 20 20 20 20 20 2f  info *p;       /
1bc80 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 61 73 73  * Object to pass
1bc90 20 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29   to xBestIndex()
1bca0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6e 73 74   */.  int nConst
1bcb0 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20  raint;          
1bcc0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1bcd0 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20 70  constraints in p
1bce0 20 2a 2f 0a 20 20 69 6e 74 20 62 49 6e 3b 20 20   */.  int bIn;  
1bcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd00 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 6c     /* True if pl
1bd10 61 6e 20 75 73 65 73 20 49 4e 28 2e 2e 2e 29 20  an uses IN(...) 
1bd20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 57 68  operator */.  Wh
1bd30 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20  ereLoop *pNew;. 
1bd40 20 42 69 74 6d 61 73 6b 20 6d 42 65 73 74 3b 20   Bitmask mBest; 
1bd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bd60 20 54 61 62 6c 65 73 20 75 73 65 64 20 62 79 20   Tables used by 
1bd70 62 65 73 74 20 70 6f 73 73 69 62 6c 65 20 70 6c  best possible pl
1bd80 61 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  an */..  assert(
1bd90 20 28 6d 50 72 65 72 65 71 20 26 20 6d 55 6e 75   (mPrereq & mUnu
1bda0 73 61 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20 70  sable)==0 );.  p
1bdb0 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
1bdc0 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61 72  ->pWInfo;.  pPar
1bdd0 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
1bde0 72 73 65 3b 0a 20 20 70 57 43 20 3d 20 70 42 75  rse;.  pWC = pBu
1bdf0 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70 4e  ilder->pWC;.  pN
1be00 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  ew = pBuilder->p
1be10 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d 20 26 70  New;.  pSrc = &p
1be20 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
1be30 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a  >a[pNew->iTab];.
1be40 20 20 61 73 73 65 72 74 28 20 49 73 56 69 72 74    assert( IsVirt
1be50 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20  ual(pSrc->pTab) 
1be60 29 3b 0a 20 20 70 20 3d 20 61 6c 6c 6f 63 61 74  );.  p = allocat
1be70 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73  eIndexInfo(pPars
1be80 65 2c 20 70 57 43 2c 20 6d 55 6e 75 73 61 62 6c  e, pWC, mUnusabl
1be90 65 2c 20 70 53 72 63 2c 20 70 42 75 69 6c 64 65  e, pSrc, pBuilde
1bea0 72 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  r->pOrderBy);.  
1beb0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
1bec0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
1bed0 4b 50 54 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65  KPT;.  pNew->rSe
1bee0 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  tup = 0;.  pNew-
1bef0 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
1bf00 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20  _VIRTUALTABLE;. 
1bf10 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
1bf20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61  0;.  pNew->u.vta
1bf30 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30 3b 0a  b.needFree = 0;.
1bf40 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20    nConstraint = 
1bf50 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  p->nConstraint;.
1bf60 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f 70 52    if( whereLoopR
1bf70 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e 64 62  esize(pParse->db
1bf80 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74 72 61  , pNew, nConstra
1bf90 69 6e 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  int) ){.    sqli
1bfa0 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
1bfb0 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 20 20 72 65  ->db, p);.    re
1bfc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1bfd0 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  M_BKPT;.  }..  /
1bfe0 2a 20 46 69 72 73 74 20 63 61 6c 6c 20 78 42 65  * First call xBe
1bff0 73 74 49 6e 64 65 78 28 29 20 77 69 74 68 20 61  stIndex() with a
1c000 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 75  ll constraints u
1c010 73 61 62 6c 65 2e 20 2a 2f 0a 20 20 57 48 45 52  sable. */.  WHER
1c020 45 54 52 41 43 45 28 30 78 34 30 2c 20 28 22 20  ETRACE(0x40, (" 
1c030 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c   VirtualOne: all
1c040 20 75 73 61 62 6c 65 5c 6e 22 29 29 3b 0a 20 20   usable\n"));.  
1c050 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
1c060 64 56 69 72 74 75 61 6c 4f 6e 65 28 70 42 75 69  dVirtualOne(pBui
1c070 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 41  lder, mPrereq, A
1c080 4c 4c 42 49 54 53 2c 20 30 2c 20 70 2c 20 26 62  LLBITS, 0, p, &b
1c090 49 6e 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  In);..  /* If th
1c0a0 65 20 63 61 6c 6c 20 74 6f 20 78 42 65 73 74 49  e call to xBestI
1c0b0 6e 64 65 78 28 29 20 77 69 74 68 20 61 6c 6c 20  ndex() with all 
1c0c0 74 65 72 6d 73 20 65 6e 61 62 6c 65 64 20 70 72  terms enabled pr
1c0d0 6f 64 75 63 65 64 20 61 20 70 6c 61 6e 0a 20 20  oduced a plan.  
1c0e0 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ** that does not
1c0f0 20 72 65 71 75 69 72 65 20 61 6e 79 20 73 6f 75   require any sou
1c100 72 63 65 20 74 61 62 6c 65 73 20 28 49 4f 57 3a  rce tables (IOW:
1c110 20 61 20 70 6c 61 6e 20 77 69 74 68 20 6d 42 65   a plan with mBe
1c120 73 74 3d 3d 30 29 2c 0a 20 20 2a 2a 20 74 68 65  st==0),.  ** the
1c130 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  n there is no po
1c140 69 6e 74 20 69 6e 20 6d 61 6b 69 6e 67 20 61 6e  int in making an
1c150 79 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20  y further calls 
1c160 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  to xBestIndex() 
1c170 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68 65 79  .  ** since they
1c180 20 77 69 6c 6c 20 61 6c 6c 20 72 65 74 75 72 6e   will all return
1c190 20 74 68 65 20 73 61 6d 65 20 72 65 73 75 6c 74   the same result
1c1a0 20 28 69 66 20 74 68 65 20 78 42 65 73 74 49 6e   (if the xBestIn
1c1b0 64 65 78 28 29 0a 20 20 2a 2a 20 69 6d 70 6c 65  dex().  ** imple
1c1c0 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 73 61 6e  mentation is san
1c1d0 65 29 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  e). */.  if( rc=
1c1e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 6d  =SQLITE_OK && (m
1c1f0 42 65 73 74 20 3d 20 28 70 4e 65 77 2d 3e 70 72  Best = (pNew->pr
1c200 65 72 65 71 20 26 20 7e 6d 50 72 65 72 65 71 29  ereq & ~mPrereq)
1c210 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
1c220 73 65 65 6e 5a 65 72 6f 20 3d 20 30 3b 20 20 20  seenZero = 0;   
1c230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1c240 65 20 69 66 20 61 20 70 6c 61 6e 20 77 69 74 68  e if a plan with
1c250 20 6e 6f 20 70 72 65 72 65 71 73 20 73 65 65 6e   no prereqs seen
1c260 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 65 65 6e   */.    int seen
1c270 5a 65 72 6f 4e 6f 49 4e 20 3d 20 30 3b 20 20 20  ZeroNoIN = 0;   
1c280 20 20 20 20 20 20 2f 2a 20 50 6c 61 6e 20 77 69        /* Plan wi
1c290 74 68 20 6e 6f 20 70 72 65 72 65 71 73 20 61 6e  th no prereqs an
1c2a0 64 20 6e 6f 20 49 4e 28 2e 2e 2e 29 20 73 65 65  d no IN(...) see
1c2b0 6e 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b  n */.    Bitmask
1c2c0 20 6d 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20   mPrev = 0;.    
1c2d0 42 69 74 6d 61 73 6b 20 6d 42 65 73 74 4e 6f 49  Bitmask mBestNoI
1c2e0 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 49  n = 0;..    /* I
1c2f0 66 20 74 68 65 20 70 6c 61 6e 20 70 72 6f 64 75  f the plan produ
1c300 63 65 64 20 62 79 20 74 68 65 20 65 61 72 6c 69  ced by the earli
1c310 65 72 20 63 61 6c 6c 20 75 73 65 73 20 61 6e 20  er call uses an 
1c320 49 4e 28 2e 2e 2e 29 20 74 65 72 6d 2c 20 63 61  IN(...) term, ca
1c330 6c 6c 0a 20 20 20 20 2a 2a 20 78 42 65 73 74 49  ll.    ** xBestI
1c340 6e 64 65 78 20 61 67 61 69 6e 2c 20 74 68 69 73  ndex again, this
1c350 20 74 69 6d 65 20 77 69 74 68 20 49 4e 28 2e 2e   time with IN(..
1c360 2e 29 20 74 65 72 6d 73 20 64 69 73 61 62 6c 65  .) terms disable
1c370 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 49  d. */.    if( bI
1c380 6e 20 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45  n ){.      WHERE
1c390 54 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20  TRACE(0x40, ("  
1c3a0 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20  VirtualOne: all 
1c3b0 75 73 61 62 6c 65 20 77 2f 6f 20 49 4e 5c 6e 22  usable w/o IN\n"
1c3c0 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ));.      rc = w
1c3d0 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
1c3e0 61 6c 4f 6e 65 28 70 42 75 69 6c 64 65 72 2c 20  alOne(pBuilder, 
1c3f0 6d 50 72 65 72 65 71 2c 20 41 4c 4c 42 49 54 53  mPrereq, ALLBITS
1c400 2c 20 57 4f 5f 49 4e 2c 20 70 2c 20 26 62 49 6e  , WO_IN, p, &bIn
1c410 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1c420 20 62 49 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20   bIn==0 );.     
1c430 20 6d 42 65 73 74 4e 6f 49 6e 20 3d 20 70 4e 65   mBestNoIn = pNe
1c440 77 2d 3e 70 72 65 72 65 71 20 26 20 7e 6d 50 72  w->prereq & ~mPr
1c450 65 72 65 71 3b 0a 20 20 20 20 20 20 69 66 28 20  ereq;.      if( 
1c460 6d 42 65 73 74 4e 6f 49 6e 3d 3d 30 20 29 7b 0a  mBestNoIn==0 ){.
1c470 20 20 20 20 20 20 20 20 73 65 65 6e 5a 65 72 6f          seenZero
1c480 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 65   = 1;.        se
1c490 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a  enZeroNoIN = 1;.
1c4a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1c4b0 20 20 20 2f 2a 20 43 61 6c 6c 20 78 42 65 73 74     /* Call xBest
1c4c0 49 6e 64 65 78 20 6f 6e 63 65 20 66 6f 72 20 65  Index once for e
1c4d0 61 63 68 20 64 69 73 74 69 6e 63 74 20 76 61 6c  ach distinct val
1c4e0 75 65 20 6f 66 20 28 70 72 65 72 65 71 52 69 67  ue of (prereqRig
1c4f0 68 74 20 26 20 7e 6d 50 72 65 72 65 71 29 20 0a  ht & ~mPrereq) .
1c500 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 73 65      ** in the se
1c510 74 20 6f 66 20 74 65 72 6d 73 20 74 68 61 74 20  t of terms that 
1c520 61 70 70 6c 79 20 74 6f 20 74 68 65 20 63 75 72  apply to the cur
1c530 72 65 6e 74 20 76 69 72 74 75 61 6c 20 74 61 62  rent virtual tab
1c540 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c  le.  */.    whil
1c550 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
1c560 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
1c570 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
1c580 4e 65 78 74 20 3d 20 41 4c 4c 42 49 54 53 3b 0a  Next = ALLBITS;.
1c590 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 4e        assert( mN
1c5a0 65 78 74 3e 30 20 29 3b 0a 20 20 20 20 20 20 66  ext>0 );.      f
1c5b0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74  or(i=0; i<nConst
1c5c0 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  raint; i++){.   
1c5d0 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 54 68       Bitmask mTh
1c5e0 69 73 20 3d 20 28 0a 20 20 20 20 20 20 20 20 20  is = (.         
1c5f0 20 20 20 70 57 43 2d 3e 61 5b 70 2d 3e 61 43 6f     pWC->a[p->aCo
1c600 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72  nstraint[i].iTer
1c610 6d 4f 66 66 73 65 74 5d 2e 70 72 65 72 65 71 52  mOffset].prereqR
1c620 69 67 68 74 20 26 20 7e 6d 50 72 65 72 65 71 0a  ight & ~mPrereq.
1c630 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
1c640 20 20 20 69 66 28 20 6d 54 68 69 73 3e 6d 50 72     if( mThis>mPr
1c650 65 76 20 26 26 20 6d 54 68 69 73 3c 6d 4e 65 78  ev && mThis<mNex
1c660 74 20 29 20 6d 4e 65 78 74 20 3d 20 6d 54 68 69  t ) mNext = mThi
1c670 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  s;.      }.     
1c680 20 6d 50 72 65 76 20 3d 20 6d 4e 65 78 74 3b 0a   mPrev = mNext;.
1c690 20 20 20 20 20 20 69 66 28 20 6d 4e 65 78 74 3d        if( mNext=
1c6a0 3d 41 4c 4c 42 49 54 53 20 29 20 62 72 65 61 6b  =ALLBITS ) break
1c6b0 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 4e 65 78  ;.      if( mNex
1c6c0 74 3d 3d 6d 42 65 73 74 20 7c 7c 20 6d 4e 65 78  t==mBest || mNex
1c6d0 74 3d 3d 6d 42 65 73 74 4e 6f 49 6e 20 29 20 63  t==mBestNoIn ) c
1c6e0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 57  ontinue;.      W
1c6f0 48 45 52 45 54 52 41 43 45 28 30 78 34 30 2c 20  HERETRACE(0x40, 
1c700 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20  ("  VirtualOne: 
1c710 6d 50 72 65 76 3d 25 30 34 6c 6c 78 20 6d 4e 65  mPrev=%04llx mNe
1c720 78 74 3d 25 30 34 6c 6c 78 5c 6e 22 2c 0a 20 20  xt=%04llx\n",.  
1c730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c740 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 75 69       (sqlite3_ui
1c750 6e 74 36 34 29 6d 50 72 65 76 2c 20 28 73 71 6c  nt64)mPrev, (sql
1c760 69 74 65 33 5f 75 69 6e 74 36 34 29 6d 4e 65 78  ite3_uint64)mNex
1c770 74 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  t));.      rc = 
1c780 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
1c790 75 61 6c 4f 6e 65 28 70 42 75 69 6c 64 65 72 2c  ualOne(pBuilder,
1c7a0 20 6d 50 72 65 72 65 71 2c 20 6d 4e 65 78 74 7c   mPrereq, mNext|
1c7b0 6d 50 72 65 72 65 71 2c 20 30 2c 20 70 2c 20 26  mPrereq, 0, p, &
1c7c0 62 49 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  bIn);.      if( 
1c7d0 70 4e 65 77 2d 3e 70 72 65 72 65 71 3d 3d 6d 50  pNew->prereq==mP
1c7e0 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20 20  rereq ){.       
1c7f0 20 73 65 65 6e 5a 65 72 6f 20 3d 20 31 3b 0a 20   seenZero = 1;. 
1c800 20 20 20 20 20 20 20 69 66 28 20 62 49 6e 3d 3d         if( bIn==
1c810 30 20 29 20 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e  0 ) seenZeroNoIN
1c820 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1c830 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1c840 68 65 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73  he calls to xBes
1c850 74 49 6e 64 65 78 28 29 20 69 6e 20 74 68 65 20  tIndex() in the 
1c860 61 62 6f 76 65 20 6c 6f 6f 70 20 64 69 64 20 6e  above loop did n
1c870 6f 74 20 66 69 6e 64 20 61 20 70 6c 61 6e 0a 20  ot find a plan. 
1c880 20 20 20 2a 2a 20 74 68 61 74 20 72 65 71 75 69     ** that requi
1c890 72 65 73 20 6e 6f 20 73 6f 75 72 63 65 20 74 61  res no source ta
1c8a0 62 6c 65 73 20 61 74 20 61 6c 6c 20 28 69 2e 65  bles at all (i.e
1c8b0 2e 20 6f 6e 65 20 67 75 61 72 61 6e 74 65 65 64  . one guaranteed
1c8c0 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 73   to be.    ** us
1c8d0 61 62 6c 65 29 2c 20 6d 61 6b 65 20 61 20 63 61  able), make a ca
1c8e0 6c 6c 20 68 65 72 65 20 77 69 74 68 20 61 6c 6c  ll here with all
1c8f0 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 64   source tables d
1c900 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20 69  isabled */.    i
1c910 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1c920 20 26 26 20 73 65 65 6e 5a 65 72 6f 3d 3d 30 20   && seenZero==0 
1c930 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  ){.      WHERETR
1c940 41 43 45 28 30 78 34 30 2c 20 28 22 20 20 56 69  ACE(0x40, ("  Vi
1c950 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 64 69  rtualOne: all di
1c960 73 61 62 6c 65 64 5c 6e 22 29 29 3b 0a 20 20 20  sabled\n"));.   
1c970 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1c980 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 70  pAddVirtualOne(p
1c990 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71  Builder, mPrereq
1c9a0 2c 20 6d 50 72 65 72 65 71 2c 20 30 2c 20 70 2c  , mPrereq, 0, p,
1c9b0 20 26 62 49 6e 29 3b 0a 20 20 20 20 20 20 69 66   &bIn);.      if
1c9c0 28 20 62 49 6e 3d 3d 30 20 29 20 73 65 65 6e 5a  ( bIn==0 ) seenZ
1c9d0 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20  eroNoIN = 1;.   
1c9e0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1c9f0 65 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74  e calls to xBest
1ca00 49 6e 64 65 78 28 29 20 68 61 76 65 20 73 6f 20  Index() have so 
1ca10 66 61 72 20 66 61 69 6c 65 64 20 74 6f 20 66 69  far failed to fi
1ca20 6e 64 20 61 20 70 6c 61 6e 0a 20 20 20 20 2a 2a  nd a plan.    **
1ca30 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 6e   that requires n
1ca40 6f 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20  o source tables 
1ca50 61 74 20 61 6c 6c 20 61 6e 64 20 64 6f 65 73 20  at all and does 
1ca60 6e 6f 74 20 75 73 65 20 61 6e 20 49 4e 28 2e 2e  not use an IN(..
1ca70 2e 29 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  .).    ** operat
1ca80 6f 72 2c 20 6d 61 6b 65 20 61 20 66 69 6e 61 6c  or, make a final
1ca90 20 63 61 6c 6c 20 74 6f 20 6f 62 74 61 69 6e 20   call to obtain 
1caa0 6f 6e 65 20 68 65 72 65 2e 20 20 2a 2f 0a 20 20  one here.  */.  
1cab0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1cac0 5f 4f 4b 20 26 26 20 73 65 65 6e 5a 65 72 6f 4e  _OK && seenZeroN
1cad0 6f 49 4e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  oIN==0 ){.      
1cae0 57 48 45 52 45 54 52 41 43 45 28 30 78 34 30 2c  WHERETRACE(0x40,
1caf0 20 28 22 20 20 56 69 72 74 75 61 6c 4f 6e 65 3a   ("  VirtualOne:
1cb00 20 61 6c 6c 20 64 69 73 61 62 6c 65 64 20 61 6e   all disabled an
1cb10 64 20 77 2f 6f 20 49 4e 5c 6e 22 29 29 3b 0a 20  d w/o IN\n"));. 
1cb20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c       rc = whereL
1cb30 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65  oopAddVirtualOne
1cb40 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72  (pBuilder, mPrer
1cb50 65 71 2c 20 6d 50 72 65 72 65 71 2c 20 57 4f 5f  eq, mPrereq, WO_
1cb60 49 4e 2c 20 70 2c 20 26 62 49 6e 29 3b 0a 20 20  IN, p, &bIn);.  
1cb70 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
1cb80 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
1cb90 74 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  tr ) sqlite3_fre
1cba0 65 28 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  e(p->idxStr);.  
1cbb0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
1cbc0 61 72 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20  arse->db, p);.  
1cbd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
1cbe0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1cbf0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
1cc00 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57 68  */../*.** Add Wh
1cc10 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73 20  ereLoop entries 
1cc20 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74 65 72  to handle OR ter
1cc30 6d 73 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20  ms.  This works 
1cc40 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20 62 74  for either.** bt
1cc50 72 65 65 73 20 6f 72 20 76 69 72 74 75 61 6c 20  rees or virtual 
1cc60 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tables..*/.stati
1cc70 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 41  c int whereLoopA
1cc80 64 64 4f 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f  ddOr(.  WhereLoo
1cc90 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
1cca0 65 72 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20 6d  er, .  Bitmask m
1ccb0 50 72 65 72 65 71 2c 20 0a 20 20 42 69 74 6d 61  Prereq, .  Bitma
1ccc0 73 6b 20 6d 55 6e 75 73 61 62 6c 65 0a 29 7b 0a  sk mUnusable.){.
1ccd0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
1cce0 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
1ccf0 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65 43  pWInfo;.  WhereC
1cd00 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68  lause *pWC;.  Wh
1cd10 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20  ereLoop *pNew;. 
1cd20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1cd30 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69 6e  m, *pWCEnd;.  in
1cd40 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1cd50 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20 20  ;.  int iCur;.  
1cd60 57 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d 70  WhereClause temp
1cd70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  WC;.  WhereLoopB
1cd80 75 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c 64  uilder sSubBuild
1cd90 3b 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20 73  ;.  WhereOrSet s
1cda0 53 75 6d 2c 20 73 43 75 72 3b 0a 20 20 73 74 72  Sum, sCur;.  str
1cdb0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1cdc0 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70 57   *pItem;.  .  pW
1cdd0 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  C = pBuilder->pW
1cde0 43 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 70 57  C;.  pWCEnd = pW
1cdf0 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65 72  C->a + pWC->nTer
1ce00 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  m;.  pNew = pBui
1ce10 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d 65  lder->pNew;.  me
1ce20 6d 73 65 74 28 26 73 53 75 6d 2c 20 30 2c 20 73  mset(&sSum, 0, s
1ce30 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a 20 20  izeof(sSum));.  
1ce40 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e  pItem = pWInfo->
1ce50 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 4e  pTabList->a + pN
1ce60 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69 43 75 72  ew->iTab;.  iCur
1ce70 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
1ce80 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d  r;..  for(pTerm=
1ce90 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
1cea0 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c 49  CEnd && rc==SQLI
1ceb0 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29 7b  TE_OK; pTerm++){
1cec0 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
1ced0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1cee0 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28  OR)!=0.     && (
1cef0 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
1cf00 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70 4e  ->indexable & pN
1cf10 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d 30  ew->maskSelf)!=0
1cf20 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57   .    ){.      W
1cf30 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e  hereClause * con
1cf40 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72  st pOrWC = &pTer
1cf50 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63  m->u.pOrInfo->wc
1cf60 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
1cf70 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45  m * const pOrWCE
1cf80 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70  nd = &pOrWC->a[p
1cf90 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  OrWC->nTerm];.  
1cfa0 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1cfb0 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e  OrTerm;.      in
1cfc0 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20  t once = 1;.    
1cfd0 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
1cfe0 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64  .      sSubBuild
1cff0 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20 20   = *pBuilder;.  
1d000 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f      sSubBuild.pO
1d010 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
1d020 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72 53    sSubBuild.pOrS
1d030 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20 20  et = &sCur;..   
1d040 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1d050 32 30 30 2c 20 28 22 42 65 67 69 6e 20 70 72 6f  200, ("Begin pro
1d060 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75 73  cessing OR-claus
1d070 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29 29  e %p\n", pTerm))
1d080 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72 54  ;.      for(pOrT
1d090 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70 4f  erm=pOrWC->a; pO
1d0a0 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b 20  rTerm<pOrWCEnd; 
1d0b0 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
1d0c0 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
1d0d0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1d0e0 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20 20  _AND)!=0 ){.    
1d0f0 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e        sSubBuild.
1d100 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e  pWC = &pOrTerm->
1d110 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a  u.pAndInfo->wc;.
1d120 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1d130 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
1d140 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20  ursor==iCur ){. 
1d150 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
1d160 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70 57  pWInfo = pWC->pW
1d170 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  Info;.          
1d180 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d 20  tempWC.pOuter = 
1d190 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74  pWC;.          t
1d1a0 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e  empWC.op = TK_AN
1d1b0 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  D;.          tem
1d1c0 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20  pWC.nTerm = 1;. 
1d1d0 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
1d1e0 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20  a = pOrTerm;.   
1d1f0 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64         sSubBuild
1d200 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b 0a  .pWC = &tempWC;.
1d210 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1d220 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
1d230 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
1d240 20 20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30 3b       sCur.n = 0;
1d250 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52 41  .#ifdef WHERETRA
1d260 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20 20  CE_ENABLED.     
1d270 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78     WHERETRACE(0x
1d280 32 30 30 2c 20 28 22 4f 52 2d 74 65 72 6d 20 25  200, ("OR-term %
1d290 64 20 6f 66 20 25 70 20 68 61 73 20 25 64 20 73  d of %p has %d s
1d2a0 75 62 74 65 72 6d 73 3a 5c 6e 22 2c 20 0a 20 20  ubterms:\n", .  
1d2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2c0 20 28 69 6e 74 29 28 70 4f 72 54 65 72 6d 2d 70   (int)(pOrTerm-p
1d2d0 4f 72 57 43 2d 3e 61 29 2c 20 70 54 65 72 6d 2c  OrWC->a), pTerm,
1d2e0 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d 3e   sSubBuild.pWC->
1d2f0 6e 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 20  nTerm));.       
1d300 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
1d310 65 54 72 61 63 65 20 26 20 30 78 34 30 30 20 29  eTrace & 0x400 )
1d320 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1d330 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 50 72  te3WhereClausePr
1d340 69 6e 74 28 73 53 75 62 42 75 69 6c 64 2e 70 57  int(sSubBuild.pW
1d350 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  C);.        }.#e
1d360 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
1d370 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
1d380 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69 66  TABLE.        if
1d390 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74 65  ( IsVirtual(pIte
1d3a0 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20  m->pTab) ){.    
1d3b0 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1d3c0 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28 26  LoopAddVirtual(&
1d3d0 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72 65 72  sSubBuild, mPrer
1d3e0 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a  eq, mUnusable);.
1d3f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65          }else.#e
1d400 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a 20  ndif.        {. 
1d410 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68           rc = wh
1d420 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 28  ereLoopAddBtree(
1d430 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72 65  &sSubBuild, mPre
1d440 72 65 71 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  req);.        }.
1d450 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1d460 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d470 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
1d480 65 4c 6f 6f 70 41 64 64 4f 72 28 26 73 53 75 62  eLoopAddOr(&sSub
1d490 42 75 69 6c 64 2c 20 6d 50 72 65 72 65 71 2c 20  Build, mPrereq, 
1d4a0 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20 20  mUnusable);.    
1d4b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
1d4c0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
1d4d0 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d 30  _OK || sCur.n==0
1d4e0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1d4f0 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20  sCur.n==0 ){.   
1d500 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d 20         sSum.n = 
1d510 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  0;.          bre
1d520 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
1d530 65 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20  e if( once ){.  
1d540 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72 4d          whereOrM
1d550 6f 76 65 28 26 73 53 75 6d 2c 20 26 73 43 75 72  ove(&sSum, &sCur
1d560 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e 63  );.          onc
1d570 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
1d580 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1d590 57 68 65 72 65 4f 72 53 65 74 20 73 50 72 65 76  WhereOrSet sPrev
1d5a0 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 65 72  ;.          wher
1d5b0 65 4f 72 4d 6f 76 65 28 26 73 50 72 65 76 2c 20  eOrMove(&sPrev, 
1d5c0 26 73 53 75 6d 29 3b 0a 20 20 20 20 20 20 20 20  &sSum);.        
1d5d0 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20 20    sSum.n = 0;.  
1d5e0 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
1d5f0 20 69 3c 73 50 72 65 76 2e 6e 3b 20 69 2b 2b 29   i<sPrev.n; i++)
1d600 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  {.            fo
1d610 72 28 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e 3b  r(j=0; j<sCur.n;
1d620 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
1d630 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65       whereOrInse
1d640 72 74 28 26 73 53 75 6d 2c 20 73 50 72 65 76 2e  rt(&sSum, sPrev.
1d650 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c 20 73 43  a[i].prereq | sC
1d660 75 72 2e 61 5b 6a 5d 2e 70 72 65 72 65 71 2c 0a  ur.a[j].prereq,.
1d670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d680 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1d690 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72  te3LogEstAdd(sPr
1d6a0 65 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73 43  ev.a[i].rRun, sC
1d6b0 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a 20  ur.a[j].rRun),. 
1d6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6d0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1d6e0 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72 65  e3LogEstAdd(sPre
1d6f0 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43 75  v.a[i].nOut, sCu
1d700 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a 20  r.a[j].nOut));. 
1d710 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1d720 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d730 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1d740 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20   pNew->nLTerm = 
1d750 31 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  1;.      pNew->a
1d760 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d  LTerm[0] = pTerm
1d770 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  ;.      pNew->ws
1d780 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d 55  Flags = WHERE_MU
1d790 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70 4e  LTI_OR;.      pN
1d7a0 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a  ew->rSetup = 0;.
1d7b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72        pNew->iSor
1d7c0 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  tIdx = 0;.      
1d7d0 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75 2c  memset(&pNew->u,
1d7e0 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77 2d   0, sizeof(pNew-
1d7f0 3e 75 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  >u));.      for(
1d800 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
1d810 4f 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b 20  OK && i<sSum.n; 
1d820 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  i++){.        /*
1d830 20 54 55 4e 49 4e 47 3a 20 43 75 72 72 65 6e 74   TUNING: Current
1d840 6c 79 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52 75  ly sSum.a[i].rRu
1d850 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  n is set to the 
1d860 73 75 6d 20 6f 66 20 74 68 65 20 63 6f 73 74 73  sum of the costs
1d870 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61  .        ** of a
1d880 6c 6c 20 73 75 62 2d 73 63 61 6e 73 20 72 65 71  ll sub-scans req
1d890 75 69 72 65 64 20 62 79 20 74 68 65 20 4f 52 2d  uired by the OR-
1d8a0 73 63 61 6e 2e 20 48 6f 77 65 76 65 72 2c 20 64  scan. However, d
1d8b0 75 65 20 74 6f 20 72 6f 75 6e 64 69 6e 67 0a 20  ue to rounding. 
1d8c0 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72 73         ** errors
1d8d0 2c 20 69 74 20 6d 61 79 20 62 65 20 74 68 61 74  , it may be that
1d8e0 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65   the cost of the
1d8f0 20 4f 52 2d 73 63 61 6e 20 69 73 20 65 71 75 61   OR-scan is equa
1d900 6c 20 74 6f 20 69 74 73 0a 20 20 20 20 20 20 20  l to its.       
1d910 20 2a 2a 20 6d 6f 73 74 20 65 78 70 65 6e 73 69   ** most expensi
1d920 76 65 20 73 75 62 2d 73 63 61 6e 2e 20 41 64 64  ve sub-scan. Add
1d930 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 70 6f   the smallest po
1d940 73 73 69 62 6c 65 20 70 65 6e 61 6c 74 79 20 0a  ssible penalty .
1d950 20 20 20 20 20 20 20 20 2a 2a 20 28 65 71 75 69          ** (equi
1d960 76 61 6c 65 6e 74 20 74 6f 20 6d 75 6c 74 69 70  valent to multip
1d970 6c 79 69 6e 67 20 74 68 65 20 63 6f 73 74 20 62  lying the cost b
1d980 79 20 31 2e 30 37 29 20 74 6f 20 65 6e 73 75 72  y 1.07) to ensur
1d990 65 20 74 68 61 74 20 0a 20 20 20 20 20 20 20 20  e that .        
1d9a0 2a 2a 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  ** this does not
1d9b0 20 68 61 70 70 65 6e 2e 20 4f 74 68 65 72 77 69   happen. Otherwi
1d9c0 73 65 2c 20 66 6f 72 20 57 48 45 52 45 20 63 6c  se, for WHERE cl
1d9d0 61 75 73 65 73 20 73 75 63 68 20 61 73 20 74 68  auses such as th
1d9e0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 6c  e.        ** fol
1d9f0 6c 6f 77 69 6e 67 20 77 68 65 72 65 20 74 68 65  lowing where the
1da00 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f  re is an index o
1da10 6e 20 22 79 22 3a 0a 20 20 20 20 20 20 20 20 2a  n "y":.        *
1da20 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  *.        **    
1da30 20 57 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f 6f   WHERE likelihoo
1da40 64 28 78 3d 3f 2c 20 30 2e 39 39 29 20 4f 52 20  d(x=?, 0.99) OR 
1da50 79 3d 3f 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  y=?.        **. 
1da60 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6c         ** the pl
1da70 61 6e 6e 65 72 20 6d 61 79 20 65 6c 65 63 74 20  anner may elect 
1da80 74 6f 20 22 4f 52 22 20 74 6f 67 65 74 68 65 72  to "OR" together
1da90 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73 63   a full-table sc
1daa0 61 6e 20 61 6e 64 20 61 6e 0a 20 20 20 20 20 20  an and an.      
1dab0 20 20 2a 2a 20 69 6e 64 65 78 20 6c 6f 6f 6b 75    ** index looku
1dac0 70 2e 20 41 6e 64 20 6f 74 68 65 72 20 73 69 6d  p. And other sim
1dad0 69 6c 61 72 6c 79 20 6f 64 64 20 72 65 73 75 6c  ilarly odd resul
1dae0 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ts.  */.        
1daf0 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53 75  pNew->rRun = sSu
1db00 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31 3b  m.a[i].rRun + 1;
1db10 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
1db20 4f 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d 2e  Out = sSum.a[i].
1db30 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70 4e  nOut;.        pN
1db40 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 53 75  ew->prereq = sSu
1db50 6d 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a 20  m.a[i].prereq;. 
1db60 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
1db70 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69  eLoopInsert(pBui
1db80 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20  lder, pNew);.   
1db90 20 20 20 7d 0a 20 20 20 20 20 20 57 48 45 52 45     }.      WHERE
1dba0 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22 45  TRACE(0x200, ("E
1dbb0 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 20 4f 52  nd processing OR
1dbc0 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20 70  -clause %p\n", p
1dbd0 54 65 72 6d 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Term));.    }.  
1dbe0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1dbf0 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20  ../*.** Add all 
1dc00 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74  WhereLoop object
1dc10 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  s for all tables
1dc20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
1dc30 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c 28  whereLoopAddAll(
1dc40 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
1dc50 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20 57   *pBuilder){.  W
1dc60 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1dc70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
1dc80 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  nfo;.  Bitmask m
1dc90 50 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 42 69  Prereq = 0;.  Bi
1dca0 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20 30  tmask mPrior = 0
1dcb0 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20  ;.  int iTab;.  
1dcc0 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
1dcd0 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
1dce0 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53  List;.  struct S
1dcf0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
1dd00 65 6d 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63  em;.  struct Src
1dd10 4c 69 73 74 5f 69 74 65 6d 20 2a 70 45 6e 64 20  List_item *pEnd 
1dd20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
1dd30 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a  WInfo->nLevel];.
1dd40 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1dd50 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e  pWInfo->pParse->
1dd60 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  db;.  int rc = S
1dd70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65 72  QLITE_OK;.  Wher
1dd80 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20 75  eLoop *pNew;.  u
1dd90 38 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65 20  8 priorJointype 
1dda0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  = 0;..  /* Loop 
1ddb0 6f 76 65 72 20 74 68 65 20 74 61 62 6c 65 73 20  over the tables 
1ddc0 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72 6f  in the join, fro
1ddd0 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20  m left to right 
1dde0 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70 42 75 69  */.  pNew = pBui
1ddf0 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77 68  lder->pNew;.  wh
1de00 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65 77  ereLoopInit(pNew
1de10 29 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d 30 2c  );.  for(iTab=0,
1de20 20 70 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d   pItem=pTabList-
1de30 3e 61 3b 20 70 49 74 65 6d 3c 70 45 6e 64 3b 20  >a; pItem<pEnd; 
1de40 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  iTab++, pItem++)
1de50 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 55  {.    Bitmask mU
1de60 6e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  nusable = 0;.   
1de70 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69 54   pNew->iTab = iT
1de80 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d 61  ab;.    pNew->ma
1de90 73 6b 53 65 6c 66 20 3d 20 73 71 6c 69 74 65 33  skSelf = sqlite3
1dea0 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57  WhereGetMask(&pW
1deb0 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
1dec0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  pItem->iCursor);
1ded0 0a 20 20 20 20 69 66 28 20 28 28 70 49 74 65 6d  .    if( ((pItem
1dee0 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 7c 70 72  ->fg.jointype|pr
1def0 69 6f 72 4a 6f 69 6e 74 79 70 65 29 20 26 20 28  iorJointype) & (
1df00 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53  JT_LEFT|JT_CROSS
1df10 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ))!=0 ){.      /
1df20 2a 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  * This condition
1df30 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 70 49   is true when pI
1df40 74 65 6d 20 69 73 20 74 68 65 20 46 52 4f 4d 20  tem is the FROM 
1df50 63 6c 61 75 73 65 20 74 65 72 6d 20 6f 6e 20 74  clause term on t
1df60 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 69 67 68  he.      ** righ
1df70 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20 61  t-hand-side of a
1df80 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20 4a   LEFT or CROSS J
1df90 4f 49 4e 2e 20 20 2a 2f 0a 20 20 20 20 20 20 6d  OIN.  */.      m
1dfa0 50 72 65 72 65 71 20 3d 20 6d 50 72 69 6f 72 3b  Prereq = mPrior;
1dfb0 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f 72  .    }.    prior
1dfc0 4a 6f 69 6e 74 79 70 65 20 3d 20 70 49 74 65 6d  Jointype = pItem
1dfd0 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 23  ->fg.jointype;.#
1dfe0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1dff0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
1e000 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
1e010 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 29  l(pItem->pTab) )
1e020 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  {.      struct S
1e030 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 3b 0a  rcList_item *p;.
1e040 20 20 20 20 20 20 66 6f 72 28 70 3d 26 70 49 74        for(p=&pIt
1e050 65 6d 5b 31 5d 3b 20 70 3c 70 45 6e 64 3b 20 70  em[1]; p<pEnd; p
1e060 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
1e070 20 6d 55 6e 75 73 61 62 6c 65 20 7c 7c 20 28 70   mUnusable || (p
1e080 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
1e090 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53  (JT_LEFT|JT_CROS
1e0a0 53 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  S)) ){.         
1e0b0 20 6d 55 6e 75 73 61 62 6c 65 20 7c 3d 20 73 71   mUnusable |= sq
1e0c0 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61 73  lite3WhereGetMas
1e0d0 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  k(&pWInfo->sMask
1e0e0 53 65 74 2c 20 70 2d 3e 69 43 75 72 73 6f 72 29  Set, p->iCursor)
1e0f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e100 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 77    }.      rc = w
1e110 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
1e120 61 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72  al(pBuilder, mPr
1e130 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29  ereq, mUnusable)
1e140 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
1e150 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1e160 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
1e170 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72 63  /.    {.      rc
1e180 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42   = whereLoopAddB
1e190 74 72 65 65 28 70 42 75 69 6c 64 65 72 2c 20 6d  tree(pBuilder, m
1e1a0 50 72 65 72 65 71 29 3b 0a 20 20 20 20 7d 0a 20  Prereq);.    }. 
1e1b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1e1c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
1e1d0 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 4f   = whereLoopAddO
1e1e0 72 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65  r(pBuilder, mPre
1e1f0 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b  req, mUnusable);
1e200 0a 20 20 20 20 7d 0a 20 20 20 20 6d 50 72 69 6f  .    }.    mPrio
1e210 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b 53  r |= pNew->maskS
1e220 65 6c 66 3b 0a 20 20 20 20 69 66 28 20 72 63 20  elf;.    if( rc 
1e230 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
1e240 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  led ) break;.  }
1e250 0a 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65  ..  whereLoopCle
1e260 61 72 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  ar(db, pNew);.  
1e270 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e280 0a 2a 2a 20 45 78 61 6d 69 6e 65 20 61 20 57 68  .** Examine a Wh
1e290 65 72 65 50 61 74 68 20 28 77 69 74 68 20 74 68  erePath (with th
1e2a0 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68  e addition of th
1e2b0 65 20 65 78 74 72 61 20 57 68 65 72 65 4c 6f 6f  e extra WhereLoo
1e2c0 70 20 6f 66 20 74 68 65 20 35 74 68 0a 2a 2a 20  p of the 5th.** 
1e2d0 70 61 72 61 6d 65 74 65 72 73 29 20 74 6f 20 73  parameters) to s
1e2e0 65 65 20 69 66 20 69 74 20 6f 75 74 70 75 74 73  ee if it outputs
1e2f0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71   rows in the req
1e300 75 65 73 74 65 64 20 4f 52 44 45 52 20 42 59 0a  uested ORDER BY.
1e310 2a 2a 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29  ** (or GROUP BY)
1e320 20 77 69 74 68 6f 75 74 20 72 65 71 75 69 72 69   without requiri
1e330 6e 67 20 61 20 73 65 70 61 72 61 74 65 20 73 6f  ng a separate so
1e340 72 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 52  rt operation.  R
1e350 65 74 75 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a 20  eturn N:.** .** 
1e360 20 20 4e 3e 30 3a 20 20 20 4e 20 74 65 72 6d 73    N>0:   N terms
1e370 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
1e380 20 63 6c 61 75 73 65 20 61 72 65 20 73 61 74 69   clause are sati
1e390 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3d 3d 30 3a  sfied.**   N==0:
1e3a0 20 20 4e 6f 20 74 65 72 6d 73 20 6f 66 20 74 68    No terms of th
1e3b0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1e3c0 65 20 61 72 65 20 73 61 74 69 73 66 69 65 64 0a  e are satisfied.
1e3d0 2a 2a 20 20 20 4e 3c 30 3a 20 20 20 55 6e 6b 6e  **   N<0:   Unkn
1e3e0 6f 77 6e 20 79 65 74 20 68 6f 77 20 6d 61 6e 79  own yet how many
1e3f0 20 74 65 72 6d 73 20 6f 66 20 4f 52 44 45 52 20   terms of ORDER 
1e400 42 59 20 6d 69 67 68 74 20 62 65 20 73 61 74 69  BY might be sati
1e410 73 66 69 65 64 2e 20 20 20 0a 2a 2a 0a 2a 2a 20  sfied.   .**.** 
1e420 4e 6f 74 65 20 74 68 61 74 20 70 72 6f 63 65 73  Note that proces
1e430 73 69 6e 67 20 66 6f 72 20 57 48 45 52 45 5f 47  sing for WHERE_G
1e440 52 4f 55 50 42 59 20 61 6e 64 20 57 48 45 52 45  ROUPBY and WHERE
1e450 5f 44 49 53 54 49 4e 43 54 42 59 20 69 73 20 6e  _DISTINCTBY is n
1e460 6f 74 20 61 73 0a 2a 2a 20 73 74 72 69 63 74 2e  ot as.** strict.
1e470 20 20 57 69 74 68 20 47 52 4f 55 50 20 42 59 20    With GROUP BY 
1e480 61 6e 64 20 44 49 53 54 49 4e 43 54 20 74 68 65  and DISTINCT the
1e490 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d 65 6e   only requiremen
1e4a0 74 20 69 73 20 74 68 61 74 0a 2a 2a 20 65 71 75  t is that.** equ
1e4b0 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 70 70  ivalent rows app
1e4c0 65 61 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ear immediately 
1e4d0 61 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65 20  adjacent to one 
1e4e0 61 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55 50 20  another.  GROUP 
1e4f0 42 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49 4e  BY.** and DISTIN
1e500 43 54 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72  CT do not requir
1e510 65 20 72 6f 77 73 20 74 6f 20 61 70 70 65 61 72  e rows to appear
1e520 20 69 6e 20 61 6e 79 20 70 61 72 74 69 63 75 6c   in any particul
1e530 61 72 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e 67  ar order as long
1e540 0a 2a 2a 20 61 73 20 65 71 75 69 76 61 6c 65 6e  .** as equivalen
1e550 74 20 72 6f 77 73 20 61 72 65 20 67 72 6f 75 70  t rows are group
1e560 65 64 20 74 6f 67 65 74 68 65 72 2e 20 20 54 68  ed together.  Th
1e570 75 73 20 66 6f 72 20 47 52 4f 55 50 20 42 59 20  us for GROUP BY 
1e580 61 6e 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a 20  and DISTINCT.** 
1e590 74 68 65 20 70 4f 72 64 65 72 42 79 20 74 65 72  the pOrderBy ter
1e5a0 6d 73 20 63 61 6e 20 62 65 20 6d 61 74 63 68 65  ms can be matche
1e5b0 64 20 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e 20  d in any order. 
1e5c0 20 57 69 74 68 20 4f 52 44 45 52 20 42 59 2c 20   With ORDER BY, 
1e5d0 74 68 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42 79  the .** pOrderBy
1e5e0 20 74 65 72 6d 73 20 6d 75 73 74 20 62 65 20 6d   terms must be m
1e5f0 61 74 63 68 65 64 20 69 6e 20 73 74 72 69 63 74  atched in strict
1e600 20 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74 20 6f   left-to-right o
1e610 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
1e620 69 38 20 77 68 65 72 65 50 61 74 68 53 61 74 69  i8 wherePathSati
1e630 73 66 69 65 73 4f 72 64 65 72 42 79 28 0a 20 20  sfiesOrderBy(.  
1e640 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
1e650 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45  o,    /* The WHE
1e660 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
1e670 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
1e680 79 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20 42 59  y,   /* ORDER BY
1e690 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72 20   or GROUP BY or 
1e6a0 44 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20  DISTINCT clause 
1e6b0 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57 68  to check */.  Wh
1e6c0 65 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20  erePath *pPath, 
1e6d0 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
1e6e0 50 61 74 68 20 74 6f 20 63 68 65 63 6b 20 2a 2f  Path to check */
1e6f0 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67  .  u16 wctrlFlag
1e700 73 2c 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52  s,       /* WHER
1e710 45 5f 47 52 4f 55 50 42 59 20 6f 72 20 5f 44 49  E_GROUPBY or _DI
1e720 53 54 49 4e 43 54 42 59 20 6f 72 20 5f 4f 52 44  STINCTBY or _ORD
1e730 45 52 42 59 5f 4c 49 4d 49 54 20 2a 2f 0a 20 20  ERBY_LIMIT */.  
1e740 75 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20 20  u16 nLoop,      
1e750 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1e760 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70 50  of entries in pP
1e770 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a  ath->aLoop[] */.
1e780 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 61    WhereLoop *pLa
1e790 73 74 2c 20 20 20 20 20 2f 2a 20 41 64 64 20 74  st,     /* Add t
1e7a0 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 74 6f  his WhereLoop to
1e7b0 20 74 68 65 20 65 6e 64 20 6f 66 20 70 50 61 74   the end of pPat
1e7c0 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20 20  h->aLoop[] */.  
1e7d0 42 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61 73  Bitmask *pRevMas
1e7e0 6b 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61  k     /* OUT: Ma
1e7f0 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70 73  sk of WhereLoops
1e800 20 74 6f 20 72 75 6e 20 69 6e 20 72 65 76 65 72   to run in rever
1e810 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a 20  se order */.){. 
1e820 20 75 38 20 72 65 76 53 65 74 3b 20 20 20 20 20   u8 revSet;     
1e830 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1e840 66 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20 2a  f rev is known *
1e850 2f 0a 20 20 75 38 20 72 65 76 3b 20 20 20 20 20  /.  u8 rev;     
1e860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
1e870 70 6f 73 69 74 65 20 73 6f 72 74 20 6f 72 64 65  posite sort orde
1e880 72 20 2a 2f 0a 20 20 75 38 20 72 65 76 49 64 78  r */.  u8 revIdx
1e890 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1e8a0 49 6e 64 65 78 20 73 6f 72 74 20 6f 72 64 65 72  Index sort order
1e8b0 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65 72   */.  u8 isOrder
1e8c0 44 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20 41  Distinct;   /* A
1e8d0 6c 6c 20 70 72 69 6f 72 20 57 68 65 72 65 4c 6f  ll prior WhereLo
1e8e0 6f 70 73 20 61 72 65 20 6f 72 64 65 72 2d 64 69  ops are order-di
1e8f0 73 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20 64  stinct */.  u8 d
1e900 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b 20  istinctColumns; 
1e910 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
1e920 20 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51 55 45   loop has UNIQUE
1e930 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e   NOT NULL column
1e940 73 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74 63  s */.  u8 isMatc
1e950 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h;           /* 
1e960 69 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73 20  iColumn matches 
1e970 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  a term of the OR
1e980 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
1e990 0a 20 20 75 31 36 20 65 71 4f 70 4d 61 73 6b 3b  .  u16 eqOpMask;
1e9a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
1e9b0 77 65 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65  wed equality ope
1e9c0 72 61 74 6f 72 73 20 2a 2f 0a 20 20 75 31 36 20  rators */.  u16 
1e9d0 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20 20  nKeyCol;        
1e9e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6b    /* Number of k
1e9f0 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70 49  ey columns in pI
1ea00 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e 43  ndex */.  u16 nC
1ea10 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 20  olumn;          
1ea20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
1ea30 6f 66 20 6f 72 64 65 72 65 64 20 63 6f 6c 75 6d  of ordered colum
1ea40 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 20  ns in the index 
1ea50 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72 42  */.  u16 nOrderB
1ea60 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y;         /* Nu
1ea70 6d 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74 68  mber terms in th
1ea80 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
1ea90 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f 70  e */.  int iLoop
1eaa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1eab0 49 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c 6f  Index of WhereLo
1eac0 6f 70 20 69 6e 20 70 50 61 74 68 20 62 65 69 6e  op in pPath bein
1ead0 67 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20  g processed */. 
1eae0 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
1eaf0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
1eb00 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
1eb10 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20   iCur;          
1eb20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
1eb30 62 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74 20  ber for current 
1eb40 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20 69  WhereLoop */.  i
1eb50 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  nt iColumn;     
1eb60 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e       /* A column
1eb70 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74   number within t
1eb80 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20 57  able iCur */.  W
1eb90 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 20  hereLoop *pLoop 
1eba0 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20  = 0; /* Current 
1ebb0 57 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67 20  WhereLoop being 
1ebc0 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20 20  processed. */.  
1ebd0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
1ebe0 3b 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c  ;     /* A singl
1ebf0 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
1ec00 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
1ec10 45 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20 20  Expr *pOBExpr;  
1ec20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70 72        /* An expr
1ec30 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  ession from the 
1ec40 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1ec50 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  */.  CollSeq *pC
1ec60 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43 4f  oll;       /* CO
1ec70 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20 66  LLATE function f
1ec80 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59 20  rom an ORDER BY 
1ec90 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20  clause term */. 
1eca0 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20   Index *pIndex; 
1ecb0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
1ecc0 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
1ecd0 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 73  ith pLoop */.  s
1ece0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57 49  qlite3 *db = pWI
1ecf0 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  nfo->pParse->db;
1ed00 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
1ed10 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 69  nnection */.  Bi
1ed20 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30 3b  tmask obSat = 0;
1ed30 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 4f      /* Mask of O
1ed40 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 73 61  RDER BY terms sa
1ed50 74 69 73 66 69 65 64 20 73 6f 20 66 61 72 20 2a  tisfied so far *
1ed60 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44 6f  /.  Bitmask obDo
1ed70 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  ne;       /* Mas
1ed80 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20 42  k of all ORDER B
1ed90 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69 74  Y terms */.  Bit
1eda0 6d 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69 6e  mask orderDistin
1edb0 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73 6b  ctMask;  /* Mask
1edc0 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72 64   of all well-ord
1edd0 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20 20  ered loops */.  
1ede0 42 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20 20  Bitmask ready;  
1edf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1ee00 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f 6f  ask of inner loo
1ee10 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ps */..  /*.  **
1ee20 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65 72   We say the Wher
1ee30 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72 6f  eLoop is "one-ro
1ee40 77 22 20 69 66 20 69 74 20 67 65 6e 65 72 61 74  w" if it generat
1ee50 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20  es no more than 
1ee60 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20  one.  ** row of 
1ee70 6f 75 74 70 75 74 2e 20 20 41 20 57 68 65 72 65  output.  A Where
1ee80 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77 20  Loop is one-row 
1ee90 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f  if all of the fo
1eea0 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
1eeb0 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c 20  :.  **  (a) All 
1eec0 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d 61  index columns ma
1eed0 74 63 68 20 77 69 74 68 20 57 48 45 52 45 5f 43  tch with WHERE_C
1eee0 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20 20  OLUMN_EQ..  **  
1eef0 28 62 29 20 54 68 65 20 69 6e 64 65 78 20 69 73  (b) The index is
1ef00 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e 79   unique.  ** Any
1ef10 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68 20   WhereLoop with 
1ef20 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  an WHERE_COLUMN_
1ef30 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  EQ constraint on
1ef40 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f 6e   the rowid is on
1ef50 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65 72  e-row..  ** Ever
1ef60 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c  y one-row WhereL
1ef70 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74 68  oop will have th
1ef80 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20 62  e WHERE_ONEROW b
1ef90 69 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61 67  it set in wsFlag
1efa0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65 20  s..  **.  ** We 
1efb0 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f 6f  say the WhereLoo
1efc0 70 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73 74  p is "order-dist
1efd0 69 6e 63 74 22 20 69 66 20 74 68 65 20 73 65 74  inct" if the set
1efe0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d   of columns from
1eff0 0a 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72 65  .  ** that Where
1f000 4c 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69 6e  Loop that are in
1f010 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1f020 61 75 73 65 20 61 72 65 20 64 69 66 66 65 72 65  ause are differe
1f030 6e 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20 2a  nt for every.  *
1f040 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68 65  * row of the Whe
1f050 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20 6f  reLoop.  Every o
1f060 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f 70  ne-row WhereLoop
1f070 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   is automaticall
1f080 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69 73  y.  ** order-dis
1f090 74 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72 65  tinct.   A Where
1f0a0 4c 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e 6f  Loop that has no
1f0b0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
1f0c0 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
1f0d0 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64 65    ** is not orde
1f0e0 72 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20 62  r-distinct. To b
1f0f0 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63 74  e order-distinct
1f100 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74 68   is not quite th
1f110 65 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67 0a  e same as being.
1f120 20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e 63    ** UNIQUE sinc
1f130 65 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75 6d  e a UNIQUE colum
1f140 6e 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20 68  n or index can h
1f150 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77  ave multiple row
1f160 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72 65  s that .  ** are
1f170 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20 76   NULL and NULL v
1f180 61 6c 75 65 73 20 61 72 65 20 65 71 75 69 76 61  alues are equiva
1f190 6c 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75 72  lent for the pur
1f1a0 70 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64 69  pose of order-di
1f1b0 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f 20  stinct..  ** To 
1f1c0 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  be order-distinc
1f1d0 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6d  t, the columns m
1f1e0 75 73 74 20 62 65 20 55 4e 49 51 55 45 20 61 6e  ust be UNIQUE an
1f1f0 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a 2a  d NOT NULL..  **
1f200 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20  .  ** The rowid 
1f210 66 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20 61  for a table is a
1f220 6c 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e 64  lways UNIQUE and
1f230 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68 65   NOT NULL so whe
1f240 6e 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20 72  never the.  ** r
1f250 6f 77 69 64 20 61 70 70 65 61 72 73 20 69 6e 20  owid appears in 
1f260 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
1f270 75 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70  use, the corresp
1f280 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  onding WhereLoop
1f290 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74   is.  ** automat
1f2a0 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69 73  ically order-dis
1f2b0 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20 61  tinct..  */..  a
1f2c0 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21  ssert( pOrderBy!
1f2d0 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f 6f  =0 );.  if( nLoo
1f2e0 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f  p && Optimizatio
1f2f0 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51  nDisabled(db, SQ
1f300 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a  LITE_OrderByIdxJ
1f310 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b  oin) ) return 0;
1f320 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70  ..  nOrderBy = p
1f330 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
1f340 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72 64    testcase( nOrd
1f350 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  erBy==BMS-1 );. 
1f360 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42 4d   if( nOrderBy>BM
1f370 53 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20  S-1 ) return 0; 
1f380 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69 6d   /* Cannot optim
1f390 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67 65  ize overly large
1f3a0 20 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20 20   ORDER BYs */.  
1f3b0 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
1f3c0 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d 20  = 1;.  obDone = 
1f3d0 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42 79  MASKBIT(nOrderBy
1f3e0 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73 74  )-1;.  orderDist
1f3f0 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  inctMask = 0;.  
1f400 72 65 61 64 79 20 3d 20 30 3b 0a 20 20 65 71 4f  ready = 0;.  eqO
1f410 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 20 7c 20  pMask = WO_EQ | 
1f420 57 4f 5f 49 53 20 7c 20 57 4f 5f 49 53 4e 55 4c  WO_IS | WO_ISNUL
1f430 4c 3b 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c  L;.  if( wctrlFl
1f440 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45  ags & WHERE_ORDE
1f450 52 42 59 5f 4c 49 4d 49 54 20 29 20 65 71 4f 70  RBY_LIMIT ) eqOp
1f460 4d 61 73 6b 20 7c 3d 20 57 4f 5f 49 4e 3b 0a 20  Mask |= WO_IN;. 
1f470 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 73   for(iLoop=0; is
1f480 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 26 26  OrderDistinct &&
1f490 20 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26 26   obSat<obDone &&
1f4a0 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20 69   iLoop<=nLoop; i
1f4b0 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Loop++){.    if(
1f4c0 20 69 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64 79   iLoop>0 ) ready
1f4d0 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53   |= pLoop->maskS
1f4e0 65 6c 66 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f  elf;.    if( iLo
1f4f0 6f 70 3c 6e 4c 6f 6f 70 20 29 7b 0a 20 20 20 20  op<nLoop ){.    
1f500 20 20 70 4c 6f 6f 70 20 3d 20 70 50 61 74 68 2d    pLoop = pPath-
1f510 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20  >aLoop[iLoop];. 
1f520 20 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c       if( wctrlFl
1f530 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45  ags & WHERE_ORDE
1f540 52 42 59 5f 4c 49 4d 49 54 20 29 20 63 6f 6e 74  RBY_LIMIT ) cont
1f550 69 6e 75 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  inue;.    }else{
1f560 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  .      pLoop = p
1f570 4c 61 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Last;.    }.    
1f580 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
1f590 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
1f5a0 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20 20  ALTABLE ){.     
1f5b0 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76 74   if( pLoop->u.vt
1f5c0 61 62 2e 69 73 4f 72 64 65 72 65 64 20 29 20 6f  ab.isOrdered ) o
1f5d0 62 53 61 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a 20  bSat = obDone;. 
1f5e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f5f0 7d 0a 20 20 20 20 69 43 75 72 20 3d 20 70 57 49  }.    iCur = pWI
1f600 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
1f610 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43  [pLoop->iTab].iC
1f620 75 72 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d  ursor;..    /* M
1f630 61 72 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44 45  ark off any ORDE
1f640 52 20 42 59 20 74 65 72 6d 20 58 20 74 68 61 74  R BY term X that
1f650 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   is a column in 
1f660 74 68 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20  the table of.   
1f670 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
1f680 6c 6f 6f 70 20 66 6f 72 20 77 68 69 63 68 20 74  loop for which t
1f690 68 65 72 65 20 69 73 20 74 65 72 6d 20 69 6e 20  here is term in 
1f6a0 74 68 65 20 57 48 45 52 45 0a 20 20 20 20 2a 2a  the WHERE.    **
1f6b0 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66   clause of the f
1f6c0 6f 72 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72  orm X IS NULL or
1f6d0 20 58 3d 3f 20 74 68 61 74 20 72 65 66 65 72 65   X=? that refere
1f6e0 6e 63 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20  nce only outer. 
1f6f0 20 20 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20     ** loops..   
1f700 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
1f710 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
1f720 29 7b 0a 20 20 20 20 20 20 69 66 28 20 4d 41 53  ){.      if( MAS
1f730 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20  KBIT(i) & obSat 
1f740 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1f750 20 20 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69    pOBExpr = sqli
1f760 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
1f770 74 65 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  te(pOrderBy->a[i
1f780 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
1f790 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21  if( pOBExpr->op!
1f7a0 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e  =TK_COLUMN ) con
1f7b0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
1f7c0 20 70 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65   pOBExpr->iTable
1f7d0 21 3d 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  !=iCur ) continu
1f7e0 65 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  e;.      pTerm =
1f7f0 20 73 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e   sqlite3WhereFin
1f800 64 54 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73  dTerm(&pWInfo->s
1f810 57 43 2c 20 69 43 75 72 2c 20 70 4f 42 45 78 70  WC, iCur, pOBExp
1f820 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  r->iColumn,.    
1f830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f840 20 20 20 7e 72 65 61 64 79 2c 20 65 71 4f 70 4d     ~ready, eqOpM
1f850 61 73 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ask, 0);.      i
1f860 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f  f( pTerm==0 ) co
1f870 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
1f880 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  ( (pTerm->eOpera
1f890 74 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  tor&(WO_EQ|WO_IS
1f8a0 29 29 21 3d 30 20 26 26 20 70 4f 42 45 78 70 72  ))!=0 && pOBExpr
1f8b0 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a  ->iColumn>=0 ){.
1f8c0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
1f8d0 61 72 20 2a 7a 31 2c 20 2a 7a 32 3b 0a 20 20 20  ar *z1, *z2;.   
1f8e0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
1f8f0 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
1f900 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
1f910 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
1f920 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
1f930 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
1f940 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
1f950 6c 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20  l;.        z1 = 
1f960 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  pColl->zName;.  
1f970 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
1f980 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1f990 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c  (pWInfo->pParse,
1f9a0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3b 0a   pTerm->pExpr);.
1f9b0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
1f9c0 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d  ll ) pColl = db-
1f9d0 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
1f9e0 20 20 20 20 7a 32 20 3d 20 70 43 6f 6c 6c 2d 3e      z2 = pColl->
1f9f0 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69  zName;.        i
1fa00 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1fa10 70 28 7a 31 2c 20 7a 32 29 21 3d 30 20 29 20 63  p(z1, z2)!=0 ) c
1fa20 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1fa30 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
1fa40 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ->pExpr->op==TK_
1fa50 49 53 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  IS );.      }.  
1fa60 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41 53      obSat |= MAS
1fa70 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 7d 0a 0a  KBIT(i);.    }..
1fa80 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d 3e      if( (pLoop->
1fa90 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
1faa0 4f 4e 45 52 4f 57 29 3d 3d 30 20 29 7b 0a 20 20  ONEROW)==0 ){.  
1fab0 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77      if( pLoop->w
1fac0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
1fad0 50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  PK ){.        pI
1fae0 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  ndex = 0;.      
1faf0 20 20 6e 4b 65 79 43 6f 6c 20 3d 20 30 3b 0a 20    nKeyCol = 0;. 
1fb00 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d         nColumn =
1fb10 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
1fb20 69 66 28 20 28 70 49 6e 64 65 78 20 3d 20 70 4c  if( (pIndex = pL
1fb30 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  oop->u.btree.pIn
1fb40 64 65 78 29 3d 3d 30 20 7c 7c 20 70 49 6e 64 65  dex)==0 || pInde
1fb50 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 7b  x->bUnordered ){
1fb60 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1fb70 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
1fb80 20 20 20 20 20 20 20 20 6e 4b 65 79 43 6f 6c 20          nKeyCol 
1fb90 3d 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f  = pIndex->nKeyCo
1fba0 6c 3b 0a 20 20 20 20 20 20 20 20 6e 43 6f 6c 75  l;.        nColu
1fbb0 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  mn = pIndex->nCo
1fbc0 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  lumn;.        as
1fbd0 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3d 3d 6e  sert( nColumn==n
1fbe0 4b 65 79 43 6f 6c 2b 31 20 7c 7c 20 21 48 61 73  KeyCol+1 || !Has
1fbf0 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54  Rowid(pIndex->pT
1fc00 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20 20 20  able) );.       
1fc10 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d   assert( pIndex-
1fc20 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d  >aiColumn[nColum
1fc30 6e 2d 31 5d 3d 3d 58 4e 5f 52 4f 57 49 44 0a 20  n-1]==XN_ROWID. 
1fc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc50 20 20 20 20 20 20 20 20 20 7c 7c 20 21 48 61 73           || !Has
1fc60 52 6f 77 69 64 28 70 49 6e 64 65 78 2d 3e 70 54  Rowid(pIndex->pT
1fc70 61 62 6c 65 29 29 3b 0a 20 20 20 20 20 20 20 20  able));.        
1fc80 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
1fc90 3d 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28  = IsUniqueIndex(
1fca0 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 7d  pIndex);.      }
1fcb0 0a 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20  ..      /* Loop 
1fcc0 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6c 75  through all colu
1fcd0 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  mns of the index
1fce0 20 61 6e 64 20 64 65 61 6c 20 77 69 74 68 20 74   and deal with t
1fcf0 68 65 20 6f 6e 65 73 0a 20 20 20 20 20 20 2a 2a  he ones.      **
1fd00 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 63 6f   that are not co
1fd10 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20  nstrained by == 
1fd20 6f 72 20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a  or IN..      */.
1fd30 20 20 20 20 20 20 72 65 76 20 3d 20 72 65 76 53        rev = revS
1fd40 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 69  et = 0;.      di
1fd50 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20  stinctColumns = 
1fd60 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  0;.      for(j=0
1fd70 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  ; j<nColumn; j++
1fd80 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 62 4f  ){.        u8 bO
1fd90 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 54 72 75 65  nce = 1; /* True
1fda0 20 74 6f 20 72 75 6e 20 74 68 65 20 4f 52 44 45   to run the ORDE
1fdb0 52 20 42 59 20 73 65 61 72 63 68 20 6c 6f 6f 70  R BY search loop
1fdc0 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 61 73 73   */..        ass
1fdd0 65 72 74 28 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75  ert( j>=pLoop->u
1fde0 2e 62 74 72 65 65 2e 6e 45 71 20 0a 20 20 20 20  .btree.nEq .    
1fdf0 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 6f 6f          || (pLoo
1fe00 70 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 30 29  p->aLTerm[j]==0)
1fe10 3d 3d 28 6a 3c 70 4c 6f 6f 70 2d 3e 6e 53 6b 69  ==(j<pLoop->nSki
1fe20 70 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  p).        );.  
1fe30 20 20 20 20 20 20 69 66 28 20 6a 3c 70 4c 6f 6f        if( j<pLoo
1fe40 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 26  p->u.btree.nEq &
1fe50 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 6e 53 6b 69  & j>=pLoop->nSki
1fe60 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  p ){.          u
1fe70 31 36 20 65 4f 70 20 3d 20 70 4c 6f 6f 70 2d 3e  16 eOp = pLoop->
1fe80 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 65 4f 70 65 72  aLTerm[j]->eOper
1fe90 61 74 6f 72 3b 0a 0a 20 20 20 20 20 20 20 20 20  ator;..         
1fea0 20 2f 2a 20 53 6b 69 70 20 6f 76 65 72 20 3d 3d   /* Skip over ==
1feb0 20 61 6e 64 20 49 53 20 61 6e 64 20 49 53 4e 55   and IS and ISNU
1fec0 4c 4c 20 74 65 72 6d 73 2e 20 20 28 41 6c 73 6f  LL terms.  (Also
1fed0 20 73 6b 69 70 20 49 4e 20 74 65 72 6d 73 20 77   skip IN terms w
1fee0 68 65 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hen.          **
1fef0 20 64 6f 69 6e 67 20 57 48 45 52 45 5f 4f 52 44   doing WHERE_ORD
1ff00 45 52 42 59 5f 4c 49 4d 49 54 20 70 72 6f 63 65  ERBY_LIMIT proce
1ff10 73 73 69 6e 67 29 2e 20 0a 20 20 20 20 20 20 20  ssing). .       
1ff20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
1ff30 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
1ff40 74 20 74 65 72 6d 20 69 73 20 61 20 63 6f 6c 75  t term is a colu
1ff50 6d 6e 20 6f 66 20 61 6e 20 28 28 3f 2c 3f 29 20  mn of an ((?,?) 
1ff60 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29 29 20  IN (SELECT...)) 
1ff70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78  .          ** ex
1ff80 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 77 68 69  pression for whi
1ff90 63 68 20 74 68 65 20 53 45 4c 45 43 54 20 72 65  ch the SELECT re
1ffa0 74 75 72 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20  turns more than 
1ffb0 6f 6e 65 20 63 6f 6c 75 6d 6e 2c 0a 20 20 20 20  one column,.    
1ffc0 20 20 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 74        ** check t
1ffd0 68 61 74 20 69 74 20 69 73 20 74 68 65 20 6f 6e  hat it is the on
1ffe0 6c 79 20 63 6f 6c 75 6d 6e 20 75 73 65 64 20 62  ly column used b
1fff0 79 20 74 68 69 73 20 6c 6f 6f 70 2e 20 4f 74 68  y this loop. Oth
20000 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 20 20  erwise,.        
20010 20 20 2a 2a 20 69 66 20 69 74 20 69 73 20 6f 6e    ** if it is on
20020 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  e of two or more
20030 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 63 6f  , none of the co
20040 6c 75 6d 6e 73 20 63 61 6e 20 62 65 0a 20 20 20  lumns can be.   
20050 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64         ** consid
20060 65 72 65 64 20 74 6f 20 6d 61 74 63 68 20 61 6e  ered to match an
20070 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 2e 20   ORDER BY term. 
20080 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
20090 28 20 28 65 4f 70 20 26 20 65 71 4f 70 4d 61 73  ( (eOp & eqOpMas
200a0 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
200b0 20 20 20 20 20 69 66 28 20 65 4f 70 20 26 20 57       if( eOp & W
200c0 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  O_ISNULL ){.    
200d0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
200e0 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  se( isOrderDisti
200f0 6e 63 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  nct );.         
20100 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74       isOrderDist
20110 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  inct = 0;.      
20120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20130 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 0a      continue;  .
20140 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
20150 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20  if( eOp & WO_IN 
20160 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 45  ){.            E
20170 78 70 72 20 2a 70 58 20 3d 20 70 4c 6f 6f 70 2d  xpr *pX = pLoop-
20180 3e 61 4c 54 65 72 6d 5b 6a 5d 2d 3e 70 45 78 70  >aLTerm[j]->pExp
20190 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  r;.            f
201a0 6f 72 28 69 3d 6a 2b 31 3b 20 69 3c 70 4c 6f 6f  or(i=j+1; i<pLoo
201b0 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 20  p->u.btree.nEq; 
201c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
201d0 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 61      if( pLoop->a
201e0 4c 54 65 72 6d 5b 69 5d 2d 3e 70 45 78 70 72 3d  LTerm[i]->pExpr=
201f0 3d 70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =pX ){.         
20200 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
20210 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d  pLoop->aLTerm[i]
20220 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
20230 5f 49 4e 29 20 29 3b 0a 20 20 20 20 20 20 20 20  _IN) );.        
20240 20 20 20 20 20 20 20 20 62 4f 6e 63 65 20 3d 20          bOnce = 
20250 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
20260 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
20270 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20280 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20290 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20    }.        }.. 
202a0 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20 74 68         /* Get th
202b0 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
202c0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 28 69 43  in the table (iC
202d0 6f 6c 75 6d 6e 29 20 61 6e 64 20 73 6f 72 74 20  olumn) and sort 
202e0 6f 72 64 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  order.        **
202f0 20 28 72 65 76 49 64 78 29 20 66 6f 72 20 74 68   (revIdx) for th
20300 65 20 6a 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e j-th column of
20310 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
20320 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
20330 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
20340 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d         iColumn =
20350 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
20360 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  n[j];.          
20370 72 65 76 49 64 78 20 3d 20 70 49 6e 64 65 78 2d  revIdx = pIndex-
20380 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a  >aSortOrder[j];.
20390 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
203a0 6f 6c 75 6d 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70  olumn==pIndex->p
203b0 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 20 69  Table->iPKey ) i
203c0 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
203d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
203e0 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
203f0 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20 20 20  XN_ROWID;.      
20400 20 20 20 20 72 65 76 49 64 78 20 3d 20 30 3b 0a      revIdx = 0;.
20410 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
20420 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e 73 74     /* An unconst
20430 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20 74 68  rained column th
20440 61 74 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  at might be NULL
20450 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
20460 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68 65 72  .        ** Wher
20470 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77 65 6c  eLoop is not wel
20480 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20 20 20 20  l-ordered.      
20490 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
204a0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
204b0 0a 20 20 20 20 20 20 20 20 20 26 26 20 69 43 6f  .         && iCo
204c0 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20 20 20  lumn>=0.        
204d0 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e 75 2e   && j>=pLoop->u.
204e0 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20 20 20  btree.nEq.      
204f0 20 20 20 26 26 20 70 49 6e 64 65 78 2d 3e 70 54     && pIndex->pT
20500 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75  able->aCol[iColu
20510 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 0a 20  mn].notNull==0. 
20520 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
20530 20 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69      isOrderDisti
20540 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nct = 0;.       
20550 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46   }..        /* F
20560 69 6e 64 20 74 68 65 20 4f 52 44 45 52 20 42 59  ind the ORDER BY
20570 20 74 65 72 6d 20 74 68 61 74 20 63 6f 72 72 65   term that corre
20580 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 6a 2d  sponds to the j-
20590 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  th column.      
205a0 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65    ** of the inde
205b0 78 20 61 6e 64 20 6d 61 72 6b 20 74 68 61 74 20  x and mark that 
205c0 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 6f 66  ORDER BY term of
205d0 66 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  f .        */.  
205e0 20 20 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20        isMatch = 
205f0 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  0;.        for(i
20600 3d 30 3b 20 62 4f 6e 63 65 20 26 26 20 69 3c 6e  =0; bOnce && i<n
20610 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
20620 20 20 20 20 20 20 20 20 20 69 66 28 20 4d 41 53           if( MAS
20630 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61 74 20  KBIT(i) & obSat 
20640 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
20650 20 20 20 20 20 20 70 4f 42 45 78 70 72 20 3d 20        pOBExpr = 
20660 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
20670 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42 79 2d  ollate(pOrderBy-
20680 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
20690 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
206a0 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
206b0 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29 3b 0a  HERE_GROUPBY );.
206c0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
206d0 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  se( wctrlFlags &
206e0 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42   WHERE_DISTINCTB
206f0 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Y );.          i
20700 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  f( (wctrlFlags &
20710 20 28 57 48 45 52 45 5f 47 52 4f 55 50 42 59 7c   (WHERE_GROUPBY|
20720 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59  WHERE_DISTINCTBY
20730 29 29 3d 3d 30 20 29 20 62 4f 6e 63 65 20 3d 20  ))==0 ) bOnce = 
20740 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  0;.          if(
20750 20 69 43 6f 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29   iColumn>=(-1) )
20760 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
20770 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54  ( pOBExpr->op!=T
20780 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69  K_COLUMN ) conti
20790 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
207a0 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e 69 54   if( pOBExpr->iT
207b0 61 62 6c 65 21 3d 69 43 75 72 20 29 20 63 6f 6e  able!=iCur ) con
207c0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
207d0 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d 3e     if( pOBExpr->
207e0 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  iColumn!=iColumn
207f0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
20800 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
20810 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
20820 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
20830 28 70 4f 42 45 78 70 72 2c 70 49 6e 64 65 78 2d  (pOBExpr,pIndex-
20840 3e 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a 5d 2e  >aColExpr->a[j].
20850 70 45 78 70 72 2c 69 43 75 72 29 20 29 7b 0a 20  pExpr,iCur) ){. 
20860 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
20870 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
20880 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
20890 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
208a0 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
208b0 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
208c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
208d0 53 65 71 28 70 57 49 6e 66 6f 2d 3e 70 50 61 72  Seq(pWInfo->pPar
208e0 73 65 2c 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  se, pOrderBy->a[
208f0 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
20900 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
20910 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e  l ) pColl = db->
20920 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
20930 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
20940 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
20950 3e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e  >zName, pIndex->
20960 61 7a 43 6f 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20  azColl[j])!=0 ) 
20970 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
20980 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
20990 69 73 4d 61 74 63 68 20 3d 20 31 3b 0a 20 20 20  isMatch = 1;.   
209a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
209b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
209c0 69 66 28 20 69 73 4d 61 74 63 68 20 26 26 20 28  if( isMatch && (
209d0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
209e0 52 45 5f 47 52 4f 55 50 42 59 29 3d 3d 30 20 29  RE_GROUPBY)==0 )
209f0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  {.          /* M
20a00 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 6f 72  ake sure the sor
20a10 74 20 6f 72 64 65 72 20 69 73 20 63 6f 6d 70 61  t order is compa
20a20 74 69 62 6c 65 20 69 6e 20 61 6e 20 4f 52 44 45  tible in an ORDE
20a30 52 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20  R BY clause..   
20a40 20 20 20 20 20 20 20 2a 2a 20 53 6f 72 74 20 6f         ** Sort o
20a50 72 64 65 72 20 69 73 20 69 72 72 65 6c 65 76 61  rder is irreleva
20a60 6e 74 20 66 6f 72 20 61 20 47 52 4f 55 50 20 42  nt for a GROUP B
20a70 59 20 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20  Y clause. */.   
20a80 20 20 20 20 20 20 20 69 66 28 20 72 65 76 53 65         if( revSe
20a90 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
20aa0 20 69 66 28 20 28 72 65 76 20 5e 20 72 65 76 49   if( (rev ^ revI
20ab0 64 78 29 21 3d 70 4f 72 64 65 72 42 79 2d 3e 61  dx)!=pOrderBy->a
20ac0 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 20 29 20  [i].sortOrder ) 
20ad0 69 73 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20  isMatch = 0;.   
20ae0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
20af0 20 20 20 20 20 20 20 20 20 20 72 65 76 20 3d 20            rev = 
20b00 72 65 76 49 64 78 20 5e 20 70 4f 72 64 65 72 42  revIdx ^ pOrderB
20b10 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
20b20 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  r;.            i
20b30 66 28 20 72 65 76 20 29 20 2a 70 52 65 76 4d 61  f( rev ) *pRevMa
20b40 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 4c  sk |= MASKBIT(iL
20b50 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  oop);.          
20b60 20 20 72 65 76 53 65 74 20 3d 20 31 3b 0a 20 20    revSet = 1;.  
20b70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20b80 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
20b90 69 73 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  isMatch ){.     
20ba0 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
20bb0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
20bc0 20 20 74 65 73 74 63 61 73 65 28 20 64 69 73 74    testcase( dist
20bd0 69 6e 63 74 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29  inctColumns==0 )
20be0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69  ;.            di
20bf0 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 20 3d 20  stinctColumns = 
20c00 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
20c10 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20 7c           obSat |
20c20 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20  = MASKBIT(i);.  
20c30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
20c40 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 6d 61 74         /* No mat
20c50 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  ch found */.    
20c60 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 7c        if( j==0 |
20c70 7c 20 6a 3c 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20  | j<nKeyCol ){. 
20c80 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
20c90 61 73 65 28 20 69 73 4f 72 64 65 72 44 69 73 74  ase( isOrderDist
20ca0 69 6e 63 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  inct!=0 );.     
20cb0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69         isOrderDi
20cc0 73 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20  stinct = 0;.    
20cd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20ce0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
20cf0 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e   }.      } /* en
20d00 64 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  d Loop over all 
20d10 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f  index columns */
20d20 0a 20 20 20 20 20 20 69 66 28 20 64 69 73 74 69  .      if( disti
20d30 6e 63 74 43 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20  nctColumns ){.  
20d40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
20d50 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 3d  isOrderDistinct=
20d60 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 73  =0 );.        is
20d70 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
20d80 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
20d90 20 2f 2a 20 65 6e 64 2d 69 66 20 6e 6f 74 20 6f   /* end-if not o
20da0 6e 65 2d 72 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f  ne-row */..    /
20db0 2a 20 4d 61 72 6b 20 6f 66 66 20 61 6e 79 20 6f  * Mark off any o
20dc0 74 68 65 72 20 4f 52 44 45 52 20 42 59 20 74 65  ther ORDER BY te
20dd0 72 6d 73 20 74 68 61 74 20 72 65 66 65 72 65 6e  rms that referen
20de0 63 65 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20  ce pLoop */.    
20df0 69 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69  if( isOrderDisti
20e00 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 6f 72 64  nct ){.      ord
20e10 65 72 44 69 73 74 69 6e 63 74 4d 61 73 6b 20 7c  erDistinctMask |
20e20 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  = pLoop->maskSel
20e30 66 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  f;.      for(i=0
20e40 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
20e50 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72  +){.        Expr
20e60 20 2a 70 3b 0a 20 20 20 20 20 20 20 20 42 69 74   *p;.        Bit
20e70 6d 61 73 6b 20 6d 54 65 72 6d 3b 0a 20 20 20 20  mask mTerm;.    
20e80 20 20 20 20 69 66 28 20 4d 41 53 4b 42 49 54 28      if( MASKBIT(
20e90 69 29 20 26 20 6f 62 53 61 74 20 29 20 63 6f 6e  i) & obSat ) con
20ea0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 70  tinue;.        p
20eb0 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
20ec0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
20ed0 20 6d 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33   mTerm = sqlite3
20ee0 57 68 65 72 65 45 78 70 72 55 73 61 67 65 28 26  WhereExprUsage(&
20ef0 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74  pWInfo->sMaskSet
20f00 2c 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ,p);.        if(
20f10 20 6d 54 65 72 6d 3d 3d 30 20 26 26 20 21 73 71   mTerm==0 && !sq
20f20 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
20f30 61 6e 74 28 70 29 20 29 20 63 6f 6e 74 69 6e 75  ant(p) ) continu
20f40 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  e;.        if( (
20f50 6d 54 65 72 6d 26 7e 6f 72 64 65 72 44 69 73 74  mTerm&~orderDist
20f60 69 6e 63 74 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a  inctMask)==0 ){.
20f70 20 20 20 20 20 20 20 20 20 20 6f 62 53 61 74 20            obSat 
20f80 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20  |= MASKBIT(i);. 
20f90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
20fa0 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e  .    }.  } /* En
20fb0 64 20 74 68 65 20 6c 6f 6f 70 20 6f 76 65 72 20  d the loop over 
20fc0 61 6c 6c 20 57 68 65 72 65 4c 6f 6f 70 73 20 66  all WhereLoops f
20fd0 72 6f 6d 20 6f 75 74 65 72 2d 6d 6f 73 74 20 64  rom outer-most d
20fe0 6f 77 6e 20 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73  own to inner-mos
20ff0 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62 53 61 74  t */.  if( obSat
21000 3d 3d 6f 62 44 6f 6e 65 20 29 20 72 65 74 75 72  ==obDone ) retur
21010 6e 20 28 69 38 29 6e 4f 72 64 65 72 42 79 3b 0a  n (i8)nOrderBy;.
21020 20 20 69 66 28 20 21 69 73 4f 72 64 65 72 44 69    if( !isOrderDi
21030 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 66 6f  stinct ){.    fo
21040 72 28 69 3d 6e 4f 72 64 65 72 42 79 2d 31 3b 20  r(i=nOrderBy-1; 
21050 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  i>0; i--){.     
21060 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 4d 41 53   Bitmask m = MAS
21070 4b 42 49 54 28 69 29 20 2d 20 31 3b 0a 20 20 20  KBIT(i) - 1;.   
21080 20 20 20 69 66 28 20 28 6f 62 53 61 74 26 6d 29     if( (obSat&m)
21090 3d 3d 6d 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==m ) return i;.
210a0 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
210b0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
210c0 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49   -1;.}.../*.** I
210d0 66 20 74 68 65 20 57 48 45 52 45 5f 47 52 4f 55  f the WHERE_GROU
210e0 50 42 59 20 66 6c 61 67 20 69 73 20 73 65 74 20  PBY flag is set 
210f0 69 6e 20 74 68 65 20 6d 61 73 6b 20 70 61 73 73  in the mask pass
21100 65 64 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65  ed to sqlite3Whe
21110 72 65 42 65 67 69 6e 28 29 2c 0a 2a 2a 20 74 68  reBegin(),.** th
21120 65 20 70 6c 61 6e 6e 65 72 20 61 73 73 75 6d 65  e planner assume
21130 73 20 74 68 61 74 20 74 68 65 20 73 70 65 63 69  s that the speci
21140 66 69 65 64 20 70 4f 72 64 65 72 42 79 20 6c 69  fied pOrderBy li
21150 73 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61  st is actually a
21160 20 47 52 4f 55 50 0a 2a 2a 20 42 59 20 63 6c 61   GROUP.** BY cla
21170 75 73 65 20 2d 20 61 6e 64 20 73 6f 20 61 6e 79  use - and so any
21180 20 6f 72 64 65 72 20 74 68 61 74 20 67 72 6f 75   order that grou
21190 70 73 20 72 6f 77 73 20 61 73 20 72 65 71 75 69  ps rows as requi
211a0 72 65 64 20 73 61 74 69 73 66 69 65 73 20 74 68  red satisfies th
211b0 65 0a 2a 2a 20 72 65 71 75 65 73 74 2e 0a 2a 2a  e.** request..**
211c0 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 6e  .** Normally, in
211d0 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73   this case it is
211e0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
211f0 72 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  r the caller to 
21200 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 77 68 65  determine.** whe
21210 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
21220 72 6f 77 73 20 61 72 65 20 72 65 61 6c 6c 79 20  rows are really 
21230 62 65 69 6e 67 20 64 65 6c 69 76 65 72 65 64 20  being delivered 
21240 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2c  in sorted order,
21250 20 6f 72 0a 2a 2a 20 6a 75 73 74 20 69 6e 20 73   or.** just in s
21260 6f 6d 65 20 6f 74 68 65 72 20 6f 72 64 65 72 20  ome other order 
21270 74 68 61 74 20 70 72 6f 76 69 64 65 73 20 74 68  that provides th
21280 65 20 72 65 71 75 69 72 65 64 20 67 72 6f 75 70  e required group
21290 69 6e 67 2e 20 48 6f 77 65 76 65 72 2c 0a 2a 2a  ing. However,.**
212a0 20 69 66 20 74 68 65 20 57 48 45 52 45 5f 53 4f   if the WHERE_SO
212b0 52 54 42 59 47 52 4f 55 50 20 66 6c 61 67 20 69  RTBYGROUP flag i
212c0 73 20 61 6c 73 6f 20 70 61 73 73 65 64 20 74 6f  s also passed to
212d0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
212e0 69 6e 28 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  in(), then.** th
212f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
21300 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  be called on the
21310 20 72 65 74 75 72 6e 65 64 20 57 68 65 72 65 49   returned WhereI
21320 6e 66 6f 20 6f 62 6a 65 63 74 2e 20 49 74 20 72  nfo object. It r
21330 65 74 75 72 6e 73 0a 2a 2a 20 74 72 75 65 20 69  eturns.** true i
21340 66 20 74 68 65 20 72 6f 77 73 20 72 65 61 6c 6c  f the rows reall
21350 79 20 77 69 6c 6c 20 62 65 20 73 6f 72 74 65 64  y will be sorted
21360 20 69 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   in the specifie
21370 64 20 6f 72 64 65 72 2c 20 6f 72 20 66 61 6c 73  d order, or fals
21380 65 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a  e.** otherwise..
21390 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
213a0 65 2c 20 61 73 73 75 6d 69 6e 67 3a 0a 2a 2a 0a  e, assuming:.**.
213b0 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
213c0 58 20 69 31 20 4f 4e 20 74 31 28 78 2c 20 59 29  X i1 ON t1(x, Y)
213d0 3b 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 0a 2a 2a 0a  ;.**.** then.**.
213e0 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
213f0 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 78  OM t1 GROUP BY x
21400 2c 79 20 4f 52 44 45 52 20 42 59 20 78 2c 79 3b  ,y ORDER BY x,y;
21410 20 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29     -- IsSorted()
21420 3d 3d 31 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  ==1.**   SELECT 
21430 2a 20 46 52 4f 4d 20 74 31 20 47 52 4f 55 50 20  * FROM t1 GROUP 
21440 42 59 20 79 2c 78 20 4f 52 44 45 52 20 42 59 20  BY y,x ORDER BY 
21450 79 2c 78 3b 20 20 20 2d 2d 20 49 73 53 6f 72 74  y,x;   -- IsSort
21460 65 64 28 29 3d 3d 30 0a 2a 2f 0a 69 6e 74 20 73  ed()==0.*/.int s
21470 71 6c 69 74 65 33 57 68 65 72 65 49 73 53 6f 72  qlite3WhereIsSor
21480 74 65 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  ted(WhereInfo *p
21490 57 49 6e 66 6f 29 7b 0a 20 20 61 73 73 65 72 74  WInfo){.  assert
214a0 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
214b0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 47 52 4f  lags & WHERE_GRO
214c0 55 50 42 59 20 29 3b 0a 20 20 61 73 73 65 72 74  UPBY );.  assert
214d0 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
214e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4f 52  lags & WHERE_SOR
214f0 54 42 59 47 52 4f 55 50 20 29 3b 0a 20 20 72 65  TBYGROUP );.  re
21500 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 73 6f 72  turn pWInfo->sor
21510 74 65 64 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 57  ted;.}..#ifdef W
21520 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
21530 44 0a 2f 2a 20 46 6f 72 20 64 65 62 75 67 67 69  D./* For debuggi
21540 6e 67 20 75 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a  ng use only: */.
21550 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
21560 72 20 2a 77 68 65 72 65 50 61 74 68 4e 61 6d 65  r *wherePathName
21570 28 57 68 65 72 65 50 61 74 68 20 2a 70 50 61 74  (WherePath *pPat
21580 68 2c 20 69 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68  h, int nLoop, Wh
21590 65 72 65 4c 6f 6f 70 20 2a 70 4c 61 73 74 29 7b  ereLoop *pLast){
215a0 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a  .  static char z
215b0 4e 61 6d 65 5b 36 35 5d 3b 0a 20 20 69 6e 74 20  Name[65];.  int 
215c0 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
215d0 6e 4c 6f 6f 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61  nLoop; i++){ zNa
215e0 6d 65 5b 69 5d 20 3d 20 70 50 61 74 68 2d 3e 61  me[i] = pPath->a
215f0 4c 6f 6f 70 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a  Loop[i]->cId; }.
21600 20 20 69 66 28 20 70 4c 61 73 74 20 29 20 7a 4e    if( pLast ) zN
21610 61 6d 65 5b 69 2b 2b 5d 20 3d 20 70 4c 61 73 74  ame[i++] = pLast
21620 2d 3e 63 49 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69  ->cId;.  zName[i
21630 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 0;.  return 
21640 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  zName;.}.#endif.
21650 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
21660 65 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e  e cost of sortin
21670 67 20 6e 52 6f 77 20 72 6f 77 73 2c 20 61 73 73  g nRow rows, ass
21680 75 6d 69 6e 67 20 74 68 61 74 20 74 68 65 20 6b  uming that the k
21690 65 79 73 20 68 61 76 65 20 0a 2a 2a 20 6e 4f 72  eys have .** nOr
216a0 64 65 72 62 79 20 63 6f 6c 75 6d 6e 73 20 61 6e  derby columns an
216b0 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74  d that the first
216c0 20 6e 53 6f 72 74 65 64 20 63 6f 6c 75 6d 6e 73   nSorted columns
216d0 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 0a   are already in.
216e0 2a 2a 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ** order..*/.sta
216f0 74 69 63 20 4c 6f 67 45 73 74 20 77 68 65 72 65  tic LogEst where
21700 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 57  SortingCost(.  W
21710 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
21720 2c 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77 2c  ,.  LogEst nRow,
21730 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 2c  .  int nOrderBy,
21740 0a 20 20 69 6e 74 20 6e 53 6f 72 74 65 64 0a 29  .  int nSorted.)
21750 7b 0a 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 45  {.  /* TUNING: E
21760 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f 66  stimated cost of
21770 20 61 20 66 75 6c 6c 20 65 78 74 65 72 6e 61 6c   a full external
21780 20 73 6f 72 74 2c 20 77 68 65 72 65 20 4e 20 69   sort, where N i
21790 73 20 0a 20 20 2a 2a 20 74 68 65 20 6e 75 6d 62  s .  ** the numb
217a0 65 72 20 6f 66 20 72 6f 77 73 20 74 6f 20 73 6f  er of rows to so
217b0 72 74 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  rt is:.  **.  **
217c0 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20 2a     cost = (3.0 *
217d0 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 2e 0a 20 20   N * log(N))..  
217e0 2a 2a 20 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20  ** .  ** Or, if 
217f0 74 68 65 20 6f 72 64 65 72 2d 62 79 20 63 6c 61  the order-by cla
21800 75 73 65 20 68 61 73 20 58 20 74 65 72 6d 73 20  use has X terms 
21810 62 75 74 20 6f 6e 6c 79 20 74 68 65 20 6c 61 73  but only the las
21820 74 20 59 20 0a 20 20 2a 2a 20 74 65 72 6d 73 20  t Y .  ** terms 
21830 61 72 65 20 6f 75 74 20 6f 66 20 6f 72 64 65 72  are out of order
21840 2c 20 74 68 65 6e 20 62 6c 6f 63 6b 2d 73 6f 72  , then block-sor
21850 74 69 6e 67 20 77 69 6c 6c 20 72 65 64 75 63 65  ting will reduce
21860 20 74 68 65 20 0a 20 20 2a 2a 20 73 6f 72 74 69   the .  ** sorti
21870 6e 67 20 63 6f 73 74 20 74 6f 3a 0a 20 20 2a 2a  ng cost to:.  **
21880 0a 20 20 2a 2a 20 20 20 63 6f 73 74 20 3d 20 28  .  **   cost = (
21890 33 2e 30 20 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29  3.0 * N * log(N)
218a0 29 20 2a 20 28 59 2f 58 29 0a 20 20 2a 2a 0a 20  ) * (Y/X).  **. 
218b0 20 2a 2a 20 54 68 65 20 28 59 2f 58 29 20 74 65   ** The (Y/X) te
218c0 72 6d 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  rm is implemente
218d0 64 20 75 73 69 6e 67 20 73 74 61 63 6b 20 76 61  d using stack va
218e0 72 69 61 62 6c 65 20 72 53 63 61 6c 65 0a 20 20  riable rScale.  
218f0 2a 2a 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20  ** below.  */.  
21900 4c 6f 67 45 73 74 20 72 53 63 61 6c 65 2c 20 72  LogEst rScale, r
21910 53 6f 72 74 43 6f 73 74 3b 0a 20 20 61 73 73 65  SortCost;.  asse
21920 72 74 28 20 6e 4f 72 64 65 72 42 79 3e 30 20 26  rt( nOrderBy>0 &
21930 26 20 36 36 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  & 66==sqlite3Log
21940 45 73 74 28 31 30 30 29 20 29 3b 0a 20 20 72 53  Est(100) );.  rS
21950 63 61 6c 65 20 3d 20 73 71 6c 69 74 65 33 4c 6f  cale = sqlite3Lo
21960 67 45 73 74 28 28 6e 4f 72 64 65 72 42 79 2d 6e  gEst((nOrderBy-n
21970 53 6f 72 74 65 64 29 2a 31 30 30 2f 6e 4f 72 64  Sorted)*100/nOrd
21980 65 72 42 79 29 20 2d 20 36 36 3b 0a 20 20 72 53  erBy) - 66;.  rS
21990 6f 72 74 43 6f 73 74 20 3d 20 6e 52 6f 77 20 2b  ortCost = nRow +
219a0 20 72 53 63 61 6c 65 20 2b 20 31 36 3b 0a 0a 20   rScale + 16;.. 
219b0 20 2f 2a 20 4d 75 6c 74 69 70 6c 65 20 62 79 20   /* Multiple by 
219c0 6c 6f 67 28 4d 29 20 77 68 65 72 65 20 4d 20 69  log(M) where M i
219d0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
219e0 6f 75 74 70 75 74 20 72 6f 77 73 2e 0a 20 20 2a  output rows..  *
219f0 2a 20 55 73 65 20 74 68 65 20 4c 49 4d 49 54 20  * Use the LIMIT 
21a00 66 6f 72 20 4d 20 69 66 20 69 74 20 69 73 20 73  for M if it is s
21a10 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 69 66 28 20  maller */.  if( 
21a20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
21a30 61 67 73 20 26 20 57 48 45 52 45 5f 55 53 45 5f  ags & WHERE_USE_
21a40 4c 49 4d 49 54 29 21 3d 30 20 26 26 20 70 57 49  LIMIT)!=0 && pWI
21a50 6e 66 6f 2d 3e 69 4c 69 6d 69 74 3c 6e 52 6f 77  nfo->iLimit<nRow
21a60 20 29 7b 0a 20 20 20 20 6e 52 6f 77 20 3d 20 70   ){.    nRow = p
21a70 57 49 6e 66 6f 2d 3e 69 4c 69 6d 69 74 3b 0a 20  WInfo->iLimit;. 
21a80 20 7d 0a 20 20 72 53 6f 72 74 43 6f 73 74 20 2b   }.  rSortCost +
21a90 3d 20 65 73 74 4c 6f 67 28 6e 52 6f 77 29 3b 0a  = estLog(nRow);.
21aa0 20 20 72 65 74 75 72 6e 20 72 53 6f 72 74 43 6f    return rSortCo
21ab0 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  st;.}../*.** Giv
21ac0 65 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57  en the list of W
21ad0 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73  hereLoop objects
21ae0 20 61 74 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f   at pWInfo->pLoo
21af0 70 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ps, this routine
21b00 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
21b10 66 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74 20  find the lowest 
21b20 63 6f 73 74 20 70 61 74 68 20 74 68 61 74 20 76  cost path that v
21b30 69 73 69 74 73 20 65 61 63 68 20 57 68 65 72 65  isits each Where
21b40 4c 6f 6f 70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54  Loop.** once.  T
21b50 68 69 73 20 70 61 74 68 20 69 73 20 74 68 65 6e  his path is then
21b60 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 74 68 65   loaded into the
21b70 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c   pWInfo->a[].pWL
21b80 6f 6f 70 20 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a  oop fields..**.*
21b90 2a 20 41 73 73 75 6d 65 20 74 68 61 74 20 74 68  * Assume that th
21ba0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
21bb0 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 74 68  f output rows th
21bc0 61 74 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  at will need to 
21bd0 62 65 20 73 6f 72 74 65 64 0a 2a 2a 20 77 69 6c  be sorted.** wil
21be0 6c 20 62 65 20 6e 52 6f 77 45 73 74 20 28 69 6e  l be nRowEst (in
21bf0 20 74 68 65 20 31 30 2a 6c 6f 67 32 20 72 65 70   the 10*log2 rep
21c00 72 65 73 65 6e 74 61 74 69 6f 6e 29 2e 20 20 4f  resentation).  O
21c10 72 2c 20 69 67 6e 6f 72 65 20 73 6f 72 74 69 6e  r, ignore sortin
21c20 67 0a 2a 2a 20 63 6f 73 74 73 20 69 66 20 6e 52  g.** costs if nR
21c30 6f 77 45 73 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  owEst==0..**.** 
21c40 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
21c50 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 53   on success or S
21c60 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61  QLITE_NOMEM of a
21c70 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
21c80 6f 6e 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  on.** error occu
21c90 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
21ca0 74 20 77 68 65 72 65 50 61 74 68 53 6f 6c 76 65  t wherePathSolve
21cb0 72 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  r(WhereInfo *pWI
21cc0 6e 66 6f 2c 20 4c 6f 67 45 73 74 20 6e 52 6f 77  nfo, LogEst nRow
21cd0 45 73 74 29 7b 0a 20 20 69 6e 74 20 6d 78 43 68  Est){.  int mxCh
21ce0 6f 69 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  oice;           
21cf0 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
21d00 62 65 72 20 6f 66 20 73 69 6d 75 6c 74 61 6e 65  ber of simultane
21d10 6f 75 73 20 70 61 74 68 73 20 74 72 61 63 6b 65  ous paths tracke
21d20 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70  d */.  int nLoop
21d30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21d40 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
21d50 72 6d 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20  rms in the join 
21d60 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
21d70 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  se;            /
21d80 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
21d90 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  t */.  sqlite3 *
21da0 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
21db0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
21dc0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
21dd0 20 69 6e 74 20 69 4c 6f 6f 70 3b 20 20 20 20 20   int iLoop;     
21de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
21df0 6f 70 20 63 6f 75 6e 74 65 72 20 6f 76 65 72 20  op counter over 
21e00 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
21e10 20 6a 6f 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69   join */.  int i
21e20 69 2c 20 6a 6a 3b 20 20 20 20 20 20 20 20 20 20  i, jj;          
21e30 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
21e40 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6d  nters */.  int m
21e50 78 49 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  xI = 0;         
21e60 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
21e70 20 6e 65 78 74 20 65 6e 74 72 79 20 74 6f 20 72   next entry to r
21e80 65 70 6c 61 63 65 20 2a 2f 0a 20 20 69 6e 74 20  eplace */.  int 
21e90 6e 4f 72 64 65 72 42 79 3b 20 20 20 20 20 20 20  nOrderBy;       
21ea0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
21eb0 6f 66 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  of ORDER BY clau
21ec0 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20 4c 6f  se terms */.  Lo
21ed0 67 45 73 74 20 6d 78 43 6f 73 74 20 3d 20 30 3b  gEst mxCost = 0;
21ee0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
21ef0 75 6d 20 63 6f 73 74 20 6f 66 20 61 20 73 65 74  um cost of a set
21f00 20 6f 66 20 70 61 74 68 73 20 2a 2f 0a 20 20 4c   of paths */.  L
21f10 6f 67 45 73 74 20 6d 78 55 6e 73 6f 72 74 65 64  ogEst mxUnsorted
21f20 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4d 61 78 69   = 0;    /* Maxi
21f30 6d 75 6d 20 75 6e 73 6f 72 74 65 64 20 63 6f 73  mum unsorted cos
21f40 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20 70 61  t of a set of pa
21f50 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c  th */.  int nTo,
21f60 20 6e 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20   nFrom;         
21f70 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
21f80 61 6c 69 64 20 65 6e 74 72 69 65 73 20 69 6e 20  alid entries in 
21f90 61 54 6f 5b 5d 20 61 6e 64 20 61 46 72 6f 6d 5b  aTo[] and aFrom[
21fa0 5d 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68  ] */.  WherePath
21fb0 20 2a 61 46 72 6f 6d 3b 20 20 20 20 20 20 20 20   *aFrom;        
21fc0 20 2f 2a 20 41 6c 6c 20 6e 46 72 6f 6d 20 70 61   /* All nFrom pa
21fd0 74 68 73 20 61 74 20 74 68 65 20 70 72 65 76 69  ths at the previ
21fe0 6f 75 73 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 57  ous level */.  W
21ff0 68 65 72 65 50 61 74 68 20 2a 61 54 6f 3b 20 20  herePath *aTo;  
22000 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22010 6e 54 6f 20 62 65 73 74 20 70 61 74 68 73 20 61  nTo best paths a
22020 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  t the current le
22030 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65 50 61  vel */.  WherePa
22040 74 68 20 2a 70 46 72 6f 6d 3b 20 20 20 20 20 20  th *pFrom;      
22050 20 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74     /* An element
22060 20 6f 66 20 61 46 72 6f 6d 5b 5d 20 74 68 61 74   of aFrom[] that
22070 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
22080 6f 6e 20 2a 2f 0a 20 20 57 68 65 72 65 50 61 74  on */.  WherePat
22090 68 20 2a 70 54 6f 3b 20 20 20 20 20 20 20 20 20  h *pTo;         
220a0 20 20 2f 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20    /* An element 
220b0 6f 66 20 61 54 6f 5b 5d 20 74 68 61 74 20 77 65  of aTo[] that we
220c0 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20   are working on 
220d0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
220e0 70 57 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 2f  pWLoop;        /
220f0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 68 65  * One of the Whe
22100 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 2a  reLoop objects *
22110 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2a  /.  WhereLoop **
22120 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pX;           /*
22130 20 55 73 65 64 20 74 6f 20 64 69 76 79 20 75 70   Used to divy up
22140 20 74 68 65 20 70 53 70 61 63 65 20 6d 65 6d 6f   the pSpace memo
22150 72 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 2a  ry */.  LogEst *
22160 61 53 6f 72 74 43 6f 73 74 20 3d 20 30 3b 20 20  aSortCost = 0;  
22170 20 20 2f 2a 20 53 6f 72 74 69 6e 67 20 61 6e 64    /* Sorting and
22180 20 70 61 72 74 69 61 6c 20 73 6f 72 74 69 6e 67   partial sorting
22190 20 63 6f 73 74 73 20 2a 2f 0a 20 20 63 68 61 72   costs */.  char
221a0 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 20   *pSpace;       
221b0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
221c0 72 79 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62  ry memory used b
221d0 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 2a  y this routine *
221e0 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63 65 3b 20  /.  int nSpace; 
221f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22200 20 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   Bytes of space 
22210 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 70 53 70  allocated at pSp
22220 61 63 65 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ace */..  pParse
22230 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
22240 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  e;.  db = pParse
22250 2d 3e 64 62 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20  ->db;.  nLoop = 
22260 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a  pWInfo->nLevel;.
22270 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 46 6f 72    /* TUNING: For
22280 20 73 69 6d 70 6c 65 20 71 75 65 72 69 65 73 2c   simple queries,
22290 20 6f 6e 6c 79 20 74 68 65 20 62 65 73 74 20 70   only the best p
222a0 61 74 68 20 69 73 20 74 72 61 63 6b 65 64 2e 0a  ath is tracked..
222b0 20 20 2a 2a 20 46 6f 72 20 32 2d 77 61 79 20 6a    ** For 2-way j
222c0 6f 69 6e 73 2c 20 74 68 65 20 35 20 62 65 73 74  oins, the 5 best
222d0 20 70 61 74 68 73 20 61 72 65 20 66 6f 6c 6c 6f   paths are follo
222e0 77 65 64 2e 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f  wed..  ** For jo
222f0 69 6e 73 20 6f 66 20 33 20 6f 72 20 6d 6f 72 65  ins of 3 or more
22300 20 74 61 62 6c 65 73 2c 20 74 72 61 63 6b 20 74   tables, track t
22310 68 65 20 31 30 20 62 65 73 74 20 70 61 74 68 73  he 10 best paths
22320 20 2a 2f 0a 20 20 6d 78 43 68 6f 69 63 65 20 3d   */.  mxChoice =
22330 20 28 6e 4c 6f 6f 70 3c 3d 31 29 20 3f 20 31 20   (nLoop<=1) ? 1 
22340 3a 20 28 6e 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20  : (nLoop==2 ? 5 
22350 3a 20 31 30 29 3b 0a 20 20 61 73 73 65 72 74 28  : 10);.  assert(
22360 20 6e 4c 6f 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e   nLoop<=pWInfo->
22370 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29  pTabList->nSrc )
22380 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 30  ;.  WHERETRACE(0
22390 78 30 30 32 2c 20 28 22 2d 2d 2d 2d 20 62 65 67  x002, ("---- beg
223a0 69 6e 20 73 6f 6c 76 65 72 2e 20 20 28 6e 52 6f  in solver.  (nRo
223b0 77 45 73 74 3d 25 64 29 5c 6e 22 2c 20 6e 52 6f  wEst=%d)\n", nRo
223c0 77 45 73 74 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  wEst));..  /* If
223d0 20 6e 52 6f 77 45 73 74 20 69 73 20 7a 65 72 6f   nRowEst is zero
223e0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 61 6e   and there is an
223f0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
22400 2c 20 69 67 6e 6f 72 65 20 69 74 2e 20 49 6e 20  , ignore it. In 
22410 74 68 69 73 0a 20 20 2a 2a 20 63 61 73 65 20 74  this.  ** case t
22420 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74 68  he purpose of th
22430 69 73 20 63 61 6c 6c 20 69 73 20 74 6f 20 65 73  is call is to es
22440 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
22450 72 20 6f 66 20 72 6f 77 73 20 72 65 74 75 72 6e  r of rows return
22460 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6f  ed.  ** by the o
22470 76 65 72 61 6c 6c 20 71 75 65 72 79 2e 20 4f 6e  verall query. On
22480 63 65 20 74 68 69 73 20 65 73 74 69 6d 61 74 65  ce this estimate
22490 20 68 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e   has been obtain
224a0 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 0a 20  ed, the caller. 
224b0 20 2a 2a 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20   ** will invoke 
224c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 20  this function a 
224d0 73 65 63 6f 6e 64 20 74 69 6d 65 2c 20 70 61 73  second time, pas
224e0 73 69 6e 67 20 74 68 65 20 65 73 74 69 6d 61 74  sing the estimat
224f0 65 20 61 73 20 74 68 65 0a 20 20 2a 2a 20 6e 52  e as the.  ** nR
22500 6f 77 45 73 74 20 70 61 72 61 6d 65 74 65 72 2e  owEst parameter.
22510 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66    */.  if( pWInf
22520 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c  o->pOrderBy==0 |
22530 7c 20 6e 52 6f 77 45 73 74 3d 3d 30 20 29 7b 0a  | nRowEst==0 ){.
22540 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30      nOrderBy = 0
22550 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
22560 4f 72 64 65 72 42 79 20 3d 20 70 57 49 6e 66 6f  OrderBy = pWInfo
22570 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ->pOrderBy->nExp
22580 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c  r;.  }..  /* All
22590 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
225a0 6c 69 7a 65 20 73 70 61 63 65 20 66 6f 72 20 61  lize space for a
225b0 54 6f 2c 20 61 46 72 6f 6d 20 61 6e 64 20 61 53  To, aFrom and aS
225c0 6f 72 74 43 6f 73 74 5b 5d 20 2a 2f 0a 20 20 6e  ortCost[] */.  n
225d0 53 70 61 63 65 20 3d 20 28 73 69 7a 65 6f 66 28  Space = (sizeof(
225e0 57 68 65 72 65 50 61 74 68 29 2b 73 69 7a 65 6f  WherePath)+sizeo
225f0 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c  f(WhereLoop*)*nL
22600 6f 6f 70 29 2a 6d 78 43 68 6f 69 63 65 2a 32 3b  oop)*mxChoice*2;
22610 0a 20 20 6e 53 70 61 63 65 20 2b 3d 20 73 69 7a  .  nSpace += siz
22620 65 6f 66 28 4c 6f 67 45 73 74 29 20 2a 20 6e 4f  eof(LogEst) * nO
22630 72 64 65 72 42 79 3b 0a 20 20 70 53 70 61 63 65  rderBy;.  pSpace
22640 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
22650 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e 53 70 61  ocRawNN(db, nSpa
22660 63 65 29 3b 0a 20 20 69 66 28 20 70 53 70 61 63  ce);.  if( pSpac
22670 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
22680 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
22690 0a 20 20 61 54 6f 20 3d 20 28 57 68 65 72 65 50  .  aTo = (WhereP
226a0 61 74 68 2a 29 70 53 70 61 63 65 3b 0a 20 20 61  ath*)pSpace;.  a
226b0 46 72 6f 6d 20 3d 20 61 54 6f 2b 6d 78 43 68 6f  From = aTo+mxCho
226c0 69 63 65 3b 0a 20 20 6d 65 6d 73 65 74 28 61 46  ice;.  memset(aF
226d0 72 6f 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  rom, 0, sizeof(a
226e0 46 72 6f 6d 5b 30 5d 29 29 3b 0a 20 20 70 58 20  From[0]));.  pX 
226f0 3d 20 28 57 68 65 72 65 4c 6f 6f 70 2a 2a 29 28  = (WhereLoop**)(
22700 61 46 72 6f 6d 2b 6d 78 43 68 6f 69 63 65 29 3b  aFrom+mxChoice);
22710 0a 20 20 66 6f 72 28 69 69 3d 6d 78 43 68 6f 69  .  for(ii=mxChoi
22720 63 65 2a 32 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b  ce*2, pFrom=aTo;
22730 20 69 69 3e 30 3b 20 69 69 2d 2d 2c 20 70 46 72   ii>0; ii--, pFr
22740 6f 6d 2b 2b 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f  om++, pX += nLoo
22750 70 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 61  p){.    pFrom->a
22760 4c 6f 6f 70 20 3d 20 70 58 3b 0a 20 20 7d 0a 20  Loop = pX;.  }. 
22770 20 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29 7b   if( nOrderBy ){
22780 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
22790 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
227a0 63 6c 61 75 73 65 20 61 6e 64 20 69 74 20 69 73  clause and it is
227b0 20 6e 6f 74 20 62 65 69 6e 67 20 69 67 6e 6f 72   not being ignor
227c0 65 64 2c 20 73 65 74 20 75 70 0a 20 20 20 20 2a  ed, set up.    *
227d0 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  * space for the 
227e0 61 53 6f 72 74 43 6f 73 74 5b 5d 20 61 72 72 61  aSortCost[] arra
227f0 79 2e 20 45 61 63 68 20 65 6c 65 6d 65 6e 74 20  y. Each element 
22800 6f 66 20 74 68 65 20 61 53 6f 72 74 43 6f 73 74  of the aSortCost
22810 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 69 73   array.    ** is
22820 20 65 69 74 68 65 72 20 7a 65 72 6f 20 2d 20 6d   either zero - m
22830 65 61 6e 69 6e 67 20 69 74 20 68 61 73 20 6e 6f  eaning it has no
22840 74 20 79 65 74 20 62 65 65 6e 20 69 6e 69 74 69  t yet been initi
22850 61 6c 69 7a 65 64 20 2d 20 6f 72 20 74 68 65 0a  alized - or the.
22860 20 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66 20 73      ** cost of s
22870 6f 72 74 69 6e 67 20 6e 52 6f 77 45 73 74 20 72  orting nRowEst r
22880 6f 77 73 20 6f 66 20 64 61 74 61 20 77 68 65 72  ows of data wher
22890 65 20 74 68 65 20 66 69 72 73 74 20 58 20 74 65  e the first X te
228a0 72 6d 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  rms of.    ** th
228b0 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
228c0 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e  e are already in
228d0 20 6f 72 64 65 72 2c 20 77 68 65 72 65 20 58 20   order, where X 
228e0 69 73 20 74 68 65 20 61 72 72 61 79 20 0a 20 20  is the array .  
228f0 20 20 2a 2a 20 69 6e 64 65 78 2e 20 20 2a 2f 0a    ** index.  */.
22900 20 20 20 20 61 53 6f 72 74 43 6f 73 74 20 3d 20      aSortCost = 
22910 28 4c 6f 67 45 73 74 2a 29 70 58 3b 0a 20 20 20  (LogEst*)pX;.   
22920 20 6d 65 6d 73 65 74 28 61 53 6f 72 74 43 6f 73   memset(aSortCos
22930 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 67  t, 0, sizeof(Log
22940 45 73 74 29 20 2a 20 6e 4f 72 64 65 72 42 79 29  Est) * nOrderBy)
22950 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
22960 61 53 6f 72 74 43 6f 73 74 3d 3d 30 20 7c 7c 20  aSortCost==0 || 
22970 26 70 53 70 61 63 65 5b 6e 53 70 61 63 65 5d 3d  &pSpace[nSpace]=
22980 3d 28 63 68 61 72 2a 29 26 61 53 6f 72 74 43 6f  =(char*)&aSortCo
22990 73 74 5b 6e 4f 72 64 65 72 42 79 5d 20 29 3b 0a  st[nOrderBy] );.
229a0 20 20 61 73 73 65 72 74 28 20 61 53 6f 72 74 43    assert( aSortC
229b0 6f 73 74 21 3d 30 20 7c 7c 20 26 70 53 70 61 63  ost!=0 || &pSpac
229c0 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68 61 72  e[nSpace]==(char
229d0 2a 29 70 58 20 29 3b 0a 0a 20 20 2f 2a 20 53 65  *)pX );..  /* Se
229e0 65 64 20 74 68 65 20 73 65 61 72 63 68 20 77 69  ed the search wi
229f0 74 68 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72  th a single Wher
22a00 65 50 61 74 68 20 63 6f 6e 74 61 69 6e 69 6e 67  ePath containing
22a10 20 7a 65 72 6f 20 57 68 65 72 65 4c 6f 6f 70 73   zero WhereLoops
22a20 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49  ..  **.  ** TUNI
22a30 4e 47 3a 20 44 6f 20 6e 6f 74 20 6c 65 74 20 74  NG: Do not let t
22a40 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 74 65  he number of ite
22a50 72 61 74 69 6f 6e 73 20 67 6f 20 61 62 6f 76 65  rations go above
22a60 20 32 38 2e 20 20 49 66 20 74 68 65 20 63 6f 73   28.  If the cos
22a70 74 0a 20 20 2a 2a 20 6f 66 20 63 6f 6d 70 75 74  t.  ** of comput
22a80 69 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63  ing an automatic
22a90 20 69 6e 64 65 78 20 69 73 20 6e 6f 74 20 70 61   index is not pa
22aa0 69 64 20 62 61 63 6b 20 77 69 74 68 69 6e 20 74  id back within t
22ab0 68 65 20 66 69 72 73 74 20 32 38 0a 20 20 2a 2a  he first 28.  **
22ac0 20 72 6f 77 73 2c 20 74 68 65 6e 20 64 6f 20 6e   rows, then do n
22ad0 6f 74 20 75 73 65 20 74 68 65 20 61 75 74 6f 6d  ot use the autom
22ae0 61 74 69 63 20 69 6e 64 65 78 2e 20 2a 2f 0a 20  atic index. */. 
22af0 20 61 46 72 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d   aFrom[0].nRow =
22b00 20 4d 49 4e 28 70 50 61 72 73 65 2d 3e 6e 51 75   MIN(pParse->nQu
22b10 65 72 79 4c 6f 6f 70 2c 20 34 38 29 3b 20 20 61  eryLoop, 48);  a
22b20 73 73 65 72 74 28 20 34 38 3d 3d 73 71 6c 69 74  ssert( 48==sqlit
22b30 65 33 4c 6f 67 45 73 74 28 32 38 29 20 29 3b 0a  e3LogEst(28) );.
22b40 20 20 6e 46 72 6f 6d 20 3d 20 31 3b 0a 20 20 61    nFrom = 1;.  a
22b50 73 73 65 72 74 28 20 61 46 72 6f 6d 5b 30 5d 2e  ssert( aFrom[0].
22b60 69 73 4f 72 64 65 72 65 64 3d 3d 30 20 29 3b 0a  isOrdered==0 );.
22b70 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 20 29    if( nOrderBy )
22b80 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 4c 6f 6f  {.    /* If nLoo
22b90 70 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p is zero, then 
22ba0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 46 52 4f  there are no FRO
22bb0 4d 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 71  M terms in the q
22bc0 75 65 72 79 2e 20 53 69 6e 63 65 0a 20 20 20 20  uery. Since.    
22bd0 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  ** in this case 
22be0 74 68 65 20 71 75 65 72 79 20 6d 61 79 20 72 65  the query may re
22bf0 74 75 72 6e 20 61 20 6d 61 78 69 6d 75 6d 20 6f  turn a maximum o
22c00 66 20 6f 6e 65 20 72 6f 77 2c 20 74 68 65 20 72  f one row, the r
22c10 65 73 75 6c 74 73 0a 20 20 20 20 2a 2a 20 61 72  esults.    ** ar
22c20 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  e already in the
22c30 20 72 65 71 75 65 73 74 65 64 20 6f 72 64 65 72   requested order
22c40 2e 20 53 65 74 20 69 73 4f 72 64 65 72 65 64 20  . Set isOrdered 
22c50 74 6f 20 6e 4f 72 64 65 72 42 79 20 74 6f 0a 20  to nOrderBy to. 
22c60 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 20 74     ** indicate t
22c70 68 69 73 2e 20 4f 72 2c 20 69 66 20 6e 4c 6f 6f  his. Or, if nLoo
22c80 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  p is greater tha
22c90 6e 20 7a 65 72 6f 2c 20 73 65 74 20 69 73 4f 72  n zero, set isOr
22ca0 64 65 72 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  dered to.    ** 
22cb0 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  -1, indicating t
22cc0 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 73  hat the result s
22cd0 65 74 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  et may or may no
22ce0 74 20 62 65 20 6f 72 64 65 72 65 64 2c 20 0a 20  t be ordered, . 
22cf0 20 20 20 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20     ** depending 
22d00 6f 6e 20 74 68 65 20 6c 6f 6f 70 73 20 61 64 64  on the loops add
22d10 65 64 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ed to the curren
22d20 74 20 70 6c 61 6e 2e 20 20 2a 2f 0a 20 20 20 20  t plan.  */.    
22d30 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72 64 65 72  aFrom[0].isOrder
22d40 65 64 20 3d 20 6e 4c 6f 6f 70 3e 30 20 3f 20 2d  ed = nLoop>0 ? -
22d50 31 20 3a 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20  1 : nOrderBy;.  
22d60 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  }..  /* Compute 
22d70 73 75 63 63 65 73 73 69 76 65 6c 79 20 6c 6f 6e  successively lon
22d80 67 65 72 20 57 68 65 72 65 50 61 74 68 73 20 75  ger WherePaths u
22d90 73 69 6e 67 20 74 68 65 20 70 72 65 76 69 6f 75  sing the previou
22da0 73 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 2a  s generation.  *
22db0 2a 20 6f 66 20 57 68 65 72 65 50 61 74 68 73 20  * of WherePaths 
22dc0 61 73 20 74 68 65 20 62 61 73 69 73 20 66 6f 72  as the basis for
22dd0 20 74 68 65 20 6e 65 78 74 2e 20 20 4b 65 65 70   the next.  Keep
22de0 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6d 78   track of the mx
22df0 43 68 6f 69 63 65 0a 20 20 2a 2a 20 62 65 73 74  Choice.  ** best
22e00 20 70 61 74 68 73 20 61 74 20 65 61 63 68 20 67   paths at each g
22e10 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 66  eneration */.  f
22e20 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f  or(iLoop=0; iLoo
22e30 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  p<nLoop; iLoop++
22e40 29 7b 0a 20 20 20 20 6e 54 6f 20 3d 20 30 3b 0a  ){.    nTo = 0;.
22e50 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20 70 46      for(ii=0, pF
22e60 72 6f 6d 3d 61 46 72 6f 6d 3b 20 69 69 3c 6e 46  rom=aFrom; ii<nF
22e70 72 6f 6d 3b 20 69 69 2b 2b 2c 20 70 46 72 6f 6d  rom; ii++, pFrom
22e80 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70  ++){.      for(p
22e90 57 4c 6f 6f 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c  WLoop=pWInfo->pL
22ea0 6f 6f 70 73 3b 20 70 57 4c 6f 6f 70 3b 20 70 57  oops; pWLoop; pW
22eb0 4c 6f 6f 70 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65  Loop=pWLoop->pNe
22ec0 78 74 4c 6f 6f 70 29 7b 0a 20 20 20 20 20 20 20  xtLoop){.       
22ed0 20 4c 6f 67 45 73 74 20 6e 4f 75 74 3b 20 20 20   LogEst nOut;   
22ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ef0 20 20 20 2f 2a 20 52 6f 77 73 20 76 69 73 69 74     /* Rows visit
22f00 65 64 20 62 79 20 28 70 46 72 6f 6d 2b 70 57 4c  ed by (pFrom+pWL
22f10 6f 6f 70 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  oop) */.        
22f20 4c 6f 67 45 73 74 20 72 43 6f 73 74 3b 20 20 20  LogEst rCost;   
22f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f40 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 70 61 74    /* Cost of pat
22f50 68 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29  h (pFrom+pWLoop)
22f60 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45   */.        LogE
22f70 73 74 20 72 55 6e 73 6f 72 74 65 64 3b 20 20 20  st rUnsorted;   
22f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22f90 20 55 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f   Unsorted cost o
22fa0 66 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29  f (pFrom+pWLoop)
22fb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 38 20 69   */.        i8 i
22fc0 73 4f 72 64 65 72 65 64 20 3d 20 70 46 72 6f 6d  sOrdered = pFrom
22fd0 2d 3e 69 73 4f 72 64 65 72 65 64 3b 20 20 2f 2a  ->isOrdered;  /*
22fe0 20 69 73 4f 72 64 65 72 65 64 20 66 6f 72 20 28   isOrdered for (
22ff0 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f  pFrom+pWLoop) */
23000 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
23010 20 6d 61 73 6b 4e 65 77 3b 20 20 20 20 20 20 20   maskNew;       
23020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
23030 73 6b 20 6f 66 20 73 72 63 20 76 69 73 69 74 65  sk of src visite
23040 64 20 62 79 20 28 2e 2e 29 20 2a 2f 0a 20 20 20  d by (..) */.   
23050 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65 76       Bitmask rev
23060 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  Mask = 0;       
23070 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
23080 66 20 72 65 76 2d 6f 72 64 65 72 20 6c 6f 6f 70  f rev-order loop
23090 73 20 66 6f 72 20 28 2e 2e 29 20 2a 2f 0a 0a 20  s for (..) */.. 
230a0 20 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f         if( (pWLo
230b0 6f 70 2d 3e 70 72 65 72 65 71 20 26 20 7e 70 46  op->prereq & ~pF
230c0 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d  rom->maskLoop)!=
230d0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
230e0 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f        if( (pWLoo
230f0 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 26 20 70 46  p->maskSelf & pF
23100 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d  rom->maskLoop)!=
23110 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
23120 20 20 20 20 20 20 69 66 28 20 28 70 57 4c 6f 6f        if( (pWLoo
23130 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
23140 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d  RE_AUTO_INDEX)!=
23150 30 20 26 26 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77  0 && pFrom->nRow
23160 3c 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  <10 ){.         
23170 20 2f 2a 20 44 6f 20 6e 6f 74 20 75 73 65 20 61   /* Do not use a
23180 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  n automatic inde
23190 78 20 69 66 20 74 68 65 20 74 68 69 73 20 6c 6f  x if the this lo
231a0 6f 70 20 69 73 20 65 78 70 65 63 74 65 64 0a 20  op is expected. 
231b0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 72           ** to r
231c0 75 6e 20 6c 65 73 73 20 74 68 61 6e 20 32 20 74  un less than 2 t
231d0 69 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  imes. */.       
231e0 20 20 20 61 73 73 65 72 74 28 20 31 30 3d 3d 73     assert( 10==s
231f0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 29 20  qlite3LogEst(2) 
23200 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  );.          con
23210 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
23220 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74  .        /* At t
23230 68 69 73 20 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f  his point, pWLoo
23240 70 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  p is a candidate
23250 20 74 6f 20 62 65 20 74 68 65 20 6e 65 78 74 20   to be the next 
23260 6c 6f 6f 70 2e 20 0a 20 20 20 20 20 20 20 20 2a  loop. .        *
23270 2a 20 43 6f 6d 70 75 74 65 20 69 74 73 20 63 6f  * Compute its co
23280 73 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 55  st */.        rU
23290 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c 69 74 65  nsorted = sqlite
232a0 33 4c 6f 67 45 73 74 41 64 64 28 70 57 4c 6f 6f  3LogEstAdd(pWLoo
232b0 70 2d 3e 72 53 65 74 75 70 2c 70 57 4c 6f 6f 70  p->rSetup,pWLoop
232c0 2d 3e 72 52 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e  ->rRun + pFrom->
232d0 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 72  nRow);.        r
232e0 55 6e 73 6f 72 74 65 64 20 3d 20 73 71 6c 69 74  Unsorted = sqlit
232f0 65 33 4c 6f 67 45 73 74 41 64 64 28 72 55 6e 73  e3LogEstAdd(rUns
23300 6f 72 74 65 64 2c 20 70 46 72 6f 6d 2d 3e 72 55  orted, pFrom->rU
23310 6e 73 6f 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nsorted);.      
23320 20 20 6e 4f 75 74 20 3d 20 70 46 72 6f 6d 2d 3e    nOut = pFrom->
23330 6e 52 6f 77 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e  nRow + pWLoop->n
23340 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 6d 61 73  Out;.        mas
23350 6b 4e 65 77 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61  kNew = pFrom->ma
23360 73 6b 4c 6f 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d  skLoop | pWLoop-
23370 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20 20 20 20 20  >maskSelf;.     
23380 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 65 64     if( isOrdered
23390 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
233a0 69 73 4f 72 64 65 72 65 64 20 3d 20 77 68 65 72  isOrdered = wher
233b0 65 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72  ePathSatisfiesOr
233c0 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 0a 20 20  derBy(pWInfo,.  
233d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233e0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72       pWInfo->pOr
233f0 64 65 72 42 79 2c 20 70 46 72 6f 6d 2c 20 70 57  derBy, pFrom, pW
23400 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
23410 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23420 20 20 20 20 20 20 20 20 20 69 4c 6f 6f 70 2c 20           iLoop, 
23430 70 57 4c 6f 6f 70 2c 20 26 72 65 76 4d 61 73 6b  pWLoop, &revMask
23440 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
23450 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 4d  {.          revM
23460 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e 72 65 76  ask = pFrom->rev
23470 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Loop;.        }.
23480 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 72          if( isOr
23490 64 65 72 65 64 3e 3d 30 20 26 26 20 69 73 4f 72  dered>=0 && isOr
234a0 64 65 72 65 64 3c 6e 4f 72 64 65 72 42 79 20 29  dered<nOrderBy )
234b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
234c0 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65  aSortCost[isOrde
234d0 72 65 64 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  red]==0 ){.     
234e0 20 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73 74         aSortCost
234f0 5b 69 73 4f 72 64 65 72 65 64 5d 20 3d 20 77 68  [isOrdered] = wh
23500 65 72 65 53 6f 72 74 69 6e 67 43 6f 73 74 28 0a  ereSortingCost(.
23510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23520 70 57 49 6e 66 6f 2c 20 6e 52 6f 77 45 73 74 2c  pWInfo, nRowEst,
23530 20 6e 4f 72 64 65 72 42 79 2c 20 69 73 4f 72 64   nOrderBy, isOrd
23540 65 72 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  ered.           
23550 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   );.          }.
23560 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74 20            rCost 
23570 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41  = sqlite3LogEstA
23580 64 64 28 72 55 6e 73 6f 72 74 65 64 2c 20 61 53  dd(rUnsorted, aS
23590 6f 72 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65  ortCost[isOrdere
235a0 64 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  d]);..          
235b0 57 48 45 52 45 54 52 41 43 45 28 30 78 30 30 32  WHERETRACE(0x002
235c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
235d0 28 22 2d 2d 2d 2d 20 73 6f 72 74 20 63 6f 73 74  ("---- sort cost
235e0 3d 25 2d 33 64 20 28 25 64 2f 25 64 29 20 69 6e  =%-3d (%d/%d) in
235f0 63 72 65 61 73 65 73 20 63 6f 73 74 20 25 33 64  creases cost %3d
23600 20 74 6f 20 25 2d 33 64 5c 6e 22 2c 0a 20 20 20   to %-3d\n",.   
23610 20 20 20 20 20 20 20 20 20 20 20 20 61 53 6f 72              aSor
23620 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d  tCost[isOrdered]
23630 2c 20 28 6e 4f 72 64 65 72 42 79 2d 69 73 4f 72  , (nOrderBy-isOr
23640 64 65 72 65 64 29 2c 20 6e 4f 72 64 65 72 42 79  dered), nOrderBy
23650 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
23660 20 20 72 55 6e 73 6f 72 74 65 64 2c 20 72 43 6f    rUnsorted, rCo
23670 73 74 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  st));.        }e
23680 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
23690 43 6f 73 74 20 3d 20 72 55 6e 73 6f 72 74 65 64  Cost = rUnsorted
236a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
236b0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
236c0 20 73 65 65 20 69 66 20 70 57 4c 6f 6f 70 20 73   see if pWLoop s
236d0 68 6f 75 6c 64 20 62 65 20 61 64 64 65 64 20 74  hould be added t
236e0 6f 20 74 68 65 20 73 65 74 20 6f 66 0a 20 20 20  o the set of.   
236f0 20 20 20 20 20 2a 2a 20 6d 78 43 68 6f 69 63 65       ** mxChoice
23700 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74   best-so-far pat
23710 68 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  hs..        **. 
23720 20 20 20 20 20 20 20 2a 2a 20 46 69 72 73 74 20         ** First 
23730 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69 73  look for an exis
23740 74 69 6e 67 20 70 61 74 68 20 61 6d 6f 6e 67 20  ting path among 
23750 62 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68  best-so-far path
23760 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61  s.        ** tha
23770 74 20 63 6f 76 65 72 73 20 74 68 65 20 73 61 6d  t covers the sam
23780 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61  e set of loops a
23790 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  nd has the same 
237a0 69 73 4f 72 64 65 72 65 64 0a 20 20 20 20 20 20  isOrdered.      
237b0 20 20 2a 2a 20 73 65 74 74 69 6e 67 20 61 73 20    ** setting as 
237c0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 74 68  the current path
237d0 20 63 61 6e 64 69 64 61 74 65 2e 0a 20 20 20 20   candidate..    
237e0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
237f0 2a 20 54 68 65 20 74 65 72 6d 20 22 28 28 70 54  * The term "((pT
23800 6f 2d 3e 69 73 4f 72 64 65 72 65 64 5e 69 73 4f  o->isOrdered^isO
23810 72 64 65 72 65 64 29 26 30 78 38 30 29 3d 3d 30  rdered)&0x80)==0
23820 22 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 0a  " is equivalent.
23830 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 28 70          ** to (p
23840 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3d 3d 28  To->isOrdered==(
23850 2d 31 29 29 3d 3d 28 69 73 4f 72 64 65 72 65 64  -1))==(isOrdered
23860 3d 3d 28 2d 31 29 29 22 20 66 6f 72 20 74 68 65  ==(-1))" for the
23870 20 72 61 6e 67 65 0a 20 20 20 20 20 20 20 20 2a   range.        *
23880 2a 20 6f 66 20 6c 65 67 61 6c 20 76 61 6c 75 65  * of legal value
23890 73 20 66 6f 72 20 69 73 4f 72 64 65 72 65 64 2c  s for isOrdered,
238a0 20 2d 31 2e 2e 36 34 2e 0a 20 20 20 20 20 20 20   -1..64..       
238b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
238c0 6a 6a 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a  jj=0, pTo=aTo; j
238d0 6a 3c 6e 54 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f  j<nTo; jj++, pTo
238e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
238f0 66 28 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70  f( pTo->maskLoop
23900 3d 3d 6d 61 73 6b 4e 65 77 0a 20 20 20 20 20 20  ==maskNew.      
23910 20 20 20 20 20 26 26 20 28 28 70 54 6f 2d 3e 69       && ((pTo->i
23920 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72  sOrdered^isOrder
23930 65 64 29 26 30 78 38 30 29 3d 3d 30 0a 20 20 20  ed)&0x80)==0.   
23940 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
23950 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
23960 6a 6a 3d 3d 6e 54 6f 2d 31 20 29 3b 0a 20 20 20  jj==nTo-1 );.   
23970 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
23980 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23990 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
239a0 28 20 6a 6a 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20  ( jj>=nTo ){.   
239b0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 65 20 6f         /* None o
239c0 66 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 62  f the existing b
239d0 65 73 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73  est-so-far paths
239e0 20 6d 61 74 63 68 20 74 68 65 20 63 61 6e 64 69   match the candi
239f0 64 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  date. */.       
23a00 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68     if( nTo>=mxCh
23a10 6f 69 63 65 0a 20 20 20 20 20 20 20 20 20 20 20  oice.           
23a20 26 26 20 28 72 43 6f 73 74 3e 6d 78 43 6f 73 74  && (rCost>mxCost
23a30 20 7c 7c 20 28 72 43 6f 73 74 3d 3d 6d 78 43 6f   || (rCost==mxCo
23a40 73 74 20 26 26 20 72 55 6e 73 6f 72 74 65 64 3e  st && rUnsorted>
23a50 3d 6d 78 55 6e 73 6f 72 74 65 64 29 29 0a 20 20  =mxUnsorted)).  
23a60 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
23a70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
23a80 72 72 65 6e 74 20 63 61 6e 64 69 64 61 74 65 20  rrent candidate 
23a90 69 73 20 6e 6f 20 62 65 74 74 65 72 20 74 68 61  is no better tha
23aa0 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6d 78 43  n any of the mxC
23ab0 68 6f 69 63 65 0a 20 20 20 20 20 20 20 20 20 20  hoice.          
23ac0 20 20 2a 2a 20 70 61 74 68 73 20 63 75 72 72 65    ** paths curre
23ad0 6e 74 6c 79 20 69 6e 20 74 68 65 20 62 65 73 74  ntly in the best
23ae0 2d 73 6f 2d 66 61 72 20 62 75 66 66 65 72 2e 20  -so-far buffer. 
23af0 20 53 6f 20 64 69 73 63 61 72 64 0a 20 20 20 20   So discard.    
23b00 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
23b10 63 61 6e 64 69 64 61 74 65 20 61 73 20 6e 6f 74  candidate as not
23b20 20 76 69 61 62 6c 65 2e 20 2a 2f 0a 23 69 66 64   viable. */.#ifd
23b30 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
23b40 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a  ABLED /* 0x4 */.
23b50 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
23b60 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
23b70 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
23b80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
23b90 62 75 67 50 72 69 6e 74 66 28 22 53 6b 69 70 20  bugPrintf("Skip 
23ba0 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25    %s cost=%-3d,%
23bb0 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  3d order=%c\n",.
23bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bd0 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
23be0 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
23bf0 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f  Loop), rCost, nO
23c00 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut,.            
23c10 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64 3e        isOrdered>
23c20 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b 27  =0 ? isOrdered+'
23c30 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  0' : '?');.     
23c40 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
23c50 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
23c60 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
23c70 7d 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  }.          /* I
23c80 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
23c90 70 6f 69 6e 74 73 20 69 74 20 6d 65 61 6e 73 20  points it means 
23ca0 74 68 61 74 20 74 68 65 20 6e 65 77 20 63 61 6e  that the new can
23cb0 64 69 64 61 74 65 20 70 61 74 68 0a 20 20 20 20  didate path.    
23cc0 20 20 20 20 20 20 2a 2a 20 6e 65 65 64 73 20 74        ** needs t
23cd0 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  o be added to th
23ce0 65 20 73 65 74 20 6f 66 20 62 65 73 74 2d 73 6f  e set of best-so
23cf0 2d 66 61 72 20 70 61 74 68 73 2e 20 2a 2f 0a 20  -far paths. */. 
23d00 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 6f           if( nTo
23d10 3c 6d 78 43 68 6f 69 63 65 20 29 7b 0a 20 20 20  <mxChoice ){.   
23d20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72           /* Incr
23d30 65 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ease the size of
23d40 20 74 68 65 20 61 54 6f 20 73 65 74 20 62 79 20   the aTo set by 
23d50 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  one */.         
23d60 20 20 20 6a 6a 20 3d 20 6e 54 6f 2b 2b 3b 0a 20     jj = nTo++;. 
23d70 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
23d80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
23d90 65 77 20 70 61 74 68 20 72 65 70 6c 61 63 65 73  ew path replaces
23da0 20 74 68 65 20 70 72 69 6f 72 20 77 6f 72 73 74   the prior worst
23db0 20 74 6f 20 6b 65 65 70 20 63 6f 75 6e 74 20 62   to keep count b
23dc0 65 6c 6f 77 20 6d 78 43 68 6f 69 63 65 20 2a 2f  elow mxChoice */
23dd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20  .            jj 
23de0 3d 20 6d 78 49 3b 0a 20 20 20 20 20 20 20 20 20  = mxI;.         
23df0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 6f   }.          pTo
23e00 20 3d 20 26 61 54 6f 5b 6a 6a 5d 3b 0a 23 69 66   = &aTo[jj];.#if
23e10 64 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45  def WHERETRACE_E
23e20 4e 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f  NABLED /* 0x4 */
23e30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
23e40 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
23e50 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20  &0x4 ){.        
23e60 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
23e70 50 72 69 6e 74 66 28 22 4e 65 77 20 20 20 20 25  Printf("New    %
23e80 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 20  s cost=%-3d,%3d 
23e90 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20  order=%c\n",.   
23ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
23eb0 72 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d  rePathName(pFrom
23ec0 2c 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29  , iLoop, pWLoop)
23ed0 2c 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 0a 20  , rCost, nOut,. 
23ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
23ef0 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 69 73  sOrdered>=0 ? is
23f00 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20 27 3f  Ordered+'0' : '?
23f10 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ');.          }.
23f20 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d  #endif.        }
23f30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
23f40 2f 2a 20 43 6f 6e 74 72 6f 6c 20 72 65 61 63 68  /* Control reach
23f50 65 73 20 68 65 72 65 20 69 66 20 62 65 73 74 2d  es here if best-
23f60 73 6f 2d 66 61 72 20 70 61 74 68 20 70 54 6f 3d  so-far path pTo=
23f70 61 54 6f 5b 6a 6a 5d 20 63 6f 76 65 72 73 20 74  aTo[jj] covers t
23f80 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
23f90 73 61 6d 65 20 73 65 74 20 6f 66 20 6c 6f 6f 70  same set of loop
23fa0 73 20 61 6e 64 20 68 61 73 20 74 68 65 20 73 61  s and has the sa
23fb0 6d 20 69 73 4f 72 64 65 72 65 64 20 73 65 74 74  m isOrdered sett
23fc0 69 6e 67 20 61 73 20 74 68 65 0a 20 20 20 20 20  ing as the.     
23fd0 20 20 20 20 20 2a 2a 20 63 61 6e 64 69 64 61 74       ** candidat
23fe0 65 20 70 61 74 68 2e 20 20 43 68 65 63 6b 20 74  e path.  Check t
23ff0 6f 20 73 65 65 20 69 66 20 74 68 65 20 63 61 6e  o see if the can
24000 64 69 64 61 74 65 20 73 68 6f 75 6c 64 20 72 65  didate should re
24010 70 6c 61 63 65 0a 20 20 20 20 20 20 20 20 20 20  place.          
24020 2a 2a 20 70 54 6f 20 6f 72 20 69 66 20 74 68 65  ** pTo or if the
24030 20 63 61 6e 64 69 64 61 74 65 20 73 68 6f 75 6c   candidate shoul
24040 64 20 62 65 20 73 6b 69 70 70 65 64 20 2a 2f 0a  d be skipped */.
24050 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
24060 6f 2d 3e 72 43 6f 73 74 3c 72 43 6f 73 74 20 7c  o->rCost<rCost |
24070 7c 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72  | (pTo->rCost==r
24080 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 6e 52 6f  Cost && pTo->nRo
24090 77 3c 3d 6e 4f 75 74 29 20 29 7b 0a 23 69 66 64  w<=nOut) ){.#ifd
240a0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
240b0 41 42 4c 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a  ABLED /* 0x4 */.
240c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
240d0 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
240e0 65 26 30 78 34 20 29 7b 0a 20 20 20 20 20 20 20  e&0x4 ){.       
240f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
24100 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20 20  bugPrintf(.     
24110 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 6b               "Sk
24120 69 70 20 20 20 25 73 20 63 6f 73 74 3d 25 2d 33  ip   %s cost=%-3
24130 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22 2c  d,%3d order=%c",
24140 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24150 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
24160 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70  (pFrom, iLoop, p
24170 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e  WLoop), rCost, n
24180 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Out,.           
24190 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
241a0 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b  >=0 ? isOrdered+
241b0 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
241c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
241d0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
241e0 20 76 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64   vs %s cost=%-3d
241f0 2c 25 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c  ,%d order=%c\n",
24200 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24210 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65     wherePathName
24220 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30  (pTo, iLoop+1, 0
24230 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70  ), pTo->rCost, p
24240 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20  To->nRow,.      
24250 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d              pTo-
24260 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20  >isOrdered>=0 ? 
24270 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27  pTo->isOrdered+'
24280 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20  0' : '?');.     
24290 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
242a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
242b0 69 73 63 61 72 64 20 74 68 65 20 63 61 6e 64 69  iscard the candi
242c0 64 61 74 65 20 70 61 74 68 20 66 72 6f 6d 20 66  date path from f
242d0 75 72 74 68 65 72 20 63 6f 6e 73 69 64 65 72 61  urther considera
242e0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
242f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
24300 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74 20  o->rCost==rCost 
24310 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  );.            c
24320 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
24330 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 74     }.          t
24340 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72 43  estcase( pTo->rC
24350 6f 73 74 3d 3d 72 43 6f 73 74 2b 31 20 29 3b 0a  ost==rCost+1 );.
24360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
24370 74 72 6f 6c 20 72 65 61 63 68 65 73 20 68 65 72  trol reaches her
24380 65 20 69 66 20 74 68 65 20 63 61 6e 64 69 64 61  e if the candida
24390 74 65 20 70 61 74 68 20 69 73 20 62 65 74 74 65  te path is bette
243a0 72 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20 20  r than the.     
243b0 20 20 20 20 20 2a 2a 20 70 54 6f 20 70 61 74 68       ** pTo path
243c0 2e 20 20 52 65 70 6c 61 63 65 20 70 54 6f 20 77  .  Replace pTo w
243d0 69 74 68 20 74 68 65 20 63 61 6e 64 69 64 61 74  ith the candidat
243e0 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57 48 45  e. */.#ifdef WHE
243f0 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  RETRACE_ENABLED 
24400 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20 20  /* 0x4 */.      
24410 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
24420 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29 7b  hereTrace&0x4 ){
24430 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
24440 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
24450 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24460 20 22 55 70 64 61 74 65 20 25 73 20 63 6f 73 74   "Update %s cost
24470 3d 25 2d 33 64 2c 25 33 64 20 6f 72 64 65 72 3d  =%-3d,%3d order=
24480 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %c",.           
24490 20 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61       wherePathNa
244a0 6d 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c  me(pFrom, iLoop,
244b0 20 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c   pWLoop), rCost,
244c0 20 6e 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20   nOut,.         
244d0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
244e0 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b  >=0 ? isOrdered+
244f0 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
24500 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
24510 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 77 61  ebugPrintf("  wa
24520 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25  s %s cost=%-3d,%
24530 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  3d order=%c\n",.
24540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24550 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28 70 54  wherePathName(pT
24560 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20  o, iLoop+1, 0), 
24570 70 54 6f 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d  pTo->rCost, pTo-
24580 3e 6e 52 6f 77 2c 0a 20 20 20 20 20 20 20 20 20  >nRow,.         
24590 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72         pTo->isOr
245a0 64 65 72 65 64 3e 3d 30 20 3f 20 70 54 6f 2d 3e  dered>=0 ? pTo->
245b0 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
245c0 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
245d0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
245e0 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 70 57   }.        /* pW
245f0 4c 6f 6f 70 20 69 73 20 61 20 77 69 6e 6e 65 72  Loop is a winner
24600 2e 20 20 41 64 64 20 69 74 20 74 6f 20 74 68 65  .  Add it to the
24610 20 73 65 74 20 6f 66 20 62 65 73 74 20 73 6f 20   set of best so 
24620 66 61 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  far */.        p
24630 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 3d 20 70  To->maskLoop = p
24640 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f 6f 70 20 7c  From->maskLoop |
24650 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c   pWLoop->maskSel
24660 66 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  f;.        pTo->
24670 72 65 76 4c 6f 6f 70 20 3d 20 72 65 76 4d 61 73  revLoop = revMas
24680 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e  k;.        pTo->
24690 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b 0a 20 20 20  nRow = nOut;.   
246a0 20 20 20 20 20 70 54 6f 2d 3e 72 43 6f 73 74 20       pTo->rCost 
246b0 3d 20 72 43 6f 73 74 3b 0a 20 20 20 20 20 20 20  = rCost;.       
246c0 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 20   pTo->rUnsorted 
246d0 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20  = rUnsorted;.   
246e0 20 20 20 20 20 70 54 6f 2d 3e 69 73 4f 72 64 65       pTo->isOrde
246f0 72 65 64 20 3d 20 69 73 4f 72 64 65 72 65 64 3b  red = isOrdered;
24700 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
24710 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20 70 46 72 6f  pTo->aLoop, pFro
24720 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69 7a 65 6f 66  m->aLoop, sizeof
24730 28 57 68 65 72 65 4c 6f 6f 70 2a 29 2a 69 4c 6f  (WhereLoop*)*iLo
24740 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 70 54 6f  op);.        pTo
24750 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 20 3d  ->aLoop[iLoop] =
24760 20 70 57 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20   pWLoop;.       
24770 20 69 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69   if( nTo>=mxChoi
24780 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ce ){.          
24790 6d 78 49 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  mxI = 0;.       
247a0 20 20 20 6d 78 43 6f 73 74 20 3d 20 61 54 6f 5b     mxCost = aTo[
247b0 30 5d 2e 72 43 6f 73 74 3b 0a 20 20 20 20 20 20  0].rCost;.      
247c0 20 20 20 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d      mxUnsorted =
247d0 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77 3b 0a 20 20   aTo[0].nRow;.  
247e0 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 31          for(jj=1
247f0 2c 20 70 54 6f 3d 26 61 54 6f 5b 31 5d 3b 20 6a  , pTo=&aTo[1]; j
24800 6a 3c 6d 78 43 68 6f 69 63 65 3b 20 6a 6a 2b 2b  j<mxChoice; jj++
24810 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20 20 20 20 20  , pTo++){.      
24820 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 72        if( pTo->r
24830 43 6f 73 74 3e 6d 78 43 6f 73 74 20 0a 20 20 20  Cost>mxCost .   
24840 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 54            || (pT
24850 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74  o->rCost==mxCost
24860 20 26 26 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74   && pTo->rUnsort
24870 65 64 3e 6d 78 55 6e 73 6f 72 74 65 64 29 20 0a  ed>mxUnsorted) .
24880 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20              ){. 
24890 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 78 43               mxC
248a0 6f 73 74 20 3d 20 70 54 6f 2d 3e 72 43 6f 73 74  ost = pTo->rCost
248b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
248c0 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 70 54 6f  mxUnsorted = pTo
248d0 2d 3e 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20 20  ->rUnsorted;.   
248e0 20 20 20 20 20 20 20 20 20 20 20 6d 78 49 20 3d             mxI =
248f0 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20   jj;.           
24900 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
24910 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
24920 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 57  .    }..#ifdef W
24930 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
24940 44 20 20 2f 2a 20 3e 3d 32 20 2a 2f 0a 20 20 20  D  /* >=2 */.   
24950 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
24960 65 54 72 61 63 65 20 26 20 30 78 30 32 20 29 7b  eTrace & 0x02 ){
24970 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
24980 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20  bugPrintf("---- 
24990 61 66 74 65 72 20 72 6f 75 6e 64 20 25 64 20 2d  after round %d -
249a0 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f 70 29 3b 0a  ---\n", iLoop);.
249b0 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 2c 20        for(ii=0, 
249c0 70 54 6f 3d 61 54 6f 3b 20 69 69 3c 6e 54 6f 3b  pTo=aTo; ii<nTo;
249d0 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20   ii++, pTo++){. 
249e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
249f0 62 75 67 50 72 69 6e 74 66 28 22 20 25 73 20 63  bugPrintf(" %s c
24a00 6f 73 74 3d 25 2d 33 64 20 6e 72 6f 77 3d 25 2d  ost=%-3d nrow=%-
24a10 33 64 20 6f 72 64 65 72 3d 25 63 22 2c 0a 20 20  3d order=%c",.  
24a20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50 61           wherePa
24a30 74 68 4e 61 6d 65 28 70 54 6f 2c 20 69 4c 6f 6f  thName(pTo, iLoo
24a40 70 2b 31 2c 20 30 29 2c 20 70 54 6f 2d 3e 72 43  p+1, 0), pTo->rC
24a50 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52 6f 77 2c 0a  ost, pTo->nRow,.
24a60 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e             pTo->
24a70 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 28  isOrdered>=0 ? (
24a80 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27  pTo->isOrdered+'
24a90 30 27 29 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  0') : '?');.    
24aa0 20 20 20 20 69 66 28 20 70 54 6f 2d 3e 69 73 4f      if( pTo->isO
24ab0 72 64 65 72 65 64 3e 30 20 29 7b 0a 20 20 20 20  rdered>0 ){.    
24ac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
24ad0 75 67 50 72 69 6e 74 66 28 22 20 72 65 76 3d 30  ugPrintf(" rev=0
24ae0 78 25 6c 6c 78 5c 6e 22 2c 20 70 54 6f 2d 3e 72  x%llx\n", pTo->r
24af0 65 76 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20  evLoop);.       
24b00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24b10 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
24b20 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20  intf("\n");.    
24b30 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
24b40 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
24b50 2f 2a 20 53 77 61 70 20 74 68 65 20 72 6f 6c 65  /* Swap the role
24b60 73 20 6f 66 20 61 46 72 6f 6d 20 61 6e 64 20 61  s of aFrom and a
24b70 54 6f 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  To for the next 
24b80 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  generation */.  
24b90 20 20 70 46 72 6f 6d 20 3d 20 61 54 6f 3b 0a 20    pFrom = aTo;. 
24ba0 20 20 20 61 54 6f 20 3d 20 61 46 72 6f 6d 3b 0a     aTo = aFrom;.
24bb0 20 20 20 20 61 46 72 6f 6d 20 3d 20 70 46 72 6f      aFrom = pFro
24bc0 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d 20 3d 20 6e  m;.    nFrom = n
24bd0 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e  To;.  }..  if( n
24be0 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  From==0 ){.    s
24bf0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
24c00 50 61 72 73 65 2c 20 22 6e 6f 20 71 75 65 72 79  Parse, "no query
24c10 20 73 6f 6c 75 74 69 6f 6e 22 29 3b 0a 20 20 20   solution");.   
24c20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
24c30 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20 20 20  b, pSpace);.    
24c40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
24c50 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ROR;.  }.  .  /*
24c60 20 46 69 6e 64 20 74 68 65 20 6c 6f 77 65 73 74   Find the lowest
24c70 20 63 6f 73 74 20 70 61 74 68 2e 20 20 70 46 72   cost path.  pFr
24c80 6f 6d 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 20  om will be left 
24c90 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 61 74  pointing to that
24ca0 20 70 61 74 68 20 2a 2f 0a 20 20 70 46 72 6f 6d   path */.  pFrom
24cb0 20 3d 20 61 46 72 6f 6d 3b 0a 20 20 66 6f 72 28   = aFrom;.  for(
24cc0 69 69 3d 31 3b 20 69 69 3c 6e 46 72 6f 6d 3b 20  ii=1; ii<nFrom; 
24cd0 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  ii++){.    if( p
24ce0 46 72 6f 6d 2d 3e 72 43 6f 73 74 3e 61 46 72 6f  From->rCost>aFro
24cf0 6d 5b 69 69 5d 2e 72 43 6f 73 74 20 29 20 70 46  m[ii].rCost ) pF
24d00 72 6f 6d 20 3d 20 26 61 46 72 6f 6d 5b 69 69 5d  rom = &aFrom[ii]
24d10 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
24d20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d  pWInfo->nLevel==
24d30 6e 4c 6f 6f 70 20 29 3b 0a 20 20 2f 2a 20 4c 6f  nLoop );.  /* Lo
24d40 61 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  ad the lowest co
24d50 73 74 20 70 61 74 68 20 69 6e 74 6f 20 70 57 49  st path into pWI
24d60 6e 66 6f 20 2a 2f 0a 20 20 66 6f 72 28 69 4c 6f  nfo */.  for(iLo
24d70 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c 6f 6f  op=0; iLoop<nLoo
24d80 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20  p; iLoop++){.   
24d90 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
24da0 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 20  vel = pWInfo->a 
24db0 2b 20 69 4c 6f 6f 70 3b 0a 20 20 20 20 70 4c 65  + iLoop;.    pLe
24dc0 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 3d 20 70 57  vel->pWLoop = pW
24dd0 4c 6f 6f 70 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c  Loop = pFrom->aL
24de0 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a 20 20 20 20  oop[iLoop];.    
24df0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20  pLevel->iFrom = 
24e00 70 57 4c 6f 6f 70 2d 3e 69 54 61 62 3b 0a 20 20  pWLoop->iTab;.  
24e10 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75    pLevel->iTabCu
24e20 72 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  r = pWInfo->pTab
24e30 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
24e40 69 46 72 6f 6d 5d 2e 69 43 75 72 73 6f 72 3b 0a  iFrom].iCursor;.
24e50 20 20 7d 0a 20 20 69 66 28 20 28 70 57 49 6e 66    }.  if( (pWInf
24e60 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
24e70 57 48 45 52 45 5f 57 41 4e 54 5f 44 49 53 54 49  WHERE_WANT_DISTI
24e80 4e 43 54 29 21 3d 30 0a 20 20 20 26 26 20 28 70  NCT)!=0.   && (p
24e90 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67  WInfo->wctrlFlag
24ea0 73 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e  s & WHERE_DISTIN
24eb0 43 54 42 59 29 3d 3d 30 0a 20 20 20 26 26 20 70  CTBY)==0.   && p
24ec0 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
24ed0 3d 3d 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  ==WHERE_DISTINCT
24ee0 5f 4e 4f 4f 50 0a 20 20 20 26 26 20 6e 52 6f 77  _NOOP.   && nRow
24ef0 45 73 74 0a 20 20 29 7b 0a 20 20 20 20 42 69 74  Est.  ){.    Bit
24f00 6d 61 73 6b 20 6e 6f 74 55 73 65 64 3b 0a 20 20  mask notUsed;.  
24f10 20 20 69 6e 74 20 72 63 20 3d 20 77 68 65 72 65    int rc = where
24f20 50 61 74 68 53 61 74 69 73 66 69 65 73 4f 72 64  PathSatisfiesOrd
24f30 65 72 42 79 28 70 57 49 6e 66 6f 2c 20 70 57 49  erBy(pWInfo, pWI
24f40 6e 66 6f 2d 3e 70 44 69 73 74 69 6e 63 74 53 65  nfo->pDistinctSe
24f50 74 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20  t, pFrom,.      
24f60 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
24f70 5f 44 49 53 54 49 4e 43 54 42 59 2c 20 6e 4c 6f  _DISTINCTBY, nLo
24f80 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  op-1, pFrom->aLo
24f90 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6e 6f  op[nLoop-1], &no
24fa0 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20  tUsed);.    if( 
24fb0 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 44 69 73  rc==pWInfo->pDis
24fc0 74 69 6e 63 74 53 65 74 2d 3e 6e 45 78 70 72 20  tinctSet->nExpr 
24fd0 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  ){.      pWInfo-
24fe0 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
24ff0 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
25000 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  RED;.    }.  }. 
25010 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72   if( pWInfo->pOr
25020 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 66 28  derBy ){.    if(
25030 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c   pWInfo->wctrlFl
25040 61 67 73 20 26 20 57 48 45 52 45 5f 44 49 53 54  ags & WHERE_DIST
25050 49 4e 43 54 42 59 20 29 7b 0a 20 20 20 20 20 20  INCTBY ){.      
25060 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64  if( pFrom->isOrd
25070 65 72 65 64 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f  ered==pWInfo->pO
25080 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
25090 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  .        pWInfo-
250a0 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
250b0 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
250c0 52 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  RED;.      }.   
250d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 57   }else{.      pW
250e0 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70  Info->nOBSat = p
250f0 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65 64 3b  From->isOrdered;
25100 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72  .      pWInfo->r
25110 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d 2d 3e  evMask = pFrom->
25120 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 69  revLoop;.      i
25130 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61  f( pWInfo->nOBSa
25140 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t<=0 ){.        
25150 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
25160 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   0;.        if( 
25170 6e 4c 6f 6f 70 3e 30 20 29 7b 0a 20 20 20 20 20  nLoop>0 ){.     
25180 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d       Bitmask m =
25190 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
251a0 74 20 72 63 20 3d 20 77 68 65 72 65 50 61 74 68  t rc = wherePath
251b0 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42 79  SatisfiesOrderBy
251c0 28 70 57 49 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d  (pWInfo, pWInfo-
251d0 3e 70 4f 72 64 65 72 42 79 2c 20 70 46 72 6f 6d  >pOrderBy, pFrom
251e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
251f0 20 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f 52          WHERE_OR
25200 44 45 52 42 59 5f 4c 49 4d 49 54 2c 20 6e 4c 6f  DERBY_LIMIT, nLo
25210 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f  op-1, pFrom->aLo
25220 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 6d 29  op[nLoop-1], &m)
25230 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
25240 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64  rc==pWInfo->pOrd
25250 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
25260 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e 66             pWInf
25270 6f 2d 3e 62 4f 72 64 65 72 65 64 49 6e 6e 65 72  o->bOrderedInner
25280 4c 6f 6f 70 20 3d 20 31 3b 0a 20 20 20 20 20 20  Loop = 1;.      
25290 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65        pWInfo->re
252a0 76 4d 61 73 6b 20 3d 20 6d 3b 0a 20 20 20 20 20  vMask = m;.     
252b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
252c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
252d0 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f 2d 3e     if( (pWInfo->
252e0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
252f0 52 45 5f 53 4f 52 54 42 59 47 52 4f 55 50 29 0a  RE_SORTBYGROUP).
25300 20 20 20 20 20 20 20 20 26 26 20 70 57 49 6e 66          && pWInf
25310 6f 2d 3e 6e 4f 42 53 61 74 3d 3d 70 57 49 6e 66  o->nOBSat==pWInf
25320 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  o->pOrderBy->nEx
25330 70 72 20 26 26 20 6e 4c 6f 6f 70 3e 30 0a 20 20  pr && nLoop>0.  
25340 20 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61    ){.      Bitma
25350 73 6b 20 72 65 76 4d 61 73 6b 20 3d 20 30 3b 0a  sk revMask = 0;.
25360 20 20 20 20 20 20 69 6e 74 20 6e 4f 72 64 65 72        int nOrder
25370 20 3d 20 77 68 65 72 65 50 61 74 68 53 61 74 69   = wherePathSati
25380 73 66 69 65 73 4f 72 64 65 72 42 79 28 70 57 49  sfiesOrderBy(pWI
25390 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 4f 72  nfo, pWInfo->pOr
253a0 64 65 72 42 79 2c 20 0a 20 20 20 20 20 20 20 20  derBy, .        
253b0 20 20 70 46 72 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f    pFrom, 0, nLoo
253c0 70 2d 31 2c 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  p-1, pFrom->aLoo
253d0 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c 20 26 72 65 76  p[nLoop-1], &rev
253e0 4d 61 73 6b 0a 20 20 20 20 20 20 29 3b 0a 20 20  Mask.      );.  
253f0 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e      assert( pWIn
25400 66 6f 2d 3e 73 6f 72 74 65 64 3d 3d 30 20 29 3b  fo->sorted==0 );
25410 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 64 65  .      if( nOrde
25420 72 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  r==pWInfo->pOrde
25430 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
25440 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 73 6f        pWInfo->so
25450 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rted = 1;.      
25460 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73    pWInfo->revMas
25470 6b 20 3d 20 72 65 76 4d 61 73 6b 3b 0a 20 20 20  k = revMask;.   
25480 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
25490 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f  .  pWInfo->nRowO
254a0 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77  ut = pFrom->nRow
254b0 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 65 6d  ;..  /* Free tem
254c0 70 6f 72 61 72 79 20 6d 65 6d 6f 72 79 20 61 6e  porary memory an
254d0 64 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73  d return success
254e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62 46   */.  sqlite3DbF
254f0 72 65 65 28 64 62 2c 20 70 53 70 61 63 65 29 3b  ree(db, pSpace);
25500 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
25510 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  _OK;.}../*.** Mo
25520 73 74 20 71 75 65 72 69 65 73 20 75 73 65 20 6f  st queries use o
25530 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62  nly a single tab
25540 6c 65 20 28 74 68 65 79 20 61 72 65 20 6e 6f 74  le (they are not
25550 20 6a 6f 69 6e 73 29 20 61 6e 64 20 68 61 76 65   joins) and have
25560 0a 2a 2a 20 73 69 6d 70 6c 65 20 3d 3d 20 63 6f  .** simple == co
25570 6e 73 74 72 61 69 6e 74 73 20 61 67 61 69 6e 73  nstraints agains
25580 74 20 69 6e 64 65 78 65 64 20 66 69 65 6c 64 73  t indexed fields
25590 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
255a0 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 70  attempts.** to p
255b0 6c 61 6e 20 74 68 6f 73 65 20 73 69 6d 70 6c 65  lan those simple
255c0 20 63 61 73 65 73 20 75 73 69 6e 67 20 6d 75 63   cases using muc
255d0 68 20 6c 65 73 73 20 63 65 72 65 6d 6f 6e 79 20  h less ceremony 
255e0 74 68 61 6e 20 74 68 65 0a 2a 2a 20 67 65 6e 65  than the.** gene
255f0 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65 72  ral-purpose quer
25600 79 20 70 6c 61 6e 6e 65 72 2c 20 61 6e 64 20 74  y planner, and t
25610 68 65 72 65 62 79 20 79 69 65 6c 64 20 66 61 73  hereby yield fas
25620 74 65 72 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ter sqlite3_prep
25630 61 72 65 28 29 0a 2a 2a 20 74 69 6d 65 73 20 66  are().** times f
25640 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
25650 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  se..**.** Return
25660 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75 63   non-zero on suc
25670 63 65 73 73 2c 20 69 66 20 74 68 69 73 20 71 75  cess, if this qu
25680 65 72 79 20 63 61 6e 20 62 65 20 68 61 6e 64 6c  ery can be handl
25690 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 6e 6f  ed by this.** no
256a0 2d 66 72 69 6c 6c 73 20 71 75 65 72 79 20 70 6c  -frills query pl
256b0 61 6e 6e 65 72 2e 20 20 52 65 74 75 72 6e 20 7a  anner.  Return z
256c0 65 72 6f 20 69 66 20 74 68 69 73 20 71 75 65 72  ero if this quer
256d0 79 20 6e 65 65 64 73 20 74 68 65 20 0a 2a 2a 20  y needs the .** 
256e0 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65 20  general-purpose 
256f0 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a  query planner..*
25700 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
25710 72 65 53 68 6f 72 74 43 75 74 28 57 68 65 72 65  reShortCut(Where
25720 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
25730 69 6c 64 65 72 29 7b 0a 20 20 57 68 65 72 65 49  ilder){.  WhereI
25740 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 73  nfo *pWInfo;.  s
25750 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
25760 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 57 68 65  em *pItem;.  Whe
25770 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20  reClause *pWC;. 
25780 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
25790 6d 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  m;.  WhereLoop *
257a0 70 4c 6f 6f 70 3b 0a 20 20 69 6e 74 20 69 43 75  pLoop;.  int iCu
257b0 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61  r;.  int j;.  Ta
257c0 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64  ble *pTab;.  Ind
257d0 65 78 20 2a 70 49 64 78 3b 0a 0a 20 20 70 57 49  ex *pIdx;..  pWI
257e0 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
257f0 70 57 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 57  pWInfo;.  if( pW
25800 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
25810 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43   & WHERE_OR_SUBC
25820 4c 41 55 53 45 20 29 20 72 65 74 75 72 6e 20 30  LAUSE ) return 0
25830 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  ;.  assert( pWIn
25840 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53  fo->pTabList->nS
25850 72 63 3e 3d 31 20 29 3b 0a 20 20 70 49 74 65 6d  rc>=1 );.  pItem
25860 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
25870 69 73 74 2d 3e 61 3b 0a 20 20 70 54 61 62 20 3d  ist->a;.  pTab =
25880 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
25890 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
258a0 61 62 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ab) ) return 0;.
258b0 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
258c0 69 73 49 6e 64 65 78 65 64 42 79 20 29 20 72 65  isIndexedBy ) re
258d0 74 75 72 6e 20 30 3b 0a 20 20 69 43 75 72 20 3d  turn 0;.  iCur =
258e0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b   pItem->iCursor;
258f0 0a 20 20 70 57 43 20 3d 20 26 70 57 49 6e 66 6f  .  pWC = &pWInfo
25900 2d 3e 73 57 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d  ->sWC;.  pLoop =
25910 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b   pBuilder->pNew;
25920 0a 20 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  .  pLoop->wsFlag
25930 73 20 3d 20 30 3b 0a 20 20 70 4c 6f 6f 70 2d 3e  s = 0;.  pLoop->
25940 6e 53 6b 69 70 20 3d 20 30 3b 0a 20 20 70 54 65  nSkip = 0;.  pTe
25950 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  rm = sqlite3Wher
25960 65 46 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69  eFindTerm(pWC, i
25970 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45  Cur, -1, 0, WO_E
25980 51 7c 57 4f 5f 49 53 2c 20 30 29 3b 0a 20 20 69  Q|WO_IS, 0);.  i
25990 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20  f( pTerm ){.    
259a0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
259b0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
259c0 49 53 20 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d  IS );.    pLoop-
259d0 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
259e0 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45  _COLUMN_EQ|WHERE
259f0 5f 49 50 4b 7c 57 48 45 52 45 5f 4f 4e 45 52 4f  _IPK|WHERE_ONERO
25a00 57 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c  W;.    pLoop->aL
25a10 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b  Term[0] = pTerm;
25a20 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65  .    pLoop->nLTe
25a30 72 6d 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 6f  rm = 1;.    pLoo
25a40 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d  p->u.btree.nEq =
25a50 20 31 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e   1;.    /* TUNIN
25a60 47 3a 20 43 6f 73 74 20 6f 66 20 61 20 72 6f 77  G: Cost of a row
25a70 69 64 20 6c 6f 6f 6b 75 70 20 69 73 20 31 30 20  id lookup is 10 
25a80 2a 2f 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52  */.    pLoop->rR
25a90 75 6e 20 3d 20 33 33 3b 20 20 2f 2a 20 33 33 3d  un = 33;  /* 33=
25aa0 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31  =sqlite3LogEst(1
25ab0 30 29 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  0) */.  }else{. 
25ac0 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
25ad0 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
25ae0 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
25af0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 4d  ){.      int opM
25b00 61 73 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ask;.      asser
25b10 74 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d  t( pLoop->aLTerm
25b20 53 70 61 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c  Space==pLoop->aL
25b30 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20 69 66  Term );.      if
25b40 28 20 21 49 73 55 6e 69 71 75 65 49 6e 64 65 78  ( !IsUniqueIndex
25b50 28 70 49 64 78 29 0a 20 20 20 20 20 20 20 7c 7c  (pIdx).       ||
25b60 20 70 49 64 78 2d 3e 70 50 61 72 74 49 64 78 57   pIdx->pPartIdxW
25b70 68 65 72 65 21 3d 30 20 0a 20 20 20 20 20 20 20  here!=0 .       
25b80 7c 7c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  || pIdx->nKeyCol
25b90 3e 41 72 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70  >ArraySize(pLoop
25ba0 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 29 20 0a  ->aLTermSpace) .
25bb0 20 20 20 20 20 20 29 20 63 6f 6e 74 69 6e 75 65        ) continue
25bc0 3b 0a 20 20 20 20 20 20 6f 70 4d 61 73 6b 20 3d  ;.      opMask =
25bd0 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75   pIdx->uniqNotNu
25be0 6c 6c 20 3f 20 28 57 4f 5f 45 51 7c 57 4f 5f 49  ll ? (WO_EQ|WO_I
25bf0 53 29 20 3a 20 57 4f 5f 45 51 3b 0a 20 20 20 20  S) : WO_EQ;.    
25c00 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
25c10 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29  x->nKeyCol; j++)
25c20 7b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  {.        pTerm 
25c30 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 46 69  = sqlite3WhereFi
25c40 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
25c50 2c 20 6a 2c 20 30 2c 20 6f 70 4d 61 73 6b 2c 20  , j, 0, opMask, 
25c60 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69  pIdx);.        i
25c70 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72  f( pTerm==0 ) br
25c80 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 74 65 73  eak;.        tes
25c90 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
25ca0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20  perator & WO_IS 
25cb0 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  );.        pLoop
25cc0 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70 54  ->aLTerm[j] = pT
25cd0 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  erm;.      }.   
25ce0 20 20 20 69 66 28 20 6a 21 3d 70 49 64 78 2d 3e     if( j!=pIdx->
25cf0 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e  nKeyCol ) contin
25d00 75 65 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d  ue;.      pLoop-
25d10 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
25d20 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45  _COLUMN_EQ|WHERE
25d30 5f 4f 4e 45 52 4f 57 7c 57 48 45 52 45 5f 49 4e  _ONEROW|WHERE_IN
25d40 44 45 58 45 44 3b 0a 20 20 20 20 20 20 69 66 28  DEXED;.      if(
25d50 20 70 49 64 78 2d 3e 69 73 43 6f 76 65 72 69 6e   pIdx->isCoverin
25d60 67 20 7c 7c 20 28 70 49 74 65 6d 2d 3e 63 6f 6c  g || (pItem->col
25d70 55 73 65 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49  Used & ~columnsI
25d80 6e 49 6e 64 65 78 28 70 49 64 78 29 29 3d 3d 30  nIndex(pIdx))==0
25d90 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f   ){.        pLoo
25da0 70 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48  p->wsFlags |= WH
25db0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20  ERE_IDX_ONLY;.  
25dc0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f      }.      pLoo
25dd0 70 2d 3e 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20  p->nLTerm = j;. 
25de0 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74       pLoop->u.bt
25df0 72 65 65 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20 20  ree.nEq = j;.   
25e00 20 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65     pLoop->u.btre
25e10 65 2e 70 49 6e 64 65 78 20 3d 20 70 49 64 78 3b  e.pIndex = pIdx;
25e20 0a 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47  .      /* TUNING
25e30 3a 20 43 6f 73 74 20 6f 66 20 61 20 75 6e 69 71  : Cost of a uniq
25e40 75 65 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20  ue index lookup 
25e50 69 73 20 31 35 20 2a 2f 0a 20 20 20 20 20 20 70  is 15 */.      p
25e60 4c 6f 6f 70 2d 3e 72 52 75 6e 20 3d 20 33 39 3b  Loop->rRun = 39;
25e70 20 20 2f 2a 20 33 39 3d 3d 73 71 6c 69 74 65 33    /* 39==sqlite3
25e80 4c 6f 67 45 73 74 28 31 35 29 20 2a 2f 0a 20 20  LogEst(15) */.  
25e90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
25ea0 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70  .  }.  if( pLoop
25eb0 2d 3e 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20  ->wsFlags ){.   
25ec0 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28   pLoop->nOut = (
25ed0 4c 6f 67 45 73 74 29 31 3b 0a 20 20 20 20 70 57  LogEst)1;.    pW
25ee0 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f  Info->a[0].pWLoo
25ef0 70 20 3d 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 70  p = pLoop;.    p
25f00 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 20 3d  Loop->maskSelf =
25f10 20 73 71 6c 69 74 65 33 57 68 65 72 65 47 65 74   sqlite3WhereGet
25f20 4d 61 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d  Mask(&pWInfo->sM
25f30 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a 20  askSet, iCur);. 
25f40 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e     pWInfo->a[0].
25f50 69 54 61 62 43 75 72 20 3d 20 69 43 75 72 3b 0a  iTabCur = iCur;.
25f60 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77      pWInfo->nRow
25f70 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  Out = 1;.    if(
25f80 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
25f90 79 20 29 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53  y ) pWInfo->nOBS
25fa0 61 74 20 3d 20 20 70 57 49 6e 66 6f 2d 3e 70 4f  at =  pWInfo->pO
25fb0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
25fc0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 77     if( pWInfo->w
25fd0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
25fe0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 20  E_WANT_DISTINCT 
25ff0 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  ){.      pWInfo-
26000 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
26010 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
26020 55 45 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  UE;.    }.#ifdef
26030 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
26040 20 20 70 4c 6f 6f 70 2d 3e 63 49 64 20 3d 20 27    pLoop->cId = '
26050 30 27 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  0';.#endif.    r
26060 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
26070 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
26080 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 62  * Generate the b
26090 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
260a0 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48  loop used for WH
260b0 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
260c0 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65  ssing..** The re
260d0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20  turn value is a 
260e0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70  pointer to an op
260f0 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20 74  aque structure t
26100 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  hat contains.** 
26110 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64  information need
26120 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  ed to terminate 
26130 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72  the loop.  Later
26140 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  , the calling ro
26150 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20  utine.** should 
26160 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68  invoke sqlite3Wh
26170 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74 68  ereEnd() with th
26180 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
26190 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  f this function.
261a0 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ** in order to c
261b0 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45 52  omplete the WHER
261c0 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
261d0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
261e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
261f0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
26200 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  rns NULL..**.** 
26210 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20 69  The basic idea i
26220 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64  s to do a nested
26230 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20   loop, one loop 
26240 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69  for each table i
26250 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c  n.** the FROM cl
26260 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74  ause of a select
26270 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55  .  (INSERT and U
26280 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73  PDATE statements
26290 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65   are the.** same
262a0 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69 74   as a SELECT wit
262b0 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  h only a single 
262c0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
262d0 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a  M clause.)  For.
262e0 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  ** example, if t
262f0 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a  he SQL is this:.
26300 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45  **.**       SELE
26310 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT * FROM t1, t2
26320 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a  , t3 WHERE ...;.
26330 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63  **.** Then the c
26340 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69 73  ode generated is
26350 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69   conceptually li
26360 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ke the following
26370 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72  :.**.**      for
26380 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20  each row1 in t1 
26390 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f  do       \    Co
263a0 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  de generated.** 
263b0 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72         foreach r
263c0 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20  ow2 in t2 do    
263d0 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33    |-- by sqlite3
263e0 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20  WhereBegin().** 
263f0 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
26400 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20   row3 in t3 do  
26410 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   /.**           
26420 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
26430 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
26440 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f           \    Co
26450 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  de generated.** 
26460 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20         end      
26470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26480 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33    |-- by sqlite3
26490 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20  WhereEnd().**   
264a0 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
264b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
264c0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
264d0 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74   the loops might
264e0 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69   not be nested i
264f0 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77  n the order in w
26500 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70  hich they.** app
26510 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ear in the FROM 
26520 63 6c 61 75 73 65 20 69 66 20 61 20 64 69 66 66  clause if a diff
26530 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62  erent order is b
26540 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61  etter able to ma
26550 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64  ke.** use of ind
26560 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f  ices.  Note also
26570 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 49   that when the I
26580 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61  N operator appea
26590 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45  rs in.** the WHE
265a0 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69  RE clause, it mi
265b0 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64  ght result in ad
265c0 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20  ditional nested 
265d0 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61  loops for.** sca
265e0 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c  nning through al
265f0 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20  l values on the 
26600 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
26610 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a  of the IN..**.**
26620 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65 65   There are Btree
26630 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61   cursors associa
26640 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74 61  ted with each ta
26650 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63 75  ble.  t1 uses cu
26660 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70  rsor.** number p
26670 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43  TabList->a[0].iC
26680 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20  ursor.  t2 uses 
26690 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c  the cursor pTabL
266a0 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f  ist->a[1].iCurso
266b0 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72  r..** And so for
266c0 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  th.  This routin
266d0 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
266e0 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56   to open those V
266f0 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61  DBE cursors.** a
26700 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  nd sqlite3WhereE
26710 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20 74  nd() generates t
26720 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65  he code to close
26730 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   them..**.** The
26740 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74   code that sqlit
26750 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 67  e3WhereBegin() g
26760 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73 20  enerates leaves 
26770 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65  the cursors name
26780 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74  d.** in pTabList
26790 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
267a0 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  ir appropriate e
267b0 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e  ntries.  The [..
267c0 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75  .] code.** can u
267d0 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64  se OP_Column and
267e0 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65   OP_Rowid opcode
267f0 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f  s on these curso
26800 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a  rs to extract.**
26810 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76   data from the v
26820 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66  arious tables of
26830 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
26840 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   If the WHERE cl
26850 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74  ause is empty, t
26860 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73  he foreach loops
26870 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e 20   must each scan 
26880 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20  their.** entire 
26890 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20  tables.  Thus a 
268a0 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69  three-way join i
268b0 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72  s an O(N^3) oper
268c0 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a  ation.  But if.*
268d0 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61 76  * the tables hav
268e0 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68  e indices and th
268f0 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e  ere are terms in
26900 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
26910 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20  e that.** refer 
26920 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73  to those indices
26930 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62  , a complete tab
26940 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61  le scan can be a
26950 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a  voided and the.*
26960 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20  * code will run 
26970 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f  much faster.  Mo
26980 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f  st of the work o
26990 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
269a0 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f  s checking.** to
269b0 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
269c0 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 63  e indices that c
269d0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 70  an be used to sp
269e0 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e  eed up the loop.
269f0 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20  .**.** Terms of 
26a00 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
26a10 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74   are also used t
26a20 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f  o limit which ro
26a30 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d  ws actually.** m
26a40 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e  ake it to the ".
26a50 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  .." in the middl
26a60 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  e of the loop.  
26a70 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72 65  After each "fore
26a80 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f  ach",.** terms o
26a90 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
26aa0 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79  se that use only
26ab0 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c   terms in that l
26ac0 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a  oop and outer.**
26ad0 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75   loops are evalu
26ae0 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73  ated and if fals
26af0 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  e a jump is made
26b00 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73   around all subs
26b10 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20  equent.** inner 
26b20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64  loops (or around
26b30 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68   the "..." if th
26b40 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77 69  e test occurs wi
26b50 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a  thin the inner-.
26b60 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a  ** most loop).**
26b70 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a  .** OUTER JOINS.
26b80 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a  **.** An outer j
26b90 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31  oin of tables t1
26ba0 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65   and t2 is conce
26bb0 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20  ptally coded as 
26bc0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
26bd0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69    foreach row1 i
26be0 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t1 do.**      
26bf0 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20  flag = 0.**     
26c00 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
26c10 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20   t2 do.**       
26c20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20   start:.**      
26c30 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
26c40 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20      flag = 1.** 
26c50 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20       end.**     
26c60 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e   if flag==0 then
26c70 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20  .**        move 
26c80 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20  the row2 cursor 
26c90 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a  to a null row.**
26ca0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61          goto sta
26cb0 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a  rt.**      fi.**
26cc0 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52      end.**.** OR
26cd0 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50 52  DER BY CLAUSE PR
26ce0 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 70  OCESSING.**.** p
26cf0 4f 72 64 65 72 42 79 20 69 73 20 61 20 70 6f 69  OrderBy is a poi
26d00 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45  nter to the ORDE
26d10 52 20 42 59 20 63 6c 61 75 73 65 20 28 6f 72 20  R BY clause (or 
26d20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  the GROUP BY cla
26d30 75 73 65 0a 2a 2a 20 69 66 20 74 68 65 20 57 48  use.** if the WH
26d40 45 52 45 5f 47 52 4f 55 50 42 59 20 66 6c 61 67  ERE_GROUPBY flag
26d50 20 69 73 20 73 65 74 20 69 6e 20 77 63 74 72 6c   is set in wctrl
26d60 46 6c 61 67 73 29 20 6f 66 20 61 20 53 45 4c 45  Flags) of a SELE
26d70 43 54 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  CT statement.** 
26d80 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
26d90 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
26da0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
26db0 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74   or if this rout
26dc0 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
26dd0 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20   from an UPDATE 
26de0 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
26df0 65 6e 74 2c 20 74 68 65 6e 20 70 4f 72 64 65 72  ent, then pOrder
26e00 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  By is NULL..**.*
26e10 2a 20 54 68 65 20 69 49 64 78 43 75 72 20 70 61  * The iIdxCur pa
26e20 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 63  rameter is the c
26e30 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
26e40 61 6e 20 69 6e 64 65 78 2e 20 20 49 66 20 0a 2a  an index.  If .*
26e50 2a 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  * WHERE_OR_SUBCL
26e60 41 55 53 45 20 69 73 20 73 65 74 2c 20 69 49 64  AUSE is set, iId
26e70 78 43 75 72 20 69 73 20 74 68 65 20 63 75 72 73  xCur is the curs
26e80 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20  or number of an 
26e90 69 6e 64 65 78 0a 2a 2a 20 74 6f 20 75 73 65 20  index.** to use 
26ea0 66 6f 72 20 4f 52 20 63 6c 61 75 73 65 20 70 72  for OR clause pr
26eb0 6f 63 65 73 73 69 6e 67 2e 20 20 54 68 65 20 57  ocessing.  The W
26ec0 48 45 52 45 20 63 6c 61 75 73 65 20 73 68 6f 75  HERE clause shou
26ed0 6c 64 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 73  ld use this.** s
26ee0 70 65 63 69 66 69 63 20 63 75 72 73 6f 72 2e 20  pecific cursor. 
26ef0 20 49 66 20 57 48 45 52 45 5f 4f 4e 45 50 41 53   If WHERE_ONEPAS
26f00 53 5f 44 45 53 49 52 45 44 20 69 73 20 73 65 74  S_DESIRED is set
26f10 2c 20 74 68 65 6e 20 69 49 64 78 43 75 72 20 69  , then iIdxCur i
26f20 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63  s.** the first c
26f30 75 72 73 6f 72 20 69 6e 20 61 6e 20 61 72 72 61  ursor in an arra
26f40 79 20 6f 66 20 63 75 72 73 6f 72 73 20 66 6f 72  y of cursors for
26f50 20 61 6c 6c 20 69 6e 64 69 63 65 73 2e 20 20 69   all indices.  i
26f60 49 64 78 43 75 72 20 73 68 6f 75 6c 64 0a 2a 2a  IdxCur should.**
26f70 20 62 65 20 75 73 65 64 20 74 6f 20 63 6f 6d 70   be used to comp
26f80 75 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69  ute the appropri
26f90 61 74 65 20 63 75 72 73 6f 72 20 64 65 70 65 6e  ate cursor depen
26fa0 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20 69 6e  ding on which in
26fb0 64 65 78 20 69 73 0a 2a 2a 20 75 73 65 64 2e 0a  dex is.** used..
26fc0 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71  */.WhereInfo *sq
26fd0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
26fe0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
26ff0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
27000 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
27010 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
27020 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a  TabList,      /*
27030 20 46 52 4f 4d 20 63 6c 61 75 73 65 3a 20 41 20   FROM clause: A 
27040 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c  list of all tabl
27050 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64  es to be scanned
27060 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65   */.  Expr *pWhe
27070 72 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  re,           /*
27080 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
27090 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
270a0 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f  *pOrderBy,     /
270b0 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 28 6f  * An ORDER BY (o
270c0 72 20 47 52 4f 55 50 20 42 59 29 20 63 6c 61 75  r GROUP BY) clau
270d0 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  se, or NULL */. 
270e0 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74   ExprList *pDist
270f0 69 6e 63 74 53 65 74 2c 20 2f 2a 20 54 72 79 20  inctSet, /* Try 
27100 6e 6f 74 20 74 6f 20 6f 75 74 70 75 74 20 74 77  not to output tw
27110 6f 20 72 6f 77 73 20 74 68 61 74 20 64 75 70 6c  o rows that dupl
27120 69 63 61 74 65 20 74 68 65 73 65 20 2a 2f 0a 20  icate these */. 
27130 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c   u16 wctrlFlags,
27140 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
27150 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65  WHERE_* flags de
27160 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49  fined in sqliteI
27170 6e 74 2e 68 20 2a 2f 0a 20 20 69 6e 74 20 69 41  nt.h */.  int iA
27180 75 78 41 72 67 20 20 20 20 20 20 20 20 20 20 20  uxArg           
27190 20 20 2f 2a 20 49 66 20 57 48 45 52 45 5f 4f 52    /* If WHERE_OR
271a0 5f 53 55 42 43 4c 41 55 53 45 20 69 73 20 73 65  _SUBCLAUSE is se
271b0 74 2c 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20  t, index cursor 
271c0 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 20 20 20  number.         
271d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271e0 20 2a 2a 20 49 66 20 57 48 45 52 45 5f 55 53 45   ** If WHERE_USE
271f0 5f 4c 49 4d 49 54 2c 20 74 68 65 6e 20 74 68 65  _LIMIT, then the
27200 20 6c 69 6d 69 74 20 61 6d 6f 75 6e 74 20 2a 2f   limit amount */
27210 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 57  .){.  int nByteW
27220 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Info;           
27230 20 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61   /* Num. bytes a
27240 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65  llocated for Whe
27250 72 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f  reInfo struct */
27260 0a 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b  .  int nTabList;
27270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27280 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
27290 6e 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20  nts in pTabList 
272a0 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
272b0 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
272c0 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74  /* Will become t
272d0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
272e0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
272f0 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
27300 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
27310 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
27320 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20  database engine 
27330 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
27340 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20  Ready;          
27350 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20  /* Cursors that 
27360 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69  are not yet posi
27370 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72  tioned */.  Wher
27380 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 73 57 4c  eLoopBuilder sWL
27390 42 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68  B;     /* The Wh
273a0 65 72 65 4c 6f 6f 70 20 62 75 69 6c 64 65 72 20  ereLoop builder 
273b0 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
273c0 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
273d0 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
273e0 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20  n mask set */.  
273f0 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
27400 65 6c 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 20  el;        /* A 
27410 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20  single level in 
27420 70 57 49 6e 66 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20  pWInfo->a[] */. 
27430 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f   WhereLoop *pLoo
27440 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  p;          /* P
27450 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67  ointer to a sing
27460 6c 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  le WhereLoop obj
27470 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b  ect */.  int ii;
27480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27490 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
274a0 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ter */.  sqlite3
274b0 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
274c0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
274d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
274e0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
274f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
27500 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75  turn code */.  u
27510 38 20 62 46 6f 72 64 65 6c 65 74 65 20 3d 20 30  8 bFordelete = 0
27520 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 46  ;         /* OPF
27530 4c 41 47 5f 46 4f 52 44 45 4c 45 54 45 20 6f 72  LAG_FORDELETE or
27540 20 7a 65 72 6f 2c 20 61 73 20 61 70 70 72 6f 70   zero, as approp
27550 72 69 61 74 65 20 2a 2f 0a 0a 20 20 61 73 73 65  riate */..  asse
27560 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  rt( (wctrlFlags 
27570 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
27580 4d 55 4c 54 49 52 4f 57 29 3d 3d 30 20 7c 7c 20  MULTIROW)==0 || 
27590 28 0a 20 20 20 20 20 20 20 20 28 77 63 74 72 6c  (.        (wctrl
275a0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e  Flags & WHERE_ON
275b0 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d  EPASS_DESIRED)!=
275c0 30 20 0a 20 20 20 20 20 26 26 20 28 77 63 74 72  0 .     && (wctr
275d0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
275e0 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 20  R_SUBCLAUSE)==0 
275f0 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 4f 6e 6c  .  ));..  /* Onl
27600 79 20 6f 6e 65 20 6f 66 20 57 48 45 52 45 5f 4f  y one of WHERE_O
27610 52 5f 53 55 42 43 4c 41 55 53 45 20 6f 72 20 57  R_SUBCLAUSE or W
27620 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 20 2a  HERE_USE_LIMIT *
27630 2f 0a 20 20 61 73 73 65 72 74 28 20 28 77 63 74  /.  assert( (wct
27640 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
27650 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30  OR_SUBCLAUSE)==0
27660 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
27670 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
27680 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54 29 3d 3d  ERE_USE_LIMIT)==
27690 30 20 29 3b 0a 0a 20 20 2f 2a 20 56 61 72 69 61  0 );..  /* Varia
276a0 62 6c 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ble initializati
276b0 6f 6e 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  on */.  db = pPa
276c0 72 73 65 2d 3e 64 62 3b 0a 20 20 6d 65 6d 73 65  rse->db;.  memse
276d0 74 28 26 73 57 4c 42 2c 20 30 2c 20 73 69 7a 65  t(&sWLB, 0, size
276e0 6f 66 28 73 57 4c 42 29 29 3b 0a 0a 20 20 2f 2a  of(sWLB));..  /*
276f0 20 41 6e 20 4f 52 44 45 52 2f 47 52 4f 55 50 20   An ORDER/GROUP 
27700 42 59 20 63 6c 61 75 73 65 20 6f 66 20 6d 6f 72  BY clause of mor
27710 65 20 74 68 61 6e 20 36 33 20 74 65 72 6d 73 20  e than 63 terms 
27720 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69  cannot be optimi
27730 7a 65 64 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  zed */.  testcas
27740 65 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70  e( pOrderBy && p
27750 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d  OrderBy->nExpr==
27760 42 4d 53 2d 31 20 29 3b 0a 20 20 69 66 28 20 70  BMS-1 );.  if( p
27770 4f 72 64 65 72 42 79 20 26 26 20 70 4f 72 64 65  OrderBy && pOrde
27780 72 42 79 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20  rBy->nExpr>=BMS 
27790 29 20 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ) pOrderBy = 0;.
277a0 20 20 73 57 4c 42 2e 70 4f 72 64 65 72 42 79 20    sWLB.pOrderBy 
277b0 3d 20 70 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f  = pOrderBy;..  /
277c0 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20 44 49  * Disable the DI
277d0 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a 61 74  STINCT optimizat
277e0 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 44 69  ion if SQLITE_Di
277f0 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73 65 74  stinctOpt is set
27800 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69 74 65   via.  ** sqlite
27810 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51 4c 49  3_test_ctrl(SQLI
27820 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
27830 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29 20 2a  MIZATIONS,...) *
27840 2f 0a 20 20 69 66 28 20 4f 70 74 69 6d 69 7a 61  /.  if( Optimiza
27850 74 69 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c  tionDisabled(db,
27860 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74   SQLITE_Distinct
27870 4f 70 74 29 20 29 7b 0a 20 20 20 20 77 63 74 72  Opt) ){.    wctr
27880 6c 46 6c 61 67 73 20 26 3d 20 7e 57 48 45 52 45  lFlags &= ~WHERE
27890 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 3b 0a  _WANT_DISTINCT;.
278a0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75    }..  /* The nu
278b0 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  mber of tables i
278c0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
278d0 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79 20  e is limited by 
278e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
278f0 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69 74  ** bits in a Bit
27900 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65 73  mask .  */.  tes
27910 74 63 61 73 65 28 20 70 54 61 62 4c 69 73 74 2d  tcase( pTabList-
27920 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20 20  >nSrc==BMS );.  
27930 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  if( pTabList->nS
27940 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71  rc>BMS ){.    sq
27950 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
27960 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25  arse, "at most %
27970 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f  d tables in a jo
27980 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72  in", BMS);.    r
27990 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
279a0 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
279b0 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72 61   normally genera
279c0 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f  tes a nested loo
279d0 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73  p for all tables
279e0 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c 69   in .  ** pTabLi
279f0 73 74 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  st.  But if the 
27a00 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
27a10 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  SE flag is set, 
27a20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64 0a 20  then we should. 
27a30 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72 61 74   ** only generat
27a40 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 66  e code for the f
27a50 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20 70 54  irst table in pT
27a60 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73 75 6d  abList and assum
27a70 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e 79 20  e that.  ** any 
27a80 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
27a90 65 64 20 77 69 74 68 20 73 75 62 73 65 71 75 65  ed with subseque
27aa0 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20 75 6e  nt tables are un
27ab0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
27ac0 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d 20 28  /.  nTabList = (
27ad0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
27ae0 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29  RE_OR_SUBCLAUSE)
27af0 20 3f 20 31 20 3a 20 70 54 61 62 4c 69 73 74 2d   ? 1 : pTabList-
27b00 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  >nSrc;..  /* All
27b10 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
27b20 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e  lize the WhereIn
27b30 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
27b40 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
27b50 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61  e.  ** return va
27b60 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c  lue. A single al
27b70 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64  location is used
27b80 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68   to store the Wh
27b90 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72  ereInfo.  ** str
27ba0 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  uct, the content
27bb0 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61  s of WhereInfo.a
27bc0 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61  [], the WhereCla
27bd0 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  use structure.  
27be0 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65  ** and the Where
27bf0 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
27c00 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c  e. Since WhereCl
27c10 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ause contains an
27c20 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65   8-byte.  ** fie
27c30 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b  ld (type Bitmask
27c40 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69  ) it must be ali
27c50 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74  gned on an 8-byt
27c60 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20  e boundary on.  
27c70 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63  ** some architec
27c80 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65  tures. Hence the
27c90 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e   ROUND8() below.
27ca0 0a 20 20 2a 2f 0a 20 20 6e 42 79 74 65 57 49 6e  .  */.  nByteWIn
27cb0 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  fo = ROUND8(size
27cc0 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 2b 28 6e  of(WhereInfo)+(n
27cd0 54 61 62 4c 69 73 74 2d 31 29 2a 73 69 7a 65 6f  TabList-1)*sizeo
27ce0 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a  f(WhereLevel));.
27cf0 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74    pWInfo = sqlit
27d00 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
27d10 62 2c 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20  b, nByteWInfo + 
27d20 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70  sizeof(WhereLoop
27d30 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ));.  if( db->ma
27d40 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
27d50 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
27d60 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 20  db, pWInfo);.   
27d70 20 70 57 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20   pWInfo = 0;.   
27d80 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
27d90 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49  Error;.  }.  pWI
27da0 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73  nfo->aiCurOnePas
27db0 73 5b 30 5d 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  s[0] = pWInfo->a
27dc0 69 43 75 72 4f 6e 65 50 61 73 73 5b 31 5d 20 3d  iCurOnePass[1] =
27dd0 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e   -1;.  pWInfo->n
27de0 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69 73 74  Level = nTabList
27df0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  ;.  pWInfo->pPar
27e00 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
27e10 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20  WInfo->pTabList 
27e20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57  = pTabList;.  pW
27e30 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 3d  Info->pOrderBy =
27e40 20 70 4f 72 64 65 72 42 79 3b 0a 20 20 70 57 49   pOrderBy;.  pWI
27e50 6e 66 6f 2d 3e 70 44 69 73 74 69 6e 63 74 53 65  nfo->pDistinctSe
27e60 74 20 3d 20 70 44 69 73 74 69 6e 63 74 53 65 74  t = pDistinctSet
27e70 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ;.  pWInfo->iBre
27e80 61 6b 20 3d 20 70 57 49 6e 66 6f 2d 3e 69 43 6f  ak = pWInfo->iCo
27e90 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69 74 65 33  ntinue = sqlite3
27ea0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
27eb0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72  ;.  pWInfo->wctr
27ec0 6c 46 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c  lFlags = wctrlFl
27ed0 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69  ags;.  pWInfo->i
27ee0 4c 69 6d 69 74 20 3d 20 69 41 75 78 41 72 67 3b  Limit = iAuxArg;
27ef0 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64  .  pWInfo->saved
27f00 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61  NQueryLoop = pPa
27f10 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b  rse->nQueryLoop;
27f20 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
27f30 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45  o->eOnePass==ONE
27f40 50 41 53 53 5f 4f 46 46 20 29 3b 20 20 2f 2a 20  PASS_OFF );  /* 
27f50 4f 4e 45 50 41 53 53 20 64 65 66 61 75 6c 74 73  ONEPASS defaults
27f60 20 74 6f 20 4f 46 46 20 2a 2f 0a 20 20 70 4d 61   to OFF */.  pMa
27f70 73 6b 53 65 74 20 3d 20 26 70 57 49 6e 66 6f 2d  skSet = &pWInfo-
27f80 3e 73 4d 61 73 6b 53 65 74 3b 0a 20 20 73 57 4c  >sMaskSet;.  sWL
27f90 42 2e 70 57 49 6e 66 6f 20 3d 20 70 57 49 6e 66  B.pWInfo = pWInf
27fa0 6f 3b 0a 20 20 73 57 4c 42 2e 70 57 43 20 3d 20  o;.  sWLB.pWC = 
27fb0 26 70 57 49 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20  &pWInfo->sWC;.  
27fc0 73 57 4c 42 2e 70 4e 65 77 20 3d 20 28 57 68 65  sWLB.pNew = (Whe
27fd0 72 65 4c 6f 6f 70 2a 29 28 28 28 63 68 61 72 2a  reLoop*)(((char*
27fe0 29 70 57 49 6e 66 6f 29 2b 6e 42 79 74 65 57 49  )pWInfo)+nByteWI
27ff0 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
28000 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
28010 4d 45 4e 54 28 73 57 4c 42 2e 70 4e 65 77 29 20  MENT(sWLB.pNew) 
28020 29 3b 0a 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e  );.  whereLoopIn
28030 69 74 28 73 57 4c 42 2e 70 4e 65 77 29 3b 0a 23  it(sWLB.pNew);.#
28040 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
28050 55 47 0a 20 20 73 57 4c 42 2e 70 4e 65 77 2d 3e  UG.  sWLB.pNew->
28060 63 49 64 20 3d 20 27 2a 27 3b 0a 23 65 6e 64 69  cId = '*';.#endi
28070 66 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68  f..  /* Split th
28080 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
28090 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73 75 62  nto separate sub
280a0 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72  expressions wher
280b0 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65  e each.  ** sube
280c0 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70  xpression is sep
280d0 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44  arated by an AND
280e0 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a   operator..  */.
280f0 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d    initMaskSet(pM
28100 61 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c 69 74  askSet);.  sqlit
28110 65 33 57 68 65 72 65 43 6c 61 75 73 65 49 6e 69  e3WhereClauseIni
28120 74 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43 2c 20  t(&pWInfo->sWC, 
28130 70 57 49 6e 66 6f 29 3b 0a 20 20 73 71 6c 69 74  pWInfo);.  sqlit
28140 65 33 57 68 65 72 65 53 70 6c 69 74 28 26 70 57  e3WhereSplit(&pW
28150 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 68 65 72  Info->sWC, pWher
28160 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20  e, TK_AND);.    
28170 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61  .  /* Special ca
28180 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75  se: a WHERE clau
28190 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74  se that is const
281a0 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74  ant.  Evaluate t
281b0 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69  he.  ** expressi
281c0 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75  on and either ju
281d0 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74  mp over all of t
281e0 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20  he code or fall 
281f0 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  thru..  */.  for
28200 28 69 69 3d 30 3b 20 69 69 3c 73 57 4c 42 2e 70  (ii=0; ii<sWLB.p
28210 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29  WC->nTerm; ii++)
28220 7b 0a 20 20 20 20 69 66 28 20 6e 54 61 62 4c 69  {.    if( nTabLi
28230 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  st==0 || sqlite3
28240 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f  ExprIsConstantNo
28250 74 4a 6f 69 6e 28 73 57 4c 42 2e 70 57 43 2d 3e  tJoin(sWLB.pWC->
28260 61 5b 69 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  a[ii].pExpr) ){.
28270 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
28280 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
28290 20 73 57 4c 42 2e 70 57 43 2d 3e 61 5b 69 69 5d   sWLB.pWC->a[ii]
282a0 2e 70 45 78 70 72 2c 20 70 57 49 6e 66 6f 2d 3e  .pExpr, pWInfo->
282b0 69 42 72 65 61 6b 2c 0a 20 20 20 20 20 20 20 20  iBreak,.        
282c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282d0 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55   SQLITE_JUMPIFNU
282e0 4c 4c 29 3b 0a 20 20 20 20 20 20 73 57 4c 42 2e  LL);.      sWLB.
282f0 70 57 43 2d 3e 61 5b 69 69 5d 2e 77 74 46 6c 61  pWC->a[ii].wtFla
28300 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44  gs |= TERM_CODED
28310 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
28320 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
28330 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  No FROM clause. 
28340 20 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62 4c 69   */.  if( nTabLi
28350 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  st==0 ){.    if(
28360 20 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e   pOrderBy ) pWIn
28370 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 4f 72  fo->nOBSat = pOr
28380 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
28390 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73    if( wctrlFlags
283a0 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
283b0 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20  STINCT ){.      
283c0 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
283d0 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
283e0 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d  CT_UNIQUE;.    }
283f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67  .  }..  /* Assig
28400 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65  n a bit from the
28410 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72   bitmask to ever
28420 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52  y term in the FR
28430 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  OM clause..  **.
28440 20 20 2a 2a 20 54 68 65 20 4e 2d 74 68 20 74 65    ** The N-th te
28450 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rm of the FROM c
28460 6c 61 75 73 65 20 69 73 20 61 73 73 69 67 6e 65  lause is assigne
28470 64 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 31  d a bitmask of 1
28480 3c 3c 4e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  <<N..  **.  ** T
28490 68 65 20 72 75 6c 65 20 6f 66 20 74 68 65 20 70  he rule of the p
284a0 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65  revious sentence
284b0 20 65 6e 73 75 72 65 73 20 74 68 74 61 20 69 66   ensures thta if
284c0 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61 73   X is the bitmas
284d0 6b 20 66 6f 72 0a 20 20 2a 2a 20 61 20 74 61 62  k for.  ** a tab
284e0 6c 65 20 54 2c 20 74 68 65 6e 20 58 2d 31 20 69  le T, then X-1 i
284f0 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  s the bitmask fo
28500 72 20 61 6c 6c 20 6f 74 68 65 72 20 74 61 62 6c  r all other tabl
28510 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  es to the left o
28520 66 20 54 2e 0a 20 20 2a 2a 20 4b 6e 6f 77 69 6e  f T..  ** Knowin
28530 67 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  g the bitmask fo
28540 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  r all tables to 
28550 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65  the left of a le
28560 66 74 20 6a 6f 69 6e 20 69 73 0a 20 20 2a 2a 20  ft join is.  ** 
28570 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b  important.  Tick
28580 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20  et #3015..  **. 
28590 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 69   ** Note that bi
285a0 74 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61 74  tmasks are creat
285b0 65 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c  ed for all pTabL
285c0 69 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73  ist->nSrc tables
285d0 20 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73   in.  ** pTabLis
285e0 74 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20  t, not just the 
285f0 66 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20 74  first nTabList t
28600 61 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73 74  ables.  nTabList
28610 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a   is normally.  *
28620 2a 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c  * equal to pTabL
28630 69 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69  ist->nSrc but mi
28640 67 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64  ght be shortened
28650 20 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20 2a   to 1 if the.  *
28660 2a 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c  * WHERE_OR_SUBCL
28670 41 55 53 45 20 66 6c 61 67 20 69 73 20 73 65 74  AUSE flag is set
28680 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d  ..  */.  for(ii=
28690 30 3b 20 69 69 3c 70 54 61 62 4c 69 73 74 2d 3e  0; ii<pTabList->
286a0 6e 53 72 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  nSrc; ii++){.   
286b0 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73   createMask(pMas
286c0 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
286d0 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  a[ii].iCursor);.
286e0 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
286f0 54 61 62 46 75 6e 63 41 72 67 73 28 70 50 61 72  TabFuncArgs(pPar
28700 73 65 2c 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  se, &pTabList->a
28710 5b 69 69 5d 2c 20 26 70 57 49 6e 66 6f 2d 3e 73  [ii], &pWInfo->s
28720 57 43 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  WC);.  }.#ifdef 
28730 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66  SQLITE_DEBUG.  f
28740 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 54 61 62  or(ii=0; ii<pTab
28750 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 69 2b 2b  List->nSrc; ii++
28760 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  ){.    Bitmask m
28770 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 47   = sqlite3WhereG
28780 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
28790 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 69 5d   pTabList->a[ii]
287a0 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 61  .iCursor);.    a
287b0 73 73 65 72 74 28 20 6d 3d 3d 4d 41 53 4b 42 49  ssert( m==MASKBI
287c0 54 28 69 69 29 20 29 3b 0a 20 20 7d 0a 23 65 6e  T(ii) );.  }.#en
287d0 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a  dif..  /* Analyz
287e0 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62  e all of the sub
287f0 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 2a 2f 0a  expressions. */.
28800 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 78    sqlite3WhereEx
28810 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69  prAnalyze(pTabLi
28820 73 74 2c 20 26 70 57 49 6e 66 6f 2d 3e 73 57 43  st, &pWInfo->sWC
28830 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
28840 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f  locFailed ) goto
28850 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
28860 3b 0a 0a 20 20 69 66 28 20 77 63 74 72 6c 46 6c  ;..  if( wctrlFl
28870 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
28880 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20 20  _DISTINCT ){.   
28890 20 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 52   if( isDistinctR
288a0 65 64 75 6e 64 61 6e 74 28 70 50 61 72 73 65 2c  edundant(pParse,
288b0 20 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e   pTabList, &pWIn
288c0 66 6f 2d 3e 73 57 43 2c 20 70 44 69 73 74 69 6e  fo->sWC, pDistin
288d0 63 74 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20  ctSet) ){.      
288e0 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54 20  /* The DISTINCT 
288f0 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e 74  marking is point
28900 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65 20 69 74  less.  Ignore it
28910 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e 66  . */.      pWInf
28920 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
28930 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
28940 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20  IQUE;.    }else 
28950 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
28960 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20  ){.      /* Try 
28970 74 6f 20 4f 52 44 45 52 20 42 59 20 74 68 65 20  to ORDER BY the 
28980 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20 6d 61  result set to ma
28990 6b 65 20 64 69 73 74 69 6e 63 74 20 70 72 6f 63  ke distinct proc
289a0 65 73 73 69 6e 67 20 65 61 73 69 65 72 20 2a 2f  essing easier */
289b0 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 77  .      pWInfo->w
289c0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48 45  ctrlFlags |= WHE
289d0 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a 20  RE_DISTINCTBY;. 
289e0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72       pWInfo->pOr
289f0 64 65 72 42 79 20 3d 20 70 44 69 73 74 69 6e 63  derBy = pDistinc
28a00 74 53 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  tSet;.    }.  }.
28a10 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20  .  /* Construct 
28a20 74 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62  the WhereLoop ob
28a30 6a 65 63 74 73 20 2a 2f 0a 23 69 66 20 64 65 66  jects */.#if def
28a40 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f  ined(WHERETRACE_
28a50 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20 73  ENABLED).  if( s
28a60 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
28a70 20 26 20 30 78 66 66 66 66 20 29 7b 0a 20 20 20   & 0xffff ){.   
28a80 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
28a90 6e 74 66 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  ntf("*** Optimiz
28aa0 65 72 20 53 74 61 72 74 20 2a 2a 2a 20 28 77 63  er Start *** (wc
28ab0 74 72 6c 46 6c 61 67 73 3a 20 30 78 25 78 22 2c  trlFlags: 0x%x",
28ac0 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20  wctrlFlags);.   
28ad0 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20   if( wctrlFlags 
28ae0 26 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49  & WHERE_USE_LIMI
28af0 54 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T ){.      sqlit
28b00 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c  e3DebugPrintf(",
28b10 20 6c 69 6d 69 74 3a 20 25 64 22 2c 20 69 41 75   limit: %d", iAu
28b20 78 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xArg);.    }.   
28b30 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
28b40 6e 74 66 28 22 29 5c 6e 22 29 3b 0a 20 20 7d 0a  ntf(")\n");.  }.
28b50 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
28b60 72 65 54 72 61 63 65 20 26 20 30 78 31 30 30 20  reTrace & 0x100 
28b70 29 7b 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c  ){ /* Display al
28b80 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  l terms of the W
28b90 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
28ba0 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43     sqlite3WhereC
28bb0 6c 61 75 73 65 50 72 69 6e 74 28 73 57 4c 42 2e  lausePrint(sWLB.
28bc0 70 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  pWC);.  }.#endif
28bd0 0a 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74  ..  if( nTabList
28be0 21 3d 31 20 7c 7c 20 77 68 65 72 65 53 68 6f 72  !=1 || whereShor
28bf0 74 43 75 74 28 26 73 57 4c 42 29 3d 3d 30 20 29  tCut(&sWLB)==0 )
28c00 7b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  {.    rc = where
28c10 4c 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42  LoopAddAll(&sWLB
28c20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
28c30 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
28c40 72 72 6f 72 3b 0a 20 20 0a 23 69 66 64 65 66 20  rror;.  .#ifdef 
28c50 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
28c60 45 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ED.    if( sqlit
28c70 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 20  e3WhereTrace ){ 
28c80 20 20 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c     /* Display al
28c90 6c 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f  l of the WhereLo
28ca0 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  op objects */.  
28cb0 20 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70      WhereLoop *p
28cc0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
28cd0 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
28ce0 74 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20  t char zLabel[] 
28cf0 3d 20 22 30 31 32 33 34 35 36 37 38 39 61 62 63  = "0123456789abc
28d00 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73  defghijklmnopqrs
28d10 74 75 76 77 79 78 7a 22 0a 20 20 20 20 20 20 20  tuvwyxz".       
28d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d40 20 20 20 20 20 20 22 41 42 43 44 45 46 47 48 49        "ABCDEFGHI
28d50 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58  JKLMNOPQRSTUVWYX
28d60 5a 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d  Z";.      for(p=
28d70 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20  pWInfo->pLoops, 
28d80 69 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  i=0; p; p=p->pNe
28d90 78 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20  xtLoop, i++){.  
28da0 20 20 20 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a        p->cId = z
28db0 4c 61 62 65 6c 5b 69 25 73 69 7a 65 6f 66 28 7a  Label[i%sizeof(z
28dc0 4c 61 62 65 6c 29 5d 3b 0a 20 20 20 20 20 20 20  Label)];.       
28dd0 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28   whereLoopPrint(
28de0 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b 0a 20 20  p, sWLB.pWC);.  
28df0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
28e00 69 66 0a 20 20 0a 20 20 20 20 77 68 65 72 65 50  if.  .    whereP
28e10 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f  athSolver(pWInfo
28e20 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 62  , 0);.    if( db
28e30 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
28e40 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
28e50 45 72 72 6f 72 3b 0a 20 20 20 20 69 66 28 20 70  Error;.    if( p
28e60 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20  WInfo->pOrderBy 
28e70 29 7b 0a 20 20 20 20 20 20 20 77 68 65 72 65 50  ){.       whereP
28e80 61 74 68 53 6f 6c 76 65 72 28 70 57 49 6e 66 6f  athSolver(pWInfo
28e90 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75  , pWInfo->nRowOu
28ea0 74 2b 31 29 3b 0a 20 20 20 20 20 20 20 69 66 28  t+1);.       if(
28eb0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
28ec0 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
28ed0 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  ginError;.    }.
28ee0 20 20 7d 0a 20 20 69 66 28 20 70 57 49 6e 66 6f    }.  if( pWInfo
28ef0 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 26 26  ->pOrderBy==0 &&
28f00 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51   (db->flags & SQ
28f10 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65  LITE_ReverseOrde
28f20 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 70 57  r)!=0 ){.     pW
28f30 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20  Info->revMask = 
28f40 41 4c 4c 42 49 54 53 3b 0a 20 20 7d 0a 20 20 69  ALLBITS;.  }.  i
28f50 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
28f60 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d 61 6c  || NEVER(db->mal
28f70 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b 0a 20 20  locFailed) ){.  
28f80 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
28f90 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23 69 66 64  nError;.  }.#ifd
28fa0 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
28fb0 41 42 4c 45 44 0a 20 20 69 66 28 20 73 71 6c 69  ABLED.  if( sqli
28fc0 74 65 33 57 68 65 72 65 54 72 61 63 65 20 29 7b  te3WhereTrace ){
28fd0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
28fe0 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d 20 53 6f  gPrintf("---- So
28ff0 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25 64 22 2c  lution nRow=%d",
29000 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74   pWInfo->nRowOut
29010 29 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e 66  );.    if( pWInf
29020 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20 29 7b 0a 20  o->nOBSat>0 ){. 
29030 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
29040 67 50 72 69 6e 74 66 28 22 20 4f 52 44 45 52 42  gPrintf(" ORDERB
29050 59 3d 25 64 2c 30 78 25 6c 6c 78 22 2c 20 70 57  Y=%d,0x%llx", pW
29060 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 70 57  Info->nOBSat, pW
29070 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 29 3b 0a  Info->revMask);.
29080 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68      }.    switch
29090 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69  ( pWInfo->eDisti
290a0 6e 63 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73  nct ){.      cas
290b0 65 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  e WHERE_DISTINCT
290c0 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20 20 20 20  _UNIQUE: {.     
290d0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
290e0 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43  rintf("  DISTINC
290f0 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20 20 20 20  T=unique");.    
29100 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
29110 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57 48   }.      case WH
29120 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44  ERE_DISTINCT_ORD
29130 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20  ERED: {.        
29140 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
29150 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 6f  tf("  DISTINCT=o
29160 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20 20 20  rdered");.      
29170 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
29180 0a 20 20 20 20 20 20 63 61 73 65 20 57 48 45 52  .      case WHER
29190 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 4f 52 44  E_DISTINCT_UNORD
291a0 45 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20  ERED: {.        
291b0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
291c0 74 66 28 22 20 20 44 49 53 54 49 4e 43 54 3d 75  tf("  DISTINCT=u
291d0 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20 20  nordered");.    
291e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
291f0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
29200 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
29210 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 69  "\n");.    for(i
29220 69 3d 30 3b 20 69 69 3c 70 57 49 6e 66 6f 2d 3e  i=0; ii<pWInfo->
29230 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b 29 7b 0a 20  nLevel; ii++){. 
29240 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72       whereLoopPr
29250 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 69  int(pWInfo->a[ii
29260 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c 42 2e 70  ].pWLoop, sWLB.p
29270 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  WC);.    }.  }.#
29280 65 6e 64 69 66 0a 20 20 2f 2a 20 41 74 74 65 6d  endif.  /* Attem
29290 70 74 20 74 6f 20 6f 6d 69 74 20 74 61 62 6c 65  pt to omit table
292a0 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 69 6e 20  s from the join 
292b0 74 68 61 74 20 64 6f 20 6e 6f 74 20 65 66 66 65  that do not effe
292c0 63 74 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  ct the result */
292d0 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e  .  if( pWInfo->n
292e0 4c 65 76 65 6c 3e 3d 32 0a 20 20 20 26 26 20 70  Level>=2.   && p
292f0 44 69 73 74 69 6e 63 74 53 65 74 21 3d 30 0a 20  DistinctSet!=0. 
29300 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69 6f    && Optimizatio
29310 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51 4c  nEnabled(db, SQL
29320 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e  ITE_OmitNoopJoin
29330 29 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d 61  ).  ){.    Bitma
29340 73 6b 20 74 61 62 55 73 65 64 20 3d 20 73 71 6c  sk tabUsed = sql
29350 69 74 65 33 57 68 65 72 65 45 78 70 72 4c 69 73  ite3WhereExprLis
29360 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  tUsage(pMaskSet,
29370 20 70 44 69 73 74 69 6e 63 74 53 65 74 29 3b 0a   pDistinctSet);.
29380 20 20 20 20 69 66 28 20 73 57 4c 42 2e 70 4f 72      if( sWLB.pOr
29390 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 74  derBy ){.      t
293a0 61 62 55 73 65 64 20 7c 3d 20 73 71 6c 69 74 65  abUsed |= sqlite
293b0 33 57 68 65 72 65 45 78 70 72 4c 69 73 74 55 73  3WhereExprListUs
293c0 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 73 57  age(pMaskSet, sW
293d0 4c 42 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  LB.pOrderBy);.  
293e0 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 70    }.    while( p
293f0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32  WInfo->nLevel>=2
29400 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
29410 65 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 45 6e  erm *pTerm, *pEn
29420 64 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d  d;.      pLoop =
29430 20 70 57 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66   pWInfo->a[pWInf
29440 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c  o->nLevel-1].pWL
29450 6f 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 28  oop;.      if( (
29460 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
29470 2d 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d  ->a[pLoop->iTab]
29480 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  .fg.jointype & J
29490 54 5f 4c 45 46 54 29 3d 3d 30 20 29 20 62 72 65  T_LEFT)==0 ) bre
294a0 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 28 77  ak;.      if( (w
294b0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
294c0 45 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29  E_WANT_DISTINCT)
294d0 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 70  ==0.       && (p
294e0 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
294f0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30  WHERE_ONEROW)==0
29500 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
29510 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
29520 0a 20 20 20 20 20 20 69 66 28 20 28 74 61 62 55  .      if( (tabU
29530 73 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73  sed & pLoop->mas
29540 6b 53 65 6c 66 29 21 3d 30 20 29 20 62 72 65 61  kSelf)!=0 ) brea
29550 6b 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20  k;.      pEnd = 
29560 73 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20 73 57  sWLB.pWC->a + sW
29570 4c 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20  LB.pWC->nTerm;. 
29580 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 73       for(pTerm=s
29590 57 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65 72  WLB.pWC->a; pTer
295a0 6d 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29  m<pEnd; pTerm++)
295b0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
295c0 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
295d0 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c  & pLoop->maskSel
295e0 66 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26  f)!=0.         &
295f0 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
29600 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
29610 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20   EP_FromJoin).  
29620 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
29630 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
29640 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
29650 20 20 69 66 28 20 70 54 65 72 6d 3c 70 45 6e 64    if( pTerm<pEnd
29660 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
29670 57 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66  WHERETRACE(0xfff
29680 66 2c 20 28 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f  f, ("-> drop loo
29690 70 20 25 63 20 6e 6f 74 20 75 73 65 64 5c 6e 22  p %c not used\n"
296a0 2c 20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a  , pLoop->cId));.
296b0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c        pWInfo->nL
296c0 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e 54  evel--;.      nT
296d0 61 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20 7d 0a  abList--;.    }.
296e0 20 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45    }.  WHERETRACE
296f0 28 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70  (0xffff,("*** Op
29700 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64  timizer Finished
29710 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57 49   ***\n"));.  pWI
29720 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51 75  nfo->pParse->nQu
29730 65 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e 66  eryLoop += pWInf
29740 6f 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f  o->nRowOut;..  /
29750 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20  * If the caller 
29760 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  is an UPDATE or 
29770 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
29780 20 74 68 61 74 20 69 73 20 72 65 71 75 65 73 74   that is request
29790 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20  ing.  ** to use 
297a0 61 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72  a one-pass algor
297b0 69 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20  ithm, determine 
297c0 69 66 20 74 68 69 73 20 69 73 20 61 70 70 72 6f  if this is appro
297d0 70 72 69 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61  priate..  */.  a
297e0 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61  ssert( (wctrlFla
297f0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
29800 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c  SS_DESIRED)==0 |
29810 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  | pWInfo->nLevel
29820 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63  ==1 );.  if( (wc
29830 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
29840 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
29850 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
29860 77 73 46 6c 61 67 73 20 3d 20 70 57 49 6e 66 6f  wsFlags = pWInfo
29870 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77  ->a[0].pWLoop->w
29880 73 46 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20  sFlags;.    int 
29890 62 4f 6e 65 72 6f 77 20 3d 20 28 77 73 46 6c 61  bOnerow = (wsFla
298a0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f  gs & WHERE_ONERO
298b0 57 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 62  W)!=0;.    if( b
298c0 4f 6e 65 72 6f 77 0a 20 20 20 20 20 7c 7c 20 28  Onerow.     || (
298d0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
298e0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54  ERE_ONEPASS_MULT
298f0 49 52 4f 57 29 21 3d 30 0a 20 20 20 20 20 20 20  IROW)!=0.       
29900 20 20 20 20 26 26 20 30 3d 3d 28 77 73 46 6c 61      && 0==(wsFla
29910 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
29920 41 4c 54 41 42 4c 45 29 29 0a 20 20 20 20 29 7b  ALTABLE)).    ){
29930 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65  .      pWInfo->e
29940 4f 6e 65 50 61 73 73 20 3d 20 62 4f 6e 65 72 6f  OnePass = bOnero
29950 77 20 3f 20 4f 4e 45 50 41 53 53 5f 53 49 4e 47  w ? ONEPASS_SING
29960 4c 45 20 3a 20 4f 4e 45 50 41 53 53 5f 4d 55 4c  LE : ONEPASS_MUL
29970 54 49 3b 0a 20 20 20 20 20 20 69 66 28 20 48 61  TI;.      if( Ha
29980 73 52 6f 77 69 64 28 70 54 61 62 4c 69 73 74 2d  sRowid(pTabList-
29990 3e 61 5b 30 5d 2e 70 54 61 62 29 20 26 26 20 28  >a[0].pTab) && (
299a0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
299b0 49 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20  IDX_ONLY) ){.   
299c0 20 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c       if( wctrlFl
299d0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
299e0 41 53 53 5f 4d 55 4c 54 49 52 4f 57 20 29 7b 0a  ASS_MULTIROW ){.
299f0 20 20 20 20 20 20 20 20 20 20 62 46 6f 72 64 65            bForde
29a00 6c 65 74 65 20 3d 20 4f 50 46 4c 41 47 5f 46 4f  lete = OPFLAG_FO
29a10 52 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 20  RDELETE;.       
29a20 20 7d 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66   }.        pWInf
29a30 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e  o->a[0].pWLoop->
29a40 77 73 46 6c 61 67 73 20 3d 20 28 77 73 46 6c 61  wsFlags = (wsFla
29a50 67 73 20 26 20 7e 57 48 45 52 45 5f 49 44 58 5f  gs & ~WHERE_IDX_
29a60 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ONLY);.      }. 
29a70 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f     }.  }..  /* O
29a80 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  pen all tables i
29a90 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61  n the pTabList a
29aa0 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73  nd any indices s
29ab0 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a  elected for.  **
29ac0 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65   searching those
29ad0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
29ae0 66 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c  for(ii=0, pLevel
29af0 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e  =pWInfo->a; ii<n
29b00 54 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70  TabList; ii++, p
29b10 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61  Level++){.    Ta
29b20 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f  ble *pTab;     /
29b30 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  * Table to open 
29b40 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20  */.    int iDb; 
29b50 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
29b60 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
29b70 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e  taining table/in
29b80 64 65 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  dex */.    struc
29b90 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
29ba0 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70  pTabItem;..    p
29bb0 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
29bc0 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
29bd0 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20  From];.    pTab 
29be0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
29bf0 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
29c00 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
29c10 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65  (db, pTab->pSche
29c20 6d 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d  ma);.    pLoop =
29c30 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b   pLevel->pWLoop;
29c40 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e  .    if( (pTab->
29c50 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70  tabFlags & TF_Ep
29c60 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70  hemeral)!=0 || p
29c70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  Tab->pSelect ){.
29c80 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68        /* Do noth
29c90 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65  ing */.    }else
29ca0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29cb0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
29cc0 45 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  E.    if( (pLoop
29cd0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
29ce0 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
29cf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
29d00 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20  t char *pVTab = 
29d10 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
29d20 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
29d30 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
29d40 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49  int iCur = pTabI
29d50 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
29d60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
29d70 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65  ddOp4(v, OP_VOpe
29d80 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70  n, iCur, 0, 0, p
29d90 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a  VTab, P4_VTAB);.
29da0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73      }else if( Is
29db0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
29dc0 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a  .      /* noop *
29dd0 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  /.    }else.#end
29de0 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f  if.    if( (pLoo
29df0 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
29e00 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a  RE_IDX_ONLY)==0.
29e10 20 20 20 20 20 20 20 20 20 26 26 20 28 77 63 74           && (wct
29e20 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
29e30 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30  OR_SUBCLAUSE)==0
29e40 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   ){.      int op
29e50 20 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a   = OP_OpenRead;.
29e60 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
29e70 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50  ->eOnePass!=ONEP
29e80 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20  ASS_OFF ){.     
29e90 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57     op = OP_OpenW
29ea0 72 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57  rite;.        pW
29eb0 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61  Info->aiCurOnePa
29ec0 73 73 5b 30 5d 20 3d 20 70 54 61 62 49 74 65 6d  ss[0] = pTabItem
29ed0 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
29ee0 20 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   };.      sqlite
29ef0 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
29f00 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
29f10 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c  rsor, iDb, pTab,
29f20 20 6f 70 29 3b 0a 20 20 20 20 20 20 61 73 73 65   op);.      asse
29f30 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  rt( pTabItem->iC
29f40 75 72 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d 3e 69  ursor==pLevel->i
29f50 54 61 62 43 75 72 20 29 3b 0a 20 20 20 20 20 20  TabCur );.      
29f60 74 65 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f  testcase( pWInfo
29f70 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ->eOnePass==ONEP
29f80 41 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d  ASS_OFF && pTab-
29f90 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a  >nCol==BMS-1 );.
29fa0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
29fb0 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73  pWInfo->eOnePass
29fc0 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26  ==ONEPASS_OFF &&
29fd0 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53   pTab->nCol==BMS
29fe0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57   );.      if( pW
29ff0 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d  Info->eOnePass==
2a000 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20 70  ONEPASS_OFF && p
2a010 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26 26  Tab->nCol<BMS &&
2a020 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
2a030 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  ){.        Bitma
2a040 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  sk b = pTabItem-
2a050 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20  >colUsed;.      
2a060 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20    int n = 0;.   
2a070 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d       for(; b; b=
2a080 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  b>>1, n++){}.   
2a090 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2a0a0 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
2a0b0 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
2a0c0 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b  R(n), P4_INT32);
2a0d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2a0e0 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29   n<=pTab->nCol )
2a0f0 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  ;.      }.#ifdef
2a100 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
2a110 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20  URSOR_HINTS.    
2a120 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62    if( pLoop->u.b
2a130 74 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29  tree.pIndex!=0 )
2a140 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2a150 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2a160 20 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 7c 62   OPFLAG_SEEKEQ|b
2a170 46 6f 72 64 65 6c 65 74 65 29 3b 0a 20 20 20 20  Fordelete);.    
2a180 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
2a190 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 73       {.        s
2a1a0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2a1b0 50 35 28 76 2c 20 62 46 6f 72 64 65 6c 65 74 65  P5(v, bFordelete
2a1c0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65  );.      }.#ifde
2a1d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2a1e0 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b  COLUMN_USED_MASK
2a1f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2a200 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
2a210 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20  OP_ColumnsUsed, 
2a220 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
2a230 72 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  r, 0, 0,.       
2a240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a250 20 20 20 20 20 28 63 6f 6e 73 74 20 75 38 2a 29       (const u8*)
2a260 26 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73  &pTabItem->colUs
2a270 65 64 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23  ed, P4_INT64);.#
2a280 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
2a290 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
2a2a0 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
2a2b0 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
2a2c0 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
2a2d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2a2e0 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2a2f0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29   WHERE_INDEXED )
2a300 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
2a310 49 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74  Ix = pLoop->u.bt
2a320 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ree.pIndex;.    
2a330 20 20 69 6e 74 20 69 49 6e 64 65 78 43 75 72 3b    int iIndexCur;
2a340 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20  .      int op = 
2a350 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20  OP_OpenRead;.   
2a360 20 20 20 2f 2a 20 69 41 75 78 41 72 67 20 69 73     /* iAuxArg is
2a370 20 61 6c 77 61 79 73 20 73 65 74 20 69 66 20 74   always set if t
2a380 6f 20 61 20 70 6f 73 69 74 69 76 65 20 76 61 6c  o a positive val
2a390 75 65 20 69 66 20 4f 4e 45 50 41 53 53 20 69 73  ue if ONEPASS is
2a3a0 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 20   possible */.   
2a3b0 20 20 20 61 73 73 65 72 74 28 20 69 41 75 78 41     assert( iAuxA
2a3c0 72 67 21 3d 30 20 7c 7c 20 28 70 57 49 6e 66 6f  rg!=0 || (pWInfo
2a3d0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
2a3e0 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53  HERE_ONEPASS_DES
2a3f0 49 52 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20  IRED)==0 );.    
2a400 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
2a410 70 54 61 62 29 20 26 26 20 49 73 50 72 69 6d 61  pTab) && IsPrima
2a420 72 79 4b 65 79 49 6e 64 65 78 28 70 49 78 29 0a  ryKeyIndex(pIx).
2a430 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c         && (wctrl
2a440 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
2a450 5f 53 55 42 43 4c 41 55 53 45 29 21 3d 30 0a 20  _SUBCLAUSE)!=0. 
2a460 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2a470 2f 2a 20 54 68 69 73 20 69 73 20 6f 6e 65 20 74  /* This is one t
2a480 65 72 6d 20 6f 66 20 61 6e 20 4f 52 2d 6f 70 74  erm of an OR-opt
2a490 69 6d 69 7a 61 74 69 6f 6e 20 75 73 69 6e 67 20  imization using 
2a4a0 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
2a4b0 6f 66 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  of a.        ** 
2a4c0 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
2a4d0 62 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20 66 6f  ble.  No need fo
2a4e0 72 20 61 20 73 65 70 61 72 61 74 65 20 69 6e 64  r a separate ind
2a4f0 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 49  ex */.        iI
2a500 6e 64 65 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  ndexCur = pLevel
2a510 2d 3e 69 54 61 62 43 75 72 3b 0a 20 20 20 20 20  ->iTabCur;.     
2a520 20 20 20 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20     op = 0;.     
2a530 20 7d 65 6c 73 65 20 69 66 28 20 70 57 49 6e 66   }else if( pWInf
2a540 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45  o->eOnePass!=ONE
2a550 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20  PASS_OFF ){.    
2a560 20 20 20 20 49 6e 64 65 78 20 2a 70 4a 20 3d 20      Index *pJ = 
2a570 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d 3e  pTabItem->pTab->
2a580 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 20 20  pIndex;.        
2a590 69 49 6e 64 65 78 43 75 72 20 3d 20 69 41 75 78  iIndexCur = iAux
2a5a0 41 72 67 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Arg;.        ass
2a5b0 65 72 74 28 20 77 63 74 72 6c 46 6c 61 67 73 20  ert( wctrlFlags 
2a5c0 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f  & WHERE_ONEPASS_
2a5d0 44 45 53 49 52 45 44 20 29 3b 0a 20 20 20 20 20  DESIRED );.     
2a5e0 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53     while( ALWAYS
2a5f0 28 70 4a 29 20 26 26 20 70 4a 21 3d 70 49 78 20  (pJ) && pJ!=pIx 
2a600 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 49 6e  ){.          iIn
2a610 64 65 78 43 75 72 2b 2b 3b 0a 20 20 20 20 20 20  dexCur++;.      
2a620 20 20 20 20 70 4a 20 3d 20 70 4a 2d 3e 70 4e 65      pJ = pJ->pNe
2a630 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  xt;.        }.  
2a640 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 70        op = OP_Op
2a650 65 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 20  enWrite;.       
2a660 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e   pWInfo->aiCurOn
2a670 65 50 61 73 73 5b 31 5d 20 3d 20 69 49 6e 64 65  ePass[1] = iInde
2a680 78 43 75 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73  xCur;.      }els
2a690 65 20 69 66 28 20 69 41 75 78 41 72 67 20 26 26  e if( iAuxArg &&
2a6a0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2a6b0 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
2a6c0 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  E)!=0 ){.       
2a6d0 20 69 49 6e 64 65 78 43 75 72 20 3d 20 69 41 75   iIndexCur = iAu
2a6e0 78 41 72 67 3b 0a 20 20 20 20 20 20 20 20 6f 70  xArg;.        op
2a6f0 20 3d 20 4f 50 5f 52 65 6f 70 65 6e 49 64 78 3b   = OP_ReopenIdx;
2a700 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2a710 20 20 20 20 20 20 69 49 6e 64 65 78 43 75 72 20        iIndexCur 
2a720 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
2a730 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a740 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20  pLevel->iIdxCur 
2a750 3d 20 69 49 6e 64 65 78 43 75 72 3b 0a 20 20 20  = iIndexCur;.   
2a760 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e     assert( pIx->
2a770 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
2a780 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20  Schema );.      
2a790 61 73 73 65 72 74 28 20 69 49 6e 64 65 78 43 75  assert( iIndexCu
2a7a0 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  r>=0 );.      if
2a7b0 28 20 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ( op ){.        
2a7c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2a7d0 33 28 76 2c 20 6f 70 2c 20 69 49 6e 64 65 78 43  3(v, op, iIndexC
2a7e0 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 20 69  ur, pIx->tnum, i
2a7f0 44 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Db);.        sql
2a800 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79  ite3VdbeSetP4Key
2a810 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78  Info(pParse, pIx
2a820 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
2a830 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26  pLoop->wsFlags &
2a840 20 57 48 45 52 45 5f 43 4f 4e 53 54 52 41 49 4e   WHERE_CONSTRAIN
2a850 54 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26  T)!=0.         &
2a860 26 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  & (pLoop->wsFlag
2a870 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d  s & (WHERE_COLUM
2a880 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 53 4b  N_RANGE|WHERE_SK
2a890 49 50 53 43 41 4e 29 29 3d 3d 30 0a 20 20 20 20  IPSCAN))==0.    
2a8a0 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d       && (pWInfo-
2a8b0 3e 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52  >wctrlFlags&WHER
2a8c0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 3d 3d  E_ORDERBY_MIN)==
2a8d0 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  0.        ){.   
2a8e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2a8f0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50  beChangeP5(v, OP
2a900 46 4c 41 47 5f 53 45 45 4b 45 51 29 3b 20 2f 2a  FLAG_SEEKEQ); /*
2a910 20 48 69 6e 74 20 74 6f 20 43 4f 4d 44 42 32 20   Hint to COMDB2 
2a920 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
2a930 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
2a940 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d 3e  ((v, "%s", pIx->
2a950 7a 4e 61 6d 65 29 29 3b 0a 23 69 66 64 65 66 20  zName));.#ifdef 
2a960 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f  SQLITE_ENABLE_CO
2a970 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a 20  LUMN_USED_MASK. 
2a980 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
2a990 20 20 20 75 36 34 20 63 6f 6c 55 73 65 64 20 3d     u64 colUsed =
2a9a0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   0;.          in
2a9b0 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 20 20 20 20  t ii, jj;.      
2a9c0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
2a9d0 3c 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  <pIx->nColumn; i
2a9e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
2a9f0 20 20 6a 6a 20 3d 20 70 49 78 2d 3e 61 69 43 6f    jj = pIx->aiCo
2aa00 6c 75 6d 6e 5b 69 69 5d 3b 0a 20 20 20 20 20 20  lumn[ii];.      
2aa10 20 20 20 20 20 20 69 66 28 20 6a 6a 3c 30 20 29        if( jj<0 )
2aa20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2aa30 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e 36 33         if( jj>63
2aa40 20 29 20 6a 6a 20 3d 20 36 33 3b 0a 20 20 20 20   ) jj = 63;.    
2aa50 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 61          if( (pTa
2aa60 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26  bItem->colUsed &
2aa70 20 4d 41 53 4b 42 49 54 28 6a 6a 29 29 3d 3d 30   MASKBIT(jj))==0
2aa80 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2aa90 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73 65 64           colUsed
2aaa0 20 7c 3d 20 28 28 75 36 34 29 31 29 3c 3c 28 69   |= ((u64)1)<<(i
2aab0 69 3c 36 33 20 3f 20 69 69 20 3a 20 36 33 29 3b  i<63 ? ii : 63);
2aac0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2aad0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2aae0 62 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20  beAddOp4Dup8(v, 
2aaf0 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20  OP_ColumnsUsed, 
2ab00 69 49 6e 64 65 78 43 75 72 2c 20 30 2c 20 30 2c  iIndexCur, 0, 0,
2ab10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ab20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab30 20 28 75 38 2a 29 26 63 6f 6c 55 73 65 64 2c 20   (u8*)&colUsed, 
2ab40 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20 20 20  P4_INT64);.     
2ab50 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
2ab60 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
2ab70 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 20 2a 2f  UMN_USED_MASK */
2ab80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2ab90 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 20     if( iDb>=0 ) 
2aba0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
2abb0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
2abc0 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  iDb);.  }.  pWIn
2abd0 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74  fo->iTop = sqlit
2abe0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2abf0 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  r(v);.  if( db->
2ac00 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
2ac10 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
2ac20 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ror;..  /* Gener
2ac30 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
2ac40 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  do the search.  
2ac50 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f  Each iteration o
2ac60 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c  f the for.  ** l
2ac70 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61  oop below genera
2ac80 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73  tes code for a s
2ac90 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f  ingle nested loo
2aca0 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a  p of the VM.  **
2acb0 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20   program..  */. 
2acc0 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
2acd0 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
2ace0 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69 73 74  i=0; ii<nTabList
2acf0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  ; ii++){.    int
2ad00 20 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20   addrExplain;.  
2ad10 20 20 69 6e 74 20 77 73 46 6c 61 67 73 3b 0a 20    int wsFlags;. 
2ad20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49     pLevel = &pWI
2ad30 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20  nfo->a[ii];.    
2ad40 77 73 46 6c 61 67 73 20 3d 20 70 4c 65 76 65 6c  wsFlags = pLevel
2ad50 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67  ->pWLoop->wsFlag
2ad60 73 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  s;.#ifndef SQLIT
2ad70 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
2ad80 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28 20 28  _INDEX.    if( (
2ad90 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e  pLevel->pWLoop->
2ada0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2adb0 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 29  AUTO_INDEX)!=0 )
2adc0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63  {.      construc
2add0 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
2ade0 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66 6f 2d  pParse, &pWInfo-
2adf0 3e 73 57 43 2c 0a 20 20 20 20 20 20 20 20 20 20  >sWC,.          
2ae00 20 20 20 20 20 20 26 70 54 61 62 4c 69 73 74 2d        &pTabList-
2ae10 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
2ae20 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65  ], notReady, pLe
2ae30 76 65 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  vel);.      if( 
2ae40 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2ae50 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67   ) goto whereBeg
2ae60 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 23  inError;.    }.#
2ae70 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72 45 78  endif.    addrEx
2ae80 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 57  plain = sqlite3W
2ae90 68 65 72 65 45 78 70 6c 61 69 6e 4f 6e 65 53 63  hereExplainOneSc
2aea0 61 6e 28 0a 20 20 20 20 20 20 20 20 70 50 61 72  an(.        pPar
2aeb0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c  se, pTabList, pL
2aec0 65 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76 65 6c  evel, ii, pLevel
2aed0 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c 46 6c  ->iFrom, wctrlFl
2aee0 61 67 73 0a 20 20 20 20 29 3b 0a 20 20 20 20 70  ags.    );.    p
2aef0 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64 79 20  Level->addrBody 
2af00 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2af10 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
2af20 20 6e 6f 74 52 65 61 64 79 20 3d 20 73 71 6c 69   notReady = sqli
2af30 74 65 33 57 68 65 72 65 43 6f 64 65 4f 6e 65 4c  te3WhereCodeOneL
2af40 6f 6f 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c  oopStart(pWInfo,
2af50 20 69 69 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a   ii, notReady);.
2af60 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e      pWInfo->iCon
2af70 74 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e  tinue = pLevel->
2af80 61 64 64 72 43 6f 6e 74 3b 0a 20 20 20 20 69 66  addrCont;.    if
2af90 28 20 28 77 73 46 6c 61 67 73 26 57 48 45 52 45  ( (wsFlags&WHERE
2afa0 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20 26 26  _MULTI_OR)==0 &&
2afb0 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45   (wctrlFlags&WHE
2afc0 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29  RE_OR_SUBCLAUSE)
2afd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
2afe0 69 74 65 33 57 68 65 72 65 41 64 64 53 63 61 6e  ite3WhereAddScan
2aff0 53 74 61 74 75 73 28 76 2c 20 70 54 61 62 4c 69  Status(v, pTabLi
2b000 73 74 2c 20 70 4c 65 76 65 6c 2c 20 61 64 64 72  st, pLevel, addr
2b010 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 7d 0a  Explain);.    }.
2b020 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65 2e 20    }..  /* Done. 
2b030 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65 43  */.  VdbeModuleC
2b040 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65 67 69  omment((v, "Begi
2b050 6e 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29 3b  n WHERE-core"));
2b060 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
2b070 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
2b080 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  e if malloc fail
2b090 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45  s */.whereBeginE
2b0a0 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e  rror:.  if( pWIn
2b0b0 66 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  fo ){.    pParse
2b0c0 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  ->nQueryLoop = p
2b0d0 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65  WInfo->savedNQue
2b0e0 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72  ryLoop;.    wher
2b0f0 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57  eInfoFree(db, pW
2b100 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Info);.  }.  ret
2b110 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2b120 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64  Generate the end
2b130 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f   of the WHERE lo
2b140 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74  op.  See comment
2b150 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33  s on .** sqlite3
2b160 57 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72  WhereBegin() for
2b170 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
2b180 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  rmation..*/.void
2b190 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
2b1a0 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
2b1b0 66 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  fo){.  Parse *pP
2b1c0 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
2b1d0 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76  Parse;.  Vdbe *v
2b1e0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
2b1f0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  ;.  int i;.  Whe
2b200 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b  reLevel *pLevel;
2b210 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
2b220 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a  oop;.  SrcList *
2b230 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66  pTabList = pWInf
2b240 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 73  o->pTabList;.  s
2b250 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
2b260 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47  rse->db;..  /* G
2b270 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72  enerate loop ter
2b280 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20  mination code.. 
2b290 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c 65   */.  VdbeModule
2b2a0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45 6e 64  Comment((v, "End
2b2b0 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29 3b 0a   WHERE-core"));.
2b2c0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
2b2d0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
2b2e0 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d  .  for(i=pWInfo-
2b2f0 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b  >nLevel-1; i>=0;
2b300 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20 61   i--){.    int a
2b310 64 64 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20  ddr;.    pLevel 
2b320 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b  = &pWInfo->a[i];
2b330 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70 4c 65  .    pLoop = pLe
2b340 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20 20 20  vel->pWLoop;.   
2b350 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2b360 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
2b370 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29 3b 0a 20  el->addrCont);. 
2b380 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f     if( pLevel->o
2b390 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
2b3a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2b3b0 64 64 4f 70 33 28 76 2c 20 70 4c 65 76 65 6c 2d  ddOp3(v, pLevel-
2b3c0 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c  >op, pLevel->p1,
2b3d0 20 70 4c 65 76 65 6c 2d 3e 70 32 2c 20 70 4c 65   pLevel->p2, pLe
2b3e0 76 65 6c 2d 3e 70 33 29 3b 0a 20 20 20 20 20 20  vel->p3);.      
2b3f0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2b400 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70  eP5(v, pLevel->p
2b410 35 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  5);.      VdbeCo
2b420 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
2b430 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
2b440 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f  v, pLevel->op==O
2b450 50 5f 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 56  P_Next);.      V
2b460 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
2b470 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f   pLevel->op==OP_
2b480 50 72 65 76 29 3b 0a 20 20 20 20 20 20 56 64 62  Prev);.      Vdb
2b490 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70  eCoverageIf(v, p
2b4a0 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 56 4e  Level->op==OP_VN
2b4b0 65 78 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ext);.    }.    
2b4c0 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61  if( pLoop->wsFla
2b4d0 67 73 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42  gs & WHERE_IN_AB
2b4e0 4c 45 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e  LE && pLevel->u.
2b4f0 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20  in.nIn>0 ){.    
2b500 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20    struct InLoop 
2b510 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20  *pIn;.      int 
2b520 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  j;.      sqlite3
2b530 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
2b540 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
2b550 4e 78 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  Nxt);.      for(
2b560 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  j=pLevel->u.in.n
2b570 49 6e 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d  In, pIn=&pLevel-
2b580 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d  >u.in.aInLoop[j-
2b590 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49  1]; j>0; j--, pI
2b5a0 6e 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71  n--){.        sq
2b5b0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
2b5c0 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e  e(v, pIn->addrIn
2b5d0 54 6f 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  Top+1);.        
2b5e0 69 66 28 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f  if( pIn->eEndLoo
2b5f0 70 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  pOp!=OP_Noop ){.
2b600 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2b610 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70  3VdbeAddOp2(v, p
2b620 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20  In->eEndLoopOp, 
2b630 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e  pIn->iCur, pIn->
2b640 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20  addrInTop);.    
2b650 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
2b660 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20  ge(v);.         
2b670 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
2b680 76 2c 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70  v, pIn->eEndLoop
2b690 4f 70 3d 3d 4f 50 5f 50 72 65 76 49 66 4f 70 65  Op==OP_PrevIfOpe
2b6a0 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  n);.          Vd
2b6b0 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20  beCoverageIf(v, 
2b6c0 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d  pIn->eEndLoopOp=
2b6d0 3d 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 29 3b  =OP_NextIfOpen);
2b6e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b6f0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2b700 6d 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61  mpHere(v, pIn->a
2b710 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20  ddrInTop-1);.   
2b720 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
2b730 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
2b740 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
2b750 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  ->addrBrk);.    
2b760 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  if( pLevel->addr
2b770 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 73 71  Skip ){.      sq
2b780 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
2b790 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69   pLevel->addrSki
2b7a0 70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  p);.      VdbeCo
2b7b0 6d 6d 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20  mment((v, "next 
2b7c0 73 6b 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73 22  skip-scan on %s"
2b7d0 2c 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  , pLoop->u.btree
2b7e0 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29  .pIndex->zName))
2b7f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2b800 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
2b810 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29  Level->addrSkip)
2b820 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
2b830 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70  dbeJumpHere(v, p
2b840 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 2d  Level->addrSkip-
2b850 32 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  2);.    }.#ifnde
2b860 66 20 53 51 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f  f SQLITE_LIKE_DO
2b870 45 53 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f 42 53  ESNT_MATCH_BLOBS
2b880 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
2b890 3e 61 64 64 72 4c 69 6b 65 52 65 70 20 29 7b 0a  >addrLikeRep ){.
2b8a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2b8b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65  eAddOp2(v, OP_De
2b8c0 63 72 4a 75 6d 70 5a 65 72 6f 2c 20 28 69 6e 74  crJumpZero, (int
2b8d0 29 28 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52  )(pLevel->iLikeR
2b8e0 65 70 43 6e 74 72 3e 3e 31 29 2c 0a 20 20 20 20  epCntr>>1),.    
2b8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b900 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72      pLevel->addr
2b910 4c 69 6b 65 52 65 70 29 3b 0a 20 20 20 20 20 20  LikeRep);.      
2b920 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
2b930 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2b940 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
2b950 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20  eftJoin ){.     
2b960 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
2b970 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
2b980 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69  IfPos, pLevel->i
2b990 4c 65 66 74 4a 6f 69 6e 29 3b 20 56 64 62 65 43  LeftJoin); VdbeC
2b9a0 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20  overage(v);.    
2b9b0 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f 70    assert( (pLoop
2b9c0 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2b9d0 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20  E_IDX_ONLY)==0. 
2b9e0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c            || (pL
2b9f0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
2ba00 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
2ba10 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70   );.      if( (p
2ba20 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2ba30 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
2ba40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
2ba50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
2ba60 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70  v, OP_NullRow, p
2ba70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
2ba80 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  ursor);.      }.
2ba90 20 20 20 20 20 20 69 66 28 20 70 4c 6f 6f 70 2d        if( pLoop-
2baa0 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2bab0 5f 49 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20  _INDEXED ){.    
2bac0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2bad0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp1(v, OP_Null
2bae0 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  Row, pLevel->iId
2baf0 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xCur);.      }. 
2bb00 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
2bb10 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29  >op==OP_Return )
2bb20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2bb30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
2bb40 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d  P_Gosub, pLevel-
2bb50 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  >p1, pLevel->add
2bb60 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d  rFirst);.      }
2bb70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
2bb80 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c  lite3VdbeGoto(v,
2bb90 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72   pLevel->addrFir
2bba0 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  st);.      }.   
2bbb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
2bbc0 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
2bbd0 0a 20 20 20 20 7d 0a 20 20 20 20 56 64 62 65 4d  .    }.    VdbeM
2bbe0 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c  oduleComment((v,
2bbf0 20 22 45 6e 64 20 57 48 45 52 45 2d 6c 6f 6f 70   "End WHERE-loop
2bc00 25 64 3a 20 25 73 22 2c 20 69 2c 0a 20 20 20 20  %d: %s", i,.    
2bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
2bc30 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
2bc40 6f 6d 5d 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  om].pTab->zName)
2bc50 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
2bc60 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69   "break" point i
2bc70 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73  s here, just pas
2bc80 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2bc90 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a   outer loop..  *
2bca0 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20  * Set it..  */. 
2bcb0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
2bcc0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e  lveLabel(v, pWIn
2bcd0 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20  fo->iBreak);..  
2bce0 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e  assert( pWInfo->
2bcf0 6e 4c 65 76 65 6c 3c 3d 70 54 61 62 4c 69 73 74  nLevel<=pTabList
2bd00 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28  ->nSrc );.  for(
2bd10 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
2bd20 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d  fo->a; i<pWInfo-
2bd30 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c  >nLevel; i++, pL
2bd40 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  evel++){.    int
2bd50 20 6b 2c 20 6c 61 73 74 3b 0a 20 20 20 20 56 64   k, last;.    Vd
2bd60 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 49  beOp *pOp;.    I
2bd70 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 30 3b 0a  ndex *pIdx = 0;.
2bd80 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
2bd90 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
2bda0 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
2bdb0 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
2bdc0 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
2bdd0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
2bde0 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
2bdf0 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 70 4c  Tab!=0 );.    pL
2be00 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57  oop = pLevel->pW
2be10 4c 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a 20 46 6f  Loop;..    /* Fo
2be20 72 20 61 20 63 6f 2d 72 6f 75 74 69 6e 65 2c 20  r a co-routine, 
2be30 63 68 61 6e 67 65 20 61 6c 6c 20 4f 50 5f 43 6f  change all OP_Co
2be40 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 73 20  lumn references 
2be50 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f 66 0a  to the table of.
2be60 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 2d 72 6f      ** the co-ro
2be70 75 74 69 6e 65 20 69 6e 74 6f 20 4f 50 5f 43 6f  utine into OP_Co
2be80 70 79 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6e  py of result con
2be90 74 61 69 6e 65 64 20 69 6e 20 61 20 72 65 67 69  tained in a regi
2bea0 73 74 65 72 2e 0a 20 20 20 20 2a 2a 20 4f 50 5f  ster..    ** OP_
2beb0 52 6f 77 69 64 20 62 65 63 6f 6d 65 73 20 4f 50  Rowid becomes OP
2bec0 5f 4e 75 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  _Null..    */.  
2bed0 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d 3e    if( pTabItem->
2bee0 66 67 2e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20  fg.viaCoroutine 
2bef0 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
2bf00 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 74 72  iled ){.      tr
2bf10 61 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f 43  anslateColumnToC
2bf20 6f 70 79 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61  opy(v, pLevel->a
2bf30 64 64 72 42 6f 64 79 2c 20 70 4c 65 76 65 6c 2d  ddrBody, pLevel-
2bf40 3e 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20  >iTabCur,.      
2bf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf60 20 20 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e        pTabItem->
2bf70 72 65 67 52 65 73 75 6c 74 2c 20 30 29 3b 0a 20  regResult, 0);. 
2bf80 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2bf90 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 6f     }..    /* Clo
2bfa0 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75  se all of the cu
2bfb0 72 73 6f 72 73 20 74 68 61 74 20 77 65 72 65 20  rsors that were 
2bfc0 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65  opened by sqlite
2bfd0 33 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 20  3WhereBegin..   
2bfe0 20 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f 20 6e   ** Except, do n
2bff0 6f 74 20 63 6c 6f 73 65 20 63 75 72 73 6f 72 73  ot close cursors
2c000 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
2c010 75 73 65 64 20 62 79 20 74 68 65 20 4f 52 20 6f  used by the OR o
2c020 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20  ptimization.    
2c030 2a 2a 20 28 57 48 45 52 45 5f 4f 52 5f 53 55 42  ** (WHERE_OR_SUB
2c040 43 4c 41 55 53 45 29 2e 20 20 41 6e 64 20 64 6f  CLAUSE).  And do
2c050 20 6e 6f 74 20 63 6c 6f 73 65 20 74 68 65 20 4f   not close the O
2c060 50 5f 4f 70 65 6e 57 72 69 74 65 20 63 75 72 73  P_OpenWrite curs
2c070 6f 72 73 0a 20 20 20 20 2a 2a 20 63 72 65 61 74  ors.    ** creat
2c080 65 64 20 66 6f 72 20 74 68 65 20 4f 4e 45 50 41  ed for the ONEPA
2c090 53 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  SS optimization.
2c0a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2c0b0 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20  (pTab->tabFlags 
2c0c0 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d  & TF_Ephemeral)=
2c0d0 3d 30 0a 20 20 20 20 20 26 26 20 70 54 61 62 2d  =0.     && pTab-
2c0e0 3e 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20 20  >pSelect==0.    
2c0f0 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
2c100 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2c110 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30  OR_SUBCLAUSE)==0
2c120 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e  .    ){.      in
2c130 74 20 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77 73  t ws = pLoop->ws
2c140 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66 28  Flags;.      if(
2c150 20 70 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73   pWInfo->eOnePas
2c160 73 3d 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26  s==ONEPASS_OFF &
2c170 26 20 28 77 73 20 26 20 57 48 45 52 45 5f 49 44  & (ws & WHERE_ID
2c180 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20  X_ONLY)==0 ){.  
2c190 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2c1a0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
2c1b0 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  ose, pTabItem->i
2c1c0 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
2c1d0 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 20 26  .      if( (ws &
2c1e0 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21   WHERE_INDEXED)!
2c1f0 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 77 73  =0.       && (ws
2c200 20 26 20 28 57 48 45 52 45 5f 49 50 4b 7c 57 48   & (WHERE_IPK|WH
2c210 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 29  ERE_AUTO_INDEX))
2c220 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 70  ==0 .       && p
2c230 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 21 3d  Level->iIdxCur!=
2c240 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
2c250 50 61 73 73 5b 31 5d 0a 20 20 20 20 20 20 29 7b  Pass[1].      ){
2c260 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2c270 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
2c280 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e  _Close, pLevel->
2c290 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20  iIdxCur);.      
2c2a0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2c2b0 49 66 20 74 68 69 73 20 73 63 61 6e 20 75 73 65  If this scan use
2c2c0 73 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65  s an index, make
2c2d0 20 56 44 42 45 20 63 6f 64 65 20 73 75 62 73 74   VDBE code subst
2c2e0 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65 61 64  itutions to read
2c2f0 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66 72 6f   data.    ** fro
2c300 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e 73 74  m the index inst
2c310 65 61 64 20 6f 66 20 66 72 6f 6d 20 74 68 65 20  ead of from the 
2c320 74 61 62 6c 65 20 77 68 65 72 65 20 70 6f 73 73  table where poss
2c330 69 62 6c 65 2e 20 20 49 6e 20 73 6f 6d 65 20 63  ible.  In some c
2c340 61 73 65 73 0a 20 20 20 20 2a 2a 20 74 68 69 73  ases.    ** this
2c350 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 70 72   optimization pr
2c360 65 76 65 6e 74 73 20 74 68 65 20 74 61 62 6c 65  events the table
2c370 20 66 72 6f 6d 20 65 76 65 72 20 62 65 69 6e 67   from ever being
2c380 20 72 65 61 64 2c 20 77 68 69 63 68 20 63 61 6e   read, which can
2c390 0a 20 20 20 20 2a 2a 20 79 69 65 6c 64 20 61 20  .    ** yield a 
2c3a0 73 69 67 6e 69 66 69 63 61 6e 74 20 70 65 72 66  significant perf
2c3b0 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2e 0a 20  ormance boost.. 
2c3c0 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61     ** .    ** Ca
2c3d0 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20  lls to the code 
2c3e0 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74  generator in bet
2c3f0 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72  ween sqlite3Wher
2c400 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a  eBegin and.    *
2c410 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  * sqlite3WhereEn
2c420 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61  d will have crea
2c430 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72 65  ted code that re
2c440 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61 62  ferences the tab
2c450 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  le.    ** direct
2c460 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73  ly.  This loop s
2c470 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f  cans all that co
2c480 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f  de looking for o
2c490 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68  pcodes.    ** th
2c4a0 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  at reference the
2c4b0 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65   table and conve
2c4c0 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70  rts them into op
2c4d0 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a  codes that.    *
2c4e0 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  * reference the 
2c4f0 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20  index..    */.  
2c500 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46    if( pLoop->wsF
2c510 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49 4e  lags & (WHERE_IN
2c520 44 45 58 45 44 7c 57 48 45 52 45 5f 49 44 58 5f  DEXED|WHERE_IDX_
2c530 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20 20 20 70  ONLY) ){.      p
2c540 49 64 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62  Idx = pLoop->u.b
2c550 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20  tree.pIndex;.   
2c560 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 6f 70   }else if( pLoop
2c570 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2c580 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20 20  E_MULTI_OR ){.  
2c590 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65      pIdx = pLeve
2c5a0 6c 2d 3e 75 2e 70 43 6f 76 69 64 78 3b 0a 20 20  l->u.pCovidx;.  
2c5b0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78    }.    if( pIdx
2c5c0 0a 20 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f  .     && (pWInfo
2c5d0 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50  ->eOnePass==ONEP
2c5e0 41 53 53 5f 4f 46 46 20 7c 7c 20 21 48 61 73 52  ASS_OFF || !HasR
2c5f0 6f 77 69 64 28 70 49 64 78 2d 3e 70 54 61 62 6c  owid(pIdx->pTabl
2c600 65 29 29 0a 20 20 20 20 20 26 26 20 21 64 62 2d  e)).     && !db-
2c610 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20  >mallocFailed.  
2c620 20 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74 20    ){.      last 
2c630 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
2c640 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
2c650 20 20 20 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61     k = pLevel->a
2c660 64 64 72 42 6f 64 79 3b 0a 20 20 20 20 20 20 70  ddrBody;.      p
2c670 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
2c680 47 65 74 4f 70 28 76 2c 20 6b 29 3b 0a 20 20 20  GetOp(v, k);.   
2c690 20 20 20 66 6f 72 28 3b 20 6b 3c 6c 61 73 74 3b     for(; k<last;
2c6a0 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20   k++, pOp++){.  
2c6b0 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
2c6c0 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43  1!=pLevel->iTabC
2c6d0 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
2c6e0 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
2c6f0 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d  opcode==OP_Colum
2c700 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  n ){.          i
2c710 6e 74 20 78 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a  nt x = pOp->p2;.
2c720 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2c730 28 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3d 3d  ( pIdx->pTable==
2c740 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20 20  pTab );.        
2c750 20 20 69 66 28 20 21 48 61 73 52 6f 77 69 64 28    if( !HasRowid(
2c760 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20  pTab) ){.       
2c770 20 20 20 20 20 49 6e 64 65 78 20 2a 70 50 6b 20       Index *pPk 
2c780 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72 79  = sqlite3Primary
2c790 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b 0a  KeyIndex(pTab);.
2c7a0 20 20 20 20 20 20 20 20 20 20 20 20 78 20 3d 20              x = 
2c7b0 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 78 5d  pPk->aiColumn[x]
2c7c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
2c7d0 73 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20  sert( x>=0 );.  
2c7e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c7f0 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43      x = sqlite3C
2c800 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 70 49 64  olumnOfIndex(pId
2c810 78 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20  x, x);.         
2c820 20 69 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20   if( x>=0 ){.   
2c830 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32           pOp->p2
2c840 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 20 20   = x;.          
2c850 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76    pOp->p1 = pLev
2c860 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
2c870 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c880 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f     assert( (pLoo
2c890 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2c8a0 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
2c8b0 7c 7c 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20  || x>=0 );.     
2c8c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70     }else if( pOp
2c8d0 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77  ->opcode==OP_Row
2c8e0 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
2c8f0 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c  pOp->p1 = pLevel
2c900 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  ->iIdxCur;.     
2c910 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
2c920 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a   = OP_IdxRowid;.
2c930 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c940 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
2c950 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a  * Final cleanup.
2c960 20 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e    */.  pParse->n
2c970 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e  QueryLoop = pWIn
2c980 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c  fo->savedNQueryL
2c990 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f  oop;.  whereInfo
2c9a0 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
2c9b0 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a        ;.  return;.}.