/ Hex Artifact Content
Login

Artifact dd3be478fc6089a1012d2ae5bb5d774f235e34bdb2ed391bc97e06b9367b9f1d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 23 69 6e 63 6c 75 64 65 20 22 77 68 65 72 65  .#include "where
0350: 49 6e 74 2e 68 22 0a 0a 2f 2a 20 46 6f 72 77 61  Int.h"../* Forwa
0360: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6f  rd declaration o
0370: 66 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61  f methods */.sta
0380: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f  tic int whereLoo
0390: 70 52 65 73 69 7a 65 28 73 71 6c 69 74 65 33 2a  pResize(sqlite3*
03a0: 2c 20 57 68 65 72 65 4c 6f 6f 70 2a 2c 20 69 6e  , WhereLoop*, in
03b0: 74 29 3b 0a 0a 2f 2a 20 54 65 73 74 20 76 61 72  t);../* Test var
03c0: 69 61 62 6c 65 20 74 68 61 74 20 63 61 6e 20 62  iable that can b
03d0: 65 20 73 65 74 20 74 6f 20 65 6e 61 62 6c 65 20  e set to enable 
03e0: 57 48 45 52 45 20 74 72 61 63 69 6e 67 20 2a 2f  WHERE tracing */
03f0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
0400: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
0410: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
0420: 47 29 0a 2f 2a 2a 2a 2f 20 69 6e 74 20 73 71 6c  G)./***/ int sql
0430: 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
0440: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a   0;.#endif.../*.
0450: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 65 73  ** Return the es
0460: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
0470: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 66 72  f output rows fr
0480: 6f 6d 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  om a WHERE claus
0490: 65 0a 2a 2f 0a 4c 6f 67 45 73 74 20 73 71 6c 69  e.*/.LogEst sqli
04a0: 74 65 33 57 68 65 72 65 4f 75 74 70 75 74 52 6f  te3WhereOutputRo
04b0: 77 43 6f 75 6e 74 28 57 68 65 72 65 49 6e 66 6f  wCount(WhereInfo
04c0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
04d0: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  urn pWInfo->nRow
04e0: 4f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Out;.}../*.** Re
04f0: 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  turn one of the 
0500: 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 78  WHERE_DISTINCT_x
0510: 78 78 78 78 20 76 61 6c 75 65 73 20 74 6f 20 69  xxxx values to i
0520: 6e 64 69 63 61 74 65 20 68 6f 77 20 74 68 69 73  ndicate how this
0530: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
0540: 20 72 65 74 75 72 6e 73 20 6f 75 74 70 75 74 73   returns outputs
0550: 20 66 6f 72 20 44 49 53 54 49 4e 43 54 20 70 72   for DISTINCT pr
0560: 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  ocessing..*/.int
0570: 20 73 71 6c 69 74 65 33 57 68 65 72 65 49 73 44   sqlite3WhereIsD
0580: 69 73 74 69 6e 63 74 28 57 68 65 72 65 49 6e 66  istinct(WhereInf
0590: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65  o *pWInfo){.  re
05a0: 74 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 65 44 69  turn pWInfo->eDi
05b0: 73 74 69 6e 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  stinct;.}../*.**
05c0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
05d0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
05e0: 20 72 65 74 75 72 6e 73 20 72 6f 77 73 20 69 6e   returns rows in
05f0: 20 4f 52 44 45 52 20 42 59 20 6f 72 64 65 72 2e   ORDER BY order.
0600: 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
0610: 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 6e   if the output n
0620: 65 65 64 73 20 74 6f 20 62 65 20 73 6f 72 74 65  eeds to be sorte
0630: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
0640: 33 57 68 65 72 65 49 73 4f 72 64 65 72 65 64 28  3WhereIsOrdered(
0650: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
0660: 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 57 49  o){.  return pWI
0670: 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3b 0a 7d 0a 0a  nfo->nOBSat;.}..
0680: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
0690: 45 20 69 66 20 74 68 65 20 69 6e 6e 65 72 6d 6f  E if the innermo
06a0: 73 74 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 57  st loop of the W
06b0: 48 45 52 45 20 63 6c 61 75 73 65 20 69 6d 70 6c  HERE clause impl
06c0: 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20 72 65  ementation.** re
06d0: 74 75 72 6e 73 20 72 6f 77 73 20 69 6e 20 4f 52  turns rows in OR
06e0: 44 45 52 20 42 59 20 6f 72 64 65 72 20 66 6f 72  DER BY order for
06f0: 20 63 6f 6d 70 6c 65 74 65 20 72 75 6e 20 6f 66   complete run of
0700: 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 2e   the inner loop.
0710: 0a 2a 2a 0a 2a 2a 20 41 63 72 6f 73 73 20 6d 75  .**.** Across mu
0720: 6c 74 69 70 6c 65 20 69 74 65 72 61 74 69 6f 6e  ltiple iteration
0730: 73 20 6f 66 20 6f 75 74 65 72 20 6c 6f 6f 70 73  s of outer loops
0740: 2c 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f 77  , the output row
0750: 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 0a 2a 2a  s need not be.**
0760: 20 73 6f 72 74 65 64 2e 20 20 41 73 20 6c 6f 6e   sorted.  As lon
0770: 67 20 61 73 20 72 6f 77 73 20 61 72 65 20 73 6f  g as rows are so
0780: 72 74 65 64 20 66 6f 72 20 6a 75 73 74 20 74 68  rted for just th
0790: 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6c 6f 6f 70  e innermost loop
07a0: 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  , this.** routin
07b0: 65 20 63 61 6e 20 72 65 74 75 72 6e 20 54 52 55  e can return TRU
07c0: 45 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  E..*/.int sqlite
07d0: 33 57 68 65 72 65 4f 72 64 65 72 65 64 49 6e 6e  3WhereOrderedInn
07e0: 65 72 4c 6f 6f 70 28 57 68 65 72 65 49 6e 66 6f  erLoop(WhereInfo
07f0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 72 65 74   *pWInfo){.  ret
0800: 75 72 6e 20 70 57 49 6e 66 6f 2d 3e 62 4f 72 64  urn pWInfo->bOrd
0810: 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 3b 0a 7d  eredInnerLoop;.}
0820: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
0830: 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73 20  he VDBE address 
0840: 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d 70  or label to jump
0850: 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f 20   to in order to 
0860: 63 6f 6e 74 69 6e 75 65 0a 2a 2a 20 69 6d 6d 65  continue.** imme
0870: 64 69 61 74 65 6c 79 20 77 69 74 68 20 74 68 65  diately with the
0880: 20 6e 65 78 74 20 72 6f 77 20 6f 66 20 61 20 57   next row of a W
0890: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  HERE clause..*/.
08a0: 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72 65  int sqlite3Where
08b0: 43 6f 6e 74 69 6e 75 65 4c 61 62 65 6c 28 57 68  ContinueLabel(Wh
08c0: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
08d0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e  {.  assert( pWIn
08e0: 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 21 3d 30  fo->iContinue!=0
08f0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49   );.  return pWI
0900: 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 3b 0a  nfo->iContinue;.
0910: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
0920: 74 68 65 20 56 44 42 45 20 61 64 64 72 65 73 73  the VDBE address
0930: 20 6f 72 20 6c 61 62 65 6c 20 74 6f 20 6a 75 6d   or label to jum
0940: 70 20 74 6f 20 69 6e 20 6f 72 64 65 72 20 74 6f  p to in order to
0950: 20 62 72 65 61 6b 0a 2a 2a 20 6f 75 74 20 6f 66   break.** out of
0960: 20 61 20 57 48 45 52 45 20 6c 6f 6f 70 2e 0a 2a   a WHERE loop..*
0970: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  /.int sqlite3Whe
0980: 72 65 42 72 65 61 6b 4c 61 62 65 6c 28 57 68 65  reBreakLabel(Whe
0990: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
09a0: 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
09b0: 2d 3e 69 42 72 65 61 6b 3b 0a 7d 0a 0a 2f 2a 0a  ->iBreak;.}../*.
09c0: 2a 2a 20 52 65 74 75 72 6e 20 4f 4e 45 50 41 53  ** Return ONEPAS
09d0: 53 5f 4f 46 46 20 28 30 29 20 69 66 20 61 6e 20  S_OFF (0) if an 
09e0: 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
09f0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 75 6e   statement is un
0a00: 61 62 6c 65 20 74 6f 0a 2a 2a 20 6f 70 65 72 61  able to.** opera
0a10: 74 65 20 64 69 72 65 63 74 6c 79 20 6f 6e 20 74  te directly on t
0a20: 68 65 20 72 6f 77 69 73 20 72 65 74 75 72 6e 65  he rowis returne
0a30: 64 20 62 79 20 61 20 57 48 45 52 45 20 63 6c 61  d by a WHERE cla
0a40: 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  use.  Return.** 
0a50: 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c 45 20 28  ONEPASS_SINGLE (
0a60: 31 29 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  1) if the statem
0a70: 65 6e 74 20 63 61 6e 20 6f 70 65 72 61 74 69 6f  ent can operatio
0a80: 6e 20 64 69 72 65 63 74 6c 79 20 62 65 63 61 75  n directly becau
0a90: 73 65 20 6f 6e 6c 79 0a 2a 2a 20 61 20 73 69 6e  se only.** a sin
0aa0: 67 6c 65 20 72 6f 77 20 69 73 20 74 6f 20 62 65  gle row is to be
0ab0: 20 63 68 61 6e 67 65 64 2e 20 20 52 65 74 75 72   changed.  Retur
0ac0: 6e 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49 20  n ONEPASS_MULTI 
0ad0: 28 32 29 20 69 66 20 74 68 65 20 6f 6e 65 2d 70  (2) if the one-p
0ae0: 61 73 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  ass.** optimizat
0af0: 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20  ion can be used 
0b00: 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 0a  on multiple .**.
0b10: 2a 2a 20 49 66 20 74 68 65 20 4f 4e 45 50 41 53  ** If the ONEPAS
0b20: 53 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  S optimization i
0b30: 73 20 75 73 65 64 20 28 69 66 20 74 68 69 73 20  s used (if this 
0b40: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
0b50: 74 72 75 65 29 0a 2a 2a 20 74 68 65 6e 20 61 6c  true).** then al
0b60: 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e 64  so write the ind
0b70: 69 63 65 73 20 6f 66 20 6f 70 65 6e 20 63 75 72  ices of open cur
0b80: 73 6f 72 73 20 75 73 65 64 20 62 79 20 4f 4e 45  sors used by ONE
0b90: 50 41 53 53 0a 2a 2a 20 69 6e 74 6f 20 61 69 43  PASS.** into aiC
0ba0: 75 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b  ur[0] and aiCur[
0bb0: 31 5d 2e 20 20 69 61 43 75 72 5b 30 5d 20 67 65  1].  iaCur[0] ge
0bc0: 74 73 20 74 68 65 20 63 75 72 73 6f 72 20 6f 66  ts the cursor of
0bd0: 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 74 61 62   the data.** tab
0be0: 6c 65 20 61 6e 64 20 69 61 43 75 72 5b 31 5d 20  le and iaCur[1] 
0bf0: 67 65 74 73 20 74 68 65 20 63 75 72 73 6f 72 20  gets the cursor 
0c00: 75 73 65 64 20 62 79 20 61 6e 20 61 75 78 69 6c  used by an auxil
0c10: 69 61 72 79 20 69 6e 64 65 78 2e 0a 2a 2a 20 45  iary index..** E
0c20: 69 74 68 65 72 20 76 61 6c 75 65 20 6d 61 79 20  ither value may 
0c30: 62 65 20 2d 31 2c 20 69 6e 64 69 63 61 74 69 6e  be -1, indicatin
0c40: 67 20 74 68 61 74 20 63 75 72 73 6f 72 20 69 73  g that cursor is
0c50: 20 6e 6f 74 20 75 73 65 64 2e 0a 2a 2a 20 41 6e   not used..** An
0c60: 79 20 63 75 72 73 6f 72 73 20 72 65 74 75 72 6e  y cursors return
0c70: 65 64 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  ed will have bee
0c80: 6e 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  n opened for wri
0c90: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 61 69 43 75  ting..**.** aiCu
0ca0: 72 5b 30 5d 20 61 6e 64 20 61 69 43 75 72 5b 31  r[0] and aiCur[1
0cb0: 5d 20 62 6f 74 68 20 67 65 74 20 2d 31 20 69 66  ] both get -1 if
0cc0: 20 74 68 65 20 77 68 65 72 65 2d 63 6c 61 75 73   the where-claus
0cd0: 65 20 6c 6f 67 69 63 20 69 73 0a 2a 2a 20 75 6e  e logic is.** un
0ce0: 61 62 6c 65 20 74 6f 20 75 73 65 20 74 68 65 20  able to use the 
0cf0: 4f 4e 45 50 41 53 53 20 6f 70 74 69 6d 69 7a 61  ONEPASS optimiza
0d00: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
0d10: 69 74 65 33 57 68 65 72 65 4f 6b 4f 6e 65 50 61  ite3WhereOkOnePa
0d20: 73 73 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ss(WhereInfo *pW
0d30: 49 6e 66 6f 2c 20 69 6e 74 20 2a 61 69 43 75 72  Info, int *aiCur
0d40: 29 7b 0a 20 20 6d 65 6d 63 70 79 28 61 69 43 75  ){.  memcpy(aiCu
0d50: 72 2c 20 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72  r, pWInfo->aiCur
0d60: 4f 6e 65 50 61 73 73 2c 20 73 69 7a 65 6f 66 28  OnePass, sizeof(
0d70: 69 6e 74 29 2a 32 29 3b 0a 23 69 66 64 65 66 20  int)*2);.#ifdef 
0d80: 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
0d90: 45 44 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ED.  if( sqlite3
0da0: 57 68 65 72 65 54 72 61 63 65 20 26 26 20 70 57  WhereTrace && pW
0db0: 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 21 3d  Info->eOnePass!=
0dc0: 4f 4e 45 50 41 53 53 5f 4f 46 46 20 29 7b 0a 20  ONEPASS_OFF ){. 
0dd0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
0de0: 72 69 6e 74 66 28 22 25 73 20 63 75 72 73 6f 72  rintf("%s cursor
0df0: 73 3a 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  s: %d %d\n",.   
0e00: 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f        pWInfo->eO
0e10: 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
0e20: 53 49 4e 47 4c 45 20 3f 20 22 4f 4e 45 50 41 53  SINGLE ? "ONEPAS
0e30: 53 5f 53 49 4e 47 4c 45 22 20 3a 20 22 4f 4e 45  S_SINGLE" : "ONE
0e40: 50 41 53 53 5f 4d 55 4c 54 49 22 2c 0a 20 20 20  PASS_MULTI",.   
0e50: 20 20 20 20 20 20 61 69 43 75 72 5b 30 5d 2c 20        aiCur[0], 
0e60: 61 69 43 75 72 5b 31 5d 29 3b 0a 20 20 7d 0a 23  aiCur[1]);.  }.#
0e70: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70  endif.  return p
0e80: 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3b  WInfo->eOnePass;
0e90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
0ea0: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 53  he content of pS
0eb0: 72 63 20 69 6e 74 6f 20 70 44 65 73 74 0a 2a 2f  rc into pDest.*/
0ec0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
0ed0: 72 65 4f 72 4d 6f 76 65 28 57 68 65 72 65 4f 72  reOrMove(WhereOr
0ee0: 53 65 74 20 2a 70 44 65 73 74 2c 20 57 68 65 72  Set *pDest, Wher
0ef0: 65 4f 72 53 65 74 20 2a 70 53 72 63 29 7b 0a 20  eOrSet *pSrc){. 
0f00: 20 70 44 65 73 74 2d 3e 6e 20 3d 20 70 53 72 63   pDest->n = pSrc
0f10: 2d 3e 6e 3b 0a 20 20 6d 65 6d 63 70 79 28 70 44  ->n;.  memcpy(pD
0f20: 65 73 74 2d 3e 61 2c 20 70 53 72 63 2d 3e 61 2c  est->a, pSrc->a,
0f30: 20 70 44 65 73 74 2d 3e 6e 2a 73 69 7a 65 6f 66   pDest->n*sizeof
0f40: 28 70 44 65 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pDest->a[0]));.
0f50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
0f60: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 70 72 65  insert a new pre
0f70: 72 65 71 75 69 73 69 74 65 2f 63 6f 73 74 20 65  requisite/cost e
0f80: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 57 68  ntry into the Wh
0f90: 65 72 65 4f 72 53 65 74 20 70 53 65 74 2e 0a 2a  ereOrSet pSet..*
0fa0: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6e 74  *.** The new ent
0fb0: 72 79 20 6d 69 67 68 74 20 6f 76 65 72 77 72 69  ry might overwri
0fc0: 74 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65  te an existing e
0fd0: 6e 74 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68  ntry, or it migh
0fe0: 74 20 62 65 0a 2a 2a 20 61 70 70 65 6e 64 65 64  t be.** appended
0ff0: 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65  , or it might be
1000: 20 64 69 73 63 61 72 64 65 64 2e 20 20 44 6f 20   discarded.  Do 
1010: 77 68 61 74 65 76 65 72 20 69 73 20 74 68 65 20  whatever is the 
1020: 72 69 67 68 74 20 74 68 69 6e 67 0a 2a 2a 20 73  right thing.** s
1030: 6f 20 74 68 61 74 20 70 53 65 74 20 6b 65 65 70  o that pSet keep
1040: 73 20 74 68 65 20 4e 5f 4f 52 5f 43 4f 53 54 20  s the N_OR_COST 
1050: 62 65 73 74 20 65 6e 74 72 69 65 73 20 73 65 65  best entries see
1060: 6e 20 73 6f 20 66 61 72 2e 0a 2a 2f 0a 73 74 61  n so far..*/.sta
1070: 74 69 63 20 69 6e 74 20 77 68 65 72 65 4f 72 49  tic int whereOrI
1080: 6e 73 65 72 74 28 0a 20 20 57 68 65 72 65 4f 72  nsert(.  WhereOr
1090: 53 65 74 20 2a 70 53 65 74 2c 20 20 20 20 20 20  Set *pSet,      
10a0: 2f 2a 20 54 68 65 20 57 68 65 72 65 4f 72 53 65  /* The WhereOrSe
10b0: 74 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20  t to be updated 
10c0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
10d0: 72 65 71 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  req,        /* P
10e0: 72 65 72 65 71 75 69 73 69 74 65 73 20 6f 66 20  rerequisites of 
10f0: 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 2a 2f  the new entry */
1100: 0a 20 20 4c 6f 67 45 73 74 20 72 52 75 6e 2c 20  .  LogEst rRun, 
1110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75 6e            /* Run
1120: 2d 63 6f 73 74 20 6f 66 20 74 68 65 20 6e 65 77  -cost of the new
1130: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 4c 6f 67 45   entry */.  LogE
1140: 73 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20  st nOut         
1150: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1160: 6f 75 74 70 75 74 73 20 66 6f 72 20 74 68 65 20  outputs for the 
1170: 6e 65 77 20 65 6e 74 72 79 20 2a 2f 0a 29 7b 0a  new entry */.){.
1180: 20 20 75 31 36 20 69 3b 0a 20 20 57 68 65 72 65    u16 i;.  Where
1190: 4f 72 43 6f 73 74 20 2a 70 3b 0a 20 20 66 6f 72  OrCost *p;.  for
11a0: 28 69 3d 70 53 65 74 2d 3e 6e 2c 20 70 3d 70 53  (i=pSet->n, p=pS
11b0: 65 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c  et->a; i>0; i--,
11c0: 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72   p++){.    if( r
11d0: 52 75 6e 3c 3d 70 2d 3e 72 52 75 6e 20 26 26 20  Run<=p->rRun && 
11e0: 28 70 72 65 72 65 71 20 26 20 70 2d 3e 70 72 65  (prereq & p->pre
11f0: 72 65 71 29 3d 3d 70 72 65 72 65 71 20 29 7b 0a  req)==prereq ){.
1200: 20 20 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65        goto where
1210: 4f 72 49 6e 73 65 72 74 5f 64 6f 6e 65 3b 0a 20  OrInsert_done;. 
1220: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
1230: 72 52 75 6e 3c 3d 72 52 75 6e 20 26 26 20 28 70  rRun<=rRun && (p
1240: 2d 3e 70 72 65 72 65 71 20 26 20 70 72 65 72 65  ->prereq & prere
1250: 71 29 3d 3d 70 2d 3e 70 72 65 72 65 71 20 29 7b  q)==p->prereq ){
1260: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1270: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1280: 20 70 53 65 74 2d 3e 6e 3c 4e 5f 4f 52 5f 43 4f   pSet->n<N_OR_CO
1290: 53 54 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70  ST ){.    p = &p
12a0: 53 65 74 2d 3e 61 5b 70 53 65 74 2d 3e 6e 2b 2b  Set->a[pSet->n++
12b0: 5d 3b 0a 20 20 20 20 70 2d 3e 6e 4f 75 74 20 3d  ];.    p->nOut =
12c0: 20 6e 4f 75 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a   nOut;.  }else{.
12d0: 20 20 20 20 70 20 3d 20 70 53 65 74 2d 3e 61 3b      p = pSet->a;
12e0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
12f0: 70 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  pSet->n; i++){. 
1300: 20 20 20 20 20 69 66 28 20 70 2d 3e 72 52 75 6e       if( p->rRun
1310: 3e 70 53 65 74 2d 3e 61 5b 69 5d 2e 72 52 75 6e  >pSet->a[i].rRun
1320: 20 29 20 70 20 3d 20 70 53 65 74 2d 3e 61 20 2b   ) p = pSet->a +
1330: 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   i;.    }.    if
1340: 28 20 70 2d 3e 72 52 75 6e 3c 3d 72 52 75 6e 20  ( p->rRun<=rRun 
1350: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
1360: 77 68 65 72 65 4f 72 49 6e 73 65 72 74 5f 64 6f  whereOrInsert_do
1370: 6e 65 3a 0a 20 20 70 2d 3e 70 72 65 72 65 71 20  ne:.  p->prereq 
1380: 3d 20 70 72 65 72 65 71 3b 0a 20 20 70 2d 3e 72  = prereq;.  p->r
1390: 52 75 6e 20 3d 20 72 52 75 6e 3b 0a 20 20 69 66  Run = rRun;.  if
13a0: 28 20 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74 20 29  ( p->nOut>nOut )
13b0: 20 70 2d 3e 6e 4f 75 74 20 3d 20 6e 4f 75 74 3b   p->nOut = nOut;
13c0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
13d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
13e0: 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65   bitmask for the
13f0: 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75   given cursor nu
1400: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20  mber.  Return 0 
1410: 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73  if.** iCursor is
1420: 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e   not in the set.
1430: 0a 2a 2f 0a 42 69 74 6d 61 73 6b 20 73 71 6c 69  .*/.Bitmask sqli
1440: 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
1450: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
1460: 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72  askSet, int iCur
1470: 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  sor){.  int i;. 
1480: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
1490: 74 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f  t->n<=(int)sizeo
14a0: 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a  f(Bitmask)*8 );.
14b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61    for(i=0; i<pMa
14c0: 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a  skSet->n; i++){.
14d0: 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74      if( pMaskSet
14e0: 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72  ->ix[i]==iCursor
14f0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1500: 20 4d 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20   MASKBIT(i);.   
1510: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1520: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
1530: 74 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f  te a new mask fo
1540: 72 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72  r cursor iCursor
1550: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ..**.** There is
1560: 20 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20   one cursor per 
1570: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
1580: 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e  M clause.  The n
1590: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c  umber of.** tabl
15a0: 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
15b0: 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
15c0: 20 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79   by a test early
15d0: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   in the.** sqlit
15e0: 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72  e3WhereBegin() r
15f0: 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b  outine.  So we k
1600: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61  now that the pMa
1610: 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61  skSet->ix[].** a
1620: 72 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  rray will never 
1630: 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61  overflow..*/.sta
1640: 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d  tic void createM
1650: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
1660: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
1670: 69 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65  iCursor){.  asse
1680: 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20  rt( pMaskSet->n 
1690: 3c 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73  < ArraySize(pMas
16a0: 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70  kSet->ix) );.  p
16b0: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73  MaskSet->ix[pMas
16c0: 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75  kSet->n++] = iCu
16d0: 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rsor;.}../*.** A
16e0: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
16f0: 78 74 20 57 68 65 72 65 54 65 72 6d 20 74 68 61  xt WhereTerm tha
1700: 74 20 6d 61 74 63 68 65 73 20 61 63 63 6f 72 64  t matches accord
1710: 69 6e 67 20 74 6f 20 74 68 65 20 63 72 69 74 65  ing to the crite
1720: 72 69 61 0a 2a 2a 20 65 73 74 61 62 6c 69 73 68  ria.** establish
1730: 65 64 20 77 68 65 6e 20 74 68 65 20 70 53 63 61  ed when the pSca
1740: 6e 20 6f 62 6a 65 63 74 20 77 61 73 20 69 6e 69  n object was ini
1750: 74 69 61 6c 69 7a 65 64 20 62 79 20 77 68 65 72  tialized by wher
1760: 65 53 63 61 6e 49 6e 69 74 28 29 2e 0a 2a 2a 20  eScanInit()..** 
1770: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
1780: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
1790: 20 6d 61 74 63 68 69 6e 67 20 57 68 65 72 65 54   matching WhereT
17a0: 65 72 6d 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erms..*/.static 
17b0: 57 68 65 72 65 54 65 72 6d 20 2a 77 68 65 72 65  WhereTerm *where
17c0: 53 63 61 6e 4e 65 78 74 28 57 68 65 72 65 53 63  ScanNext(WhereSc
17d0: 61 6e 20 2a 70 53 63 61 6e 29 7b 0a 20 20 69 6e  an *pScan){.  in
17e0: 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
17f0: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
1800: 20 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74   on the LHS of t
1810: 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 69 31 36  he term */.  i16
1820: 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20   iColumn;       
1830: 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    /* The column 
1840: 6f 6e 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  on the LHS of th
1850: 65 20 74 65 72 6d 2e 20 20 2d 31 20 66 6f 72 20  e term.  -1 for 
1860: 49 50 4b 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  IPK */.  Expr *p
1870: 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  X;            /*
1880: 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 62   An expression b
1890: 65 69 6e 67 20 74 65 73 74 65 64 20 2a 2f 0a 20  eing tested */. 
18a0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
18b0: 43 3b 20 20 20 20 2f 2a 20 53 68 6f 72 74 68 61  C;    /* Shortha
18c0: 6e 64 20 66 6f 72 20 70 53 63 61 6e 2d 3e 70 57  nd for pScan->pW
18d0: 43 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  C */.  WhereTerm
18e0: 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 54   *pTerm;    /* T
18f0: 68 65 20 74 65 72 6d 20 62 65 69 6e 67 20 74 65  he term being te
1900: 73 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6b 20  sted */.  int k 
1910: 3d 20 70 53 63 61 6e 2d 3e 6b 3b 20 20 20 20 2f  = pScan->k;    /
1920: 2a 20 57 68 65 72 65 20 74 6f 20 73 74 61 72 74  * Where to start
1930: 20 73 63 61 6e 6e 69 6e 67 20 2a 2f 0a 0a 20 20   scanning */..  
1940: 61 73 73 65 72 74 28 20 70 53 63 61 6e 2d 3e 69  assert( pScan->i
1950: 45 71 75 69 76 3c 3d 70 53 63 61 6e 2d 3e 6e 45  Equiv<=pScan->nE
1960: 71 75 69 76 20 29 3b 0a 20 20 70 57 43 20 3d 20  quiv );.  pWC = 
1970: 70 53 63 61 6e 2d 3e 70 57 43 3b 0a 20 20 77 68  pScan->pWC;.  wh
1980: 69 6c 65 28 31 29 7b 0a 20 20 20 20 69 43 6f 6c  ile(1){.    iCol
1990: 75 6d 6e 20 3d 20 70 53 63 61 6e 2d 3e 61 69 43  umn = pScan->aiC
19a0: 6f 6c 75 6d 6e 5b 70 53 63 61 6e 2d 3e 69 45 71  olumn[pScan->iEq
19b0: 75 69 76 2d 31 5d 3b 0a 20 20 20 20 69 43 75 72  uiv-1];.    iCur
19c0: 20 3d 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b   = pScan->aiCur[
19d0: 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2d 31 5d  pScan->iEquiv-1]
19e0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  ;.    assert( pW
19f0: 43 21 3d 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a  C!=0 );.    do{.
1a00: 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
1a10: 70 57 43 2d 3e 61 2b 6b 3b 20 6b 3c 70 57 43 2d  pWC->a+k; k<pWC-
1a20: 3e 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65  >nTerm; k++, pTe
1a30: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  rm++){.        i
1a40: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
1a50: 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20 20 20  rsor==iCur.     
1a60: 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e      && pTerm->u.
1a70: 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c  leftColumn==iCol
1a80: 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20  umn.         && 
1a90: 28 69 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 45 58 50  (iColumn!=XN_EXP
1aa0: 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  R.             |
1ab0: 7c 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  | sqlite3ExprCom
1ac0: 70 61 72 65 53 6b 69 70 28 70 54 65 72 6d 2d 3e  pareSkip(pTerm->
1ad0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20  pExpr->pLeft,.  
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b00: 20 20 20 20 20 70 53 63 61 6e 2d 3e 70 49 64 78       pScan->pIdx
1b10: 45 78 70 72 2c 69 43 75 72 29 3d 3d 30 29 0a 20  Expr,iCur)==0). 
1b20: 20 20 20 20 20 20 20 20 26 26 20 28 70 53 63 61          && (pSca
1b30: 6e 2d 3e 69 45 71 75 69 76 3c 3d 31 20 7c 7c 20  n->iEquiv<=1 || 
1b40: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
1b50: 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45  (pTerm->pExpr, E
1b60: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 20  P_FromJoin)).   
1b70: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1b80: 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f    if( (pTerm->eO
1b90: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 55  perator & WO_EQU
1ba0: 49 56 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  IV)!=0.         
1bb0: 20 20 26 26 20 70 53 63 61 6e 2d 3e 6e 45 71 75    && pScan->nEqu
1bc0: 69 76 3c 41 72 72 61 79 53 69 7a 65 28 70 53 63  iv<ArraySize(pSc
1bd0: 61 6e 2d 3e 61 69 43 75 72 29 0a 20 20 20 20 20  an->aiCur).     
1be0: 20 20 20 20 20 20 26 26 20 28 70 58 20 3d 20 73        && (pX = s
1bf0: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
1c00: 6c 6c 61 74 65 28 70 54 65 72 6d 2d 3e 70 45 78  llate(pTerm->pEx
1c10: 70 72 2d 3e 70 52 69 67 68 74 29 29 2d 3e 6f 70  pr->pRight))->op
1c20: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20  ==TK_COLUMN.    
1c30: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1c40: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
1c50: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
1c60: 20 6a 3c 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76   j<pScan->nEquiv
1c70: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
1c80: 20 20 20 20 20 20 69 66 28 20 70 53 63 61 6e 2d        if( pScan-
1c90: 3e 61 69 43 75 72 5b 6a 5d 3d 3d 70 58 2d 3e 69  >aiCur[j]==pX->i
1ca0: 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  Table.          
1cb0: 20 20 20 20 20 26 26 20 70 53 63 61 6e 2d 3e 61       && pScan->a
1cc0: 69 43 6f 6c 75 6d 6e 5b 6a 5d 3d 3d 70 58 2d 3e  iColumn[j]==pX->
1cd0: 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
1cf0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
1d00: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1d10: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  }.            if
1d20: 28 20 6a 3d 3d 70 53 63 61 6e 2d 3e 6e 45 71 75  ( j==pScan->nEqu
1d30: 69 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  iv ){.          
1d40: 20 20 20 20 70 53 63 61 6e 2d 3e 61 69 43 75 72      pScan->aiCur
1d50: 5b 6a 5d 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65  [j] = pX->iTable
1d60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d70: 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  pScan->aiColumn[
1d80: 6a 5d 20 3d 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e  j] = pX->iColumn
1d90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1da0: 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 2b 2b 3b  pScan->nEquiv++;
1db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1dc0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1dd0: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
1de0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 70 53 63  >eOperator & pSc
1df0: 61 6e 2d 3e 6f 70 4d 61 73 6b 29 21 3d 30 20 29  an->opMask)!=0 )
1e00: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
1e10: 20 56 65 72 69 66 79 20 74 68 65 20 61 66 66 69   Verify the affi
1e20: 6e 69 74 79 20 61 6e 64 20 63 6f 6c 6c 61 74 69  nity and collati
1e30: 6e 67 20 73 65 71 75 65 6e 63 65 20 6d 61 74 63  ng sequence matc
1e40: 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  h */.           
1e50: 20 69 66 28 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c   if( pScan->zCol
1e60: 6c 4e 61 6d 65 20 26 26 20 28 70 54 65 72 6d 2d  lName && (pTerm-
1e70: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1e80: 49 53 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20  ISNULL)==0 ){.  
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 6c 6c              Coll
1ea0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
1eb0: 20 20 20 20 20 20 20 20 20 20 50 61 72 73 65 20            Parse 
1ec0: 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70  *pParse = pWC->p
1ed0: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 58 20               pX 
1ef0: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1f10: 28 20 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41  ( !sqlite3IndexA
1f20: 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 70 53  ffinityOk(pX, pS
1f30: 63 61 6e 2d 3e 69 64 78 61 66 66 29 20 29 7b 0a  can->idxaff) ){.
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f50: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1f60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f70: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
1f80: 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  X->pLeft);.     
1f90: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
1fa0: 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f   sqlite3BinaryCo
1fb0: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
1fc0: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff0: 20 20 20 20 20 20 20 70 58 2d 3e 70 4c 65 66 74         pX->pLeft
2000: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2020: 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 70 43 6f 6c   pColl==0 ) pCol
2030: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  l = pParse->db->
2040: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
2050: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
2060: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
2070: 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 53 63 61 6e 2d  l->zName, pScan-
2080: 3e 7a 43 6f 6c 6c 4e 61 6d 65 29 20 29 7b 0a 20  >zCollName) ){. 
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
20a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
20b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
20d0: 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
20e0: 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45  Operator & (WO_E
20f0: 51 7c 57 4f 5f 49 53 29 29 21 3d 30 0a 20 20 20  Q|WO_IS))!=0.   
2100: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
2110: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d   = pTerm->pExpr-
2120: 3e 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b  >pRight)->op==TK
2130: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20 20 20  _COLUMN.        
2140: 20 20 20 20 20 26 26 20 70 58 2d 3e 69 54 61 62       && pX->iTab
2150: 6c 65 3d 3d 70 53 63 61 6e 2d 3e 61 69 43 75 72  le==pScan->aiCur
2160: 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  [0].            
2170: 20 26 26 20 70 58 2d 3e 69 43 6f 6c 75 6d 6e 3d   && pX->iColumn=
2180: 3d 70 53 63 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e  =pScan->aiColumn
2190: 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  [0].            
21a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
21b0: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
21c0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
21d0: 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20  _IS );.         
21e0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
21f0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2200: 20 20 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e           pScan->
2210: 70 57 43 20 3d 20 70 57 43 3b 0a 20 20 20 20 20  pWC = pWC;.     
2220: 20 20 20 20 20 20 20 70 53 63 61 6e 2d 3e 6b 20         pScan->k 
2230: 3d 20 6b 2b 31 3b 0a 20 20 20 20 20 20 20 20 20  = k+1;.         
2240: 20 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b     return pTerm;
2250: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2260: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2270: 20 20 20 20 20 70 57 43 20 3d 20 70 57 43 2d 3e       pWC = pWC->
2280: 70 4f 75 74 65 72 3b 0a 20 20 20 20 20 20 6b 20  pOuter;.      k 
2290: 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 0;.    }while(
22a0: 20 70 57 43 21 3d 30 20 29 3b 0a 20 20 20 20 69   pWC!=0 );.    i
22b0: 66 28 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76  f( pScan->iEquiv
22c0: 3e 3d 70 53 63 61 6e 2d 3e 6e 45 71 75 69 76 20  >=pScan->nEquiv 
22d0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 57 43  ) break;.    pWC
22e0: 20 3d 20 70 53 63 61 6e 2d 3e 70 4f 72 69 67 57   = pScan->pOrigW
22f0: 43 3b 0a 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20  C;.    k = 0;.  
2300: 20 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 2b    pScan->iEquiv+
2310: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
2320: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  0;.}../*.** Init
2330: 69 61 6c 69 7a 65 20 61 20 57 48 45 52 45 20 63  ialize a WHERE c
2340: 6c 61 75 73 65 20 73 63 61 6e 6e 65 72 20 6f 62  lause scanner ob
2350: 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ject.  Return a 
2360: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a  pointer to the.*
2370: 2a 20 66 69 72 73 74 20 6d 61 74 63 68 2e 20 20  * first match.  
2380: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  Return NULL if t
2390: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 61 74 63  here are no matc
23a0: 68 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  hes..**.** The s
23b0: 63 61 6e 6e 65 72 20 77 69 6c 6c 20 62 65 20 73  canner will be s
23c0: 65 61 72 63 68 69 6e 67 20 74 68 65 20 57 48 45  earching the WHE
23d0: 52 45 20 63 6c 61 75 73 65 20 70 57 43 2e 20 20  RE clause pWC.  
23e0: 49 74 20 77 69 6c 6c 20 6c 6f 6f 6b 0a 2a 2a 20  It will look.** 
23f0: 66 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65  for terms of the
2400: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65   form "X <op> <e
2410: 78 70 72 3e 22 20 77 68 65 72 65 20 58 20 69 73  xpr>" where X is
2420: 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 75 6d 6e 20   column iColumn 
2430: 6f 66 20 74 61 62 6c 65 0a 2a 2a 20 69 43 75 72  of table.** iCur
2440: 2e 20 20 20 4f 72 20 69 66 20 70 49 64 78 21 3d  .   Or if pIdx!=
2450: 30 20 74 68 65 6e 20 58 20 69 73 20 63 6f 6c 75  0 then X is colu
2460: 6d 6e 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e  mn iColumn of in
2470: 64 65 78 20 70 49 64 78 2e 20 20 70 49 64 78 0a  dex pIdx.  pIdx.
2480: 2a 2a 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  ** must be one o
2490: 66 20 74 68 65 20 69 6e 64 65 78 65 73 20 6f 66  f the indexes of
24a0: 20 74 61 62 6c 65 20 69 43 75 72 2e 0a 2a 2a 0a   table iCur..**.
24b0: 2a 2a 20 54 68 65 20 3c 6f 70 3e 20 6d 75 73 74  ** The <op> must
24c0: 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f   be one of the o
24d0: 70 65 72 61 74 6f 72 73 20 64 65 73 63 72 69 62  perators describ
24e0: 65 64 20 62 79 20 6f 70 4d 61 73 6b 2e 0a 2a 2a  ed by opMask..**
24f0: 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 61 72 63  .** If the searc
2500: 68 20 69 73 20 66 6f 72 20 58 20 61 6e 64 20 74  h is for X and t
2510: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2520: 63 6f 6e 74 61 69 6e 73 20 74 65 72 6d 73 20 6f  contains terms o
2530: 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 58 3d  f the.** form X=
2540: 59 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  Y then this rout
2550: 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20 72  ine might also r
2560: 65 74 75 72 6e 20 74 65 72 6d 73 20 6f 66 20 74  eturn terms of t
2570: 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20 3c 6f  he form.** "Y <o
2580: 70 3e 20 3c 65 78 70 72 3e 22 2e 20 20 54 68 65  p> <expr>".  The
2590: 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c   number of level
25a0: 73 20 6f 66 20 74 72 61 6e 73 69 74 69 76 69 74  s of transitivit
25b0: 79 20 69 73 20 6c 69 6d 69 74 65 64 2c 0a 2a 2a  y is limited,.**
25c0: 20 62 75 74 20 69 73 20 65 6e 6f 75 67 68 20 74   but is enough t
25d0: 6f 20 68 61 6e 64 6c 65 20 6d 6f 73 74 20 63 6f  o handle most co
25e0: 6d 6d 6f 6e 6c 79 20 6f 63 63 75 72 72 69 6e 67  mmonly occurring
25f0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
2600: 0a 2a 2a 0a 2a 2a 20 49 66 20 58 20 69 73 20 6e  .**.** If X is n
2610: 6f 74 20 74 68 65 20 49 4e 54 45 47 45 52 20 50  ot the INTEGER P
2620: 52 49 4d 41 52 59 20 4b 45 59 20 74 68 65 6e 20  RIMARY KEY then 
2630: 58 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 61 74  X must be compat
2640: 69 62 6c 65 20 77 69 74 68 0a 2a 2a 20 69 6e 64  ible with.** ind
2650: 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74  ex pIdx..*/.stat
2660: 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 77 68  ic WhereTerm *wh
2670: 65 72 65 53 63 61 6e 49 6e 69 74 28 0a 20 20 57  ereScanInit(.  W
2680: 68 65 72 65 53 63 61 6e 20 2a 70 53 63 61 6e 2c  hereScan *pScan,
2690: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68         /* The Wh
26a0: 65 72 65 53 63 61 6e 20 6f 62 6a 65 63 74 20 62  ereScan object b
26b0: 65 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 65 64  eing initialized
26c0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
26d0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 2f 2a  e *pWC,       /*
26e0: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
26f0: 65 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20  e to be scanned 
2700: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20  */.  int iCur,  
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2720: 43 75 72 73 6f 72 20 74 6f 20 73 63 61 6e 20 66  Cursor to scan f
2730: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  or */.  int iCol
2740: 75 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  umn,            
2750: 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 73 63 61  /* Column to sca
2760: 6e 20 66 6f 72 20 2a 2f 0a 20 20 75 33 32 20 6f  n for */.  u32 o
2770: 70 4d 61 73 6b 2c 20 20 20 20 20 20 20 20 20 20  pMask,          
2780: 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 28 73     /* Operator(s
2790: 29 20 74 6f 20 73 63 61 6e 20 66 6f 72 20 2a 2f  ) to scan for */
27a0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
27b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75             /* Mu
27c0: 73 74 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  st be compatible
27d0: 20 77 69 74 68 20 74 68 69 73 20 69 6e 64 65 78   with this index
27e0: 20 2a 2f 0a 29 7b 0a 20 20 70 53 63 61 6e 2d 3e   */.){.  pScan->
27f0: 70 4f 72 69 67 57 43 20 3d 20 70 57 43 3b 0a 20  pOrigWC = pWC;. 
2800: 20 70 53 63 61 6e 2d 3e 70 57 43 20 3d 20 70 57   pScan->pWC = pW
2810: 43 3b 0a 20 20 70 53 63 61 6e 2d 3e 70 49 64 78  C;.  pScan->pIdx
2820: 45 78 70 72 20 3d 20 30 3b 0a 20 20 70 53 63 61  Expr = 0;.  pSca
2830: 6e 2d 3e 69 64 78 61 66 66 20 3d 20 30 3b 0a 20  n->idxaff = 0;. 
2840: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
2850: 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 49 64  e = 0;.  if( pId
2860: 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d  x ){.    int j =
2870: 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 43   iColumn;.    iC
2880: 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69  olumn = pIdx->ai
2890: 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69  Column[j];.    i
28a0: 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 45  f( iColumn==XN_E
28b0: 58 50 52 20 29 7b 0a 20 20 20 20 20 20 70 53 63  XPR ){.      pSc
28c0: 61 6e 2d 3e 70 49 64 78 45 78 70 72 20 3d 20 70  an->pIdxExpr = p
28d0: 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 2d 3e 61  Idx->aColExpr->a
28e0: 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [j].pExpr;.     
28f0: 20 70 53 63 61 6e 2d 3e 7a 43 6f 6c 6c 4e 61 6d   pScan->zCollNam
2900: 65 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  e = pIdx->azColl
2910: 5b 6a 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  [j];.    }else i
2920: 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78  f( iColumn==pIdx
2930: 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20  ->pTable->iPKey 
2940: 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e  ){.      iColumn
2950: 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20   = XN_ROWID;.   
2960: 20 7d 65 6c 73 65 20 69 66 28 20 69 43 6f 6c 75   }else if( iColu
2970: 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  mn>=0 ){.      p
2980: 53 63 61 6e 2d 3e 69 64 78 61 66 66 20 3d 20 70  Scan->idxaff = p
2990: 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  Idx->pTable->aCo
29a0: 6c 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e  l[iColumn].affin
29b0: 69 74 79 3b 0a 20 20 20 20 20 20 70 53 63 61 6e  ity;.      pScan
29c0: 2d 3e 7a 43 6f 6c 6c 4e 61 6d 65 20 3d 20 70 49  ->zCollName = pI
29d0: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a 20  dx->azColl[j];. 
29e0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
29f0: 20 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 45 58 50   iColumn==XN_EXP
2a00: 52 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  R ){.    return 
2a10: 30 3b 0a 20 20 7d 0a 20 20 70 53 63 61 6e 2d 3e  0;.  }.  pScan->
2a20: 6f 70 4d 61 73 6b 20 3d 20 6f 70 4d 61 73 6b 3b  opMask = opMask;
2a30: 0a 20 20 70 53 63 61 6e 2d 3e 6b 20 3d 20 30 3b  .  pScan->k = 0;
2a40: 0a 20 20 70 53 63 61 6e 2d 3e 61 69 43 75 72 5b  .  pScan->aiCur[
2a50: 30 5d 20 3d 20 69 43 75 72 3b 0a 20 20 70 53 63  0] = iCur;.  pSc
2a60: 61 6e 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 20  an->aiColumn[0] 
2a70: 3d 20 69 43 6f 6c 75 6d 6e 3b 0a 20 20 70 53 63  = iColumn;.  pSc
2a80: 61 6e 2d 3e 6e 45 71 75 69 76 20 3d 20 31 3b 0a  an->nEquiv = 1;.
2a90: 20 20 70 53 63 61 6e 2d 3e 69 45 71 75 69 76 20    pScan->iEquiv 
2aa0: 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 77 68  = 1;.  return wh
2ab0: 65 72 65 53 63 61 6e 4e 65 78 74 28 70 53 63 61  ereScanNext(pSca
2ac0: 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  n);.}../*.** Sea
2ad0: 72 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69  rch for a term i
2ae0: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
2af0: 73 65 20 74 68 61 74 20 69 73 20 6f 66 20 74 68  se that is of th
2b00: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
2b10: 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20  expr>".** where 
2b20: 58 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  X is a reference
2b30: 20 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20   to the iColumn 
2b40: 6f 66 20 74 61 62 6c 65 20 69 43 75 72 20 6f 72  of table iCur or
2b50: 20 6f 66 20 69 6e 64 65 78 20 70 49 64 78 0a 2a   of index pIdx.*
2b60: 2a 20 69 66 20 70 49 64 78 21 3d 30 20 61 6e 64  * if pIdx!=0 and
2b70: 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20   <op> is one of 
2b80: 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74  the WO_xx operat
2b90: 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69 66 69  or codes specifi
2ba0: 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 6f 70 20  ed by.** the op 
2bb0: 70 61 72 61 6d 65 74 65 72 2e 20 20 52 65 74 75  parameter.  Retu
2bc0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2bd0: 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75 72  the term.  Retur
2be0: 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  n 0 if not found
2bf0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 49 64 78 21  ..**.** If pIdx!
2c00: 3d 30 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20  =0 then it must 
2c10: 62 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e  be one of the in
2c20: 64 65 78 65 73 20 6f 66 20 74 61 62 6c 65 20 69  dexes of table i
2c30: 43 75 72 2e 20 20 0a 2a 2a 20 53 65 61 72 63 68  Cur.  .** Search
2c40: 20 66 6f 72 20 74 65 72 6d 73 20 6d 61 74 63 68   for terms match
2c50: 69 6e 67 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d  ing the iColumn-
2c60: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 49 64  th column of pId
2c70: 78 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  x.** rather than
2c80: 20 74 68 65 20 69 43 6f 6c 75 6d 6e 2d 74 68 20   the iColumn-th 
2c90: 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
2ca0: 69 43 75 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iCur..**.** The 
2cb0: 74 65 72 6d 20 72 65 74 75 72 6e 65 64 20 6d 69  term returned mi
2cc0: 67 68 74 20 62 79 20 59 3d 3c 65 78 70 72 3e 20  ght by Y=<expr> 
2cd0: 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 6f 74  if there is anot
2ce0: 68 65 72 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  her constraint i
2cf0: 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  n.** the WHERE c
2d00: 6c 61 75 73 65 20 74 68 61 74 20 73 70 65 63 69  lause that speci
2d10: 66 69 65 73 20 74 68 61 74 20 58 3d 59 2e 20 20  fies that X=Y.  
2d20: 41 6e 79 20 73 75 63 68 20 63 6f 6e 73 74 72 61  Any such constra
2d30: 69 6e 74 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  ints will be.** 
2d40: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
2d50: 65 20 57 4f 5f 45 51 55 49 56 20 62 69 74 20 69  e WO_EQUIV bit i
2d60: 6e 20 74 68 65 20 70 54 65 72 6d 2d 3e 65 4f 70  n the pTerm->eOp
2d70: 65 72 61 74 6f 72 20 66 69 65 6c 64 2e 20 20 54  erator field.  T
2d80: 68 65 0a 2a 2a 20 61 69 43 75 72 5b 5d 2f 69 61  he.** aiCur[]/ia
2d90: 43 6f 6c 75 6d 6e 5b 5d 20 61 72 72 61 79 73 20  Column[] arrays 
2da0: 68 6f 6c 64 20 58 20 61 6e 64 20 61 6c 6c 20 69  hold X and all i
2db0: 74 73 20 65 71 75 69 76 61 6c 65 6e 74 73 2e 20  ts equivalents. 
2dc0: 54 68 65 72 65 20 61 72 65 20 31 31 0a 2a 2a 20  There are 11.** 
2dd0: 73 6c 6f 74 73 20 69 6e 20 61 69 43 75 72 5b 5d  slots in aiCur[]
2de0: 2f 61 69 43 6f 6c 75 6d 6e 5b 5d 20 73 6f 20 74  /aiColumn[] so t
2df0: 68 61 74 20 6d 65 61 6e 73 20 77 65 20 63 61 6e  hat means we can
2e00: 20 6c 6f 6f 6b 20 66 6f 72 20 58 20 70 6c 75 73   look for X plus
2e10: 20 75 70 20 74 6f 20 31 30 0a 2a 2a 20 6f 74 68   up to 10.** oth
2e20: 65 72 20 65 71 75 69 76 61 6c 65 6e 74 20 76 61  er equivalent va
2e30: 6c 75 65 73 2e 20 20 48 65 6e 63 65 20 61 20 73  lues.  Hence a s
2e40: 65 61 72 63 68 20 66 6f 72 20 58 20 77 69 6c 6c  earch for X will
2e50: 20 72 65 74 75 72 6e 20 3c 65 78 70 72 3e 20 69   return <expr> i
2e60: 66 20 58 3d 41 31 0a 2a 2a 20 61 6e 64 20 41 31  f X=A1.** and A1
2e70: 3d 41 32 20 61 6e 64 20 41 32 3d 41 33 20 61 6e  =A2 and A2=A3 an
2e80: 64 20 2e 2e 2e 20 61 6e 64 20 41 39 3d 41 31 30  d ... and A9=A10
2e90: 20 61 6e 64 20 41 31 30 3d 3c 65 78 70 72 3e 2e   and A10=<expr>.
2ea0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
2eb0: 61 72 65 20 6d 75 6c 74 69 70 6c 65 20 74 65 72  are multiple ter
2ec0: 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ms in the WHERE 
2ed0: 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f  clause of the fo
2ee0: 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  rm "X <op> <expr
2ef0: 3e 22 0a 2a 2a 20 74 68 65 6e 20 74 72 79 20 66  >".** then try f
2f00: 6f 72 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  or the one with 
2f10: 6e 6f 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  no dependencies 
2f20: 6f 6e 20 3c 65 78 70 72 3e 20 2d 20 69 6e 20 6f  on <expr> - in o
2f30: 74 68 65 72 20 77 6f 72 64 73 20 77 68 65 72 65  ther words where
2f40: 0a 2a 2a 20 3c 65 78 70 72 3e 20 69 73 20 61 20  .** <expr> is a 
2f50: 63 6f 6e 73 74 61 6e 74 20 65 78 70 72 65 73 73  constant express
2f60: 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64  ion of some kind
2f70: 2e 20 20 4f 6e 6c 79 20 72 65 74 75 72 6e 20 65  .  Only return e
2f80: 6e 74 72 69 65 73 20 6f 66 0a 2a 2a 20 74 68 65  ntries of.** the
2f90: 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22   form "X <op> Y"
2fa0: 20 77 68 65 72 65 20 59 20 69 73 20 61 20 63 6f   where Y is a co
2fb0: 6c 75 6d 6e 20 69 6e 20 61 6e 6f 74 68 65 72 20  lumn in another 
2fc0: 74 61 62 6c 65 20 69 66 20 6e 6f 20 74 65 72 6d  table if no term
2fd0: 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d  s of.** the form
2fe0: 20 22 58 20 3c 6f 70 3e 20 3c 63 6f 6e 73 74 2d   "X <op> <const-
2ff0: 65 78 70 72 3e 22 20 65 78 69 73 74 2e 20 20 20  expr>" exist.   
3000: 49 66 20 6e 6f 20 74 65 72 6d 73 20 77 69 74 68  If no terms with
3010: 20 61 20 63 6f 6e 73 74 61 6e 74 20 52 48 53 0a   a constant RHS.
3020: 2a 2a 20 65 78 69 73 74 2c 20 74 72 79 20 74 6f  ** exist, try to
3030: 20 72 65 74 75 72 6e 20 61 20 74 65 72 6d 20 74   return a term t
3040: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  hat does not use
3050: 20 57 4f 5f 45 51 55 49 56 2e 0a 2a 2f 0a 57 68   WO_EQUIV..*/.Wh
3060: 65 72 65 54 65 72 6d 20 2a 73 71 6c 69 74 65 33  ereTerm *sqlite3
3070: 57 68 65 72 65 46 69 6e 64 54 65 72 6d 28 0a 20  WhereFindTerm(. 
3080: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
3090: 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48  C,     /* The WH
30a0: 45 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65  ERE clause to be
30b0: 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69   searched */.  i
30c0: 6e 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20  nt iCur,        
30d0: 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e       /* Cursor n
30e0: 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a  umber of LHS */.
30f0: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20    int iColumn,  
3100: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
3110: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20  n number of LHS 
3120: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
3130: 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48  Ready,     /* RH
3140: 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c  S must not overl
3150: 61 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73  ap with this mas
3160: 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20  k */.  u32 op,  
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3180: 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61  Mask of WO_xx va
3190: 6c 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20  lues describing 
31a0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e  operator */.  In
31b0: 64 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20  dex *pIdx       
31c0: 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63      /* Must be c
31d0: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74  ompatible with t
31e0: 68 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f  his index, if no
31f0: 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57  t NULL */.){.  W
3200: 68 65 72 65 54 65 72 6d 20 2a 70 52 65 73 75 6c  hereTerm *pResul
3210: 74 20 3d 20 30 3b 0a 20 20 57 68 65 72 65 54 65  t = 0;.  WhereTe
3220: 72 6d 20 2a 70 3b 0a 20 20 57 68 65 72 65 53 63  rm *p;.  WhereSc
3230: 61 6e 20 73 63 61 6e 3b 0a 0a 20 20 70 20 3d 20  an scan;..  p = 
3240: 77 68 65 72 65 53 63 61 6e 49 6e 69 74 28 26 73  whereScanInit(&s
3250: 63 61 6e 2c 20 70 57 43 2c 20 69 43 75 72 2c 20  can, pWC, iCur, 
3260: 69 43 6f 6c 75 6d 6e 2c 20 6f 70 2c 20 70 49 64  iColumn, op, pId
3270: 78 29 3b 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 45  x);.  op &= WO_E
3280: 51 7c 57 4f 5f 49 53 3b 0a 20 20 77 68 69 6c 65  Q|WO_IS;.  while
3290: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28  ( p ){.    if( (
32a0: 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26  p->prereqRight &
32b0: 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b   notReady)==0 ){
32c0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 72  .      if( p->pr
32d0: 65 72 65 71 52 69 67 68 74 3d 3d 30 20 26 26 20  ereqRight==0 && 
32e0: 28 70 2d 3e 65 4f 70 65 72 61 74 6f 72 26 6f 70  (p->eOperator&op
32f0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
3300: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 65 4f 70  testcase( p->eOp
3310: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
3320: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
3330: 20 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   p;.      }.    
3340: 20 20 69 66 28 20 70 52 65 73 75 6c 74 3d 3d 30    if( pResult==0
3350: 20 29 20 70 52 65 73 75 6c 74 20 3d 20 70 3b 0a   ) pResult = p;.
3360: 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 77 68      }.    p = wh
3370: 65 72 65 53 63 61 6e 4e 65 78 74 28 26 73 63 61  ereScanNext(&sca
3380: 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
3390: 20 70 52 65 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 0a   pResult;.}../*.
33a0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
33b0: 20 73 65 61 72 63 68 65 73 20 70 4c 69 73 74 20   searches pList 
33c0: 66 6f 72 20 61 6e 20 65 6e 74 72 79 20 74 68 61  for an entry tha
33d0: 74 20 6d 61 74 63 68 65 73 20 74 68 65 20 69 43  t matches the iC
33e0: 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  ol-th column.** 
33f0: 6f 66 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  of index pIdx..*
3400: 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e 20  *.** If such an 
3410: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f  expression is fo
3420: 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20 69  und, its index i
3430: 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20  n pList->a[] is 
3440: 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20  returned. If.** 
3450: 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  no expression is
3460: 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72 65   found, -1 is re
3470: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
3480: 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78 43  c int findIndexC
3490: 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ol(.  Parse *pPa
34a0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
34b0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
34c0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
34d0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
34f0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
3500: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e  o search */.  in
3510: 74 20 69 42 61 73 65 2c 20 20 20 20 20 20 20 20  t iBase,        
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3530: 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62 6c   Cursor for tabl
3540: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
3550: 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65  h pIdx */.  Inde
3560: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
3570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
3580: 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63 6f  ndex to match co
3590: 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74  lumn of */.  int
35a0: 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20   iCol           
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
35c0: 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  Column of index 
35d0: 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20  to match */.){. 
35e0: 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
35f0: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49  char *zColl = pI
3600: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d  dx->azColl[iCol]
3610: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
3620: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
3630: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
3640: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
3650: 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e  pCollate(pList->
3660: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
3670: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
3680: 4f 4c 55 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d  OLUMN.     && p-
3690: 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e  >iColumn==pIdx->
36a0: 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20  aiColumn[iCol]. 
36b0: 20 20 20 20 26 26 20 70 2d 3e 69 54 61 62 6c 65      && p->iTable
36c0: 3d 3d 69 42 61 73 65 0a 20 20 20 20 29 7b 0a 20  ==iBase.    ){. 
36d0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
36e0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
36f0: 72 4e 4e 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  rNNCollSeq(pPars
3700: 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  e, pList->a[i].p
3710: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
3720: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
3730: 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c  mp(pColl->zName,
3740: 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20   zColl) ){.     
3750: 20 20 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20     return i;.   
3760: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
3770: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
3780: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
3790: 45 20 69 66 20 74 68 65 20 69 43 6f 6c 2d 74 68  E if the iCol-th
37a0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78   column of index
37b0: 20 70 49 64 78 20 69 73 20 4e 4f 54 20 4e 55 4c   pIdx is NOT NUL
37c0: 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  L.*/.static int 
37d0: 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e 6f 74 4e 75  indexColumnNotNu
37e0: 6c 6c 28 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  ll(Index *pIdx, 
37f0: 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74  int iCol){.  int
3800: 20 6a 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   j;.  assert( pI
3810: 64 78 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  dx!=0 );.  asser
3820: 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43  t( iCol>=0 && iC
3830: 6f 6c 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  ol<pIdx->nColumn
3840: 20 29 3b 0a 20 20 6a 20 3d 20 70 49 64 78 2d 3e   );.  j = pIdx->
3850: 61 69 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 3b 0a  aiColumn[iCol];.
3860: 20 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20    if( j>=0 ){.  
3870: 20 20 72 65 74 75 72 6e 20 70 49 64 78 2d 3e 70    return pIdx->p
3880: 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e  Table->aCol[j].n
3890: 6f 74 4e 75 6c 6c 3b 0a 20 20 7d 65 6c 73 65 20  otNull;.  }else 
38a0: 69 66 28 20 6a 3d 3d 28 2d 31 29 20 29 7b 0a 20  if( j==(-1) ){. 
38b0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
38c0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
38d0: 28 20 6a 3d 3d 28 2d 32 29 20 29 3b 0a 20 20 20  ( j==(-2) );.   
38e0: 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 41   return 0;  /* A
38f0: 73 73 75 6d 65 20 61 6e 20 69 6e 64 65 78 65 64  ssume an indexed
3900: 20 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 20   expression can 
3910: 61 6c 77 61 79 73 20 79 69 65 6c 64 20 61 20 4e  always yield a N
3920: 55 4c 4c 20 2a 2f 0a 0a 20 20 7d 0a 7d 0a 0a 2f  ULL */..  }.}../
3930: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
3940: 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
3950: 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74   expression-list
3960: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 74   passed as the t
3970: 68 69 72 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  hird argument.**
3980: 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 0a 2a   is redundant..*
3990: 2a 0a 2a 2a 20 41 20 44 49 53 54 49 4e 43 54 20  *.** A DISTINCT 
39a0: 6c 69 73 74 20 69 73 20 72 65 64 75 6e 64 61 6e  list is redundan
39b0: 74 20 69 66 20 61 6e 79 20 73 75 62 73 65 74 20  t if any subset 
39c0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69  of the columns i
39d0: 6e 20 74 68 65 0a 2a 2a 20 44 49 53 54 49 4e 43  n the.** DISTINC
39e0: 54 20 6c 69 73 74 20 61 72 65 20 63 6f 6c 6c 65  T list are colle
39f0: 63 74 69 76 65 6c 79 20 75 6e 69 71 75 65 20 61  ctively unique a
3a00: 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 6c 79 20  nd individually 
3a10: 6e 6f 6e 2d 6e 75 6c 6c 2e 0a 2a 2f 0a 73 74 61  non-null..*/.sta
3a20: 74 69 63 20 69 6e 74 20 69 73 44 69 73 74 69 6e  tic int isDistin
3a30: 63 74 52 65 64 75 6e 64 61 6e 74 28 0a 20 20 50  ctRedundant(.  P
3a40: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
3a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
3a60: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
3a70: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
3a80: 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  st,        /* Th
3a90: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f  e FROM clause */
3aa0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
3ab0: 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pWC,         /* 
3ac0: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
3ad0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
3ae0: 70 44 69 73 74 69 6e 63 74 20 20 20 20 20 20 20  pDistinct       
3af0: 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 20 73 65  /* The result se
3b00: 74 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  t that needs to 
3b10: 62 65 20 44 49 53 54 49 4e 43 54 20 2a 2f 0a 29  be DISTINCT */.)
3b20: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  {.  Table *pTab;
3b30: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a  .  Index *pIdx;.
3b40: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b60: 20 20 0a 20 20 69 6e 74 20 69 42 61 73 65 3b 0a    .  int iBase;.
3b70: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
3b80: 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
3b90: 74 61 62 6c 65 20 6f 72 20 73 75 62 2d 73 65 6c  table or sub-sel
3ba0: 65 63 74 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ect in the FROM 
3bb0: 63 6c 61 75 73 65 20 6f 66 0a 20 20 2a 2a 20 74  clause of.  ** t
3bc0: 68 69 73 20 71 75 65 72 79 2c 20 74 68 65 6e 20  his query, then 
3bd0: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 70  it will not be p
3be0: 6f 73 73 69 62 6c 65 20 74 6f 20 73 68 6f 77 20  ossible to show 
3bf0: 74 68 61 74 20 74 68 65 20 44 49 53 54 49 4e 43  that the DISTINC
3c00: 54 20 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69  T .  ** clause i
3c10: 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a  s redundant. */.
3c20: 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
3c30: 6e 53 72 63 21 3d 31 20 29 20 72 65 74 75 72 6e  nSrc!=1 ) return
3c40: 20 30 3b 0a 20 20 69 42 61 73 65 20 3d 20 70 54   0;.  iBase = pT
3c50: 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75  abList->a[0].iCu
3c60: 72 73 6f 72 3b 0a 20 20 70 54 61 62 20 3d 20 70  rsor;.  pTab = p
3c70: 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54  TabList->a[0].pT
3c80: 61 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 79  ab;..  /* If any
3c90: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
3ca0: 6f 6e 73 20 69 73 20 61 6e 20 49 50 4b 20 63 6f  ons is an IPK co
3cb0: 6c 75 6d 6e 20 6f 6e 20 74 61 62 6c 65 20 69 42  lumn on table iB
3cc0: 61 73 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ase, then return
3cd0: 20 0a 20 20 2a 2a 20 74 72 75 65 2e 20 4e 6f 74   .  ** true. Not
3ce0: 65 3a 20 54 68 65 20 28 70 2d 3e 69 54 61 62 6c  e: The (p->iTabl
3cf0: 65 3d 3d 69 42 61 73 65 29 20 70 61 72 74 20 6f  e==iBase) part o
3d00: 66 20 74 68 69 73 20 74 65 73 74 20 6d 61 79 20  f this test may 
3d10: 62 65 20 66 61 6c 73 65 20 69 66 20 74 68 65 0a  be false if the.
3d20: 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 53 45 4c    ** current SEL
3d30: 45 43 54 20 69 73 20 61 20 63 6f 72 72 65 6c 61  ECT is a correla
3d40: 74 65 64 20 73 75 62 2d 71 75 65 72 79 2e 0a 20  ted sub-query.. 
3d50: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
3d60: 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70  <pDistinct->nExp
3d70: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70  r; i++){.    Exp
3d80: 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78  r *p = sqlite3Ex
3d90: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 44  prSkipCollate(pD
3da0: 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45  istinct->a[i].pE
3db0: 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  xpr);.    if( p-
3dc0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
3dd0: 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61  & p->iTable==iBa
3de0: 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e  se && p->iColumn
3df0: 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  <0 ) return 1;. 
3e00: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68   }..  /* Loop th
3e10: 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64 69 63 65  rough all indice
3e20: 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2c 20  s on the table, 
3e30: 63 68 65 63 6b 69 6e 67 20 65 61 63 68 20 74 6f  checking each to
3e40: 20 73 65 65 20 69 66 20 69 74 20 6d 61 6b 65 73   see if it makes
3e50: 0a 20 20 2a 2a 20 74 68 65 20 44 49 53 54 49 4e  .  ** the DISTIN
3e60: 43 54 20 71 75 61 6c 69 66 69 65 72 20 72 65 64  CT qualifier red
3e70: 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f 65 73 20  undant. It does 
3e80: 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  so if:.  **.  **
3e90: 20 20 20 31 2e 20 54 68 65 20 69 6e 64 65 78 20     1. The index 
3ea0: 69 73 20 69 74 73 65 6c 66 20 55 4e 49 51 55 45  is itself UNIQUE
3eb0: 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20  , and.  **.  ** 
3ec0: 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20    2. All of the 
3ed0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69  columns in the i
3ee0: 6e 64 65 78 20 61 72 65 20 65 69 74 68 65 72 20  ndex are either 
3ef0: 70 61 72 74 20 6f 66 20 74 68 65 20 70 44 69 73  part of the pDis
3f00: 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20 20 20 20  tinct.  **      
3f10: 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65 20 74 68  list, or else th
3f20: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  e WHERE clause c
3f30: 6f 6e 74 61 69 6e 73 20 61 20 74 65 72 6d 20 6f  ontains a term o
3f40: 66 20 74 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d  f the form "col=
3f50: 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20 20 77 68  X",.  **      wh
3f60: 65 72 65 20 58 20 69 73 20 61 20 63 6f 6e 73 74  ere X is a const
3f70: 61 6e 74 20 76 61 6c 75 65 2e 20 54 68 65 20 63  ant value. The c
3f80: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
3f90: 65 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20  es of the.  **  
3fa0: 20 20 20 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61      comparison a
3fb0: 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73 74 20 65  nd select-list e
3fc0: 78 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20  xpressions must 
3fd0: 6d 61 74 63 68 20 74 68 6f 73 65 20 6f 66 20 74  match those of t
3fe0: 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20  he index..  **. 
3ff0: 20 2a 2a 20 20 20 33 2e 20 41 6c 6c 20 6f 66 20   **   3. All of 
4000: 74 68 6f 73 65 20 69 6e 64 65 78 20 63 6f 6c 75  those index colu
4010: 6d 6e 73 20 66 6f 72 20 77 68 69 63 68 20 74 68  mns for which th
4020: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 64  e WHERE clause d
4030: 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 20 20 20  oes not.  **    
4040: 20 20 63 6f 6e 74 61 69 6e 20 61 20 22 63 6f 6c    contain a "col
4050: 3d 58 22 20 74 65 72 6d 20 61 72 65 20 73 75 62  =X" term are sub
4060: 6a 65 63 74 20 74 6f 20 61 20 4e 4f 54 20 4e 55  ject to a NOT NU
4070: 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  LL constraint.. 
4080: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70   */.  for(pIdx=p
4090: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
40a0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
40b0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 21 49  ext){.    if( !I
40c0: 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49 64  sUniqueIndex(pId
40d0: 78 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  x) ) continue;. 
40e0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
40f0: 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69 2b 2b  dx->nKeyCol; i++
4100: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ){.      if( 0==
4110: 73 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64  sqlite3WhereFind
4120: 54 65 72 6d 28 70 57 43 2c 20 69 42 61 73 65 2c  Term(pWC, iBase,
4130: 20 69 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c   i, ~(Bitmask)0,
4140: 20 57 4f 5f 45 51 2c 20 70 49 64 78 29 20 29 7b   WO_EQ, pIdx) ){
4150: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 69 6e  .        if( fin
4160: 64 49 6e 64 65 78 43 6f 6c 28 70 50 61 72 73 65  dIndexCol(pParse
4170: 2c 20 70 44 69 73 74 69 6e 63 74 2c 20 69 42 61  , pDistinct, iBa
4180: 73 65 2c 20 70 49 64 78 2c 20 69 29 3c 30 20 29  se, pIdx, i)<0 )
4190: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
41a0: 69 66 28 20 69 6e 64 65 78 43 6f 6c 75 6d 6e 4e  if( indexColumnN
41b0: 6f 74 4e 75 6c 6c 28 70 49 64 78 2c 20 69 29 3d  otNull(pIdx, i)=
41c0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
41d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
41e0: 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  ( i==pIdx->nKeyC
41f0: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  ol ){.      /* T
4200: 68 69 73 20 69 6e 64 65 78 20 69 6d 70 6c 69 65  his index implie
4210: 73 20 74 68 61 74 20 74 68 65 20 44 49 53 54 49  s that the DISTI
4220: 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20 69 73  NCT qualifier is
4230: 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20   redundant. */. 
4240: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
4250: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
4260: 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
4270: 45 73 74 69 6d 61 74 65 20 74 68 65 20 6c 6f 67  Estimate the log
4280: 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e  arithm of the in
4290: 70 75 74 20 76 61 6c 75 65 20 74 6f 20 62 61 73  put value to bas
42a0: 65 20 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c  e 2..*/.static L
42b0: 6f 67 45 73 74 20 65 73 74 4c 6f 67 28 4c 6f 67  ogEst estLog(Log
42c0: 45 73 74 20 4e 29 7b 0a 20 20 72 65 74 75 72 6e  Est N){.  return
42d0: 20 4e 3c 3d 31 30 20 3f 20 30 20 3a 20 73 71 6c   N<=10 ? 0 : sql
42e0: 69 74 65 33 4c 6f 67 45 73 74 28 4e 29 20 2d 20  ite3LogEst(N) - 
42f0: 33 33 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  33;.}../*.** Con
4300: 76 65 72 74 20 4f 50 5f 43 6f 6c 75 6d 6e 20 6f  vert OP_Column o
4310: 70 63 6f 64 65 73 20 74 6f 20 4f 50 5f 43 6f 70  pcodes to OP_Cop
4320: 79 20 69 6e 20 70 72 65 76 69 6f 75 73 6c 79 20  y in previously 
4330: 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65 2e 0a  generated code..
4340: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
4350: 6e 65 20 72 75 6e 73 20 6f 76 65 72 20 67 65 6e  ne runs over gen
4360: 65 72 61 74 65 64 20 56 44 42 45 20 63 6f 64 65  erated VDBE code
4370: 20 61 6e 64 20 74 72 61 6e 73 6c 61 74 65 73 20   and translates 
4380: 4f 50 5f 43 6f 6c 75 6d 6e 0a 2a 2a 20 6f 70 63  OP_Column.** opc
4390: 6f 64 65 73 20 69 6e 74 6f 20 4f 50 5f 43 6f 70  odes into OP_Cop
43a0: 79 20 77 68 65 6e 20 74 68 65 20 74 61 62 6c 65  y when the table
43b0: 20 69 73 20 62 65 69 6e 67 20 61 63 63 65 73 73   is being access
43c0: 65 64 20 76 69 61 20 63 6f 2d 72 6f 75 74 69 6e  ed via co-routin
43d0: 65 20 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f 66  e .** instead of
43e0: 20 76 69 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 75   via table looku
43f0: 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
4400: 62 49 6e 63 72 52 6f 77 69 64 20 70 61 72 61 6d  bIncrRowid param
4410: 65 74 65 72 20 69 73 20 30 2c 20 74 68 65 6e 20  eter is 0, then 
4420: 61 6e 79 20 4f 50 5f 52 6f 77 69 64 20 69 6e 73  any OP_Rowid ins
4430: 74 72 75 63 74 69 6f 6e 73 20 6f 6e 0a 2a 2a 20  tructions on.** 
4440: 63 75 72 73 6f 72 20 69 54 61 62 43 75 72 20 61  cursor iTabCur a
4450: 72 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69  re transformed i
4460: 6e 74 6f 20 4f 50 5f 4e 75 6c 6c 2e 20 4f 72 2c  nto OP_Null. Or,
4470: 20 69 66 20 62 49 6e 63 72 52 6f 77 69 64 20 69   if bIncrRowid i
4480: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 0a 2a 2a 20 74  s non-zero,.** t
4490: 68 65 6e 20 65 61 63 68 20 4f 50 5f 52 6f 77 69  hen each OP_Rowi
44a0: 64 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64  d is transformed
44b0: 20 69 6e 74 6f 20 61 6e 20 69 6e 73 74 72 75 63   into an instruc
44c0: 74 69 6f 6e 20 74 6f 20 69 6e 63 72 65 6d 65 6e  tion to incremen
44d0: 74 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73  t the.** value s
44e0: 74 6f 72 65 64 20 69 6e 20 69 74 73 20 6f 75 74  tored in its out
44f0: 70 75 74 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f  put register..*/
4500: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 61  .static void tra
4510: 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f  nslateColumnToCo
4520: 70 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  py(.  Parse *pPa
4530: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
4540: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
4550: 20 20 69 6e 74 20 69 53 74 61 72 74 2c 20 20 20    int iStart,   
4560: 20 20 20 20 20 20 2f 2a 20 54 72 61 6e 73 6c 61        /* Transla
4570: 74 65 20 66 72 6f 6d 20 74 68 69 73 20 6f 70 63  te from this opc
4580: 6f 64 65 20 74 6f 20 74 68 65 20 65 6e 64 20 2a  ode to the end *
4590: 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c  /.  int iTabCur,
45a0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 50 5f 43 6f          /* OP_Co
45b0: 6c 75 6d 6e 2f 4f 50 5f 52 6f 77 69 64 20 72 65  lumn/OP_Rowid re
45c0: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73  ferences to this
45d0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
45e0: 69 52 65 67 69 73 74 65 72 2c 20 20 20 20 20 20  iRegister,      
45f0: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 63 6f 6c  /* The first col
4600: 75 6d 6e 20 69 73 20 69 6e 20 74 68 69 73 20 72  umn is in this r
4610: 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74  egister */.  int
4620: 20 62 49 6e 63 72 52 6f 77 69 64 20 20 20 20 20   bIncrRowid     
4630: 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c   /* If non-zero,
4640: 20 74 72 61 6e 73 66 6f 72 6d 20 4f 50 5f 72 6f   transform OP_ro
4650: 77 69 64 20 74 6f 20 4f 50 5f 41 64 64 49 6d 6d  wid to OP_AddImm
4660: 28 31 29 20 2a 2f 0a 29 7b 0a 20 20 56 64 62 65  (1) */.){.  Vdbe
4670: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
4680: 64 62 65 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  dbe;.  VdbeOp *p
4690: 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  Op = sqlite3Vdbe
46a0: 47 65 74 4f 70 28 76 2c 20 69 53 74 61 72 74 29  GetOp(v, iStart)
46b0: 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 73  ;.  int iEnd = s
46c0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
46d0: 74 41 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20  tAddr(v);.  if( 
46e0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
46f0: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
4700: 6e 3b 0a 20 20 66 6f 72 28 3b 20 69 53 74 61 72  n;.  for(; iStar
4710: 74 3c 69 45 6e 64 3b 20 69 53 74 61 72 74 2b 2b  t<iEnd; iStart++
4720: 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 69 66  , pOp++){.    if
4730: 28 20 70 4f 70 2d 3e 70 31 21 3d 69 54 61 62 43  ( pOp->p1!=iTabC
4740: 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ur ) continue;. 
4750: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
4760: 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b  de==OP_Column ){
4770: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f  .      pOp->opco
4780: 64 65 20 3d 20 4f 50 5f 43 6f 70 79 3b 0a 20 20  de = OP_Copy;.  
4790: 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4f      pOp->p1 = pO
47a0: 70 2d 3e 70 32 20 2b 20 69 52 65 67 69 73 74 65  p->p2 + iRegiste
47b0: 72 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32  r;.      pOp->p2
47c0: 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20   = pOp->p3;.    
47d0: 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20    pOp->p3 = 0;. 
47e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70     }else if( pOp
47f0: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77  ->opcode==OP_Row
4800: 69 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  id ){.      if( 
4810: 62 49 6e 63 72 52 6f 77 69 64 20 29 7b 0a 20 20  bIncrRowid ){.  
4820: 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65        /* Increme
4830: 6e 74 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  nt the value sto
4840: 72 65 64 20 69 6e 20 74 68 65 20 50 32 20 6f 70  red in the P2 op
4850: 65 72 61 6e 64 20 6f 66 20 74 68 65 20 4f 50 5f  erand of the OP_
4860: 52 6f 77 69 64 2e 20 2a 2f 0a 20 20 20 20 20 20  Rowid. */.      
4870: 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20    pOp->opcode = 
4880: 4f 50 5f 41 64 64 49 6d 6d 3b 0a 20 20 20 20 20  OP_AddImm;.     
4890: 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4f 70     pOp->p1 = pOp
48a0: 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 70 4f  ->p2;.        pO
48b0: 70 2d 3e 70 32 20 3d 20 31 3b 0a 20 20 20 20 20  p->p2 = 1;.     
48c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
48d0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
48e0: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  _Null;.        p
48f0: 4f 70 2d 3e 70 31 20 3d 20 30 3b 0a 20 20 20 20  Op->p1 = 0;.    
4900: 20 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b      pOp->p3 = 0;
4910: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4920: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20   }.}../*.** Two 
4930: 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69  routines for pri
4940: 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  nting the conten
4950: 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f  t of an sqlite3_
4960: 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74  index_info.** st
4970: 72 75 63 74 75 72 65 2e 20 20 55 73 65 64 20 66  ructure.  Used f
4980: 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
4990: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20  ebugging only.  
49a0: 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51  If neither.** SQ
49b0: 4c 49 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c  LITE_TEST or SQL
49c0: 49 54 45 5f 44 45 42 55 47 20 61 72 65 20 64 65  ITE_DEBUG are de
49d0: 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73  fined, then thes
49e0: 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72  e routines.** ar
49f0: 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66  e no-ops..*/.#if
4a00: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
4a10: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
4a20: 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 57  LE) && defined(W
4a30: 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
4a40: 44 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54  D).static void T
4a50: 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28  RACE_IDX_INPUTS(
4a60: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
4a70: 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  fo *p){.  int i;
4a80: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57  .  if( !sqlite3W
4a90: 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75  hereTrace ) retu
4aa0: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
4ab0: 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
4ac0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
4ad0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
4ae0: 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a   constraint[%d]:
4af0: 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25   col=%d termid=%
4b00: 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d  d op=%d usabled=
4b10: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
4b20: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
4b30: 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d  traint[i].iColum
4b40: 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  n,.       p->aCo
4b50: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72  nstraint[i].iTer
4b60: 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20  mOffset,.       
4b70: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
4b80: 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e  ].op,.       p->
4b90: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75  aConstraint[i].u
4ba0: 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f  sable);.  }.  fo
4bb0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64  r(i=0; i<p->nOrd
4bc0: 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
4bd0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
4be0: 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64  tf("  orderby[%d
4bf0: 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25  ]: col=%d desc=%
4c00: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
4c10: 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72         p->aOrder
4c20: 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20  By[i].iColumn,. 
4c30: 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42        p->aOrderB
4c40: 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a  y[i].desc);.  }.
4c50: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52  }.static void TR
4c60: 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
4c70: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
4c80: 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  fo *p){.  int i;
4c90: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57  .  if( !sqlite3W
4ca0: 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75  hereTrace ) retu
4cb0: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
4cc0: 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
4cd0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
4ce0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
4cf0: 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76   usage[%d]: argv
4d00: 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e  Idx=%d omit=%d\n
4d10: 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
4d20: 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
4d30: 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49  ntUsage[i].argvI
4d40: 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e  ndex,.       p->
4d50: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
4d60: 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20  [i].omit);.  }. 
4d70: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
4d80: 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64  ntf("  idxNum=%d
4d90: 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b  \n", p->idxNum);
4da0: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
4db0: 72 69 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d  rintf("  idxStr=
4dc0: 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72  %s\n", p->idxStr
4dd0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
4de0: 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72  gPrintf("  order
4df0: 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22  ByConsumed=%d\n"
4e00: 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  , p->orderByCons
4e10: 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  umed);.  sqlite3
4e20: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65  DebugPrintf("  e
4e30: 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c  stimatedCost=%g\
4e40: 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64  n", p->estimated
4e50: 43 6f 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  Cost);.  sqlite3
4e60: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65  DebugPrintf("  e
4e70: 73 74 69 6d 61 74 65 64 52 6f 77 73 3d 25 6c 6c  stimatedRows=%ll
4e80: 64 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74  d\n", p->estimat
4e90: 65 64 52 6f 77 73 29 3b 0a 7d 0a 23 65 6c 73 65  edRows);.}.#else
4ea0: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49  .#define TRACE_I
4eb0: 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65  DX_INPUTS(A).#de
4ec0: 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f  fine TRACE_IDX_O
4ed0: 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66  UTPUTS(A).#endif
4ee0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
4ef0: 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
4f00: 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20 52 65 74 75  INDEX./*.** Retu
4f10: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 57  rn TRUE if the W
4f20: 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
4f30: 20 70 54 65 72 6d 20 69 73 20 6f 66 20 61 20 66   pTerm is of a f
4f40: 6f 72 6d 20 77 68 65 72 65 20 69 74 0a 2a 2a 20  orm where it.** 
4f50: 63 6f 75 6c 64 20 62 65 20 75 73 65 64 20 77 69  could be used wi
4f60: 74 68 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 61  th an index to a
4f70: 63 63 65 73 73 20 70 53 72 63 2c 20 61 73 73 75  ccess pSrc, assu
4f80: 6d 69 6e 67 20 61 6e 20 61 70 70 72 6f 70 72 69  ming an appropri
4f90: 61 74 65 0a 2a 2a 20 69 6e 64 65 78 20 65 78 69  ate.** index exi
4fa0: 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sted..*/.static 
4fb0: 69 6e 74 20 74 65 72 6d 43 61 6e 44 72 69 76 65  int termCanDrive
4fc0: 49 6e 64 65 78 28 0a 20 20 57 68 65 72 65 54 65  Index(.  WhereTe
4fd0: 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20 20 20  rm *pTerm,      
4fe0: 20 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45          /* WHERE
4ff0: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
5000: 63 68 65 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63  check */.  struc
5010: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
5020: 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 61 62  pSrc,     /* Tab
5030: 6c 65 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  le we are trying
5040: 20 74 6f 20 61 63 63 65 73 73 20 2a 2f 0a 20 20   to access */.  
5050: 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
5060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5070: 2a 20 54 61 62 6c 65 73 20 69 6e 20 6f 75 74 65  * Tables in oute
5080: 72 20 6c 6f 6f 70 73 20 6f 66 20 74 68 65 20 6a  r loops of the j
5090: 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  oin */.){.  char
50a0: 20 61 66 66 3b 0a 20 20 69 66 28 20 70 54 65 72   aff;.  if( pTer
50b0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 70  m->leftCursor!=p
50c0: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 72  Src->iCursor ) r
50d0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28  eturn 0;.  if( (
50e0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
50f0: 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29   & (WO_EQ|WO_IS)
5100: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
5110: 0a 20 20 69 66 28 20 28 70 53 72 63 2d 3e 66 67  .  if( (pSrc->fg
5120: 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  .jointype & JT_L
5130: 45 46 54 29 20 0a 20 20 20 26 26 20 21 45 78 70  EFT) .   && !Exp
5140: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 54 65  rHasProperty(pTe
5150: 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72  rm->pExpr, EP_Fr
5160: 6f 6d 4a 6f 69 6e 29 0a 20 20 20 26 26 20 28 70  omJoin).   && (p
5170: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
5180: 26 20 57 4f 5f 49 53 29 0a 20 20 29 7b 0a 20 20  & WO_IS).  ){.  
5190: 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 75 73 65 20    /* Cannot use 
51a0: 61 6e 20 49 53 20 74 65 72 6d 20 66 72 6f 6d 20  an IS term from 
51b0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
51c0: 20 61 73 20 61 6e 20 69 6e 64 65 78 20 64 72 69   as an index dri
51d0: 76 65 72 20 66 6f 72 0a 20 20 20 20 2a 2a 20 74  ver for.    ** t
51e0: 68 65 20 52 48 53 20 6f 66 20 61 20 4c 45 46 54  he RHS of a LEFT
51f0: 20 4a 4f 49 4e 2e 20 53 75 63 68 20 61 20 74 65   JOIN. Such a te
5200: 72 6d 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  rm can only be u
5210: 73 65 64 20 69 66 20 69 74 20 69 73 20 66 72 6f  sed if it is fro
5220: 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 4f 4e 20  m.    ** the ON 
5230: 63 6c 61 75 73 65 2e 20 20 2a 2f 0a 20 20 20 20  clause.  */.    
5240: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
5250: 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
5260: 65 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61  eqRight & notRea
5270: 64 79 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  dy)!=0 ) return 
5280: 30 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  0;.  if( pTerm->
5290: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3c 30 20 29  u.leftColumn<0 )
52a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 66 66   return 0;.  aff
52b0: 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 61   = pSrc->pTab->a
52c0: 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  Col[pTerm->u.lef
52d0: 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  tColumn].affinit
52e0: 79 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  y;.  if( !sqlite
52f0: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b  3IndexAffinityOk
5300: 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61  (pTerm->pExpr, a
5310: 66 66 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ff) ) return 0;.
5320: 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
5330: 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  m->pExpr->op==TK
5340: 5f 49 53 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _IS );.  return 
5350: 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69  1;.}.#endif...#i
5360: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5370: 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
5380: 58 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  X./*.** Generate
5390: 20 63 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72 75   code to constru
53a0: 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a  ct the Index obj
53b0: 65 63 74 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d  ect for an autom
53c0: 61 74 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e  atic index.** an
53d0: 64 20 74 6f 20 73 65 74 20 75 70 20 74 68 65 20  d to set up the 
53e0: 57 68 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63  WhereLevel objec
53f0: 74 20 70 4c 65 76 65 6c 20 73 6f 20 74 68 61 74  t pLevel so that
5400: 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
5410: 74 6f 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65  tor.** makes use
5420: 20 6f 66 20 74 68 65 20 61 75 74 6f 6d 61 74 69   of the automati
5430: 63 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  c index..*/.stat
5440: 69 63 20 76 6f 69 64 20 63 6f 6e 73 74 72 75 63  ic void construc
5450: 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
5460: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
5470: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
5480: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
5490: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
54a0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
54b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
54c0: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
54d0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
54e0: 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54  tem *pSrc,  /* T
54f0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
5500: 65 72 6d 20 74 6f 20 67 65 74 20 74 68 65 20 6e  erm to get the n
5510: 65 78 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42  ext index */.  B
5520: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
5530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
5540: 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68  sk of cursors th
5550: 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  at are not avail
5560: 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c  able */.  WhereL
5570: 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20  evel *pLevel    
5580: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
5590: 65 77 20 69 6e 64 65 78 20 68 65 72 65 20 2a 2f  ew index here */
55a0: 0a 29 7b 0a 20 20 69 6e 74 20 6e 4b 65 79 43 6f  .){.  int nKeyCo
55b0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
55c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
55d0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f  olumns in the co
55e0: 6e 73 74 72 75 63 74 65 64 20 69 6e 64 65 78 20  nstructed index 
55f0: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
5600: 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
5610: 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
5620: 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
5630: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
5640: 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20  Term *pWCEnd;   
5650: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
5660: 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 49   pWC->a[] */.  I
5670: 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
5680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
5690: 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e 67 20  ject describing 
56a0: 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69 6e  the transient in
56b0: 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  dex */.  Vdbe *v
56c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
56d0: 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65 64       /* Prepared
56e0: 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65 72   statement under
56f0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f   construction */
5700: 0a 20 20 69 6e 74 20 61 64 64 72 49 6e 69 74 3b  .  int addrInit;
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5720: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
5730: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
5740: 62 79 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20  bypass jump */. 
5750: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20   Table *pTable; 
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5770: 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  The table being 
5780: 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
5790: 20 61 64 64 72 54 6f 70 3b 20 20 20 20 20 20 20   addrTop;       
57a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20           /* Top 
57b0: 6f 66 20 74 68 65 20 69 6e 64 65 78 20 66 69 6c  of the index fil
57c0: 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20  l loop */.  int 
57d0: 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20  regRecord;      
57e0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
57f0: 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69  ter holding an i
5800: 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20  ndex record */. 
5810: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5830: 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65 72 20 2a  Column counter *
5840: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
5850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5860: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
5870: 2a 2f 0a 20 20 69 6e 74 20 6d 78 42 69 74 43 6f  */.  int mxBitCo
5880: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
5890: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63 6f 6c 75   /* Maximum colu
58a0: 6d 6e 20 69 6e 20 70 53 72 63 2d 3e 63 6f 6c 55  mn in pSrc->colU
58b0: 73 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71  sed */.  CollSeq
58c0: 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *pColl;        
58d0: 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
58e0: 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 6f 6e  g sequence to on
58f0: 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 57   a column */.  W
5900: 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b  hereLoop *pLoop;
5910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
5920: 65 20 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a 2f  e Loop object */
5930: 0a 20 20 63 68 61 72 20 2a 7a 4e 6f 74 55 73 65  .  char *zNotUse
5940: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
5950: 2a 20 45 78 74 72 61 20 73 70 61 63 65 20 6f 6e  * Extra space on
5960: 20 74 68 65 20 65 6e 64 20 6f 66 20 70 49 64 78   the end of pIdx
5970: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 64   */.  Bitmask id
5980: 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20 20 20  xCols;          
5990: 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66 20 63    /* Bitmap of c
59a0: 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f 72 20  olumns used for 
59b0: 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20 42 69  indexing */.  Bi
59c0: 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c 73 3b  tmask extraCols;
59d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
59e0: 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f 6e 61  map of additiona
59f0: 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 75  l columns */.  u
5a00: 38 20 73 65 6e 74 57 61 72 6e 69 6e 67 20 3d 20  8 sentWarning = 
5a10: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  0;         /* Tr
5a20: 75 65 20 69 66 20 61 20 77 61 72 6e 6e 69 6e 67  ue if a warnning
5a30: 20 68 61 73 20 62 65 65 6e 20 69 73 73 75 65 64   has been issued
5a40: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 50 61 72   */.  Expr *pPar
5a50: 74 69 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  tial = 0;       
5a60: 20 20 2f 2a 20 50 61 72 74 69 61 6c 20 49 6e 64    /* Partial Ind
5a70: 65 78 20 45 78 70 72 65 73 73 69 6f 6e 20 2a 2f  ex Expression */
5a80: 0a 20 20 69 6e 74 20 69 43 6f 6e 74 69 6e 75 65  .  int iContinue
5a90: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
5aa0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 73  * Jump here to s
5ab0: 6b 69 70 20 65 78 63 6c 75 64 65 64 20 72 6f 77  kip excluded row
5ac0: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
5ad0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
5ae0: 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63  Item;  /* FROM c
5af0: 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67  lause term being
5b00: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
5b10: 74 20 61 64 64 72 43 6f 75 6e 74 65 72 20 3d 20  t addrCounter = 
5b20: 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64  0;        /* Add
5b30: 72 65 73 73 20 77 68 65 72 65 20 69 6e 74 65 67  ress where integ
5b40: 65 72 20 63 6f 75 6e 74 65 72 20 69 73 20 69 6e  er counter is in
5b50: 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 69  itialized */.  i
5b60: 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20  nt regBase;     
5b70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
5b80: 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
5b90: 20 77 68 65 72 65 20 72 65 63 6f 72 64 20 69 73   where record is
5ba0: 20 61 73 73 65 6d 62 6c 65 64 20 2a 2f 0a 0a 20   assembled */.. 
5bb0: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
5bc0: 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 74  e to skip over t
5bd0: 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20  he creation and 
5be0: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f  initialization o
5bf0: 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73  f the.  ** trans
5c00: 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32 6e  ient index on 2n
5c10: 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
5c20: 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20 74   iterations of t
5c30: 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76 20  he loop. */.  v 
5c40: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
5c50: 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20  .  assert( v!=0 
5c60: 29 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d 20  );.  addrInit = 
5c70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
5c80: 30 28 76 2c 20 4f 50 5f 4f 6e 63 65 29 3b 20 56  0(v, OP_Once); V
5c90: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
5ca0: 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20  .  /* Count the 
5cb0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
5cc0: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 61  s that will be a
5cd0: 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65  dded to the inde
5ce0: 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73 65 64 20  x.  ** and used 
5cf0: 74 6f 20 6d 61 74 63 68 20 57 48 45 52 45 20 63  to match WHERE c
5d00: 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74  lause constraint
5d10: 73 20 2a 2f 0a 20 20 6e 4b 65 79 43 6f 6c 20 3d  s */.  nKeyCol =
5d20: 20 30 3b 0a 20 20 70 54 61 62 6c 65 20 3d 20 70   0;.  pTable = p
5d30: 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 70 57 43  Src->pTab;.  pWC
5d40: 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57  End = &pWC->a[pW
5d50: 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70 4c 6f  C->nTerm];.  pLo
5d60: 6f 70 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 57 4c  op = pLevel->pWL
5d70: 6f 6f 70 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d  oop;.  idxCols =
5d80: 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   0;.  for(pTerm=
5d90: 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57  pWC->a; pTerm<pW
5da0: 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a  CEnd; pTerm++){.
5db0: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
5dc0: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
5dd0: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
5de0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
5df0: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
5e00: 20 20 20 20 2f 2a 20 70 72 65 72 65 71 20 61 6c      /* prereq al
5e10: 77 61 79 73 20 6e 6f 6e 2d 7a 65 72 6f 20 2a 2f  ways non-zero */
5e20: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78  .         || pEx
5e30: 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pr->iRightJoinTa
5e40: 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73  ble!=pSrc->iCurs
5e50: 6f 72 20 20 20 2f 2a 20 20 20 66 6f 72 20 74 68  or   /*   for th
5e60: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 20 20 2a  e right-hand   *
5e70: 2f 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 4c  /.         || pL
5e80: 6f 6f 70 2d 3e 70 72 65 72 65 71 21 3d 30 20 29  oop->prereq!=0 )
5e90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5ea0: 20 20 20 20 20 20 2f 2a 20 20 20 74 61 62 6c 65        /*   table
5eb0: 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
5ec0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 6f 6f 70  */.    if( pLoop
5ed0: 2d 3e 70 72 65 72 65 71 3d 3d 30 0a 20 20 20 20  ->prereq==0.    
5ee0: 20 26 26 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c   && (pTerm->wtFl
5ef0: 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55  ags & TERM_VIRTU
5f00: 41 4c 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 21  AL)==0.     && !
5f10: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5f20: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
5f30: 69 6e 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69  in).     && sqli
5f40: 74 65 33 45 78 70 72 49 73 54 61 62 6c 65 43 6f  te3ExprIsTableCo
5f50: 6e 73 74 61 6e 74 28 70 45 78 70 72 2c 20 70 53  nstant(pExpr, pS
5f60: 72 63 2d 3e 69 43 75 72 73 6f 72 29 20 29 7b 0a  rc->iCursor) ){.
5f70: 20 20 20 20 20 20 70 50 61 72 74 69 61 6c 20 3d        pPartial =
5f80: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
5f90: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50 61 72  pParse->db, pPar
5fa0: 74 69 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  tial,.          
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
5fd0: 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
5fe0: 20 70 45 78 70 72 2c 20 30 29 29 3b 0a 20 20 20   pExpr, 0));.   
5ff0: 20 7d 0a 20 20 20 20 69 66 28 20 74 65 72 6d 43   }.    if( termC
6000: 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70 54 65  anDriveIndex(pTe
6010: 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61  rm, pSrc, notRea
6020: 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  dy) ){.      int
6030: 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d 3e 75   iCol = pTerm->u
6040: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
6050: 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61 73 6b     Bitmask cMask
6060: 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 4d   = iCol>=BMS ? M
6070: 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 3a 20  ASKBIT(BMS-1) : 
6080: 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b 0a 20  MASKBIT(iCol);. 
6090: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
60a0: 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
60b0: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
60c0: 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
60d0: 20 69 66 28 20 21 73 65 6e 74 57 61 72 6e 69 6e   if( !sentWarnin
60e0: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
60f0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
6100: 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45  WARNING_AUTOINDE
6110: 58 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  X,.            "
6120: 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
6130: 6f 6e 20 25 73 28 25 73 29 22 2c 20 70 54 61 62  on %s(%s)", pTab
6140: 6c 65 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20  le->zName,.     
6150: 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61         pTable->a
6160: 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29  Col[iCol].zName)
6170: 3b 0a 20 20 20 20 20 20 20 20 73 65 6e 74 57 61  ;.        sentWa
6180: 72 6e 69 6e 67 20 3d 20 31 3b 0a 20 20 20 20 20  rning = 1;.     
6190: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 69 64   }.      if( (id
61a0: 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d  xCols & cMask)==
61b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
61c0: 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
61d0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 6f  (pParse->db, pLo
61e0: 6f 70 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 20 29  op, nKeyCol+1) )
61f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
6200: 20 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65 78 5f   end_auto_index_
6210: 63 72 65 61 74 65 3b 0a 20 20 20 20 20 20 20 20  create;.        
6220: 7d 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  }.        pLoop-
6230: 3e 61 4c 54 65 72 6d 5b 6e 4b 65 79 43 6f 6c 2b  >aLTerm[nKeyCol+
6240: 2b 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20  +] = pTerm;.    
6250: 20 20 20 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63      idxCols |= c
6260: 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Mask;.      }.  
6270: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
6280: 28 20 6e 4b 65 79 43 6f 6c 3e 30 20 29 3b 0a 20  ( nKeyCol>0 );. 
6290: 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e   pLoop->u.btree.
62a0: 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e 6e 4c 54  nEq = pLoop->nLT
62b0: 65 72 6d 20 3d 20 6e 4b 65 79 43 6f 6c 3b 0a 20  erm = nKeyCol;. 
62c0: 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
62d0: 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  = WHERE_COLUMN_E
62e0: 51 20 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  Q | WHERE_IDX_ON
62f0: 4c 59 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58  LY | WHERE_INDEX
6300: 45 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ED.             
6310: 20 20 20 20 20 20 20 20 7c 20 57 48 45 52 45 5f          | WHERE_
6320: 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 0a 20 20 2f  AUTO_INDEX;..  /
6330: 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
6340: 65 72 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c  er of additional
6350: 20 63 6f 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20   columns needed 
6360: 74 6f 20 63 72 65 61 74 65 20 61 0a 20 20 2a 2a  to create a.  **
6370: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2e   covering index.
6380: 20 20 41 20 22 63 6f 76 65 72 69 6e 67 20 69 6e    A "covering in
6390: 64 65 78 22 20 69 73 20 61 6e 20 69 6e 64 65 78  dex" is an index
63a0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
63b0: 6c 6c 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20  ll.  ** columns 
63c0: 74 68 61 74 20 61 72 65 20 6e 65 65 64 65 64 20  that are needed 
63d0: 62 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 57  by the query.  W
63e0: 69 74 68 20 61 20 63 6f 76 65 72 69 6e 67 20 69  ith a covering i
63f0: 6e 64 65 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f  ndex, the.  ** o
6400: 72 69 67 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65  riginal table ne
6410: 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
6420: 61 63 63 65 73 73 65 64 2e 20 20 41 75 74 6f 6d  accessed.  Autom
6430: 61 74 69 63 20 69 6e 64 69 63 65 73 20 6d 75 73  atic indices mus
6440: 74 0a 20 20 2a 2a 20 62 65 20 61 20 63 6f 76 65  t.  ** be a cove
6450: 72 69 6e 67 20 69 6e 64 65 78 20 62 65 63 61 75  ring index becau
6460: 73 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c  se the index wil
6470: 6c 20 6e 6f 74 20 62 65 20 75 70 64 61 74 65 64  l not be updated
6480: 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69   if the.  ** ori
6490: 67 69 6e 61 6c 20 74 61 62 6c 65 20 63 68 61 6e  ginal table chan
64a0: 67 65 73 20 61 6e 64 20 74 68 65 20 69 6e 64 65  ges and the inde
64b0: 78 20 61 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e  x and table cann
64c0: 6f 74 20 62 6f 74 68 20 62 65 20 75 73 65 64 0a  ot both be used.
64d0: 20 20 2a 2a 20 69 66 20 74 68 65 79 20 67 6f 20    ** if they go 
64e0: 6f 75 74 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a  out of sync..  *
64f0: 2f 0a 20 20 65 78 74 72 61 43 6f 6c 73 20 3d 20  /.  extraCols = 
6500: 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
6510: 28 7e 69 64 78 43 6f 6c 73 20 7c 20 4d 41 53 4b  (~idxCols | MASK
6520: 42 49 54 28 42 4d 53 2d 31 29 29 3b 0a 20 20 6d  BIT(BMS-1));.  m
6530: 78 42 69 74 43 6f 6c 20 3d 20 4d 49 4e 28 42 4d  xBitCol = MIN(BM
6540: 53 2d 31 2c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  S-1,pTable->nCol
6550: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
6560: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53  Table->nCol==BMS
6570: 2d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  -1 );.  testcase
6580: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d  ( pTable->nCol==
6590: 42 4d 53 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69  BMS-2 );.  for(i
65a0: 3d 30 3b 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20  =0; i<mxBitCol; 
65b0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 65 78  i++){.    if( ex
65c0: 74 72 61 43 6f 6c 73 20 26 20 4d 41 53 4b 42 49  traCols & MASKBI
65d0: 54 28 69 29 20 29 20 6e 4b 65 79 43 6f 6c 2b 2b  T(i) ) nKeyCol++
65e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63  ;.  }.  if( pSrc
65f0: 2d 3e 63 6f 6c 55 73 65 64 20 26 20 4d 41 53 4b  ->colUsed & MASK
6600: 42 49 54 28 42 4d 53 2d 31 29 20 29 7b 0a 20 20  BIT(BMS-1) ){.  
6610: 20 20 6e 4b 65 79 43 6f 6c 20 2b 3d 20 70 54 61    nKeyCol += pTa
6620: 62 6c 65 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20  ble->nCol - BMS 
6630: 2b 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  + 1;.  }..  /* C
6640: 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e 64  onstruct the Ind
6650: 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64 65 73  ex object to des
6660: 63 72 69 62 65 20 74 68 69 73 20 69 6e 64 65 78  cribe this index
6670: 20 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73 71 6c   */.  pIdx = sql
6680: 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65  ite3AllocateInde
6690: 78 4f 62 6a 65 63 74 28 70 50 61 72 73 65 2d 3e  xObject(pParse->
66a0: 64 62 2c 20 6e 4b 65 79 43 6f 6c 2b 31 2c 20 30  db, nKeyCol+1, 0
66b0: 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20  , &zNotUsed);.  
66c0: 69 66 28 20 70 49 64 78 3d 3d 30 20 29 20 67 6f  if( pIdx==0 ) go
66d0: 74 6f 20 65 6e 64 5f 61 75 74 6f 5f 69 6e 64 65  to end_auto_inde
66e0: 78 5f 63 72 65 61 74 65 3b 0a 20 20 70 4c 6f 6f  x_create;.  pLoo
66f0: 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
6700: 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64 78  x = pIdx;.  pIdx
6710: 2d 3e 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d  ->zName = "auto-
6720: 69 6e 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e  index";.  pIdx->
6730: 70 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b  pTable = pTable;
6740: 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 64 78 43  .  n = 0;.  idxC
6750: 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  ols = 0;.  for(p
6760: 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70 54 65  Term=pWC->a; pTe
6770: 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65 72 6d  rm<pWCEnd; pTerm
6780: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74 65 72  ++){.    if( ter
6790: 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
67a0: 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f 74 52  Term, pSrc, notR
67b0: 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20 20 69  eady) ){.      i
67c0: 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65 72 6d 2d  nt iCol = pTerm-
67d0: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
67e0: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 63 4d 61       Bitmask cMa
67f0: 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d 53 20 3f  sk = iCol>=BMS ?
6800: 20 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20   MASKBIT(BMS-1) 
6810: 3a 20 4d 41 53 4b 42 49 54 28 69 43 6f 6c 29 3b  : MASKBIT(iCol);
6820: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
6830: 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a   iCol==BMS-1 );.
6840: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6850: 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20  iCol==BMS );.   
6860: 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20     if( (idxCols 
6870: 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  & cMask)==0 ){. 
6880: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20         Expr *pX 
6890: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
68a0: 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c 73 20          idxCols 
68b0: 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20 20 20  |= cMask;.      
68c0: 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
68d0: 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c  [n] = pTerm->u.l
68e0: 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  eftColumn;.     
68f0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
6900: 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  e3BinaryCompareC
6910: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
6920: 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52  X->pLeft, pX->pR
6930: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 70  ight);.        p
6940: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
6950: 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e   pColl ? pColl->
6960: 7a 4e 61 6d 65 20 3a 20 73 71 6c 69 74 65 33 53  zName : sqlite3S
6970: 74 72 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20  trBINARY;.      
6980: 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    n++;.      }. 
6990: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
69a0: 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c 6f 6f 70  t( (u32)n==pLoop
69b0: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 29 3b  ->u.btree.nEq );
69c0: 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69 74  ..  /* Add addit
69d0: 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e 65  ional columns ne
69e0: 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  eded to make the
69f0: 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
6a00: 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f 76   into.  ** a cov
6a10: 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20  ering index */. 
6a20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42 69   for(i=0; i<mxBi
6a30: 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tCol; i++){.    
6a40: 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26 20  if( extraCols & 
6a50: 4d 41 53 4b 42 49 54 28 69 29 20 29 7b 0a 20 20  MASKBIT(i) ){.  
6a60: 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75      pIdx->aiColu
6a70: 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20  mn[n] = i;.     
6a80: 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d   pIdx->azColl[n]
6a90: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e   = sqlite3StrBIN
6aa0: 41 52 59 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a  ARY;.      n++;.
6ab0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
6ac0: 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
6ad0: 4d 41 53 4b 42 49 54 28 42 4d 53 2d 31 29 20 29  MASKBIT(BMS-1) )
6ae0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d  {.    for(i=BMS-
6af0: 31 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f  1; i<pTable->nCo
6b00: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  l; i++){.      p
6b10: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
6b20: 20 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78   = i;.      pIdx
6b30: 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 73 71  ->azColl[n] = sq
6b40: 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a  lite3StrBINARY;.
6b50: 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 7d        n++;.    }
6b60: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
6b70: 3d 3d 6e 4b 65 79 43 6f 6c 20 29 3b 0a 20 20 70  ==nKeyCol );.  p
6b80: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d  Idx->aiColumn[n]
6b90: 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 70   = XN_ROWID;.  p
6ba0: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
6bb0: 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
6bc0: 59 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 20  Y;..  /* Create 
6bd0: 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e  the automatic in
6be0: 64 65 78 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  dex */.  assert(
6bf0: 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
6c00: 3e 3d 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d  >=0 );.  pLevel-
6c10: 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61 72 73  >iIdxCur = pPars
6c20: 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c  e->nTab++;.  sql
6c30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
6c40: 2c 20 4f 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64  , OP_OpenAutoind
6c50: 65 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  ex, pLevel->iIdx
6c60: 43 75 72 2c 20 6e 4b 65 79 43 6f 6c 2b 31 29 3b  Cur, nKeyCol+1);
6c70: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  .  sqlite3VdbeSe
6c80: 74 50 34 4b 65 79 49 6e 66 6f 28 70 50 61 72 73  tP4KeyInfo(pPars
6c90: 65 2c 20 70 49 64 78 29 3b 0a 20 20 56 64 62 65  e, pIdx);.  Vdbe
6ca0: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72  Comment((v, "for
6cb0: 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e   %s", pTable->zN
6cc0: 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ame));..  /* Fil
6cd0: 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  l the automatic 
6ce0: 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74 65  index with conte
6cf0: 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  nt */.  sqlite3E
6d00: 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61  xprCachePush(pPa
6d10: 72 73 65 29 3b 0a 20 20 70 54 61 62 49 74 65 6d  rse);.  pTabItem
6d20: 20 3d 20 26 70 57 43 2d 3e 70 57 49 6e 66 6f 2d   = &pWC->pWInfo-
6d30: 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  >pTabList->a[pLe
6d40: 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69  vel->iFrom];.  i
6d50: 66 28 20 70 54 61 62 49 74 65 6d 2d 3e 66 67 2e  f( pTabItem->fg.
6d60: 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 29 7b 0a  viaCoroutine ){.
6d70: 20 20 20 20 69 6e 74 20 72 65 67 59 69 65 6c 64      int regYield
6d80: 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 72 65 67   = pTabItem->reg
6d90: 52 65 74 75 72 6e 3b 0a 20 20 20 20 61 64 64 72  Return;.    addr
6da0: 43 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65  Counter = sqlite
6db0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6dc0: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29  P_Integer, 0, 0)
6dd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6de0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
6df0: 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  itCoroutine, reg
6e00: 59 69 65 6c 64 2c 20 30 2c 20 70 54 61 62 49 74  Yield, 0, pTabIt
6e10: 65 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 29  em->addrFillSub)
6e20: 3b 0a 20 20 20 20 61 64 64 72 54 6f 70 20 3d 20  ;.    addrTop = 
6e30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6e40: 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c 20  p1(v, OP_Yield, 
6e50: 72 65 67 59 69 65 6c 64 29 3b 0a 20 20 20 20 56  regYield);.    V
6e60: 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
6e70: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
6e80: 28 76 2c 20 22 6e 65 78 74 20 72 6f 77 20 6f 66  (v, "next row of
6e90: 20 5c 22 25 73 5c 22 22 2c 20 70 54 61 62 49 74   \"%s\"", pTabIt
6ea0: 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  em->pTab->zName)
6eb0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6ec0: 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69 74 65  addrTop = sqlite
6ed0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
6ee0: 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76 65 6c  P_Rewind, pLevel
6ef0: 2d 3e 69 54 61 62 43 75 72 29 3b 20 56 64 62 65  ->iTabCur); Vdbe
6f00: 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20 7d  Coverage(v);.  }
6f10: 0a 20 20 69 66 28 20 70 50 61 72 74 69 61 6c 20  .  if( pPartial 
6f20: 29 7b 0a 20 20 20 20 69 43 6f 6e 74 69 6e 75 65  ){.    iContinue
6f30: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
6f40: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
6f50: 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
6f60: 73 65 28 70 50 61 72 73 65 2c 20 70 50 61 72 74  se(pParse, pPart
6f70: 69 61 6c 2c 20 69 43 6f 6e 74 69 6e 75 65 2c 20  ial, iContinue, 
6f80: 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
6f90: 4c 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77  L);.    pLoop->w
6fa0: 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
6fb0: 50 41 52 54 49 41 4c 49 44 58 3b 0a 20 20 7d 0a  PARTIALIDX;.  }.
6fc0: 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
6fd0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
6fe0: 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67 42 61  pParse);.  regBa
6ff0: 73 65 20 3d 20 73 71 6c 69 74 65 33 47 65 6e 65  se = sqlite3Gene
7000: 72 61 74 65 49 6e 64 65 78 4b 65 79 28 0a 20 20  rateIndexKey(.  
7010: 20 20 20 20 70 50 61 72 73 65 2c 20 70 49 64 78      pParse, pIdx
7020: 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
7030: 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 30 2c  r, regRecord, 0,
7040: 20 30 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 20 20   0, 0, 0.  );.  
7050: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7060: 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65 72  2(v, OP_IdxInser
7070: 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43  t, pLevel->iIdxC
7080: 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  ur, regRecord);.
7090: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
70a0: 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f  ngeP5(v, OPFLAG_
70b0: 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a  USESEEKRESULT);.
70c0: 20 20 69 66 28 20 70 50 61 72 74 69 61 6c 20 29    if( pPartial )
70d0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
70e0: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 43 6f 6e  lveLabel(v, iCon
70f0: 74 69 6e 75 65 29 3b 0a 20 20 69 66 28 20 70 54  tinue);.  if( pT
7100: 61 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f  abItem->fg.viaCo
7110: 72 6f 75 74 69 6e 65 20 29 7b 0a 20 20 20 20 73  routine ){.    s
7120: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
7130: 50 32 28 76 2c 20 61 64 64 72 43 6f 75 6e 74 65  P2(v, addrCounte
7140: 72 2c 20 72 65 67 42 61 73 65 2b 6e 29 3b 0a 20  r, regBase+n);. 
7150: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
7160: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
7170: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 74 72 61  ailed );.    tra
7180: 6e 73 6c 61 74 65 43 6f 6c 75 6d 6e 54 6f 43 6f  nslateColumnToCo
7190: 70 79 28 70 50 61 72 73 65 2c 20 61 64 64 72 54  py(pParse, addrT
71a0: 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62  op, pLevel->iTab
71b0: 43 75 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Cur,.           
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
71d0: 54 61 62 49 74 65 6d 2d 3e 72 65 67 52 65 73 75  TabItem->regResu
71e0: 6c 74 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  lt, 1);.    sqli
71f0: 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 61  te3VdbeGoto(v, a
7200: 64 64 72 54 6f 70 29 3b 0a 20 20 20 20 70 54 61  ddrTop);.    pTa
7210: 62 49 74 65 6d 2d 3e 66 67 2e 76 69 61 43 6f 72  bItem->fg.viaCor
7220: 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 65  outine = 0;.  }e
7230: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
7240: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
7250: 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69  _Next, pLevel->i
7260: 54 61 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b  TabCur, addrTop+
7270: 31 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  1); VdbeCoverage
7280: 28 76 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  (v);.  }.  sqlit
7290: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
72a0: 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
72b0: 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 29 3b 0a  TUS_AUTOINDEX);.
72c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
72d0: 70 48 65 72 65 28 76 2c 20 61 64 64 72 54 6f 70  pHere(v, addrTop
72e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
72f0: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
7300: 65 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  e, regRecord);. 
7310: 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
7320: 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20 20  ePop(pParse);.  
7330: 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
7340: 77 68 65 6e 20 73 6b 69 70 70 69 6e 67 20 74 68  when skipping th
7350: 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
7360: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
7370: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
7380: 72 49 6e 69 74 29 3b 0a 0a 65 6e 64 5f 61 75 74  rInit);..end_aut
7390: 6f 5f 69 6e 64 65 78 5f 63 72 65 61 74 65 3a 0a  o_index_create:.
73a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
73b0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
73c0: 70 50 61 72 74 69 61 6c 29 3b 0a 7d 0a 23 65 6e  pPartial);.}.#en
73d0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
73e0: 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  IT_AUTOMATIC_IND
73f0: 45 58 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  EX */..#ifndef S
7400: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
7410: 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 41 6c  ALTABLE./*.** Al
7420: 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f 70 75 6c  locate and popul
7430: 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 69  ate an sqlite3_i
7440: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
7450: 75 72 65 2e 20 49 74 20 69 73 20 74 68 65 20 0a  ure. It is the .
7460: 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  ** responsibilit
7470: 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
7480: 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65  to eventually re
7490: 6c 65 61 73 65 20 74 68 65 20 73 74 72 75 63 74  lease the struct
74a0: 75 72 65 0a 2a 2a 20 62 79 20 70 61 73 73 69 6e  ure.** by passin
74b0: 67 20 74 68 65 20 70 6f 69 6e 74 65 72 20 72 65  g the pointer re
74c0: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66  turned by this f
74d0: 75 6e 63 74 69 6f 6e 20 74 6f 20 73 71 6c 69 74  unction to sqlit
74e0: 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74  e3_free()..*/.st
74f0: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 64  atic sqlite3_ind
7500: 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63 61 74  ex_info *allocat
7510: 65 49 6e 64 65 78 49 6e 66 6f 28 0a 20 20 50 61  eIndexInfo(.  Pa
7520: 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 57  rse *pParse,.  W
7530: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
7540: 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 6e 75 73  .  Bitmask mUnus
7550: 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
7560: 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 65 72     /* Ignore ter
7570: 6d 73 20 77 69 74 68 20 74 68 65 73 65 20 70 72  ms with these pr
7580: 65 72 65 71 73 20 2a 2f 0a 20 20 73 74 72 75 63  ereqs */.  struc
7590: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
75a0: 70 53 72 63 2c 0a 20 20 45 78 70 72 4c 69 73 74  pSrc,.  ExprList
75b0: 20 2a 70 4f 72 64 65 72 42 79 2c 0a 20 20 75 31   *pOrderBy,.  u1
75c0: 36 20 2a 70 6d 4e 6f 4f 6d 69 74 20 20 20 20 20  6 *pmNoOmit     
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
75e0: 20 4d 61 73 6b 20 6f 66 20 74 65 72 6d 73 20 6e   Mask of terms n
75f0: 6f 74 20 74 6f 20 6f 6d 69 74 20 2a 2f 0a 29 7b  ot to omit */.){
7600: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
7610: 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75  nt nTerm;.  stru
7620: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
7630: 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64  _constraint *pId
7640: 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20  xCons;.  struct 
7650: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
7660: 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72  derby *pIdxOrder
7670: 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  By;.  struct sql
7680: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
7690: 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73  raint_usage *pUs
76a0: 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  age;.  WhereTerm
76b0: 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e   *pTerm;.  int n
76c0: 4f 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74  OrderBy;.  sqlit
76d0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
76e0: 49 64 78 49 6e 66 6f 3b 0a 20 20 75 31 36 20 6d  IdxInfo;.  u16 m
76f0: 4e 6f 4f 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f  NoOmit = 0;..  /
7700: 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
7710: 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57  er of possible W
7720: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
7730: 74 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e  traints referrin
7740: 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76  g.  ** to this v
7750: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
7760: 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c    for(i=nTerm=0,
7770: 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
7780: 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
7790: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
77a0: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
77b0: 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
77c0: 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
77d0: 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  e;.    if( pTerm
77e0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
77f0: 6d 55 6e 75 73 61 62 6c 65 20 29 20 63 6f 6e 74  mUnusable ) cont
7800: 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
7810: 28 20 49 73 50 6f 77 65 72 4f 66 54 77 6f 28 70  ( IsPowerOfTwo(p
7820: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
7830: 26 20 7e 57 4f 5f 45 51 55 49 56 29 20 29 3b 0a  & ~WO_EQUIV) );.
7840: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
7850: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
7860: 20 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65   WO_IN );.    te
7870: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
7880: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53  Operator & WO_IS
7890: 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74  NULL );.    test
78a0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
78b0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29  erator & WO_IS )
78c0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
78d0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
78e0: 20 26 20 57 4f 5f 41 4c 4c 20 29 3b 0a 20 20 20   & WO_ALL );.   
78f0: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
7900: 65 72 61 74 6f 72 20 26 20 7e 28 57 4f 5f 45 51  erator & ~(WO_EQ
7910: 55 49 56 29 29 3d 3d 30 20 29 20 63 6f 6e 74 69  UIV))==0 ) conti
7920: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 54 65  nue;.    if( pTe
7930: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
7940: 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69  RM_VNULL ) conti
7950: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
7960: 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
7970: 6c 75 6d 6e 3e 3d 28 2d 31 29 20 29 3b 0a 20 20  lumn>=(-1) );.  
7980: 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a    nTerm++;.  }..
7990: 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45    /* If the ORDE
79a0: 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74  R BY clause cont
79b0: 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e  ains only column
79c0: 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s in the current
79d0: 20 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74   .  ** virtual t
79e0: 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61  able then alloca
79f0: 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
7a00: 20 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f   aOrderBy part o
7a10: 66 0a 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74  f.  ** the sqlit
7a20: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
7a30: 72 75 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20  ructure..  */.  
7a40: 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  nOrderBy = 0;.  
7a50: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
7a60: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4f 72 64      int n = pOrd
7a70: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
7a80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
7a90: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
7aa0: 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
7ab0: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
7ac0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
7ad0: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op!=TK_COLUMN ||
7ae0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d   pExpr->iTable!=
7af0: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
7b00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7b10: 20 69 66 28 20 69 3d 3d 6e 29 7b 0a 20 20 20 20   if( i==n){.    
7b20: 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 6e 3b 0a    nOrderBy = n;.
7b30: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
7b40: 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c  Allocate the sql
7b50: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
7b60: 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f 0a 20  structure.  */. 
7b70: 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69   pIdxInfo = sqli
7b80: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
7b90: 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
7ba0: 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20  of(*pIdxInfo).  
7bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bc0: 20 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65           + (size
7bd0: 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20  of(*pIdxCons) + 
7be0: 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29  sizeof(*pUsage))
7bf0: 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20  *nTerm.         
7c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c10: 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78    + sizeof(*pIdx
7c20: 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42  OrderBy)*nOrderB
7c30: 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49  y );.  if( pIdxI
7c40: 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  nfo==0 ){.    sq
7c50: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7c60: 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65  arse, "out of me
7c70: 6d 6f 72 79 22 29 3b 0a 20 20 20 20 72 65 74 75  mory");.    retu
7c80: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
7c90: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  Initialize the s
7ca0: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 73  tructure.  The s
7cb0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
7cc0: 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  o structure cont
7cd0: 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66  ains.  ** many f
7ce0: 69 65 6c 64 73 20 74 68 61 74 20 61 72 65 20 64  ields that are d
7cf0: 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20  eclared "const" 
7d00: 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73 74  to prevent xBest
7d10: 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20  Index from.  ** 
7d20: 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20  changing them.  
7d30: 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f  We have to do so
7d40: 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67  me funky casting
7d50: 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a   in order to.  *
7d60: 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f  * initialize tho
7d70: 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a  se fields..  */.
7d80: 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74    pIdxCons = (st
7d90: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
7da0: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26  ex_constraint*)&
7db0: 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70  pIdxInfo[1];.  p
7dc0: 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74  IdxOrderBy = (st
7dd0: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
7de0: 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64  ex_orderby*)&pId
7df0: 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20  xCons[nTerm];.  
7e00: 70 55 73 61 67 65 20 3d 20 28 73 74 72 75 63 74  pUsage = (struct
7e10: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
7e20: 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a  onstraint_usage*
7e30: 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f  )&pIdxOrderBy[nO
7e40: 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74  rderBy];.  *(int
7e50: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  *)&pIdxInfo->nCo
7e60: 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d  nstraint = nTerm
7e70: 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
7e80: 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d  Info->nOrderBy =
7e90: 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73   nOrderBy;.  *(s
7ea0: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
7eb0: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
7ec0: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
7ed0: 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f  straint = pIdxCo
7ee0: 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  ns;.  *(struct s
7ef0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
7f00: 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f  erby**)&pIdxInfo
7f10: 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64  ->aOrderBy = pId
7f20: 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74  xOrderBy;.  *(st
7f30: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
7f40: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
7f50: 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  age**)&pIdxInfo-
7f60: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
7f70: 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e =.            
7f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fb0: 20 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a         pUsage;..
7fc0: 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65    for(i=j=0, pTe
7fd0: 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
7fe0: 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
7ff0: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 75 31 36 20  erm++){.    u16 
8000: 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72  op;.    if( pTer
8010: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
8020: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
8030: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
8040: 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  f( pTerm->prereq
8050: 52 69 67 68 74 20 26 20 6d 55 6e 75 73 61 62 6c  Right & mUnusabl
8060: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
8070: 20 20 61 73 73 65 72 74 28 20 49 73 50 6f 77 65    assert( IsPowe
8080: 72 4f 66 54 77 6f 28 70 54 65 72 6d 2d 3e 65 4f  rOfTwo(pTerm->eO
8090: 70 65 72 61 74 6f 72 20 26 20 7e 57 4f 5f 45 51  perator & ~WO_EQ
80a0: 55 49 56 29 20 29 3b 0a 20 20 20 20 74 65 73 74  UIV) );.    test
80b0: 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
80c0: 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
80d0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
80e0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
80f0: 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
8100: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
8110: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
8120: 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65  ISNULL );.    te
8130: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
8140: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 41 4c  Operator & WO_AL
8150: 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54  L );.    if( (pT
8160: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
8170: 20 7e 28 57 4f 5f 45 51 55 49 56 29 29 3d 3d 30   ~(WO_EQUIV))==0
8180: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
8190: 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c   if( pTerm->wtFl
81a0: 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
81b0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
81c0: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
81d0: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3e 3d 28 2d  u.leftColumn>=(-
81e0: 31 29 20 29 3b 0a 20 20 20 20 70 49 64 78 43 6f  1) );.    pIdxCo
81f0: 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20  ns[j].iColumn = 
8200: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
8210: 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e  umn;.    pIdxCon
8220: 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74  s[j].iTermOffset
8230: 20 3d 20 69 3b 0a 20 20 20 20 6f 70 20 3d 20 70   = i;.    op = p
8240: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8250: 26 20 57 4f 5f 41 4c 4c 3b 0a 20 20 20 20 69 66  & WO_ALL;.    if
8260: 28 20 6f 70 3d 3d 57 4f 5f 49 4e 20 29 20 6f 70  ( op==WO_IN ) op
8270: 20 3d 20 57 4f 5f 45 51 3b 0a 20 20 20 20 69 66   = WO_EQ;.    if
8280: 28 20 6f 70 3d 3d 57 4f 5f 41 55 58 20 29 7b 0a  ( op==WO_AUX ){.
8290: 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a        pIdxCons[j
82a0: 5d 2e 6f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4d  ].op = pTerm->eM
82b0: 61 74 63 68 4f 70 3b 0a 20 20 20 20 7d 65 6c 73  atchOp;.    }els
82c0: 65 20 69 66 28 20 6f 70 20 26 20 28 57 4f 5f 49  e if( op & (WO_I
82d0: 53 4e 55 4c 4c 7c 57 4f 5f 49 53 29 20 29 7b 0a  SNULL|WO_IS) ){.
82e0: 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f        if( op==WO
82f0: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  _ISNULL ){.     
8300: 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f     pIdxCons[j].o
8310: 70 20 3d 20 53 51 4c 49 54 45 5f 49 4e 44 45 58  p = SQLITE_INDEX
8320: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 49 53 4e 55  _CONSTRAINT_ISNU
8330: 4c 4c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LL;.      }else{
8340: 0a 20 20 20 20 20 20 20 20 70 49 64 78 43 6f 6e  .        pIdxCon
8350: 73 5b 6a 5d 2e 6f 70 20 3d 20 53 51 4c 49 54 45  s[j].op = SQLITE
8360: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
8370: 54 5f 49 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20  T_IS;.      }.  
8380: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
8390: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20  IdxCons[j].op = 
83a0: 28 75 38 29 6f 70 3b 0a 20 20 20 20 20 20 2f 2a  (u8)op;.      /*
83b0: 20 54 68 65 20 64 69 72 65 63 74 20 61 73 73 69   The direct assi
83c0: 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70 72  gnment in the pr
83d0: 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20 70  evious line is p
83e0: 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65 63  ossible only bec
83f0: 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  ause.      ** th
8400: 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45  e WO_ and SQLITE
8410: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
8420: 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69 64 65  T_ codes are ide
8430: 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20  ntical.  The.   
8440: 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
8450: 61 73 73 65 72 74 73 20 76 65 72 69 66 79 20 74  asserts verify t
8460: 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20  his fact. */.   
8470: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45 51     assert( WO_EQ
8480: 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
8490: 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a  ONSTRAINT_EQ );.
84a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f        assert( WO
84b0: 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _LT==SQLITE_INDE
84c0: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20  X_CONSTRAINT_LT 
84d0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
84e0: 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49   WO_LE==SQLITE_I
84f0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
8500: 4c 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LE );.      asse
8510: 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54  rt( WO_GT==SQLIT
8520: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
8530: 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 61  NT_GT );.      a
8540: 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51  ssert( WO_GE==SQ
8550: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
8560: 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20  RAINT_GE );.    
8570: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
8580: 3e 65 4f 70 65 72 61 74 6f 72 26 28 57 4f 5f 49  >eOperator&(WO_I
8590: 4e 7c 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f  N|WO_EQ|WO_LT|WO
85a0: 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c  _LE|WO_GT|WO_GE|
85b0: 57 4f 5f 41 55 58 29 20 29 3b 0a 0a 20 20 20 20  WO_AUX) );..    
85c0: 20 20 69 66 28 20 6f 70 20 26 20 28 57 4f 5f 4c    if( op & (WO_L
85d0: 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f  T|WO_LE|WO_GT|WO
85e0: 5f 47 45 29 0a 20 20 20 20 20 20 20 26 26 20 73  _GE).       && s
85f0: 71 6c 69 74 65 33 45 78 70 72 49 73 56 65 63 74  qlite3ExprIsVect
8600: 6f 72 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d  or(pTerm->pExpr-
8610: 3e 70 52 69 67 68 74 29 20 0a 20 20 20 20 20 20  >pRight) .      
8620: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
8630: 3c 31 36 20 29 20 6d 4e 6f 4f 6d 69 74 20 7c 3d  <16 ) mNoOmit |=
8640: 20 28 31 20 3c 3c 20 69 29 3b 0a 20 20 20 20 20   (1 << i);.     
8650: 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 4c 54     if( op==WO_LT
8660: 20 29 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f   ) pIdxCons[j].o
8670: 70 20 3d 20 57 4f 5f 4c 45 3b 0a 20 20 20 20 20  p = WO_LE;.     
8680: 20 20 20 69 66 28 20 6f 70 3d 3d 57 4f 5f 47 54     if( op==WO_GT
8690: 20 29 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f   ) pIdxCons[j].o
86a0: 70 20 3d 20 57 4f 5f 47 45 3b 0a 20 20 20 20 20  p = WO_GE;.     
86b0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6a 2b   }.    }..    j+
86c0: 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  +;.  }.  for(i=0
86d0: 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
86e0: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
86f0: 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
8700: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
8710: 70 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69  pIdxOrderBy[i].i
8720: 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e  Column = pExpr->
8730: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64  iColumn;.    pId
8740: 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63  xOrderBy[i].desc
8750: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
8760: 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  ].sortOrder;.  }
8770: 0a 0a 20 20 2a 70 6d 4e 6f 4f 6d 69 74 20 3d 20  ..  *pmNoOmit = 
8780: 6d 4e 6f 4f 6d 69 74 3b 0a 20 20 72 65 74 75 72  mNoOmit;.  retur
8790: 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f  n pIdxInfo;.}../
87a0: 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f  *.** The table o
87b0: 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65 20  bject reference 
87c0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
87d0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
87e0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
87f0: 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74  * must represent
8800: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
8810: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
8820: 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73  invokes the xBes
8830: 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68  tIndex().** meth
8840: 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  od of the virtua
8850: 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  l table with the
8860: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
8870: 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a  nfo object that.
8880: 2a 2a 20 63 6f 6d 65 73 20 69 6e 20 61 73 20 74  ** comes in as t
8890: 68 65 20 33 72 64 20 61 72 67 75 6d 65 6e 74 20  he 3rd argument 
88a0: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
88b0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
88c0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 70 50 61 72  ror occurs, pPar
88d0: 73 65 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  se is populated 
88e0: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 6d 65  with an error me
88f0: 73 73 61 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e  ssage and a.** n
8900: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 69 73  on-zero value is
8910: 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
8920: 77 69 73 65 2c 20 30 20 69 73 20 72 65 74 75 72  wise, 0 is retur
8930: 6e 65 64 20 61 6e 64 20 74 68 65 20 6f 75 74 70  ned and the outp
8940: 75 74 0a 2a 2a 20 70 61 72 74 20 6f 66 20 74 68  ut.** part of th
8950: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
8960: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  info structure i
8970: 73 20 6c 65 66 74 20 70 6f 70 75 6c 61 74 65 64  s left populated
8980: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20  ..**.** Whether 
8990: 6f 72 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20  or not an error 
89a0: 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 20  is returned, it 
89b0: 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
89c0: 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20  ility of the.** 
89d0: 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
89e0: 61 6c 6c 79 20 66 72 65 65 20 70 2d 3e 69 64 78  ally free p->idx
89f0: 53 74 72 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f  Str if p->needTo
8a00: 46 72 65 65 49 64 78 53 74 72 20 69 6e 64 69 63  FreeIdxStr indic
8a10: 61 74 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 69  ates.** that thi
8a20: 73 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a  s is required..*
8a30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 74 61  /.static int vta
8a40: 62 42 65 73 74 49 6e 64 65 78 28 50 61 72 73 65  bBestIndex(Parse
8a50: 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
8a60: 2a 70 54 61 62 2c 20 73 71 6c 69 74 65 33 5f 69  *pTab, sqlite3_i
8a70: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20  ndex_info *p){. 
8a80: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
8a90: 56 74 61 62 20 3d 20 73 71 6c 69 74 65 33 47 65  Vtab = sqlite3Ge
8aa0: 74 56 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e  tVTable(pParse->
8ab0: 64 62 2c 20 70 54 61 62 29 2d 3e 70 56 74 61 62  db, pTab)->pVtab
8ac0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 54  ;.  int rc;..  T
8ad0: 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28  RACE_IDX_INPUTS(
8ae0: 70 29 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62  p);.  rc = pVtab
8af0: 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74  ->pModule->xBest
8b00: 49 6e 64 65 78 28 70 56 74 61 62 2c 20 70 29 3b  Index(pVtab, p);
8b10: 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  .  TRACE_IDX_OUT
8b20: 50 55 54 53 28 70 29 3b 0a 0a 20 20 69 66 28 20  PUTS(p);..  if( 
8b30: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
8b40: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
8b50: 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
8b60: 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75     sqlite3OomFau
8b70: 6c 74 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a  lt(pParse->db);.
8b80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70      }else if( !p
8b90: 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b  Vtab->zErrMsg ){
8ba0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
8bb0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8bc0: 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53  %s", sqlite3ErrS
8bd0: 74 72 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c  tr(rc));.    }el
8be0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
8bf0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8c00: 2c 20 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a  , "%s", pVtab->z
8c10: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20  ErrMsg);.    }. 
8c20: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
8c30: 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  e(pVtab->zErrMsg
8c40: 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72  );.  pVtab->zErr
8c50: 4d 73 67 20 3d 20 30 3b 0a 0a 23 69 66 20 30 0a  Msg = 0;..#if 0.
8c60: 20 20 2f 2a 20 54 68 69 73 20 65 72 72 6f 72 20    /* This error 
8c70: 69 73 20 6e 6f 77 20 63 61 75 67 68 74 20 62 79  is now caught by
8c80: 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a   the caller..  *
8c90: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 22 78 42  * Search for "xB
8ca0: 65 73 74 49 6e 64 65 78 20 6d 61 6c 66 75 6e 63  estIndex malfunc
8cb0: 74 69 6f 6e 22 20 62 65 6c 6f 77 20 2a 2f 0a 20  tion" below */. 
8cc0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
8cd0: 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
8ce0: 7b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43  {.    if( !p->aC
8cf0: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61  onstraint[i].usa
8d00: 62 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74  ble && p->aConst
8d10: 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72  raintUsage[i].ar
8d20: 67 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20  gvIndex>0 ){.   
8d30: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8d40: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
8d50: 20 20 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a        "table %s:
8d60: 20 78 42 65 73 74 49 6e 64 65 78 20 72 65 74 75   xBestIndex retu
8d70: 72 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20  rned an invalid 
8d80: 70 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  plan", pTab->zNa
8d90: 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  me);.    }.  }.#
8da0: 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
8db0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a  pParse->nErr;.}.
8dc0: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
8dd0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
8de0: 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a  IRTUALTABLE) */.
8df0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
8e00: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
8e10: 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  TAT4./*.** Estim
8e20: 61 74 65 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e  ate the location
8e30: 20 6f 66 20 61 20 70 61 72 74 69 63 75 6c 61 72   of a particular
8e40: 20 6b 65 79 20 61 6d 6f 6e 67 20 61 6c 6c 20 6b   key among all k
8e50: 65 79 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 64  eys in an.** ind
8e60: 65 78 2e 20 20 53 74 6f 72 65 20 74 68 65 20 72  ex.  Store the r
8e70: 65 73 75 6c 74 73 20 69 6e 20 61 53 74 61 74 20  esults in aStat 
8e80: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
8e90: 2a 20 20 20 20 61 53 74 61 74 5b 30 5d 20 20 20  *    aStat[0]   
8ea0: 20 20 20 45 73 74 2e 20 6e 75 6d 62 65 72 20 6f     Est. number o
8eb0: 66 20 72 6f 77 73 20 6c 65 73 73 20 74 68 61 6e  f rows less than
8ec0: 20 70 52 65 63 0a 2a 2a 20 20 20 20 61 53 74 61   pRec.**    aSta
8ed0: 74 5b 31 5d 20 20 20 20 20 20 45 73 74 2e 20 6e  t[1]      Est. n
8ee0: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 71  umber of rows eq
8ef0: 75 61 6c 20 74 6f 20 70 52 65 63 0a 2a 2a 0a 2a  ual to pRec.**.*
8f00: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
8f10: 65 78 20 6f 66 20 74 68 65 20 73 61 6d 70 6c 65  ex of the sample
8f20: 20 74 68 61 74 20 69 73 20 74 68 65 20 73 6d 61   that is the sma
8f30: 6c 6c 65 73 74 20 73 61 6d 70 6c 65 20 74 68 61  llest sample tha
8f40: 74 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  t.** is greater 
8f50: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
8f60: 20 70 52 65 63 2e 20 4e 6f 74 65 20 74 68 61 74   pRec. Note that
8f70: 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 6e   this index is n
8f80: 6f 74 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 69  ot an index.** i
8f90: 6e 74 6f 20 74 68 65 20 61 53 61 6d 70 6c 65 5b  nto the aSample[
8fa0: 5d 20 61 72 72 61 79 20 2d 20 69 74 20 69 73 20  ] array - it is 
8fb0: 61 6e 20 69 6e 64 65 78 20 69 6e 74 6f 20 61 20  an index into a 
8fc0: 76 69 72 74 75 61 6c 20 73 65 74 20 6f 66 20 73  virtual set of s
8fd0: 61 6d 70 6c 65 73 0a 2a 2a 20 62 61 73 65 64 20  amples.** based 
8fe0: 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  on the contents 
8ff0: 6f 66 20 61 53 61 6d 70 6c 65 5b 5d 20 61 6e 64  of aSample[] and
9000: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
9010: 69 65 6c 64 73 20 69 6e 20 72 65 63 6f 72 64 20  ields in record 
9020: 0a 2a 2a 20 70 52 65 63 2e 20 0a 2a 2f 0a 73 74  .** pRec. .*/.st
9030: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4b 65  atic int whereKe
9040: 79 53 74 61 74 73 28 0a 20 20 50 61 72 73 65 20  yStats(.  Parse 
9050: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
9060: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
9070: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
9080: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
9090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
90a0: 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64   Index to consid
90b0: 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a  er domain of */.
90c0: 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
90d0: 20 2a 70 52 65 63 2c 20 20 20 20 20 20 20 2f 2a   *pRec,       /*
90e0: 20 56 65 63 74 6f 72 20 6f 66 20 76 61 6c 75 65   Vector of value
90f0: 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f  s to consider */
9100: 0a 20 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20  .  int roundUp, 
9110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9120: 2a 20 52 6f 75 6e 64 20 75 70 20 69 66 20 74 72  * Round up if tr
9130: 75 65 2e 20 20 52 6f 75 6e 64 20 64 6f 77 6e 20  ue.  Round down 
9140: 69 66 20 66 61 6c 73 65 20 2a 2f 0a 20 20 74 52  if false */.  tR
9150: 6f 77 63 6e 74 20 2a 61 53 74 61 74 20 20 20 20  owcnt *aStat    
9160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
9170: 3a 20 73 74 61 74 73 20 77 72 69 74 74 65 6e 20  : stats written 
9180: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64  here */.){.  Ind
9190: 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70 6c  exSample *aSampl
91a0: 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70 6c  e = pIdx->aSampl
91b0: 65 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  e;.  int iCol;  
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91d0: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 65 71   /* Index of req
91e0: 75 69 72 65 64 20 73 74 61 74 73 20 69 6e 20 61  uired stats in a
91f0: 6e 45 71 5b 5d 20 65 74 63 2e 20 2a 2f 0a 20 20  nEq[] etc. */.  
9200: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
9210: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
9220: 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 73 61  ndex of first sa
9230: 6d 70 6c 65 20 3e 3d 20 70 52 65 63 20 2a 2f 0a  mple >= pRec */.
9240: 20 20 69 6e 74 20 69 53 61 6d 70 6c 65 3b 20 20    int iSample;  
9250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9260: 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c 65   Smallest sample
9270: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6f 72 20   larger than or 
9280: 65 71 75 61 6c 20 74 6f 20 70 52 65 63 20 2a 2f  equal to pRec */
9290: 0a 20 20 69 6e 74 20 69 4d 69 6e 20 3d 20 30 3b  .  int iMin = 0;
92a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
92b0: 2a 20 53 6d 61 6c 6c 65 73 74 20 73 61 6d 70 6c  * Smallest sampl
92c0: 65 20 6e 6f 74 20 79 65 74 20 74 65 73 74 65 64  e not yet tested
92d0: 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 73 74 3b   */.  int iTest;
92e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92f0: 20 20 2f 2a 20 4e 65 78 74 20 73 61 6d 70 6c 65    /* Next sample
9300: 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 69 6e   to test */.  in
9310: 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20  t res;          
9320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
9330: 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  ult of compariso
9340: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  n operation */. 
9350: 20 69 6e 74 20 6e 46 69 65 6c 64 3b 20 20 20 20   int nField;    
9360: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9370: 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  Number of fields
9380: 20 69 6e 20 70 52 65 63 20 2a 2f 0a 20 20 74 52   in pRec */.  tR
9390: 6f 77 63 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30  owcnt iLower = 0
93a0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 61 6e 4c  ;         /* anL
93b0: 74 5b 5d 20 2b 20 61 6e 45 71 5b 5d 20 6f 66 20  t[] + anEq[] of 
93c0: 6c 61 72 67 65 73 74 20 73 61 6d 70 6c 65 20 70  largest sample p
93d0: 52 65 63 20 69 73 20 3e 20 2a 2f 0a 0a 23 69 66  Rec is > */..#if
93e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  ndef SQLITE_DEBU
93f0: 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  G.  UNUSED_PARAM
9400: 45 54 45 52 28 20 70 50 61 72 73 65 20 29 3b 0a  ETER( pParse );.
9410: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
9420: 20 70 52 65 63 21 3d 30 20 29 3b 0a 20 20 61 73   pRec!=0 );.  as
9430: 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 53 61 6d  sert( pIdx->nSam
9440: 70 6c 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ple>0 );.  asser
9450: 74 28 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 3e  t( pRec->nField>
9460: 30 20 26 26 20 70 52 65 63 2d 3e 6e 46 69 65 6c  0 && pRec->nFiel
9470: 64 3c 3d 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65  d<=pIdx->nSample
9480: 43 6f 6c 20 29 3b 0a 0a 20 20 2f 2a 20 44 6f 20  Col );..  /* Do 
9490: 61 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 20  a binary search 
94a0: 74 6f 20 66 69 6e 64 20 74 68 65 20 66 69 72 73  to find the firs
94b0: 74 20 73 61 6d 70 6c 65 20 67 72 65 61 74 65 72  t sample greater
94c0: 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 20   than or equal. 
94d0: 20 2a 2a 20 74 6f 20 70 52 65 63 2e 20 49 66 20   ** to pRec. If 
94e0: 70 52 65 63 20 63 6f 6e 74 61 69 6e 73 20 61 20  pRec contains a 
94f0: 73 69 6e 67 6c 65 20 66 69 65 6c 64 2c 20 74 68  single field, th
9500: 65 20 73 65 74 20 6f 66 20 73 61 6d 70 6c 65 73  e set of samples
9510: 20 74 6f 20 73 65 61 72 63 68 0a 20 20 2a 2a 20   to search.  ** 
9520: 69 73 20 73 69 6d 70 6c 79 20 74 68 65 20 61 53  is simply the aS
9530: 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2e 20 49  ample[] array. I
9540: 66 20 74 68 65 20 73 61 6d 70 6c 65 73 20 69 6e  f the samples in
9550: 20 61 53 61 6d 70 6c 65 5b 5d 20 63 6f 6e 74 61   aSample[] conta
9560: 69 6e 20 6d 6f 72 65 0a 20 20 2a 2a 20 74 68 61  in more.  ** tha
9570: 6e 20 6f 6e 65 20 66 69 65 6c 64 73 2c 20 61 6c  n one fields, al
9580: 6c 20 66 69 65 6c 64 73 20 66 6f 6c 6c 6f 77 69  l fields followi
9590: 6e 67 20 74 68 65 20 66 69 72 73 74 20 61 72 65  ng the first are
95a0: 20 69 67 6e 6f 72 65 64 2e 0a 20 20 2a 2a 0a 20   ignored..  **. 
95b0: 20 2a 2a 20 49 66 20 70 52 65 63 20 63 6f 6e 74   ** If pRec cont
95c0: 61 69 6e 73 20 4e 20 66 69 65 6c 64 73 2c 20 77  ains N fields, w
95d0: 68 65 72 65 20 4e 20 69 73 20 6d 6f 72 65 20 74  here N is more t
95e0: 68 61 6e 20 6f 6e 65 2c 20 74 68 65 6e 20 61 73  han one, then as
95f0: 20 77 65 6c 6c 20 61 73 20 74 68 65 0a 20 20 2a   well as the.  *
9600: 2a 20 73 61 6d 70 6c 65 73 20 69 6e 20 61 53 61  * samples in aSa
9610: 6d 70 6c 65 5b 5d 20 28 74 72 75 6e 63 61 74 65  mple[] (truncate
9620: 64 20 74 6f 20 4e 20 66 69 65 6c 64 73 29 2c 20  d to N fields), 
9630: 74 68 65 20 73 65 61 72 63 68 20 61 6c 73 6f 20  the search also 
9640: 68 61 73 20 74 6f 0a 20 20 2a 2a 20 63 6f 6e 73  has to.  ** cons
9650: 69 64 65 72 20 70 72 65 66 69 78 65 73 20 6f 66  ider prefixes of
9660: 20 74 68 6f 73 65 20 73 61 6d 70 6c 65 73 2e 20   those samples. 
9670: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
9680: 74 68 65 20 73 65 74 20 6f 66 20 73 61 6d 70 6c  the set of sampl
9690: 65 73 0a 20 20 2a 2a 20 69 6e 20 61 53 61 6d 70  es.  ** in aSamp
96a0: 6c 65 20 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  le is:.  **.  **
96b0: 20 20 20 20 20 61 53 61 6d 70 6c 65 5b 30 5d 20       aSample[0] 
96c0: 3d 20 28 61 2c 20 35 29 20 0a 20 20 2a 2a 20 20  = (a, 5) .  **  
96d0: 20 20 20 61 53 61 6d 70 6c 65 5b 31 5d 20 3d 20     aSample[1] = 
96e0: 28 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20  (a, 10) .  **   
96f0: 20 20 61 53 61 6d 70 6c 65 5b 32 5d 20 3d 20 28    aSample[2] = (
9700: 62 2c 20 35 29 20 0a 20 20 2a 2a 20 20 20 20 20  b, 5) .  **     
9710: 61 53 61 6d 70 6c 65 5b 33 5d 20 3d 20 28 63 2c  aSample[3] = (c,
9720: 20 31 30 30 29 20 0a 20 20 2a 2a 20 20 20 20 20   100) .  **     
9730: 61 53 61 6d 70 6c 65 5b 34 5d 20 3d 20 28 63 2c  aSample[4] = (c,
9740: 20 31 30 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20   105).  **.  ** 
9750: 54 68 65 6e 20 74 68 65 20 73 65 61 72 63 68 20  Then the search 
9760: 73 70 61 63 65 20 73 68 6f 75 6c 64 20 69 64 65  space should ide
9770: 61 6c 6c 79 20 62 65 20 74 68 65 20 73 61 6d 70  ally be the samp
9780: 6c 65 73 20 61 62 6f 76 65 20 61 6e 64 20 74 68  les above and th
9790: 65 20 0a 20 20 2a 2a 20 75 6e 69 71 75 65 20 70  e .  ** unique p
97a0: 72 65 66 69 78 65 73 20 5b 61 5d 2c 20 5b 62 5d  refixes [a], [b]
97b0: 20 61 6e 64 20 5b 63 5d 2e 20 42 75 74 20 73 69   and [c]. But si
97c0: 6e 63 65 20 74 68 61 74 20 69 73 20 68 61 72 64  nce that is hard
97d0: 20 74 6f 20 6f 72 67 61 6e 69 7a 65 2c 20 0a 20   to organize, . 
97e0: 20 2a 2a 20 74 68 65 20 63 6f 64 65 20 61 63 74   ** the code act
97f0: 75 61 6c 6c 79 20 73 65 61 72 63 68 65 73 20 74  ually searches t
9800: 68 69 73 20 73 65 74 3a 0a 20 20 2a 2a 0a 20 20  his set:.  **.  
9810: 2a 2a 20 20 20 20 20 30 3a 20 28 61 29 20 0a 20  **     0: (a) . 
9820: 20 2a 2a 20 20 20 20 20 31 3a 20 28 61 2c 20 35   **     1: (a, 5
9830: 29 20 0a 20 20 2a 2a 20 20 20 20 20 32 3a 20 28  ) .  **     2: (
9840: 61 2c 20 31 30 29 20 0a 20 20 2a 2a 20 20 20 20  a, 10) .  **    
9850: 20 33 3a 20 28 61 2c 20 31 30 29 20 0a 20 20 2a   3: (a, 10) .  *
9860: 2a 20 20 20 20 20 34 3a 20 28 62 29 20 0a 20 20  *     4: (b) .  
9870: 2a 2a 20 20 20 20 20 35 3a 20 28 62 2c 20 35 29  **     5: (b, 5)
9880: 20 0a 20 20 2a 2a 20 20 20 20 20 36 3a 20 28 63   .  **     6: (c
9890: 29 20 0a 20 20 2a 2a 20 20 20 20 20 37 3a 20 28  ) .  **     7: (
98a0: 63 2c 20 31 30 30 29 20 0a 20 20 2a 2a 20 20 20  c, 100) .  **   
98b0: 20 20 38 3a 20 28 63 2c 20 31 30 35 29 0a 20 20    8: (c, 105).  
98c0: 2a 2a 20 20 20 20 20 39 3a 20 28 63 2c 20 31 30  **     9: (c, 10
98d0: 35 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72  5).  **.  ** For
98e0: 20 65 61 63 68 20 73 61 6d 70 6c 65 20 69 6e 20   each sample in 
98f0: 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61 72  the aSample[] ar
9900: 72 61 79 2c 20 4e 20 73 61 6d 70 6c 65 73 20 61  ray, N samples a
9910: 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  re present in th
9920: 65 0a 20 20 2a 2a 20 65 66 66 65 63 74 69 76 65  e.  ** effective
9930: 20 73 61 6d 70 6c 65 20 61 72 72 61 79 2e 20 49   sample array. I
9940: 6e 20 74 68 65 20 61 62 6f 76 65 2c 20 73 61 6d  n the above, sam
9950: 70 6c 65 73 20 30 20 61 6e 64 20 31 20 61 72 65  ples 0 and 1 are
9960: 20 62 61 73 65 64 20 6f 6e 20 0a 20 20 2a 2a 20   based on .  ** 
9970: 73 61 6d 70 6c 65 20 61 53 61 6d 70 6c 65 5b 30  sample aSample[0
9980: 5d 2e 20 53 61 6d 70 6c 65 73 20 32 20 61 6e 64  ]. Samples 2 and
9990: 20 33 20 6f 6e 20 61 53 61 6d 70 6c 65 5b 31 5d   3 on aSample[1]
99a0: 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   etc..  **.  ** 
99b0: 4f 66 74 65 6e 2c 20 73 61 6d 70 6c 65 20 69 20  Often, sample i 
99c0: 6f 66 20 65 61 63 68 20 62 6c 6f 63 6b 20 6f 66  of each block of
99d0: 20 4e 20 65 66 66 65 63 74 69 76 65 20 73 61 6d   N effective sam
99e0: 70 6c 65 73 20 68 61 73 20 28 69 2b 31 29 20 66  ples has (i+1) f
99f0: 69 65 6c 64 73 2e 0a 20 20 2a 2a 20 45 78 63 65  ields..  ** Exce
9a00: 70 74 2c 20 65 61 63 68 20 73 61 6d 70 6c 65 20  pt, each sample 
9a10: 6d 61 79 20 62 65 20 65 78 74 65 6e 64 65 64 20  may be extended 
9a20: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 69  to ensure that i
9a30: 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
9a40: 6e 20 6f 72 0a 20 20 2a 2a 20 65 71 75 61 6c 20  n or.  ** equal 
9a50: 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
9a60: 73 61 6d 70 6c 65 20 69 6e 20 74 68 65 20 61 72  sample in the ar
9a70: 72 61 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ray. For example
9a80: 2c 20 69 6e 20 74 68 65 20 61 62 6f 76 65 2c 20  , in the above, 
9a90: 0a 20 20 2a 2a 20 73 61 6d 70 6c 65 20 32 20 69  .  ** sample 2 i
9aa0: 73 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70  s the first samp
9ab0: 6c 65 20 6f 66 20 61 20 62 6c 6f 63 6b 20 6f 66  le of a block of
9ac0: 20 4e 20 73 61 6d 70 6c 65 73 2c 20 73 6f 20 61   N samples, so a
9ad0: 74 20 66 69 72 73 74 20 69 74 20 0a 20 20 2a 2a  t first it .  **
9ae0: 20 61 70 70 65 61 72 73 20 74 68 61 74 20 69 74   appears that it
9af0: 20 73 68 6f 75 6c 64 20 62 65 20 31 20 66 69 65   should be 1 fie
9b00: 6c 64 20 69 6e 20 73 69 7a 65 2e 20 48 6f 77 65  ld in size. Howe
9b10: 76 65 72 2c 20 74 68 61 74 20 77 6f 75 6c 64 20  ver, that would 
9b20: 6d 61 6b 65 20 69 74 20 0a 20 20 2a 2a 20 73 6d  make it .  ** sm
9b30: 61 6c 6c 65 72 20 74 68 61 6e 20 73 61 6d 70 6c  aller than sampl
9b40: 65 20 31 2c 20 73 6f 20 74 68 65 20 62 69 6e 61  e 1, so the bina
9b50: 72 79 20 73 65 61 72 63 68 20 77 6f 75 6c 64 20  ry search would 
9b60: 6e 6f 74 20 77 6f 72 6b 2e 20 41 73 20 61 20 72  not work. As a r
9b70: 65 73 75 6c 74 2c 20 0a 20 20 2a 2a 20 69 74 20  esult, .  ** it 
9b80: 69 73 20 65 78 74 65 6e 64 65 64 20 74 6f 20 74  is extended to t
9b90: 77 6f 20 66 69 65 6c 64 73 2e 20 54 68 65 20 64  wo fields. The d
9ba0: 75 70 6c 69 63 61 74 65 73 20 74 68 61 74 20 74  uplicates that t
9bb0: 68 69 73 20 63 72 65 61 74 65 73 20 64 6f 20 6e  his creates do n
9bc0: 6f 74 20 0a 20 20 2a 2a 20 63 61 75 73 65 20 61  ot .  ** cause a
9bd0: 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a  ny problems..  *
9be0: 2f 0a 20 20 6e 46 69 65 6c 64 20 3d 20 70 52 65  /.  nField = pRe
9bf0: 63 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 69 43 6f  c->nField;.  iCo
9c00: 6c 20 3d 20 30 3b 0a 20 20 69 53 61 6d 70 6c 65  l = 0;.  iSample
9c10: 20 3d 20 70 49 64 78 2d 3e 6e 53 61 6d 70 6c 65   = pIdx->nSample
9c20: 20 2a 20 6e 46 69 65 6c 64 3b 0a 20 20 64 6f 7b   * nField;.  do{
9c30: 0a 20 20 20 20 69 6e 74 20 69 53 61 6d 70 3b 20  .    int iSamp; 
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c50: 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61     /* Index in a
9c60: 53 61 6d 70 6c 65 5b 5d 20 6f 66 20 74 65 73 74  Sample[] of test
9c70: 20 73 61 6d 70 6c 65 20 2a 2f 0a 20 20 20 20 69   sample */.    i
9c80: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
9c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9ca0: 4e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  Number of fields
9cb0: 20 69 6e 20 74 65 73 74 20 73 61 6d 70 6c 65 20   in test sample 
9cc0: 2a 2f 0a 0a 20 20 20 20 69 54 65 73 74 20 3d 20  */..    iTest = 
9cd0: 28 69 4d 69 6e 2b 69 53 61 6d 70 6c 65 29 2f 32  (iMin+iSample)/2
9ce0: 3b 0a 20 20 20 20 69 53 61 6d 70 20 3d 20 69 54  ;.    iSamp = iT
9cf0: 65 73 74 20 2f 20 6e 46 69 65 6c 64 3b 0a 20 20  est / nField;.  
9d00: 20 20 69 66 28 20 69 53 61 6d 70 3e 30 20 29 7b    if( iSamp>0 ){
9d10: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72  .      /* The pr
9d20: 6f 70 6f 73 65 64 20 65 66 66 65 63 74 69 76 65  oposed effective
9d30: 20 73 61 6d 70 6c 65 20 69 73 20 61 20 70 72 65   sample is a pre
9d40: 66 69 78 20 6f 66 20 73 61 6d 70 6c 65 20 61 53  fix of sample aS
9d50: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 0a 20 20  ample[iSamp]..  
9d60: 20 20 20 20 2a 2a 20 53 70 65 63 69 66 69 63 61      ** Specifica
9d70: 6c 6c 79 2c 20 74 68 65 20 73 68 6f 72 74 65 73  lly, the shortes
9d80: 74 20 70 72 65 66 69 78 20 6f 66 20 61 74 20 6c  t prefix of at l
9d90: 65 61 73 74 20 28 31 20 2b 20 69 54 65 73 74 25  east (1 + iTest%
9da0: 6e 46 69 65 6c 64 29 20 0a 20 20 20 20 20 20 2a  nField) .      *
9db0: 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20 69 73  * fields that is
9dc0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
9dd0: 65 20 70 72 65 76 69 6f 75 73 20 65 66 66 65 63  e previous effec
9de0: 74 69 76 65 20 73 61 6d 70 6c 65 2e 20 20 2a 2f  tive sample.  */
9df0: 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 28 69 54  .      for(n=(iT
9e00: 65 73 74 20 25 20 6e 46 69 65 6c 64 29 20 2b 20  est % nField) + 
9e10: 31 3b 20 6e 3c 6e 46 69 65 6c 64 3b 20 6e 2b 2b  1; n<nField; n++
9e20: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
9e30: 53 61 6d 70 6c 65 5b 69 53 61 6d 70 2d 31 5d 2e  Sample[iSamp-1].
9e40: 61 6e 4c 74 5b 6e 2d 31 5d 21 3d 61 53 61 6d 70  anLt[n-1]!=aSamp
9e50: 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c 74 5b 6e  le[iSamp].anLt[n
9e60: 2d 31 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  -1] ) break;.   
9e70: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
9e80: 20 20 20 20 20 20 6e 20 3d 20 69 54 65 73 74 20        n = iTest 
9e90: 2b 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  + 1;.    }..    
9ea0: 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e  pRec->nField = n
9eb0: 3b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69  ;.    res = sqli
9ec0: 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
9ed0: 70 61 72 65 28 61 53 61 6d 70 6c 65 5b 69 53 61  pare(aSample[iSa
9ee0: 6d 70 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  mp].n, aSample[i
9ef0: 53 61 6d 70 5d 2e 70 2c 20 70 52 65 63 29 3b 0a  Samp].p, pRec);.
9f00: 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b      if( res<0 ){
9f10: 0a 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20  .      iLower = 
9f20: 61 53 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61  aSample[iSamp].a
9f30: 6e 4c 74 5b 6e 2d 31 5d 20 2b 20 61 53 61 6d 70  nLt[n-1] + aSamp
9f40: 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 45 71 5b 6e  le[iSamp].anEq[n
9f50: 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d 69 6e 20  -1];.      iMin 
9f60: 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20 20 20 7d  = iTest+1;.    }
9f70: 65 6c 73 65 20 69 66 28 20 72 65 73 3d 3d 30 20  else if( res==0 
9f80: 26 26 20 6e 3c 6e 46 69 65 6c 64 20 29 7b 0a 20  && n<nField ){. 
9f90: 20 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 61 53       iLower = aS
9fa0: 61 6d 70 6c 65 5b 69 53 61 6d 70 5d 2e 61 6e 4c  ample[iSamp].anL
9fb0: 74 5b 6e 2d 31 5d 3b 0a 20 20 20 20 20 20 69 4d  t[n-1];.      iM
9fc0: 69 6e 20 3d 20 69 54 65 73 74 2b 31 3b 0a 20 20  in = iTest+1;.  
9fd0: 20 20 20 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20      res = -1;.  
9fe0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
9ff0: 53 61 6d 70 6c 65 20 3d 20 69 54 65 73 74 3b 0a  Sample = iTest;.
a000: 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 6e 2d 31        iCol = n-1
a010: 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
a020: 28 20 72 65 73 20 26 26 20 69 4d 69 6e 3c 69 53  ( res && iMin<iS
a030: 61 6d 70 6c 65 20 29 3b 0a 20 20 69 20 3d 20 69  ample );.  i = i
a040: 53 61 6d 70 6c 65 20 2f 20 6e 46 69 65 6c 64 3b  Sample / nField;
a050: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
a060: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 66  DEBUG.  /* The f
a070: 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
a080: 73 74 61 74 65 6d 65 6e 74 73 20 63 68 65 63 6b  statements check
a090: 20 74 68 61 74 20 74 68 65 20 62 69 6e 61 72 79   that the binary
a0a0: 20 73 65 61 72 63 68 20 63 6f 64 65 0a 20 20 2a   search code.  *
a0b0: 2a 20 61 62 6f 76 65 20 66 6f 75 6e 64 20 74 68  * above found th
a0c0: 65 20 72 69 67 68 74 20 61 6e 73 77 65 72 2e 20  e right answer. 
a0d0: 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76 65  This block serve
a0e0: 73 20 6e 6f 20 70 75 72 70 6f 73 65 20 6f 74 68  s no purpose oth
a0f0: 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 74 6f 20  er.  ** than to 
a100: 69 6e 76 6f 6b 65 20 74 68 65 20 61 73 73 65 72  invoke the asser
a110: 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  ts.  */.  if( pP
a120: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
a130: 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Failed==0 ){.   
a140: 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
a150: 20 20 20 20 20 2f 2a 20 49 66 20 28 72 65 73 3d       /* If (res=
a160: 3d 30 29 20 69 73 20 74 72 75 65 2c 20 74 68 65  =0) is true, the
a170: 6e 20 70 52 65 63 20 6d 75 73 74 20 62 65 20 65  n pRec must be e
a180: 71 75 61 6c 20 74 6f 20 73 61 6d 70 6c 65 20 69  qual to sample i
a190: 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
a1a0: 74 28 20 69 3c 70 49 64 78 2d 3e 6e 53 61 6d 70  t( i<pIdx->nSamp
a1b0: 6c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  le );.      asse
a1c0: 72 74 28 20 69 43 6f 6c 3d 3d 6e 46 69 65 6c 64  rt( iCol==nField
a1d0: 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 52 65 63  -1 );.      pRec
a1e0: 2d 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c  ->nField = nFiel
a1f0: 64 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  d;.      assert(
a200: 20 30 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 52   0==sqlite3VdbeR
a210: 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61  ecordCompare(aSa
a220: 6d 70 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70  mple[i].n, aSamp
a230: 6c 65 5b 69 5d 2e 70 2c 20 70 52 65 63 29 20 0a  le[i].p, pRec) .
a240: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
a250: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
a260: 46 61 69 6c 65 64 20 0a 20 20 20 20 20 20 29 3b  Failed .      );
a270: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a280: 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69 3d 3d 70    /* Unless i==p
a290: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 2c 20 69 6e  Idx->nSample, in
a2a0: 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 70 52  dicating that pR
a2b0: 65 63 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  ec is larger tha
a2c0: 6e 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 73  n.      ** all s
a2d0: 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20 61 53  amples in the aS
a2e0: 61 6d 70 6c 65 5b 5d 20 61 72 72 61 79 2c 20 70  ample[] array, p
a2f0: 52 65 63 20 6d 75 73 74 20 62 65 20 73 6d 61 6c  Rec must be smal
a300: 6c 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 20  ler than the.   
a310: 20 20 20 2a 2a 20 28 69 43 6f 6c 2b 31 29 20 66     ** (iCol+1) f
a320: 69 65 6c 64 20 70 72 65 66 69 78 20 6f 66 20 73  ield prefix of s
a330: 61 6d 70 6c 65 20 69 2e 20 20 2a 2f 0a 20 20 20  ample i.  */.   
a340: 20 20 20 61 73 73 65 72 74 28 20 69 3c 3d 70 49     assert( i<=pI
a350: 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 26 26 20 69  dx->nSample && i
a360: 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65  >=0 );.      pRe
a370: 63 2d 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c  c->nField = iCol
a380: 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +1;.      assert
a390: 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 53 61 6d 70  ( i==pIdx->nSamp
a3a0: 6c 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  le .           |
a3b0: 7c 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  | sqlite3VdbeRec
a3c0: 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
a3d0: 6c 65 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65  le[i].n, aSample
a3e0: 5b 69 5d 2e 70 2c 20 70 52 65 63 29 3e 30 0a 20  [i].p, pRec)>0. 
a3f0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
a400: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
a410: 61 69 6c 65 64 20 29 3b 0a 0a 20 20 20 20 20 20  ailed );..      
a420: 2f 2a 20 69 66 20 69 3d 3d 30 20 61 6e 64 20 69  /* if i==0 and i
a430: 43 6f 6c 3d 3d 30 2c 20 74 68 65 6e 20 72 65 63  Col==0, then rec
a440: 6f 72 64 20 70 52 65 63 20 69 73 20 73 6d 61 6c  ord pRec is smal
a450: 6c 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61 6d  ler than all sam
a460: 70 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e  ples.      ** in
a470: 20 74 68 65 20 61 53 61 6d 70 6c 65 5b 5d 20 61   the aSample[] a
a480: 72 72 61 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  rray. Otherwise,
a490: 20 69 66 20 28 69 43 6f 6c 3e 30 29 20 74 68 65   if (iCol>0) the
a4a0: 6e 20 70 52 65 63 20 6d 75 73 74 0a 20 20 20 20  n pRec must.    
a4b0: 20 20 2a 2a 20 62 65 20 67 72 65 61 74 65 72 20    ** be greater 
a4c0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
a4d0: 20 74 68 65 20 28 69 43 6f 6c 29 20 66 69 65 6c   the (iCol) fiel
a4e0: 64 20 70 72 65 66 69 78 20 6f 66 20 73 61 6d 70  d prefix of samp
a4f0: 6c 65 20 69 2e 0a 20 20 20 20 20 20 2a 2a 20 49  le i..      ** I
a500: 66 20 28 69 3e 30 29 2c 20 74 68 65 6e 20 70 52  f (i>0), then pR
a510: 65 63 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  ec must also be 
a520: 67 72 65 61 74 65 72 20 74 68 61 6e 20 73 61 6d  greater than sam
a530: 70 6c 65 20 28 69 2d 31 29 2e 20 20 2a 2f 0a 20  ple (i-1).  */. 
a540: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20       if( iCol>0 
a550: 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d  ){.        pRec-
a560: 3e 6e 46 69 65 6c 64 20 3d 20 69 43 6f 6c 3b 0a  >nField = iCol;.
a570: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a580: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
a590: 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70 6c 65  dCompare(aSample
a5a0: 5b 69 5d 2e 6e 2c 20 61 53 61 6d 70 6c 65 5b 69  [i].n, aSample[i
a5b0: 5d 2e 70 2c 20 70 52 65 63 29 3c 3d 30 0a 20 20  ].p, pRec)<=0.  
a5c0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50             || pP
a5d0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
a5e0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
a5f0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e 30 20  }.      if( i>0 
a600: 29 7b 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d  ){.        pRec-
a610: 3e 6e 46 69 65 6c 64 20 3d 20 6e 46 69 65 6c 64  >nField = nField
a620: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
a630: 28 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  ( sqlite3VdbeRec
a640: 6f 72 64 43 6f 6d 70 61 72 65 28 61 53 61 6d 70  ordCompare(aSamp
a650: 6c 65 5b 69 2d 31 5d 2e 6e 2c 20 61 53 61 6d 70  le[i-1].n, aSamp
a660: 6c 65 5b 69 2d 31 5d 2e 70 2c 20 70 52 65 63 29  le[i-1].p, pRec)
a670: 3c 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  <0.             
a680: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
a690: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
a6a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
a6b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66  .#endif /* ifdef
a6c0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
a6d0: 0a 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29  ..  if( res==0 )
a6e0: 7b 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20  {.    /* Record 
a6f0: 70 52 65 63 20 69 73 20 65 71 75 61 6c 20 74 6f  pRec is equal to
a700: 20 73 61 6d 70 6c 65 20 69 20 2a 2f 0a 20 20 20   sample i */.   
a710: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3d 3d 6e   assert( iCol==n
a720: 46 69 65 6c 64 2d 31 20 29 3b 0a 20 20 20 20 61  Field-1 );.    a
a730: 53 74 61 74 5b 30 5d 20 3d 20 61 53 61 6d 70 6c  Stat[0] = aSampl
a740: 65 5b 69 5d 2e 61 6e 4c 74 5b 69 43 6f 6c 5d 3b  e[i].anLt[iCol];
a750: 0a 20 20 20 20 61 53 74 61 74 5b 31 5d 20 3d 20  .    aStat[1] = 
a760: 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e 45 71 5b  aSample[i].anEq[
a770: 69 43 6f 6c 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iCol];.  }else{.
a780: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
a790: 6f 69 6e 74 2c 20 74 68 65 20 28 69 43 6f 6c 2b  oint, the (iCol+
a7a0: 31 29 20 66 69 65 6c 64 20 70 72 65 66 69 78 20  1) field prefix 
a7b0: 6f 66 20 61 53 61 6d 70 6c 65 5b 69 5d 20 69 73  of aSample[i] is
a7c0: 20 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20   the first .    
a7d0: 2a 2a 20 73 61 6d 70 6c 65 20 74 68 61 74 20 69  ** sample that i
a7e0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 70  s greater than p
a7f0: 52 65 63 2e 20 4f 72 2c 20 69 66 20 69 3d 3d 70  Rec. Or, if i==p
a800: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 74 68 65  Idx->nSample the
a810: 6e 20 70 52 65 63 0a 20 20 20 20 2a 2a 20 69 73  n pRec.    ** is
a820: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c   larger than all
a830: 20 73 61 6d 70 6c 65 73 20 69 6e 20 74 68 65 20   samples in the 
a840: 61 72 72 61 79 2e 20 2a 2f 0a 20 20 20 20 74 52  array. */.    tR
a850: 6f 77 63 6e 74 20 69 55 70 70 65 72 2c 20 69 47  owcnt iUpper, iG
a860: 61 70 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 70  ap;.    if( i>=p
a870: 49 64 78 2d 3e 6e 53 61 6d 70 6c 65 20 29 7b 0a  Idx->nSample ){.
a880: 20 20 20 20 20 20 69 55 70 70 65 72 20 3d 20 73        iUpper = s
a890: 71 6c 69 74 65 33 4c 6f 67 45 73 74 54 6f 49 6e  qlite3LogEstToIn
a8a0: 74 28 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67  t(pIdx->aiRowLog
a8b0: 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c  Est[0]);.    }el
a8c0: 73 65 7b 0a 20 20 20 20 20 20 69 55 70 70 65 72  se{.      iUpper
a8d0: 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 61 6e   = aSample[i].an
a8e0: 4c 74 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a  Lt[iCol];.    }.
a8f0: 0a 20 20 20 20 69 66 28 20 69 4c 6f 77 65 72 3e  .    if( iLower>
a900: 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20  =iUpper ){.     
a910: 20 69 47 61 70 20 3d 20 30 3b 0a 20 20 20 20 7d   iGap = 0;.    }
a920: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 47 61 70  else{.      iGap
a930: 20 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77   = iUpper - iLow
a940: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  er;.    }.    if
a950: 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20  ( roundUp ){.   
a960: 20 20 20 69 47 61 70 20 3d 20 28 69 47 61 70 2a     iGap = (iGap*
a970: 32 29 2f 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  2)/3;.    }else{
a980: 0a 20 20 20 20 20 20 69 47 61 70 20 3d 20 69 47  .      iGap = iG
a990: 61 70 2f 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ap/3;.    }.    
a9a0: 61 53 74 61 74 5b 30 5d 20 3d 20 69 4c 6f 77 65  aStat[0] = iLowe
a9b0: 72 20 2b 20 69 47 61 70 3b 0a 20 20 20 20 61 53  r + iGap;.    aS
a9c0: 74 61 74 5b 31 5d 20 3d 20 70 49 64 78 2d 3e 61  tat[1] = pIdx->a
a9d0: 41 76 67 45 71 5b 6e 46 69 65 6c 64 2d 31 5d 3b  AvgEq[nField-1];
a9e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f  .  }..  /* Resto
a9f0: 72 65 20 74 68 65 20 70 52 65 63 2d 3e 6e 46 69  re the pRec->nFi
aa00: 65 6c 64 20 76 61 6c 75 65 20 62 65 66 6f 72 65  eld value before
aa10: 20 72 65 74 75 72 6e 69 6e 67 2e 20 20 2a 2f 0a   returning.  */.
aa20: 20 20 70 52 65 63 2d 3e 6e 46 69 65 6c 64 20 3d    pRec->nField =
aa30: 20 6e 46 69 65 6c 64 3b 0a 20 20 72 65 74 75 72   nField;.  retur
aa40: 6e 20 69 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n i;.}.#endif /*
aa50: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
aa60: 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f  TAT3_OR_STAT4 */
aa70: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73  ../*.** If it is
aa80: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 70 54 65 72 6d   not NULL, pTerm
aa90: 20 69 73 20 61 20 74 65 72 6d 20 74 68 61 74 20   is a term that 
aaa0: 70 72 6f 76 69 64 65 73 20 61 6e 20 75 70 70 65  provides an uppe
aab0: 72 20 6f 72 20 6c 6f 77 65 72 0a 2a 2a 20 62 6f  r or lower.** bo
aac0: 75 6e 64 20 6f 6e 20 61 20 72 61 6e 67 65 20 73  und on a range s
aad0: 63 61 6e 2e 20 57 69 74 68 6f 75 74 20 63 6f 6e  can. Without con
aae0: 73 69 64 65 72 69 6e 67 20 70 54 65 72 6d 2c 20  sidering pTerm, 
aaf0: 69 74 20 69 73 20 65 73 74 69 6d 61 74 65 64 20  it is estimated 
ab00: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 73 63 61  .** that the sca
ab10: 6e 20 77 69 6c 6c 20 76 69 73 69 74 20 6e 4e 65  n will visit nNe
ab20: 77 20 72 6f 77 73 2e 20 54 68 69 73 20 66 75 6e  w rows. This fun
ab30: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
ab40: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 65 73 74 69  e number.** esti
ab50: 6d 61 74 65 64 20 74 6f 20 62 65 20 76 69 73 69  mated to be visi
ab60: 74 65 64 20 61 66 74 65 72 20 74 61 6b 69 6e 67  ted after taking
ab70: 20 70 54 65 72 6d 20 69 6e 74 6f 20 61 63 63 6f   pTerm into acco
ab80: 75 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  unt..**.** If th
ab90: 65 20 75 73 65 72 20 65 78 70 6c 69 63 69 74 6c  e user explicitl
aba0: 79 20 73 70 65 63 69 66 69 65 64 20 61 20 6c 69  y specified a li
abb0: 6b 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65  kelihood() value
abc0: 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 2c 0a   for this term,.
abd0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  ** then the retu
abe0: 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
abf0: 6c 69 6b 65 6c 69 68 6f 6f 64 20 6d 75 6c 74 69  likelihood multi
ac00: 70 6c 69 65 64 20 62 79 20 74 68 65 20 6e 75 6d  plied by the num
ac10: 62 65 72 20 6f 66 0a 2a 2a 20 69 6e 70 75 74 20  ber of.** input 
ac20: 72 6f 77 73 2e 20 4f 74 68 65 72 77 69 73 65 2c  rows. Otherwise,
ac30: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
ac40: 73 73 75 6d 65 73 20 74 68 61 74 20 61 6e 20 22  ssumes that an "
ac50: 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 20 74 65 72  IS NOT NULL" ter
ac60: 6d 0a 2a 2a 20 68 61 73 20 61 20 6c 69 6b 65 6c  m.** has a likel
ac70: 69 68 6f 6f 64 20 6f 66 20 30 2e 35 30 2c 20 61  ihood of 0.50, a
ac80: 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 74 65 72  nd any other ter
ac90: 6d 20 61 20 6c 69 6b 65 6c 69 68 6f 6f 64 20 6f  m a likelihood o
aca0: 66 20 30 2e 32 35 2e 0a 2a 2f 0a 73 74 61 74 69  f 0.25..*/.stati
acb0: 63 20 4c 6f 67 45 73 74 20 77 68 65 72 65 52 61  c LogEst whereRa
acc0: 6e 67 65 41 64 6a 75 73 74 28 57 68 65 72 65 54  ngeAdjust(WhereT
acd0: 65 72 6d 20 2a 70 54 65 72 6d 2c 20 4c 6f 67 45  erm *pTerm, LogE
ace0: 73 74 20 6e 4e 65 77 29 7b 0a 20 20 4c 6f 67 45  st nNew){.  LogE
acf0: 73 74 20 6e 52 65 74 20 3d 20 6e 4e 65 77 3b 0a  st nRet = nNew;.
ad00: 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20    if( pTerm ){. 
ad10: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72     if( pTerm->tr
ad20: 75 74 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20  uthProb<=0 ){.  
ad30: 20 20 20 20 6e 52 65 74 20 2b 3d 20 70 54 65 72      nRet += pTer
ad40: 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3b 0a 20 20  m->truthProb;.  
ad50: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 54 65    }else if( (pTe
ad60: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
ad70: 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a  RM_VNULL)==0 ){.
ad80: 20 20 20 20 20 20 6e 52 65 74 20 2d 3d 20 32 30        nRet -= 20
ad90: 3b 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  ;        assert(
ada0: 20 32 30 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   20==sqlite3LogE
adb0: 73 74 28 34 29 20 29 3b 0a 20 20 20 20 7d 0a 20  st(4) );.    }. 
adc0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 74   }.  return nRet
add0: 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c  ;.}...#ifdef SQL
ade0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33  ITE_ENABLE_STAT3
adf0: 5f 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20  _OR_STAT4./*.** 
ae00: 52 65 74 75 72 6e 20 74 68 65 20 61 66 66 69 6e  Return the affin
ae10: 69 74 79 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  ity for a single
ae20: 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e   column of an in
ae30: 64 65 78 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c  dex..*/.char sql
ae40: 69 74 65 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41  ite3IndexColumnA
ae50: 66 66 69 6e 69 74 79 28 73 71 6c 69 74 65 33 20  ffinity(sqlite3 
ae60: 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  *db, Index *pIdx
ae70: 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 61  , int iCol){.  a
ae80: 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26  ssert( iCol>=0 &
ae90: 26 20 69 43 6f 6c 3c 70 49 64 78 2d 3e 6e 43 6f  & iCol<pIdx->nCo
aea0: 6c 75 6d 6e 20 29 3b 0a 20 20 69 66 28 20 21 70  lumn );.  if( !p
aeb0: 49 64 78 2d 3e 7a 43 6f 6c 41 66 66 20 29 7b 0a  Idx->zColAff ){.
aec0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49      if( sqlite3I
aed0: 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28  ndexAffinityStr(
aee0: 64 62 2c 20 70 49 64 78 29 3d 3d 30 20 29 20 72  db, pIdx)==0 ) r
aef0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
af00: 5f 42 4c 4f 42 3b 0a 20 20 7d 0a 20 20 72 65 74  _BLOB;.  }.  ret
af10: 75 72 6e 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66  urn pIdx->zColAf
af20: 66 5b 69 43 6f 6c 5d 3b 0a 7d 0a 23 65 6e 64 69  f[iCol];.}.#endi
af30: 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  f...#ifdef SQLIT
af40: 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
af50: 52 5f 53 54 41 54 34 0a 2f 2a 20 0a 2a 2a 20 54  R_STAT4./* .** T
af60: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
af70: 63 61 6c 6c 65 64 20 74 6f 20 65 73 74 69 6d 61  called to estima
af80: 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
af90: 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79   rows visited by
afa0: 20 61 0a 2a 2a 20 72 61 6e 67 65 2d 73 63 61 6e   a.** range-scan
afb0: 20 6f 6e 20 61 20 73 6b 69 70 2d 73 63 61 6e 20   on a skip-scan 
afc0: 69 6e 64 65 78 2e 20 46 6f 72 20 65 78 61 6d 70  index. For examp
afd0: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41  le:.**.**   CREA
afe0: 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e 20 74  TE INDEX i1 ON t
aff0: 31 28 61 2c 20 62 2c 20 63 29 3b 0a 2a 2a 20 20  1(a, b, c);.**  
b000: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
b010: 31 20 57 48 45 52 45 20 61 3d 3f 20 41 4e 44 20  1 WHERE a=? AND 
b020: 63 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20  c BETWEEN ? AND 
b030: 3f 3b 0a 2a 2a 0a 2a 2a 20 56 61 6c 75 65 20 70  ?;.**.** Value p
b040: 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 69 73 20 63 75  Loop->nOut is cu
b050: 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20 74  rrently set to t
b060: 68 65 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d  he estimated num
b070: 62 65 72 20 6f 66 20 72 6f 77 73 20 0a 2a 2a 20  ber of rows .** 
b080: 76 69 73 69 74 65 64 20 66 6f 72 20 73 63 61 6e  visited for scan
b090: 6e 69 6e 67 20 28 61 3d 3f 20 41 4e 44 20 62 3d  ning (a=? AND b=
b0a0: 3f 29 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ?). This functio
b0b0: 6e 20 72 65 64 75 63 65 73 20 74 68 61 74 20 65  n reduces that e
b0c0: 73 74 69 6d 61 74 65 20 0a 2a 2a 20 62 79 20 73  stimate .** by s
b0d0: 6f 6d 65 20 66 61 63 74 6f 72 20 74 6f 20 61 63  ome factor to ac
b0e0: 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 28 63  count for the (c
b0f0: 20 42 45 54 57 45 45 4e 20 3f 20 41 4e 44 20 3f   BETWEEN ? AND ?
b100: 29 20 65 78 70 72 65 73 73 69 6f 6e 20 62 61 73  ) expression bas
b110: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61  ed.** on the sta
b120: 74 34 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  t4 data for the 
b130: 69 6e 64 65 78 2e 20 74 68 69 73 20 73 63 61 6e  index. this scan
b140: 20 77 69 6c 6c 20 62 65 20 70 65 66 6f 72 6d 65   will be peforme
b150: 64 20 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74  d multiple .** t
b160: 69 6d 65 73 20 28 6f 6e 63 65 20 66 6f 72 20 65  imes (once for e
b170: 61 63 68 20 28 61 2c 62 29 20 63 6f 6d 62 69 6e  ach (a,b) combin
b180: 61 74 69 6f 6e 20 74 68 61 74 20 6d 61 74 63 68  ation that match
b190: 65 73 20 61 3d 3f 29 20 69 73 20 64 65 61 6c 74  es a=?) is dealt
b1a0: 20 77 69 74 68 20 0a 2a 2a 20 62 79 20 74 68 65   with .** by the
b1b0: 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   caller..**.** I
b1c0: 74 20 64 6f 65 73 20 74 68 69 73 20 62 79 20 73  t does this by s
b1d0: 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
b1e0: 61 6c 6c 20 73 74 61 74 34 20 73 61 6d 70 6c 65  all stat4 sample
b1f0: 73 2c 20 63 6f 6d 70 61 72 69 6e 67 20 76 61 6c  s, comparing val
b200: 75 65 73 0a 2a 2a 20 65 78 74 72 61 63 74 65 64  ues.** extracted
b210: 20 66 72 6f 6d 20 70 4c 6f 77 65 72 20 61 6e 64   from pLower and
b220: 20 70 55 70 70 65 72 20 77 69 74 68 20 74 68 65   pUpper with the
b230: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 63   corresponding c
b240: 6f 6c 75 6d 6e 20 69 6e 20 65 61 63 68 0a 2a 2a  olumn in each.**
b250: 20 73 61 6d 70 6c 65 2e 20 49 66 20 4c 20 61 6e   sample. If L an
b260: 64 20 55 20 61 72 65 20 74 68 65 20 6e 75 6d 62  d U are the numb
b270: 65 72 20 6f 66 20 73 61 6d 70 6c 65 73 20 66 6f  er of samples fo
b280: 75 6e 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74  und to be less t
b290: 68 61 6e 20 6f 72 0a 2a 2a 20 65 71 75 61 6c 20  han or.** equal 
b2a0: 74 6f 20 74 68 65 20 76 61 6c 75 65 73 20 65 78  to the values ex
b2b0: 74 72 61 63 74 65 64 20 66 72 6f 6d 20 70 4c 6f  tracted from pLo
b2c0: 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72  wer and pUpper r
b2d0: 65 73 70 65 63 74 69 76 65 6c 79 2c 20 61 6e 64  espectively, and
b2e0: 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 74 6f 74  .** N is the tot
b2f0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 6d  al number of sam
b300: 70 6c 65 73 2c 20 74 68 65 20 70 4c 6f 6f 70 2d  ples, the pLoop-
b310: 3e 6e 4f 75 74 20 76 61 6c 75 65 20 69 73 20 61  >nOut value is a
b320: 64 6a 75 73 74 65 64 0a 2a 2a 20 61 73 20 66 6f  djusted.** as fo
b330: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6e  llows:.**.**   n
b340: 4f 75 74 20 3d 20 6e 4f 75 74 20 2a 20 28 20 6d  Out = nOut * ( m
b350: 69 6e 28 55 20 2d 20 4c 2c 20 31 29 20 2f 20 4e  in(U - L, 1) / N
b360: 20 29 0a 2a 2a 0a 2a 2a 20 49 66 20 70 4c 6f 77   ).**.** If pLow
b370: 65 72 20 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 61  er is NULL, or a
b380: 20 76 61 6c 75 65 20 63 61 6e 6e 6f 74 20 62 65   value cannot be
b390: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
b3a0: 74 68 65 20 74 65 72 6d 2c 20 4c 20 69 73 0a 2a  the term, L is.*
b3b0: 2a 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 49  * set to zero. I
b3c0: 66 20 70 55 70 70 65 72 20 69 73 20 4e 55 4c 4c  f pUpper is NULL
b3d0: 2c 20 6f 72 20 61 20 76 61 6c 75 65 20 63 61 6e  , or a value can
b3e0: 6e 6f 74 20 62 65 20 65 78 74 72 61 63 74 65 64  not be extracted
b3f0: 20 66 72 6f 6d 20 69 74 2c 0a 2a 2a 20 55 20 69   from it,.** U i
b400: 73 20 73 65 74 20 74 6f 20 4e 2e 0a 2a 2a 0a 2a  s set to N..**.*
b410: 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73  * Normally, this
b420: 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 2a   function sets *
b430: 70 62 44 6f 6e 65 20 74 6f 20 31 20 62 65 66 6f  pbDone to 1 befo
b440: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 48 6f  re returning. Ho
b450: 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20 6e 6f 20  wever,.** if no 
b460: 76 61 6c 75 65 20 63 61 6e 20 62 65 20 65 78 74  value can be ext
b470: 72 61 63 74 65 64 20 66 72 6f 6d 20 65 69 74 68  racted from eith
b480: 65 72 20 70 4c 6f 77 65 72 20 6f 72 20 70 55 70  er pLower or pUp
b490: 70 65 72 20 28 61 6e 64 20 73 6f 20 74 68 65 0a  per (and so the.
b4a0: 2a 2a 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  ** estimate of t
b4b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
b4c0: 73 20 64 65 6c 69 76 65 72 65 64 20 72 65 6d 61  s delivered rema
b4d0: 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 29 2c 20  ins unchanged), 
b4e0: 2a 70 62 44 6f 6e 65 0a 2a 2a 20 69 73 20 6c 65  *pbDone.** is le
b4f0: 66 74 20 61 73 20 69 73 2e 0a 2a 2a 0a 2a 2a 20  ft as is..**.** 
b500: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
b510: 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  rs, an SQLite er
b520: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
b530: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
b540: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a   .** SQLITE_OK..
b550: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
b560: 65 72 65 52 61 6e 67 65 53 6b 69 70 53 63 61 6e  ereRangeSkipScan
b570: 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Est(.  Parse *pP
b580: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
b590: 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65  arsing & code ge
b5a0: 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
b5b0: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
b5c0: 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c 6f  *pLower,   /* Lo
b5d0: 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  wer bound on the
b5e0: 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e 31   range. ex: "x>1
b5f0: 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55 4c  23" Might be NUL
b600: 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  L */.  WhereTerm
b610: 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20 55   *pUpper,   /* U
b620: 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  pper bound on th
b630: 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3c  e range. ex: "x<
b640: 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e 55  455" Might be NU
b650: 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f  LL */.  WhereLoo
b660: 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 2f 2a 20  p *pLoop,    /* 
b670: 55 70 64 61 74 65 20 74 68 65 20 2e 6e 4f 75 74  Update the .nOut
b680: 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 6c   value of this l
b690: 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  oop */.  int *pb
b6a0: 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20 2f 2a  Done          /*
b6b0: 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
b6c0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 65 78 70  at least one exp
b6d0: 72 2e 20 76 61 6c 75 65 20 65 78 74 72 61 63 74  r. value extract
b6e0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  ed */.){.  Index
b6f0: 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62   *p = pLoop->u.b
b700: 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
b710: 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f 70 2d 3e  nt nEq = pLoop->
b720: 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20 20 73  u.btree.nEq;.  s
b730: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
b740: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 6e  rse->db;.  int n
b750: 4c 6f 77 65 72 20 3d 20 2d 31 3b 0a 20 20 69 6e  Lower = -1;.  in
b760: 74 20 6e 55 70 70 65 72 20 3d 20 70 2d 3e 6e 53  t nUpper = p->nS
b770: 61 6d 70 6c 65 2b 31 3b 0a 20 20 69 6e 74 20 72  ample+1;.  int r
b780: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
b790: 20 75 38 20 61 66 66 20 3d 20 73 71 6c 69 74 65   u8 aff = sqlite
b7a0: 33 49 6e 64 65 78 43 6f 6c 75 6d 6e 41 66 66 69  3IndexColumnAffi
b7b0: 6e 69 74 79 28 64 62 2c 20 70 2c 20 6e 45 71 29  nity(db, p, nEq)
b7c0: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
b7d0: 6c 6c 3b 0a 20 20 0a 20 20 73 71 6c 69 74 65 33  ll;.  .  sqlite3
b7e0: 5f 76 61 6c 75 65 20 2a 70 31 20 3d 20 30 3b 20  _value *p1 = 0; 
b7f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
b800: 65 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  e extracted from
b810: 20 70 4c 6f 77 65 72 20 2a 2f 0a 20 20 73 71 6c   pLower */.  sql
b820: 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 32 20 3d  ite3_value *p2 =
b830: 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
b840: 56 61 6c 75 65 20 65 78 74 72 61 63 74 65 64 20  Value extracted 
b850: 66 72 6f 6d 20 70 55 70 70 65 72 20 2a 2f 0a 20  from pUpper */. 
b860: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
b870: 70 56 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  pVal = 0;       
b880: 20 2f 2a 20 56 61 6c 75 65 20 65 78 74 72 61 63   /* Value extrac
b890: 74 65 64 20 66 72 6f 6d 20 72 65 63 6f 72 64 20  ted from record 
b8a0: 2a 2f 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71  */..  pColl = sq
b8b0: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
b8c0: 65 71 28 70 50 61 72 73 65 2c 20 70 2d 3e 61 7a  eq(pParse, p->az
b8d0: 43 6f 6c 6c 5b 6e 45 71 5d 29 3b 0a 20 20 69 66  Coll[nEq]);.  if
b8e0: 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20  ( pLower ){.    
b8f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74 61 74  rc = sqlite3Stat
b900: 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70  4ValueFromExpr(p
b910: 50 61 72 73 65 2c 20 70 4c 6f 77 65 72 2d 3e 70  Parse, pLower->p
b920: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66  Expr->pRight, af
b930: 66 2c 20 26 70 31 29 3b 0a 20 20 20 20 6e 4c 6f  f, &p1);.    nLo
b940: 77 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  wer = 0;.  }.  i
b950: 66 28 20 70 55 70 70 65 72 20 26 26 20 72 63 3d  f( pUpper && rc=
b960: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b970: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 74    rc = sqlite3St
b980: 61 74 34 56 61 6c 75 65 46 72 6f 6d 45 78 70 72  at4ValueFromExpr
b990: 28 70 50 61 72 73 65 2c 20 70 55 70 70 65 72 2d  (pParse, pUpper-
b9a0: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
b9b0: 61 66 66 2c 20 26 70 32 29 3b 0a 20 20 20 20 6e  aff, &p2);.    n
b9c0: 55 70 70 65 72 20 3d 20 70 32 20 3f 20 30 20 3a  Upper = p2 ? 0 :
b9d0: 20 70 2d 3e 6e 53 61 6d 70 6c 65 3b 0a 20 20 7d   p->nSample;.  }
b9e0: 0a 0a 20 20 69 66 28 20 70 31 20 7c 7c 20 70 32  ..  if( p1 || p2
b9f0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
ba00: 20 20 20 69 6e 74 20 6e 44 69 66 66 3b 0a 20 20     int nDiff;.  
ba10: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
ba20: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 2d  QLITE_OK && i<p-
ba30: 3e 6e 53 61 6d 70 6c 65 3b 20 69 2b 2b 29 7b 0a  >nSample; i++){.
ba40: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
ba50: 65 33 53 74 61 74 34 43 6f 6c 75 6d 6e 28 64 62  e3Stat4Column(db
ba60: 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d 2e  , p->aSample[i].
ba70: 70 2c 20 70 2d 3e 61 53 61 6d 70 6c 65 5b 69 5d  p, p->aSample[i]
ba80: 2e 6e 2c 20 6e 45 71 2c 20 26 70 56 61 6c 29 3b  .n, nEq, &pVal);
ba90: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
baa0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 31 20 29  QLITE_OK && p1 )
bab0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  {.        int re
bac0: 73 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  s = sqlite3MemCo
bad0: 6d 70 61 72 65 28 70 31 2c 20 70 56 61 6c 2c 20  mpare(p1, pVal, 
bae0: 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  pColl);.        
baf0: 69 66 28 20 72 65 73 3e 3d 30 20 29 20 6e 4c 6f  if( res>=0 ) nLo
bb00: 77 65 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  wer++;.      }. 
bb10: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
bb20: 49 54 45 5f 4f 4b 20 26 26 20 70 32 20 29 7b 0a  ITE_OK && p2 ){.
bb30: 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73 20          int res 
bb40: 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
bb50: 61 72 65 28 70 32 2c 20 70 56 61 6c 2c 20 70 43  are(p2, pVal, pC
bb60: 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oll);.        if
bb70: 28 20 72 65 73 3e 3d 30 20 29 20 6e 55 70 70 65  ( res>=0 ) nUppe
bb80: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r++;.      }.   
bb90: 20 7d 0a 20 20 20 20 6e 44 69 66 66 20 3d 20 28   }.    nDiff = (
bba0: 6e 55 70 70 65 72 20 2d 20 6e 4c 6f 77 65 72 29  nUpper - nLower)
bbb0: 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 66 66 3c  ;.    if( nDiff<
bbc0: 3d 30 20 29 20 6e 44 69 66 66 20 3d 20 31 3b 0a  =0 ) nDiff = 1;.
bbd0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
bbe0: 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70 65   is both an uppe
bbf0: 72 20 61 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e  r and lower boun
bc00: 64 20 73 70 65 63 69 66 69 65 64 2c 20 61 6e 64  d specified, and
bc10: 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 6d   the .    ** com
bc20: 70 61 72 69 73 6f 6e 73 20 69 6e 64 69 63 61 74  parisons indicat
bc30: 65 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  e that they are 
bc40: 63 6c 6f 73 65 20 74 6f 67 65 74 68 65 72 2c 20  close together, 
bc50: 75 73 65 20 74 68 65 20 66 61 6c 6c 62 61 63 6b  use the fallback
bc60: 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64 20 28  .    ** method (
bc70: 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20  assume that the 
bc80: 73 63 61 6e 20 76 69 73 69 74 73 20 31 2f 36 34  scan visits 1/64
bc90: 20 6f 66 20 74 68 65 20 72 6f 77 73 29 20 66 6f   of the rows) fo
bca0: 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 20 20 20  r estimating.   
bcb0: 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   ** the number o
bcc0: 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 2e 20  f rows visited. 
bcd0: 4f 74 68 65 72 77 69 73 65 2c 20 65 73 74 69 6d  Otherwise, estim
bce0: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
bcf0: 66 20 72 6f 77 73 0a 20 20 20 20 2a 2a 20 75 73  f rows.    ** us
bd00: 69 6e 67 20 74 68 65 20 6d 65 74 68 6f 64 20 64  ing the method d
bd10: 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20  escribed in the 
bd20: 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 66  header comment f
bd30: 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  or this function
bd40: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 44 69  . */.    if( nDi
bd50: 66 66 21 3d 31 20 7c 7c 20 70 55 70 70 65 72 3d  ff!=1 || pUpper=
bd60: 3d 30 20 7c 7c 20 70 4c 6f 77 65 72 3d 3d 30 20  =0 || pLower==0 
bd70: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 41 64  ){.      int nAd
bd80: 6a 75 73 74 20 3d 20 28 73 71 6c 69 74 65 33 4c  just = (sqlite3L
bd90: 6f 67 45 73 74 28 70 2d 3e 6e 53 61 6d 70 6c 65  ogEst(p->nSample
bda0: 29 20 2d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73  ) - sqlite3LogEs
bdb0: 74 28 6e 44 69 66 66 29 29 3b 0a 20 20 20 20 20  t(nDiff));.     
bdc0: 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2d 3d 20   pLoop->nOut -= 
bdd0: 6e 41 64 6a 75 73 74 3b 0a 20 20 20 20 20 20 2a  nAdjust;.      *
bde0: 70 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20  pbDone = 1;.    
bdf0: 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 31    WHERETRACE(0x1
be00: 30 2c 20 28 22 72 61 6e 67 65 20 73 6b 69 70 2d  0, ("range skip-
be10: 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 75  scan regions: %u
be20: 2e 2e 25 75 20 20 61 64 6a 75 73 74 3d 25 64 20  ..%u  adjust=%d 
be30: 65 73 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  est=%d\n",.     
be40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be50: 20 20 20 20 20 20 6e 4c 6f 77 65 72 2c 20 6e 55        nLower, nU
be60: 70 70 65 72 2c 20 6e 41 64 6a 75 73 74 2a 2d 31  pper, nAdjust*-1
be70: 2c 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 29 29 3b  , pLoop->nOut));
be80: 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b  .    }..  }else{
be90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 62  .    assert( *pb
bea0: 44 6f 6e 65 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  Done==0 );.  }..
beb0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
bec0: 65 65 28 70 31 29 3b 0a 20 20 73 71 6c 69 74 65  ee(p1);.  sqlite
bed0: 33 56 61 6c 75 65 46 72 65 65 28 70 32 29 3b 0a  3ValueFree(p2);.
bee0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
bef0: 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74  ee(pVal);..  ret
bf00: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
bf10: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
bf20: 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
bf30: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
bf40: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
bf50: 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
bf60: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
bf70: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73  that will be vis
bf80: 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e  ited.** by scann
bf90: 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72  ing an index for
bfa0: 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75   a range of valu
bfb0: 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61  es. The range ma
bfc0: 79 20 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a  y have an upper.
bfd0: 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65  ** bound, a lowe
bfe0: 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68  r bound, or both
bff0: 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  . The WHERE clau
c000: 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 73 65  se terms that se
c010: 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61  t the upper.** a
c020: 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20  nd lower bounds 
c030: 61 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 20  are represented 
c040: 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  by pLower and pU
c050: 70 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c  pper respectivel
c060: 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c  y. For.** exampl
c070: 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  e, assuming that
c080: 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74   index p is on t
c090: 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  1(a):.**.**   ..
c0a0: 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
c0b0: 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20  a > ? AND a < ? 
c0c0: 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
c0d0: 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f            |_____
c0e0: 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20  |   |_____|.**  
c0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c100: 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
c110: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
c120: 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20          pLower  
c130: 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49    pUpper.**.** I
c140: 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  f either of the 
c150: 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62  upper or lower b
c160: 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73  ound is not pres
c170: 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69  ent, then NULL i
c180: 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70  s passed in.** p
c190: 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72  lace of the corr
c1a0: 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54  esponding WhereT
c1b0: 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  erm..**.** The v
c1c0: 61 6c 75 65 20 69 6e 20 28 70 42 75 69 6c 64 65  alue in (pBuilde
c1d0: 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  r->pNew->u.btree
c1e0: 2e 6e 45 71 29 20 69 73 20 74 68 65 20 6e 75 6d  .nEq) is the num
c1f0: 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ber of the index
c200: 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 73 75 62 6a 65  .** column subje
c210: 63 74 20 74 6f 20 74 68 65 20 72 61 6e 67 65 20  ct to the range 
c220: 63 6f 6e 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20  constraint. Or, 
c230: 65 71 75 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68  equivalently, th
c240: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65  e number of.** e
c250: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
c260: 6e 74 73 20 6f 70 74 69 6d 69 7a 65 64 20 62 79  nts optimized by
c270: 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20 69 6e   the proposed in
c280: 64 65 78 20 73 63 61 6e 2e 20 46 6f 72 20 65 78  dex scan. For ex
c290: 61 6d 70 6c 65 2c 0a 2a 2a 20 61 73 73 75 6d 69  ample,.** assumi
c2a0: 6e 67 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e  ng index p is on
c2b0: 20 74 31 28 61 2c 20 62 29 2c 20 61 6e 64 20 74   t1(a, b), and t
c2c0: 68 65 20 53 51 4c 20 71 75 65 72 79 20 69 73 3a  he SQL query is:
c2d0: 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f  .**.**   ... FRO
c2e0: 4d 20 74 31 20 57 48 45 52 45 20 61 20 3d 20 3f  M t1 WHERE a = ?
c2f0: 20 41 4e 44 20 62 20 3e 20 3f 20 41 4e 44 20 62   AND b > ? AND b
c300: 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74   < ? ....**.** t
c310: 68 65 6e 20 6e 45 71 20 69 73 20 73 65 74 20 74  hen nEq is set t
c320: 6f 20 31 20 28 61 73 20 74 68 65 20 72 61 6e 67  o 1 (as the rang
c330: 65 20 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c  e restricted col
c340: 75 6d 6e 2c 20 62 2c 20 69 73 20 74 68 65 20 73  umn, b, is the s
c350: 65 63 6f 6e 64 20 0a 2a 2a 20 6c 65 66 74 2d 6d  econd .** left-m
c360: 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ost column of th
c370: 65 20 69 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66  e index). Or, if
c380: 20 74 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a   the query is:.*
c390: 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20  *.**   ... FROM 
c3a0: 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41  t1 WHERE a > ? A
c3b0: 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a  ND a < ? ....**.
c3c0: 2a 2a 20 74 68 65 6e 20 6e 45 71 20 69 73 20 73  ** then nEq is s
c3d0: 65 74 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 57  et to 0..**.** W
c3e0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
c3f0: 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e  n is called, *pn
c400: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  Out is set to th
c410: 65 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  e sqlite3LogEst(
c420: 29 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  ) of the.** numb
c430: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
c440: 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e 20 69  the index scan i
c450: 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 76 69  s expected to vi
c460: 73 69 74 20 77 69 74 68 6f 75 74 20 0a 2a 2a 20  sit without .** 
c470: 63 6f 6e 73 69 64 65 72 69 6e 67 20 74 68 65 20  considering the 
c480: 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
c490: 73 2e 20 49 66 20 6e 45 71 20 69 73 20 30 2c 20  s. If nEq is 0, 
c4a0: 74 68 65 6e 20 2a 70 6e 4f 75 74 20 69 73 20 74  then *pnOut is t
c4b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 2a 2a  he number of .**
c4c0: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 69 6e 64   rows in the ind
c4d0: 65 78 2e 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20  ex. Assuming no 
c4e0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70  error occurs, *p
c4f0: 6e 4f 75 74 20 69 73 20 61 64 6a 75 73 74 65 64  nOut is adjusted
c500: 20 28 72 65 64 75 63 65 64 29 0a 2a 2a 20 74 6f   (reduced).** to
c510: 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65   account for the
c520: 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
c530: 74 73 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  ts pLower and pU
c540: 70 70 65 72 2e 0a 2a 2a 20 0a 2a 2a 20 49 6e 20  pper..** .** In 
c550: 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73  the absence of s
c560: 71 6c 69 74 65 5f 73 74 61 74 34 20 41 4e 41 4c  qlite_stat4 ANAL
c570: 59 5a 45 20 64 61 74 61 2c 20 6f 72 20 69 66 20  YZE data, or if 
c580: 73 75 63 68 20 64 61 74 61 20 63 61 6e 6e 6f 74  such data cannot
c590: 20 62 65 0a 2a 2a 20 75 73 65 64 2c 20 61 20 73   be.** used, a s
c5a0: 69 6e 67 6c 65 20 72 61 6e 67 65 20 69 6e 65 71  ingle range ineq
c5b0: 75 61 6c 69 74 79 20 72 65 64 75 63 65 73 20 74  uality reduces t
c5c0: 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  he search space 
c5d0: 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 34  by a factor of 4
c5e0: 2e 20 0a 2a 2a 20 61 6e 64 20 61 20 70 61 69 72  . .** and a pair
c5f0: 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   of constraints 
c600: 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65  (x>? AND x<?) re
c610: 64 75 63 65 73 20 74 68 65 20 65 78 70 65 63 74  duces the expect
c620: 65 64 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  ed number of.** 
c630: 72 6f 77 73 20 76 69 73 69 74 65 64 20 62 79 20  rows visited by 
c640: 61 20 66 61 63 74 6f 72 20 6f 66 20 36 34 2e 0a  a factor of 64..
c650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
c660: 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28  ereRangeScanEst(
c670: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c680: 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
c690: 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
c6a0: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
c6b0: 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64    WhereLoopBuild
c6c0: 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20  er *pBuilder,.  
c6d0: 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65  WhereTerm *pLowe
c6e0: 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f  r,   /* Lower bo
c6f0: 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
c700: 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69  . ex: "x>123" Mi
c710: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
c720: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70   WhereTerm *pUpp
c730: 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62  er,   /* Upper b
c740: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
c750: 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d  e. ex: "x<455" M
c760: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
c770: 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
c780: 6f 70 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 79  op     /* Modify
c790: 20 74 68 65 20 2e 6e 4f 75 74 20 61 6e 64 20 6d   the .nOut and m
c7a0: 61 79 62 65 20 2e 72 52 75 6e 20 66 69 65 6c 64  aybe .rRun field
c7b0: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  s */.){.  int rc
c7c0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
c7d0: 69 6e 74 20 6e 4f 75 74 20 3d 20 70 4c 6f 6f 70  int nOut = pLoop
c7e0: 2d 3e 6e 4f 75 74 3b 0a 20 20 4c 6f 67 45 73 74  ->nOut;.  LogEst
c7f0: 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20 53   nNew;..#ifdef S
c800: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
c810: 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 49 6e  T3_OR_STAT4.  In
c820: 64 65 78 20 2a 70 20 3d 20 70 4c 6f 6f 70 2d 3e  dex *p = pLoop->
c830: 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a  u.btree.pIndex;.
c840: 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 6f 6f    int nEq = pLoo
c850: 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a  p->u.btree.nEq;.
c860: 0a 20 20 69 66 28 20 70 2d 3e 6e 53 61 6d 70 6c  .  if( p->nSampl
c870: 65 3e 30 20 26 26 20 6e 45 71 3c 70 2d 3e 6e 53  e>0 && nEq<p->nS
c880: 61 6d 70 6c 65 43 6f 6c 20 29 7b 0a 20 20 20 20  ampleCol ){.    
c890: 69 66 28 20 6e 45 71 3d 3d 70 42 75 69 6c 64 65  if( nEq==pBuilde
c8a0: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29 7b 0a  r->nRecValid ){.
c8b0: 20 20 20 20 20 20 55 6e 70 61 63 6b 65 64 52 65        UnpackedRe
c8c0: 63 6f 72 64 20 2a 70 52 65 63 20 3d 20 70 42 75  cord *pRec = pBu
c8d0: 69 6c 64 65 72 2d 3e 70 52 65 63 3b 0a 20 20 20  ilder->pRec;.   
c8e0: 20 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d 3b     tRowcnt a[2];
c8f0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 74 6d 20  .      int nBtm 
c900: 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
c910: 2e 6e 42 74 6d 3b 0a 20 20 20 20 20 20 69 6e 74  .nBtm;.      int
c920: 20 6e 54 6f 70 20 3d 20 70 4c 6f 6f 70 2d 3e 75   nTop = pLoop->u
c930: 2e 62 74 72 65 65 2e 6e 54 6f 70 3b 0a 0a 20 20  .btree.nTop;..  
c940: 20 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20      /* Variable 
c950: 69 4c 6f 77 65 72 20 77 69 6c 6c 20 62 65 20 73  iLower will be s
c960: 65 74 20 74 6f 20 74 68 65 20 65 73 74 69 6d 61  et to the estima
c970: 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  te of the number
c980: 20 6f 66 20 72 6f 77 73 20 69 6e 20 0a 20 20 20   of rows in .   
c990: 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20     ** the index 
c9a0: 74 68 61 74 20 61 72 65 20 6c 65 73 73 20 74 68  that are less th
c9b0: 61 6e 20 74 68 65 20 6c 6f 77 65 72 20 62 6f 75  an the lower bou
c9c0: 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20  nd of the range 
c9d0: 71 75 65 72 79 2e 20 54 68 65 0a 20 20 20 20 20  query. The.     
c9e0: 20 2a 2a 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20   ** lower bound 
c9f0: 62 65 69 6e 67 20 74 68 65 20 63 6f 6e 63 61 74  being the concat
ca00: 65 6e 61 74 69 6f 6e 20 6f 66 20 24 50 20 61 6e  enation of $P an
ca10: 64 20 24 4c 2c 20 77 68 65 72 65 20 24 50 20 69  d $L, where $P i
ca20: 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6b  s the.      ** k
ca30: 65 79 2d 70 72 65 66 69 78 20 66 6f 72 6d 65 64  ey-prefix formed
ca40: 20 62 79 20 74 68 65 20 6e 45 71 20 76 61 6c 75   by the nEq valu
ca50: 65 73 20 6d 61 74 63 68 65 64 20 61 67 61 69 6e  es matched again
ca60: 73 74 20 74 68 65 20 6e 45 71 20 6c 65 66 74 2d  st the nEq left-
ca70: 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f  most.      ** co
ca80: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64  lumns of the ind
ca90: 65 78 2c 20 61 6e 64 20 24 4c 20 69 73 20 74 68  ex, and $L is th
caa0: 65 20 76 61 6c 75 65 20 69 6e 20 70 4c 6f 77 65  e value in pLowe
cab0: 72 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  r..      **.    
cac0: 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 6f 77    ** Or, if pLow
cad0: 65 72 20 69 73 20 4e 55 4c 4c 20 6f 72 20 24 4c  er is NULL or $L
cae0: 20 63 61 6e 6e 6f 74 20 62 65 20 65 78 74 72 61   cannot be extra
caf0: 63 74 65 64 20 66 72 6f 6d 20 69 74 20 28 62 65  cted from it (be
cb00: 63 61 75 73 65 20 69 74 0a 20 20 20 20 20 20 2a  cause it.      *
cb10: 2a 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c  * is not a simpl
cb20: 65 20 76 61 72 69 61 62 6c 65 20 6f 72 20 6c 69  e variable or li
cb30: 74 65 72 61 6c 20 76 61 6c 75 65 29 2c 20 74 68  teral value), th
cb40: 65 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 6f 66  e lower bound of
cb50: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 61   the.      ** ra
cb60: 6e 67 65 20 69 73 20 24 50 2e 20 44 75 65 20 74  nge is $P. Due t
cb70: 6f 20 61 20 71 75 69 72 6b 20 69 6e 20 74 68 65  o a quirk in the
cb80: 20 77 61 79 20 77 68 65 72 65 4b 65 79 53 74 61   way whereKeySta
cb90: 74 73 28 29 20 77 6f 72 6b 73 2c 20 65 76 65 6e  ts() works, even
cba0: 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 24 4c 20  .      ** if $L 
cbb0: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 77 68  is available, wh
cbc0: 65 72 65 4b 65 79 53 74 61 74 73 28 29 20 69 73  ereKeyStats() is
cbd0: 20 63 61 6c 6c 65 64 20 66 6f 72 20 62 6f 74 68   called for both
cbe0: 20 28 24 50 29 20 61 6e 64 20 0a 20 20 20 20 20   ($P) and .     
cbf0: 20 2a 2a 20 28 24 50 3a 24 4c 29 20 61 6e 64 20   ** ($P:$L) and 
cc00: 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 74 68  the larger of th
cc10: 65 20 74 77 6f 20 72 65 74 75 72 6e 65 64 20 76  e two returned v
cc20: 61 6c 75 65 73 20 69 73 20 75 73 65 64 2e 0a 20  alues is used.. 
cc30: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
cc40: 20 53 69 6d 69 6c 61 72 6c 79 2c 20 69 55 70 70   Similarly, iUpp
cc50: 65 72 20 69 73 20 74 6f 20 62 65 20 73 65 74 20  er is to be set 
cc60: 74 6f 20 74 68 65 20 65 73 74 69 6d 61 74 65 20  to the estimate 
cc70: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
cc80: 20 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a 20 6c   rows.      ** l
cc90: 65 73 73 20 74 68 61 6e 20 74 68 65 20 75 70 70  ess than the upp
cca0: 65 72 20 62 6f 75 6e 64 20 6f 66 20 74 68 65 20  er bound of the 
ccb0: 72 61 6e 67 65 20 71 75 65 72 79 2e 20 57 68 65  range query. Whe
ccc0: 72 65 20 74 68 65 20 75 70 70 65 72 20 62 6f 75  re the upper bou
ccd0: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65  nd.      ** is e
cce0: 69 74 68 65 72 20 28 24 50 29 20 6f 72 20 28 24  ither ($P) or ($
ccf0: 50 3a 24 55 29 2e 20 41 67 61 69 6e 2c 20 65 76  P:$U). Again, ev
cd00: 65 6e 20 69 66 20 24 55 20 69 73 20 61 76 61 69  en if $U is avai
cd10: 6c 61 62 6c 65 2c 20 62 6f 74 68 20 76 61 6c 75  lable, both valu
cd20: 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 69  es.      ** of i
cd30: 55 70 70 65 72 20 61 72 65 20 72 65 71 75 65 73  Upper are reques
cd40: 74 65 64 20 6f 66 20 77 68 65 72 65 4b 65 79 53  ted of whereKeyS
cd50: 74 61 74 73 28 29 20 61 6e 64 20 74 68 65 20 73  tats() and the s
cd60: 6d 61 6c 6c 65 72 20 75 73 65 64 2e 0a 20 20 20  maller used..   
cd70: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
cd80: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
cd90: 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  s between the tw
cda0: 6f 20 62 6f 75 6e 64 73 20 69 73 20 74 68 65 6e  o bounds is then
cdb0: 20 6a 75 73 74 20 69 55 70 70 65 72 2d 69 4c 6f   just iUpper-iLo
cdc0: 77 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  wer..      */.  
cdd0: 20 20 20 20 74 52 6f 77 63 6e 74 20 69 4c 6f 77      tRowcnt iLow
cde0: 65 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73 20  er;     /* Rows 
cdf0: 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6c 6f  less than the lo
ce00: 77 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20  wer bound */.   
ce10: 20 20 20 74 52 6f 77 63 6e 74 20 69 55 70 70 65     tRowcnt iUppe
ce20: 72 3b 20 20 20 20 20 2f 2a 20 52 6f 77 73 20 6c  r;     /* Rows l
ce30: 65 73 73 20 74 68 61 6e 20 74 68 65 20 75 70 70  ess than the upp
ce40: 65 72 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20  er bound */.    
ce50: 20 20 69 6e 74 20 69 4c 77 72 49 64 78 20 3d 20    int iLwrIdx = 
ce60: 2d 32 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65  -2;   /* aSample
ce70: 5b 5d 20 66 6f 72 20 74 68 65 20 6c 6f 77 65 72  [] for the lower
ce80: 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   bound */.      
ce90: 69 6e 74 20 69 55 70 72 49 64 78 20 3d 20 2d 31  int iUprIdx = -1
cea0: 3b 20 20 20 2f 2a 20 61 53 61 6d 70 6c 65 5b 5d  ;   /* aSample[]
ceb0: 20 66 6f 72 20 74 68 65 20 75 70 70 65 72 20 62   for the upper b
cec0: 6f 75 6e 64 20 2a 2f 0a 0a 20 20 20 20 20 20 69  ound */..      i
ced0: 66 28 20 70 52 65 63 20 29 7b 0a 20 20 20 20 20  f( pRec ){.     
cee0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 65     testcase( pRe
cef0: 63 2d 3e 6e 46 69 65 6c 64 21 3d 70 42 75 69 6c  c->nField!=pBuil
cf00: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 20 29  der->nRecValid )
cf10: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 63 2d 3e  ;.        pRec->
cf20: 6e 46 69 65 6c 64 20 3d 20 70 42 75 69 6c 64 65  nField = pBuilde
cf30: 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b 0a 20 20  r->nRecValid;.  
cf40: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 44      }.      /* D
cf50: 65 74 65 72 6d 69 6e 65 20 69 4c 6f 77 65 72 20  etermine iLower 
cf60: 61 6e 64 20 69 55 70 70 65 72 20 75 73 69 6e 67  and iUpper using
cf70: 20 28 24 50 29 20 6f 6e 6c 79 2e 20 2a 2f 0a 20   ($P) only. */. 
cf80: 20 20 20 20 20 69 66 28 20 6e 45 71 3d 3d 30 20       if( nEq==0 
cf90: 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 6f 77 65  ){.        iLowe
cfa0: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  r = 0;.        i
cfb0: 55 70 70 65 72 20 3d 20 70 2d 3e 6e 52 6f 77 45  Upper = p->nRowE
cfc0: 73 74 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  st0;.      }else
cfd0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74  {.        /* Not
cfe0: 65 3a 20 74 68 69 73 20 63 61 6c 6c 20 63 6f 75  e: this call cou
cff0: 6c 64 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20  ld be optimized 
d000: 61 77 61 79 20 2d 20 73 69 6e 63 65 20 74 68 65  away - since the
d010: 20 73 61 6d 65 20 76 61 6c 75 65 73 20 6d 75 73   same values mus
d020: 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61  t .        ** ha
d030: 76 65 20 62 65 65 6e 20 72 65 71 75 65 73 74 65  ve been requeste
d040: 64 20 77 68 65 6e 20 74 65 73 74 69 6e 67 20 6b  d when testing k
d050: 65 79 20 24 50 20 69 6e 20 77 68 65 72 65 45 71  ey $P in whereEq
d060: 75 61 6c 53 63 61 6e 45 73 74 28 29 2e 20 20 2a  ualScanEst().  *
d070: 2f 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 4b  /.        whereK
d080: 65 79 53 74 61 74 73 28 70 50 61 72 73 65 2c 20  eyStats(pParse, 
d090: 70 2c 20 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a  p, pRec, 0, a);.
d0a0: 20 20 20 20 20 20 20 20 69 4c 6f 77 65 72 20 3d          iLower =
d0b0: 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69   a[0];.        i
d0c0: 55 70 70 65 72 20 3d 20 61 5b 30 5d 20 2b 20 61  Upper = a[0] + a
d0d0: 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  [1];.      }..  
d0e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 77      assert( pLow
d0f0: 65 72 3d 3d 30 20 7c 7c 20 28 70 4c 6f 77 65 72  er==0 || (pLower
d100: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
d110: 4f 5f 47 54 7c 57 4f 5f 47 45 29 29 21 3d 30 20  O_GT|WO_GE))!=0 
d120: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
d130: 20 70 55 70 70 65 72 3d 3d 30 20 7c 7c 20 28 70   pUpper==0 || (p
d140: 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72  Upper->eOperator
d150: 20 26 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29   & (WO_LT|WO_LE)
d160: 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  )!=0 );.      as
d170: 73 65 72 74 28 20 70 2d 3e 61 53 6f 72 74 4f 72  sert( p->aSortOr
d180: 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  der!=0 );.      
d190: 69 66 28 20 70 2d 3e 61 53 6f 72 74 4f 72 64 65  if( p->aSortOrde
d1a0: 72 5b 6e 45 71 5d 20 29 7b 0a 20 20 20 20 20 20  r[nEq] ){.      
d1b0: 20 20 2f 2a 20 54 68 65 20 72 6f 6c 65 73 20 6f    /* The roles o
d1c0: 66 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55 70  f pLower and pUp
d1d0: 70 65 72 20 61 72 65 20 73 77 61 70 70 65 64 20  per are swapped 
d1e0: 66 6f 72 20 61 20 44 45 53 43 20 69 6e 64 65 78  for a DESC index
d1f0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 57 41 50   */.        SWAP
d200: 28 57 68 65 72 65 54 65 72 6d 2a 2c 20 70 4c 6f  (WhereTerm*, pLo
d210: 77 65 72 2c 20 70 55 70 70 65 72 29 3b 0a 20 20  wer, pUpper);.  
d220: 20 20 20 20 20 20 53 57 41 50 28 69 6e 74 2c 20        SWAP(int, 
d230: 6e 42 74 6d 2c 20 6e 54 6f 70 29 3b 0a 20 20 20  nBtm, nTop);.   
d240: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
d250: 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72  f possible, impr
d260: 6f 76 65 20 6f 6e 20 74 68 65 20 69 4c 6f 77 65  ove on the iLowe
d270: 72 20 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67  r estimate using
d280: 20 28 24 50 3a 24 4c 29 2e 20 2a 2f 0a 20 20 20   ($P:$L). */.   
d290: 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b     if( pLower ){
d2a0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 20  .        int n; 
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2c0: 20 20 20 2f 2a 20 56 61 6c 75 65 73 20 65 78 74     /* Values ext
d2d0: 72 61 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70  racted from pExp
d2e0: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70  r */.        Exp
d2f0: 72 20 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65  r *pExpr = pLowe
d300: 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r->pExpr->pRight
d310: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
d320: 71 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65  qlite3Stat4Probe
d330: 53 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c  SetValue(pParse,
d340: 20 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72   p, &pRec, pExpr
d350: 2c 20 6e 42 74 6d 2c 20 6e 45 71 2c 20 26 6e 29  , nBtm, nEq, &n)
d360: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
d370: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
d380: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 52   ){.          tR
d390: 6f 77 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20  owcnt iNew;.    
d3a0: 20 20 20 20 20 20 75 31 36 20 6d 61 73 6b 20 3d        u16 mask =
d3b0: 20 57 4f 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20 20   WO_GT|WO_LE;.  
d3c0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
d3d0: 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
d3e0: 65 28 70 45 78 70 72 29 3e 6e 20 29 20 6d 61 73  e(pExpr)>n ) mas
d3f0: 6b 20 3d 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c 54  k = (WO_LE|WO_LT
d400: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4c 77  );.          iLw
d410: 72 49 64 78 20 3d 20 77 68 65 72 65 4b 65 79 53  rIdx = whereKeyS
d420: 74 61 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20  tats(pParse, p, 
d430: 70 52 65 63 2c 20 30 2c 20 61 29 3b 0a 20 20 20  pRec, 0, a);.   
d440: 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b         iNew = a[
d450: 30 5d 20 2b 20 28 28 70 4c 6f 77 65 72 2d 3e 65  0] + ((pLower->e
d460: 4f 70 65 72 61 74 6f 72 20 26 20 6d 61 73 6b 29  Operator & mask)
d470: 20 3f 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20   ? a[1] : 0);.  
d480: 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
d490: 3e 69 4c 6f 77 65 72 20 29 20 69 4c 6f 77 65 72  >iLower ) iLower
d4a0: 20 3d 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20   = iNew;.       
d4b0: 20 20 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20     nOut--;.     
d4c0: 20 20 20 20 20 70 4c 6f 77 65 72 20 3d 20 30 3b       pLower = 0;
d4d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d4e0: 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
d4f0: 70 6f 73 73 69 62 6c 65 2c 20 69 6d 70 72 6f 76  possible, improv
d500: 65 20 6f 6e 20 74 68 65 20 69 55 70 70 65 72 20  e on the iUpper 
d510: 65 73 74 69 6d 61 74 65 20 75 73 69 6e 67 20 28  estimate using (
d520: 24 50 3a 24 55 29 2e 20 2a 2f 0a 20 20 20 20 20  $P:$U). */.     
d530: 20 69 66 28 20 70 55 70 70 65 72 20 29 7b 0a 20   if( pUpper ){. 
d540: 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 20 20 20         int n;   
d550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d560: 20 2f 2a 20 56 61 6c 75 65 73 20 65 78 74 72 61   /* Values extra
d570: 63 74 65 64 20 66 72 6f 6d 20 70 45 78 70 72 20  cted from pExpr 
d580: 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  */.        Expr 
d590: 2a 70 45 78 70 72 20 3d 20 70 55 70 70 65 72 2d  *pExpr = pUpper-
d5a0: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
d5b0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
d5c0: 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53 65  ite3Stat4ProbeSe
d5d0: 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20 70  tValue(pParse, p
d5e0: 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c 20  , &pRec, pExpr, 
d5f0: 6e 54 6f 70 2c 20 6e 45 71 2c 20 26 6e 29 3b 0a  nTop, nEq, &n);.
d600: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
d610: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 20 29  SQLITE_OK && n )
d620: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 52 6f 77  {.          tRow
d630: 63 6e 74 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  cnt iNew;.      
d640: 20 20 20 20 75 31 36 20 6d 61 73 6b 20 3d 20 57      u16 mask = W
d650: 4f 5f 47 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20  O_GT|WO_LE;.    
d660: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
d670: 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
d680: 70 45 78 70 72 29 3e 6e 20 29 20 6d 61 73 6b 20  pExpr)>n ) mask 
d690: 3d 20 28 57 4f 5f 4c 45 7c 57 4f 5f 4c 54 29 3b  = (WO_LE|WO_LT);
d6a0: 0a 20 20 20 20 20 20 20 20 20 20 69 55 70 72 49  .          iUprI
d6b0: 64 78 20 3d 20 77 68 65 72 65 4b 65 79 53 74 61  dx = whereKeySta
d6c0: 74 73 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52  ts(pParse, p, pR
d6d0: 65 63 2c 20 31 2c 20 61 29 3b 0a 20 20 20 20 20  ec, 1, a);.     
d6e0: 20 20 20 20 20 69 4e 65 77 20 3d 20 61 5b 30 5d       iNew = a[0]
d6f0: 20 2b 20 28 28 70 55 70 70 65 72 2d 3e 65 4f 70   + ((pUpper->eOp
d700: 65 72 61 74 6f 72 20 26 20 6d 61 73 6b 29 20 3f  erator & mask) ?
d710: 20 61 5b 31 5d 20 3a 20 30 29 3b 0a 20 20 20 20   a[1] : 0);.    
d720: 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 3c 69        if( iNew<i
d730: 55 70 70 65 72 20 29 20 69 55 70 70 65 72 20 3d  Upper ) iUpper =
d740: 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20   iNew;.         
d750: 20 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20   nOut--;.       
d760: 20 20 20 70 55 70 70 65 72 20 3d 20 30 3b 0a 20     pUpper = 0;. 
d770: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
d780: 0a 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65 72  ..      pBuilder
d790: 2d 3e 70 52 65 63 20 3d 20 70 52 65 63 3b 0a 20  ->pRec = pRec;. 
d7a0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
d7b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
d7c0: 20 20 69 66 28 20 69 55 70 70 65 72 3e 69 4c 6f    if( iUpper>iLo
d7d0: 77 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wer ){.         
d7e0: 20 6e 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4c   nNew = sqlite3L
d7f0: 6f 67 45 73 74 28 69 55 70 70 65 72 20 2d 20 69  ogEst(iUpper - i
d800: 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Lower);.        
d810: 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20 49 66    /* TUNING:  If
d820: 20 62 6f 74 68 20 69 55 70 70 65 72 20 61 6e 64   both iUpper and
d830: 20 69 4c 6f 77 65 72 20 61 72 65 20 64 65 72 69   iLower are deri
d840: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 73 61 6d  ved from the sam
d850: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  e.          ** s
d860: 61 6d 70 6c 65 2c 20 74 68 65 6e 20 61 73 73 75  ample, then assu
d870: 6d 65 20 74 68 65 79 20 61 72 65 20 34 78 20 6d  me they are 4x m
d880: 6f 72 65 20 73 65 6c 65 63 74 69 76 65 2e 20 20  ore selective.  
d890: 54 68 69 73 20 62 72 69 6e 67 73 0a 20 20 20 20  This brings.    
d8a0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65 73 74        ** the est
d8b0: 69 6d 61 74 65 64 20 73 65 6c 65 63 74 69 76 69  imated selectivi
d8c0: 74 79 20 6d 6f 72 65 20 69 6e 20 6c 69 6e 65 20  ty more in line 
d8d0: 77 69 74 68 20 77 68 61 74 20 69 74 20 77 6f 75  with what it wou
d8e0: 6c 64 20 62 65 0a 20 20 20 20 20 20 20 20 20 20  ld be.          
d8f0: 2a 2a 20 69 66 20 65 73 74 69 6d 61 74 65 64 20  ** if estimated 
d900: 77 69 74 68 6f 75 74 20 74 68 65 20 75 73 65 20  without the use 
d910: 6f 66 20 53 54 41 54 33 2f 34 20 74 61 62 6c 65  of STAT3/4 table
d920: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
d930: 69 66 28 20 69 4c 77 72 49 64 78 3d 3d 69 55 70  if( iLwrIdx==iUp
d940: 72 49 64 78 20 29 20 6e 4e 65 77 20 2d 3d 20 32  rIdx ) nNew -= 2
d950: 30 3b 20 20 61 73 73 65 72 74 28 20 32 30 3d 3d  0;  assert( 20==
d960: 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 34 29  sqlite3LogEst(4)
d970: 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   );.        }els
d980: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4e 65  e{.          nNe
d990: 77 20 3d 20 31 30 3b 20 20 20 20 20 20 20 20 61  w = 10;        a
d9a0: 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74  ssert( 10==sqlit
d9b0: 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20  e3LogEst(2) );. 
d9c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d9d0: 20 69 66 28 20 6e 4e 65 77 3c 6e 4f 75 74 20 29   if( nNew<nOut )
d9e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4f 75 74  {.          nOut
d9f0: 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20   = nNew;.       
da00: 20 7d 0a 20 20 20 20 20 20 20 20 57 48 45 52 45   }.        WHERE
da10: 54 52 41 43 45 28 30 78 31 30 2c 20 28 22 53 54  TRACE(0x10, ("ST
da20: 41 54 34 20 72 61 6e 67 65 20 73 63 61 6e 3a 20  AT4 range scan: 
da30: 25 75 2e 2e 25 75 20 20 65 73 74 3d 25 64 5c 6e  %u..%u  est=%d\n
da40: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
da50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
da60: 33 32 29 69 4c 6f 77 65 72 2c 20 28 75 33 32 29  32)iLower, (u32)
da70: 69 55 70 70 65 72 2c 20 6e 4f 75 74 29 29 3b 0a  iUpper, nOut));.
da80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
da90: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44 6f  e{.      int bDo
daa0: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  ne = 0;.      rc
dab0: 20 3d 20 77 68 65 72 65 52 61 6e 67 65 53 6b 69   = whereRangeSki
dac0: 70 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  pScanEst(pParse,
dad0: 20 70 4c 6f 77 65 72 2c 20 70 55 70 70 65 72 2c   pLower, pUpper,
dae0: 20 70 4c 6f 6f 70 2c 20 26 62 44 6f 6e 65 29 3b   pLoop, &bDone);
daf0: 0a 20 20 20 20 20 20 69 66 28 20 62 44 6f 6e 65  .      if( bDone
db00: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
db10: 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20    }.  }.#else.  
db20: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
db30: 28 70 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53  (pParse);.  UNUS
db40: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 42 75  ED_PARAMETER(pBu
db50: 69 6c 64 65 72 29 3b 0a 20 20 61 73 73 65 72 74  ilder);.  assert
db60: 28 20 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70  ( pLower || pUpp
db70: 65 72 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  er );.#endif.  a
db80: 73 73 65 72 74 28 20 70 55 70 70 65 72 3d 3d 30  ssert( pUpper==0
db90: 20 7c 7c 20 28 70 55 70 70 65 72 2d 3e 77 74 46   || (pUpper->wtF
dba0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
dbb0: 4c 29 3d 3d 30 20 29 3b 0a 20 20 6e 4e 65 77 20  L)==0 );.  nNew 
dbc0: 3d 20 77 68 65 72 65 52 61 6e 67 65 41 64 6a 75  = whereRangeAdju
dbd0: 73 74 28 70 4c 6f 77 65 72 2c 20 6e 4f 75 74 29  st(pLower, nOut)
dbe0: 3b 0a 20 20 6e 4e 65 77 20 3d 20 77 68 65 72 65  ;.  nNew = where
dbf0: 52 61 6e 67 65 41 64 6a 75 73 74 28 70 55 70 70  RangeAdjust(pUpp
dc00: 65 72 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 2f 2a  er, nNew);..  /*
dc10: 20 54 55 4e 49 4e 47 3a 20 49 66 20 74 68 65 72   TUNING: If ther
dc20: 65 20 69 73 20 62 6f 74 68 20 61 6e 20 75 70 70  e is both an upp
dc30: 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 6c 69 6d  er and lower lim
dc40: 69 74 20 61 6e 64 20 6e 65 69 74 68 65 72 20 6c  it and neither l
dc50: 69 6d 69 74 0a 20 20 2a 2a 20 68 61 73 20 61 6e  imit.  ** has an
dc60: 20 61 70 70 6c 69 63 61 74 69 6f 6e 2d 64 65 66   application-def
dc70: 69 6e 65 64 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  ined likelihood(
dc80: 29 2c 20 61 73 73 75 6d 65 20 74 68 65 20 72 61  ), assume the ra
dc90: 6e 67 65 20 69 73 0a 20 20 2a 2a 20 72 65 64 75  nge is.  ** redu
dca0: 63 65 64 20 62 79 20 61 6e 20 61 64 64 69 74 69  ced by an additi
dcb0: 6f 6e 61 6c 20 37 35 25 2e 20 54 68 69 73 20 6d  onal 75%. This m
dcc0: 65 61 6e 73 20 74 68 61 74 2c 20 62 79 20 64 65  eans that, by de
dcd0: 66 61 75 6c 74 2c 20 61 6e 20 6f 70 65 6e 2d 65  fault, an open-e
dce0: 6e 64 65 64 0a 20 20 2a 2a 20 72 61 6e 67 65 20  nded.  ** range 
dcf0: 71 75 65 72 79 20 28 65 2e 67 2e 20 63 6f 6c 20  query (e.g. col 
dd00: 3e 20 3f 29 20 69 73 20 61 73 73 75 6d 65 64 20  > ?) is assumed 
dd10: 74 6f 20 6d 61 74 63 68 20 31 2f 34 20 6f 66 20  to match 1/4 of 
dd20: 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 0a  the rows in the.
dd30: 20 20 2a 2a 20 69 6e 64 65 78 2e 20 57 68 69 6c    ** index. Whil
dd40: 65 20 61 20 63 6c 6f 73 65 64 20 72 61 6e 67 65  e a closed range
dd50: 20 28 65 2e 67 2e 20 63 6f 6c 20 42 45 54 57 45   (e.g. col BETWE
dd60: 45 4e 20 3f 20 41 4e 44 20 3f 29 20 69 73 20 65  EN ? AND ?) is e
dd70: 73 74 69 6d 61 74 65 64 20 74 6f 0a 20 20 2a 2a  stimated to.  **
dd80: 20 6d 61 74 63 68 20 31 2f 36 34 20 6f 66 20 74   match 1/64 of t
dd90: 68 65 20 69 6e 64 65 78 2e 20 2a 2f 20 0a 20 20  he index. */ .  
dda0: 69 66 28 20 70 4c 6f 77 65 72 20 26 26 20 70 4c  if( pLower && pL
ddb0: 6f 77 65 72 2d 3e 74 72 75 74 68 50 72 6f 62 3e  ower->truthProb>
ddc0: 30 20 26 26 20 70 55 70 70 65 72 20 26 26 20 70  0 && pUpper && p
ddd0: 55 70 70 65 72 2d 3e 74 72 75 74 68 50 72 6f 62  Upper->truthProb
dde0: 3e 30 20 29 7b 0a 20 20 20 20 6e 4e 65 77 20 2d  >0 ){.    nNew -
ddf0: 3d 20 32 30 3b 0a 20 20 7d 0a 0a 20 20 6e 4f 75  = 20;.  }..  nOu
de00: 74 20 2d 3d 20 28 70 4c 6f 77 65 72 21 3d 30 29  t -= (pLower!=0)
de10: 20 2b 20 28 70 55 70 70 65 72 21 3d 30 29 3b 0a   + (pUpper!=0);.
de20: 20 20 69 66 28 20 6e 4e 65 77 3c 31 30 20 29 20    if( nNew<10 ) 
de30: 6e 4e 65 77 20 3d 20 31 30 3b 0a 20 20 69 66 28  nNew = 10;.  if(
de40: 20 6e 4e 65 77 3c 6e 4f 75 74 20 29 20 6e 4f 75   nNew<nOut ) nOu
de50: 74 20 3d 20 6e 4e 65 77 3b 0a 23 69 66 20 64 65  t = nNew;.#if de
de60: 66 69 6e 65 64 28 57 48 45 52 45 54 52 41 43 45  fined(WHERETRACE
de70: 5f 45 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20  _ENABLED).  if( 
de80: 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 3e 6e 4f 75 74  pLoop->nOut>nOut
de90: 20 29 7b 0a 20 20 20 20 57 48 45 52 45 54 52 41   ){.    WHERETRA
dea0: 43 45 28 30 78 31 30 2c 28 22 52 61 6e 67 65 20  CE(0x10,("Range 
deb0: 73 63 61 6e 20 6c 6f 77 65 72 73 20 6e 4f 75 74  scan lowers nOut
dec0: 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 5c 6e   from %d to %d\n
ded0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
dee0: 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f         pLoop->nO
def0: 75 74 2c 20 6e 4f 75 74 29 29 3b 0a 20 20 7d 0a  ut, nOut));.  }.
df00: 23 65 6e 64 69 66 0a 20 20 70 4c 6f 6f 70 2d 3e  #endif.  pLoop->
df10: 6e 4f 75 74 20 3d 20 28 4c 6f 67 45 73 74 29 6e  nOut = (LogEst)n
df20: 4f 75 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  Out;.  return rc
df30: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
df40: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f  TE_ENABLE_STAT3_
df50: 4f 52 5f 53 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45  OR_STAT4./*.** E
df60: 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
df70: 65 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  er of rows that 
df80: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
df90: 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20   based on.** an 
dfa0: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
dfb0: 69 6e 74 20 78 3d 56 41 4c 55 45 20 61 6e 64 20  int x=VALUE and 
dfc0: 77 68 65 72 65 20 74 68 61 74 20 56 41 4c 55 45  where that VALUE
dfd0: 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a 20 74 68   occurs in.** th
dfe0: 65 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61  e histogram data
dff0: 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20 77 6f 72  .  This only wor
e000: 6b 73 20 77 68 65 6e 20 78 20 69 73 20 74 68 65  ks when x is the
e010: 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 63 6f   left-most.** co
e020: 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78  lumn of an index
e030: 20 61 6e 64 20 73 71 6c 69 74 65 5f 73 74 61 74   and sqlite_stat
e040: 33 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61  3 histogram data
e050: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a   is available.**
e060: 20 66 6f 72 20 74 68 61 74 20 69 6e 64 65 78 2e   for that index.
e070: 20 20 57 68 65 6e 20 70 45 78 70 72 3d 3d 4e 55    When pExpr==NU
e080: 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  LL that means th
e090: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 0a  e constraint is.
e0a0: 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c 22 20 69  ** "x IS NULL" i
e0b0: 6e 73 74 65 61 64 20 6f 66 20 22 78 3d 56 41 4c  nstead of "x=VAL
e0c0: 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  UE"..**.** Write
e0d0: 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20 72   the estimated r
e0e0: 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70  ow count into *p
e0f0: 6e 52 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20  nRow and return 
e100: 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49  SQLITE_OK. .** I
e110: 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65  f unable to make
e120: 20 61 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65   an estimate, le
e130: 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61  ave *pnRow uncha
e140: 6e 67 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a  nged and return.
e150: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a  ** non-zero..**.
e160: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
e170: 63 61 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69  can fail if it i
e180: 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64  s unable to load
e190: 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71   a collating seq
e1a0: 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65  uence.** require
e1b0: 64 20 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d  d for string com
e1c0: 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75  parison, or if u
e1d0: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
e1e0: 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20  e memory.** for 
e1f0: 61 20 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e  a UTF conversion
e200: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f   required for co
e210: 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65  mparison.  The e
e220: 72 72 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a  rror is stored.*
e230: 2a 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  * in the pParse 
e240: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
e250: 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 45 71  atic int whereEq
e260: 75 61 6c 53 63 61 6e 45 73 74 28 0a 20 20 50 61  ualScanEst(.  Pa
e270: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
e280: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26 20     /* Parsing & 
e290: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
e2a0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
e2b0: 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70  reLoopBuilder *p
e2c0: 42 75 69 6c 64 65 72 2c 0a 20 20 45 78 70 72 20  Builder,.  Expr 
e2d0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20  *pExpr,         
e2e0: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 66 6f  /* Expression fo
e2f0: 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65 20 78  r VALUE in the x
e300: 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61 69 6e  =VALUE constrain
e310: 74 20 2a 2f 0a 20 20 74 52 6f 77 63 6e 74 20 2a  t */.  tRowcnt *
e320: 70 6e 52 6f 77 20 20 20 20 20 20 20 2f 2a 20 57  pnRow       /* W
e330: 72 69 74 65 20 74 68 65 20 72 65 76 69 73 65 64  rite the revised
e340: 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65   row estimate he
e350: 72 65 20 2a 2f 0a 29 7b 0a 20 20 49 6e 64 65 78  re */.){.  Index
e360: 20 2a 70 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e   *p = pBuilder->
e370: 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 70 49  pNew->u.btree.pI
e380: 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20  ndex;.  int nEq 
e390: 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  = pBuilder->pNew
e3a0: 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 3b 0a 20  ->u.btree.nEq;. 
e3b0: 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
e3c0: 2a 70 52 65 63 20 3d 20 70 42 75 69 6c 64 65 72  *pRec = pBuilder
e3d0: 2d 3e 70 52 65 63 3b 0a 20 20 69 6e 74 20 72 63  ->pRec;.  int rc
e3e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e3f0: 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69      /* Subfuncti
e400: 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  on return code *
e410: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 61 5b 32 5d  /.  tRowcnt a[2]
e420: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
e430: 20 53 74 61 74 69 73 74 69 63 73 20 2a 2f 0a 20   Statistics */. 
e440: 20 69 6e 74 20 62 4f 6b 3b 0a 0a 20 20 61 73 73   int bOk;..  ass
e450: 65 72 74 28 20 6e 45 71 3e 3d 31 20 29 3b 0a 20  ert( nEq>=1 );. 
e460: 20 61 73 73 65 72 74 28 20 6e 45 71 3c 3d 70 2d   assert( nEq<=p-
e470: 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  >nColumn );.  as
e480: 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70 6c 65  sert( p->aSample
e490: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e4a0: 20 70 2d 3e 6e 53 61 6d 70 6c 65 3e 30 20 29 3b   p->nSample>0 );
e4b0: 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69 6c  .  assert( pBuil
e4c0: 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c 6e  der->nRecValid<n
e4d0: 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 76  Eq );..  /* If v
e4e0: 61 6c 75 65 73 20 61 72 65 20 6e 6f 74 20 61 76  alues are not av
e4f0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 20  ailable for all 
e500: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 69 6e  fields of the in
e510: 64 65 78 20 74 6f 20 74 68 65 20 6c 65 66 74 0a  dex to the left.
e520: 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 6f 6e 65    ** of this one
e530: 2c 20 6e 6f 20 65 73 74 69 6d 61 74 65 20 63 61  , no estimate ca
e540: 6e 20 62 65 20 6d 61 64 65 2e 20 52 65 74 75 72  n be made. Retur
e550: 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
e560: 44 2e 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69  D. */.  if( pBui
e570: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3c  lder->nRecValid<
e580: 28 6e 45 71 2d 31 29 20 29 7b 0a 20 20 20 20 72  (nEq-1) ){.    r
e590: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
e5a0: 46 4f 55 4e 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  FOUND;.  }..  /*
e5b0: 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
e5c0: 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 54  mization only. T
e5d0: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
e5e0: 65 33 53 74 61 74 34 50 72 6f 62 65 53 65 74 56  e3Stat4ProbeSetV
e5f0: 61 6c 75 65 28 29 0a 20 20 2a 2a 20 62 65 6c 6f  alue().  ** belo
e600: 77 20 77 6f 75 6c 64 20 72 65 74 75 72 6e 20 74  w would return t
e610: 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 20 20  he same value.  
e620: 2a 2f 0a 20 20 69 66 28 20 6e 45 71 3e 3d 70 2d  */.  if( nEq>=p-
e630: 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
e640: 2a 70 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20  *pnRow = 1;.    
e650: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e660: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
e670: 6c 69 74 65 33 53 74 61 74 34 50 72 6f 62 65 53  lite3Stat4ProbeS
e680: 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 20  etValue(pParse, 
e690: 70 2c 20 26 70 52 65 63 2c 20 70 45 78 70 72 2c  p, &pRec, pExpr,
e6a0: 20 31 2c 20 6e 45 71 2d 31 2c 20 26 62 4f 6b 29   1, nEq-1, &bOk)
e6b0: 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 70 52  ;.  pBuilder->pR
e6c0: 65 63 20 3d 20 70 52 65 63 3b 0a 20 20 69 66 28  ec = pRec;.  if(
e6d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
e6e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
e6f0: 28 20 62 4f 6b 3d 3d 30 20 29 20 72 65 74 75 72  ( bOk==0 ) retur
e700: 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
e710: 44 3b 0a 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  D;.  pBuilder->n
e720: 52 65 63 56 61 6c 69 64 20 3d 20 6e 45 71 3b 0a  RecValid = nEq;.
e730: 0a 20 20 77 68 65 72 65 4b 65 79 53 74 61 74 73  .  whereKeyStats
e740: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 52 65 63  (pParse, p, pRec
e750: 2c 20 30 2c 20 61 29 3b 0a 20 20 57 48 45 52 45  , 0, a);.  WHERE
e760: 54 52 41 43 45 28 30 78 31 30 2c 28 22 65 71 75  TRACE(0x10,("equ
e770: 61 6c 69 74 79 20 73 63 61 6e 20 72 65 67 69 6f  ality scan regio
e780: 6e 73 20 25 73 28 25 64 29 3a 20 25 64 5c 6e 22  ns %s(%d): %d\n"
e790: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e7a0: 20 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 6e       p->zName, n
e7b0: 45 71 2d 31 2c 20 28 69 6e 74 29 61 5b 31 5d 29  Eq-1, (int)a[1])
e7c0: 29 3b 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 61 5b  );.  *pnRow = a[
e7d0: 31 5d 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e 20  1];.  .  return 
e7e0: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
e7f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
e800: 41 54 33 5f 4f 52 5f 53 54 41 54 34 20 2a 2f 0a  AT3_OR_STAT4 */.
e810: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e820: 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53  NABLE_STAT3_OR_S
e830: 54 41 54 34 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  TAT4./*.** Estim
e840: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
e850: 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c  f rows that will
e860: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 61 73   be returned bas
e870: 65 64 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63  ed on.** an IN c
e880: 6f 6e 73 74 72 61 69 6e 74 20 77 68 65 72 65 20  onstraint where 
e890: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
e8a0: 69 64 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  ide of the IN op
e8b0: 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c  erator.** is a l
e8c0: 69 73 74 20 6f 66 20 76 61 6c 75 65 73 2e 20 20  ist of values.  
e8d0: 45 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  Example:.**.**  
e8e0: 20 20 20 20 20 20 57 48 45 52 45 20 78 20 49 4e        WHERE x IN
e8f0: 20 28 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a   (1,2,3,4).**.**
e900: 20 57 72 69 74 65 20 74 68 65 20 65 73 74 69 6d   Write the estim
e910: 61 74 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69  ated row count i
e920: 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72  nto *pnRow and r
e930: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
e940: 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74   .** If unable t
e950: 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61  o make an estima
e960: 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77  te, leave *pnRow
e970: 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72   unchanged and r
e980: 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  eturn.** non-zer
e990: 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  o..**.** This ro
e9a0: 75 74 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69  utine can fail i
e9b0: 66 20 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74  f it is unable t
e9c0: 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69  o load a collati
e9d0: 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72  ng sequence.** r
e9e0: 65 71 75 69 72 65 64 20 66 6f 72 20 73 74 72 69  equired for stri
e9f0: 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f  ng comparison, o
ea00: 72 20 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61  r if unable to a
ea10: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a  llocate memory.*
ea20: 2a 20 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76  * for a UTF conv
ea30: 65 72 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ersion required 
ea40: 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20  for comparison. 
ea50: 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 73 74   The error is st
ea60: 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  ored.** in the p
ea70: 50 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e  Parse structure.
ea80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
ea90: 68 65 72 65 49 6e 53 63 61 6e 45 73 74 28 0a 20  hereInScanEst(. 
eaa0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
eab0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
eac0: 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
ead0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
eae0: 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65 72  WhereLoopBuilder
eaf0: 20 2a 70 42 75 69 6c 64 65 72 2c 0a 20 20 45 78   *pBuilder,.  Ex
eb00: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
eb10: 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20     /* The value 
eb20: 6c 69 73 74 20 6f 6e 20 74 68 65 20 52 48 53 20  list on the RHS 
eb30: 6f 66 20 22 78 20 49 4e 20 28 76 31 2c 76 32 2c  of "x IN (v1,v2,
eb40: 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20 74 52  v3,...)" */.  tR
eb50: 6f 77 63 6e 74 20 2a 70 6e 52 6f 77 20 20 20 20  owcnt *pnRow    
eb60: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
eb70: 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74 69  revised row esti
eb80: 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  mate here */.){.
eb90: 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 70 42 75    Index *p = pBu
eba0: 69 6c 64 65 72 2d 3e 70 4e 65 77 2d 3e 75 2e 62  ilder->pNew->u.b
ebb0: 74 72 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 69  tree.pIndex;.  i
ebc0: 36 34 20 6e 52 6f 77 30 20 3d 20 73 71 6c 69 74  64 nRow0 = sqlit
ebd0: 65 33 4c 6f 67 45 73 74 54 6f 49 6e 74 28 70 2d  e3LogEstToInt(p-
ebe0: 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 30 5d 29  >aiRowLogEst[0])
ebf0: 3b 0a 20 20 69 6e 74 20 6e 52 65 63 56 61 6c 69  ;.  int nRecVali
ec00: 64 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52  d = pBuilder->nR
ec10: 65 63 56 61 6c 69 64 3b 0a 20 20 69 6e 74 20 72  ecValid;.  int r
ec20: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
ec30: 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f     /* Subfunctio
ec40: 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  n return code */
ec50: 0a 20 20 74 52 6f 77 63 6e 74 20 6e 45 73 74 3b  .  tRowcnt nEst;
ec60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
ec70: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 66 6f 72  mber of rows for
ec80: 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 2a   a single term *
ec90: 2f 0a 20 20 74 52 6f 77 63 6e 74 20 6e 52 6f 77  /.  tRowcnt nRow
eca0: 45 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  Est = 0;    /* N
ecb0: 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  ew estimate of t
ecc0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
ecd0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  s */.  int i;   
ece0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ecf0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
ed00: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
ed10: 61 53 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20  aSample!=0 );.  
ed20: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
ed30: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 70 4c 69 73  ITE_OK && i<pLis
ed40: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
ed50: 20 20 20 20 6e 45 73 74 20 3d 20 6e 52 6f 77 30      nEst = nRow0
ed60: 3b 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65  ;.    rc = where
ed70: 45 71 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61  EqualScanEst(pPa
ed80: 72 73 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70  rse, pBuilder, p
ed90: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
eda0: 2c 20 26 6e 45 73 74 29 3b 0a 20 20 20 20 6e 52  , &nEst);.    nR
edb0: 6f 77 45 73 74 20 2b 3d 20 6e 45 73 74 3b 0a 20  owEst += nEst;. 
edc0: 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e 52 65     pBuilder->nRe
edd0: 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56 61 6c  cValid = nRecVal
ede0: 69 64 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  id;.  }..  if( r
edf0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
ee00: 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73 74 20      if( nRowEst 
ee10: 3e 20 6e 52 6f 77 30 20 29 20 6e 52 6f 77 45 73  > nRow0 ) nRowEs
ee20: 74 20 3d 20 6e 52 6f 77 30 3b 0a 20 20 20 20 2a  t = nRow0;.    *
ee30: 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b  pnRow = nRowEst;
ee40: 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
ee50: 30 78 31 30 2c 28 22 49 4e 20 72 6f 77 20 65 73  0x10,("IN row es
ee60: 74 69 6d 61 74 65 3a 20 65 73 74 3d 25 64 5c 6e  timate: est=%d\n
ee70: 22 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20 20  ", nRowEst));.  
ee80: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 75 69  }.  assert( pBui
ee90: 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3d  lder->nRecValid=
eea0: 3d 6e 52 65 63 56 61 6c 69 64 20 29 3b 0a 20 20  =nRecValid );.  
eeb0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
eec0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
eed0: 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54  ABLE_STAT3_OR_ST
eee0: 41 54 34 20 2a 2f 0a 0a 0a 23 69 66 64 65 66 20  AT4 */...#ifdef 
eef0: 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
ef00: 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  ED./*.** Print t
ef10: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
ef20: 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63 74  WhereTerm object
ef30: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ef40: 77 68 65 72 65 54 65 72 6d 50 72 69 6e 74 28 57  whereTermPrint(W
ef50: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c  hereTerm *pTerm,
ef60: 20 69 6e 74 20 69 54 65 72 6d 29 7b 0a 20 20 69   int iTerm){.  i
ef70: 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20  f( pTerm==0 ){. 
ef80: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
ef90: 72 69 6e 74 66 28 22 54 45 52 4d 2d 25 2d 33 64  rintf("TERM-%-3d
efa0: 20 4e 55 4c 4c 5c 6e 22 2c 20 69 54 65 72 6d 29   NULL\n", iTerm)
efb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
efc0: 68 61 72 20 7a 54 79 70 65 5b 34 5d 3b 0a 20 20  har zType[4];.  
efd0: 20 20 63 68 61 72 20 7a 4c 65 66 74 5b 35 30 5d    char zLeft[50]
efe0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 79  ;.    memcpy(zTy
eff0: 70 65 2c 20 22 2e 2e 2e 22 2c 20 34 29 3b 0a 20  pe, "...", 4);. 
f000: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
f010: 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
f020: 54 55 41 4c 20 29 20 7a 54 79 70 65 5b 30 5d 20  TUAL ) zType[0] 
f030: 3d 20 27 56 27 3b 0a 20 20 20 20 69 66 28 20 70  = 'V';.    if( p
f040: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
f050: 26 20 57 4f 5f 45 51 55 49 56 20 20 29 20 7a 54  & WO_EQUIV  ) zT
f060: 79 70 65 5b 31 5d 20 3d 20 27 45 27 3b 0a 20 20  ype[1] = 'E';.  
f070: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
f080: 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
f090: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
f0a0: 20 29 20 7a 54 79 70 65 5b 32 5d 20 3d 20 27 4c   ) zType[2] = 'L
f0b0: 27 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ';.    if( pTerm
f0c0: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
f0d0: 5f 53 49 4e 47 4c 45 20 29 7b 0a 20 20 20 20 20  _SINGLE ){.     
f0e0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
f0f0: 66 28 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29 2c  f(sizeof(zLeft),
f100: 7a 4c 65 66 74 2c 22 6c 65 66 74 3d 7b 25 64 3a  zLeft,"left={%d:
f110: 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  %d}",.          
f120: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 65               pTe
f130: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 2c 20  rm->leftCursor, 
f140: 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c  pTerm->u.leftCol
f150: 75 6d 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  umn);.    }else 
f160: 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  if( (pTerm->eOpe
f170: 72 61 74 6f 72 20 26 20 57 4f 5f 4f 52 29 21 3d  rator & WO_OR)!=
f180: 30 20 26 26 20 70 54 65 72 6d 2d 3e 75 2e 70 4f  0 && pTerm->u.pO
f190: 72 49 6e 66 6f 21 3d 30 20 29 7b 0a 20 20 20 20  rInfo!=0 ){.    
f1a0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
f1b0: 74 66 28 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29  tf(sizeof(zLeft)
f1c0: 2c 7a 4c 65 66 74 2c 22 69 6e 64 65 78 61 62 6c  ,zLeft,"indexabl
f1d0: 65 3d 30 78 25 6c 6c 64 22 2c 20 0a 20 20 20 20  e=0x%lld", .    
f1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1f0: 20 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49     pTerm->u.pOrI
f200: 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 29 3b  nfo->indexable);
f210: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f220: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
f230: 74 66 28 73 69 7a 65 6f 66 28 7a 4c 65 66 74 29  tf(sizeof(zLeft)
f240: 2c 7a 4c 65 66 74 2c 22 6c 65 66 74 3d 25 64 22  ,zLeft,"left=%d"
f250: 2c 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  , pTerm->leftCur
f260: 73 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  sor);.    }.    
f270: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
f280: 74 66 28 0a 20 20 20 20 20 20 20 22 54 45 52 4d  tf(.       "TERM
f290: 2d 25 2d 33 64 20 25 70 20 25 73 20 25 2d 31 32  -%-3d %p %s %-12
f2a0: 73 20 70 72 6f 62 3d 25 2d 33 64 20 6f 70 3d 30  s prob=%-3d op=0
f2b0: 78 25 30 33 78 20 77 74 46 6c 61 67 73 3d 30 78  x%03x wtFlags=0x
f2c0: 25 30 34 78 22 2c 0a 20 20 20 20 20 20 20 69 54  %04x",.       iT
f2d0: 65 72 6d 2c 20 70 54 65 72 6d 2c 20 7a 54 79 70  erm, pTerm, zTyp
f2e0: 65 2c 20 7a 4c 65 66 74 2c 20 70 54 65 72 6d 2d  e, zLeft, pTerm-
f2f0: 3e 74 72 75 74 68 50 72 6f 62 2c 0a 20 20 20 20  >truthProb,.    
f300: 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61     pTerm->eOpera
f310: 74 6f 72 2c 20 70 54 65 72 6d 2d 3e 77 74 46 6c  tor, pTerm->wtFl
f320: 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 54  ags);.    if( pT
f330: 65 72 6d 2d 3e 69 46 69 65 6c 64 20 29 7b 0a 20  erm->iField ){. 
f340: 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75       sqlite3Debu
f350: 67 50 72 69 6e 74 66 28 22 20 69 46 69 65 6c 64  gPrintf(" iField
f360: 3d 25 64 5c 6e 22 2c 20 70 54 65 72 6d 2d 3e 69  =%d\n", pTerm->i
f370: 46 69 65 6c 64 29 3b 0a 20 20 20 20 7d 65 6c 73  Field);.    }els
f380: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
f390: 44 65 62 75 67 50 72 69 6e 74 66 28 22 5c 6e 22  DebugPrintf("\n"
f3a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
f3b0: 69 74 65 33 54 72 65 65 56 69 65 77 45 78 70 72  ite3TreeViewExpr
f3c0: 28 30 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  (0, pTerm->pExpr
f3d0: 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , 0);.  }.}.#end
f3e0: 69 66 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45  if..#ifdef WHERE
f3f0: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a  TRACE_ENABLED./*
f400: 0a 2a 2a 20 53 68 6f 77 20 74 68 65 20 63 6f 6d  .** Show the com
f410: 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
f420: 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 0a 2a   a WhereClause.*
f430: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68  /.void sqlite3Wh
f440: 65 72 65 43 6c 61 75 73 65 50 72 69 6e 74 28 57  ereClausePrint(W
f450: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 29  hereClause *pWC)
f460: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
f470: 28 69 3d 30 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  (i=0; i<pWC->nTe
f480: 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 77 68  rm; i++){.    wh
f490: 65 72 65 54 65 72 6d 50 72 69 6e 74 28 26 70 57  ereTermPrint(&pW
f4a0: 43 2d 3e 61 5b 69 5d 2c 20 69 29 3b 0a 20 20 7d  C->a[i], i);.  }
f4b0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
f4c0: 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
f4d0: 42 4c 45 44 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  BLED./*.** Print
f4e0: 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a   a WhereLoop obj
f4f0: 65 63 74 20 66 6f 72 20 64 65 62 75 67 67 69 6e  ect for debuggin
f500: 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74  g purposes.*/.st
f510: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4c  atic void whereL
f520: 6f 6f 70 50 72 69 6e 74 28 57 68 65 72 65 4c 6f  oopPrint(WhereLo
f530: 6f 70 20 2a 70 2c 20 57 68 65 72 65 43 6c 61 75  op *p, WhereClau
f540: 73 65 20 2a 70 57 43 29 7b 0a 20 20 57 68 65 72  se *pWC){.  Wher
f550: 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 20 3d 20  eInfo *pWInfo = 
f560: 70 57 43 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 69  pWC->pWInfo;.  i
f570: 6e 74 20 6e 62 20 3d 20 31 2b 28 70 57 49 6e 66  nt nb = 1+(pWInf
f580: 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  o->pTabList->nSr
f590: 63 2b 33 29 2f 34 3b 0a 20 20 73 74 72 75 63 74  c+3)/4;.  struct
f5a0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
f5b0: 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  Item = pWInfo->p
f5c0: 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70 2d 3e  TabList->a + p->
f5d0: 69 54 61 62 3b 0a 20 20 54 61 62 6c 65 20 2a 70  iTab;.  Table *p
f5e0: 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61  Tab = pItem->pTa
f5f0: 62 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 41 6c  b;.  Bitmask mAl
f600: 6c 20 3d 20 28 28 28 42 69 74 6d 61 73 6b 29 31  l = (((Bitmask)1
f610: 29 3c 3c 28 6e 62 2a 34 29 29 20 2d 20 31 3b 0a  )<<(nb*4)) - 1;.
f620: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
f630: 69 6e 74 66 28 22 25 63 25 32 64 2e 25 30 2a 6c  intf("%c%2d.%0*l
f640: 6c 78 2e 25 30 2a 6c 6c 78 22 2c 20 70 2d 3e 63  lx.%0*llx", p->c
f650: 49 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Id,.            
f660: 20 20 20 20 20 20 20 20 20 70 2d 3e 69 54 61 62           p->iTab
f670: 2c 20 6e 62 2c 20 70 2d 3e 6d 61 73 6b 53 65 6c  , nb, p->maskSel
f680: 66 2c 20 6e 62 2c 20 70 2d 3e 70 72 65 72 65 71  f, nb, p->prereq
f690: 20 26 20 6d 41 6c 6c 29 3b 0a 20 20 73 71 6c 69   & mAll);.  sqli
f6a0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
f6b0: 20 25 31 32 73 22 2c 0a 20 20 20 20 20 20 20 20   %12s",.        
f6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
f6d0: 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74  em->zAlias ? pIt
f6e0: 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61  em->zAlias : pTa
f6f0: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b->zName);.  if(
f700: 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
f710: 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
f720: 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e  E)==0 ){.    con
f730: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  st char *zName;.
f740: 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 62 74 72      if( p->u.btr
f750: 65 65 2e 70 49 6e 64 65 78 20 26 26 20 28 7a 4e  ee.pIndex && (zN
f760: 61 6d 65 20 3d 20 70 2d 3e 75 2e 62 74 72 65 65  ame = p->u.btree
f770: 2e 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 21  .pIndex->zName)!
f780: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
f790: 73 74 72 6e 63 6d 70 28 7a 4e 61 6d 65 2c 20 22  strncmp(zName, "
f7a0: 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78  sqlite_autoindex
f7b0: 5f 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20  _", 17)==0 ){.  
f7c0: 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 73 71        int i = sq
f7d0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
f7e0: 61 6d 65 29 20 2d 20 31 3b 0a 20 20 20 20 20 20  ame) - 1;.      
f7f0: 20 20 77 68 69 6c 65 28 20 7a 4e 61 6d 65 5b 69    while( zName[i
f800: 5d 21 3d 27 5f 27 20 29 20 69 2d 2d 3b 0a 20 20  ]!='_' ) i--;.  
f810: 20 20 20 20 20 20 7a 4e 61 6d 65 20 2b 3d 20 69        zName += i
f820: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f830: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
f840: 74 66 28 22 2e 25 2d 31 36 73 20 25 32 64 22 2c  tf(".%-16s %2d",
f850: 20 7a 4e 61 6d 65 2c 20 70 2d 3e 75 2e 62 74 72   zName, p->u.btr
f860: 65 65 2e 6e 45 71 29 3b 0a 20 20 20 20 7d 65 6c  ee.nEq);.    }el
f870: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
f880: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 25 32  3DebugPrintf("%2
f890: 30 73 22 2c 22 22 29 3b 0a 20 20 20 20 7d 0a 20  0s","");.    }. 
f8a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
f8b0: 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   *z;.    if( p->
f8c0: 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 29 7b  u.vtab.idxStr ){
f8d0: 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
f8e0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c  e3_mprintf("(%d,
f8f0: 5c 22 25 73 5c 22 2c 25 78 29 22 2c 0a 20 20 20  \"%s\",%x)",.   
f900: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e               p->
f910: 75 2e 76 74 61 62 2e 69 64 78 4e 75 6d 2c 20 70  u.vtab.idxNum, p
f920: 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53 74 72 2c  ->u.vtab.idxStr,
f930: 20 70 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74 4d   p->u.vtab.omitM
f940: 61 73 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ask);.    }else{
f950: 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
f960: 65 33 5f 6d 70 72 69 6e 74 66 28 22 28 25 64 2c  e3_mprintf("(%d,
f970: 25 78 29 22 2c 20 70 2d 3e 75 2e 76 74 61 62 2e  %x)", p->u.vtab.
f980: 69 64 78 4e 75 6d 2c 20 70 2d 3e 75 2e 76 74 61  idxNum, p->u.vta
f990: 62 2e 6f 6d 69 74 4d 61 73 6b 29 3b 0a 20 20 20  b.omitMask);.   
f9a0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
f9b0: 62 75 67 50 72 69 6e 74 66 28 22 20 25 2d 31 39  bugPrintf(" %-19
f9c0: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69  s", z);.    sqli
f9d0: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d  te3_free(z);.  }
f9e0: 0a 20 20 69 66 28 20 70 2d 3e 77 73 46 6c 61 67  .  if( p->wsFlag
f9f0: 73 20 26 20 57 48 45 52 45 5f 53 4b 49 50 53 43  s & WHERE_SKIPSC
fa00: 41 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  AN ){.    sqlite
fa10: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 66  3DebugPrintf(" f
fa20: 20 25 30 35 78 20 25 64 2d 25 64 22 2c 20 70 2d   %05x %d-%d", p-
fa30: 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c 54  >wsFlags, p->nLT
fa40: 65 72 6d 2c 70 2d 3e 6e 53 6b 69 70 29 3b 0a 20  erm,p->nSkip);. 
fa50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
fa60: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
fa70: 20 66 20 25 30 35 78 20 4e 20 25 64 22 2c 20 70   f %05x N %d", p
fa80: 2d 3e 77 73 46 6c 61 67 73 2c 20 70 2d 3e 6e 4c  ->wsFlags, p->nL
fa90: 54 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Term);.  }.  sql
faa0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
fab0: 22 20 63 6f 73 74 20 25 64 2c 25 64 2c 25 64 5c  " cost %d,%d,%d\
fac0: 6e 22 2c 20 70 2d 3e 72 53 65 74 75 70 2c 20 70  n", p->rSetup, p
fad0: 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 29  ->rRun, p->nOut)
fae0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 54 65 72  ;.  if( p->nLTer
faf0: 6d 20 26 26 20 28 73 71 6c 69 74 65 33 57 68 65  m && (sqlite3Whe
fb00: 72 65 54 72 61 63 65 20 26 20 30 78 31 30 30 29  reTrace & 0x100)
fb10: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  !=0 ){.    int i
fb20: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
fb30: 3c 70 2d 3e 6e 4c 54 65 72 6d 3b 20 69 2b 2b 29  <p->nLTerm; i++)
fb40: 7b 0a 20 20 20 20 20 20 77 68 65 72 65 54 65 72  {.      whereTer
fb50: 6d 50 72 69 6e 74 28 70 2d 3e 61 4c 54 65 72 6d  mPrint(p->aLTerm
fb60: 5b 69 5d 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20  [i], i);.    }. 
fb70: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
fb80: 2a 2a 20 43 6f 6e 76 65 72 74 20 62 75 6c 6b 20  ** Convert bulk 
fb90: 6d 65 6d 6f 72 79 20 69 6e 74 6f 20 61 20 76 61  memory into a va
fba0: 6c 69 64 20 57 68 65 72 65 4c 6f 6f 70 20 74 68  lid WhereLoop th
fbb0: 61 74 20 63 61 6e 20 62 65 20 70 61 73 73 65 64  at can be passed
fbc0: 0a 2a 2a 20 74 6f 20 77 68 65 72 65 4c 6f 6f 70  .** to whereLoop
fbd0: 43 6c 65 61 72 20 68 61 72 6d 6c 65 73 73 6c 79  Clear harmlessly
fbe0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
fbf0: 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 57   whereLoopInit(W
fc00: 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20  hereLoop *p){.  
fc10: 70 2d 3e 61 4c 54 65 72 6d 20 3d 20 70 2d 3e 61  p->aLTerm = p->a
fc20: 4c 54 65 72 6d 53 70 61 63 65 3b 0a 20 20 70 2d  LTermSpace;.  p-
fc30: 3e 6e 4c 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  >nLTerm = 0;.  p
fc40: 2d 3e 6e 4c 53 6c 6f 74 20 3d 20 41 72 72 61 79  ->nLSlot = Array
fc50: 53 69 7a 65 28 70 2d 3e 61 4c 54 65 72 6d 53 70  Size(p->aLTermSp
fc60: 61 63 65 29 3b 0a 20 20 70 2d 3e 77 73 46 6c 61  ace);.  p->wsFla
fc70: 67 73 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  gs = 0;.}../*.**
fc80: 20 43 6c 65 61 72 20 74 68 65 20 57 68 65 72 65   Clear the Where
fc90: 4c 6f 6f 70 2e 75 20 75 6e 69 6f 6e 2e 20 20 4c  Loop.u union.  L
fca0: 65 61 76 65 20 57 68 65 72 65 4c 6f 6f 70 2e 70  eave WhereLoop.p
fcb0: 4c 54 65 72 6d 20 69 6e 74 61 63 74 2e 0a 2a 2f  LTerm intact..*/
fcc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65  .static void whe
fcd0: 72 65 4c 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e  reLoopClearUnion
fce0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
fcf0: 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20 69  ereLoop *p){.  i
fd00: 66 28 20 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  f( p->wsFlags & 
fd10: 28 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41  (WHERE_VIRTUALTA
fd20: 42 4c 45 7c 57 48 45 52 45 5f 41 55 54 4f 5f 49  BLE|WHERE_AUTO_I
fd30: 4e 44 45 58 29 20 29 7b 0a 20 20 20 20 69 66 28  NDEX) ){.    if(
fd40: 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57   (p->wsFlags & W
fd50: 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
fd60: 45 29 21 3d 30 20 26 26 20 70 2d 3e 75 2e 76 74  E)!=0 && p->u.vt
fd70: 61 62 2e 6e 65 65 64 46 72 65 65 20 29 7b 0a 20  ab.needFree ){. 
fd80: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
fd90: 65 28 70 2d 3e 75 2e 76 74 61 62 2e 69 64 78 53  e(p->u.vtab.idxS
fda0: 74 72 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  tr);.      p->u.
fdb0: 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20  vtab.needFree = 
fdc0: 30 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 76 74  0;.      p->u.vt
fdd0: 61 62 2e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20  ab.idxStr = 0;. 
fde0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 2d     }else if( (p-
fdf0: 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
fe00: 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20  _AUTO_INDEX)!=0 
fe10: 26 26 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  && p->u.btree.pI
fe20: 6e 64 65 78 21 3d 30 20 29 7b 0a 20 20 20 20 20  ndex!=0 ){.     
fe30: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
fe40: 62 2c 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49  b, p->u.btree.pI
fe50: 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  ndex->zColAff);.
fe60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
fe70: 72 65 65 4e 4e 28 64 62 2c 20 70 2d 3e 75 2e 62  reeNN(db, p->u.b
fe80: 74 72 65 65 2e 70 49 6e 64 65 78 29 3b 0a 20 20  tree.pIndex);.  
fe90: 20 20 20 20 70 2d 3e 75 2e 62 74 72 65 65 2e 70      p->u.btree.p
fea0: 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 7d  Index = 0;.    }
feb0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  .  }.}../*.** De
fec0: 61 6c 6c 6f 63 61 74 65 20 69 6e 74 65 72 6e 61  allocate interna
fed0: 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79  l memory used by
fee0: 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a   a WhereLoop obj
fef0: 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ect.*/.static vo
ff00: 69 64 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61  id whereLoopClea
ff10: 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57  r(sqlite3 *db, W
ff20: 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20 20  hereLoop *p){.  
ff30: 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21 3d 70  if( p->aLTerm!=p
ff40: 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20 29 20  ->aLTermSpace ) 
ff50: 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28  sqlite3DbFreeNN(
ff60: 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29 3b 0a  db, p->aLTerm);.
ff70: 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72    whereLoopClear
ff80: 55 6e 69 6f 6e 28 64 62 2c 20 70 29 3b 0a 20 20  Union(db, p);.  
ff90: 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 29  whereLoopInit(p)
ffa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  ;.}../*.** Incre
ffb0: 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  ase the memory a
ffc0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 70 4c  llocation for pL
ffd0: 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 5d 20 74 6f  oop->aLTerm[] to
ffe0: 20 62 65 20 61 74 20 6c 65 61 73 74 20 6e 2e 0a   be at least n..
fff0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
10000 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 73 71  ereLoopResize(sq
10010 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65  lite3 *db, Where
10020 4c 6f 6f 70 20 2a 70 2c 20 69 6e 74 20 6e 29 7b  Loop *p, int n){
10030 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 2a 70  .  WhereTerm **p
10040 61 4e 65 77 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  aNew;.  if( p->n
10050 4c 53 6c 6f 74 3e 3d 6e 20 29 20 72 65 74 75 72  LSlot>=n ) retur
10060 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6e  n SQLITE_OK;.  n
10070 20 3d 20 28 6e 2b 37 29 26 7e 37 3b 0a 20 20 70   = (n+7)&~7;.  p
10080 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  aNew = sqlite3Db
10090 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20  MallocRawNN(db, 
100a0 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d  sizeof(p->aLTerm
100b0 5b 30 5d 29 2a 6e 29 3b 0a 20 20 69 66 28 20 70  [0])*n);.  if( p
100c0 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  aNew==0 ) return
100d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
100e0 50 54 3b 0a 20 20 6d 65 6d 63 70 79 28 70 61 4e  PT;.  memcpy(paN
100f0 65 77 2c 20 70 2d 3e 61 4c 54 65 72 6d 2c 20 73  ew, p->aLTerm, s
10100 69 7a 65 6f 66 28 70 2d 3e 61 4c 54 65 72 6d 5b  izeof(p->aLTerm[
10110 30 5d 29 2a 70 2d 3e 6e 4c 53 6c 6f 74 29 3b 0a  0])*p->nLSlot);.
10120 20 20 69 66 28 20 70 2d 3e 61 4c 54 65 72 6d 21    if( p->aLTerm!
10130 3d 70 2d 3e 61 4c 54 65 72 6d 53 70 61 63 65 20  =p->aLTermSpace 
10140 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e  ) sqlite3DbFreeN
10150 4e 28 64 62 2c 20 70 2d 3e 61 4c 54 65 72 6d 29  N(db, p->aLTerm)
10160 3b 0a 20 20 70 2d 3e 61 4c 54 65 72 6d 20 3d 20  ;.  p->aLTerm = 
10170 70 61 4e 65 77 3b 0a 20 20 70 2d 3e 6e 4c 53 6c  paNew;.  p->nLSl
10180 6f 74 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e  ot = n;.  return
10190 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
101a0 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 63 6f  *.** Transfer co
101b0 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 73  ntent from the s
101c0 65 63 6f 6e 64 20 70 4c 6f 6f 70 20 69 6e 74 6f  econd pLoop into
101d0 20 74 68 65 20 66 69 72 73 74 2e 0a 2a 2f 0a 73   the first..*/.s
101e0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
101f0 6f 6f 70 58 66 65 72 28 73 71 6c 69 74 65 33 20  oopXfer(sqlite3 
10200 2a 64 62 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  *db, WhereLoop *
10210 70 54 6f 2c 20 57 68 65 72 65 4c 6f 6f 70 20 2a  pTo, WhereLoop *
10220 70 46 72 6f 6d 29 7b 0a 20 20 77 68 65 72 65 4c  pFrom){.  whereL
10230 6f 6f 70 43 6c 65 61 72 55 6e 69 6f 6e 28 64 62  oopClearUnion(db
10240 2c 20 70 54 6f 29 3b 0a 20 20 69 66 28 20 77 68  , pTo);.  if( wh
10250 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65 28 64 62  ereLoopResize(db
10260 2c 20 70 54 6f 2c 20 70 46 72 6f 6d 2d 3e 6e 4c  , pTo, pFrom->nL
10270 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 6d 65 6d  Term) ){.    mem
10280 73 65 74 28 26 70 54 6f 2d 3e 75 2c 20 30 2c 20  set(&pTo->u, 0, 
10290 73 69 7a 65 6f 66 28 70 54 6f 2d 3e 75 29 29 3b  sizeof(pTo->u));
102a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
102b0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
102c0 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 54 6f 2c   }.  memcpy(pTo,
102d0 20 70 46 72 6f 6d 2c 20 57 48 45 52 45 5f 4c 4f   pFrom, WHERE_LO
102e0 4f 50 5f 58 46 45 52 5f 53 5a 29 3b 0a 20 20 6d  OP_XFER_SZ);.  m
102f0 65 6d 63 70 79 28 70 54 6f 2d 3e 61 4c 54 65 72  emcpy(pTo->aLTer
10300 6d 2c 20 70 46 72 6f 6d 2d 3e 61 4c 54 65 72 6d  m, pFrom->aLTerm
10310 2c 20 70 54 6f 2d 3e 6e 4c 54 65 72 6d 2a 73 69  , pTo->nLTerm*si
10320 7a 65 6f 66 28 70 54 6f 2d 3e 61 4c 54 65 72 6d  zeof(pTo->aLTerm
10330 5b 30 5d 29 29 3b 0a 20 20 69 66 28 20 70 46 72  [0]));.  if( pFr
10340 6f 6d 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48  om->wsFlags & WH
10350 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
10360 20 29 7b 0a 20 20 20 20 70 46 72 6f 6d 2d 3e 75   ){.    pFrom->u
10370 2e 76 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d  .vtab.needFree =
10380 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
10390 28 70 46 72 6f 6d 2d 3e 77 73 46 6c 61 67 73 20  (pFrom->wsFlags 
103a0 26 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44  & WHERE_AUTO_IND
103b0 45 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 46  EX)!=0 ){.    pF
103c0 72 6f 6d 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e  rom->u.btree.pIn
103d0 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  dex = 0;.  }.  r
103e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
103f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
10400 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a   a WhereLoop obj
10410 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ect.*/.static vo
10420 69 64 20 77 68 65 72 65 4c 6f 6f 70 44 65 6c 65  id whereLoopDele
10430 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
10440 57 68 65 72 65 4c 6f 6f 70 20 2a 70 29 7b 0a 20  WhereLoop *p){. 
10450 20 77 68 65 72 65 4c 6f 6f 70 43 6c 65 61 72 28   whereLoopClear(
10460 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65  db, p);.  sqlite
10470 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29  3DbFreeNN(db, p)
10480 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  ;.}../*.** Free 
10490 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  a WhereInfo stru
104a0 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20  cture.*/.static 
104b0 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72  void whereInfoFr
104c0 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ee(sqlite3 *db, 
104d0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
104e0 6f 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  o){.  if( ALWAYS
104f0 28 70 57 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  (pWInfo) ){.    
10500 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
10510 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c  =0; i<pWInfo->nL
10520 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  evel; i++){.    
10530 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
10540 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
10550 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  a[i];.      if( 
10560 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 20 26  pLevel->pWLoop &
10570 26 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f  & (pLevel->pWLoo
10580 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
10590 52 45 5f 49 4e 5f 41 42 4c 45 29 20 29 7b 0a 20  RE_IN_ABLE) ){. 
105a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
105b0 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d  Free(db, pLevel-
105c0 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a  >u.in.aInLoop);.
105d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
105e0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c    sqlite3WhereCl
105f0 61 75 73 65 43 6c 65 61 72 28 26 70 57 49 6e 66  auseClear(&pWInf
10600 6f 2d 3e 73 57 43 29 3b 0a 20 20 20 20 77 68 69  o->sWC);.    whi
10610 6c 65 28 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f  le( pWInfo->pLoo
10620 70 73 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  ps ){.      Wher
10630 65 4c 6f 6f 70 20 2a 70 20 3d 20 70 57 49 6e 66  eLoop *p = pWInf
10640 6f 2d 3e 70 4c 6f 6f 70 73 3b 0a 20 20 20 20 20  o->pLoops;.     
10650 20 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 20   pWInfo->pLoops 
10660 3d 20 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a  = p->pNextLoop;.
10670 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 44        whereLoopD
10680 65 6c 65 74 65 28 64 62 2c 20 70 29 3b 0a 20 20  elete(db, p);.  
10690 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
106a0 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 57 49 6e  bFreeNN(db, pWIn
106b0 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  fo);.  }.}../*.*
106c0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
106d0 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c   all of the foll
106e0 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a  owing are true:.
106f0 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 58 20 68  **.**   (1)  X h
10700 61 73 20 74 68 65 20 73 61 6d 65 20 6f 72 20 6c  as the same or l
10710 6f 77 65 72 20 63 6f 73 74 20 74 68 61 74 20 59  ower cost that Y
10720 0a 2a 2a 20 20 20 28 32 29 20 20 58 20 69 73 20  .**   (2)  X is 
10730 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74 20  a proper subset 
10740 6f 66 20 59 0a 2a 2a 20 20 20 28 33 29 20 20 58  of Y.**   (3)  X
10750 20 73 6b 69 70 73 20 61 74 20 6c 65 61 73 74 20   skips at least 
10760 61 73 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  as many columns 
10770 61 73 20 59 0a 2a 2a 0a 2a 2a 20 42 79 20 22 70  as Y.**.** By "p
10780 72 6f 70 65 72 20 73 75 62 73 65 74 22 20 77 65  roper subset" we
10790 20 6d 65 61 6e 20 74 68 61 74 20 58 20 75 73 65   mean that X use
107a0 73 20 66 65 77 65 72 20 57 48 45 52 45 20 63 6c  s fewer WHERE cl
107b0 61 75 73 65 20 74 65 72 6d 73 0a 2a 2a 20 74 68  ause terms.** th
107c0 61 6e 20 59 20 61 6e 64 20 74 68 61 74 20 65 76  an Y and that ev
107d0 65 72 79 20 57 48 45 52 45 20 63 6c 61 75 73 65  ery WHERE clause
107e0 20 74 65 72 6d 20 75 73 65 64 20 62 79 20 58 20   term used by X 
107f0 69 73 20 61 6c 73 6f 20 75 73 65 64 0a 2a 2a 20  is also used.** 
10800 62 79 20 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 58  by Y..**.** If X
10810 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62   is a proper sub
10820 73 65 74 20 6f 66 20 59 20 74 68 65 6e 20 59 20  set of Y then Y 
10830 69 73 20 61 20 62 65 74 74 65 72 20 63 68 6f 69  is a better choi
10840 63 65 20 61 6e 64 20 6f 75 67 68 74 0a 2a 2a 20  ce and ought.** 
10850 74 6f 20 68 61 76 65 20 61 20 6c 6f 77 65 72 20  to have a lower 
10860 63 6f 73 74 2e 20 20 54 68 69 73 20 72 6f 75 74  cost.  This rout
10870 69 6e 65 20 72 65 74 75 72 6e 73 20 54 52 55 45  ine returns TRUE
10880 20 77 68 65 6e 20 74 68 61 74 20 63 6f 73 74 20   when that cost 
10890 0a 2a 2a 20 72 65 6c 61 74 69 6f 6e 73 68 69 70  .** relationship
108a0 20 69 73 20 69 6e 76 65 72 74 65 64 20 61 6e 64   is inverted and
108b0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 64 6a   needs to be adj
108c0 75 73 74 65 64 2e 20 20 54 68 65 20 74 68 69 72  usted.  The thir
108d0 64 20 72 75 6c 65 0a 2a 2a 20 77 61 73 20 61 64  d rule.** was ad
108e0 64 65 64 20 62 65 63 61 75 73 65 20 69 66 20 58  ded because if X
108f0 20 75 73 65 73 20 73 6b 69 70 2d 73 63 61 6e 20   uses skip-scan 
10900 6c 65 73 73 20 74 68 61 6e 20 59 20 69 74 20 73  less than Y it s
10910 74 69 6c 6c 20 6d 69 67 68 74 0a 2a 2a 20 64 65  till might.** de
10920 73 65 72 76 65 20 61 20 6c 6f 77 65 72 20 63 6f  serve a lower co
10930 73 74 20 65 76 65 6e 20 69 66 20 69 74 20 69 73  st even if it is
10940 20 61 20 70 72 6f 70 65 72 20 73 75 62 73 65 74   a proper subset
10950 20 6f 66 20 59 2e 0a 2a 2f 0a 73 74 61 74 69 63   of Y..*/.static
10960 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70 43 68   int whereLoopCh
10970 65 61 70 65 72 50 72 6f 70 65 72 53 75 62 73 65  eaperProperSubse
10980 74 28 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65  t(.  const Where
10990 4c 6f 6f 70 20 2a 70 58 2c 20 20 20 20 20 20 20  Loop *pX,       
109a0 2f 2a 20 46 69 72 73 74 20 57 68 65 72 65 4c 6f  /* First WhereLo
109b0 6f 70 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f  op to compare */
109c0 0a 20 20 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f  .  const WhereLo
109d0 6f 70 20 2a 70 59 20 20 20 20 20 20 20 20 2f 2a  op *pY        /*
109e0 20 43 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   Compare against
109f0 20 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20   this WhereLoop 
10a00 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
10a10 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6e 4c 54 65  ;.  if( pX->nLTe
10a20 72 6d 2d 70 58 2d 3e 6e 53 6b 69 70 20 3e 3d 20  rm-pX->nSkip >= 
10a30 70 59 2d 3e 6e 4c 54 65 72 6d 2d 70 59 2d 3e 6e  pY->nLTerm-pY->n
10a40 53 6b 69 70 20 29 7b 0a 20 20 20 20 72 65 74 75  Skip ){.    retu
10a50 72 6e 20 30 3b 20 2f 2a 20 58 20 69 73 20 6e 6f  rn 0; /* X is no
10a60 74 20 61 20 73 75 62 73 65 74 20 6f 66 20 59 20  t a subset of Y 
10a70 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 59 2d  */.  }.  if( pY-
10a80 3e 6e 53 6b 69 70 20 3e 20 70 58 2d 3e 6e 53 6b  >nSkip > pX->nSk
10a90 69 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ip ) return 0;. 
10aa0 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 3d   if( pX->rRun >=
10ab0 20 70 59 2d 3e 72 52 75 6e 20 29 7b 0a 20 20 20   pY->rRun ){.   
10ac0 20 69 66 28 20 70 58 2d 3e 72 52 75 6e 20 3e 20   if( pX->rRun > 
10ad0 70 59 2d 3e 72 52 75 6e 20 29 20 72 65 74 75 72  pY->rRun ) retur
10ae0 6e 20 30 3b 20 20 20 20 2f 2a 20 58 20 63 6f 73  n 0;    /* X cos
10af0 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 59 20 2a  ts more than Y *
10b00 2f 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 6e 4f  /.    if( pX->nO
10b10 75 74 20 3e 20 70 59 2d 3e 6e 4f 75 74 20 29 20  ut > pY->nOut ) 
10b20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20  return 0;    /* 
10b30 58 20 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61  X costs more tha
10b40 6e 20 59 20 2a 2f 0a 20 20 7d 0a 20 20 66 6f 72  n Y */.  }.  for
10b50 28 69 3d 70 58 2d 3e 6e 4c 54 65 72 6d 2d 31 3b  (i=pX->nLTerm-1;
10b60 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
10b70 20 69 66 28 20 70 58 2d 3e 61 4c 54 65 72 6d 5b   if( pX->aLTerm[
10b80 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  i]==0 ) continue
10b90 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 59 2d 3e  ;.    for(j=pY->
10ba0 6e 4c 54 65 72 6d 2d 31 3b 20 6a 3e 3d 30 3b 20  nLTerm-1; j>=0; 
10bb0 6a 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j--){.      if( 
10bc0 70 59 2d 3e 61 4c 54 65 72 6d 5b 6a 5d 3d 3d 70  pY->aLTerm[j]==p
10bd0 58 2d 3e 61 4c 54 65 72 6d 5b 69 5d 20 29 20 62  X->aLTerm[i] ) b
10be0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
10bf0 69 66 28 20 6a 3c 30 20 29 20 72 65 74 75 72 6e  if( j<0 ) return
10c00 20 30 3b 20 20 2f 2a 20 58 20 6e 6f 74 20 61 20   0;  /* X not a 
10c10 73 75 62 73 65 74 20 6f 66 20 59 20 73 69 6e 63  subset of Y sinc
10c20 65 20 74 65 72 6d 20 58 5b 69 5d 20 6e 6f 74 20  e term X[i] not 
10c30 75 73 65 64 20 62 79 20 59 20 2a 2f 0a 20 20 7d  used by Y */.  }
10c40 0a 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a  .  return 1;  /*
10c50 20 41 6c 6c 20 63 6f 6e 64 69 74 69 6f 6e 73 20   All conditions 
10c60 6d 65 65 74 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  meet */.}../*.**
10c70 20 54 72 79 20 74 6f 20 61 64 6a 75 73 74 20 74   Try to adjust t
10c80 68 65 20 63 6f 73 74 20 6f 66 20 57 68 65 72 65  he cost of Where
10c90 4c 6f 6f 70 20 70 54 65 6d 70 6c 61 74 65 20 75  Loop pTemplate u
10ca0 70 77 61 72 64 73 20 6f 72 20 64 6f 77 6e 77 61  pwards or downwa
10cb0 72 64 73 20 73 6f 0a 2a 2a 20 74 68 61 74 3a 0a  rds so.** that:.
10cc0 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 70 54 65 6d  **.**   (1) pTem
10cd0 70 6c 61 74 65 20 63 6f 73 74 73 20 6c 65 73 73  plate costs less
10ce0 20 74 68 61 6e 20 61 6e 79 20 6f 74 68 65 72 20   than any other 
10cf0 57 68 65 72 65 4c 6f 6f 70 73 20 74 68 61 74 20  WhereLoops that 
10d00 61 72 65 20 61 20 70 72 6f 70 65 72 0a 2a 2a 20  are a proper.** 
10d10 20 20 20 20 20 20 73 75 62 73 65 74 20 6f 66 20        subset of 
10d20 70 54 65 6d 70 6c 61 74 65 0a 2a 2a 0a 2a 2a 20  pTemplate.**.** 
10d30 20 20 28 32 29 20 70 54 65 6d 70 6c 61 74 65 20    (2) pTemplate 
10d40 63 6f 73 74 73 20 6d 6f 72 65 20 74 68 61 6e 20  costs more than 
10d50 61 6e 79 20 6f 74 68 65 72 20 57 68 65 72 65 4c  any other WhereL
10d60 6f 6f 70 73 20 66 6f 72 20 77 68 69 63 68 20 70  oops for which p
10d70 54 65 6d 70 6c 61 74 65 0a 2a 2a 20 20 20 20 20  Template.**     
10d80 20 20 69 73 20 61 20 70 72 6f 70 65 72 20 73 75    is a proper su
10d90 62 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 73  bset..**.** To s
10da0 61 79 20 22 57 68 65 72 65 4c 6f 6f 70 20 58 20  ay "WhereLoop X 
10db0 69 73 20 61 20 70 72 6f 70 65 72 20 73 75 62 73  is a proper subs
10dc0 65 74 20 6f 66 20 59 22 20 6d 65 61 6e 73 20 74  et of Y" means t
10dd0 68 61 74 20 58 20 75 73 65 73 20 66 65 77 65 72  hat X uses fewer
10de0 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
10df0 20 74 65 72 6d 73 20 74 68 61 6e 20 59 20 61 6e   terms than Y an
10e00 64 20 74 68 61 74 20 65 76 65 72 79 20 57 48 45  d that every WHE
10e10 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 75  RE clause term u
10e20 73 65 64 20 62 79 20 58 20 69 73 0a 2a 2a 20 61  sed by X is.** a
10e30 6c 73 6f 20 75 73 65 64 20 62 79 20 59 2e 0a 2a  lso used by Y..*
10e40 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
10e50 65 72 65 4c 6f 6f 70 41 64 6a 75 73 74 43 6f 73  ereLoopAdjustCos
10e60 74 28 63 6f 6e 73 74 20 57 68 65 72 65 4c 6f 6f  t(const WhereLoo
10e70 70 20 2a 70 2c 20 57 68 65 72 65 4c 6f 6f 70 20  p *p, WhereLoop 
10e80 2a 70 54 65 6d 70 6c 61 74 65 29 7b 0a 20 20 69  *pTemplate){.  i
10e90 66 28 20 28 70 54 65 6d 70 6c 61 74 65 2d 3e 77  f( (pTemplate->w
10ea0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
10eb0 4e 44 45 58 45 44 29 3d 3d 30 20 29 20 72 65 74  NDEXED)==0 ) ret
10ec0 75 72 6e 3b 0a 20 20 66 6f 72 28 3b 20 70 3b 20  urn;.  for(; p; 
10ed0 70 3d 70 2d 3e 70 4e 65 78 74 4c 6f 6f 70 29 7b  p=p->pNextLoop){
10ee0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62  .    if( p->iTab
10ef0 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 69 54 61  !=pTemplate->iTa
10f00 62 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  b ) continue;.  
10f10 20 20 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67    if( (p->wsFlag
10f20 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
10f30 44 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  D)==0 ) continue
10f40 3b 0a 20 20 20 20 69 66 28 20 77 68 65 72 65 4c  ;.    if( whereL
10f50 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65 72  oopCheaperProper
10f60 53 75 62 73 65 74 28 70 2c 20 70 54 65 6d 70 6c  Subset(p, pTempl
10f70 61 74 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ate) ){.      /*
10f80 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61 74   Adjust pTemplat
10f90 65 20 63 6f 73 74 20 64 6f 77 6e 77 61 72 64 20  e cost downward 
10fa0 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 63 68  so that it is ch
10fb0 65 61 70 65 72 20 74 68 61 6e 20 69 74 73 20 0a  eaper than its .
10fc0 20 20 20 20 20 20 2a 2a 20 73 75 62 73 65 74 20        ** subset 
10fd0 70 2e 20 2a 2f 0a 20 20 20 20 20 20 57 48 45 52  p. */.      WHER
10fe0 45 54 52 41 43 45 28 30 78 38 30 2c 28 22 73 75  ETRACE(0x80,("su
10ff0 62 73 65 74 20 63 6f 73 74 20 61 64 6a 75 73 74  bset cost adjust
11000 6d 65 6e 74 20 25 64 2c 25 64 20 74 6f 20 25 64  ment %d,%d to %d
11010 2c 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ,%d\n",.        
11020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
11030 54 65 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 2c 20  Template->rRun, 
11040 70 54 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 2c  pTemplate->nOut,
11050 20 70 2d 3e 72 52 75 6e 2c 20 70 2d 3e 6e 4f 75   p->rRun, p->nOu
11060 74 2d 31 29 29 3b 0a 20 20 20 20 20 20 70 54 65  t-1));.      pTe
11070 6d 70 6c 61 74 65 2d 3e 72 52 75 6e 20 3d 20 70  mplate->rRun = p
11080 2d 3e 72 52 75 6e 3b 0a 20 20 20 20 20 20 70 54  ->rRun;.      pT
11090 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 3d 20  emplate->nOut = 
110a0 70 2d 3e 6e 4f 75 74 20 2d 20 31 3b 0a 20 20 20  p->nOut - 1;.   
110b0 20 7d 65 6c 73 65 20 69 66 28 20 77 68 65 72 65   }else if( where
110c0 4c 6f 6f 70 43 68 65 61 70 65 72 50 72 6f 70 65  LoopCheaperPrope
110d0 72 53 75 62 73 65 74 28 70 54 65 6d 70 6c 61 74  rSubset(pTemplat
110e0 65 2c 20 70 29 20 29 7b 0a 20 20 20 20 20 20 2f  e, p) ){.      /
110f0 2a 20 41 64 6a 75 73 74 20 70 54 65 6d 70 6c 61  * Adjust pTempla
11100 74 65 20 63 6f 73 74 20 75 70 77 61 72 64 20 73  te cost upward s
11110 6f 20 74 68 61 74 20 69 74 20 69 73 20 63 6f 73  o that it is cos
11120 74 6c 69 65 72 20 74 68 61 6e 20 70 20 73 69 6e  tlier than p sin
11130 63 65 0a 20 20 20 20 20 20 2a 2a 20 70 54 65 6d  ce.      ** pTem
11140 70 6c 61 74 65 20 69 73 20 61 20 70 72 6f 70 65  plate is a prope
11150 72 20 73 75 62 73 65 74 20 6f 66 20 70 20 2a 2f  r subset of p */
11160 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
11170 45 28 30 78 38 30 2c 28 22 73 75 62 73 65 74 20  E(0x80,("subset 
11180 63 6f 73 74 20 61 64 6a 75 73 74 6d 65 6e 74 20  cost adjustment 
11190 25 64 2c 25 64 20 74 6f 20 25 64 2c 25 64 5c 6e  %d,%d to %d,%d\n
111a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
111b0 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70 6c            pTempl
111c0 61 74 65 2d 3e 72 52 75 6e 2c 20 70 54 65 6d 70  ate->rRun, pTemp
111d0 6c 61 74 65 2d 3e 6e 4f 75 74 2c 20 70 2d 3e 72  late->nOut, p->r
111e0 52 75 6e 2c 20 70 2d 3e 6e 4f 75 74 2b 31 29 29  Run, p->nOut+1))
111f0 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61 74  ;.      pTemplat
11200 65 2d 3e 72 52 75 6e 20 3d 20 70 2d 3e 72 52 75  e->rRun = p->rRu
11210 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 6c 61  n;.      pTempla
11220 74 65 2d 3e 6e 4f 75 74 20 3d 20 70 2d 3e 6e 4f  te->nOut = p->nO
11230 75 74 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ut + 1;.    }.  
11240 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  }.}../*.** Searc
11250 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20 57 68  h the list of Wh
11260 65 72 65 4c 6f 6f 70 73 20 69 6e 20 2a 70 70 50  ereLoops in *ppP
11270 72 65 76 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  rev looking for 
11280 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 62 65 0a  one that can be.
11290 2a 2a 20 72 65 70 6c 61 63 65 64 20 62 79 20 70  ** replaced by p
112a0 54 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  Template..**.** 
112b0 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 70  Return NULL if p
112c0 54 65 6d 70 6c 61 74 65 20 64 6f 65 73 20 6e 6f  Template does no
112d0 74 20 62 65 6c 6f 6e 67 20 6f 6e 20 74 68 65 20  t belong on the 
112e0 57 68 65 72 65 4c 6f 6f 70 20 6c 69 73 74 2e 0a  WhereLoop list..
112f0 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
11300 73 20 69 66 20 70 54 65 6d 70 6c 61 74 65 20 6f  s if pTemplate o
11310 75 67 68 74 20 74 6f 20 62 65 20 64 72 6f 70 70  ught to be dropp
11320 65 64 20 66 72 6f 6d 20 66 75 72 74 68 65 72 20  ed from further 
11330 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 2e 0a 2a  consideration..*
11340 2a 0a 2a 2a 20 49 66 20 70 58 20 69 73 20 61 20  *.** If pX is a 
11350 57 68 65 72 65 4c 6f 6f 70 20 74 68 61 74 20 70  WhereLoop that p
11360 54 65 6d 70 6c 61 74 65 20 63 61 6e 20 72 65 70  Template can rep
11370 6c 61 63 65 2c 20 74 68 65 6e 20 72 65 74 75 72  lace, then retur
11380 6e 20 74 68 65 0a 2a 2a 20 6c 69 6e 6b 20 74 68  n the.** link th
11390 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 58 2e  at points to pX.
113a0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 54 65 6d 70 6c  .**.** If pTempl
113b0 61 74 65 20 63 61 6e 6e 6f 74 20 72 65 70 6c 61  ate cannot repla
113c0 63 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  ce any existing 
113d0 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c  element of the l
113e0 69 73 74 20 62 75 74 20 6e 65 65 64 73 0a 2a 2a  ist but needs.**
113f0 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
11400 74 68 65 20 6c 69 73 74 20 61 73 20 61 20 6e 65  the list as a ne
11410 77 20 65 6e 74 72 79 2c 20 74 68 65 6e 20 72 65  w entry, then re
11420 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
11430 6f 20 74 68 65 0a 2a 2a 20 74 61 69 6c 20 6f 66  o the.** tail of
11440 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74   the list..*/.st
11450 61 74 69 63 20 57 68 65 72 65 4c 6f 6f 70 20 2a  atic WhereLoop *
11460 2a 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65  *whereLoopFindLe
11470 73 73 65 72 28 0a 20 20 57 68 65 72 65 4c 6f 6f  sser(.  WhereLoo
11480 70 20 2a 2a 70 70 50 72 65 76 2c 0a 20 20 63 6f  p **ppPrev,.  co
11490 6e 73 74 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70  nst WhereLoop *p
114a0 54 65 6d 70 6c 61 74 65 0a 29 7b 0a 20 20 57 68  Template.){.  Wh
114b0 65 72 65 4c 6f 6f 70 20 2a 70 3b 0a 20 20 66 6f  ereLoop *p;.  fo
114c0 72 28 70 3d 28 2a 70 70 50 72 65 76 29 3b 20 70  r(p=(*ppPrev); p
114d0 3b 20 70 70 50 72 65 76 3d 26 70 2d 3e 70 4e 65  ; ppPrev=&p->pNe
114e0 78 74 4c 6f 6f 70 2c 20 70 3d 2a 70 70 50 72 65  xtLoop, p=*ppPre
114f0 76 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  v){.    if( p->i
11500 54 61 62 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Tab!=pTemplate->
11510 69 54 61 62 20 7c 7c 20 70 2d 3e 69 53 6f 72 74  iTab || p->iSort
11520 49 64 78 21 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Idx!=pTemplate->
11530 69 53 6f 72 74 49 64 78 20 29 7b 0a 20 20 20 20  iSortIdx ){.    
11540 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20 74    /* If either t
11550 68 65 20 69 54 61 62 20 6f 72 20 69 53 6f 72 74  he iTab or iSort
11560 49 64 78 20 76 61 6c 75 65 73 20 66 6f 72 20 74  Idx values for t
11570 77 6f 20 57 68 65 72 65 4c 6f 6f 70 20 61 72 65  wo WhereLoop are
11580 20 64 69 66 66 65 72 65 6e 74 0a 20 20 20 20 20   different.     
11590 20 2a 2a 20 74 68 65 6e 20 74 68 6f 73 65 20 57   ** then those W
115a0 68 65 72 65 4c 6f 6f 70 73 20 6e 65 65 64 20 74  hereLoops need t
115b0 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 20  o be considered 
115c0 73 65 70 61 72 61 74 65 6c 79 2e 20 20 4e 65 69  separately.  Nei
115d0 74 68 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a  ther is.      **
115e0 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20   a candidate to 
115f0 72 65 70 6c 61 63 65 20 74 68 65 20 6f 74 68 65  replace the othe
11600 72 2e 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74  r. */.      cont
11610 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
11620 2f 2a 20 49 6e 20 74 68 65 20 63 75 72 72 65 6e  /* In the curren
11630 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
11640 2c 20 74 68 65 20 72 53 65 74 75 70 20 76 61 6c  , the rSetup val
11650 75 65 20 69 73 20 65 69 74 68 65 72 20 7a 65 72  ue is either zer
11660 6f 0a 20 20 20 20 2a 2a 20 6f 72 20 74 68 65 20  o.    ** or the 
11670 63 6f 73 74 20 6f 66 20 62 75 69 6c 64 69 6e 67  cost of building
11680 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
11690 64 65 78 20 28 4e 6c 6f 67 4e 29 20 61 6e 64 20  dex (NlogN) and 
116a0 74 68 65 20 4e 6c 6f 67 4e 0a 20 20 20 20 2a 2a  the NlogN.    **
116b0 20 69 73 20 74 68 65 20 73 61 6d 65 20 66 6f 72   is the same for
116c0 20 63 6f 6d 70 61 74 69 62 6c 65 20 57 68 65 72   compatible Wher
116d0 65 4c 6f 6f 70 73 2e 20 2a 2f 0a 20 20 20 20 61  eLoops. */.    a
116e0 73 73 65 72 74 28 20 70 2d 3e 72 53 65 74 75 70  ssert( p->rSetup
116f0 3d 3d 30 20 7c 7c 20 70 54 65 6d 70 6c 61 74 65  ==0 || pTemplate
11700 2d 3e 72 53 65 74 75 70 3d 3d 30 20 0a 20 20 20  ->rSetup==0 .   
11710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
11720 20 70 2d 3e 72 53 65 74 75 70 3d 3d 70 54 65 6d   p->rSetup==pTem
11730 70 6c 61 74 65 2d 3e 72 53 65 74 75 70 20 29 3b  plate->rSetup );
11740 0a 0a 20 20 20 20 2f 2a 20 77 68 65 72 65 4c 6f  ..    /* whereLo
11750 6f 70 41 64 64 42 74 72 65 65 28 29 20 61 6c 77  opAddBtree() alw
11760 61 79 73 20 67 65 6e 65 72 61 74 65 73 20 61 6e  ays generates an
11770 64 20 69 6e 73 65 72 74 73 20 74 68 65 20 61 75  d inserts the au
11780 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 0a 20 20  tomatic index.  
11790 20 20 2a 2a 20 63 61 73 65 20 66 69 72 73 74 2e    ** case first.
117a0 20 20 48 65 6e 63 65 20 63 6f 6d 70 61 74 69 62    Hence compatib
117b0 6c 65 20 63 61 6e 64 69 64 61 74 65 20 57 68 65  le candidate Whe
117c0 72 65 4c 6f 6f 70 73 20 6e 65 76 65 72 20 68 61  reLoops never ha
117d0 76 65 20 61 20 6c 61 72 67 65 72 0a 20 20 20 20  ve a larger.    
117e0 2a 2a 20 72 53 65 74 75 70 2e 20 43 61 6c 6c 20  ** rSetup. Call 
117f0 74 68 69 73 20 53 45 54 55 50 2d 49 4e 56 41 52  this SETUP-INVAR
11800 49 41 4e 54 20 2a 2f 0a 20 20 20 20 61 73 73 65  IANT */.    asse
11810 72 74 28 20 70 2d 3e 72 53 65 74 75 70 3e 3d 70  rt( p->rSetup>=p
11820 54 65 6d 70 6c 61 74 65 2d 3e 72 53 65 74 75 70  Template->rSetup
11830 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6e 79 20   );..    /* Any 
11840 6c 6f 6f 70 20 75 73 69 6e 67 20 61 6e 20 61 70  loop using an ap
11850 70 6c 69 61 74 69 6f 6e 2d 64 65 66 69 6e 65 64  pliation-defined
11860 20 69 6e 64 65 78 20 28 6f 72 20 50 52 49 4d 41   index (or PRIMA
11870 52 59 20 4b 45 59 20 6f 72 0a 20 20 20 20 2a 2a  RY KEY or.    **
11880 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
11890 6e 74 29 20 77 69 74 68 20 6f 6e 65 20 6f 72 20  nt) with one or 
118a0 6d 6f 72 65 20 3d 3d 20 63 6f 6e 73 74 72 61 69  more == constrai
118b0 6e 74 73 20 69 73 20 62 65 74 74 65 72 0a 20 20  nts is better.  
118c0 20 20 2a 2a 20 74 68 61 6e 20 61 6e 20 61 75 74    ** than an aut
118d0 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e 20 55 6e  omatic index. Un
118e0 6c 65 73 73 20 69 74 20 69 73 20 61 20 73 6b 69  less it is a ski
118f0 70 2d 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69  p-scan. */.    i
11900 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20 26  f( (p->wsFlags &
11910 20 57 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45   WHERE_AUTO_INDE
11920 58 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70  X)!=0.     && (p
11930 54 65 6d 70 6c 61 74 65 2d 3e 6e 53 6b 69 70 29  Template->nSkip)
11940 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  ==0.     && (pTe
11950 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20  mplate->wsFlags 
11960 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
11970 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70 54 65  !=0.     && (pTe
11980 6d 70 6c 61 74 65 2d 3e 77 73 46 6c 61 67 73 20  mplate->wsFlags 
11990 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45  & WHERE_COLUMN_E
119a0 51 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70  Q)!=0.     && (p
119b0 2d 3e 70 72 65 72 65 71 20 26 20 70 54 65 6d 70  ->prereq & pTemp
119c0 6c 61 74 65 2d 3e 70 72 65 72 65 71 29 3d 3d 70  late->prereq)==p
119d0 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65 72 65 71  Template->prereq
119e0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72  .    ){.      br
119f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
11a00 2f 2a 20 49 66 20 65 78 69 73 74 69 6e 67 20 57  /* If existing W
11a10 68 65 72 65 4c 6f 6f 70 20 70 20 69 73 20 62 65  hereLoop p is be
11a20 74 74 65 72 20 74 68 61 6e 20 70 54 65 6d 70 6c  tter than pTempl
11a30 61 74 65 2c 20 70 54 65 6d 70 6c 61 74 65 20 63  ate, pTemplate c
11a40 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 64 69 73  an be.    ** dis
11a50 63 61 72 64 65 64 2e 20 20 57 68 65 72 65 4c 6f  carded.  WhereLo
11a60 6f 70 20 70 20 69 73 20 62 65 74 74 65 72 20 69  op p is better i
11a70 66 3a 0a 20 20 20 20 2a 2a 20 20 20 28 31 29 20  f:.    **   (1) 
11a80 20 70 20 68 61 73 20 6e 6f 20 6d 6f 72 65 20 64   p has no more d
11a90 65 70 65 6e 64 65 6e 63 69 65 73 20 74 68 61 6e  ependencies than
11aa0 20 70 54 65 6d 70 6c 61 74 65 2c 20 61 6e 64 0a   pTemplate, and.
11ab0 20 20 20 20 2a 2a 20 20 20 28 32 29 20 20 70 20      **   (2)  p 
11ac0 68 61 73 20 61 6e 20 65 71 75 61 6c 20 6f 72 20  has an equal or 
11ad0 6c 6f 77 65 72 20 63 6f 73 74 20 74 68 61 6e 20  lower cost than 
11ae0 70 54 65 6d 70 6c 61 74 65 0a 20 20 20 20 2a 2f  pTemplate.    */
11af0 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 70 72 65  .    if( (p->pre
11b00 72 65 71 20 26 20 70 54 65 6d 70 6c 61 74 65 2d  req & pTemplate-
11b10 3e 70 72 65 72 65 71 29 3d 3d 70 2d 3e 70 72 65  >prereq)==p->pre
11b20 72 65 71 20 20 20 20 2f 2a 20 28 31 29 20 20 2a  req    /* (1)  *
11b30 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 53 65  /.     && p->rSe
11b40 74 75 70 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  tup<=pTemplate->
11b50 72 53 65 74 75 70 20 20 20 20 20 20 20 20 20 20  rSetup          
11b60 20 20 20 20 20 20 20 20 2f 2a 20 28 32 61 29 20          /* (2a) 
11b70 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 72 52  */.     && p->rR
11b80 75 6e 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e 72  un<=pTemplate->r
11b90 52 75 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  Run             
11ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62 29           /* (2b)
11bb0 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e   */.     && p->n
11bc0 4f 75 74 3c 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  Out<=pTemplate->
11bd0 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  nOut            
11be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 63            /* (2c
11bf0 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20  ) */.    ){.    
11c00 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20    return 0;  /* 
11c10 44 69 73 63 61 72 64 20 70 54 65 6d 70 6c 61 74  Discard pTemplat
11c20 65 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20  e */.    }..    
11c30 2f 2a 20 49 66 20 70 54 65 6d 70 6c 61 74 65 20  /* If pTemplate 
11c40 69 73 20 61 6c 77 61 79 73 20 62 65 74 74 65 72  is always better
11c50 20 74 68 61 6e 20 70 2c 20 74 68 65 6e 20 63 61   than p, then ca
11c60 75 73 65 20 70 20 74 6f 20 62 65 20 6f 76 65 72  use p to be over
11c70 77 72 69 74 74 65 6e 0a 20 20 20 20 2a 2a 20 77  written.    ** w
11c80 69 74 68 20 70 54 65 6d 70 6c 61 74 65 2e 20 20  ith pTemplate.  
11c90 70 54 65 6d 70 6c 61 74 65 20 69 73 20 62 65 74  pTemplate is bet
11ca0 74 65 72 20 74 68 61 6e 20 70 20 69 66 3a 0a 20  ter than p if:. 
11cb0 20 20 20 2a 2a 20 20 20 28 31 29 20 20 70 54 65     **   (1)  pTe
11cc0 6d 70 6c 61 74 65 20 68 61 73 20 6e 6f 20 6d 6f  mplate has no mo
11cd0 72 65 20 64 65 70 65 6e 64 65 6e 63 65 73 20 74  re dependences t
11ce0 68 61 6e 20 70 2c 20 61 6e 64 0a 20 20 20 20 2a  han p, and.    *
11cf0 2a 20 20 20 28 32 29 20 20 70 54 65 6d 70 6c 61  *   (2)  pTempla
11d00 74 65 20 68 61 73 20 61 6e 20 65 71 75 61 6c 20  te has an equal 
11d10 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68  or lower cost th
11d20 61 6e 20 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  an p..    */.   
11d30 20 69 66 28 20 28 70 2d 3e 70 72 65 72 65 71 20   if( (p->prereq 
11d40 26 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72 65  & pTemplate->pre
11d50 72 65 71 29 3d 3d 70 54 65 6d 70 6c 61 74 65 2d  req)==pTemplate-
11d60 3e 70 72 65 72 65 71 20 20 20 2f 2a 20 28 31 29  >prereq   /* (1)
11d70 20 20 2a 2f 0a 20 20 20 20 20 26 26 20 70 2d 3e    */.     && p->
11d80 72 52 75 6e 3e 3d 70 54 65 6d 70 6c 61 74 65 2d  rRun>=pTemplate-
11d90 3e 72 52 75 6e 20 20 20 20 20 20 20 20 20 20 20  >rRun           
11da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11db0 20 20 2f 2a 20 28 32 61 29 20 2a 2f 0a 20 20 20    /* (2a) */.   
11dc0 20 20 26 26 20 70 2d 3e 6e 4f 75 74 3e 3d 70 54    && p->nOut>=pT
11dd0 65 6d 70 6c 61 74 65 2d 3e 6e 4f 75 74 20 20 20  emplate->nOut   
11de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 62            /* (2b
11e00 29 20 2a 2f 0a 20 20 20 20 29 7b 0a 20 20 20 20  ) */.    ){.    
11e10 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 53 65    assert( p->rSe
11e20 74 75 70 3e 3d 70 54 65 6d 70 6c 61 74 65 2d 3e  tup>=pTemplate->
11e30 72 53 65 74 75 70 20 29 3b 20 2f 2a 20 53 45 54  rSetup ); /* SET
11e40 55 50 2d 49 4e 56 41 52 49 41 4e 54 20 61 62 6f  UP-INVARIANT abo
11e50 76 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61  ve */.      brea
11e60 6b 3b 20 20 20 2f 2a 20 43 61 75 73 65 20 70 20  k;   /* Cause p 
11e70 74 6f 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  to be overwritte
11e80 6e 20 62 79 20 70 54 65 6d 70 6c 61 74 65 20 2a  n by pTemplate *
11e90 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  /.    }.  }.  re
11ea0 74 75 72 6e 20 70 70 50 72 65 76 3b 0a 7d 0a 0a  turn ppPrev;.}..
11eb0 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20  /*.** Insert or 
11ec0 72 65 70 6c 61 63 65 20 61 20 57 68 65 72 65 4c  replace a WhereL
11ed0 6f 6f 70 20 65 6e 74 72 79 20 75 73 69 6e 67 20  oop entry using 
11ee0 74 68 65 20 74 65 6d 70 6c 61 74 65 20 73 75 70  the template sup
11ef0 70 6c 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  plied..**.** An 
11f00 65 78 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f  existing WhereLo
11f10 6f 70 20 65 6e 74 72 79 20 6d 69 67 68 74 20 62  op entry might b
11f20 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 69 66  e overwritten if
11f30 20 74 68 65 20 6e 65 77 20 74 65 6d 70 6c 61 74   the new templat
11f40 65 0a 2a 2a 20 69 73 20 62 65 74 74 65 72 20 61  e.** is better a
11f50 6e 64 20 68 61 73 20 66 65 77 65 72 20 64 65 70  nd has fewer dep
11f60 65 6e 64 65 6e 63 69 65 73 2e 20 20 4f 72 20 74  endencies.  Or t
11f70 68 65 20 74 65 6d 70 6c 61 74 65 20 77 69 6c 6c  he template will
11f80 20 62 65 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61   be ignored.** a
11f90 6e 64 20 6e 6f 20 69 6e 73 65 72 74 20 77 69 6c  nd no insert wil
11fa0 6c 20 6f 63 63 75 72 20 69 66 20 61 6e 20 65 78  l occur if an ex
11fb0 69 73 74 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70  isting WhereLoop
11fc0 20 69 73 20 66 61 73 74 65 72 20 61 6e 64 20 68   is faster and h
11fd0 61 73 0a 2a 2a 20 66 65 77 65 72 20 64 65 70 65  as.** fewer depe
11fe0 6e 64 65 6e 63 69 65 73 20 74 68 61 6e 20 74 68  ndencies than th
11ff0 65 20 74 65 6d 70 6c 61 74 65 2e 20 20 4f 74 68  e template.  Oth
12000 65 72 77 69 73 65 20 61 20 6e 65 77 20 57 68 65  erwise a new Whe
12010 72 65 4c 6f 6f 70 20 69 73 0a 2a 2a 20 61 64 64  reLoop is.** add
12020 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ed based on the 
12030 74 65 6d 70 6c 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  template..**.** 
12040 49 66 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  If pBuilder->pOr
12050 53 65 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  Set is not NULL 
12060 74 68 65 6e 20 77 65 20 63 61 72 65 20 61 62 6f  then we care abo
12070 75 74 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 70  ut only the.** p
12080 72 65 72 65 71 75 69 73 69 74 65 73 20 61 6e 64  rerequisites and
12090 20 72 52 75 6e 20 61 6e 64 20 6e 4f 75 74 20 63   rRun and nOut c
120a0 6f 73 74 73 20 6f 66 20 74 68 65 20 4e 20 62 65  osts of the N be
120b0 73 74 20 6c 6f 6f 70 73 2e 20 20 54 68 61 74 0a  st loops.  That.
120c0 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ** information i
120d0 73 20 67 61 74 68 65 72 65 64 20 69 6e 20 74 68  s gathered in th
120e0 65 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53  e pBuilder->pOrS
120f0 65 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73  et object.  This
12100 20 73 70 65 63 69 61 6c 0a 2a 2a 20 70 72 6f 63   special.** proc
12110 65 73 73 69 6e 67 20 6d 6f 64 65 20 69 73 20 75  essing mode is u
12120 73 65 64 20 6f 6e 6c 79 20 66 6f 72 20 4f 52 20  sed only for OR 
12130 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
12140 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61 63  g..**.** When ac
12150 63 75 6d 75 6c 61 74 69 6e 67 20 6d 75 6c 74 69  cumulating multi
12160 70 6c 65 20 6c 6f 6f 70 73 20 28 77 68 65 6e 20  ple loops (when 
12170 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74  pBuilder->pOrSet
12180 20 69 73 20 4e 55 4c 4c 29 20 77 65 0a 2a 2a 20   is NULL) we.** 
12190 73 74 69 6c 6c 20 6d 69 67 68 74 20 6f 76 65 72  still might over
121a0 77 72 69 74 65 20 73 69 6d 69 6c 61 72 20 6c 6f  write similar lo
121b0 6f 70 73 20 77 69 74 68 20 74 68 65 20 6e 65 77  ops with the new
121c0 20 74 65 6d 70 6c 61 74 65 20 69 66 20 74 68 65   template if the
121d0 0a 2a 2a 20 6e 65 77 20 74 65 6d 70 6c 61 74 65  .** new template
121e0 20 69 73 20 62 65 74 74 65 72 2e 20 20 4c 6f 6f   is better.  Loo
121f0 70 73 20 6d 61 79 20 62 65 20 6f 76 65 72 77 72  ps may be overwr
12200 69 74 74 65 6e 20 69 66 20 74 68 65 20 66 6f 6c  itten if the fol
12210 6c 6f 77 69 6e 67 20 0a 2a 2a 20 63 6f 6e 64 69  lowing .** condi
12220 74 69 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0a 2a  tions are met:.*
12230 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65  *.**    (1)  The
12240 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  y have the same 
12250 69 54 61 62 2e 0a 2a 2a 20 20 20 20 28 32 29 20  iTab..**    (2) 
12260 20 54 68 65 79 20 68 61 76 65 20 74 68 65 20 73   They have the s
12270 61 6d 65 20 69 53 6f 72 74 49 64 78 2e 0a 2a 2a  ame iSortIdx..**
12280 20 20 20 20 28 33 29 20 20 54 68 65 20 74 65 6d      (3)  The tem
12290 70 6c 61 74 65 20 68 61 73 20 73 61 6d 65 20 6f  plate has same o
122a0 72 20 66 65 77 65 72 20 64 65 70 65 6e 64 65 6e  r fewer dependen
122b0 63 69 65 73 20 74 68 61 6e 20 74 68 65 20 63 75  cies than the cu
122c0 72 72 65 6e 74 20 6c 6f 6f 70 0a 2a 2a 20 20 20  rrent loop.**   
122d0 20 28 34 29 20 20 54 68 65 20 74 65 6d 70 6c 61   (4)  The templa
122e0 74 65 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  te has the same 
122f0 6f 72 20 6c 6f 77 65 72 20 63 6f 73 74 20 74 68  or lower cost th
12300 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  an the current l
12310 6f 6f 70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  oop.*/.static in
12320 74 20 77 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72  t whereLoopInser
12330 74 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64  t(WhereLoopBuild
12340 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20 57 68  er *pBuilder, Wh
12350 65 72 65 4c 6f 6f 70 20 2a 70 54 65 6d 70 6c 61  ereLoop *pTempla
12360 74 65 29 7b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  te){.  WhereLoop
12370 20 2a 2a 70 70 50 72 65 76 2c 20 2a 70 3b 0a 20   **ppPrev, *p;. 
12380 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
12390 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  fo = pBuilder->p
123a0 57 49 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33  WInfo;.  sqlite3
123b0 20 2a 64 62 20 3d 20 70 57 49 6e 66 6f 2d 3e 70   *db = pWInfo->p
123c0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
123d0 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 42   rc;..  /* If pB
123e0 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65 74 20 69  uilder->pOrSet i
123f0 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  s defined, then 
12400 6f 6e 6c 79 20 6b 65 65 70 20 74 72 61 63 6b 20  only keep track 
12410 6f 66 20 74 68 65 20 63 6f 73 74 73 0a 20 20 2a  of the costs.  *
12420 2a 20 61 6e 64 20 70 72 65 72 65 71 73 2e 0a 20  * and prereqs.. 
12430 20 2a 2f 0a 20 20 69 66 28 20 70 42 75 69 6c 64   */.  if( pBuild
12440 65 72 2d 3e 70 4f 72 53 65 74 21 3d 30 20 29 7b  er->pOrSet!=0 ){
12450 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 6c 61  .    if( pTempla
12460 74 65 2d 3e 6e 4c 54 65 72 6d 20 29 7b 0a 23 69  te->nLTerm ){.#i
12470 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41  f WHERETRACE_ENA
12480 42 4c 45 44 0a 20 20 20 20 20 20 75 31 36 20 6e  BLED.      u16 n
12490 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72   = pBuilder->pOr
124a0 53 65 74 2d 3e 6e 3b 0a 20 20 20 20 20 20 69 6e  Set->n;.      in
124b0 74 20 78 20 3d 0a 23 65 6e 64 69 66 0a 20 20 20  t x =.#endif.   
124c0 20 20 20 77 68 65 72 65 4f 72 49 6e 73 65 72 74     whereOrInsert
124d0 28 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72 53 65  (pBuilder->pOrSe
124e0 74 2c 20 70 54 65 6d 70 6c 61 74 65 2d 3e 70 72  t, pTemplate->pr
124f0 65 72 65 71 2c 20 70 54 65 6d 70 6c 61 74 65 2d  ereq, pTemplate-
12500 3e 72 52 75 6e 2c 0a 20 20 20 20 20 20 20 20 20  >rRun,.         
12510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12520 20 20 20 20 20 20 20 20 20 20 20 70 54 65 6d 70             pTemp
12530 6c 61 74 65 2d 3e 6e 4f 75 74 29 3b 0a 23 69 66  late->nOut);.#if
12540 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
12550 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20  LED /* 0x8 */.  
12560 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
12570 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
12580 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
12590 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 78 3f  e3DebugPrintf(x?
125a0 22 20 20 20 6f 72 2d 25 64 3a 20 20 22 3a 22 20  "   or-%d:  ":" 
125b0 20 20 6f 72 2d 58 3a 20 20 22 2c 20 6e 29 3b 0a    or-X:  ", n);.
125c0 20 20 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f          whereLoo
125d0 70 50 72 69 6e 74 28 70 54 65 6d 70 6c 61 74 65  pPrint(pTemplate
125e0 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
125f0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
12600 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
12610 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
12620 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20  ..  /* Look for 
12630 61 6e 20 65 78 69 73 74 69 6e 67 20 57 68 65 72  an existing Wher
12640 65 4c 6f 6f 70 20 74 6f 20 72 65 70 6c 61 63 65  eLoop to replace
12650 20 77 69 74 68 20 70 54 65 6d 70 6c 61 74 65 0a   with pTemplate.
12660 20 20 2a 2f 0a 20 20 77 68 65 72 65 4c 6f 6f 70    */.  whereLoop
12670 41 64 6a 75 73 74 43 6f 73 74 28 70 57 49 6e 66  AdjustCost(pWInf
12680 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 70 54 65 6d 70  o->pLoops, pTemp
12690 6c 61 74 65 29 3b 0a 20 20 70 70 50 72 65 76 20  late);.  ppPrev 
126a0 3d 20 77 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c  = whereLoopFindL
126b0 65 73 73 65 72 28 26 70 57 49 6e 66 6f 2d 3e 70  esser(&pWInfo->p
126c0 4c 6f 6f 70 73 2c 20 70 54 65 6d 70 6c 61 74 65  Loops, pTemplate
126d0 29 3b 0a 0a 20 20 69 66 28 20 70 70 50 72 65 76  );..  if( ppPrev
126e0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
126f0 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ere already exis
12700 74 73 20 61 20 57 68 65 72 65 4c 6f 6f 70 20 6f  ts a WhereLoop o
12710 6e 20 74 68 65 20 6c 69 73 74 20 74 68 61 74 20  n the list that 
12720 69 73 20 62 65 74 74 65 72 0a 20 20 20 20 2a 2a  is better.    **
12730 20 74 68 61 6e 20 70 54 65 6d 70 6c 61 74 65 2c   than pTemplate,
12740 20 73 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65 20   so just ignore 
12750 70 54 65 6d 70 6c 61 74 65 20 2a 2f 0a 23 69 66  pTemplate */.#if
12760 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42   WHERETRACE_ENAB
12770 4c 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20  LED /* 0x8 */.  
12780 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
12790 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29 7b  reTrace & 0x8 ){
127a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
127b0 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 73 6b  bugPrintf("   sk
127c0 69 70 3a 20 22 29 3b 0a 20 20 20 20 20 20 77 68  ip: ");.      wh
127d0 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70 54 65  ereLoopPrint(pTe
127e0 6d 70 6c 61 74 65 2c 20 70 42 75 69 6c 64 65 72  mplate, pBuilder
127f0 2d 3e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 23 65  ->pWC);.    }.#e
12800 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
12810 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 0a 20 20 7d  SQLITE_OK;  .  }
12820 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 2a 70  else{.    p = *p
12830 70 50 72 65 76 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pPrev;.  }..  /*
12840 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
12850 73 20 70 6f 69 6e 74 20 69 74 20 6d 65 61 6e 73  s point it means
12860 20 74 68 61 74 20 65 69 74 68 65 72 20 70 5b 5d   that either p[]
12870 20 73 68 6f 75 6c 64 20 62 65 20 6f 76 65 72 77   should be overw
12880 72 69 74 74 65 6e 0a 20 20 2a 2a 20 77 69 74 68  ritten.  ** with
12890 20 70 54 65 6d 70 6c 61 74 65 5b 5d 20 69 66 20   pTemplate[] if 
128a0 70 5b 5d 20 65 78 69 73 74 73 2c 20 6f 72 20 69  p[] exists, or i
128b0 66 20 70 3d 3d 4e 55 4c 4c 20 74 68 65 6e 20 61  f p==NULL then a
128c0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 0a 20 20  llocate a new.  
128d0 2a 2a 20 57 68 65 72 65 4c 6f 6f 70 20 61 6e 64  ** WhereLoop and
128e0 20 69 6e 73 65 72 74 20 69 74 2e 0a 20 20 2a 2f   insert it..  */
128f0 0a 23 69 66 20 57 48 45 52 45 54 52 41 43 45 5f  .#if WHERETRACE_
12900 45 4e 41 42 4c 45 44 20 2f 2a 20 30 78 38 20 2a  ENABLED /* 0x8 *
12910 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 57  /.  if( sqlite3W
12920 68 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20  hereTrace & 0x8 
12930 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 30 20  ){.    if( p!=0 
12940 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
12950 44 65 62 75 67 50 72 69 6e 74 66 28 22 72 65 70  DebugPrintf("rep
12960 6c 61 63 65 3a 20 22 29 3b 0a 20 20 20 20 20 20  lace: ");.      
12970 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e 74 28 70  whereLoopPrint(p
12980 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 29  , pBuilder->pWC)
12990 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
129a0 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 20 77  ebugPrintf("   w
129b0 69 74 68 3a 20 22 29 3b 0a 20 20 20 20 7d 65 6c  ith: ");.    }el
129c0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
129d0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20  3DebugPrintf("  
129e0 20 20 61 64 64 3a 20 22 29 3b 0a 20 20 20 20 7d    add: ");.    }
129f0 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72  .    whereLoopPr
12a00 69 6e 74 28 70 54 65 6d 70 6c 61 74 65 2c 20 70  int(pTemplate, p
12a10 42 75 69 6c 64 65 72 2d 3e 70 57 43 29 3b 0a 20  Builder->pWC);. 
12a20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
12a30 70 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 41  p==0 ){.    /* A
12a40 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57 68  llocate a new Wh
12a50 65 72 65 4c 6f 6f 70 20 74 6f 20 61 64 64 20 74  ereLoop to add t
12a60 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
12a70 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 2a 70 70   list */.    *pp
12a80 50 72 65 76 20 3d 20 70 20 3d 20 73 71 6c 69 74  Prev = p = sqlit
12a90 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28  e3DbMallocRawNN(
12aa0 64 62 2c 20 73 69 7a 65 6f 66 28 57 68 65 72 65  db, sizeof(Where
12ab0 4c 6f 6f 70 29 29 3b 0a 20 20 20 20 69 66 28 20  Loop));.    if( 
12ac0 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
12ad0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
12ae0 0a 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 49 6e  .    whereLoopIn
12af0 69 74 28 70 29 3b 0a 20 20 20 20 70 2d 3e 70 4e  it(p);.    p->pN
12b00 65 78 74 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 7d  extLoop = 0;.  }
12b10 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 65 20  else{.    /* We 
12b20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74  will be overwrit
12b30 69 6e 67 20 57 68 65 72 65 4c 6f 6f 70 20 70 5b  ing WhereLoop p[
12b40 5d 2e 20 20 42 75 74 20 62 65 66 6f 72 65 20 77  ].  But before w
12b50 65 20 64 6f 2c 20 66 69 72 73 74 0a 20 20 20 20  e do, first.    
12b60 2a 2a 20 67 6f 20 74 68 72 6f 75 67 68 20 74 68  ** go through th
12b70 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6c 69  e rest of the li
12b80 73 74 20 61 6e 64 20 64 65 6c 65 74 65 20 61 6e  st and delete an
12b90 79 20 6f 74 68 65 72 20 65 6e 74 72 69 65 73 20  y other entries 
12ba0 62 65 73 69 64 65 73 0a 20 20 20 20 2a 2a 20 70  besides.    ** p
12bb0 5b 5d 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f  [] that are also
12bc0 20 73 75 70 70 6c 61 74 65 64 20 62 79 20 70 54   supplated by pT
12bd0 65 6d 70 6c 61 74 65 20 2a 2f 0a 20 20 20 20 57  emplate */.    W
12be0 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 70 54 61 69  hereLoop **ppTai
12bf0 6c 20 3d 20 26 70 2d 3e 70 4e 65 78 74 4c 6f 6f  l = &p->pNextLoo
12c00 70 3b 0a 20 20 20 20 57 68 65 72 65 4c 6f 6f 70  p;.    WhereLoop
12c10 20 2a 70 54 6f 44 65 6c 3b 0a 20 20 20 20 77 68   *pToDel;.    wh
12c20 69 6c 65 28 20 2a 70 70 54 61 69 6c 20 29 7b 0a  ile( *ppTail ){.
12c30 20 20 20 20 20 20 70 70 54 61 69 6c 20 3d 20 77        ppTail = w
12c40 68 65 72 65 4c 6f 6f 70 46 69 6e 64 4c 65 73 73  hereLoopFindLess
12c50 65 72 28 70 70 54 61 69 6c 2c 20 70 54 65 6d 70  er(ppTail, pTemp
12c60 6c 61 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  late);.      if(
12c70 20 70 70 54 61 69 6c 3d 3d 30 20 29 20 62 72 65   ppTail==0 ) bre
12c80 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f 44 65 6c  ak;.      pToDel
12c90 20 3d 20 2a 70 70 54 61 69 6c 3b 0a 20 20 20 20   = *ppTail;.    
12ca0 20 20 69 66 28 20 70 54 6f 44 65 6c 3d 3d 30 20    if( pToDel==0 
12cb0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2a  ) break;.      *
12cc0 70 70 54 61 69 6c 20 3d 20 70 54 6f 44 65 6c 2d  ppTail = pToDel-
12cd0 3e 70 4e 65 78 74 4c 6f 6f 70 3b 0a 23 69 66 20  >pNextLoop;.#if 
12ce0 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
12cf0 45 44 20 2f 2a 20 30 78 38 20 2a 2f 0a 20 20 20  ED /* 0x8 */.   
12d00 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68     if( sqlite3Wh
12d10 65 72 65 54 72 61 63 65 20 26 20 30 78 38 20 29  ereTrace & 0x8 )
12d20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12d30 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 64  3DebugPrintf(" d
12d40 65 6c 65 74 65 3a 20 22 29 3b 0a 20 20 20 20 20  elete: ");.     
12d50 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69 6e     whereLoopPrin
12d60 74 28 70 54 6f 44 65 6c 2c 20 70 42 75 69 6c 64  t(pToDel, pBuild
12d70 65 72 2d 3e 70 57 43 29 3b 0a 20 20 20 20 20 20  er->pWC);.      
12d80 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 77  }.#endif.      w
12d90 68 65 72 65 4c 6f 6f 70 44 65 6c 65 74 65 28 64  hereLoopDelete(d
12da0 62 2c 20 70 54 6f 44 65 6c 29 3b 0a 20 20 20 20  b, pToDel);.    
12db0 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20 77 68 65  }.  }.  rc = whe
12dc0 72 65 4c 6f 6f 70 58 66 65 72 28 64 62 2c 20 70  reLoopXfer(db, p
12dd0 2c 20 70 54 65 6d 70 6c 61 74 65 29 3b 0a 20 20  , pTemplate);.  
12de0 69 66 28 20 28 70 2d 3e 77 73 46 6c 61 67 73 20  if( (p->wsFlags 
12df0 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
12e00 41 42 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ABLE)==0 ){.    
12e10 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
12e20 70 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65  p->u.btree.pInde
12e30 78 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  x;.    if( pInde
12e40 78 20 26 26 20 70 49 6e 64 65 78 2d 3e 74 6e 75  x && pIndex->tnu
12e50 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  m==0 ){.      p-
12e60 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78 20  >u.btree.pIndex 
12e70 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
12e80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12e90 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20  *.** Adjust the 
12ea0 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 76  WhereLoop.nOut v
12eb0 61 6c 75 65 20 64 6f 77 6e 77 61 72 64 20 74 6f  alue downward to
12ec0 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 65 72   account for ter
12ed0 6d 73 20 6f 66 20 74 68 65 0a 2a 2a 20 57 48 45  ms of the.** WHE
12ee0 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 72  RE clause that r
12ef0 65 66 65 72 65 6e 63 65 20 74 68 65 20 6c 6f 6f  eference the loo
12f00 70 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20  p but which are 
12f10 6e 6f 74 20 75 73 65 64 20 62 79 20 61 6e 0a 2a  not used by an.*
12f20 2a 20 69 6e 64 65 78 2e 0a 2a 0a 2a 2a 20 46 6f  * index..*.** Fo
12f30 72 20 65 76 65 72 79 20 57 48 45 52 45 20 63 6c  r every WHERE cl
12f40 61 75 73 65 20 74 65 72 6d 20 74 68 61 74 20 69  ause term that i
12f50 73 20 6e 6f 74 20 75 73 65 64 20 62 79 20 74 68  s not used by th
12f60 65 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 77  e index.** and w
12f70 68 69 63 68 20 68 61 73 20 61 20 74 72 75 74 68  hich has a truth
12f80 20 70 72 6f 62 61 62 69 6c 69 74 79 20 61 73 73   probability ass
12f90 69 67 6e 65 64 20 62 79 20 6f 6e 65 20 6f 66 20  igned by one of 
12fa0 74 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29  the likelihood()
12fb0 2c 0a 2a 2a 20 6c 69 6b 65 6c 79 28 29 2c 20 6f  ,.** likely(), o
12fc0 72 20 75 6e 6c 69 6b 65 6c 79 28 29 20 53 51 4c  r unlikely() SQL
12fd0 20 66 75 6e 63 74 69 6f 6e 73 2c 20 72 65 64 75   functions, redu
12fe0 63 65 20 74 68 65 20 65 73 74 69 6d 61 74 65 64  ce the estimated
12ff0 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 6f 75   number.** of ou
13000 74 70 75 74 20 72 6f 77 73 20 62 79 20 74 68 65  tput rows by the
13010 20 70 72 6f 62 61 62 69 6c 69 74 79 20 73 70 65   probability spe
13020 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 55  cified..**.** TU
13030 4e 49 4e 47 3a 20 20 46 6f 72 20 65 76 65 72 79  NING:  For every
13040 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
13050 72 6d 20 74 68 61 74 20 69 73 20 6e 6f 74 20 75  rm that is not u
13060 73 65 64 20 62 79 20 74 68 65 20 69 6e 64 65 78  sed by the index
13070 0a 2a 2a 20 61 6e 64 20 77 68 69 63 68 20 64 6f  .** and which do
13080 65 73 20 6e 6f 74 20 68 61 76 65 20 61 6e 20 61  es not have an a
13090 73 73 69 67 6e 65 64 20 74 72 75 74 68 20 70 72  ssigned truth pr
130a0 6f 62 61 62 69 6c 69 74 79 2c 20 68 65 75 72 69  obability, heuri
130b0 73 74 69 63 73 0a 2a 2a 20 64 65 73 63 72 69 62  stics.** describ
130c0 65 64 20 62 65 6c 6f 77 20 61 72 65 20 75 73 65  ed below are use
130d0 64 20 74 6f 20 74 72 79 20 74 6f 20 65 73 74 69  d to try to esti
130e0 6d 61 74 65 20 74 68 65 20 74 72 75 74 68 20 70  mate the truth p
130f0 72 6f 62 61 62 69 6c 69 74 79 2e 0a 2a 2a 20 54  robability..** T
13100 4f 44 4f 20 2d 2d 3e 20 50 65 72 68 61 70 73 20  ODO --> Perhaps 
13110 74 68 69 73 20 69 73 20 73 6f 6d 65 74 68 69 6e  this is somethin
13120 67 20 74 68 61 74 20 63 6f 75 6c 64 20 62 65 20  g that could be 
13130 69 6d 70 72 6f 76 65 64 20 62 79 20 62 65 74 74  improved by bett
13140 65 72 0a 2a 2a 20 74 61 62 6c 65 20 73 74 61 74  er.** table stat
13150 69 73 74 69 63 73 2e 0a 2a 2a 0a 2a 2a 20 48 65  istics..**.** He
13160 75 72 69 73 74 69 63 20 31 3a 20 20 45 73 74 69  uristic 1:  Esti
13170 6d 61 74 65 20 74 68 65 20 74 72 75 74 68 20 70  mate the truth p
13180 72 6f 62 61 62 69 6c 69 74 79 20 61 73 20 39 33  robability as 93
13190 2e 37 35 25 2e 20 20 54 68 65 20 39 33 2e 37 35  .75%.  The 93.75
131a0 25 0a 2a 2a 20 76 61 6c 75 65 20 63 6f 72 72 65  %.** value corre
131b0 73 70 6f 6e 64 73 20 74 6f 20 2d 31 20 69 6e 20  sponds to -1 in 
131c0 4c 6f 67 45 73 74 20 6e 6f 74 61 74 69 6f 6e 2c  LogEst notation,
131d0 20 73 6f 20 74 68 69 73 20 6d 65 61 6e 73 20 64   so this means d
131e0 65 63 72 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20  ecrement.** the 
131f0 57 68 65 72 65 4c 6f 6f 70 2e 6e 4f 75 74 20 66  WhereLoop.nOut f
13200 69 65 6c 64 20 66 6f 72 20 65 76 65 72 79 20 73  ield for every s
13210 75 63 68 20 57 48 45 52 45 20 63 6c 61 75 73 65  uch WHERE clause
13220 20 74 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 48 65 75   term..**.** Heu
13230 72 69 73 74 69 63 20 32 3a 20 20 49 66 20 74 68  ristic 2:  If th
13240 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 20 6f  ere exists one o
13250 72 20 6d 6f 72 65 20 57 48 45 52 45 20 63 6c 61  r more WHERE cla
13260 75 73 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  use terms of the
13270 0a 2a 2a 20 66 6f 72 6d 20 22 78 3d 3d 45 58 50  .** form "x==EXP
13280 52 22 20 61 6e 64 20 45 58 50 52 20 69 73 20 6e  R" and EXPR is n
13290 6f 74 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 20  ot a constant 0 
132a0 6f 72 20 31 2c 20 74 68 65 6e 20 6d 61 6b 65 20  or 1, then make 
132b0 73 75 72 65 20 74 68 65 0a 2a 2a 20 66 69 6e 61  sure the.** fina
132c0 6c 20 6f 75 74 70 75 74 20 72 6f 77 20 65 73 74  l output row est
132d0 69 6d 61 74 65 20 69 73 20 6e 6f 20 67 72 65 61  imate is no grea
132e0 74 65 72 20 74 68 61 6e 20 31 2f 34 20 6f 66 20  ter than 1/4 of 
132f0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
13300 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  .** of rows in t
13310 68 65 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74  he table.  In ot
13320 68 65 72 20 77 6f 72 64 73 2c 20 61 73 73 75 6d  her words, assum
13330 65 20 74 68 61 74 20 78 3d 3d 45 58 50 52 20 77  e that x==EXPR w
13340 69 6c 6c 20 66 69 6c 74 65 72 0a 2a 2a 20 6f 75  ill filter.** ou
13350 74 20 61 74 20 6c 65 61 73 74 20 33 20 6f 75 74  t at least 3 out
13360 20 6f 66 20 34 20 72 6f 77 73 2e 20 20 49 66 20   of 4 rows.  If 
13370 45 58 50 52 20 69 73 20 2d 31 20 6f 72 20 30 20  EXPR is -1 or 0 
13380 6f 72 20 31 2c 20 74 68 65 6e 20 6d 61 79 62 65  or 1, then maybe
13390 20 74 68 65 0a 2a 2a 20 22 78 22 20 63 6f 6c 75   the.** "x" colu
133a0 6d 6e 20 69 73 20 62 6f 6f 6c 65 61 6e 20 6f 72  mn is boolean or
133b0 20 65 6c 73 65 20 2d 31 20 6f 72 20 30 20 6f 72   else -1 or 0 or
133c0 20 31 20 69 73 20 61 20 63 6f 6d 6d 6f 6e 20 64   1 is a common d
133d0 65 66 61 75 6c 74 20 76 61 6c 75 65 0a 2a 2a 20  efault value.** 
133e0 6f 6e 20 74 68 65 20 22 78 22 20 63 6f 6c 75 6d  on the "x" colum
133f0 6e 20 61 6e 64 20 73 6f 20 69 6e 20 74 68 61 74  n and so in that
13400 20 63 61 73 65 20 6f 6e 6c 79 20 63 61 70 20 74   case only cap t
13410 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20 65 73  he output row es
13420 74 69 6d 61 74 65 0a 2a 2a 20 61 74 20 31 2f 32  timate.** at 1/2
13430 20 69 6e 73 74 65 61 64 20 6f 66 20 31 2f 34 2e   instead of 1/4.
13440 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13450 77 68 65 72 65 4c 6f 6f 70 4f 75 74 70 75 74 41  whereLoopOutputA
13460 64 6a 75 73 74 28 0a 20 20 57 68 65 72 65 43 6c  djust(.  WhereCl
13470 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
13480 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
13490 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f  use */.  WhereLo
134a0 6f 70 20 2a 70 4c 6f 6f 70 2c 20 20 20 20 20 20  op *pLoop,      
134b0 2f 2a 20 54 68 65 20 6c 6f 6f 70 20 74 6f 20 61  /* The loop to a
134c0 64 6a 75 73 74 20 64 6f 77 6e 77 61 72 64 20 2a  djust downward *
134d0 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 52 6f 77 20  /.  LogEst nRow 
134e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
134f0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
13500 74 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65  the entire table
13510 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65   */.){.  WhereTe
13520 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 58 3b 0a  rm *pTerm, *pX;.
13530 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 41 6c 6c    Bitmask notAll
13540 6f 77 65 64 20 3d 20 7e 28 70 4c 6f 6f 70 2d 3e  owed = ~(pLoop->
13550 70 72 65 72 65 71 7c 70 4c 6f 6f 70 2d 3e 6d 61  prereq|pLoop->ma
13560 73 6b 53 65 6c 66 29 3b 0a 20 20 69 6e 74 20 69  skSelf);.  int i
13570 2c 20 6a 2c 20 6b 3b 0a 20 20 4c 6f 67 45 73 74  , j, k;.  LogEst
13580 20 69 52 65 64 75 63 65 20 3d 20 30 3b 20 20 20   iReduce = 0;   
13590 20 2f 2a 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20   /* pLoop->nOut 
135a0 73 68 6f 75 6c 64 20 6e 6f 74 20 65 78 63 65 65  should not excee
135b0 64 20 6e 52 6f 77 2d 69 52 65 64 75 63 65 20 2a  d nRow-iReduce *
135c0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 4c  /..  assert( (pL
135d0 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
135e0 48 45 52 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29  HERE_AUTO_INDEX)
135f0 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70  ==0 );.  for(i=p
13600 57 43 2d 3e 6e 54 65 72 6d 2c 20 70 54 65 72 6d  WC->nTerm, pTerm
13610 3d 70 57 43 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d  =pWC->a; i>0; i-
13620 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
13630 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 77 74 46   if( (pTerm->wtF
13640 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
13650 55 41 4c 29 21 3d 30 20 29 20 62 72 65 61 6b 3b  UAL)!=0 ) break;
13660 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
13670 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 70 4c 6f  >prereqAll & pLo
13680 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 29 3d 3d 30  op->maskSelf)==0
13690 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
136a0 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
136b0 72 65 71 41 6c 6c 20 26 20 6e 6f 74 41 6c 6c 6f  reqAll & notAllo
136c0 77 65 64 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  wed)!=0 ) contin
136d0 75 65 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 70 4c  ue;.    for(j=pL
136e0 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 2d 31 3b 20 6a  oop->nLTerm-1; j
136f0 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20 20  >=0; j--){.     
13700 20 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54   pX = pLoop->aLT
13710 65 72 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66  erm[j];.      if
13720 28 20 70 58 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ( pX==0 ) contin
13730 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  ue;.      if( pX
13740 3d 3d 70 54 65 72 6d 20 29 20 62 72 65 61 6b 3b  ==pTerm ) break;
13750 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 69  .      if( pX->i
13760 50 61 72 65 6e 74 3e 3d 30 20 26 26 20 28 26 70  Parent>=0 && (&p
13770 57 43 2d 3e 61 5b 70 58 2d 3e 69 50 61 72 65 6e  WC->a[pX->iParen
13780 74 5d 29 3d 3d 70 54 65 72 6d 20 29 20 62 72 65  t])==pTerm ) bre
13790 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
137a0 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  ( j<0 ){.      i
137b0 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50  f( pTerm->truthP
137c0 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  rob<=0 ){.      
137d0 20 20 2f 2a 20 49 66 20 61 20 74 72 75 74 68 20    /* If a truth 
137e0 70 72 6f 62 61 62 69 6c 69 74 79 20 69 73 20 73  probability is s
137f0 70 65 63 69 66 69 65 64 20 75 73 69 6e 67 20 74  pecified using t
13800 68 65 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20  he likelihood() 
13810 68 69 6e 74 73 2c 0a 20 20 20 20 20 20 20 20 2a  hints,.        *
13820 2a 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 70  * then use the p
13830 72 6f 62 61 62 69 6c 69 74 79 20 70 72 6f 76 69  robability provi
13840 64 65 64 20 62 79 20 74 68 65 20 61 70 70 6c 69  ded by the appli
13850 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  cation. */.     
13860 20 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75 74 20 2b     pLoop->nOut +
13870 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74 68 50 72  = pTerm->truthPr
13880 6f 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ob;.      }else{
13890 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  .        /* In t
138a0 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 65 78  he absence of ex
138b0 70 6c 69 63 69 74 20 74 72 75 74 68 20 70 72 6f  plicit truth pro
138c0 62 61 62 69 6c 69 74 69 65 73 2c 20 75 73 65 20  babilities, use 
138d0 68 65 75 72 69 73 74 69 63 73 20 74 6f 0a 20 20  heuristics to.  
138e0 20 20 20 20 20 20 2a 2a 20 67 75 65 73 73 20 61        ** guess a
138f0 20 72 65 61 73 6f 6e 61 62 6c 65 20 74 72 75 74   reasonable trut
13900 68 20 70 72 6f 62 61 62 69 6c 69 74 79 2e 20 2a  h probability. *
13910 2f 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d  /.        pLoop-
13920 3e 6e 4f 75 74 2d 2d 3b 0a 20 20 20 20 20 20 20  >nOut--;.       
13930 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
13940 72 61 74 6f 72 26 28 57 4f 5f 45 51 7c 57 4f 5f  rator&(WO_EQ|WO_
13950 49 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  IS) ){.         
13960 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
13970 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
13980 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20  ight;.          
13990 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
139a0 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49  >pExpr->op==TK_I
139b0 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  S );.          i
139c0 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
139d0 49 6e 74 65 67 65 72 28 70 52 69 67 68 74 2c 20  Integer(pRight, 
139e0 26 6b 29 20 26 26 20 6b 3e 3d 28 2d 31 29 20 26  &k) && k>=(-1) &
139f0 26 20 6b 3c 3d 31 20 29 7b 0a 20 20 20 20 20 20  & k<=1 ){.      
13a00 20 20 20 20 20 20 6b 20 3d 20 31 30 3b 0a 20 20        k = 10;.  
13a10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
13a20 20 20 20 20 20 20 20 20 20 20 20 6b 20 3d 20 32             k = 2
13a30 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
13a40 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52 65           if( iRe
13a50 64 75 63 65 3c 6b 20 29 20 69 52 65 64 75 63 65  duce<k ) iReduce
13a60 20 3d 20 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = k;.        }.
13a70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13a80 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 6e  }.  if( pLoop->n
13a90 4f 75 74 20 3e 20 6e 52 6f 77 2d 69 52 65 64 75  Out > nRow-iRedu
13aa0 63 65 20 29 20 20 70 4c 6f 6f 70 2d 3e 6e 4f 75  ce )  pLoop->nOu
13ab0 74 20 3d 20 6e 52 6f 77 20 2d 20 69 52 65 64 75  t = nRow - iRedu
13ac0 63 65 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 65  ce;.}../* .** Te
13ad0 72 6d 20 70 54 65 72 6d 20 69 73 20 61 20 76 65  rm pTerm is a ve
13ae0 63 74 6f 72 20 72 61 6e 67 65 20 63 6f 6d 70 61  ctor range compa
13af0 72 69 73 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 2e  rison operation.
13b00 20 54 68 65 20 66 69 72 73 74 20 63 6f 6d 70 61   The first compa
13b10 72 69 73 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  rison.** in the 
13b20 76 65 63 74 6f 72 20 63 61 6e 20 62 65 20 6f 70  vector can be op
13b30 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 63 6f  timized using co
13b40 6c 75 6d 6e 20 6e 45 71 20 6f 66 20 74 68 65 20  lumn nEq of the 
13b50 69 6e 64 65 78 2e 20 54 68 69 73 0a 2a 2a 20 66  index. This.** f
13b60 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
13b70 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
13b80 20 6f 66 20 76 65 63 74 6f 72 20 65 6c 65 6d 65   of vector eleme
13b90 6e 74 73 20 74 68 61 74 20 63 61 6e 20 62 65 20  nts that can be 
13ba0 75 73 65 64 0a 2a 2a 20 61 73 20 70 61 72 74 20  used.** as part 
13bb0 6f 66 20 74 68 65 20 72 61 6e 67 65 20 63 6f 6d  of the range com
13bc0 70 61 72 69 73 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46  parison..**.** F
13bd0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
13be0 68 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a  he query is:.**.
13bf0 2a 2a 20 20 20 57 48 45 52 45 20 61 20 3d 20 3f  **   WHERE a = ?
13c00 20 41 4e 44 20 28 62 2c 20 63 2c 20 64 29 20 3e   AND (b, c, d) >
13c10 20 28 3f 2c 20 3f 2c 20 3f 29 0a 2a 2a 0a 2a 2a   (?, ?, ?).**.**
13c20 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 3a 0a   and the index:.
13c30 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 49  **.**   CREATE I
13c40 4e 44 45 58 20 2e 2e 2e 20 4f 4e 20 28 61 2c 20  NDEX ... ON (a, 
13c50 62 2c 20 63 2c 20 64 2c 20 65 29 0a 2a 2a 0a 2a  b, c, d, e).**.*
13c60 2a 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * then this func
13c70 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 69 6e  tion would be in
13c80 76 6f 6b 65 64 20 77 69 74 68 20 6e 45 71 3d 31  voked with nEq=1
13c90 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  . The value retu
13ca0 72 6e 65 64 20 69 6e 0a 2a 2a 20 74 68 69 73 20  rned in.** this 
13cb0 63 61 73 65 20 69 73 20 33 2e 0a 2a 2f 0a 73 74  case is 3..*/.st
13cc0 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 52 61  atic int whereRa
13cd0 6e 67 65 56 65 63 74 6f 72 4c 65 6e 28 0a 20 20  ngeVectorLen(.  
13ce0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
13cf0 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
13d00 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
13d10 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20 20   iCur,          
13d20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
13d30 20 6f 6e 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e   on pIdx */.  In
13d40 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
13d50 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
13d60 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 61  to be used for a
13d70 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
13d80 74 72 61 69 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  traint */.  int 
13d90 6e 45 71 2c 20 20 20 20 20 20 20 20 20 20 20 20  nEq,            
13da0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 72   /* Number of pr
13db0 69 6f 72 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  ior equality con
13dc0 73 74 72 61 69 6e 74 73 20 6f 6e 20 73 61 6d 65  straints on same
13dd0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65 72   index */.  Wher
13de0 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 20 20 20  eTerm *pTerm    
13df0 20 2f 2a 20 54 68 65 20 76 65 63 74 6f 72 20 69   /* The vector i
13e00 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
13e10 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  aint */.){.  int
13e20 20 6e 43 6d 70 20 3d 20 73 71 6c 69 74 65 33 45   nCmp = sqlite3E
13e30 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 54  xprVectorSize(pT
13e40 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  erm->pExpr->pLef
13e50 74 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  t);.  int i;..  
13e60 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 43 6d 70 2c  nCmp = MIN(nCmp,
13e70 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20   (pIdx->nColumn 
13e80 2d 20 6e 45 71 29 29 3b 0a 20 20 66 6f 72 28 69  - nEq));.  for(i
13e90 3d 31 3b 20 69 3c 6e 43 6d 70 3b 20 69 2b 2b 29  =1; i<nCmp; i++)
13ea0 7b 0a 20 20 20 20 2f 2a 20 54 65 73 74 20 69 66  {.    /* Test if
13eb0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 20 6f 66   comparison i of
13ec0 20 70 54 65 72 6d 20 69 73 20 63 6f 6d 70 61 74   pTerm is compat
13ed0 69 62 6c 65 20 77 69 74 68 20 63 6f 6c 75 6d 6e  ible with column
13ee0 20 28 69 2b 6e 45 71 29 20 0a 20 20 20 20 2a 2a   (i+nEq) .    **
13ef0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49   of the index. I
13f00 66 20 6e 6f 74 2c 20 65 78 69 74 20 74 68 65 20  f not, exit the 
13f10 6c 6f 6f 70 2e 20 20 2a 2f 0a 20 20 20 20 63 68  loop.  */.    ch
13f20 61 72 20 61 66 66 3b 20 20 20 20 20 20 20 20 20  ar aff;         
13f30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
13f40 6f 6d 70 61 72 69 73 6f 6e 20 61 66 66 69 6e 69  omparison affini
13f50 74 79 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 69  ty */.    char i
13f60 64 78 61 66 66 20 3d 20 30 3b 20 20 20 20 20 20  dxaff = 0;      
13f70 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
13f80 65 64 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e  ed columns affin
13f90 69 74 79 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53  ity */.    CollS
13fa0 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
13fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
13fc0 61 72 69 73 6f 6e 20 63 6f 6c 6c 61 74 69 6f 6e  arison collation
13fd0 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 20   sequence */.   
13fe0 20 45 78 70 72 20 2a 70 4c 68 73 20 3d 20 70 54   Expr *pLhs = pT
13ff0 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  erm->pExpr->pLef
14000 74 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 69 5d  t->x.pList->a[i]
14010 2e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72  .pExpr;.    Expr
14020 20 2a 70 52 68 73 20 3d 20 70 54 65 72 6d 2d 3e   *pRhs = pTerm->
14030 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
14040 20 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61     if( pRhs->fla
14050 67 73 20 26 20 45 50 5f 78 49 73 53 65 6c 65 63  gs & EP_xIsSelec
14060 74 20 29 7b 0a 20 20 20 20 20 20 70 52 68 73 20  t ){.      pRhs 
14070 3d 20 70 52 68 73 2d 3e 78 2e 70 53 65 6c 65 63  = pRhs->x.pSelec
14080 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  t->pEList->a[i].
14090 70 45 78 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65  pExpr;.    }else
140a0 7b 0a 20 20 20 20 20 20 70 52 68 73 20 3d 20 70  {.      pRhs = p
140b0 52 68 73 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b  Rhs->x.pList->a[
140c0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 7d 0a  i].pExpr;.    }.
140d0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
140e0 61 74 20 74 68 65 20 4c 48 53 20 6f 66 20 74 68  at the LHS of th
140f0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  e comparison is 
14100 61 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e  a column referen
14110 63 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  ce to.    ** the
14120 20 72 69 67 68 74 20 63 6f 6c 75 6d 6e 20 6f 66   right column of
14130 20 74 68 65 20 72 69 67 68 74 20 73 6f 75 72 63   the right sourc
14140 65 20 74 61 62 6c 65 2e 20 41 6e 64 20 74 68 61  e table. And tha
14150 74 20 74 68 65 20 73 6f 72 74 0a 20 20 20 20 2a  t the sort.    *
14160 2a 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20 69  * order of the i
14170 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 69 73 20 74  ndex column is t
14180 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 73  he same as the s
14190 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 74 68 65  ort order of the
141a0 0a 20 20 20 20 2a 2a 20 6c 65 66 74 6d 6f 73 74  .    ** leftmost
141b0 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 2e 20 20   index column.  
141c0 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 68 73 2d  */.    if( pLhs-
141d0 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 0a  >op!=TK_COLUMN .
141e0 20 20 20 20 20 7c 7c 20 70 4c 68 73 2d 3e 69 54       || pLhs->iT
141f0 61 62 6c 65 21 3d 69 43 75 72 20 0a 20 20 20 20  able!=iCur .    
14200 20 7c 7c 20 70 4c 68 73 2d 3e 69 43 6f 6c 75 6d   || pLhs->iColum
14210 6e 21 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n!=pIdx->aiColum
14220 6e 5b 69 2b 6e 45 71 5d 20 0a 20 20 20 20 20 7c  n[i+nEq] .     |
14230 7c 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  | pIdx->aSortOrd
14240 65 72 5b 69 2b 6e 45 71 5d 21 3d 70 49 64 78 2d  er[i+nEq]!=pIdx-
14250 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d  >aSortOrder[nEq]
14260 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72  .    ){.      br
14270 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
14280 74 65 73 74 63 61 73 65 28 20 70 4c 68 73 2d 3e  testcase( pLhs->
14290 69 43 6f 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49  iColumn==XN_ROWI
142a0 44 20 29 3b 0a 20 20 20 20 61 66 66 20 3d 20 73  D );.    aff = s
142b0 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
142c0 69 6e 69 74 79 28 70 52 68 73 2c 20 73 71 6c 69  inity(pRhs, sqli
142d0 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
142e0 70 4c 68 73 29 29 3b 0a 20 20 20 20 69 64 78 61  pLhs));.    idxa
142f0 66 66 20 3d 20 73 71 6c 69 74 65 33 54 61 62 6c  ff = sqlite3Tabl
14300 65 43 6f 6c 75 6d 6e 41 66 66 69 6e 69 74 79 28  eColumnAffinity(
14310 70 49 64 78 2d 3e 70 54 61 62 6c 65 2c 20 70 4c  pIdx->pTable, pL
14320 68 73 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  hs->iColumn);.  
14330 20 20 69 66 28 20 61 66 66 21 3d 69 64 78 61 66    if( aff!=idxaf
14340 66 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  f ) break;..    
14350 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42  pColl = sqlite3B
14360 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
14370 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 68 73  Seq(pParse, pLhs
14380 2c 20 70 52 68 73 29 3b 0a 20 20 20 20 69 66 28  , pRhs);.    if(
14390 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 62 72 65 61   pColl==0 ) brea
143a0 6b 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  k;.    if( sqlit
143b0 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
143c0 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a  >zName, pIdx->az
143d0 43 6f 6c 6c 5b 69 2b 6e 45 71 5d 29 20 29 20 62  Coll[i+nEq]) ) b
143e0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
143f0 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn i;.}../*.** A
14400 64 6a 75 73 74 20 74 68 65 20 63 6f 73 74 20 43  djust the cost C
14410 20 62 79 20 74 68 65 20 63 6f 73 74 4d 75 6c 74   by the costMult
14420 20 66 61 63 74 65 72 20 54 2e 20 20 54 68 69 73   facter T.  This
14430 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69 66 0a   only occurs if.
14440 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  ** compiled with
14450 20 2d 44 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45   -DSQLITE_ENABLE
14460 5f 43 4f 53 54 4d 55 4c 54 0a 2a 2f 0a 23 69 66  _COSTMULT.*/.#if
14470 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
14480 45 5f 43 4f 53 54 4d 55 4c 54 0a 23 20 64 65 66  E_COSTMULT.# def
14490 69 6e 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c  ine ApplyCostMul
144a0 74 69 70 6c 69 65 72 28 43 2c 54 29 20 20 43 20  tiplier(C,T)  C 
144b0 2b 3d 20 54 0a 23 65 6c 73 65 0a 23 20 64 65 66  += T.#else.# def
144c0 69 6e 65 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c  ine ApplyCostMul
144d0 74 69 70 6c 69 65 72 28 43 2c 54 29 0a 23 65 6e  tiplier(C,T).#en
144e0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 68 61  dif../*.** We ha
144f0 76 65 20 73 6f 20 66 61 72 20 6d 61 74 63 68 65  ve so far matche
14500 64 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77  d pBuilder->pNew
14510 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 74 65  ->u.btree.nEq te
14520 72 6d 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 69  rms of the .** i
14530 6e 64 65 78 20 70 49 6e 64 65 78 2e 20 54 72 79  ndex pIndex. Try
14540 20 74 6f 20 6d 61 74 63 68 20 6f 6e 65 20 6d 6f   to match one mo
14550 72 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  re..**.** When t
14560 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
14570 63 61 6c 6c 65 64 2c 20 70 42 75 69 6c 64 65 72  called, pBuilder
14580 2d 3e 70 4e 65 77 2d 3e 6e 4f 75 74 20 63 6f 6e  ->pNew->nOut con
14590 74 61 69 6e 73 20 74 68 65 20 0a 2a 2a 20 6e 75  tains the .** nu
145a0 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70  mber of rows exp
145b0 65 63 74 65 64 20 74 6f 20 62 65 20 76 69 73 69  ected to be visi
145c0 74 65 64 20 62 79 20 66 69 6c 74 65 72 69 6e 67  ted by filtering
145d0 20 75 73 69 6e 67 20 74 68 65 20 6e 45 71 20 0a   using the nEq .
145e0 2a 2a 20 74 65 72 6d 73 20 6f 6e 6c 79 2e 20 49  ** terms only. I
145f0 66 20 69 74 20 69 73 20 6d 6f 64 69 66 69 65 64  f it is modified
14600 2c 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  , this value is 
14610 72 65 73 74 6f 72 65 64 20 62 65 66 6f 72 65 20  restored before 
14620 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  this .** functio
14630 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a  n returns..**.**
14640 20 49 66 20 70 50 72 6f 62 65 2d 3e 74 6e 75 6d   If pProbe->tnum
14650 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ==0, that means 
14660 70 49 6e 64 65 78 20 69 73 20 61 20 66 61 6b 65  pIndex is a fake
14670 20 69 6e 64 65 78 20 75 73 65 64 20 66 6f 72 20   index used for 
14680 74 68 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50  the.** INTEGER P
14690 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2f 0a 73  RIMARY KEY..*/.s
146a0 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 4c  tatic int whereL
146b0 6f 6f 70 41 64 64 42 74 72 65 65 49 6e 64 65 78  oopAddBtreeIndex
146c0 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42 75 69  (.  WhereLoopBui
146d0 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72 2c 20  lder *pBuilder, 
146e0 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65      /* The Where
146f0 4c 6f 6f 70 20 66 61 63 74 6f 72 79 20 2a 2f 0a  Loop factory */.
14700 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
14710 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20  _item *pSrc,    
14720 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
14730 20 74 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c   term being anal
14740 79 7a 65 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20  yzed */.  Index 
14750 2a 70 50 72 6f 62 65 2c 20 20 20 20 20 20 20 20  *pProbe,        
14760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
14770 69 6e 64 65 78 20 6f 6e 20 70 53 72 63 20 2a 2f  index on pSrc */
14780 0a 20 20 4c 6f 67 45 73 74 20 6e 49 6e 4d 75 6c  .  LogEst nInMul
14790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147a0 20 20 20 2f 2a 20 6c 6f 67 28 4e 75 6d 62 65 72     /* log(Number
147b0 20 6f 66 20 69 74 65 72 61 74 69 6f 6e 73 20 64   of iterations d
147c0 75 65 20 74 6f 20 49 4e 29 20 2a 2f 0a 29 7b 0a  ue to IN) */.){.
147d0 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
147e0 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  nfo = pBuilder->
147f0 70 57 49 6e 66 6f 3b 20 20 2f 2a 20 57 48 45 52  pWInfo;  /* WHER
14800 45 20 61 6e 61 6c 79 73 65 20 63 6f 6e 74 65 78  E analyse contex
14810 74 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  t */.  Parse *pP
14820 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
14830 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 2f 2a  Parse;        /*
14840 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
14850 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
14860 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
14870 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
14880 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d 61 6c  e connection mal
14890 6c 6f 63 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  loc context */. 
148a0 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77   WhereLoop *pNew
148b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
148c0 20 2f 2a 20 54 65 6d 70 6c 61 74 65 20 57 68 65   /* Template Whe
148d0 72 65 4c 6f 6f 70 20 75 6e 64 65 72 20 63 6f 6e  reLoop under con
148e0 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 57  struction */.  W
148f0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
14900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14910 2a 20 41 20 57 68 65 72 65 54 65 72 6d 20 75 6e  * A WhereTerm un
14920 64 65 72 20 63 6f 6e 73 69 64 65 72 61 74 69 6f  der consideratio
14930 6e 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 4d 61 73  n */.  int opMas
14940 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
14950 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69 64 20         /* Valid 
14960 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20 63 6f  operators for co
14970 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 57  nstraints */.  W
14980 68 65 72 65 53 63 61 6e 20 73 63 61 6e 3b 20 20  hereScan scan;  
14990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
149a0 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 57  * Iterator for W
149b0 48 45 52 45 20 74 65 72 6d 73 20 2a 2f 0a 20 20  HERE terms */.  
149c0 42 69 74 6d 61 73 6b 20 73 61 76 65 64 5f 70 72  Bitmask saved_pr
149d0 65 72 65 71 3b 20 20 20 20 20 20 20 20 20 20 20  ereq;           
149e0 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
149f0 65 20 6f 66 20 70 4e 65 77 2d 3e 70 72 65 72 65  e of pNew->prere
14a00 71 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64  q */.  u16 saved
14a10 5f 6e 4c 54 65 72 6d 3b 20 20 20 20 20 20 20 20  _nLTerm;        
14a20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
14a30 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
14a40 2d 3e 6e 4c 54 65 72 6d 20 2a 2f 0a 20 20 75 31  ->nLTerm */.  u1
14a50 36 20 73 61 76 65 64 5f 6e 45 71 3b 20 20 20 20  6 saved_nEq;    
14a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14a70 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   Original value 
14a80 6f 66 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  of pNew->u.btree
14a90 2e 6e 45 71 20 2a 2f 0a 20 20 75 31 36 20 73 61  .nEq */.  u16 sa
14aa0 76 65 64 5f 6e 42 74 6d 3b 20 20 20 20 20 20 20  ved_nBtm;       
14ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
14ac0 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
14ad0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42 74  New->u.btree.nBt
14ae0 6d 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65 64  m */.  u16 saved
14af0 5f 6e 54 6f 70 3b 20 20 20 20 20 20 20 20 20 20  _nTop;          
14b00 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
14b10 61 6c 20 76 61 6c 75 65 20 6f 66 20 70 4e 65 77  al value of pNew
14b20 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 2a  ->u.btree.nTop *
14b30 2f 0a 20 20 75 31 36 20 73 61 76 65 64 5f 6e 53  /.  u16 saved_nS
14b40 6b 69 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  kip;            
14b50 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
14b60 76 61 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e  value of pNew->n
14b70 53 6b 69 70 20 2a 2f 0a 20 20 75 33 32 20 73 61  Skip */.  u32 sa
14b80 76 65 64 5f 77 73 46 6c 61 67 73 3b 20 20 20 20  ved_wsFlags;    
14b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69            /* Ori
14ba0 67 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 70  ginal value of p
14bb0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 2a 2f 0a  New->wsFlags */.
14bc0 20 20 4c 6f 67 45 73 74 20 73 61 76 65 64 5f 6e    LogEst saved_n
14bd0 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Out;            
14be0 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61    /* Original va
14bf0 6c 75 65 20 6f 66 20 70 4e 65 77 2d 3e 6e 4f 75  lue of pNew->nOu
14c00 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  t */.  int rc = 
14c10 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
14c20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
14c30 20 63 6f 64 65 20 2a 2f 0a 20 20 4c 6f 67 45 73   code */.  LogEs
14c40 74 20 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20  t rSize;        
14c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
14c60 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
14c70 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c  the table */.  L
14c80 6f 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20  ogEst rLogSize; 
14c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14ca0 2a 20 4c 6f 67 61 72 69 74 68 6d 20 6f 66 20 74  * Logarithm of t
14cb0 61 62 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 57  able size */.  W
14cc0 68 65 72 65 54 65 72 6d 20 2a 70 54 6f 70 20 3d  hereTerm *pTop =
14cd0 20 30 2c 20 2a 70 42 74 6d 20 3d 20 30 3b 20 2f   0, *pBtm = 0; /
14ce0 2a 20 54 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d  * Top and bottom
14cf0 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
14d00 74 73 20 2a 2f 0a 0a 20 20 70 4e 65 77 20 3d 20  ts */..  pNew = 
14d10 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a  pBuilder->pNew;.
14d20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
14d30 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
14d40 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
14d50 54 3b 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  T;.  WHERETRACE(
14d60 30 78 38 30 30 2c 20 28 22 42 45 47 49 4e 20 61  0x800, ("BEGIN a
14d70 64 64 42 74 72 65 65 49 64 78 28 25 73 29 2c 20  ddBtreeIdx(%s), 
14d80 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  nEq=%d\n",.     
14d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14da0 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 2c 20 70  pProbe->zName, p
14db0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
14dc0 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  ));..  assert( (
14dd0 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
14de0 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42  WHERE_VIRTUALTAB
14df0 4c 45 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  LE)==0 );.  asse
14e00 72 74 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61  rt( (pNew->wsFla
14e10 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
14e20 49 4d 49 54 29 3d 3d 30 20 29 3b 0a 20 20 69 66  IMIT)==0 );.  if
14e30 28 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20  ( pNew->wsFlags 
14e40 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
14e50 54 20 29 7b 0a 20 20 20 20 6f 70 4d 61 73 6b 20  T ){.    opMask 
14e60 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20  = WO_LT|WO_LE;. 
14e70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
14e80 72 74 28 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65  rt( pNew->u.btre
14e90 65 2e 6e 42 74 6d 3d 3d 30 20 29 3b 0a 20 20 20  e.nBtm==0 );.   
14ea0 20 6f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c   opMask = WO_EQ|
14eb0 57 4f 5f 49 4e 7c 57 4f 5f 47 54 7c 57 4f 5f 47  WO_IN|WO_GT|WO_G
14ec0 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f  E|WO_LT|WO_LE|WO
14ed0 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 53 3b 0a 20  _ISNULL|WO_IS;. 
14ee0 20 7d 0a 20 20 69 66 28 20 70 50 72 6f 62 65 2d   }.  if( pProbe-
14ef0 3e 62 55 6e 6f 72 64 65 72 65 64 20 29 20 6f 70  >bUnordered ) op
14f00 4d 61 73 6b 20 26 3d 20 7e 28 57 4f 5f 47 54 7c  Mask &= ~(WO_GT|
14f10 57 4f 5f 47 45 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c  WO_GE|WO_LT|WO_L
14f20 45 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  E);..  assert( p
14f30 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
14f40 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  <pProbe->nColumn
14f50 20 29 3b 0a 0a 20 20 73 61 76 65 64 5f 6e 45 71   );..  saved_nEq
14f60 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65   = pNew->u.btree
14f70 2e 6e 45 71 3b 0a 20 20 73 61 76 65 64 5f 6e 42  .nEq;.  saved_nB
14f80 74 6d 20 3d 20 70 4e 65 77 2d 3e 75 2e 62 74 72  tm = pNew->u.btr
14f90 65 65 2e 6e 42 74 6d 3b 0a 20 20 73 61 76 65 64  ee.nBtm;.  saved
14fa0 5f 6e 54 6f 70 20 3d 20 70 4e 65 77 2d 3e 75 2e  _nTop = pNew->u.
14fb0 62 74 72 65 65 2e 6e 54 6f 70 3b 0a 20 20 73 61  btree.nTop;.  sa
14fc0 76 65 64 5f 6e 53 6b 69 70 20 3d 20 70 4e 65 77  ved_nSkip = pNew
14fd0 2d 3e 6e 53 6b 69 70 3b 0a 20 20 73 61 76 65 64  ->nSkip;.  saved
14fe0 5f 6e 4c 54 65 72 6d 20 3d 20 70 4e 65 77 2d 3e  _nLTerm = pNew->
14ff0 6e 4c 54 65 72 6d 3b 0a 20 20 73 61 76 65 64 5f  nLTerm;.  saved_
15000 77 73 46 6c 61 67 73 20 3d 20 70 4e 65 77 2d 3e  wsFlags = pNew->
15010 77 73 46 6c 61 67 73 3b 0a 20 20 73 61 76 65 64  wsFlags;.  saved
15020 5f 70 72 65 72 65 71 20 3d 20 70 4e 65 77 2d 3e  _prereq = pNew->
15030 70 72 65 72 65 71 3b 0a 20 20 73 61 76 65 64 5f  prereq;.  saved_
15040 6e 4f 75 74 20 3d 20 70 4e 65 77 2d 3e 6e 4f 75  nOut = pNew->nOu
15050 74 3b 0a 20 20 70 54 65 72 6d 20 3d 20 77 68 65  t;.  pTerm = whe
15060 72 65 53 63 61 6e 49 6e 69 74 28 26 73 63 61 6e  reScanInit(&scan
15070 2c 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c  , pBuilder->pWC,
15080 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c 20   pSrc->iCursor, 
15090 73 61 76 65 64 5f 6e 45 71 2c 0a 20 20 20 20 20  saved_nEq,.     
150a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150b0 20 20 20 6f 70 4d 61 73 6b 2c 20 70 50 72 6f 62     opMask, pProb
150c0 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 72 53 65 74  e);.  pNew->rSet
150d0 75 70 20 3d 20 30 3b 0a 20 20 72 53 69 7a 65 20  up = 0;.  rSize 
150e0 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  = pProbe->aiRowL
150f0 6f 67 45 73 74 5b 30 5d 3b 0a 20 20 72 4c 6f 67  ogEst[0];.  rLog
15100 53 69 7a 65 20 3d 20 65 73 74 4c 6f 67 28 72 53  Size = estLog(rS
15110 69 7a 65 29 3b 0a 20 20 66 6f 72 28 3b 20 72 63  ize);.  for(; rc
15120 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
15130 54 65 72 6d 21 3d 30 3b 20 70 54 65 72 6d 20 3d  Term!=0; pTerm =
15140 20 77 68 65 72 65 53 63 61 6e 4e 65 78 74 28 26   whereScanNext(&
15150 73 63 61 6e 29 29 7b 0a 20 20 20 20 75 31 36 20  scan)){.    u16 
15160 65 4f 70 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70  eOp = pTerm->eOp
15170 65 72 61 74 6f 72 3b 20 20 20 2f 2a 20 53 68 6f  erator;   /* Sho
15180 72 74 68 61 6e 64 20 66 6f 72 20 70 54 65 72 6d  rthand for pTerm
15190 2d 3e 65 4f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  ->eOperator */. 
151a0 20 20 20 4c 6f 67 45 73 74 20 72 43 6f 73 74 49     LogEst rCostI
151b0 64 78 3b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e  dx;.    LogEst n
151c0 4f 75 74 55 6e 61 64 6a 75 73 74 65 64 3b 20 20  OutUnadjusted;  
151d0 20 20 20 20 20 20 2f 2a 20 6e 4f 75 74 20 62 65        /* nOut be
151e0 66 6f 72 65 20 49 4e 28 29 20 61 6e 64 20 57 48  fore IN() and WH
151f0 45 52 45 20 61 64 6a 75 73 74 6d 65 6e 74 73 20  ERE adjustments 
15200 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e 20 3d  */.    int nIn =
15210 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
15220 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f  E_ENABLE_STAT3_O
15230 52 5f 53 54 41 54 34 0a 20 20 20 20 69 6e 74 20  R_STAT4.    int 
15240 6e 52 65 63 56 61 6c 69 64 20 3d 20 70 42 75 69  nRecValid = pBui
15250 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c 69 64 3b  lder->nRecValid;
15260 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
15270 28 65 4f 70 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20  (eOp==WO_ISNULL 
15280 7c 7c 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  || (pTerm->wtFla
15290 67 73 26 54 45 52 4d 5f 56 4e 55 4c 4c 29 21 3d  gs&TERM_VNULL)!=
152a0 30 29 0a 20 20 20 20 20 26 26 20 69 6e 64 65 78  0).     && index
152b0 43 6f 6c 75 6d 6e 4e 6f 74 4e 75 6c 6c 28 70 50  ColumnNotNull(pP
152c0 72 6f 62 65 2c 20 73 61 76 65 64 5f 6e 45 71 29  robe, saved_nEq)
152d0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6f  .    ){.      co
152e0 6e 74 69 6e 75 65 3b 20 2f 2a 20 69 67 6e 6f 72  ntinue; /* ignor
152f0 65 20 49 53 20 5b 4e 4f 54 5d 20 4e 55 4c 4c 20  e IS [NOT] NULL 
15300 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 4e  constraints on N
15310 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d 6e 73 20  OT NULL columns 
15320 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  */.    }.    if(
15330 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
15340 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61 73 6b  ght & pNew->mask
15350 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Self ) continue;
15360 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20  ..    /* Do not 
15370 61 6c 6c 6f 77 20 74 68 65 20 75 70 70 65 72 20  allow the upper 
15380 62 6f 75 6e 64 20 6f 66 20 61 20 4c 49 4b 45 20  bound of a LIKE 
15390 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 72 61 6e  optimization ran
153a0 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20  ge constraint.  
153b0 20 20 2a 2a 20 74 6f 20 6d 69 78 20 77 69 74 68    ** to mix with
153c0 20 61 20 6c 6f 77 65 72 20 72 61 6e 67 65 20 62   a lower range b
153d0 6f 75 6e 64 20 66 72 6f 6d 20 73 6f 6d 65 20 6f  ound from some o
153e0 74 68 65 72 20 73 6f 75 72 63 65 20 2a 2f 0a 20  ther source */. 
153f0 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
15400 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4c 49 4b  Flags & TERM_LIK
15410 45 4f 50 54 20 26 26 20 70 54 65 72 6d 2d 3e 65  EOPT && pTerm->e
15420 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c 54 20  Operator==WO_LT 
15430 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
15440 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77   /* Do not allow
15450 20 49 53 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IS constraints 
15460 66 72 6f 6d 20 74 68 65 20 57 48 45 52 45 20 63  from the WHERE c
15470 6c 61 75 73 65 20 74 6f 20 62 65 20 75 73 65 64  lause to be used
15480 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 72   by the.    ** r
15490 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20  ight table of a 
154a0 4c 45 46 54 20 4a 4f 49 4e 2e 20 20 4f 6e 6c 79  LEFT JOIN.  Only
154b0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20   constraints in 
154c0 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 61 72  the ON clause ar
154d0 65 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f 77 65 64  e.    ** allowed
154e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 53 72   */.    if( (pSr
154f0 63 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  c->fg.jointype &
15500 20 4a 54 5f 4c 45 46 54 29 21 3d 30 0a 20 20 20   JT_LEFT)!=0.   
15510 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f    && !ExprHasPro
15520 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
15530 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
15540 0a 20 20 20 20 20 26 26 20 28 65 4f 70 20 26 20  .     && (eOp & 
15550 28 57 4f 5f 49 53 7c 57 4f 5f 49 53 4e 55 4c 4c  (WO_IS|WO_ISNULL
15560 29 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  ))!=0.    ){.   
15570 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
15580 20 26 20 57 4f 5f 49 53 20 29 3b 0a 20 20 20 20   & WO_IS );.    
15590 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
155a0 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  & WO_ISNULL );. 
155b0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
155c0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 49 73     }..    if( Is
155d0 55 6e 69 71 75 65 49 6e 64 65 78 28 70 50 72 6f  UniqueIndex(pPro
155e0 62 65 29 20 26 26 20 73 61 76 65 64 5f 6e 45 71  be) && saved_nEq
155f0 3d 3d 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f  ==pProbe->nKeyCo
15600 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 70 42 75  l-1 ){.      pBu
15610 69 6c 64 65 72 2d 3e 62 6c 64 46 6c 61 67 73 20  ilder->bldFlags 
15620 7c 3d 20 53 51 4c 49 54 45 5f 42 4c 44 46 5f 55  |= SQLITE_BLDF_U
15630 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65  NIQUE;.    }else
15640 7b 0a 20 20 20 20 20 20 70 42 75 69 6c 64 65 72  {.      pBuilder
15650 2d 3e 62 6c 64 46 6c 61 67 73 20 7c 3d 20 53 51  ->bldFlags |= SQ
15660 4c 49 54 45 5f 42 4c 44 46 5f 49 4e 44 45 58 45  LITE_BLDF_INDEXE
15670 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  D;.    }.    pNe
15680 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 73 61 76  w->wsFlags = sav
15690 65 64 5f 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  ed_wsFlags;.    
156a0 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45  pNew->u.btree.nE
156b0 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b 0a 20  q = saved_nEq;. 
156c0 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
156d0 2e 6e 42 74 6d 20 3d 20 73 61 76 65 64 5f 6e 42  .nBtm = saved_nB
156e0 74 6d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e  tm;.    pNew->u.
156f0 62 74 72 65 65 2e 6e 54 6f 70 20 3d 20 73 61 76  btree.nTop = sav
15700 65 64 5f 6e 54 6f 70 3b 0a 20 20 20 20 70 4e 65  ed_nTop;.    pNe
15710 77 2d 3e 6e 4c 54 65 72 6d 20 3d 20 73 61 76 65  w->nLTerm = save
15720 64 5f 6e 4c 54 65 72 6d 3b 0a 20 20 20 20 69 66  d_nLTerm;.    if
15730 28 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a  ( whereLoopResiz
15740 65 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77  e(db, pNew, pNew
15750 2d 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72  ->nLTerm+1) ) br
15760 65 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20  eak; /* OOM */. 
15770 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72 6d 5b     pNew->aLTerm[
15780 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b 5d 20  pNew->nLTerm++] 
15790 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 70 4e 65  = pTerm;.    pNe
157a0 77 2d 3e 70 72 65 72 65 71 20 3d 20 28 73 61 76  w->prereq = (sav
157b0 65 64 5f 70 72 65 72 65 71 20 7c 20 70 54 65 72  ed_prereq | pTer
157c0 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29 20  m->prereqRight) 
157d0 26 20 7e 70 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c  & ~pNew->maskSel
157e0 66 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  f;..    assert( 
157f0 6e 49 6e 4d 75 6c 3d 3d 30 0a 20 20 20 20 20 20  nInMul==0.      
15800 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77 73 46 6c    || (pNew->wsFl
15810 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
15820 4d 4e 5f 4e 55 4c 4c 29 21 3d 30 20 0a 20 20 20  MN_NULL)!=0 .   
15830 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 77       || (pNew->w
15840 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
15850 4f 4c 55 4d 4e 5f 49 4e 29 21 3d 30 20 0a 20 20  OLUMN_IN)!=0 .  
15860 20 20 20 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e        || (pNew->
15870 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
15880 53 4b 49 50 53 43 41 4e 29 21 3d 30 20 0a 20 20  SKIPSCAN)!=0 .  
15890 20 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 65 4f    );..    if( eO
158a0 70 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20  p & WO_IN ){.   
158b0 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
158c0 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
158d0 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
158e0 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
158f0 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 69 66 28  MN_IN;.      if(
15900 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
15910 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
15920 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
15930 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45 43   /* "x IN (SELEC
15940 54 20 2e 2e 2e 29 22 3a 20 20 54 55 4e 49 4e 47  T ...)":  TUNING
15950 3a 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 74  : the SELECT ret
15960 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a  urns 25 rows */.
15970 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
15980 20 20 20 20 20 20 20 6e 49 6e 20 3d 20 34 36 3b         nIn = 46;
15990 20 20 61 73 73 65 72 74 28 20 34 36 3d 3d 73 71    assert( 46==sq
159a0 6c 69 74 65 33 4c 6f 67 45 73 74 28 32 35 29 20  lite3LogEst(25) 
159b0 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  );..        /* T
159c0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  he expression ma
159d0 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6f 66  y actually be of
159e0 20 74 68 65 20 66 6f 72 6d 20 28 78 2c 20 79 29   the form (x, y)
159f0 20 49 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29 2e   IN (SELECT...).
15a00 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 6e 20 74  .        ** In t
15a10 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69  his case there i
15a20 73 20 61 20 73 65 70 61 72 61 74 65 20 74 65 72  s a separate ter
15a30 6d 20 66 6f 72 20 65 61 63 68 20 6f 66 20 28 78  m for each of (x
15a40 29 20 61 6e 64 20 28 79 29 2e 0a 20 20 20 20 20  ) and (y)..     
15a50 20 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74     ** However, t
15a60 68 65 20 6e 49 6e 20 6d 75 6c 74 69 70 6c 69 65  he nIn multiplie
15a70 72 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  r should only be
15a80 20 61 70 70 6c 69 65 64 20 6f 6e 63 65 2c 20 6e   applied once, n
15a90 6f 74 20 6f 6e 63 65 0a 20 20 20 20 20 20 20 20  ot once.        
15aa0 2a 2a 20 66 6f 72 20 65 61 63 68 20 73 75 63 68  ** for each such
15ab0 20 74 65 72 6d 2e 20 54 68 65 20 66 6f 6c 6c 6f   term. The follo
15ac0 77 69 6e 67 20 6c 6f 6f 70 20 63 68 65 63 6b 73  wing loop checks
15ad0 20 74 68 61 74 20 70 54 65 72 6d 20 69 73 20 74   that pTerm is t
15ae0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 69  he.        ** fi
15af0 72 73 74 20 73 75 63 68 20 74 65 72 6d 20 69 6e  rst such term in
15b00 20 75 73 65 2c 20 61 6e 64 20 73 65 74 73 20 6e   use, and sets n
15b10 49 6e 20 62 61 63 6b 20 74 6f 20 30 20 69 66 20  In back to 0 if 
15b20 69 74 20 69 73 20 6e 6f 74 2e 20 2a 2f 0a 20 20  it is not. */.  
15b30 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
15b40 3c 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d 31 3b  <pNew->nLTerm-1;
15b50 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
15b60 20 69 66 28 20 70 4e 65 77 2d 3e 61 4c 54 65 72   if( pNew->aLTer
15b70 6d 5b 69 5d 20 26 26 20 70 4e 65 77 2d 3e 61 4c  m[i] && pNew->aL
15b80 54 65 72 6d 5b 69 5d 2d 3e 70 45 78 70 72 3d 3d  Term[i]->pExpr==
15b90 70 45 78 70 72 20 29 20 6e 49 6e 20 3d 20 30 3b  pExpr ) nIn = 0;
15ba0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
15bb0 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59   }else if( ALWAY
15bc0 53 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  S(pExpr->x.pList
15bd0 20 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69   && pExpr->x.pLi
15be0 73 74 2d 3e 6e 45 78 70 72 29 20 29 7b 0a 20 20  st->nExpr) ){.  
15bf0 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e 20 28        /* "x IN (
15c00 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e  value, value, ..
15c10 2e 29 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e  .)" */.        n
15c20 49 6e 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45  In = sqlite3LogE
15c30 73 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  st(pExpr->x.pLis
15c40 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
15c50 20 20 20 61 73 73 65 72 74 28 20 6e 49 6e 3e 30     assert( nIn>0
15c60 20 29 3b 20 20 2f 2a 20 52 48 53 20 61 6c 77 61   );  /* RHS alwa
15c70 79 73 20 68 61 73 20 32 20 6f 72 20 6d 6f 72 65  ys has 2 or more
15c80 20 74 65 72 6d 73 2e 2e 2e 20 20 54 68 65 20 70   terms...  The p
15c90 61 72 73 65 72 0a 20 20 20 20 20 20 20 20 20 20  arser.          
15ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cb0 2a 2a 20 63 68 61 6e 67 65 73 20 22 78 20 49 4e  ** changes "x IN
15cc0 20 28 3f 29 22 20 69 6e 74 6f 20 22 78 3d 3f 22   (?)" into "x=?"
15cd0 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  . */.      }.   
15ce0 20 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26   }else if( eOp &
15cf0 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20 29   (WO_EQ|WO_IS) )
15d00 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
15d10 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c   = pProbe->aiCol
15d20 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d 3b 0a  umn[saved_nEq];.
15d30 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c        pNew->wsFl
15d40 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c  ags |= WHERE_COL
15d50 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20 20 61 73  UMN_EQ;.      as
15d60 73 65 72 74 28 20 73 61 76 65 64 5f 6e 45 71 3d  sert( saved_nEq=
15d70 3d 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e  =pNew->u.btree.n
15d80 45 71 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Eq );.      if( 
15d90 69 43 6f 6c 3d 3d 58 4e 5f 52 4f 57 49 44 20 0a  iCol==XN_ROWID .
15da0 20 20 20 20 20 20 20 7c 7c 20 28 69 43 6f 6c 3e         || (iCol>
15db0 30 20 26 26 20 6e 49 6e 4d 75 6c 3d 3d 30 20 26  0 && nInMul==0 &
15dc0 26 20 73 61 76 65 64 5f 6e 45 71 3d 3d 70 50 72  & saved_nEq==pPr
15dd0 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 2d 31 29 0a  obe->nKeyCol-1).
15de0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
15df0 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20   if( iCol>=0 && 
15e00 70 50 72 6f 62 65 2d 3e 75 6e 69 71 4e 6f 74 4e  pProbe->uniqNotN
15e10 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ull==0 ){.      
15e20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
15e30 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e 51 5f 57  s |= WHERE_UNQ_W
15e40 41 4e 54 45 44 3b 0a 20 20 20 20 20 20 20 20 7d  ANTED;.        }
15e50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
15e60 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d  pNew->wsFlags |=
15e70 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20   WHERE_ONEROW;. 
15e80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
15e90 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
15ea0 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  Op & WO_ISNULL )
15eb0 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77 73  {.      pNew->ws
15ec0 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
15ed0 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20  OLUMN_NULL;.    
15ee0 7d 65 6c 73 65 20 69 66 28 20 65 4f 70 20 26 20  }else if( eOp & 
15ef0 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 7b  (WO_GT|WO_GE) ){
15f00 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15f10 20 65 4f 70 20 26 20 57 4f 5f 47 54 20 29 3b 0a   eOp & WO_GT );.
15f20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15f30 65 4f 70 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20  eOp & WO_GE );. 
15f40 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
15f50 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
15f60 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 42  MN_RANGE|WHERE_B
15f70 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  TM_LIMIT;.      
15f80 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 42  pNew->u.btree.nB
15f90 74 6d 20 3d 20 77 68 65 72 65 52 61 6e 67 65 56  tm = whereRangeV
15fa0 65 63 74 6f 72 4c 65 6e 28 0a 20 20 20 20 20 20  ectorLen(.      
15fb0 20 20 20 20 70 50 61 72 73 65 2c 20 70 53 72 63      pParse, pSrc
15fc0 2d 3e 69 43 75 72 73 6f 72 2c 20 70 50 72 6f 62  ->iCursor, pProb
15fd0 65 2c 20 73 61 76 65 64 5f 6e 45 71 2c 20 70 54  e, saved_nEq, pT
15fe0 65 72 6d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  erm.      );.   
15ff0 20 20 20 70 42 74 6d 20 3d 20 70 54 65 72 6d 3b     pBtm = pTerm;
16000 0a 20 20 20 20 20 20 70 54 6f 70 20 3d 20 30 3b  .      pTop = 0;
16010 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
16020 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
16030 5f 4c 49 4b 45 4f 50 54 20 29 7b 0a 20 20 20 20  _LIKEOPT ){.    
16040 20 20 20 20 2f 2a 20 52 61 6e 67 65 20 63 6f 6e      /* Range con
16050 74 72 61 69 6e 74 73 20 74 68 61 74 20 63 6f 6d  traints that com
16060 65 20 66 72 6f 6d 20 74 68 65 20 4c 49 4b 45 20  e from the LIKE 
16070 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 61 72 65  optimization are
16080 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61  .        ** alwa
16090 79 73 20 75 73 65 64 20 69 6e 20 70 61 69 72 73  ys used in pairs
160a0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 54 6f  . */.        pTo
160b0 70 20 3d 20 26 70 54 65 72 6d 5b 31 5d 3b 0a 20  p = &pTerm[1];. 
160c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
160d0 70 54 6f 70 2d 28 70 54 65 72 6d 2d 3e 70 57 43  pTop-(pTerm->pWC
160e0 2d 3e 61 29 29 3c 70 54 65 72 6d 2d 3e 70 57 43  ->a))<pTerm->pWC
160f0 2d 3e 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20 20  ->nTerm );.     
16100 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d     assert( pTop-
16110 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
16120 4c 49 4b 45 4f 50 54 20 29 3b 0a 20 20 20 20 20  LIKEOPT );.     
16130 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70 2d     assert( pTop-
16140 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c  >eOperator==WO_L
16150 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  T );.        if(
16160 20 77 68 65 72 65 4c 6f 6f 70 52 65 73 69 7a 65   whereLoopResize
16170 28 64 62 2c 20 70 4e 65 77 2c 20 70 4e 65 77 2d  (db, pNew, pNew-
16180 3e 6e 4c 54 65 72 6d 2b 31 29 20 29 20 62 72 65  >nLTerm+1) ) bre
16190 61 6b 3b 20 2f 2a 20 4f 4f 4d 20 2a 2f 0a 20 20  ak; /* OOM */.  
161a0 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
161b0 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b  rm[pNew->nLTerm+
161c0 2b 5d 20 3d 20 70 54 6f 70 3b 0a 20 20 20 20 20  +] = pTop;.     
161d0 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
161e0 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49   |= WHERE_TOP_LI
161f0 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  MIT;.        pNe
16200 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20  w->u.btree.nTop 
16210 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
16220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
16230 73 65 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f  sert( eOp & (WO_
16240 4c 54 7c 57 4f 5f 4c 45 29 20 29 3b 0a 20 20 20  LT|WO_LE) );.   
16250 20 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70     testcase( eOp
16260 20 26 20 57 4f 5f 4c 54 20 29 3b 0a 20 20 20 20   & WO_LT );.    
16270 20 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20    testcase( eOp 
16280 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20  & WO_LE );.     
16290 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c   pNew->wsFlags |
162a0 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  = WHERE_COLUMN_R
162b0 41 4e 47 45 7c 57 48 45 52 45 5f 54 4f 50 5f 4c  ANGE|WHERE_TOP_L
162c0 49 4d 49 54 3b 0a 20 20 20 20 20 20 70 4e 65 77  IMIT;.      pNew
162d0 2d 3e 75 2e 62 74 72 65 65 2e 6e 54 6f 70 20 3d  ->u.btree.nTop =
162e0 20 77 68 65 72 65 52 61 6e 67 65 56 65 63 74 6f   whereRangeVecto
162f0 72 4c 65 6e 28 0a 20 20 20 20 20 20 20 20 20 20  rLen(.          
16300 70 50 61 72 73 65 2c 20 70 53 72 63 2d 3e 69 43  pParse, pSrc->iC
16310 75 72 73 6f 72 2c 20 70 50 72 6f 62 65 2c 20 73  ursor, pProbe, s
16320 61 76 65 64 5f 6e 45 71 2c 20 70 54 65 72 6d 0a  aved_nEq, pTerm.
16330 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70        );.      p
16340 54 6f 70 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  Top = pTerm;.   
16350 20 20 20 70 42 74 6d 20 3d 20 28 70 4e 65 77 2d     pBtm = (pNew-
16360 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
16370 5f 42 54 4d 5f 4c 49 4d 49 54 29 21 3d 30 20 3f  _BTM_LIMIT)!=0 ?
16380 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16390 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65        pNew->aLTe
163a0 72 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2d  rm[pNew->nLTerm-
163b0 32 5d 20 3a 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  2] : 0;.    }.. 
163c0 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f     /* At this po
163d0 69 6e 74 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 69  int pNew->nOut i
163e0 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
163f0 62 65 72 20 6f 66 20 72 6f 77 73 20 65 78 70 65  ber of rows expe
16400 63 74 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  cted to.    ** b
16410 65 20 76 69 73 69 74 65 64 20 62 79 20 74 68 65  e visited by the
16420 20 69 6e 64 65 78 20 73 63 61 6e 20 62 65 66 6f   index scan befo
16430 72 65 20 63 6f 6e 73 69 64 65 72 69 6e 67 20 74  re considering t
16440 65 72 6d 20 70 54 65 72 6d 2c 20 6f 72 20 74 68  erm pTerm, or th
16450 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  e.    ** values 
16460 6f 66 20 6e 49 6e 20 61 6e 64 20 6e 49 6e 4d 75  of nIn and nInMu
16470 6c 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  l. In other word
16480 73 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  s, assuming that
16490 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 22 78 20   all .    ** "x 
164a0 49 4e 28 2e 2e 2e 29 22 20 74 65 72 6d 73 20 61  IN(...)" terms a
164b0 72 65 20 72 65 70 6c 61 63 65 64 20 77 69 74 68  re replaced with
164c0 20 22 78 20 3d 20 3f 22 2e 20 54 68 69 73 20 62   "x = ?". This b
164d0 6c 6f 63 6b 20 75 70 64 61 74 65 73 0a 20 20 20  lock updates.   
164e0 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
164f0 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 74 6f 20 61   pNew->nOut to a
16500 63 63 6f 75 6e 74 20 66 6f 72 20 70 54 65 72 6d  ccount for pTerm
16510 20 28 62 75 74 20 6e 6f 74 20 6e 49 6e 2f 6e 49   (but not nIn/nI
16520 6e 4d 75 6c 29 2e 20 20 2a 2f 0a 20 20 20 20 61  nMul).  */.    a
16530 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 75  ssert( pNew->nOu
16540 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74 20 29 3b  t==saved_nOut );
16550 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 77  .    if( pNew->w
16560 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
16570 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20  OLUMN_RANGE ){. 
16580 20 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 6e       /* Adjust n
16590 4f 75 74 20 75 73 69 6e 67 20 73 74 61 74 33 2f  Out using stat3/
165a0 73 74 61 74 34 20 64 61 74 61 2e 20 4f 72 2c 20  stat4 data. Or, 
165b0 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  if there is no s
165c0 74 61 74 33 2f 73 74 61 74 34 0a 20 20 20 20 20  tat3/stat4.     
165d0 20 2a 2a 20 64 61 74 61 2c 20 75 73 69 6e 67 20   ** data, using 
165e0 73 6f 6d 65 20 6f 74 68 65 72 20 65 73 74 69 6d  some other estim
165f0 61 74 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 77  ate.  */.      w
16600 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74  hereRangeScanEst
16610 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
16620 72 2c 20 70 42 74 6d 2c 20 70 54 6f 70 2c 20 70  r, pBtm, pTop, p
16630 4e 65 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  New);.    }else{
16640 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 20 3d  .      int nEq =
16650 20 2b 2b 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65   ++pNew->u.btree
16660 2e 6e 45 71 3b 0a 20 20 20 20 20 20 61 73 73 65  .nEq;.      asse
16670 72 74 28 20 65 4f 70 20 26 20 28 57 4f 5f 49 53  rt( eOp & (WO_IS
16680 4e 55 4c 4c 7c 57 4f 5f 45 51 7c 57 4f 5f 49 4e  NULL|WO_EQ|WO_IN
16690 7c 57 4f 5f 49 53 29 20 29 3b 0a 0a 20 20 20 20  |WO_IS) );..    
166a0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
166b0 6e 4f 75 74 3d 3d 73 61 76 65 64 5f 6e 4f 75 74  nOut==saved_nOut
166c0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54   );.      if( pT
166d0 65 72 6d 2d 3e 74 72 75 74 68 50 72 6f 62 3c 3d  erm->truthProb<=
166e0 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 69 43  0 && pProbe->aiC
166f0 6f 6c 75 6d 6e 5b 73 61 76 65 64 5f 6e 45 71 5d  olumn[saved_nEq]
16700 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  >=0 ){.        a
16710 73 73 65 72 74 28 20 28 65 4f 70 20 26 20 57 4f  ssert( (eOp & WO
16720 5f 49 4e 29 20 7c 7c 20 6e 49 6e 3d 3d 30 20 29  _IN) || nIn==0 )
16730 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
16740 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49 4e 20  se( eOp & WO_IN 
16750 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
16760 3e 6e 4f 75 74 20 2b 3d 20 70 54 65 72 6d 2d 3e  >nOut += pTerm->
16770 74 72 75 74 68 50 72 6f 62 3b 0a 20 20 20 20 20  truthProb;.     
16780 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d     pNew->nOut -=
16790 20 6e 49 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73   nIn;.      }els
167a0 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e{.#ifdef SQLITE
167b0 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f 52  _ENABLE_STAT3_OR
167c0 5f 53 54 41 54 34 0a 20 20 20 20 20 20 20 20 74  _STAT4.        t
167d0 52 6f 77 63 6e 74 20 6e 4f 75 74 20 3d 20 30 3b  Rowcnt nOut = 0;
167e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 49 6e  .        if( nIn
167f0 4d 75 6c 3d 3d 30 20 0a 20 20 20 20 20 20 20 20  Mul==0 .        
16800 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 53 61 6d   && pProbe->nSam
16810 70 6c 65 20 0a 20 20 20 20 20 20 20 20 20 26 26  ple .         &&
16820 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e   pNew->u.btree.n
16830 45 71 3c 3d 70 50 72 6f 62 65 2d 3e 6e 53 61 6d  Eq<=pProbe->nSam
16840 70 6c 65 43 6f 6c 0a 20 20 20 20 20 20 20 20 20  pleCol.         
16850 26 26 20 28 28 65 4f 70 20 26 20 57 4f 5f 49 4e  && ((eOp & WO_IN
16860 29 3d 3d 30 20 7c 7c 20 21 45 78 70 72 48 61 73  )==0 || !ExprHas
16870 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
16880 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
16890 65 63 74 29 29 0a 20 20 20 20 20 20 20 20 29 7b  ect)).        ){
168a0 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
168b0 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
168c0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
168d0 20 69 66 28 20 28 65 4f 70 20 26 20 28 57 4f 5f   if( (eOp & (WO_
168e0 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f  EQ|WO_ISNULL|WO_
168f0 49 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  IS))!=0 ){.     
16900 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
16910 20 65 4f 70 20 26 20 57 4f 5f 45 51 20 29 3b 0a   eOp & WO_EQ );.
16920 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
16930 63 61 73 65 28 20 65 4f 70 20 26 20 57 4f 5f 49  case( eOp & WO_I
16940 53 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  S );.           
16950 20 74 65 73 74 63 61 73 65 28 20 65 4f 70 20 26   testcase( eOp &
16960 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20   WO_ISNULL );.  
16970 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
16980 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
16990 28 70 50 61 72 73 65 2c 20 70 42 75 69 6c 64 65  (pParse, pBuilde
169a0 72 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  r, pExpr->pRight
169b0 2c 20 26 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20  , &nOut);.      
169c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
169d0 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
169e0 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72 73  eInScanEst(pPars
169f0 65 2c 20 70 42 75 69 6c 64 65 72 2c 20 70 45 78  e, pBuilder, pEx
16a00 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e 4f  pr->x.pList, &nO
16a10 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ut);.          }
16a20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
16a30 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  c==SQLITE_NOTFOU
16a40 4e 44 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  ND ) rc = SQLITE
16a50 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  _OK;.          i
16a60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16a70 20 29 20 62 72 65 61 6b 3b 20 20 20 20 20 20 20   ) break;       
16a80 20 20 20 2f 2a 20 4a 75 6d 70 20 6f 75 74 20 6f     /* Jump out o
16a90 66 20 74 68 65 20 70 54 65 72 6d 20 6c 6f 6f 70  f the pTerm loop
16aa0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
16ab0 28 20 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  ( nOut ){.      
16ac0 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
16ad0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
16ae0 28 6e 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  (nOut);.        
16af0 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 6e 4f      if( pNew->nO
16b00 75 74 3e 73 61 76 65 64 5f 6e 4f 75 74 20 29 20  ut>saved_nOut ) 
16b10 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d 20 73 61 76  pNew->nOut = sav
16b20 65 64 5f 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20  ed_nOut;.       
16b30 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
16b40 2d 3d 20 6e 49 6e 3b 0a 20 20 20 20 20 20 20 20  -= nIn;.        
16b50 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
16b60 20 20 20 20 20 20 69 66 28 20 6e 4f 75 74 3d 3d        if( nOut==
16b70 30 20 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  0 ).#endif.     
16b80 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70     {.          p
16b90 4e 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 28 70 50  New->nOut += (pP
16ba0 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  robe->aiRowLogEs
16bb0 74 5b 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d  t[nEq] - pProbe-
16bc0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 6e 45 71  >aiRowLogEst[nEq
16bd0 2d 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1]);.          
16be0 69 66 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e  if( eOp & WO_ISN
16bf0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ULL ){.         
16c00 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 49 66     /* TUNING: If
16c10 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6b   there is no lik
16c20 65 6c 69 68 6f 6f 64 28 29 20 76 61 6c 75 65 2c  elihood() value,
16c30 20 61 73 73 75 6d 65 20 74 68 61 74 20 61 20 0a   assume that a .
16c40 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 22              ** "
16c50 63 6f 6c 20 49 53 20 4e 55 4c 4c 22 20 65 78 70  col IS NULL" exp
16c60 72 65 73 73 69 6f 6e 20 6d 61 74 63 68 65 73 20  ression matches 
16c70 74 77 69 63 65 20 61 73 20 6d 61 6e 79 20 72 6f  twice as many ro
16c80 77 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ws .            
16c90 2a 2a 20 61 73 20 28 63 6f 6c 3d 3f 29 2e 20 2a  ** as (col=?). *
16ca0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  /.            pN
16cb0 65 77 2d 3e 6e 4f 75 74 20 2b 3d 20 31 30 3b 0a  ew->nOut += 10;.
16cc0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
16cd0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
16ce0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
16cf0 72 43 6f 73 74 49 64 78 20 74 6f 20 74 68 65 20  rCostIdx to the 
16d00 63 6f 73 74 20 6f 66 20 76 69 73 69 74 69 6e 67  cost of visiting
16d10 20 73 65 6c 65 63 74 65 64 20 72 6f 77 73 20 69   selected rows i
16d20 6e 20 69 6e 64 65 78 2e 20 41 64 64 0a 20 20 20  n index. Add.   
16d30 20 2a 2a 20 69 74 20 74 6f 20 70 4e 65 77 2d 3e   ** it to pNew->
16d40 72 52 75 6e 2c 20 77 68 69 63 68 20 69 73 20 63  rRun, which is c
16d50 75 72 72 65 6e 74 6c 79 20 73 65 74 20 74 6f 20  urrently set to 
16d60 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20  the cost of the 
16d70 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 73 65 65  index.    ** see
16d80 6b 20 6f 6e 6c 79 2e 20 54 68 65 6e 2c 20 69 66  k only. Then, if
16d90 20 74 68 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63   this is a non-c
16da0 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 61  overing index, a
16db0 64 64 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 20  dd the cost of. 
16dc0 20 20 20 2a 2a 20 76 69 73 69 74 69 6e 67 20 74     ** visiting t
16dd0 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d  he rows in the m
16de0 61 69 6e 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  ain table.  */. 
16df0 20 20 20 72 43 6f 73 74 49 64 78 20 3d 20 70 4e     rCostIdx = pN
16e00 65 77 2d 3e 6e 4f 75 74 20 2b 20 31 20 2b 20 28  ew->nOut + 1 + (
16e10 31 35 2a 70 50 72 6f 62 65 2d 3e 73 7a 49 64 78  15*pProbe->szIdx
16e20 52 6f 77 29 2f 70 53 72 63 2d 3e 70 54 61 62 2d  Row)/pSrc->pTab-
16e30 3e 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 70  >szTabRow;.    p
16e40 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
16e50 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f  te3LogEstAdd(rLo
16e60 67 53 69 7a 65 2c 20 72 43 6f 73 74 49 64 78 29  gSize, rCostIdx)
16e70 3b 0a 20 20 20 20 69 66 28 20 28 70 4e 65 77 2d  ;.    if( (pNew-
16e80 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  >wsFlags & (WHER
16e90 45 5f 49 44 58 5f 4f 4e 4c 59 7c 57 48 45 52 45  E_IDX_ONLY|WHERE
16ea0 5f 49 50 4b 29 29 3d 3d 30 20 29 7b 0a 20 20 20  _IPK))==0 ){.   
16eb0 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20     pNew->rRun = 
16ec0 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64  sqlite3LogEstAdd
16ed0 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 4e 65  (pNew->rRun, pNe
16ee0 77 2d 3e 6e 4f 75 74 20 2b 20 31 36 29 3b 0a 20  w->nOut + 16);. 
16ef0 20 20 20 7d 0a 20 20 20 20 41 70 70 6c 79 43 6f     }.    ApplyCo
16f00 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70 4e 65  stMultiplier(pNe
16f10 77 2d 3e 72 52 75 6e 2c 20 70 50 72 6f 62 65 2d  w->rRun, pProbe-
16f20 3e 70 54 61 62 6c 65 2d 3e 63 6f 73 74 4d 75 6c  >pTable->costMul
16f30 74 29 3b 0a 0a 20 20 20 20 6e 4f 75 74 55 6e 61  t);..    nOutUna
16f40 64 6a 75 73 74 65 64 20 3d 20 70 4e 65 77 2d 3e  djusted = pNew->
16f50 6e 4f 75 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  nOut;.    pNew->
16f60 72 52 75 6e 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b  rRun += nInMul +
16f70 20 6e 49 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   nIn;.    pNew->
16f80 6e 4f 75 74 20 2b 3d 20 6e 49 6e 4d 75 6c 20 2b  nOut += nInMul +
16f90 20 6e 49 6e 3b 0a 20 20 20 20 77 68 65 72 65 4c   nIn;.    whereL
16fa0 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
16fb0 70 42 75 69 6c 64 65 72 2d 3e 70 57 43 2c 20 70  pBuilder->pWC, p
16fc0 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20 20  New, rSize);.   
16fd0 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
16fe0 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
16ff0 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20  pNew);..    if( 
17000 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 26 20  pNew->wsFlags & 
17010 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
17020 47 45 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  GE ){.      pNew
17030 2d 3e 6e 4f 75 74 20 3d 20 73 61 76 65 64 5f 6e  ->nOut = saved_n
17040 4f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Out;.    }else{.
17050 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74        pNew->nOut
17060 20 3d 20 6e 4f 75 74 55 6e 61 64 6a 75 73 74 65   = nOutUnadjuste
17070 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  d;.    }..    if
17080 28 20 28 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73  ( (pNew->wsFlags
17090 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
170a0 49 54 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 70  IT)==0.     && p
170b0 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71  New->u.btree.nEq
170c0 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  <pProbe->nColumn
170d0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 77 68  .    ){.      wh
170e0 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65 49  ereLoopAddBtreeI
170f0 6e 64 65 78 28 70 42 75 69 6c 64 65 72 2c 20 70  ndex(pBuilder, p
17100 53 72 63 2c 20 70 50 72 6f 62 65 2c 20 6e 49 6e  Src, pProbe, nIn
17110 4d 75 6c 2b 6e 49 6e 29 3b 0a 20 20 20 20 7d 0a  Mul+nIn);.    }.
17120 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
17130 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 23 69 66   saved_nOut;.#if
17140 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
17150 45 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34  E_STAT3_OR_STAT4
17160 0a 20 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 6e  .    pBuilder->n
17170 52 65 63 56 61 6c 69 64 20 3d 20 6e 52 65 63 56  RecValid = nRecV
17180 61 6c 69 64 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  alid;.#endif.  }
17190 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 20  .  pNew->prereq 
171a0 3d 20 73 61 76 65 64 5f 70 72 65 72 65 71 3b 0a  = saved_prereq;.
171b0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
171c0 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b  nEq = saved_nEq;
171d0 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65  .  pNew->u.btree
171e0 2e 6e 42 74 6d 20 3d 20 73 61 76 65 64 5f 6e 42  .nBtm = saved_nB
171f0 74 6d 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 62 74  tm;.  pNew->u.bt
17200 72 65 65 2e 6e 54 6f 70 20 3d 20 73 61 76 65 64  ree.nTop = saved
17210 5f 6e 54 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 6e  _nTop;.  pNew->n
17220 53 6b 69 70 20 3d 20 73 61 76 65 64 5f 6e 53 6b  Skip = saved_nSk
17230 69 70 3b 0a 20 20 70 4e 65 77 2d 3e 77 73 46 6c  ip;.  pNew->wsFl
17240 61 67 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c  ags = saved_wsFl
17250 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75  ags;.  pNew->nOu
17260 74 20 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a  t = saved_nOut;.
17270 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
17280 20 73 61 76 65 64 5f 6e 4c 54 65 72 6d 3b 0a 0a   saved_nLTerm;..
17290 20 20 2f 2a 20 43 6f 6e 73 69 64 65 72 20 75 73    /* Consider us
172a0 69 6e 67 20 61 20 73 6b 69 70 2d 73 63 61 6e 20  ing a skip-scan 
172b0 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  if there are no 
172c0 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
172d0 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 61 76  straints.  ** av
172e0 61 69 6c 61 62 6c 65 20 66 6f 72 20 74 68 65 20  ailable for the 
172f0 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20  left-most terms 
17300 6f 66 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e  of the index, an
17310 64 20 69 66 20 74 68 65 20 61 76 65 72 61 67 65  d if the average
17320 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .  ** number of 
17330 72 65 70 65 61 74 73 20 69 6e 20 74 68 65 20 6c  repeats in the l
17340 65 66 74 2d 6d 6f 73 74 20 74 65 72 6d 73 20 69  eft-most terms i
17350 73 20 61 74 20 6c 65 61 73 74 20 31 38 2e 20 0a  s at least 18. .
17360 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 6d 61    **.  ** The ma
17370 67 69 63 20 6e 75 6d 62 65 72 20 31 38 20 69 73  gic number 18 is
17380 20 73 65 6c 65 63 74 65 64 20 6f 6e 20 74 68 65   selected on the
17390 20 62 61 73 69 73 20 74 68 61 74 20 73 63 61 6e   basis that scan
173a0 6e 69 6e 67 20 31 37 20 72 6f 77 73 0a 20 20 2a  ning 17 rows.  *
173b0 2a 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61  * is almost alwa
173c0 79 73 20 71 75 69 63 6b 65 72 20 74 68 61 6e 20  ys quicker than 
173d0 61 6e 20 69 6e 64 65 78 20 73 65 65 6b 20 28 65  an index seek (e
173e0 76 65 6e 20 74 68 6f 75 67 68 20 69 66 20 74 68  ven though if th
173f0 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 63 6f 6e  e index.  ** con
17400 74 61 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e  tains fewer than
17410 20 32 5e 31 37 20 72 6f 77 73 20 77 65 20 61 73   2^17 rows we as
17420 73 75 6d 65 20 6f 74 68 65 72 77 69 73 65 20 69  sume otherwise i
17430 6e 20 6f 74 68 65 72 20 70 61 72 74 73 20 6f 66  n other parts of
17440 0a 20 20 2a 2a 20 74 68 65 20 63 6f 64 65 29 2e  .  ** the code).
17450 20 41 6e 64 2c 20 65 76 65 6e 20 69 66 20 69 74   And, even if it
17460 20 69 73 20 6e 6f 74 2c 20 69 74 20 73 68 6f 75   is not, it shou
17470 6c 64 20 6e 6f 74 20 62 65 20 74 6f 6f 20 6d 75  ld not be too mu
17480 63 68 20 73 6c 6f 77 65 72 2e 20 0a 20 20 2a 2a  ch slower. .  **
17490 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
174a0 6e 64 2c 20 74 68 65 20 65 78 74 72 61 20 73 65  nd, the extra se
174b0 65 6b 73 20 63 6f 75 6c 64 20 65 6e 64 20 75 70  eks could end up
174c0 20 62 65 69 6e 67 20 73 69 67 6e 69 66 69 63 61   being significa
174d0 6e 74 6c 79 0a 20 20 2a 2a 20 6d 6f 72 65 20 65  ntly.  ** more e
174e0 78 70 65 6e 73 69 76 65 2e 20 20 2a 2f 0a 20 20  xpensive.  */.  
174f0 61 73 73 65 72 74 28 20 34 32 3d 3d 73 71 6c 69  assert( 42==sqli
17500 74 65 33 4c 6f 67 45 73 74 28 31 38 29 20 29 3b  te3LogEst(18) );
17510 0a 20 20 69 66 28 20 73 61 76 65 64 5f 6e 45 71  .  if( saved_nEq
17520 3d 3d 73 61 76 65 64 5f 6e 53 6b 69 70 0a 20 20  ==saved_nSkip.  
17530 20 26 26 20 73 61 76 65 64 5f 6e 45 71 2b 31 3c   && saved_nEq+1<
17540 70 50 72 6f 62 65 2d 3e 6e 4b 65 79 43 6f 6c 0a  pProbe->nKeyCol.
17550 20 20 20 26 26 20 70 50 72 6f 62 65 2d 3e 6e 6f     && pProbe->no
17560 53 6b 69 70 53 63 61 6e 3d 3d 30 0a 20 20 20 26  SkipScan==0.   &
17570 26 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c  & pProbe->aiRowL
17580 6f 67 45 73 74 5b 73 61 76 65 64 5f 6e 45 71 2b  ogEst[saved_nEq+
17590 31 5d 3e 3d 34 32 20 20 2f 2a 20 54 55 4e 49 4e  1]>=42  /* TUNIN
175a0 47 3a 20 4d 69 6e 69 6d 75 6d 20 66 6f 72 20 73  G: Minimum for s
175b0 6b 69 70 2d 73 63 61 6e 20 2a 2f 0a 20 20 20 26  kip-scan */.   &
175c0 26 20 28 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f  & (rc = whereLoo
175d0 70 52 65 73 69 7a 65 28 64 62 2c 20 70 4e 65 77  pResize(db, pNew
175e0 2c 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 31  , pNew->nLTerm+1
175f0 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ))==SQLITE_OK.  
17600 29 7b 0a 20 20 20 20 4c 6f 67 45 73 74 20 6e 49  ){.    LogEst nI
17610 74 65 72 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75  ter;.    pNew->u
17620 2e 62 74 72 65 65 2e 6e 45 71 2b 2b 3b 0a 20 20  .btree.nEq++;.  
17630 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70 2b 2b 3b    pNew->nSkip++;
17640 0a 20 20 20 20 70 4e 65 77 2d 3e 61 4c 54 65 72  .    pNew->aLTer
17650 6d 5b 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 2b 2b  m[pNew->nLTerm++
17660 5d 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d  ] = 0;.    pNew-
17670 3e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  >wsFlags |= WHER
17680 45 5f 53 4b 49 50 53 43 41 4e 3b 0a 20 20 20 20  E_SKIPSCAN;.    
17690 6e 49 74 65 72 20 3d 20 70 50 72 6f 62 65 2d 3e  nIter = pProbe->
176a0 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76 65  aiRowLogEst[save
176b0 64 5f 6e 45 71 5d 20 2d 20 70 50 72 6f 62 65 2d  d_nEq] - pProbe-
176c0 3e 61 69 52 6f 77 4c 6f 67 45 73 74 5b 73 61 76  >aiRowLogEst[sav
176d0 65 64 5f 6e 45 71 2b 31 5d 3b 0a 20 20 20 20 70  ed_nEq+1];.    p
176e0 4e 65 77 2d 3e 6e 4f 75 74 20 2d 3d 20 6e 49 74  New->nOut -= nIt
176f0 65 72 3b 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e  er;.    /* TUNIN
17700 47 3a 20 20 42 65 63 61 75 73 65 20 75 6e 63 65  G:  Because unce
17710 72 74 61 69 6e 74 69 65 73 20 69 6e 20 74 68 65  rtainties in the
17720 20 65 73 74 69 6d 61 74 65 73 20 66 6f 72 20 73   estimates for s
17730 6b 69 70 2d 73 63 61 6e 20 71 75 65 72 69 65 73  kip-scan queries
17740 2c 0a 20 20 20 20 2a 2a 20 61 64 64 20 61 20 31  ,.    ** add a 1
17750 2e 33 37 35 20 66 75 64 67 65 20 66 61 63 74 6f  .375 fudge facto
17760 72 20 74 6f 20 6d 61 6b 65 20 73 6b 69 70 2d 73  r to make skip-s
17770 63 61 6e 20 73 6c 69 67 68 74 6c 79 20 6c 65 73  can slightly les
17780 73 20 6c 69 6b 65 6c 79 2e 20 2a 2f 0a 20 20 20  s likely. */.   
17790 20 6e 49 74 65 72 20 2b 3d 20 35 3b 0a 20 20 20   nIter += 5;.   
177a0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
177b0 65 65 49 6e 64 65 78 28 70 42 75 69 6c 64 65 72  eeIndex(pBuilder
177c0 2c 20 70 53 72 63 2c 20 70 50 72 6f 62 65 2c 20  , pSrc, pProbe, 
177d0 6e 49 74 65 72 20 2b 20 6e 49 6e 4d 75 6c 29 3b  nIter + nInMul);
177e0 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20  .    pNew->nOut 
177f0 3d 20 73 61 76 65 64 5f 6e 4f 75 74 3b 0a 20 20  = saved_nOut;.  
17800 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
17810 6e 45 71 20 3d 20 73 61 76 65 64 5f 6e 45 71 3b  nEq = saved_nEq;
17820 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 6b 69 70  .    pNew->nSkip
17830 20 3d 20 73 61 76 65 64 5f 6e 53 6b 69 70 3b 0a   = saved_nSkip;.
17840 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67      pNew->wsFlag
17850 73 20 3d 20 73 61 76 65 64 5f 77 73 46 6c 61 67  s = saved_wsFlag
17860 73 3b 0a 20 20 7d 0a 0a 20 20 57 48 45 52 45 54  s;.  }..  WHERET
17870 52 41 43 45 28 30 78 38 30 30 2c 20 28 22 45 4e  RACE(0x800, ("EN
17880 44 20 61 64 64 42 74 72 65 65 49 64 78 28 25 73  D addBtreeIdx(%s
17890 29 2c 20 6e 45 71 3d 25 64 2c 20 72 63 3d 25 64  ), nEq=%d, rc=%d
178a0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
178b0 20 20 20 20 20 20 20 20 20 20 20 70 50 72 6f 62             pProb
178c0 65 2d 3e 7a 4e 61 6d 65 2c 20 73 61 76 65 64 5f  e->zName, saved_
178d0 6e 45 71 2c 20 72 63 29 29 3b 0a 20 20 72 65 74  nEq, rc));.  ret
178e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
178f0 20 52 65 74 75 72 6e 20 54 72 75 65 20 69 66 20   Return True if 
17900 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
17910 68 61 74 20 70 49 6e 64 65 78 20 6d 69 67 68 74  hat pIndex might
17920 20 62 65 20 75 73 65 66 75 6c 20 69 6e 0a 2a 2a   be useful in.**
17930 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 74 68   implementing th
17940 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
17950 65 20 69 6e 20 70 42 75 69 6c 64 65 72 2e 0a 2a  e in pBuilder..*
17960 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 61 6c 73  *.** Return Fals
17970 65 20 69 66 20 70 42 75 69 6c 64 65 72 20 64 6f  e if pBuilder do
17980 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
17990 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
179a0 65 20 6f 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  e or.** if there
179b0 20 69 73 20 6e 6f 20 77 61 79 20 66 6f 72 20 70   is no way for p
179c0 49 6e 64 65 78 20 74 6f 20 62 65 20 75 73 65 66  Index to be usef
179d0 75 6c 20 69 6e 20 69 6d 70 6c 65 6d 65 6e 74 69  ul in implementi
179e0 6e 67 20 74 68 61 74 0a 2a 2a 20 4f 52 44 45 52  ng that.** ORDER
179f0 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73   BY clause..*/.s
17a00 74 61 74 69 63 20 69 6e 74 20 69 6e 64 65 78 4d  tatic int indexM
17a10 69 67 68 74 48 65 6c 70 57 69 74 68 4f 72 64 65  ightHelpWithOrde
17a20 72 42 79 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  rBy(.  WhereLoop
17a30 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
17a40 72 2c 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  r,.  Index *pInd
17a50 65 78 2c 0a 20 20 69 6e 74 20 69 43 75 72 73 6f  ex,.  int iCurso
17a60 72 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  r.){.  ExprList 
17a70 2a 70 4f 42 3b 0a 20 20 45 78 70 72 4c 69 73 74  *pOB;.  ExprList
17a80 20 2a 61 43 6f 6c 45 78 70 72 3b 0a 20 20 69 6e   *aColExpr;.  in
17a90 74 20 69 69 2c 20 6a 6a 3b 0a 0a 20 20 69 66 28  t ii, jj;..  if(
17aa0 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f 72 64 65   pIndex->bUnorde
17ab0 72 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  red ) return 0;.
17ac0 20 20 69 66 28 20 28 70 4f 42 20 3d 20 70 42 75    if( (pOB = pBu
17ad0 69 6c 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70  ilder->pWInfo->p
17ae0 4f 72 64 65 72 42 79 29 3d 3d 30 20 29 20 72 65  OrderBy)==0 ) re
17af0 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 69  turn 0;.  for(ii
17b00 3d 30 3b 20 69 69 3c 70 4f 42 2d 3e 6e 45 78 70  =0; ii<pOB->nExp
17b10 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 45 78  r; ii++){.    Ex
17b20 70 72 20 2a 70 45 78 70 72 20 3d 20 73 71 6c 69  pr *pExpr = sqli
17b30 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
17b40 74 65 28 70 4f 42 2d 3e 61 5b 69 69 5d 2e 70 45  te(pOB->a[ii].pE
17b50 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 70 45  xpr);.    if( pE
17b60 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  xpr->op==TK_COLU
17b70 4d 4e 20 26 26 20 70 45 78 70 72 2d 3e 69 54 61  MN && pExpr->iTa
17b80 62 6c 65 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a  ble==iCursor ){.
17b90 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
17ba0 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 20 72 65 74  >iColumn<0 ) ret
17bb0 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 66 6f 72  urn 1;.      for
17bc0 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64 65 78  (jj=0; jj<pIndex
17bd0 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b 2b 29  ->nKeyCol; jj++)
17be0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  {.        if( pE
17bf0 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49  xpr->iColumn==pI
17c00 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  ndex->aiColumn[j
17c10 6a 5d 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  j] ) return 1;. 
17c20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
17c30 20 69 66 28 20 28 61 43 6f 6c 45 78 70 72 20 3d   if( (aColExpr =
17c40 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70   pIndex->aColExp
17c50 72 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  r)!=0 ){.      f
17c60 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 70 49 6e 64  or(jj=0; jj<pInd
17c70 65 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 6a 6a 2b  ex->nKeyCol; jj+
17c80 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
17c90 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
17ca0 5b 6a 6a 5d 21 3d 58 4e 5f 45 58 50 52 20 29 20  [jj]!=XN_EXPR ) 
17cb0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
17cc0 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
17cd0 72 43 6f 6d 70 61 72 65 53 6b 69 70 28 70 45 78  rCompareSkip(pEx
17ce0 70 72 2c 61 43 6f 6c 45 78 70 72 2d 3e 61 5b 6a  pr,aColExpr->a[j
17cf0 6a 5d 2e 70 45 78 70 72 2c 69 43 75 72 73 6f 72  j].pExpr,iCursor
17d00 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
17d10 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
17d20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
17d30 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
17d40 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
17d50 75 72 6e 20 61 20 62 69 74 6d 61 73 6b 20 77 68  urn a bitmask wh
17d60 65 72 65 20 31 73 20 69 6e 64 69 63 61 74 65 20  ere 1s indicate 
17d70 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 73 70  that the corresp
17d80 6f 6e 64 69 6e 67 20 63 6f 6c 75 6d 6e 20 6f 66  onding column of
17d90 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 69 73  .** the table is
17da0 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65   used by an inde
17db0 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72  x.  Only the fir
17dc0 73 74 20 36 33 20 63 6f 6c 75 6d 6e 73 20 61 72  st 63 columns ar
17dd0 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f  e considered..*/
17de0 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
17df0 63 6f 6c 75 6d 6e 73 49 6e 49 6e 64 65 78 28 49  columnsInIndex(I
17e00 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 42  ndex *pIdx){.  B
17e10 69 74 6d 61 73 6b 20 6d 20 3d 20 30 3b 0a 20 20  itmask m = 0;.  
17e20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 70  int j;.  for(j=p
17e30 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 2d 31 3b 20  Idx->nColumn-1; 
17e40 6a 3e 3d 30 3b 20 6a 2d 2d 29 7b 0a 20 20 20 20  j>=0; j--){.    
17e50 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e 61 69  int x = pIdx->ai
17e60 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 69  Column[j];.    i
17e70 66 28 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( x>=0 ){.     
17e80 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 42 4d   testcase( x==BM
17e90 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74 65 73  S-1 );.      tes
17ea0 74 63 61 73 65 28 20 78 3d 3d 42 4d 53 2d 32 20  tcase( x==BMS-2 
17eb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78 3c 42  );.      if( x<B
17ec0 4d 53 2d 31 20 29 20 6d 20 7c 3d 20 4d 41 53 4b  MS-1 ) m |= MASK
17ed0 42 49 54 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20  BIT(x);.    }.  
17ee0 7d 0a 20 20 72 65 74 75 72 6e 20 6d 3b 0a 7d 0a  }.  return m;.}.
17ef0 0a 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  ./* Check to see
17f00 20 69 66 20 61 20 70 61 72 74 69 61 6c 20 69 6e   if a partial in
17f10 64 65 78 20 77 69 74 68 20 70 50 61 72 74 49 6e  dex with pPartIn
17f20 64 65 78 57 68 65 72 65 20 63 61 6e 20 62 65 20  dexWhere can be 
17f30 75 73 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 63  used.** in the c
17f40 75 72 72 65 6e 74 20 71 75 65 72 79 2e 20 20 52  urrent query.  R
17f50 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
17f60 20 63 61 6e 20 62 65 20 61 6e 64 20 66 61 6c 73   can be and fals
17f70 65 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61  e if not..*/.sta
17f80 74 69 63 20 69 6e 74 20 77 68 65 72 65 55 73 61  tic int whereUsa
17f90 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28  blePartialIndex(
17fa0 69 6e 74 20 69 54 61 62 2c 20 57 68 65 72 65 43  int iTab, WhereC
17fb0 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
17fc0 20 2a 70 57 68 65 72 65 29 7b 0a 20 20 69 6e 74   *pWhere){.  int
17fd0 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20   i;.  WhereTerm 
17fe0 2a 70 54 65 72 6d 3b 0a 20 20 50 61 72 73 65 20  *pTerm;.  Parse 
17ff0 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70  *pParse = pWC->p
18000 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
18010 20 77 68 69 6c 65 28 20 70 57 68 65 72 65 2d 3e   while( pWhere->
18020 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20  op==TK_AND ){.  
18030 20 20 69 66 28 20 21 77 68 65 72 65 55 73 61 62    if( !whereUsab
18040 6c 65 50 61 72 74 69 61 6c 49 6e 64 65 78 28 69  lePartialIndex(i
18050 54 61 62 2c 70 57 43 2c 70 57 68 65 72 65 2d 3e  Tab,pWC,pWhere->
18060 70 4c 65 66 74 29 20 29 20 72 65 74 75 72 6e 20  pLeft) ) return 
18070 30 3b 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20  0;.    pWhere = 
18080 70 57 68 65 72 65 2d 3e 70 52 69 67 68 74 3b 0a  pWhere->pRight;.
18090 20 20 7d 0a 20 20 69 66 28 20 70 50 61 72 73 65    }.  if( pParse
180a0 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
180b0 4c 49 54 45 5f 45 6e 61 62 6c 65 51 50 53 47 20  LITE_EnableQPSG 
180c0 29 20 70 50 61 72 73 65 20 3d 20 30 3b 0a 20 20  ) pParse = 0;.  
180d0 66 6f 72 28 69 3d 30 2c 20 70 54 65 72 6d 3d 70  for(i=0, pTerm=p
180e0 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54  WC->a; i<pWC->nT
180f0 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  erm; i++, pTerm+
18100 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
18110 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
18120 70 72 3b 0a 20 20 20 20 69 66 28 20 28 21 45 78  pr;.    if( (!Ex
18130 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
18140 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e  xpr, EP_FromJoin
18150 29 20 7c 7c 20 70 45 78 70 72 2d 3e 69 52 69 67  ) || pExpr->iRig
18160 68 74 4a 6f 69 6e 54 61 62 6c 65 3d 3d 69 54 61  htJoinTable==iTa
18170 62 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74  b).     && sqlit
18180 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
18190 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  r(pParse, pExpr,
181a0 20 70 57 68 65 72 65 2c 20 69 54 61 62 29 20 0a   pWhere, iTab) .
181b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
181c0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
181d0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
181e0 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68  /*.** Add all Wh
181f0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20  ereLoop objects 
18200 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 74 61 62  for a single tab
18210 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 77  le of the join w
18220 68 65 72 65 20 74 68 65 20 74 61 62 6c 65 0a 2a  here the table.*
18230 2a 20 69 73 20 69 64 65 6e 74 69 66 69 65 64 20  * is identified 
18240 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  by pBuilder->pNe
18250 77 2d 3e 69 54 61 62 2e 20 20 54 68 61 74 20 74  w->iTab.  That t
18260 61 62 6c 65 20 69 73 20 67 75 61 72 61 6e 74 65  able is guarante
18270 65 64 20 74 6f 20 62 65 0a 2a 2a 20 61 20 62 2d  ed to be.** a b-
18280 74 72 65 65 20 74 61 62 6c 65 2c 20 6e 6f 74 20  tree table, not 
18290 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
182a0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 73 74 73  .**.** The costs
182b0 20 28 57 68 65 72 65 4c 6f 6f 70 2e 72 52 75 6e   (WhereLoop.rRun
182c0 29 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20  ) of the b-tree 
182d0 6c 6f 6f 70 73 20 61 64 64 65 64 20 62 79 20 74  loops added by t
182e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
182f0 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 20 61  are calculated a
18300 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
18310 20 46 6f 72 20 61 20 66 75 6c 6c 20 73 63 61 6e   For a full scan
18320 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 65 20 74  , assuming the t
18330 61 62 6c 65 20 28 6f 72 20 69 6e 64 65 78 29 20  able (or index) 
18340 63 6f 6e 74 61 69 6e 73 20 6e 52 6f 77 20 72 6f  contains nRow ro
18350 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f  ws:.**.**     co
18360 73 74 20 3d 20 6e 52 6f 77 20 2a 20 33 2e 30 20  st = nRow * 3.0 
18370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18380 20 20 20 2f 2f 20 66 75 6c 6c 2d 74 61 62 6c 65     // full-table
18390 20 73 63 61 6e 0a 2a 2a 20 20 20 20 20 63 6f 73   scan.**     cos
183a0 74 20 3d 20 6e 52 6f 77 20 2a 20 4b 20 20 20 20  t = nRow * K    
183b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183c0 20 20 2f 2f 20 73 63 61 6e 20 6f 66 20 63 6f 76    // scan of cov
183d0 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20  ering index.**  
183e0 20 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2a     cost = nRow *
183f0 20 28 4b 2b 33 2e 30 29 20 20 20 20 20 20 20 20   (K+3.0)        
18400 20 20 20 20 20 20 20 20 2f 2f 20 73 63 61 6e 20          // scan 
18410 6f 66 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20  of non-covering 
18420 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20 77 68 65 72  index.**.** wher
18430 65 20 4b 20 69 73 20 61 20 76 61 6c 75 65 20 62  e K is a value b
18440 65 74 77 65 65 6e 20 31 2e 31 20 61 6e 64 20 33  etween 1.1 and 3
18450 2e 30 20 73 65 74 20 62 61 73 65 64 20 6f 6e 20  .0 set based on 
18460 74 68 65 20 72 65 6c 61 74 69 76 65 20 0a 2a 2a  the relative .**
18470 20 65 73 74 69 6d 61 74 65 64 20 61 76 65 72 61   estimated avera
18480 67 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69  ge size of the i
18490 6e 64 65 78 20 61 6e 64 20 74 61 62 6c 65 20 72  ndex and table r
184a0 65 63 6f 72 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  ecords..**.** Fo
184b0 72 20 61 6e 20 69 6e 64 65 78 20 73 63 61 6e 2c  r an index scan,
184c0 20 77 68 65 72 65 20 6e 56 69 73 69 74 20 69 73   where nVisit is
184d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69   the number of i
184e0 6e 64 65 78 20 72 6f 77 73 20 76 69 73 69 74 65  ndex rows visite
184f0 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 63 61 6e  d.** by the scan
18500 2c 20 61 6e 64 20 6e 53 65 65 6b 20 69 73 20 74  , and nSeek is t
18510 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 65  he number of see
18520 6b 20 6f 70 65 72 61 74 69 6f 6e 73 20 72 65 71  k operations req
18530 75 69 72 65 64 20 6f 6e 20 0a 2a 2a 20 74 68 65  uired on .** the
18540 20 69 6e 64 65 78 20 62 2d 74 72 65 65 3a 0a 2a   index b-tree:.*
18550 2a 0a 2a 2a 20 20 20 20 20 63 6f 73 74 20 3d 20  *.**     cost = 
18560 6e 53 65 65 6b 20 2a 20 28 6c 6f 67 28 6e 52 6f  nSeek * (log(nRo
18570 77 29 20 2b 20 4b 20 2a 20 6e 56 69 73 69 74 29  w) + K * nVisit)
18580 20 20 20 20 20 20 20 20 20 20 2f 2f 20 63 6f 76            // cov
18590 65 72 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 20 20  ering index.**  
185a0 20 20 20 63 6f 73 74 20 3d 20 6e 53 65 65 6b 20     cost = nSeek 
185b0 2a 20 28 6c 6f 67 28 6e 52 6f 77 29 20 2b 20 28  * (log(nRow) + (
185c0 4b 2b 33 2e 30 29 20 2a 20 6e 56 69 73 69 74 29  K+3.0) * nVisit)
185d0 20 20 20 20 2f 2f 20 6e 6f 6e 2d 63 6f 76 65 72      // non-cover
185e0 69 6e 67 20 69 6e 64 65 78 0a 2a 2a 0a 2a 2a 20  ing index.**.** 
185f0 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 53 65 65 6b 20  Normally, nSeek 
18600 69 73 20 31 2e 20 6e 53 65 65 6b 20 76 61 6c 75  is 1. nSeek valu
18610 65 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  es greater than 
18620 31 20 63 6f 6d 65 20 61 62 6f 75 74 20 69 66 20  1 come about if 
18630 74 68 65 20 0a 2a 2a 20 57 48 45 52 45 20 63 6c  the .** WHERE cl
18640 61 75 73 65 20 69 6e 63 6c 75 64 65 73 20 22 78  ause includes "x
18650 20 49 4e 20 28 2e 2e 2e 2e 29 22 20 74 65 72 6d   IN (....)" term
18660 73 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20  s used in place 
18670 6f 66 20 22 78 3d 3f 22 2e 20 4f 72 20 77 68 65  of "x=?". Or whe
18680 6e 20 0a 2a 2a 20 69 6d 70 6c 69 63 69 74 20 22  n .** implicit "
18690 78 20 49 4e 20 28 53 45 4c 45 43 54 20 78 20 46  x IN (SELECT x F
186a0 52 4f 4d 20 74 62 6c 29 22 20 74 65 72 6d 73 20  ROM tbl)" terms 
186b0 61 72 65 20 61 64 64 65 64 20 66 6f 72 20 73 6b  are added for sk
186c0 69 70 2d 73 63 61 6e 73 2e 0a 2a 2a 0a 2a 2a 20  ip-scans..**.** 
186d0 54 68 65 20 65 73 74 69 6d 61 74 65 64 20 76 61  The estimated va
186e0 6c 75 65 73 20 28 6e 52 6f 77 2c 20 6e 56 69 73  lues (nRow, nVis
186f0 69 74 2c 20 6e 53 65 65 6b 29 20 6f 66 74 65 6e  it, nSeek) often
18700 20 63 6f 6e 74 61 69 6e 20 61 20 6c 61 72 67 65   contain a large
18710 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 75 6e   amount.** of un
18720 63 65 72 74 61 69 6e 74 79 2e 20 20 46 6f 72 20  certainty.  For 
18730 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 73 63 6f  this reason, sco
18740 72 69 6e 67 20 69 73 20 64 65 73 69 67 6e 65 64  ring is designed
18750 20 74 6f 20 70 69 63 6b 20 70 6c 61 6e 73 20 74   to pick plans t
18760 68 61 74 0a 2a 2a 20 22 64 6f 20 74 68 65 20 6c  hat.** "do the l
18770 65 61 73 74 20 68 61 72 6d 22 20 69 66 20 74 68  east harm" if th
18780 65 20 65 73 74 69 6d 61 74 65 73 20 61 72 65 20  e estimates are 
18790 69 6e 61 63 63 75 72 61 74 65 2e 20 20 46 6f 72  inaccurate.  For
187a0 20 65 78 61 6d 70 6c 65 2c 20 61 0a 2a 2a 20 6c   example, a.** l
187b0 6f 67 28 6e 52 6f 77 29 20 66 61 63 74 6f 72 20  og(nRow) factor 
187c0 69 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20  is omitted from 
187d0 61 20 6e 6f 6e 2d 63 6f 76 65 72 69 6e 67 20 69  a non-covering i
187e0 6e 64 65 78 20 73 63 61 6e 20 69 6e 20 6f 72 64  ndex scan in ord
187f0 65 72 20 74 6f 0a 2a 2a 20 62 69 61 73 20 74 68  er to.** bias th
18800 65 20 73 63 6f 72 69 6e 67 20 69 6e 20 66 61 76  e scoring in fav
18810 6f 72 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69  or of using an i
18820 6e 64 65 78 2c 20 73 69 6e 63 65 20 74 68 65 20  ndex, since the 
18830 77 6f 72 73 74 2d 63 61 73 65 0a 2a 2a 20 70 65  worst-case.** pe
18840 72 66 6f 72 6d 61 6e 63 65 20 6f 66 20 75 73 69  rformance of usi
18850 6e 67 20 61 6e 20 69 6e 64 65 78 20 69 73 20 66  ng an index is f
18860 61 72 20 62 65 74 74 65 72 20 74 68 61 6e 20 74  ar better than t
18870 68 65 20 77 6f 72 73 74 2d 63 61 73 65 20 70 65  he worst-case pe
18880 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 6f 66 20  rformance.** of 
18890 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61  a full table sca
188a0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
188b0 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72   whereLoopAddBtr
188c0 65 65 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70 42  ee(.  WhereLoopB
188d0 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65 72  uilder *pBuilder
188e0 2c 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73  , /* WHERE claus
188f0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
18900 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 72  .  Bitmask mPrer
18910 65 71 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  eq             /
18920 2a 20 45 78 74 72 61 20 70 72 65 72 65 71 75 65  * Extra prereque
18930 73 69 74 65 73 20 66 6f 72 20 75 73 69 6e 67 20  sites for using 
18940 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b  this table */.){
18950 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
18960 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f  Info;          /
18970 2a 20 57 48 45 52 45 20 61 6e 61 6c 79 73 69 73  * WHERE analysis
18980 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
18990 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20  dex *pProbe;    
189a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
189b0 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61  index we are eva
189c0 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64  luating */.  Ind
189d0 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20  ex sPk;         
189e0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61           /* A fa
189f0 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke index object 
18a00 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20  for the primary 
18a10 6b 65 79 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  key */.  LogEst 
18a20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 20  aiRowEstPk[2];  
18a30 20 20 20 20 20 2f 2a 20 54 68 65 20 61 69 52 6f       /* The aiRo
18a40 77 4c 6f 67 45 73 74 5b 5d 20 76 61 6c 75 65 20  wLogEst[] value 
18a50 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64 65  for the sPk inde
18a60 78 20 2a 2f 0a 20 20 69 31 36 20 61 69 43 6f 6c  x */.  i16 aiCol
18a70 75 6d 6e 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20  umnPk = -1;     
18a80 20 20 20 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d     /* The aColum
18a90 6e 5b 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68  n[] value for th
18aa0 65 20 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20  e sPk index */. 
18ab0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
18ac0 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  st;          /* 
18ad0 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
18ae0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
18af0 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20  ist_item *pSrc; 
18b00 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61   /* The FROM cla
18b10 75 73 65 20 62 74 72 65 65 20 74 65 72 6d 20 74  use btree term t
18b20 6f 20 61 64 64 20 2a 2f 0a 20 20 57 68 65 72 65  o add */.  Where
18b30 4c 6f 6f 70 20 2a 70 4e 65 77 3b 20 20 20 20 20  Loop *pNew;     
18b40 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6c 61         /* Templa
18b50 74 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  te WhereLoop obj
18b60 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ect */.  int rc 
18b70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
18b80 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
18b90 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f  ode */.  int iSo
18ba0 72 74 49 64 78 20 3d 20 31 3b 20 20 20 20 20 20  rtIdx = 1;      
18bb0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75       /* Index nu
18bc0 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 3b  mber */.  int b;
18bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18be0 20 20 20 20 20 20 2f 2a 20 41 20 62 6f 6f 6c 65        /* A boole
18bf0 61 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4c 6f  an value */.  Lo
18c00 67 45 73 74 20 72 53 69 7a 65 3b 20 20 20 20 20  gEst rSize;     
18c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 75 6d            /* num
18c20 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
18c30 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 4c 6f  he table */.  Lo
18c40 67 45 73 74 20 72 4c 6f 67 53 69 7a 65 3b 20 20  gEst rLogSize;  
18c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 67            /* Log
18c60 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 6e 75  arithm of the nu
18c70 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
18c80 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57  the table */.  W
18c90 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
18ca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
18cb0 65 20 70 61 72 73 65 64 20 57 48 45 52 45 20 63  e parsed WHERE c
18cc0 6c 61 75 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65  lause */.  Table
18cd0 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20 20   *pTab;         
18ce0 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
18cf0 62 65 69 6e 67 20 71 75 65 72 69 65 64 20 2a 2f  being queried */
18d00 0a 20 20 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  .  .  pNew = pBu
18d10 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 70  ilder->pNew;.  p
18d20 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72  WInfo = pBuilder
18d30 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 54 61 62  ->pWInfo;.  pTab
18d40 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  List = pWInfo->p
18d50 54 61 62 4c 69 73 74 3b 0a 20 20 70 53 72 63 20  TabList;.  pSrc 
18d60 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20  = pTabList->a + 
18d70 70 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 70 54  pNew->iTab;.  pT
18d80 61 62 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b  ab = pSrc->pTab;
18d90 0a 20 20 70 57 43 20 3d 20 70 42 75 69 6c 64 65  .  pWC = pBuilde
18da0 72 2d 3e 70 57 43 3b 0a 20 20 61 73 73 65 72 74  r->pWC;.  assert
18db0 28 20 21 49 73 56 69 72 74 75 61 6c 28 70 53 72  ( !IsVirtual(pSr
18dc0 63 2d 3e 70 54 61 62 29 20 29 3b 0a 0a 20 20 69  c->pTab) );..  i
18dd0 66 28 20 70 53 72 63 2d 3e 70 49 42 49 6e 64 65  f( pSrc->pIBInde
18de0 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20 49  x ){.    /* An I
18df0 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
18e00 20 73 70 65 63 69 66 69 65 73 20 61 20 70 61 72   specifies a par
18e10 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 74 6f  ticular index to
18e20 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 50 72 6f   use */.    pPro
18e30 62 65 20 3d 20 70 53 72 63 2d 3e 70 49 42 49 6e  be = pSrc->pIBIn
18e40 64 65 78 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  dex;.  }else if(
18e50 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62 29   !HasRowid(pTab)
18e60 20 29 7b 0a 20 20 20 20 70 50 72 6f 62 65 20 3d   ){.    pProbe =
18e70 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20   pTab->pIndex;. 
18e80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
18e90 68 65 72 65 20 69 73 20 6e 6f 20 49 4e 44 45 58  here is no INDEX
18ea0 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 43  ED BY clause.  C
18eb0 72 65 61 74 65 20 61 20 66 61 6b 65 20 49 6e 64  reate a fake Ind
18ec0 65 78 20 6f 62 6a 65 63 74 20 69 6e 20 6c 6f 63  ex object in loc
18ed0 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62  al.    ** variab
18ee0 6c 65 20 73 50 6b 20 74 6f 20 72 65 70 72 65 73  le sPk to repres
18ef0 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20 70 72  ent the rowid pr
18f00 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78 2e  imary key index.
18f10 20 20 4d 61 6b 65 20 74 68 69 73 0a 20 20 20 20    Make this.    
18f20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78 20 74 68  ** fake index th
18f30 65 20 66 69 72 73 74 20 69 6e 20 61 20 63 68 61  e first in a cha
18f40 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f 62 6a 65  in of Index obje
18f50 63 74 73 20 77 69 74 68 20 61 6c 6c 20 6f 66 20  cts with all of 
18f60 74 68 65 20 72 65 61 6c 0a 20 20 20 20 2a 2a 20  the real.    ** 
18f70 69 6e 64 69 63 65 73 20 74 6f 20 66 6f 6c 6c 6f  indices to follo
18f80 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  w */.    Index *
18f90 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
18fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
18fb0 74 20 6f 66 20 72 65 61 6c 20 69 6e 64 69 63 65  t of real indice
18fc0 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s on the table *
18fd0 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 50  /.    memset(&sP
18fe0 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 49 6e 64  k, 0, sizeof(Ind
18ff0 65 78 29 29 3b 0a 20 20 20 20 73 50 6b 2e 6e 4b  ex));.    sPk.nK
19000 65 79 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20 73  eyCol = 1;.    s
19010 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a  Pk.nColumn = 1;.
19020 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e      sPk.aiColumn
19030 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a   = &aiColumnPk;.
19040 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 4c 6f 67      sPk.aiRowLog
19050 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b  Est = aiRowEstPk
19060 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72 6f  ;.    sPk.onErro
19070 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a  r = OE_Replace;.
19080 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20 3d      sPk.pTable =
19090 20 70 54 61 62 3b 0a 20 20 20 20 73 50 6b 2e 73   pTab;.    sPk.s
190a0 7a 49 64 78 52 6f 77 20 3d 20 70 54 61 62 2d 3e  zIdxRow = pTab->
190b0 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 61 69  szTabRow;.    ai
190c0 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 54  RowEstPk[0] = pT
190d0 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b 0a  ab->nRowLogEst;.
190e0 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 31      aiRowEstPk[1
190f0 5d 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 72 73  ] = 0;.    pFirs
19100 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e  t = pSrc->pTab->
19110 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20  pIndex;.    if( 
19120 70 53 72 63 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65  pSrc->fg.notInde
19130 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  xed==0 ){.      
19140 2f 2a 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69  /* The real indi
19150 63 65 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ces of the table
19160 20 61 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64   are only consid
19170 65 72 65 64 20 69 66 20 74 68 65 0a 20 20 20 20  ered if the.    
19180 20 20 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44    ** NOT INDEXED
19190 20 71 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d   qualifier is om
191a0 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46  itted from the F
191b0 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
191c0 20 20 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20      sPk.pNext = 
191d0 70 46 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20  pFirst;.    }.  
191e0 20 20 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b    pProbe = &sPk;
191f0 0a 20 20 7d 0a 20 20 72 53 69 7a 65 20 3d 20 70  .  }.  rSize = p
19200 54 61 62 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b  Tab->nRowLogEst;
19210 0a 20 20 72 4c 6f 67 53 69 7a 65 20 3d 20 65 73  .  rLogSize = es
19220 74 4c 6f 67 28 72 53 69 7a 65 29 3b 0a 0a 23 69  tLog(rSize);..#i
19230 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19240 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45  T_AUTOMATIC_INDE
19250 58 0a 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63  X.  /* Automatic
19260 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 66   indexes */.  if
19270 28 20 21 70 42 75 69 6c 64 65 72 2d 3e 70 4f 72  ( !pBuilder->pOr
19280 53 65 74 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20  Set      /* Not 
19290 70 61 72 74 20 6f 66 20 61 6e 20 4f 52 20 6f 70  part of an OR op
192a0 74 69 6d 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20  timization */.  
192b0 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
192c0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
192d0 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30  OR_SUBCLAUSE)==0
192e0 0a 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e  .   && (pWInfo->
192f0 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
19300 73 20 26 20 53 51 4c 49 54 45 5f 41 75 74 6f 49  s & SQLITE_AutoI
19310 6e 64 65 78 29 21 3d 30 0a 20 20 20 26 26 20 70  ndex)!=0.   && p
19320 53 72 63 2d 3e 70 49 42 49 6e 64 65 78 3d 3d 30  Src->pIBIndex==0
19330 20 20 20 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20        /* Has no 
19340 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
19350 65 20 2a 2f 0a 20 20 20 26 26 20 21 70 53 72 63  e */.   && !pSrc
19360 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 20  ->fg.notIndexed 
19370 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4e 4f 54 20    /* Has no NOT 
19380 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 2a  INDEXED clause *
19390 2f 0a 20 20 20 26 26 20 48 61 73 52 6f 77 69 64  /.   && HasRowid
193a0 28 70 54 61 62 29 20 20 20 20 20 20 20 20 20 2f  (pTab)         /
193b0 2a 20 4e 6f 74 20 57 49 54 48 4f 55 54 20 52 4f  * Not WITHOUT RO
193c0 57 49 44 20 74 61 62 6c 65 2e 20 28 46 49 58 4d  WID table. (FIXM
193d0 45 3a 20 57 68 79 20 6e 6f 74 3f 29 20 2a 2f 0a  E: Why not?) */.
193e0 20 20 20 26 26 20 21 70 53 72 63 2d 3e 66 67 2e     && !pSrc->fg.
193f0 69 73 43 6f 72 72 65 6c 61 74 65 64 20 2f 2a 20  isCorrelated /* 
19400 4e 6f 74 20 61 20 63 6f 72 72 65 6c 61 74 65 64  Not a correlated
19410 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 20   subquery */.   
19420 26 26 20 21 70 53 72 63 2d 3e 66 67 2e 69 73 52  && !pSrc->fg.isR
19430 65 63 75 72 73 69 76 65 20 20 2f 2a 20 4e 6f 74  ecursive  /* Not
19440 20 61 20 72 65 63 75 72 73 69 76 65 20 63 6f 6d   a recursive com
19450 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65 73  mon table expres
19460 73 69 6f 6e 2e 20 2a 2f 0a 20 20 29 7b 0a 20 20  sion. */.  ){.  
19470 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 75    /* Generate au
19480 74 6f 2d 69 6e 64 65 78 20 57 68 65 72 65 4c 6f  to-index WhereLo
19490 6f 70 73 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  ops */.    Where
194a0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20  Term *pTerm;.   
194b0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57 43 45   WhereTerm *pWCE
194c0 6e 64 20 3d 20 70 57 43 2d 3e 61 20 2b 20 70 57  nd = pWC->a + pW
194d0 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20 20 20 66 6f  C->nTerm;.    fo
194e0 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
194f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
19500 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
19510 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Term++){.      i
19520 66 28 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  f( pTerm->prereq
19530 52 69 67 68 74 20 26 20 70 4e 65 77 2d 3e 6d 61  Right & pNew->ma
19540 73 6b 53 65 6c 66 20 29 20 63 6f 6e 74 69 6e 75  skSelf ) continu
19550 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 72  e;.      if( ter
19560 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28 70  mCanDriveIndex(p
19570 54 65 72 6d 2c 20 70 53 72 63 2c 20 30 29 20 29  Term, pSrc, 0) )
19580 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
19590 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b  u.btree.nEq = 1;
195a0 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e  .        pNew->n
195b0 53 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Skip = 0;.      
195c0 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65 2e    pNew->u.btree.
195d0 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
195e0 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
195f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e   = 1;.        pN
19600 65 77 2d 3e 61 4c 54 65 72 6d 5b 30 5d 20 3d 20  ew->aLTerm[0] = 
19610 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 2f  pTerm;.        /
19620 2a 20 54 55 4e 49 4e 47 3a 20 4f 6e 65 2d 74 69  * TUNING: One-ti
19630 6d 65 20 63 6f 73 74 20 66 6f 72 20 63 6f 6d 70  me cost for comp
19640 75 74 69 6e 67 20 74 68 65 20 61 75 74 6f 6d 61  uting the automa
19650 74 69 63 20 69 6e 64 65 78 20 69 73 0a 20 20 20  tic index is.   
19660 20 20 20 20 20 2a 2a 20 65 73 74 69 6d 61 74 65       ** estimate
19670 64 20 74 6f 20 62 65 20 58 2a 4e 2a 6c 6f 67 32  d to be X*N*log2
19680 28 4e 29 20 77 68 65 72 65 20 4e 20 69 73 20 74  (N) where N is t
19690 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
196a0 73 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  s in.        ** 
196b0 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
196c0 69 6e 64 65 78 65 64 20 61 6e 64 20 77 68 65 72  indexed and wher
196d0 65 20 58 20 69 73 20 37 20 28 4c 6f 67 45 73 74  e X is 7 (LogEst
196e0 3d 32 38 29 20 66 6f 72 20 6e 6f 72 6d 61 6c 0a  =28) for normal.
196f0 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
19700 73 20 6f 72 20 31 2e 33 37 35 20 28 4c 6f 67 45  s or 1.375 (LogE
19710 73 74 3d 34 29 20 66 6f 72 20 76 69 65 77 73 20  st=4) for views 
19720 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 2e 20  and subqueries. 
19730 20 54 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20   The value.     
19740 20 20 20 2a 2a 20 6f 66 20 58 20 69 73 20 73 6d     ** of X is sm
19750 61 6c 6c 65 72 20 66 6f 72 20 76 69 65 77 73 20  aller for views 
19760 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 73  and subqueries s
19770 6f 20 74 68 61 74 20 74 68 65 20 71 75 65 72 79  o that the query
19780 20 70 6c 61 6e 6e 65 72 0a 20 20 20 20 20 20 20   planner.       
19790 20 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65   ** will be more
197a0 20 61 67 67 72 65 73 73 69 76 65 20 61 62 6f 75   aggressive abou
197b0 74 20 67 65 6e 65 72 61 74 69 6e 67 20 61 75 74  t generating aut
197c0 6f 6d 61 74 69 63 20 69 6e 64 65 78 65 73 20 66  omatic indexes f
197d0 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  or.        ** th
197e0 6f 73 65 20 6f 62 6a 65 63 74 73 2c 20 73 69 6e  ose objects, sin
197f0 63 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f  ce there is no o
19800 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 61 64  pportunity to ad
19810 64 20 73 63 68 65 6d 61 0a 20 20 20 20 20 20 20  d schema.       
19820 20 2a 2a 20 69 6e 64 65 78 65 73 20 6f 6e 20 73   ** indexes on s
19830 75 62 71 75 65 72 69 65 73 20 61 6e 64 20 76 69  ubqueries and vi
19840 65 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ews. */.        
19850 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 72  pNew->rSetup = r
19860 4c 6f 67 53 69 7a 65 20 2b 20 72 53 69 7a 65 20  LogSize + rSize 
19870 2b 20 34 3b 0a 20 20 20 20 20 20 20 20 69 66 28  + 4;.        if(
19880 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
19890 30 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46  0 && (pTab->tabF
198a0 6c 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65  lags & TF_Epheme
198b0 72 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ral)==0 ){.     
198c0 20 20 20 20 20 70 4e 65 77 2d 3e 72 53 65 74 75       pNew->rSetu
198d0 70 20 2b 3d 20 32 34 3b 0a 20 20 20 20 20 20 20  p += 24;.       
198e0 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c 79   }.        Apply
198f0 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28 70  CostMultiplier(p
19900 4e 65 77 2d 3e 72 53 65 74 75 70 2c 20 70 54 61  New->rSetup, pTa
19910 62 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20  b->costMult);.  
19920 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d 3e        if( pNew->
19930 72 53 65 74 75 70 3c 30 20 29 20 70 4e 65 77 2d  rSetup<0 ) pNew-
19940 3e 72 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 20  >rSetup = 0;.   
19950 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
19960 45 61 63 68 20 69 6e 64 65 78 20 6c 6f 6f 6b 75  Each index looku
19970 70 20 79 69 65 6c 64 73 20 32 30 20 72 6f 77 73  p yields 20 rows
19980 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
19990 54 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  This.        ** 
199a0 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65  is more than the
199b0 20 75 73 75 61 6c 20 67 75 65 73 73 20 6f 66 20   usual guess of 
199c0 31 30 20 72 6f 77 73 2c 20 73 69 6e 63 65 20 77  10 rows, since w
199d0 65 20 68 61 76 65 20 6e 6f 20 77 61 79 0a 20 20  e have no way.  
199e0 20 20 20 20 20 20 2a 2a 20 6f 66 20 6b 6e 6f 77        ** of know
199f0 69 6e 67 20 68 6f 77 20 73 65 6c 65 63 74 69 76  ing how selectiv
19a00 65 20 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c  e the index will
19a10 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 2e 20   ultimately be. 
19a20 20 49 74 20 77 6f 75 6c 64 0a 20 20 20 20 20 20   It would.      
19a30 20 20 2a 2a 20 6e 6f 74 20 62 65 20 75 6e 72 65    ** not be unre
19a40 61 73 6f 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65  asonable to make
19a50 20 74 68 69 73 20 76 61 6c 75 65 20 6d 75 63 68   this value much
19a60 20 6c 61 72 67 65 72 2e 20 2a 2f 0a 20 20 20 20   larger. */.    
19a70 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
19a80 20 34 33 3b 20 20 61 73 73 65 72 74 28 20 34 33   43;  assert( 43
19a90 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
19aa0 32 30 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  20) );.        p
19ab0 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 71 6c 69  New->rRun = sqli
19ac0 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72 4c 6f  te3LogEstAdd(rLo
19ad0 67 53 69 7a 65 2c 70 4e 65 77 2d 3e 6e 4f 75 74  gSize,pNew->nOut
19ae0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  );.        pNew-
19af0 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45  >wsFlags = WHERE
19b00 5f 41 55 54 4f 5f 49 4e 44 45 58 3b 0a 20 20 20  _AUTO_INDEX;.   
19b10 20 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65       pNew->prere
19b20 71 20 3d 20 6d 50 72 65 72 65 71 20 7c 20 70 54  q = mPrereq | pT
19b30 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
19b40 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
19b50 68 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70  hereLoopInsert(p
19b60 42 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a  Builder, pNew);.
19b70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19b80 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
19b90 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49  TE_OMIT_AUTOMATI
19ba0 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a 20 20 2f 2a  C_INDEX */..  /*
19bb0 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69   Loop over all i
19bc0 6e 64 69 63 65 73 0a 20 20 2a 2f 0a 20 20 66 6f  ndices.  */.  fo
19bd0 72 28 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  r(; rc==SQLITE_O
19be0 4b 20 26 26 20 70 50 72 6f 62 65 3b 20 70 50 72  K && pProbe; pPr
19bf0 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78  obe=pProbe->pNex
19c00 74 2c 20 69 53 6f 72 74 49 64 78 2b 2b 29 7b 0a  t, iSortIdx++){.
19c10 20 20 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e      if( pProbe->
19c20 70 50 61 72 74 49 64 78 57 68 65 72 65 21 3d 30  pPartIdxWhere!=0
19c30 0a 20 20 20 20 20 26 26 20 21 77 68 65 72 65 55  .     && !whereU
19c40 73 61 62 6c 65 50 61 72 74 69 61 6c 49 6e 64 65  sablePartialInde
19c50 78 28 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 2c  x(pSrc->iCursor,
19c60 20 70 57 43 2c 20 70 50 72 6f 62 65 2d 3e 70 50   pWC, pProbe->pP
19c70 61 72 74 49 64 78 57 68 65 72 65 29 20 29 7b 0a  artIdxWhere) ){.
19c80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19c90 70 4e 65 77 2d 3e 69 54 61 62 21 3d 70 53 72 63  pNew->iTab!=pSrc
19ca0 2d 3e 69 43 75 72 73 6f 72 20 29 3b 20 20 2f 2a  ->iCursor );  /*
19cb0 20 53 65 65 20 74 69 63 6b 65 74 20 5b 39 38 64   See ticket [98d
19cc0 39 37 33 62 38 66 35 5d 20 2a 2f 0a 20 20 20 20  973b8f5] */.    
19cd0 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20    continue;  /* 
19ce0 50 61 72 74 69 61 6c 20 69 6e 64 65 78 20 69 6e  Partial index in
19cf0 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
19d00 74 68 69 73 20 71 75 65 72 79 20 2a 2f 0a 20 20  this query */.  
19d10 20 20 7d 0a 20 20 20 20 72 53 69 7a 65 20 3d 20    }.    rSize = 
19d20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 4c 6f 67  pProbe->aiRowLog
19d30 45 73 74 5b 30 5d 3b 0a 20 20 20 20 70 4e 65 77  Est[0];.    pNew
19d40 2d 3e 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20  ->u.btree.nEq = 
19d50 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 75 2e 62  0;.    pNew->u.b
19d60 74 72 65 65 2e 6e 42 74 6d 20 3d 20 30 3b 0a 20  tree.nBtm = 0;. 
19d70 20 20 20 70 4e 65 77 2d 3e 75 2e 62 74 72 65 65     pNew->u.btree
19d80 2e 6e 54 6f 70 20 3d 20 30 3b 0a 20 20 20 20 70  .nTop = 0;.    p
19d90 4e 65 77 2d 3e 6e 53 6b 69 70 20 3d 20 30 3b 0a  New->nSkip = 0;.
19da0 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d      pNew->nLTerm
19db0 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 0;.    pNew->
19dc0 69 53 6f 72 74 49 64 78 20 3d 20 30 3b 0a 20 20  iSortIdx = 0;.  
19dd0 20 20 70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d    pNew->rSetup =
19de0 20 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 72   0;.    pNew->pr
19df0 65 72 65 71 20 3d 20 6d 50 72 65 72 65 71 3b 0a  ereq = mPrereq;.
19e00 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
19e10 20 72 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77   rSize;.    pNew
19e20 2d 3e 75 2e 62 74 72 65 65 2e 70 49 6e 64 65 78  ->u.btree.pIndex
19e30 20 3d 20 70 50 72 6f 62 65 3b 0a 20 20 20 20 62   = pProbe;.    b
19e40 20 3d 20 69 6e 64 65 78 4d 69 67 68 74 48 65 6c   = indexMightHel
19e50 70 57 69 74 68 4f 72 64 65 72 42 79 28 70 42 75  pWithOrderBy(pBu
19e60 69 6c 64 65 72 2c 20 70 50 72 6f 62 65 2c 20 70  ilder, pProbe, p
19e70 53 72 63 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20  Src->iCursor);. 
19e80 20 20 20 2f 2a 20 54 68 65 20 4f 4e 45 50 41 53     /* The ONEPAS
19e90 53 5f 44 45 53 49 52 45 44 20 66 6c 61 67 73 20  S_DESIRED flags 
19ea0 6e 65 76 65 72 20 6f 63 63 75 72 73 20 74 6f 67  never occurs tog
19eb0 65 74 68 65 72 20 77 69 74 68 20 4f 52 44 45 52  ether with ORDER
19ec0 20 42 59 20 2a 2f 0a 20 20 20 20 61 73 73 65 72   BY */.    asser
19ed0 74 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72  t( (pWInfo->wctr
19ee0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
19ef0 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29 3d  NEPASS_DESIRED)=
19f00 3d 30 20 7c 7c 20 62 3d 3d 30 20 29 3b 0a 20 20  =0 || b==0 );.  
19f10 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 74 6e    if( pProbe->tn
19f20 75 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  um<=0 ){.      /
19f30 2a 20 49 6e 74 65 67 65 72 20 70 72 69 6d 61 72  * Integer primar
19f40 79 20 6b 65 79 20 69 6e 64 65 78 20 2a 2f 0a 20  y key index */. 
19f50 20 20 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61       pNew->wsFla
19f60 67 73 20 3d 20 57 48 45 52 45 5f 49 50 4b 3b 0a  gs = WHERE_IPK;.
19f70 0a 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20 74  .      /* Full t
19f80 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20  able scan */.   
19f90 20 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64     pNew->iSortId
19fa0 78 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78  x = b ? iSortIdx
19fb0 20 3a 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 54   : 0;.      /* T
19fc0 55 4e 49 4e 47 3a 20 43 6f 73 74 20 6f 66 20 66  UNING: Cost of f
19fd0 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 69  ull table scan i
19fe0 73 20 28 4e 2a 33 2e 30 29 2e 20 2a 2f 0a 20 20  s (N*3.0). */.  
19ff0 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d      pNew->rRun =
1a000 20 72 53 69 7a 65 20 2b 20 31 36 3b 0a 20 20 20   rSize + 16;.   
1a010 20 20 20 41 70 70 6c 79 43 6f 73 74 4d 75 6c 74     ApplyCostMult
1a020 69 70 6c 69 65 72 28 70 4e 65 77 2d 3e 72 52 75  iplier(pNew->rRu
1a030 6e 2c 20 70 54 61 62 2d 3e 63 6f 73 74 4d 75 6c  n, pTab->costMul
1a040 74 29 3b 0a 20 20 20 20 20 20 77 68 65 72 65 4c  t);.      whereL
1a050 6f 6f 70 4f 75 74 70 75 74 41 64 6a 75 73 74 28  oopOutputAdjust(
1a060 70 57 43 2c 20 70 4e 65 77 2c 20 72 53 69 7a 65  pWC, pNew, rSize
1a070 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  );.      rc = wh
1a080 65 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42  ereLoopInsert(pB
1a090 75 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20  uilder, pNew);. 
1a0a0 20 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20       pNew->nOut 
1a0b0 3d 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 69  = rSize;.      i
1a0c0 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
1a0d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a0e0 42 69 74 6d 61 73 6b 20 6d 3b 0a 20 20 20 20 20  Bitmask m;.     
1a0f0 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 69 73 43   if( pProbe->isC
1a100 6f 76 65 72 69 6e 67 20 29 7b 0a 20 20 20 20 20  overing ){.     
1a110 20 20 20 70 4e 65 77 2d 3e 77 73 46 6c 61 67 73     pNew->wsFlags
1a120 20 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   = WHERE_IDX_ONL
1a130 59 20 7c 20 57 48 45 52 45 5f 49 4e 44 45 58 45  Y | WHERE_INDEXE
1a140 44 3b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 30  D;.        m = 0
1a150 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1a160 20 20 20 20 20 20 20 6d 20 3d 20 70 53 72 63 2d         m = pSrc-
1a170 3e 63 6f 6c 55 73 65 64 20 26 20 7e 63 6f 6c 75  >colUsed & ~colu
1a180 6d 6e 73 49 6e 49 6e 64 65 78 28 70 50 72 6f 62  mnsInIndex(pProb
1a190 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  e);.        pNew
1a1a0 2d 3e 77 73 46 6c 61 67 73 20 3d 20 28 6d 3d 3d  ->wsFlags = (m==
1a1b0 30 29 20 3f 20 28 57 48 45 52 45 5f 49 44 58 5f  0) ? (WHERE_IDX_
1a1c0 4f 4e 4c 59 7c 57 48 45 52 45 5f 49 4e 44 45 58  ONLY|WHERE_INDEX
1a1d0 45 44 29 20 3a 20 57 48 45 52 45 5f 49 4e 44 45  ED) : WHERE_INDE
1a1e0 58 45 44 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  XED;.      }..  
1a1f0 20 20 20 20 2f 2a 20 46 75 6c 6c 20 73 63 61 6e      /* Full scan
1a200 20 76 69 61 20 69 6e 64 65 78 20 2a 2f 0a 20 20   via index */.  
1a210 20 20 20 20 69 66 28 20 62 0a 20 20 20 20 20 20      if( b.      
1a220 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70 54   || !HasRowid(pT
1a230 61 62 29 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  ab).       || pP
1a240 72 6f 62 65 2d 3e 70 50 61 72 74 49 64 78 57 68  robe->pPartIdxWh
1a250 65 72 65 21 3d 30 0a 20 20 20 20 20 20 20 7c 7c  ere!=0.       ||
1a260 20 28 20 6d 3d 3d 30 0a 20 20 20 20 20 20 20 20   ( m==0.        
1a270 20 26 26 20 70 50 72 6f 62 65 2d 3e 62 55 6e 6f   && pProbe->bUno
1a280 72 64 65 72 65 64 3d 3d 30 0a 20 20 20 20 20 20  rdered==0.      
1a290 20 20 20 26 26 20 28 70 50 72 6f 62 65 2d 3e 73     && (pProbe->s
1a2a0 7a 49 64 78 52 6f 77 3c 70 54 61 62 2d 3e 73 7a  zIdxRow<pTab->sz
1a2b0 54 61 62 52 6f 77 29 0a 20 20 20 20 20 20 20 20  TabRow).        
1a2c0 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
1a2d0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1a2e0 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
1a2f0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
1a300 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1a310 66 69 67 2e 62 55 73 65 43 69 73 0a 20 20 20 20  fig.bUseCis.    
1a320 20 20 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61       && Optimiza
1a330 74 69 6f 6e 45 6e 61 62 6c 65 64 28 70 57 49 6e  tionEnabled(pWIn
1a340 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  fo->pParse->db, 
1a350 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64 78 53  SQLITE_CoverIdxS
1a360 63 61 6e 29 0a 20 20 20 20 20 20 20 20 20 20 29  can).          )
1a370 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
1a380 20 20 70 4e 65 77 2d 3e 69 53 6f 72 74 49 64 78    pNew->iSortIdx
1a390 20 3d 20 62 20 3f 20 69 53 6f 72 74 49 64 78 20   = b ? iSortIdx 
1a3a0 3a 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  : 0;..        /*
1a3b0 20 54 68 65 20 63 6f 73 74 20 6f 66 20 76 69 73   The cost of vis
1a3c0 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  iting the index 
1a3d0 72 6f 77 73 20 69 73 20 4e 2a 4b 2c 20 77 68 65  rows is N*K, whe
1a3e0 72 65 20 4b 20 69 73 0a 20 20 20 20 20 20 20 20  re K is.        
1a3f0 2a 2a 20 62 65 74 77 65 65 6e 20 31 2e 31 20 61  ** between 1.1 a
1a400 6e 64 20 33 2e 30 2c 20 64 65 70 65 6e 64 69 6e  nd 3.0, dependin
1a410 67 20 6f 6e 20 74 68 65 20 72 65 6c 61 74 69 76  g on the relativ
1a420 65 20 73 69 7a 65 73 20 6f 66 20 74 68 65 0a 20  e sizes of the. 
1a430 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20         ** index 
1a440 61 6e 64 20 74 61 62 6c 65 20 72 6f 77 73 2e 20  and table rows. 
1a450 2a 2f 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  */.        pNew-
1a460 3e 72 52 75 6e 20 3d 20 72 53 69 7a 65 20 2b 20  >rRun = rSize + 
1a470 31 20 2b 20 28 31 35 2a 70 50 72 6f 62 65 2d 3e  1 + (15*pProbe->
1a480 73 7a 49 64 78 52 6f 77 29 2f 70 54 61 62 2d 3e  szIdxRow)/pTab->
1a490 73 7a 54 61 62 52 6f 77 3b 0a 20 20 20 20 20 20  szTabRow;.      
1a4a0 20 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a 20 20    if( m!=0 ){.  
1a4b0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1a4c0 69 73 20 69 73 20 61 20 6e 6f 6e 2d 63 6f 76 65  is is a non-cove
1a4d0 72 69 6e 67 20 69 6e 64 65 78 20 73 63 61 6e 2c  ring index scan,
1a4e0 20 61 64 64 20 69 6e 20 74 68 65 20 63 6f 73 74   add in the cost
1a4f0 20 6f 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   of.          **
1a500 20 64 6f 69 6e 67 20 74 61 62 6c 65 20 6c 6f 6f   doing table loo
1a510 6b 75 70 73 2e 20 20 54 68 65 20 63 6f 73 74 20  kups.  The cost 
1a520 77 69 6c 6c 20 62 65 20 33 78 20 74 68 65 20 6e  will be 3x the n
1a530 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20  umber of.       
1a540 20 20 20 2a 2a 20 6c 6f 6f 6b 75 70 73 2e 20 20     ** lookups.  
1a550 54 61 6b 65 20 69 6e 74 6f 20 61 63 63 6f 75 6e  Take into accoun
1a560 74 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  t WHERE clause t
1a570 65 72 6d 73 20 74 68 61 74 20 63 61 6e 20 62 65  erms that can be
1a580 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 61  .          ** sa
1a590 74 69 73 66 69 65 64 20 75 73 69 6e 67 20 6a 75  tisfied using ju
1a5a0 73 74 20 74 68 65 20 69 6e 64 65 78 2c 20 61 6e  st the index, an
1a5b0 64 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 72 65  d that do not re
1a5c0 71 75 69 72 65 20 61 0a 20 20 20 20 20 20 20 20  quire a.        
1a5d0 20 20 2a 2a 20 74 61 62 6c 65 20 6c 6f 6f 6b 75    ** table looku
1a5e0 70 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  p. */.          
1a5f0 4c 6f 67 45 73 74 20 6e 4c 6f 6f 6b 75 70 20 3d  LogEst nLookup =
1a600 20 72 53 69 7a 65 20 2b 20 31 36 3b 20 20 2f 2a   rSize + 16;  /*
1a610 20 42 61 73 65 20 63 6f 73 74 3a 20 20 4e 2a 33   Base cost:  N*3
1a620 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
1a630 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20  t ii;.          
1a640 69 6e 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d  int iCur = pSrc-
1a650 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >iCursor;.      
1a660 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
1a670 2a 70 57 43 32 20 3d 20 26 70 57 49 6e 66 6f 2d  *pWC2 = &pWInfo-
1a680 3e 73 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20  >sWC;.          
1a690 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 57 43  for(ii=0; ii<pWC
1a6a0 32 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b  2->nTerm; ii++){
1a6b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 57 68 65  .            Whe
1a6c0 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20  reTerm *pTerm = 
1a6d0 26 70 57 43 32 2d 3e 61 5b 69 69 5d 3b 0a 20 20  &pWC2->a[ii];.  
1a6e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73            if( !s
1a6f0 71 6c 69 74 65 33 45 78 70 72 43 6f 76 65 72 65  qlite3ExprCovere
1a700 64 42 79 49 6e 64 65 78 28 70 54 65 72 6d 2d 3e  dByIndex(pTerm->
1a710 70 45 78 70 72 2c 20 69 43 75 72 2c 20 70 50 72  pExpr, iCur, pPr
1a720 6f 62 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  obe) ){.        
1a730 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1a740 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1a750 20 20 20 20 20 20 20 2f 2a 20 70 54 65 72 6d 20         /* pTerm 
1a760 63 61 6e 20 62 65 20 65 76 61 6c 75 61 74 65 64  can be evaluated
1a770 20 75 73 69 6e 67 20 6a 75 73 74 20 74 68 65 20   using just the 
1a780 69 6e 64 65 78 2e 20 20 53 6f 20 72 65 64 75 63  index.  So reduc
1a790 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
1a7a0 20 74 68 65 20 65 78 70 65 63 74 65 64 20 6e 75   the expected nu
1a7b0 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 20 6c 6f  mber of table lo
1a7c0 6f 6b 75 70 73 20 61 63 63 6f 72 64 69 6e 67 6c  okups accordingl
1a7d0 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  y */.           
1a7e0 20 69 66 28 20 70 54 65 72 6d 2d 3e 74 72 75 74   if( pTerm->trut
1a7f0 68 50 72 6f 62 3c 3d 30 20 29 7b 0a 20 20 20 20  hProb<=0 ){.    
1a800 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 6b 75            nLooku
1a810 70 20 2b 3d 20 70 54 65 72 6d 2d 3e 74 72 75 74  p += pTerm->trut
1a820 68 50 72 6f 62 3b 0a 20 20 20 20 20 20 20 20 20  hProb;.         
1a830 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a840 20 20 20 20 20 20 20 20 6e 4c 6f 6f 6b 75 70 2d          nLookup-
1a850 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  -;.             
1a860 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
1a870 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57  rator & (WO_EQ|W
1a880 4f 5f 49 53 29 20 29 20 6e 4c 6f 6f 6b 75 70 20  O_IS) ) nLookup 
1a890 2d 3d 20 31 39 3b 0a 20 20 20 20 20 20 20 20 20  -= 19;.         
1a8a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
1a8b0 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  .          .    
1a8c0 20 20 20 20 20 20 70 4e 65 77 2d 3e 72 52 75 6e        pNew->rRun
1a8d0 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
1a8e0 41 64 64 28 70 4e 65 77 2d 3e 72 52 75 6e 2c 20  Add(pNew->rRun, 
1a8f0 6e 4c 6f 6f 6b 75 70 29 3b 0a 20 20 20 20 20 20  nLookup);.      
1a900 20 20 7d 0a 20 20 20 20 20 20 20 20 41 70 70 6c    }.        Appl
1a910 79 43 6f 73 74 4d 75 6c 74 69 70 6c 69 65 72 28  yCostMultiplier(
1a920 70 4e 65 77 2d 3e 72 52 75 6e 2c 20 70 54 61 62  pNew->rRun, pTab
1a930 2d 3e 63 6f 73 74 4d 75 6c 74 29 3b 0a 20 20 20  ->costMult);.   
1a940 20 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 4f 75       whereLoopOu
1a950 74 70 75 74 41 64 6a 75 73 74 28 70 57 43 2c 20  tputAdjust(pWC, 
1a960 70 4e 65 77 2c 20 72 53 69 7a 65 29 3b 0a 20 20  pNew, rSize);.  
1a970 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65        rc = where
1a980 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75 69 6c  LoopInsert(pBuil
1a990 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  der, pNew);.    
1a9a0 20 20 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d      pNew->nOut =
1a9b0 20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20   rSize;.        
1a9c0 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
1a9d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1a9e0 20 20 20 70 42 75 69 6c 64 65 72 2d 3e 62 6c 64     pBuilder->bld
1a9f0 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 72  Flags = 0;.    r
1aa00 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1aa10 42 74 72 65 65 49 6e 64 65 78 28 70 42 75 69 6c  BtreeIndex(pBuil
1aa20 64 65 72 2c 20 70 53 72 63 2c 20 70 50 72 6f 62  der, pSrc, pProb
1aa30 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  e, 0);.    if( p
1aa40 42 75 69 6c 64 65 72 2d 3e 62 6c 64 46 6c 61 67  Builder->bldFlag
1aa50 73 3d 3d 53 51 4c 49 54 45 5f 42 4c 44 46 5f 49  s==SQLITE_BLDF_I
1aa60 4e 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20  NDEXED ){.      
1aa70 2f 2a 20 49 66 20 61 20 6e 6f 6e 2d 75 6e 69 71  /* If a non-uniq
1aa80 75 65 20 69 6e 64 65 78 20 69 73 20 75 73 65 64  ue index is used
1aa90 2c 20 6f 72 20 69 66 20 61 20 70 72 65 66 69 78  , or if a prefix
1aaa0 20 6f 66 20 74 68 65 20 6b 65 79 20 66 6f 72 0a   of the key for.
1aab0 20 20 20 20 20 20 2a 2a 20 75 6e 69 71 75 65 20        ** unique 
1aac0 69 6e 64 65 78 20 69 73 20 75 73 65 64 20 28 6d  index is used (m
1aad0 61 6b 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20  aking the index 
1aae0 66 75 6e 63 74 69 6f 6e 61 6c 6c 79 20 6e 6f 6e  functionally non
1aaf0 2d 75 6e 69 71 75 65 29 0a 20 20 20 20 20 20 2a  -unique).      *
1ab00 2a 20 74 68 65 6e 20 74 68 65 20 73 71 6c 69 74  * then the sqlit
1ab10 65 5f 73 74 61 74 31 20 64 61 74 61 20 62 65 63  e_stat1 data bec
1ab20 6f 6d 65 73 20 69 6d 70 6f 72 74 61 6e 74 20 66  omes important f
1ab30 6f 72 20 73 63 6f 72 69 6e 67 20 74 68 65 0a 20  or scoring the. 
1ab40 20 20 20 20 20 2a 2a 20 70 6c 61 6e 20 2a 2f 0a       ** plan */.
1ab50 20 20 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46        pTab->tabF
1ab60 6c 61 67 73 20 7c 3d 20 54 46 5f 53 74 61 74 73  lags |= TF_Stats
1ab70 55 73 65 64 3b 0a 20 20 20 20 7d 0a 23 69 66 64  Used;.    }.#ifd
1ab80 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1ab90 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
1aba0 20 20 20 20 73 71 6c 69 74 65 33 53 74 61 74 34      sqlite3Stat4
1abb0 50 72 6f 62 65 46 72 65 65 28 70 42 75 69 6c 64  ProbeFree(pBuild
1abc0 65 72 2d 3e 70 52 65 63 29 3b 0a 20 20 20 20 70  er->pRec);.    p
1abd0 42 75 69 6c 64 65 72 2d 3e 6e 52 65 63 56 61 6c  Builder->nRecVal
1abe0 69 64 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 69  id = 0;.    pBui
1abf0 6c 64 65 72 2d 3e 70 52 65 63 20 3d 20 30 3b 0a  lder->pRec = 0;.
1ac00 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
1ac10 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49  f there was an I
1ac20 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
1ac30 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74  , then only that
1ac40 20 6f 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20   one index is.  
1ac50 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e    ** considered.
1ac60 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63   */.    if( pSrc
1ac70 2d 3e 70 49 42 49 6e 64 65 78 20 29 20 62 72 65  ->pIBIndex ) bre
1ac80 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
1ac90 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
1aca0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1acb0 55 41 4c 54 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a 20  UALTABLE../*.** 
1acc0 41 72 67 75 6d 65 6e 74 20 70 49 64 78 49 6e 66  Argument pIdxInf
1acd0 6f 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 70  o is already pop
1ace0 75 6c 61 74 65 64 20 77 69 74 68 20 61 6c 6c 20  ulated with all 
1acf0 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74  constraints that
1ad00 20 6d 61 79 0a 2a 2a 20 62 65 20 75 73 65 64 20   may.** be used 
1ad10 62 79 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  by the virtual t
1ad20 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20  able identified 
1ad30 62 79 20 70 42 75 69 6c 64 65 72 2d 3e 70 4e 65  by pBuilder->pNe
1ad40 77 2d 3e 69 54 61 62 2e 20 54 68 69 73 0a 2a 2a  w->iTab. This.**
1ad50 20 66 75 6e 63 74 69 6f 6e 20 6d 61 72 6b 73 20   function marks 
1ad60 61 20 73 75 62 73 65 74 20 6f 66 20 74 68 6f 73  a subset of thos
1ad70 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 75 73  e constraints us
1ad80 61 62 6c 65 2c 20 69 6e 76 6f 6b 65 73 20 74 68  able, invokes th
1ad90 65 0a 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 20  e.** xBestIndex 
1ada0 6d 65 74 68 6f 64 20 61 6e 64 20 61 64 64 73 20  method and adds 
1adb0 74 68 65 20 72 65 74 75 72 6e 65 64 20 70 6c 61  the returned pla
1adc0 6e 20 74 6f 20 70 42 75 69 6c 64 65 72 2e 0a 2a  n to pBuilder..*
1add0 2a 0a 2a 2a 20 41 20 63 6f 6e 73 74 72 61 69 6e  *.** A constrain
1ade0 74 20 69 73 20 6d 61 72 6b 65 64 20 75 73 61 62  t is marked usab
1adf0 6c 65 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  le if:.**.**   *
1ae00 20 41 72 67 75 6d 65 6e 74 20 6d 55 73 61 62 6c   Argument mUsabl
1ae10 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
1ae20 20 69 74 73 20 70 72 65 72 65 71 75 69 73 69 74   its prerequisit
1ae30 65 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  es are available
1ae40 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  , and.**.**   * 
1ae50 49 74 20 69 73 20 6e 6f 74 20 6f 6e 65 20 6f 66  It is not one of
1ae60 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 73   the operators s
1ae70 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
1ae80 6d 45 78 63 6c 75 64 65 20 6d 61 73 6b 20 70 61  mExclude mask pa
1ae90 73 73 65 64 0a 2a 2a 20 20 20 20 20 61 73 20 74  ssed.**     as t
1aea0 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65  he fourth argume
1aeb0 6e 74 20 28 77 68 69 63 68 20 69 6e 20 70 72 61  nt (which in pra
1aec0 63 74 69 63 65 20 69 73 20 65 69 74 68 65 72 20  ctice is either 
1aed0 57 4f 5f 49 4e 20 6f 72 20 30 29 2e 0a 2a 2a 0a  WO_IN or 0)..**.
1aee0 2a 2a 20 41 72 67 75 6d 65 6e 74 20 6d 50 72 65  ** Argument mPre
1aef0 72 65 71 20 69 73 20 61 20 6d 61 73 6b 20 6f 66  req is a mask of
1af00 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d 75 73   tables that mus
1af10 74 20 62 65 20 73 63 61 6e 6e 65 64 20 62 65 66  t be scanned bef
1af20 6f 72 65 20 74 68 65 0a 2a 2a 20 76 69 72 74 75  ore the.** virtu
1af30 61 6c 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73  al table in ques
1af40 74 69 6f 6e 2e 20 54 68 65 73 65 20 61 72 65 20  tion. These are 
1af50 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 6c 61  added to the pla
1af60 6e 73 20 70 72 65 72 65 71 75 69 73 69 74 65 73  ns prerequisites
1af70 0a 2a 2a 20 62 65 66 6f 72 65 20 69 74 20 69 73  .** before it is
1af80 20 61 64 64 65 64 20 74 6f 20 70 42 75 69 6c 64   added to pBuild
1af90 65 72 2e 0a 2a 2a 0a 2a 2a 20 4f 75 74 70 75 74  er..**.** Output
1afa0 20 70 61 72 61 6d 65 74 65 72 20 2a 70 62 49 6e   parameter *pbIn
1afb0 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
1afc0 69 66 20 74 68 65 20 70 6c 61 6e 20 61 64 64 65  if the plan adde
1afd0 64 20 74 6f 20 70 42 75 69 6c 64 65 72 0a 2a 2a  d to pBuilder.**
1afe0 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   uses one or mor
1aff0 65 20 57 4f 5f 49 4e 20 74 65 72 6d 73 2c 20 6f  e WO_IN terms, o
1b000 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  r false otherwis
1b010 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1b020 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72   whereLoopAddVir
1b030 74 75 61 6c 4f 6e 65 28 0a 20 20 57 68 65 72 65  tualOne(.  Where
1b040 4c 6f 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75  LoopBuilder *pBu
1b050 69 6c 64 65 72 2c 0a 20 20 42 69 74 6d 61 73 6b  ilder,.  Bitmask
1b060 20 6d 50 72 65 72 65 71 2c 20 20 20 20 20 20 20   mPrereq,       
1b070 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
1b080 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
1b090 6d 75 73 74 20 62 65 20 75 73 65 64 2e 20 2a 2f  must be used. */
1b0a0 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55 73 61 62  .  Bitmask mUsab
1b0b0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
1b0c0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 75 73     /* Mask of us
1b0d0 61 62 6c 65 20 74 61 62 6c 65 73 20 2a 2f 0a 20  able tables */. 
1b0e0 20 75 31 36 20 6d 45 78 63 6c 75 64 65 2c 20 20   u16 mExclude,  
1b0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b100 20 2f 2a 20 45 78 63 6c 75 64 65 20 74 65 72 6d   /* Exclude term
1b110 73 20 75 73 69 6e 67 20 74 68 65 73 65 20 6f 70  s using these op
1b120 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 73 71 6c  erators */.  sql
1b130 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
1b140 2a 70 49 64 78 49 6e 66 6f 2c 20 20 20 2f 2a 20  *pIdxInfo,   /* 
1b150 50 6f 70 75 6c 61 74 65 64 20 6f 62 6a 65 63 74  Populated object
1b160 20 66 6f 72 20 78 42 65 73 74 49 6e 64 65 78 20   for xBestIndex 
1b170 2a 2f 0a 20 20 75 31 36 20 6d 4e 6f 4f 6d 69 74  */.  u16 mNoOmit
1b180 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b190 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6f       /* Do not o
1b1a0 6d 69 74 20 74 68 65 73 65 20 63 6f 6e 73 74 72  mit these constr
1b1b0 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  aints */.  int *
1b1c0 70 62 49 6e 20 20 20 20 20 20 20 20 20 20 20 20  pbIn            
1b1d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1b1e0 54 3a 20 54 72 75 65 20 69 66 20 70 6c 61 6e 20  T: True if plan 
1b1f0 75 73 65 73 20 61 6e 20 49 4e 28 2e 2e 2e 29 20  uses an IN(...) 
1b200 6f 70 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  op */.){.  Where
1b210 43 6c 61 75 73 65 20 2a 70 57 43 20 3d 20 70 42  Clause *pWC = pB
1b220 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 73  uilder->pWC;.  s
1b230 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
1b240 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
1b250 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75  pIdxCons;.  stru
1b260 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
1b270 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
1b280 65 20 2a 70 55 73 61 67 65 20 3d 20 70 49 64 78  e *pUsage = pIdx
1b290 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
1b2a0 74 55 73 61 67 65 3b 0a 20 20 69 6e 74 20 69 3b  tUsage;.  int i;
1b2b0 0a 20 20 69 6e 74 20 6d 78 54 65 72 6d 3b 0a 20  .  int mxTerm;. 
1b2c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1b2d0 5f 4f 4b 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  _OK;.  WhereLoop
1b2e0 20 2a 70 4e 65 77 20 3d 20 70 42 75 69 6c 64 65   *pNew = pBuilde
1b2f0 72 2d 3e 70 4e 65 77 3b 0a 20 20 50 61 72 73 65  r->pNew;.  Parse
1b300 20 2a 70 50 61 72 73 65 20 3d 20 70 42 75 69 6c   *pParse = pBuil
1b310 64 65 72 2d 3e 70 57 49 6e 66 6f 2d 3e 70 50 61  der->pWInfo->pPa
1b320 72 73 65 3b 0a 20 20 73 74 72 75 63 74 20 53 72  rse;.  struct Sr
1b330 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
1b340 20 3d 20 26 70 42 75 69 6c 64 65 72 2d 3e 70 57   = &pBuilder->pW
1b350 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e  Info->pTabList->
1b360 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b 0a 20  a[pNew->iTab];. 
1b370 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
1b380 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   = pIdxInfo->nCo
1b390 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20 61 73 73  nstraint;..  ass
1b3a0 65 72 74 28 20 28 6d 55 73 61 62 6c 65 20 26 20  ert( (mUsable & 
1b3b0 6d 50 72 65 72 65 71 29 3d 3d 6d 50 72 65 72 65  mPrereq)==mPrere
1b3c0 71 20 29 3b 0a 20 20 2a 70 62 49 6e 20 3d 20 30  q );.  *pbIn = 0
1b3d0 3b 0a 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71  ;.  pNew->prereq
1b3e0 20 3d 20 6d 50 72 65 72 65 71 3b 0a 0a 20 20 2f   = mPrereq;..  /
1b3f0 2a 20 53 65 74 20 74 68 65 20 75 73 61 62 6c 65  * Set the usable
1b400 20 66 6c 61 67 20 6f 6e 20 74 68 65 20 73 75 62   flag on the sub
1b410 73 65 74 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e  set of constrain
1b420 74 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ts identified by
1b430 20 0a 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 73   .  ** arguments
1b440 20 6d 55 73 61 62 6c 65 20 61 6e 64 20 6d 45 78   mUsable and mEx
1b450 63 6c 75 64 65 2e 20 2a 2f 0a 20 20 70 49 64 78  clude. */.  pIdx
1b460 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20  Cons = *(struct 
1b470 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
1b480 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
1b490 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
1b4a0 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
1b4b0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
1b4c0 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
1b4d0 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
1b4e0 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 70 49  erm = &pWC->a[pI
1b4f0 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
1b500 73 65 74 5d 3b 0a 20 20 20 20 70 49 64 78 43 6f  set];.    pIdxCo
1b510 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 30 3b 0a  ns->usable = 0;.
1b520 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
1b530 70 72 65 72 65 71 52 69 67 68 74 20 26 20 6d 55  prereqRight & mU
1b540 73 61 62 6c 65 29 3d 3d 70 54 65 72 6d 2d 3e 70  sable)==pTerm->p
1b550 72 65 72 65 71 52 69 67 68 74 20 0a 20 20 20 20  rereqRight .    
1b560 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65   && (pTerm->eOpe
1b570 72 61 74 6f 72 20 26 20 6d 45 78 63 6c 75 64 65  rator & mExclude
1b580 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
1b590 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62    pIdxCons->usab
1b5a0 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  le = 1;.    }.  
1b5b0 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
1b5c0 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20 66 69  ze the output fi
1b5d0 65 6c 64 73 20 6f 66 20 74 68 65 20 73 71 6c 69  elds of the sqli
1b5e0 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
1b5f0 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 6d 65  tructure */.  me
1b600 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c 20  mset(pUsage, 0, 
1b610 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30 5d  sizeof(pUsage[0]
1b620 29 2a 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  )*nConstraint);.
1b630 20 20 61 73 73 65 72 74 28 20 70 49 64 78 49 6e    assert( pIdxIn
1b640 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
1b650 78 53 74 72 3d 3d 30 20 29 3b 0a 20 20 70 49 64  xStr==0 );.  pId
1b660 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20  xInfo->idxStr = 
1b670 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69  0;.  pIdxInfo->i
1b680 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 70 49 64  dxNum = 0;.  pId
1b690 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
1b6a0 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 70 49  nsumed = 0;.  pI
1b6b0 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
1b6c0 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42  dCost = SQLITE_B
1b6d0 49 47 5f 44 42 4c 20 2f 20 28 64 6f 75 62 6c 65  IG_DBL / (double
1b6e0 29 32 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e  )2;.  pIdxInfo->
1b6f0 65 73 74 69 6d 61 74 65 64 52 6f 77 73 20 3d 20  estimatedRows = 
1b700 32 35 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e  25;.  pIdxInfo->
1b710 69 64 78 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20  idxFlags = 0;.  
1b720 70 49 64 78 49 6e 66 6f 2d 3e 63 6f 6c 55 73 65  pIdxInfo->colUse
1b730 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  d = (sqlite3_int
1b740 36 34 29 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64  64)pSrc->colUsed
1b750 3b 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 74  ;..  /* Invoke t
1b760 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  he virtual table
1b770 20 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d 65   xBestIndex() me
1b780 74 68 6f 64 20 2a 2f 0a 20 20 72 63 20 3d 20 76  thod */.  rc = v
1b790 74 61 62 42 65 73 74 49 6e 64 65 78 28 70 50 61  tabBestIndex(pPa
1b7a0 72 73 65 2c 20 70 53 72 63 2d 3e 70 54 61 62 2c  rse, pSrc->pTab,
1b7b0 20 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 69 66   pIdxInfo);.  if
1b7c0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1b7d0 3b 0a 0a 20 20 6d 78 54 65 72 6d 20 3d 20 2d 31  ;..  mxTerm = -1
1b7e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ;.  assert( pNew
1b7f0 2d 3e 6e 4c 53 6c 6f 74 3e 3d 6e 43 6f 6e 73 74  ->nLSlot>=nConst
1b800 72 61 69 6e 74 20 29 3b 0a 20 20 66 6f 72 28 69  raint );.  for(i
1b810 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69 6e  =0; i<nConstrain
1b820 74 3b 20 69 2b 2b 29 20 70 4e 65 77 2d 3e 61 4c  t; i++) pNew->aL
1b830 54 65 72 6d 5b 69 5d 20 3d 20 30 3b 0a 20 20 70  Term[i] = 0;.  p
1b840 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  New->u.vtab.omit
1b850 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 49 64 78  Mask = 0;.  pIdx
1b860 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20  Cons = *(struct 
1b870 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
1b880 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
1b890 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
1b8a0 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
1b8b0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
1b8c0 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
1b8d0 20 20 20 69 6e 74 20 69 54 65 72 6d 3b 0a 20 20     int iTerm;.  
1b8e0 20 20 69 66 28 20 28 69 54 65 72 6d 20 3d 20 70    if( (iTerm = p
1b8f0 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
1b900 65 78 20 2d 20 31 29 3e 3d 30 20 29 7b 0a 20 20  ex - 1)>=0 ){.  
1b910 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1b920 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Term;.      int 
1b930 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54  j = pIdxCons->iT
1b940 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20  ermOffset;.     
1b950 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e 43 6f 6e   if( iTerm>=nCon
1b960 73 74 72 61 69 6e 74 0a 20 20 20 20 20 20 20 7c  straint.       |
1b970 7c 20 6a 3c 30 0a 20 20 20 20 20 20 20 7c 7c 20  | j<0.       || 
1b980 6a 3e 3d 70 57 43 2d 3e 6e 54 65 72 6d 0a 20 20  j>=pWC->nTerm.  
1b990 20 20 20 20 20 7c 7c 20 70 4e 65 77 2d 3e 61 4c       || pNew->aL
1b9a0 54 65 72 6d 5b 69 54 65 72 6d 5d 21 3d 30 0a 20  Term[iTerm]!=0. 
1b9b0 20 20 20 20 20 20 7c 7c 20 70 49 64 78 43 6f 6e        || pIdxCon
1b9c0 73 2d 3e 75 73 61 62 6c 65 3d 3d 30 0a 20 20 20  s->usable==0.   
1b9d0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63     ){.        rc
1b9e0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1b9f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ba00 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
1ba10 22 25 73 2e 78 42 65 73 74 49 6e 64 65 78 20 6d  "%s.xBestIndex m
1ba20 61 6c 66 75 6e 63 74 69 6f 6e 22 2c 70 53 72 63  alfunction",pSrc
1ba30 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  ->pTab->zName);.
1ba40 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1ba50 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
1ba60 20 74 65 73 74 63 61 73 65 28 20 69 54 65 72 6d   testcase( iTerm
1ba70 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 2d 31 20  ==nConstraint-1 
1ba80 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1ba90 65 28 20 6a 3d 3d 30 20 29 3b 0a 20 20 20 20 20  e( j==0 );.     
1baa0 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 70 57   testcase( j==pW
1bab0 43 2d 3e 6e 54 65 72 6d 2d 31 20 29 3b 0a 20 20  C->nTerm-1 );.  
1bac0 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
1bad0 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 20 20 70 4e  ->a[j];.      pN
1bae0 65 77 2d 3e 70 72 65 72 65 71 20 7c 3d 20 70 54  ew->prereq |= pT
1baf0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
1bb00 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1bb10 69 54 65 72 6d 3c 70 4e 65 77 2d 3e 6e 4c 53 6c  iTerm<pNew->nLSl
1bb20 6f 74 20 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  ot );.      pNew
1bb30 2d 3e 61 4c 54 65 72 6d 5b 69 54 65 72 6d 5d 20  ->aLTerm[iTerm] 
1bb40 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 69  = pTerm;.      i
1bb50 66 28 20 69 54 65 72 6d 3e 6d 78 54 65 72 6d 20  f( iTerm>mxTerm 
1bb60 29 20 6d 78 54 65 72 6d 20 3d 20 69 54 65 72 6d  ) mxTerm = iTerm
1bb70 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1bb80 28 20 69 54 65 72 6d 3d 3d 31 35 20 29 3b 0a 20  ( iTerm==15 );. 
1bb90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
1bba0 54 65 72 6d 3d 3d 31 36 20 29 3b 0a 20 20 20 20  Term==16 );.    
1bbb0 20 20 69 66 28 20 69 54 65 72 6d 3c 31 36 20 26    if( iTerm<16 &
1bbc0 26 20 70 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74  & pUsage[i].omit
1bbd0 20 29 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e   ) pNew->u.vtab.
1bbe0 6f 6d 69 74 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69  omitMask |= 1<<i
1bbf0 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  Term;.      if( 
1bc00 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
1bc10 72 20 26 20 57 4f 5f 49 4e 29 21 3d 30 20 29 7b  r & WO_IN)!=0 ){
1bc20 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 20 76 69  .        /* A vi
1bc30 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68 61 74  rtual table that
1bc40 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20   is constrained 
1bc50 62 79 20 61 6e 20 49 4e 20 63 6c 61 75 73 65 20  by an IN clause 
1bc60 6d 61 79 20 6e 6f 74 0a 20 20 20 20 20 20 20 20  may not.        
1bc70 2a 2a 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 4f  ** consume the O
1bc80 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 62  RDER BY clause b
1bc90 65 63 61 75 73 65 20 28 31 29 20 74 68 65 20 6f  ecause (1) the o
1bca0 72 64 65 72 20 6f 66 20 49 4e 20 74 65 72 6d 73  rder of IN terms
1bcb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 6e  .        ** is n
1bcc0 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 72  ot necessarily r
1bcd0 65 6c 61 74 65 64 20 74 6f 20 74 68 65 20 6f 72  elated to the or
1bce0 64 65 72 20 6f 66 20 6f 75 74 70 75 74 20 74 65  der of output te
1bcf0 72 6d 73 20 61 6e 64 0a 20 20 20 20 20 20 20 20  rms and.        
1bd00 2a 2a 20 28 32 29 20 4d 75 6c 74 69 70 6c 65 20  ** (2) Multiple 
1bd10 6f 75 74 70 75 74 73 20 66 72 6f 6d 20 61 20 73  outputs from a s
1bd20 69 6e 67 6c 65 20 49 4e 20 76 61 6c 75 65 20 77  ingle IN value w
1bd30 69 6c 6c 20 6e 6f 74 20 6d 65 72 67 65 0a 20 20  ill not merge.  
1bd40 20 20 20 20 20 20 2a 2a 20 74 6f 67 65 74 68 65        ** togethe
1bd50 72 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  r.  */.        p
1bd60 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
1bd70 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20  Consumed = 0;.  
1bd80 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e        pIdxInfo->
1bd90 69 64 78 46 6c 61 67 73 20 26 3d 20 7e 53 51 4c  idxFlags &= ~SQL
1bda0 49 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e 5f 55  ITE_INDEX_SCAN_U
1bdb0 4e 49 51 55 45 3b 0a 20 20 20 20 20 20 20 20 2a  NIQUE;.        *
1bdc0 70 62 49 6e 20 3d 20 31 3b 20 61 73 73 65 72 74  pbIn = 1; assert
1bdd0 28 20 28 6d 45 78 63 6c 75 64 65 20 26 20 57 4f  ( (mExclude & WO
1bde0 5f 49 4e 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  _IN)==0 );.     
1bdf0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70   }.    }.  }.  p
1be00 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6f 6d 69 74  New->u.vtab.omit
1be10 4d 61 73 6b 20 26 3d 20 7e 6d 4e 6f 4f 6d 69 74  Mask &= ~mNoOmit
1be20 3b 0a 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72  ;..  pNew->nLTer
1be30 6d 20 3d 20 6d 78 54 65 72 6d 2b 31 3b 0a 20 20  m = mxTerm+1;.  
1be40 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4c  assert( pNew->nL
1be50 54 65 72 6d 3c 3d 70 4e 65 77 2d 3e 6e 4c 53 6c  Term<=pNew->nLSl
1be60 6f 74 20 29 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e  ot );.  pNew->u.
1be70 76 74 61 62 2e 69 64 78 4e 75 6d 20 3d 20 70 49  vtab.idxNum = pI
1be80 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 3b 0a  dxInfo->idxNum;.
1be90 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e    pNew->u.vtab.n
1bea0 65 65 64 46 72 65 65 20 3d 20 70 49 64 78 49 6e  eedFree = pIdxIn
1beb0 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
1bec0 78 53 74 72 3b 0a 20 20 70 49 64 78 49 6e 66 6f  xStr;.  pIdxInfo
1bed0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
1bee0 74 72 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  tr = 0;.  pNew->
1bef0 75 2e 76 74 61 62 2e 69 64 78 53 74 72 20 3d 20  u.vtab.idxStr = 
1bf00 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
1bf10 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62  ;.  pNew->u.vtab
1bf20 2e 69 73 4f 72 64 65 72 65 64 20 3d 20 28 69 38  .isOrdered = (i8
1bf30 29 28 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65  )(pIdxInfo->orde
1bf40 72 42 79 43 6f 6e 73 75 6d 65 64 20 3f 0a 20 20  rByConsumed ?.  
1bf50 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f      pIdxInfo->nO
1bf60 72 64 65 72 42 79 20 3a 20 30 29 3b 0a 20 20 70  rderBy : 0);.  p
1bf70 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
1bf80 0a 20 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20  .  pNew->rRun = 
1bf90 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 46 72 6f  sqlite3LogEstFro
1bfa0 6d 44 6f 75 62 6c 65 28 70 49 64 78 49 6e 66 6f  mDouble(pIdxInfo
1bfb0 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 29  ->estimatedCost)
1bfc0 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 75 74 20 3d  ;.  pNew->nOut =
1bfd0 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 70   sqlite3LogEst(p
1bfe0 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74  IdxInfo->estimat
1bff0 65 64 52 6f 77 73 29 3b 0a 0a 20 20 2f 2a 20 53  edRows);..  /* S
1c000 65 74 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45  et the WHERE_ONE
1c010 52 4f 57 20 66 6c 61 67 20 69 66 20 74 68 65 20  ROW flag if the 
1c020 78 42 65 73 74 49 6e 64 65 78 28 29 20 6d 65 74  xBestIndex() met
1c030 68 6f 64 20 69 6e 64 69 63 61 74 65 64 0a 20 20  hod indicated.  
1c040 2a 2a 20 74 68 61 74 20 74 68 65 20 73 63 61 6e  ** that the scan
1c050 20 77 69 6c 6c 20 76 69 73 69 74 20 61 74 20 6d   will visit at m
1c060 6f 73 74 20 6f 6e 65 20 72 6f 77 2e 20 43 6c 65  ost one row. Cle
1c070 61 72 20 69 74 20 6f 74 68 65 72 77 69 73 65 2e  ar it otherwise.
1c080 20 2a 2f 0a 20 20 69 66 28 20 70 49 64 78 49 6e   */.  if( pIdxIn
1c090 66 6f 2d 3e 69 64 78 46 6c 61 67 73 20 26 20 53  fo->idxFlags & S
1c0a0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 43 41 4e  QLITE_INDEX_SCAN
1c0b0 5f 55 4e 49 51 55 45 20 29 7b 0a 20 20 20 20 70  _UNIQUE ){.    p
1c0c0 4e 65 77 2d 3e 77 73 46 6c 61 67 73 20 7c 3d 20  New->wsFlags |= 
1c0d0 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20  WHERE_ONEROW;.  
1c0e0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d  }else{.    pNew-
1c0f0 3e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48 45  >wsFlags &= ~WHE
1c100 52 45 5f 4f 4e 45 52 4f 57 3b 0a 20 20 7d 0a 20  RE_ONEROW;.  }. 
1c110 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 49   rc = whereLoopI
1c120 6e 73 65 72 74 28 70 42 75 69 6c 64 65 72 2c 20  nsert(pBuilder, 
1c130 70 4e 65 77 29 3b 0a 20 20 69 66 28 20 70 4e 65  pNew);.  if( pNe
1c140 77 2d 3e 75 2e 76 74 61 62 2e 6e 65 65 64 46 72  w->u.vtab.needFr
1c150 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ee ){.    sqlite
1c160 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 75 2e 76  3_free(pNew->u.v
1c170 74 61 62 2e 69 64 78 53 74 72 29 3b 0a 20 20 20  tab.idxStr);.   
1c180 20 70 4e 65 77 2d 3e 75 2e 76 74 61 62 2e 6e 65   pNew->u.vtab.ne
1c190 65 64 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a  edFree = 0;.  }.
1c1a0 20 20 57 48 45 52 45 54 52 41 43 45 28 30 78 66    WHERETRACE(0xf
1c1b0 66 66 66 2c 20 28 22 20 20 62 49 6e 3d 25 64 20  fff, ("  bIn=%d 
1c1c0 70 72 65 72 65 71 49 6e 3d 25 30 34 6c 6c 78 20  prereqIn=%04llx 
1c1d0 70 72 65 72 65 71 4f 75 74 3d 25 30 34 6c 6c 78  prereqOut=%04llx
1c1e0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1c1f0 20 20 20 20 20 20 20 20 20 20 20 2a 70 62 49 6e             *pbIn
1c200 2c 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36  , (sqlite3_uint6
1c210 34 29 6d 50 72 65 72 65 71 2c 0a 20 20 20 20 20  4)mPrereq,.     
1c220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c230 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34   (sqlite3_uint64
1c240 29 28 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 26  )(pNew->prereq &
1c250 20 7e 6d 50 72 65 72 65 71 29 29 29 3b 0a 0a 20   ~mPrereq)));.. 
1c260 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1c270 2f 2a 0a 2a 2a 20 43 6f 6e 74 65 78 74 20 6f 62  /*.** Context ob
1c280 6a 65 63 74 20 75 73 65 64 20 74 6f 20 70 61 73  ject used to pas
1c290 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  s information fr
1c2a0 6f 6d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 56  om whereLoopAddV
1c2b0 69 72 74 75 61 6c 28 29 0a 2a 2a 20 74 6f 20 73  irtual().** to s
1c2c0 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 6f 6c 6c  qlite3_vtab_coll
1c2d0 61 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 72 75  ation()..*/.stru
1c2e0 63 74 20 42 65 73 74 49 6e 64 65 78 43 74 78 20  ct BestIndexCtx 
1c2f0 7b 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  {.  WhereClause 
1c300 2a 70 57 43 3b 0a 20 20 73 71 6c 69 74 65 33 5f  *pWC;.  sqlite3_
1c310 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78  index_info *pIdx
1c320 49 6e 66 6f 3b 0a 20 20 50 61 72 73 65 20 2a 70  Info;.  Parse *p
1c330 50 61 72 73 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  Parse;.};../*.**
1c340 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
1c350 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 66 72 6f  n is invoked fro
1c360 6d 20 77 69 74 68 69 6e 20 61 6e 20 78 42 65 73  m within an xBes
1c370 74 49 6e 64 65 78 28 29 20 63 61 6c 6c 62 61 63  tIndex() callbac
1c380 6b 2c 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73  k, it.** returns
1c390 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
1c3a0 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
1c3b0 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  g the name of th
1c3c0 65 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 73  e collation.** s
1c3d0 65 71 75 65 6e 63 65 20 61 73 73 6f 63 69 61 74  equence associat
1c3e0 65 64 20 77 69 74 68 20 65 6c 65 6d 65 6e 74 20  ed with element 
1c3f0 69 43 6f 6e 73 20 6f 66 20 74 68 65 20 73 71 6c  iCons of the sql
1c400 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 2e  ite3_index_info.
1c410 61 43 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 61  aConstraint.** a
1c420 72 72 61 79 2e 20 4f 72 2c 20 69 66 20 69 43 6f  rray. Or, if iCo
1c430 6e 73 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e  ns is out of ran
1c440 67 65 20 6f 72 20 74 68 65 72 65 20 69 73 20 6e  ge or there is n
1c450 6f 20 61 63 74 69 76 65 20 78 42 65 73 74 49 6e  o active xBestIn
1c460 64 65 78 0a 2a 2a 20 63 61 6c 6c 2c 20 72 65 74  dex.** call, ret
1c470 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 63 6f 6e  urn NULL..*/.con
1c480 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
1c490 5f 76 74 61 62 5f 63 6f 6c 6c 61 74 69 6f 6e 28  _vtab_collation(
1c4a0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
1c4b0 20 69 43 6f 6e 73 29 7b 0a 20 20 73 74 72 75 63   iCons){.  struc
1c4c0 74 20 42 65 73 74 49 6e 64 65 78 43 74 78 20 2a  t BestIndexCtx *
1c4d0 70 20 3d 20 28 73 74 72 75 63 74 20 42 65 73 74  p = (struct Best
1c4e0 49 6e 64 65 78 43 74 78 2a 29 64 62 2d 3e 70 42  IndexCtx*)db->pB
1c4f0 65 73 74 49 6e 64 65 78 43 74 78 3b 0a 20 20 63  estIndexCtx;.  c
1c500 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 74 20  onst char *zRet 
1c510 3d 20 30 3b 0a 20 20 69 66 28 20 70 20 26 26 20  = 0;.  if( p && 
1c520 69 43 6f 6e 73 3e 3d 30 20 26 26 20 69 43 6f 6e  iCons>=0 && iCon
1c530 73 3c 70 2d 3e 70 49 64 78 49 6e 66 6f 2d 3e 6e  s<p->pIdxInfo->n
1c540 43 6f 6e 73 74 72 61 69 6e 74 20 29 7b 0a 20 20  Constraint ){.  
1c550 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 70 2d    int iTerm = p-
1c560 3e 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  >pIdxInfo->aCons
1c570 74 72 61 69 6e 74 5b 69 43 6f 6e 73 5d 2e 69 54  traint[iCons].iT
1c580 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 45  ermOffset;.    E
1c590 78 70 72 20 2a 70 58 20 3d 20 70 2d 3e 70 57 43  xpr *pX = p->pWC
1c5a0 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72  ->a[iTerm].pExpr
1c5b0 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70  ;.    CollSeq *p
1c5c0 43 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  C = sqlite3Binar
1c5d0 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
1c5e0 70 2d 3e 70 50 61 72 73 65 2c 70 58 2d 3e 70 4c  p->pParse,pX->pL
1c5f0 65 66 74 2c 70 58 2d 3e 70 52 69 67 68 74 29 3b  eft,pX->pRight);
1c600 0a 20 20 20 20 7a 52 65 74 20 3d 20 28 70 43 20  .    zRet = (pC 
1c610 3f 20 70 43 2d 3e 7a 4e 61 6d 65 20 3a 20 22 42  ? pC->zName : "B
1c620 49 4e 41 52 59 22 29 3b 0a 20 20 7d 0a 20 20 72  INARY");.  }.  r
1c630 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 0a 2f  eturn zRet;.}../
1c640 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c 20 57 68 65  *.** Add all Whe
1c650 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 66  reLoop objects f
1c660 6f 72 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68  or a table of th
1c670 65 20 6a 6f 69 6e 20 69 64 65 6e 74 69 66 69 65  e join identifie
1c680 64 20 62 79 0a 2a 2a 20 70 42 75 69 6c 64 65 72  d by.** pBuilder
1c690 2d 3e 70 4e 65 77 2d 3e 69 54 61 62 2e 20 20 54  ->pNew->iTab.  T
1c6a0 68 61 74 20 74 61 62 6c 65 20 69 73 20 67 75 61  hat table is gua
1c6b0 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 20  ranteed to be a 
1c6c0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
1c6d0 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
1c6e0 65 20 6e 6f 20 4c 45 46 54 20 6f 72 20 43 52 4f  e no LEFT or CRO
1c6f0 53 53 20 4a 4f 49 4e 20 6a 6f 69 6e 73 20 69 6e  SS JOIN joins in
1c700 20 74 68 65 20 71 75 65 72 79 2c 20 62 6f 74 68   the query, both
1c710 20 6d 50 72 65 72 65 71 20 61 6e 64 0a 2a 2a 20   mPrereq and.** 
1c720 6d 55 6e 75 73 61 62 6c 65 20 61 72 65 20 73 65  mUnusable are se
1c730 74 20 74 6f 20 30 2e 20 4f 74 68 65 72 77 69 73  t to 0. Otherwis
1c740 65 2c 20 6d 50 72 65 72 65 71 20 69 73 20 61 20  e, mPrereq is a 
1c750 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 46 52 4f 4d  mask of all FROM
1c760 20 63 6c 61 75 73 65 0a 2a 2a 20 65 6e 74 72 69   clause.** entri
1c770 65 73 20 74 68 61 74 20 6f 63 63 75 72 20 62 65  es that occur be
1c780 66 6f 72 65 20 74 68 65 20 76 69 72 74 75 61 6c  fore the virtual
1c790 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
1c7a0 4f 4d 20 63 6c 61 75 73 65 20 61 6e 64 20 61 72  OM clause and ar
1c7b0 65 0a 2a 2a 20 73 65 70 61 72 61 74 65 64 20 66  e.** separated f
1c7c0 72 6f 6d 20 69 74 20 62 79 20 61 74 20 6c 65 61  rom it by at lea
1c7d0 73 74 20 6f 6e 65 20 4c 45 46 54 20 6f 72 20 43  st one LEFT or C
1c7e0 52 4f 53 53 20 4a 4f 49 4e 2e 20 53 69 6d 69 6c  ROSS JOIN. Simil
1c7f0 61 72 6c 79 2c 20 74 68 65 0a 2a 2a 20 6d 55 6e  arly, the.** mUn
1c800 75 73 61 62 6c 65 20 6d 61 73 6b 20 63 6f 6e 74  usable mask cont
1c810 61 69 6e 73 20 61 6c 6c 20 46 52 4f 4d 20 63 6c  ains all FROM cl
1c820 61 75 73 65 20 65 6e 74 72 69 65 73 20 74 68 61  ause entries tha
1c830 74 20 6f 63 63 75 72 20 61 66 74 65 72 20 74 68  t occur after th
1c840 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62  e.** virtual tab
1c850 6c 65 20 61 6e 64 20 61 72 65 20 73 65 70 61 72  le and are separ
1c860 61 74 65 64 20 66 72 6f 6d 20 69 74 20 62 79 20  ated from it by 
1c870 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 4c 45 46  at least one LEF
1c880 54 20 6f 72 20 0a 2a 2a 20 43 52 4f 53 53 20 4a  T or .** CROSS J
1c890 4f 49 4e 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  OIN. .**.** For 
1c8a0 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
1c8b0 71 75 65 72 79 20 77 65 72 65 3a 0a 2a 2a 0a 2a  query were:.**.*
1c8c0 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 2c  *   ... FROM t1,
1c8d0 20 74 32 20 4c 45 46 54 20 4a 4f 49 4e 20 74 33   t2 LEFT JOIN t3
1c8e0 2c 20 74 34 2c 20 76 74 20 43 52 4f 53 53 20 4a  , t4, vt CROSS J
1c8f0 4f 49 4e 20 74 35 2c 20 74 36 3b 0a 2a 2a 0a 2a  OIN t5, t6;.**.*
1c900 2a 20 74 68 65 6e 20 6d 50 72 65 72 65 71 20 63  * then mPrereq c
1c910 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 28 74  orresponds to (t
1c920 31 2c 20 74 32 29 20 61 6e 64 20 6d 55 6e 75 73  1, t2) and mUnus
1c930 61 62 6c 65 20 74 6f 20 28 74 35 2c 20 74 36 29  able to (t5, t6)
1c940 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 68 65 20  ..**.** All the 
1c950 74 61 62 6c 65 73 20 69 6e 20 6d 50 72 65 72 65  tables in mPrere
1c960 71 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65  q must be scanne
1c970 64 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72  d before the cur
1c980 72 65 6e 74 20 76 69 72 74 75 61 6c 20 0a 2a 2a  rent virtual .**
1c990 20 74 61 62 6c 65 2e 20 53 6f 20 61 6e 79 20 74   table. So any t
1c9a0 65 72 6d 73 20 66 6f 72 20 77 68 69 63 68 20 61  erms for which a
1c9b0 6c 6c 20 70 72 65 72 65 71 75 69 73 69 74 65 73  ll prerequisites
1c9c0 20 61 72 65 20 73 61 74 69 73 66 69 65 64 20 62   are satisfied b
1c9d0 79 20 0a 2a 2a 20 6d 50 72 65 72 65 71 20 6d 61  y .** mPrereq ma
1c9e0 79 20 62 65 20 73 70 65 63 69 66 69 65 64 20 61  y be specified a
1c9f0 73 20 22 75 73 61 62 6c 65 22 20 69 6e 20 61 6c  s "usable" in al
1ca00 6c 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73 74  l calls to xBest
1ca10 49 6e 64 65 78 2e 20 0a 2a 2a 20 43 6f 6e 76 65  Index. .** Conve
1ca20 72 73 65 6c 79 2c 20 61 6c 6c 20 74 61 62 6c 65  rsely, all table
1ca30 73 20 69 6e 20 6d 55 6e 75 73 61 62 6c 65 20 6d  s in mUnusable m
1ca40 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64 20 61  ust be scanned a
1ca50 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  fter the current
1ca60 0a 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c  .** virtual tabl
1ca70 65 2c 20 73 6f 20 61 6e 79 20 74 65 72 6d 73 20  e, so any terms 
1ca80 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 70 72  for which the pr
1ca90 65 72 65 71 75 69 73 69 74 65 73 20 6f 76 65 72  erequisites over
1caa0 6c 61 70 20 77 69 74 68 0a 2a 2a 20 6d 55 6e 75  lap with.** mUnu
1cab0 73 61 62 6c 65 20 73 68 6f 75 6c 64 20 61 6c 77  sable should alw
1cac0 61 79 73 20 62 65 20 63 6f 6e 66 69 67 75 72 65  ays be configure
1cad0 64 20 61 73 20 22 6e 6f 74 2d 75 73 61 62 6c 65  d as "not-usable
1cae0 22 20 66 6f 72 20 78 42 65 73 74 49 6e 64 65 78  " for xBestIndex
1caf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1cb00 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
1cb10 75 61 6c 28 0a 20 20 57 68 65 72 65 4c 6f 6f 70  ual(.  WhereLoop
1cb20 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64 65  Builder *pBuilde
1cb30 72 2c 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61  r,  /* WHERE cla
1cb40 75 73 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  use information 
1cb50 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 50 72  */.  Bitmask mPr
1cb60 65 72 65 71 2c 20 20 20 20 20 20 20 20 20 20 20  ereq,           
1cb70 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74    /* Tables that
1cb80 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65 64   must be scanned
1cb90 20 62 65 66 6f 72 65 20 74 68 69 73 20 6f 6e 65   before this one
1cba0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6d 55   */.  Bitmask mU
1cbb0 6e 75 73 61 62 6c 65 20 20 20 20 20 20 20 20 20  nusable         
1cbc0 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74 68 61     /* Tables tha
1cbd0 74 20 6d 75 73 74 20 62 65 20 73 63 61 6e 6e 65  t must be scanne
1cbe0 64 20 61 66 74 65 72 20 74 68 69 73 20 6f 6e 65  d after this one
1cbf0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
1cc00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
1cc10 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1cc20 63 6f 64 65 20 2a 2f 0a 20 20 57 68 65 72 65 49  code */.  WhereI
1cc30 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
1cc40 20 20 20 20 20 20 20 2f 2a 20 57 48 45 52 45 20         /* WHERE 
1cc50 61 6e 61 6c 79 73 69 73 20 63 6f 6e 74 65 78 74  analysis context
1cc60 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
1cc70 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
1cc80 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
1cc90 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
1cca0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
1ccb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1ccc0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1ccd0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
1cce0 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 3b 20  ist_item *pSrc; 
1ccf0 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
1cd00 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61  ause term to sea
1cd10 72 63 68 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rch */.  sqlite3
1cd20 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 3b 20  _index_info *p; 
1cd30 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20        /* Object 
1cd40 74 6f 20 70 61 73 73 20 74 6f 20 78 42 65 73 74  to pass to xBest
1cd50 49 6e 64 65 78 28 29 20 2a 2f 0a 20 20 69 6e 74  Index() */.  int
1cd60 20 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 20 20   nConstraint;   
1cd70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1cd80 62 65 72 20 6f 66 20 63 6f 6e 73 74 72 61 69 6e  ber of constrain
1cd90 74 73 20 69 6e 20 70 20 2a 2f 0a 20 20 69 6e 74  ts in p */.  int
1cda0 20 62 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20   bIn;           
1cdb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1cdc0 65 20 69 66 20 70 6c 61 6e 20 75 73 65 73 20 49  e if plan uses I
1cdd0 4e 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72 20  N(...) operator 
1cde0 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  */.  WhereLoop *
1cdf0 70 4e 65 77 3b 0a 20 20 42 69 74 6d 61 73 6b 20  pNew;.  Bitmask 
1ce00 6d 42 65 73 74 3b 20 20 20 20 20 20 20 20 20 20  mBest;          
1ce10 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 75       /* Tables u
1ce20 73 65 64 20 62 79 20 62 65 73 74 20 70 6f 73 73  sed by best poss
1ce30 69 62 6c 65 20 70 6c 61 6e 20 2a 2f 0a 20 20 75  ible plan */.  u
1ce40 31 36 20 6d 4e 6f 4f 6d 69 74 3b 0a 20 20 73 74  16 mNoOmit;.  st
1ce50 72 75 63 74 20 42 65 73 74 49 6e 64 65 78 43 74  ruct BestIndexCt
1ce60 78 20 62 69 63 3b 0a 20 20 76 6f 69 64 20 2a 70  x bic;.  void *p
1ce70 53 61 76 65 64 3b 0a 0a 20 20 61 73 73 65 72 74  Saved;..  assert
1ce80 28 20 28 6d 50 72 65 72 65 71 20 26 20 6d 55 6e  ( (mPrereq & mUn
1ce90 75 73 61 62 6c 65 29 3d 3d 30 20 29 3b 0a 20 20  usable)==0 );.  
1cea0 70 57 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65  pWInfo = pBuilde
1ceb0 72 2d 3e 70 57 49 6e 66 6f 3b 0a 20 20 70 50 61  r->pWInfo;.  pPa
1cec0 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
1ced0 61 72 73 65 3b 0a 20 20 70 57 43 20 3d 20 70 42  arse;.  pWC = pB
1cee0 75 69 6c 64 65 72 2d 3e 70 57 43 3b 0a 20 20 70  uilder->pWC;.  p
1cef0 4e 65 77 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e  New = pBuilder->
1cf00 70 4e 65 77 3b 0a 20 20 70 53 72 63 20 3d 20 26  pNew;.  pSrc = &
1cf10 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
1cf20 2d 3e 61 5b 70 4e 65 77 2d 3e 69 54 61 62 5d 3b  ->a[pNew->iTab];
1cf30 0a 20 20 61 73 73 65 72 74 28 20 49 73 56 69 72  .  assert( IsVir
1cf40 74 75 61 6c 28 70 53 72 63 2d 3e 70 54 61 62 29  tual(pSrc->pTab)
1cf50 20 29 3b 0a 20 20 70 20 3d 20 61 6c 6c 6f 63 61   );.  p = alloca
1cf60 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61 72  teIndexInfo(pPar
1cf70 73 65 2c 20 70 57 43 2c 20 6d 55 6e 75 73 61 62  se, pWC, mUnusab
1cf80 6c 65 2c 20 70 53 72 63 2c 20 70 42 75 69 6c 64  le, pSrc, pBuild
1cf90 65 72 2d 3e 70 4f 72 64 65 72 42 79 2c 20 0a 20  er->pOrderBy, . 
1cfa0 20 20 20 20 20 26 6d 4e 6f 4f 6d 69 74 29 3b 0a       &mNoOmit);.
1cfb0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
1cfc0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1cfd0 5f 42 4b 50 54 3b 0a 20 20 70 4e 65 77 2d 3e 72  _BKPT;.  pNew->r
1cfe0 53 65 74 75 70 20 3d 20 30 3b 0a 20 20 70 4e 65  Setup = 0;.  pNe
1cff0 77 2d 3e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  w->wsFlags = WHE
1d000 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b  RE_VIRTUALTABLE;
1d010 0a 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20  .  pNew->nLTerm 
1d020 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 75 2e 76  = 0;.  pNew->u.v
1d030 74 61 62 2e 6e 65 65 64 46 72 65 65 20 3d 20 30  tab.needFree = 0
1d040 3b 0a 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20  ;.  nConstraint 
1d050 3d 20 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  = p->nConstraint
1d060 3b 0a 20 20 69 66 28 20 77 68 65 72 65 4c 6f 6f  ;.  if( whereLoo
1d070 70 52 65 73 69 7a 65 28 70 50 61 72 73 65 2d 3e  pResize(pParse->
1d080 64 62 2c 20 70 4e 65 77 2c 20 6e 43 6f 6e 73 74  db, pNew, nConst
1d090 72 61 69 6e 74 29 20 29 7b 0a 20 20 20 20 73 71  raint) ){.    sq
1d0a0 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72  lite3DbFree(pPar
1d0b0 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 20 20  se->db, p);.    
1d0c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1d0d0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  MEM_BKPT;.  }.. 
1d0e0 20 62 69 63 2e 70 57 43 20 3d 20 70 57 43 3b 0a   bic.pWC = pWC;.
1d0f0 20 20 62 69 63 2e 70 49 64 78 49 6e 66 6f 20 3d    bic.pIdxInfo =
1d100 20 70 3b 0a 20 20 62 69 63 2e 70 50 61 72 73 65   p;.  bic.pParse
1d110 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 53 61   = pParse;.  pSa
1d120 76 65 64 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ved = pParse->db
1d130 2d 3e 70 42 65 73 74 49 6e 64 65 78 43 74 78 3b  ->pBestIndexCtx;
1d140 0a 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70  .  pParse->db->p
1d150 42 65 73 74 49 6e 64 65 78 43 74 78 20 3d 20 28  BestIndexCtx = (
1d160 76 6f 69 64 2a 29 26 62 69 63 3b 0a 0a 20 20 2f  void*)&bic;..  /
1d170 2a 20 46 69 72 73 74 20 63 61 6c 6c 20 78 42 65  * First call xBe
1d180 73 74 49 6e 64 65 78 28 29 20 77 69 74 68 20 61  stIndex() with a
1d190 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 75  ll constraints u
1d1a0 73 61 62 6c 65 2e 20 2a 2f 0a 20 20 57 48 45 52  sable. */.  WHER
1d1b0 45 54 52 41 43 45 28 30 78 34 30 2c 20 28 22 20  ETRACE(0x40, (" 
1d1c0 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c   VirtualOne: all
1d1d0 20 75 73 61 62 6c 65 5c 6e 22 29 29 3b 0a 20 20   usable\n"));.  
1d1e0 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64  rc = whereLoopAd
1d1f0 64 56 69 72 74 75 61 6c 4f 6e 65 28 70 42 75 69  dVirtualOne(pBui
1d200 6c 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 41  lder, mPrereq, A
1d210 4c 4c 42 49 54 53 2c 20 30 2c 20 70 2c 20 6d 4e  LLBITS, 0, p, mN
1d220 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 0a 20  oOmit, &bIn);.. 
1d230 20 2f 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 20   /* If the call 
1d240 74 6f 20 78 42 65 73 74 49 6e 64 65 78 28 29 20  to xBestIndex() 
1d250 77 69 74 68 20 61 6c 6c 20 74 65 72 6d 73 20 65  with all terms e
1d260 6e 61 62 6c 65 64 20 70 72 6f 64 75 63 65 64 20  nabled produced 
1d270 61 20 70 6c 61 6e 0a 20 20 2a 2a 20 74 68 61 74  a plan.  ** that
1d280 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
1d290 65 20 61 6e 79 20 73 6f 75 72 63 65 20 74 61 62  e any source tab
1d2a0 6c 65 73 20 28 49 4f 57 3a 20 61 20 70 6c 61 6e  les (IOW: a plan
1d2b0 20 77 69 74 68 20 6d 42 65 73 74 3d 3d 30 29 2c   with mBest==0),
1d2c0 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65  .  ** then there
1d2d0 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20   is no point in 
1d2e0 6d 61 6b 69 6e 67 20 61 6e 79 20 66 75 72 74 68  making any furth
1d2f0 65 72 20 63 61 6c 6c 73 20 74 6f 20 78 42 65 73  er calls to xBes
1d300 74 49 6e 64 65 78 28 29 20 0a 20 20 2a 2a 20 73  tIndex() .  ** s
1d310 69 6e 63 65 20 74 68 65 79 20 77 69 6c 6c 20 61  ince they will a
1d320 6c 6c 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  ll return the sa
1d330 6d 65 20 72 65 73 75 6c 74 20 28 69 66 20 74 68  me result (if th
1d340 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a 20  e xBestIndex(). 
1d350 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   ** implementati
1d360 6f 6e 20 69 73 20 73 61 6e 65 29 2e 20 2a 2f 0a  on is sane). */.
1d370 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d380 5f 4f 4b 20 26 26 20 28 6d 42 65 73 74 20 3d 20  _OK && (mBest = 
1d390 28 70 4e 65 77 2d 3e 70 72 65 72 65 71 20 26 20  (pNew->prereq & 
1d3a0 7e 6d 50 72 65 72 65 71 29 29 21 3d 30 20 29 7b  ~mPrereq))!=0 ){
1d3b0 0a 20 20 20 20 69 6e 74 20 73 65 65 6e 5a 65 72  .    int seenZer
1d3c0 6f 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  o = 0;          
1d3d0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20     /* True if a 
1d3e0 70 6c 61 6e 20 77 69 74 68 20 6e 6f 20 70 72 65  plan with no pre
1d3f0 72 65 71 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20  reqs seen */.   
1d400 20 69 6e 74 20 73 65 65 6e 5a 65 72 6f 4e 6f 49   int seenZeroNoI
1d410 4e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  N = 0;         /
1d420 2a 20 50 6c 61 6e 20 77 69 74 68 20 6e 6f 20 70  * Plan with no p
1d430 72 65 72 65 71 73 20 61 6e 64 20 6e 6f 20 49 4e  rereqs and no IN
1d440 28 2e 2e 2e 29 20 73 65 65 6e 20 2a 2f 0a 20 20  (...) seen */.  
1d450 20 20 42 69 74 6d 61 73 6b 20 6d 50 72 65 76 20    Bitmask mPrev 
1d460 3d 20 30 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b  = 0;.    Bitmask
1d470 20 6d 42 65 73 74 4e 6f 49 6e 20 3d 20 30 3b 0a   mBestNoIn = 0;.
1d480 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
1d490 6c 61 6e 20 70 72 6f 64 75 63 65 64 20 62 79 20  lan produced by 
1d4a0 74 68 65 20 65 61 72 6c 69 65 72 20 63 61 6c 6c  the earlier call
1d4b0 20 75 73 65 73 20 61 6e 20 49 4e 28 2e 2e 2e 29   uses an IN(...)
1d4c0 20 74 65 72 6d 2c 20 63 61 6c 6c 0a 20 20 20 20   term, call.    
1d4d0 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 20 61 67  ** xBestIndex ag
1d4e0 61 69 6e 2c 20 74 68 69 73 20 74 69 6d 65 20 77  ain, this time w
1d4f0 69 74 68 20 49 4e 28 2e 2e 2e 29 20 74 65 72 6d  ith IN(...) term
1d500 73 20 64 69 73 61 62 6c 65 64 2e 20 2a 2f 0a 20  s disabled. */. 
1d510 20 20 20 69 66 28 20 62 49 6e 20 29 7b 0a 20 20     if( bIn ){.  
1d520 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
1d530 78 34 30 2c 20 28 22 20 20 56 69 72 74 75 61 6c  x40, ("  Virtual
1d540 4f 6e 65 3a 20 61 6c 6c 20 75 73 61 62 6c 65 20  One: all usable 
1d550 77 2f 6f 20 49 4e 5c 6e 22 29 29 3b 0a 20 20 20  w/o IN\n"));.   
1d560 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f 6f     rc = whereLoo
1d570 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28 0a  pAddVirtualOne(.
1d580 20 20 20 20 20 20 20 20 20 20 70 42 75 69 6c 64            pBuild
1d590 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 41 4c 4c  er, mPrereq, ALL
1d5a0 42 49 54 53 2c 20 57 4f 5f 49 4e 2c 20 70 2c 20  BITS, WO_IN, p, 
1d5b0 6d 4e 6f 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a  mNoOmit, &bIn);.
1d5c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 62 49        assert( bI
1d5d0 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6d 42  n==0 );.      mB
1d5e0 65 73 74 4e 6f 49 6e 20 3d 20 70 4e 65 77 2d 3e  estNoIn = pNew->
1d5f0 70 72 65 72 65 71 20 26 20 7e 6d 50 72 65 72 65  prereq & ~mPrere
1d600 71 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 42 65  q;.      if( mBe
1d610 73 74 4e 6f 49 6e 3d 3d 30 20 29 7b 0a 20 20 20  stNoIn==0 ){.   
1d620 20 20 20 20 20 73 65 65 6e 5a 65 72 6f 20 3d 20       seenZero = 
1d630 31 3b 0a 20 20 20 20 20 20 20 20 73 65 65 6e 5a  1;.        seenZ
1d640 65 72 6f 4e 6f 49 4e 20 3d 20 31 3b 0a 20 20 20  eroNoIN = 1;.   
1d650 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1d660 2f 2a 20 43 61 6c 6c 20 78 42 65 73 74 49 6e 64  /* Call xBestInd
1d670 65 78 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ex once for each
1d680 20 64 69 73 74 69 6e 63 74 20 76 61 6c 75 65 20   distinct value 
1d690 6f 66 20 28 70 72 65 72 65 71 52 69 67 68 74 20  of (prereqRight 
1d6a0 26 20 7e 6d 50 72 65 72 65 71 29 20 0a 20 20 20  & ~mPrereq) .   
1d6b0 20 2a 2a 20 69 6e 20 74 68 65 20 73 65 74 20 6f   ** in the set o
1d6c0 66 20 74 65 72 6d 73 20 74 68 61 74 20 61 70 70  f terms that app
1d6d0 6c 79 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ly to the curren
1d6e0 74 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  t virtual table.
1d6f0 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
1d700 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d710 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
1d720 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 4e 65 78      Bitmask mNex
1d730 74 20 3d 20 41 4c 4c 42 49 54 53 3b 0a 20 20 20  t = ALLBITS;.   
1d740 20 20 20 61 73 73 65 72 74 28 20 6d 4e 65 78 74     assert( mNext
1d750 3e 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  >0 );.      for(
1d760 69 3d 30 3b 20 69 3c 6e 43 6f 6e 73 74 72 61 69  i=0; i<nConstrai
1d770 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; i++){.      
1d780 20 20 42 69 74 6d 61 73 6b 20 6d 54 68 69 73 20    Bitmask mThis 
1d790 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  = (.            
1d7a0 70 57 43 2d 3e 61 5b 70 2d 3e 61 43 6f 6e 73 74  pWC->a[p->aConst
1d7b0 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f 66  raint[i].iTermOf
1d7c0 66 73 65 74 5d 2e 70 72 65 72 65 71 52 69 67 68  fset].prereqRigh
1d7d0 74 20 26 20 7e 6d 50 72 65 72 65 71 0a 20 20 20  t & ~mPrereq.   
1d7e0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
1d7f0 69 66 28 20 6d 54 68 69 73 3e 6d 50 72 65 76 20  if( mThis>mPrev 
1d800 26 26 20 6d 54 68 69 73 3c 6d 4e 65 78 74 20 29  && mThis<mNext )
1d810 20 6d 4e 65 78 74 20 3d 20 6d 54 68 69 73 3b 0a   mNext = mThis;.
1d820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 50        }.      mP
1d830 72 65 76 20 3d 20 6d 4e 65 78 74 3b 0a 20 20 20  rev = mNext;.   
1d840 20 20 20 69 66 28 20 6d 4e 65 78 74 3d 3d 41 4c     if( mNext==AL
1d850 4c 42 49 54 53 20 29 20 62 72 65 61 6b 3b 0a 20  LBITS ) break;. 
1d860 20 20 20 20 20 69 66 28 20 6d 4e 65 78 74 3d 3d       if( mNext==
1d870 6d 42 65 73 74 20 7c 7c 20 6d 4e 65 78 74 3d 3d  mBest || mNext==
1d880 6d 42 65 73 74 4e 6f 49 6e 20 29 20 63 6f 6e 74  mBestNoIn ) cont
1d890 69 6e 75 65 3b 0a 20 20 20 20 20 20 57 48 45 52  inue;.      WHER
1d8a0 45 54 52 41 43 45 28 30 78 34 30 2c 20 28 22 20  ETRACE(0x40, (" 
1d8b0 20 56 69 72 74 75 61 6c 4f 6e 65 3a 20 6d 50 72   VirtualOne: mPr
1d8c0 65 76 3d 25 30 34 6c 6c 78 20 6d 4e 65 78 74 3d  ev=%04llx mNext=
1d8d0 25 30 34 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20 20  %04llx\n",.     
1d8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8f0 20 20 28 73 71 6c 69 74 65 33 5f 75 69 6e 74 36    (sqlite3_uint6
1d900 34 29 6d 50 72 65 76 2c 20 28 73 71 6c 69 74 65  4)mPrev, (sqlite
1d910 33 5f 75 69 6e 74 36 34 29 6d 4e 65 78 74 29 29  3_uint64)mNext))
1d920 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  ;.      rc = whe
1d930 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c  reLoopAddVirtual
1d940 4f 6e 65 28 0a 20 20 20 20 20 20 20 20 20 20 70  One(.          p
1d950 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72 65 71  Builder, mPrereq
1d960 2c 20 6d 4e 65 78 74 7c 6d 50 72 65 72 65 71 2c  , mNext|mPrereq,
1d970 20 30 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20   0, p, mNoOmit, 
1d980 26 62 49 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &bIn);.      if(
1d990 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 3d 3d 6d   pNew->prereq==m
1d9a0 50 72 65 72 65 71 20 29 7b 0a 20 20 20 20 20 20  Prereq ){.      
1d9b0 20 20 73 65 65 6e 5a 65 72 6f 20 3d 20 31 3b 0a    seenZero = 1;.
1d9c0 20 20 20 20 20 20 20 20 69 66 28 20 62 49 6e 3d          if( bIn=
1d9d0 3d 30 20 29 20 73 65 65 6e 5a 65 72 6f 4e 6f 49  =0 ) seenZeroNoI
1d9e0 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  N = 1;.      }. 
1d9f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1da00 74 68 65 20 63 61 6c 6c 73 20 74 6f 20 78 42 65  the calls to xBe
1da10 73 74 49 6e 64 65 78 28 29 20 69 6e 20 74 68 65  stIndex() in the
1da20 20 61 62 6f 76 65 20 6c 6f 6f 70 20 64 69 64 20   above loop did 
1da30 6e 6f 74 20 66 69 6e 64 20 61 20 70 6c 61 6e 0a  not find a plan.
1da40 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 71 75      ** that requ
1da50 69 72 65 73 20 6e 6f 20 73 6f 75 72 63 65 20 74  ires no source t
1da60 61 62 6c 65 73 20 61 74 20 61 6c 6c 20 28 69 2e  ables at all (i.
1da70 65 2e 20 6f 6e 65 20 67 75 61 72 61 6e 74 65 65  e. one guarantee
1da80 64 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75  d to be.    ** u
1da90 73 61 62 6c 65 29 2c 20 6d 61 6b 65 20 61 20 63  sable), make a c
1daa0 61 6c 6c 20 68 65 72 65 20 77 69 74 68 20 61 6c  all here with al
1dab0 6c 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20  l source tables 
1dac0 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20  disabled */.    
1dad0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1dae0 4b 20 26 26 20 73 65 65 6e 5a 65 72 6f 3d 3d 30  K && seenZero==0
1daf0 20 29 7b 0a 20 20 20 20 20 20 57 48 45 52 45 54   ){.      WHERET
1db00 52 41 43 45 28 30 78 34 30 2c 20 28 22 20 20 56  RACE(0x40, ("  V
1db10 69 72 74 75 61 6c 4f 6e 65 3a 20 61 6c 6c 20 64  irtualOne: all d
1db20 69 73 61 62 6c 65 64 5c 6e 22 29 29 3b 0a 20 20  isabled\n"));.  
1db30 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c 6f      rc = whereLo
1db40 6f 70 41 64 64 56 69 72 74 75 61 6c 4f 6e 65 28  opAddVirtualOne(
1db50 0a 20 20 20 20 20 20 20 20 20 20 70 42 75 69 6c  .          pBuil
1db60 64 65 72 2c 20 6d 50 72 65 72 65 71 2c 20 6d 50  der, mPrereq, mP
1db70 72 65 72 65 71 2c 20 30 2c 20 70 2c 20 6d 4e 6f  rereq, 0, p, mNo
1db80 4f 6d 69 74 2c 20 26 62 49 6e 29 3b 0a 20 20 20  Omit, &bIn);.   
1db90 20 20 20 69 66 28 20 62 49 6e 3d 3d 30 20 29 20     if( bIn==0 ) 
1dba0 73 65 65 6e 5a 65 72 6f 4e 6f 49 4e 20 3d 20 31  seenZeroNoIN = 1
1dbb0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1dbc0 49 66 20 74 68 65 20 63 61 6c 6c 73 20 74 6f 20  If the calls to 
1dbd0 78 42 65 73 74 49 6e 64 65 78 28 29 20 68 61 76  xBestIndex() hav
1dbe0 65 20 73 6f 20 66 61 72 20 66 61 69 6c 65 64 20  e so far failed 
1dbf0 74 6f 20 66 69 6e 64 20 61 20 70 6c 61 6e 0a 20  to find a plan. 
1dc00 20 20 20 2a 2a 20 74 68 61 74 20 72 65 71 75 69     ** that requi
1dc10 72 65 73 20 6e 6f 20 73 6f 75 72 63 65 20 74 61  res no source ta
1dc20 62 6c 65 73 20 61 74 20 61 6c 6c 20 61 6e 64 20  bles at all and 
1dc30 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 61 6e 20  does not use an 
1dc40 49 4e 28 2e 2e 2e 29 0a 20 20 20 20 2a 2a 20 6f  IN(...).    ** o
1dc50 70 65 72 61 74 6f 72 2c 20 6d 61 6b 65 20 61 20  perator, make a 
1dc60 66 69 6e 61 6c 20 63 61 6c 6c 20 74 6f 20 6f 62  final call to ob
1dc70 74 61 69 6e 20 6f 6e 65 20 68 65 72 65 2e 20 20  tain one here.  
1dc80 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
1dc90 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 65 65 6e  QLITE_OK && seen
1dca0 5a 65 72 6f 4e 6f 49 4e 3d 3d 30 20 29 7b 0a 20  ZeroNoIN==0 ){. 
1dcb0 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
1dcc0 30 78 34 30 2c 20 28 22 20 20 56 69 72 74 75 61  0x40, ("  Virtua
1dcd0 6c 4f 6e 65 3a 20 61 6c 6c 20 64 69 73 61 62 6c  lOne: all disabl
1dce0 65 64 20 61 6e 64 20 77 2f 6f 20 49 4e 5c 6e 22  ed and w/o IN\n"
1dcf0 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ));.      rc = w
1dd00 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74 75  hereLoopAddVirtu
1dd10 61 6c 4f 6e 65 28 0a 20 20 20 20 20 20 20 20 20  alOne(.         
1dd20 20 70 42 75 69 6c 64 65 72 2c 20 6d 50 72 65 72   pBuilder, mPrer
1dd30 65 71 2c 20 6d 50 72 65 72 65 71 2c 20 57 4f 5f  eq, mPrereq, WO_
1dd40 49 4e 2c 20 70 2c 20 6d 4e 6f 4f 6d 69 74 2c 20  IN, p, mNoOmit, 
1dd50 26 62 49 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  &bIn);.    }.  }
1dd60 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 65 65 64 54  ..  if( p->needT
1dd70 6f 46 72 65 65 49 64 78 53 74 72 20 29 20 73 71  oFreeIdxStr ) sq
1dd80 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 69 64  lite3_free(p->id
1dd90 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  xStr);.  sqlite3
1dda0 44 62 46 72 65 65 4e 4e 28 70 50 61 72 73 65 2d  DbFreeNN(pParse-
1ddb0 3e 64 62 2c 20 70 29 3b 0a 20 20 70 50 61 72 73  >db, p);.  pPars
1ddc0 65 2d 3e 64 62 2d 3e 70 42 65 73 74 49 6e 64 65  e->db->pBestInde
1ddd0 78 43 74 78 20 3d 20 70 53 61 76 65 64 3b 0a 20  xCtx = pSaved;. 
1dde0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
1ddf0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1de00 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1de10 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 57   */../*.** Add W
1de20 68 65 72 65 4c 6f 6f 70 20 65 6e 74 72 69 65 73  hereLoop entries
1de30 20 74 6f 20 68 61 6e 64 6c 65 20 4f 52 20 74 65   to handle OR te
1de40 72 6d 73 2e 20 20 54 68 69 73 20 77 6f 72 6b 73  rms.  This works
1de50 20 66 6f 72 20 65 69 74 68 65 72 0a 2a 2a 20 62   for either.** b
1de60 74 72 65 65 73 20 6f 72 20 76 69 72 74 75 61 6c  trees or virtual
1de70 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74   tables..*/.stat
1de80 69 63 20 69 6e 74 20 77 68 65 72 65 4c 6f 6f 70  ic int whereLoop
1de90 41 64 64 4f 72 28 0a 20 20 57 68 65 72 65 4c 6f  AddOr(.  WhereLo
1dea0 6f 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c  opBuilder *pBuil
1deb0 64 65 72 2c 20 0a 20 20 42 69 74 6d 61 73 6b 20  der, .  Bitmask 
1dec0 6d 50 72 65 72 65 71 2c 20 0a 20 20 42 69 74 6d  mPrereq, .  Bitm
1ded0 61 73 6b 20 6d 55 6e 75 73 61 62 6c 65 0a 29 7b  ask mUnusable.){
1dee0 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
1def0 49 6e 66 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d  Info = pBuilder-
1df00 3e 70 57 49 6e 66 6f 3b 0a 20 20 57 68 65 72 65  >pWInfo;.  Where
1df10 43 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57  Clause *pWC;.  W
1df20 68 65 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a  hereLoop *pNew;.
1df30 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
1df40 72 6d 2c 20 2a 70 57 43 45 6e 64 3b 0a 20 20 69  rm, *pWCEnd;.  i
1df50 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1df60 4b 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20  K;.  int iCur;. 
1df70 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d   WhereClause tem
1df80 70 57 43 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70  pWC;.  WhereLoop
1df90 42 75 69 6c 64 65 72 20 73 53 75 62 42 75 69 6c  Builder sSubBuil
1dfa0 64 3b 0a 20 20 57 68 65 72 65 4f 72 53 65 74 20  d;.  WhereOrSet 
1dfb0 73 53 75 6d 2c 20 73 43 75 72 3b 0a 20 20 73 74  sSum, sCur;.  st
1dfc0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1dfd0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 0a 20 20 70  m *pItem;.  .  p
1dfe0 57 43 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70  WC = pBuilder->p
1dff0 57 43 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 70  WC;.  pWCEnd = p
1e000 57 43 2d 3e 61 20 2b 20 70 57 43 2d 3e 6e 54 65  WC->a + pWC->nTe
1e010 72 6d 3b 0a 20 20 70 4e 65 77 20 3d 20 70 42 75  rm;.  pNew = pBu
1e020 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 6d  ilder->pNew;.  m
1e030 65 6d 73 65 74 28 26 73 53 75 6d 2c 20 30 2c 20  emset(&sSum, 0, 
1e040 73 69 7a 65 6f 66 28 73 53 75 6d 29 29 3b 0a 20  sizeof(sSum));. 
1e050 20 70 49 74 65 6d 20 3d 20 70 57 49 6e 66 6f 2d   pItem = pWInfo-
1e060 3e 70 54 61 62 4c 69 73 74 2d 3e 61 20 2b 20 70  >pTabList->a + p
1e070 4e 65 77 2d 3e 69 54 61 62 3b 0a 20 20 69 43 75  New->iTab;.  iCu
1e080 72 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  r = pItem->iCurs
1e090 6f 72 3b 0a 0a 20 20 66 6f 72 28 70 54 65 72 6d  or;..  for(pTerm
1e0a0 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
1e0b0 57 43 45 6e 64 20 26 26 20 72 63 3d 3d 53 51 4c  WCEnd && rc==SQL
1e0c0 49 54 45 5f 4f 4b 3b 20 70 54 65 72 6d 2b 2b 29  ITE_OK; pTerm++)
1e0d0 7b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  {.    if( (pTerm
1e0e0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
1e0f0 5f 4f 52 29 21 3d 30 0a 20 20 20 20 20 26 26 20  _OR)!=0.     && 
1e100 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  (pTerm->u.pOrInf
1e110 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 70  o->indexable & p
1e120 4e 65 77 2d 3e 6d 61 73 6b 53 65 6c 66 29 21 3d  New->maskSelf)!=
1e130 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  0 .    ){.      
1e140 57 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f  WhereClause * co
1e150 6e 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65  nst pOrWC = &pTe
1e160 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77  rm->u.pOrInfo->w
1e170 63 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  c;.      WhereTe
1e180 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43  rm * const pOrWC
1e190 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b  End = &pOrWC->a[
1e1a0 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20  pOrWC->nTerm];. 
1e1b0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
1e1c0 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69  pOrTerm;.      i
1e1d0 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20  nt once = 1;.   
1e1e0 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
1e1f0 20 0a 20 20 20 20 20 20 73 53 75 62 42 75 69 6c   .      sSubBuil
1e200 64 20 3d 20 2a 70 42 75 69 6c 64 65 72 3b 0a 20  d = *pBuilder;. 
1e210 20 20 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70       sSubBuild.p
1e220 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
1e230 20 20 20 73 53 75 62 42 75 69 6c 64 2e 70 4f 72     sSubBuild.pOr
1e240 53 65 74 20 3d 20 26 73 43 75 72 3b 0a 0a 20 20  Set = &sCur;..  
1e250 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
1e260 78 32 30 30 2c 20 28 22 42 65 67 69 6e 20 70 72  x200, ("Begin pr
1e270 6f 63 65 73 73 69 6e 67 20 4f 52 2d 63 6c 61 75  ocessing OR-clau
1e280 73 65 20 25 70 5c 6e 22 2c 20 70 54 65 72 6d 29  se %p\n", pTerm)
1e290 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72  );.      for(pOr
1e2a0 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70  Term=pOrWC->a; p
1e2b0 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b  OrTerm<pOrWCEnd;
1e2c0 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
1e2d0 20 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72       if( (pOrTer
1e2e0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
1e2f0 4f 5f 41 4e 44 29 21 3d 30 20 29 7b 0a 20 20 20  O_AND)!=0 ){.   
1e300 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c 64         sSubBuild
1e310 2e 70 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d  .pWC = &pOrTerm-
1e320 3e 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b  >u.pAndInfo->wc;
1e330 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1e340 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
1e350 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a  Cursor==iCur ){.
1e360 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
1e370 2e 70 57 49 6e 66 6f 20 3d 20 70 57 43 2d 3e 70  .pWInfo = pWC->p
1e380 57 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 20  WInfo;.         
1e390 20 74 65 6d 70 57 43 2e 70 4f 75 74 65 72 20 3d   tempWC.pOuter =
1e3a0 20 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20   pWC;.          
1e3b0 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f 41  tempWC.op = TK_A
1e3c0 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65  ND;.          te
1e3d0 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a  mpWC.nTerm = 1;.
1e3e0 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43            tempWC
1e3f0 2e 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20  .a = pOrTerm;.  
1e400 20 20 20 20 20 20 20 20 73 53 75 62 42 75 69 6c          sSubBuil
1e410 64 2e 70 57 43 20 3d 20 26 74 65 6d 70 57 43 3b  d.pWC = &tempWC;
1e420 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1e430 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1e440 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
1e450 20 20 20 20 20 20 73 43 75 72 2e 6e 20 3d 20 30        sCur.n = 0
1e460 3b 0a 23 69 66 64 65 66 20 57 48 45 52 45 54 52  ;.#ifdef WHERETR
1e470 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 20 20  ACE_ENABLED.    
1e480 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28 30      WHERETRACE(0
1e490 78 32 30 30 2c 20 28 22 4f 52 2d 74 65 72 6d 20  x200, ("OR-term 
1e4a0 25 64 20 6f 66 20 25 70 20 68 61 73 20 25 64 20  %d of %p has %d 
1e4b0 73 75 62 74 65 72 6d 73 3a 5c 6e 22 2c 20 0a 20  subterms:\n", . 
1e4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4d0 20 20 28 69 6e 74 29 28 70 4f 72 54 65 72 6d 2d    (int)(pOrTerm-
1e4e0 70 4f 72 57 43 2d 3e 61 29 2c 20 70 54 65 72 6d  pOrWC->a), pTerm
1e4f0 2c 20 73 53 75 62 42 75 69 6c 64 2e 70 57 43 2d  , sSubBuild.pWC-
1e500 3e 6e 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20  >nTerm));.      
1e510 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65    if( sqlite3Whe
1e520 72 65 54 72 61 63 65 20 26 20 30 78 34 30 30 20  reTrace & 0x400 
1e530 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
1e540 69 74 65 33 57 68 65 72 65 43 6c 61 75 73 65 50  ite3WhereClauseP
1e550 72 69 6e 74 28 73 53 75 62 42 75 69 6c 64 2e 70  rint(sSubBuild.p
1e560 57 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  WC);.        }.#
1e570 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
1e580 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1e590 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69  LTABLE.        i
1e5a0 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 49 74  f( IsVirtual(pIt
1e5b0 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20  em->pTab) ){.   
1e5c0 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65 72         rc = wher
1e5d0 65 4c 6f 6f 70 41 64 64 56 69 72 74 75 61 6c 28  eLoopAddVirtual(
1e5e0 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72 65  &sSubBuild, mPre
1e5f0 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29 3b  req, mUnusable);
1e600 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
1e610 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
1e620 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
1e630 68 65 72 65 4c 6f 6f 70 41 64 64 42 74 72 65 65  hereLoopAddBtree
1e640 28 26 73 53 75 62 42 75 69 6c 64 2c 20 6d 50 72  (&sSubBuild, mPr
1e650 65 72 65 71 29 3b 0a 20 20 20 20 20 20 20 20 7d  ereq);.        }
1e660 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1e670 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e680 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
1e690 72 65 4c 6f 6f 70 41 64 64 4f 72 28 26 73 53 75  reLoopAddOr(&sSu
1e6a0 62 42 75 69 6c 64 2c 20 6d 50 72 65 72 65 71 2c  bBuild, mPrereq,
1e6b0 20 6d 55 6e 75 73 61 62 6c 65 29 3b 0a 20 20 20   mUnusable);.   
1e6c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
1e6d0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
1e6e0 45 5f 4f 4b 20 7c 7c 20 73 43 75 72 2e 6e 3d 3d  E_OK || sCur.n==
1e6f0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
1e700 20 73 43 75 72 2e 6e 3d 3d 30 20 29 7b 0a 20 20   sCur.n==0 ){.  
1e710 20 20 20 20 20 20 20 20 73 53 75 6d 2e 6e 20 3d          sSum.n =
1e720 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   0;.          br
1e730 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
1e740 73 65 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20  se if( once ){. 
1e750 20 20 20 20 20 20 20 20 20 77 68 65 72 65 4f 72           whereOr
1e760 4d 6f 76 65 28 26 73 53 75 6d 2c 20 26 73 43 75  Move(&sSum, &sCu
1e770 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 6e  r);.          on
1e780 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ce = 0;.        
1e790 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1e7a0 20 57 68 65 72 65 4f 72 53 65 74 20 73 50 72 65   WhereOrSet sPre
1e7b0 76 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 65  v;.          whe
1e7c0 72 65 4f 72 4d 6f 76 65 28 26 73 50 72 65 76 2c  reOrMove(&sPrev,
1e7d0 20 26 73 53 75 6d 29 3b 0a 20 20 20 20 20 20 20   &sSum);.       
1e7e0 20 20 20 73 53 75 6d 2e 6e 20 3d 20 30 3b 0a 20     sSum.n = 0;. 
1e7f0 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
1e800 3b 20 69 3c 73 50 72 65 76 2e 6e 3b 20 69 2b 2b  ; i<sPrev.n; i++
1e810 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
1e820 6f 72 28 6a 3d 30 3b 20 6a 3c 73 43 75 72 2e 6e  or(j=0; j<sCur.n
1e830 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
1e840 20 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 73        whereOrIns
1e850 65 72 74 28 26 73 53 75 6d 2c 20 73 50 72 65 76  ert(&sSum, sPrev
1e860 2e 61 5b 69 5d 2e 70 72 65 72 65 71 20 7c 20 73  .a[i].prereq | s
1e870 43 75 72 2e 61 5b 6a 5d 2e 70 72 65 72 65 71 2c  Cur.a[j].prereq,
1e880 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e890 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1e8a0 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50  ite3LogEstAdd(sP
1e8b0 72 65 76 2e 61 5b 69 5d 2e 72 52 75 6e 2c 20 73  rev.a[i].rRun, s
1e8c0 43 75 72 2e 61 5b 6a 5d 2e 72 52 75 6e 29 2c 0a  Cur.a[j].rRun),.
1e8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8e0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1e8f0 74 65 33 4c 6f 67 45 73 74 41 64 64 28 73 50 72  te3LogEstAdd(sPr
1e900 65 76 2e 61 5b 69 5d 2e 6e 4f 75 74 2c 20 73 43  ev.a[i].nOut, sC
1e910 75 72 2e 61 5b 6a 5d 2e 6e 4f 75 74 29 29 3b 0a  ur.a[j].nOut));.
1e920 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1e930 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e940 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1e950 20 20 70 4e 65 77 2d 3e 6e 4c 54 65 72 6d 20 3d    pNew->nLTerm =
1e960 20 31 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e   1;.      pNew->
1e970 61 4c 54 65 72 6d 5b 30 5d 20 3d 20 70 54 65 72  aLTerm[0] = pTer
1e980 6d 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 77  m;.      pNew->w
1e990 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 4d  sFlags = WHERE_M
1e9a0 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20 70  ULTI_OR;.      p
1e9b0 4e 65 77 2d 3e 72 53 65 74 75 70 20 3d 20 30 3b  New->rSetup = 0;
1e9c0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 53 6f  .      pNew->iSo
1e9d0 72 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 20  rtIdx = 0;.     
1e9e0 20 6d 65 6d 73 65 74 28 26 70 4e 65 77 2d 3e 75   memset(&pNew->u
1e9f0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4e 65 77  , 0, sizeof(pNew
1ea00 2d 3e 75 29 29 3b 0a 20 20 20 20 20 20 66 6f 72  ->u));.      for
1ea10 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
1ea20 5f 4f 4b 20 26 26 20 69 3c 73 53 75 6d 2e 6e 3b  _OK && i<sSum.n;
1ea30 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 2f   i++){.        /
1ea40 2a 20 54 55 4e 49 4e 47 3a 20 43 75 72 72 65 6e  * TUNING: Curren
1ea50 74 6c 79 20 73 53 75 6d 2e 61 5b 69 5d 2e 72 52  tly sSum.a[i].rR
1ea60 75 6e 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  un is set to the
1ea70 20 73 75 6d 20 6f 66 20 74 68 65 20 63 6f 73 74   sum of the cost
1ea80 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20  s.        ** of 
1ea90 61 6c 6c 20 73 75 62 2d 73 63 61 6e 73 20 72 65  all sub-scans re
1eaa0 71 75 69 72 65 64 20 62 79 20 74 68 65 20 4f 52  quired by the OR
1eab0 2d 73 63 61 6e 2e 20 48 6f 77 65 76 65 72 2c 20  -scan. However, 
1eac0 64 75 65 20 74 6f 20 72 6f 75 6e 64 69 6e 67 0a  due to rounding.
1ead0 20 20 20 20 20 20 20 20 2a 2a 20 65 72 72 6f 72          ** error
1eae0 73 2c 20 69 74 20 6d 61 79 20 62 65 20 74 68 61  s, it may be tha
1eaf0 74 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68  t the cost of th
1eb00 65 20 4f 52 2d 73 63 61 6e 20 69 73 20 65 71 75  e OR-scan is equ
1eb10 61 6c 20 74 6f 20 69 74 73 0a 20 20 20 20 20 20  al to its.      
1eb20 20 20 2a 2a 20 6d 6f 73 74 20 65 78 70 65 6e 73    ** most expens
1eb30 69 76 65 20 73 75 62 2d 73 63 61 6e 2e 20 41 64  ive sub-scan. Ad
1eb40 64 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 70  d the smallest p
1eb50 6f 73 73 69 62 6c 65 20 70 65 6e 61 6c 74 79 20  ossible penalty 
1eb60 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 65 71 75  .        ** (equ
1eb70 69 76 61 6c 65 6e 74 20 74 6f 20 6d 75 6c 74 69  ivalent to multi
1eb80 70 6c 79 69 6e 67 20 74 68 65 20 63 6f 73 74 20  plying the cost 
1eb90 62 79 20 31 2e 30 37 29 20 74 6f 20 65 6e 73 75  by 1.07) to ensu
1eba0 72 65 20 74 68 61 74 20 0a 20 20 20 20 20 20 20  re that .       
1ebb0 20 2a 2a 20 74 68 69 73 20 64 6f 65 73 20 6e 6f   ** this does no
1ebc0 74 20 68 61 70 70 65 6e 2e 20 4f 74 68 65 72 77  t happen. Otherw
1ebd0 69 73 65 2c 20 66 6f 72 20 57 48 45 52 45 20 63  ise, for WHERE c
1ebe0 6c 61 75 73 65 73 20 73 75 63 68 20 61 73 20 74  lauses such as t
1ebf0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  he.        ** fo
1ec00 6c 6c 6f 77 69 6e 67 20 77 68 65 72 65 20 74 68  llowing where th
1ec10 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ere is an index 
1ec20 6f 6e 20 22 79 22 3a 0a 20 20 20 20 20 20 20 20  on "y":.        
1ec30 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
1ec40 20 20 57 48 45 52 45 20 6c 69 6b 65 6c 69 68 6f    WHERE likeliho
1ec50 6f 64 28 78 3d 3f 2c 20 30 2e 39 39 29 20 4f 52  od(x=?, 0.99) OR
1ec60 20 79 3d 3f 0a 20 20 20 20 20 20 20 20 2a 2a 0a   y=?.        **.
1ec70 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70          ** the p
1ec80 6c 61 6e 6e 65 72 20 6d 61 79 20 65 6c 65 63 74  lanner may elect
1ec90 20 74 6f 20 22 4f 52 22 20 74 6f 67 65 74 68 65   to "OR" togethe
1eca0 72 20 61 20 66 75 6c 6c 2d 74 61 62 6c 65 20 73  r a full-table s
1ecb0 63 61 6e 20 61 6e 64 20 61 6e 0a 20 20 20 20 20  can and an.     
1ecc0 20 20 20 2a 2a 20 69 6e 64 65 78 20 6c 6f 6f 6b     ** index look
1ecd0 75 70 2e 20 41 6e 64 20 6f 74 68 65 72 20 73 69  up. And other si
1ece0 6d 69 6c 61 72 6c 79 20 6f 64 64 20 72 65 73 75  milarly odd resu
1ecf0 6c 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  lts.  */.       
1ed00 20 70 4e 65 77 2d 3e 72 52 75 6e 20 3d 20 73 53   pNew->rRun = sS
1ed10 75 6d 2e 61 5b 69 5d 2e 72 52 75 6e 20 2b 20 31  um.a[i].rRun + 1
1ed20 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
1ed30 6e 4f 75 74 20 3d 20 73 53 75 6d 2e 61 5b 69 5d  nOut = sSum.a[i]
1ed40 2e 6e 4f 75 74 3b 0a 20 20 20 20 20 20 20 20 70  .nOut;.        p
1ed50 4e 65 77 2d 3e 70 72 65 72 65 71 20 3d 20 73 53  New->prereq = sS
1ed60 75 6d 2e 61 5b 69 5d 2e 70 72 65 72 65 71 3b 0a  um.a[i].prereq;.
1ed70 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
1ed80 72 65 4c 6f 6f 70 49 6e 73 65 72 74 28 70 42 75  reLoopInsert(pBu
1ed90 69 6c 64 65 72 2c 20 70 4e 65 77 29 3b 0a 20 20  ilder, pNew);.  
1eda0 20 20 20 20 7d 0a 20 20 20 20 20 20 57 48 45 52      }.      WHER
1edb0 45 54 52 41 43 45 28 30 78 32 30 30 2c 20 28 22  ETRACE(0x200, ("
1edc0 45 6e 64 20 70 72 6f 63 65 73 73 69 6e 67 20 4f  End processing O
1edd0 52 2d 63 6c 61 75 73 65 20 25 70 5c 6e 22 2c 20  R-clause %p\n", 
1ede0 70 54 65 72 6d 29 29 3b 0a 20 20 20 20 7d 0a 20  pTerm));.    }. 
1edf0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1ee00 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6c 6c  }../*.** Add all
1ee10 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63   WhereLoop objec
1ee20 74 73 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  ts for all table
1ee30 73 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s .*/.static int
1ee40 20 77 68 65 72 65 4c 6f 6f 70 41 64 64 41 6c 6c   whereLoopAddAll
1ee50 28 57 68 65 72 65 4c 6f 6f 70 42 75 69 6c 64 65  (WhereLoopBuilde
1ee60 72 20 2a 70 42 75 69 6c 64 65 72 29 7b 0a 20 20  r *pBuilder){.  
1ee70 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
1ee80 6f 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57  o = pBuilder->pW
1ee90 49 6e 66 6f 3b 0a 20 20 42 69 74 6d 61 73 6b 20  Info;.  Bitmask 
1eea0 6d 50 72 65 72 65 71 20 3d 20 30 3b 0a 20 20 42  mPrereq = 0;.  B
1eeb0 69 74 6d 61 73 6b 20 6d 50 72 69 6f 72 20 3d 20  itmask mPrior = 
1eec0 30 3b 0a 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  0;.  int iTab;. 
1eed0 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
1eee0 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  st = pWInfo->pTa
1eef0 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  bList;.  struct 
1ef00 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1ef10 74 65 6d 3b 0a 20 20 73 74 72 75 63 74 20 53 72  tem;.  struct Sr
1ef20 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 45 6e 64  cList_item *pEnd
1ef30 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
1ef40 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 5d 3b  pWInfo->nLevel];
1ef50 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1ef60 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d   pWInfo->pParse-
1ef70 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  >db;.  int rc = 
1ef80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 57 68 65  SQLITE_OK;.  Whe
1ef90 72 65 4c 6f 6f 70 20 2a 70 4e 65 77 3b 0a 20 20  reLoop *pNew;.  
1efa0 75 38 20 70 72 69 6f 72 4a 6f 69 6e 74 79 70 65  u8 priorJointype
1efb0 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70   = 0;..  /* Loop
1efc0 20 6f 76 65 72 20 74 68 65 20 74 61 62 6c 65 73   over the tables
1efd0 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20 66 72   in the join, fr
1efe0 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
1eff0 20 2a 2f 0a 20 20 70 4e 65 77 20 3d 20 70 42 75   */.  pNew = pBu
1f000 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20 77  ilder->pNew;.  w
1f010 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 70 4e 65  hereLoopInit(pNe
1f020 77 29 3b 0a 20 20 66 6f 72 28 69 54 61 62 3d 30  w);.  for(iTab=0
1f030 2c 20 70 49 74 65 6d 3d 70 54 61 62 4c 69 73 74  , pItem=pTabList
1f040 2d 3e 61 3b 20 70 49 74 65 6d 3c 70 45 6e 64 3b  ->a; pItem<pEnd;
1f050 20 69 54 61 62 2b 2b 2c 20 70 49 74 65 6d 2b 2b   iTab++, pItem++
1f060 29 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  ){.    Bitmask m
1f070 55 6e 75 73 61 62 6c 65 20 3d 20 30 3b 0a 20 20  Unusable = 0;.  
1f080 20 20 70 4e 65 77 2d 3e 69 54 61 62 20 3d 20 69    pNew->iTab = i
1f090 54 61 62 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6d  Tab;.    pNew->m
1f0a0 61 73 6b 53 65 6c 66 20 3d 20 73 71 6c 69 74 65  askSelf = sqlite
1f0b0 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70  3WhereGetMask(&p
1f0c0 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c  WInfo->sMaskSet,
1f0d0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29   pItem->iCursor)
1f0e0 3b 0a 20 20 20 20 69 66 28 20 28 28 70 49 74 65  ;.    if( ((pIte
1f0f0 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 7c 70  m->fg.jointype|p
1f100 72 69 6f 72 4a 6f 69 6e 74 79 70 65 29 20 26 20  riorJointype) & 
1f110 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53  (JT_LEFT|JT_CROS
1f120 53 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  S))!=0 ){.      
1f130 2f 2a 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f  /* This conditio
1f140 6e 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 70  n is true when p
1f150 49 74 65 6d 20 69 73 20 74 68 65 20 46 52 4f 4d  Item is the FROM
1f160 20 63 6c 61 75 73 65 20 74 65 72 6d 20 6f 6e 20   clause term on 
1f170 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 72 69 67  the.      ** rig
1f180 68 74 2d 68 61 6e 64 2d 73 69 64 65 20 6f 66 20  ht-hand-side of 
1f190 61 20 4c 45 46 54 20 6f 72 20 43 52 4f 53 53 20  a LEFT or CROSS 
1f1a0 4a 4f 49 4e 2e 20 20 2a 2f 0a 20 20 20 20 20 20  JOIN.  */.      
1f1b0 6d 50 72 65 72 65 71 20 3d 20 6d 50 72 69 6f 72  mPrereq = mPrior
1f1c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6f  ;.    }.    prio
1f1d0 72 4a 6f 69 6e 74 79 70 65 20 3d 20 70 49 74 65  rJointype = pIte
1f1e0 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a  m->fg.jointype;.
1f1f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f200 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
1f210 0a 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75  .    if( IsVirtu
1f220 61 6c 28 70 49 74 65 6d 2d 3e 70 54 61 62 29 20  al(pItem->pTab) 
1f230 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
1f240 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 3b  SrcList_item *p;
1f250 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 26 70 49  .      for(p=&pI
1f260 74 65 6d 5b 31 5d 3b 20 70 3c 70 45 6e 64 3b 20  tem[1]; p<pEnd; 
1f270 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  p++){.        if
1f280 28 20 6d 55 6e 75 73 61 62 6c 65 20 7c 7c 20 28  ( mUnusable || (
1f290 70 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  p->fg.jointype &
1f2a0 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f   (JT_LEFT|JT_CRO
1f2b0 53 53 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  SS)) ){.        
1f2c0 20 20 6d 55 6e 75 73 61 62 6c 65 20 7c 3d 20 73    mUnusable |= s
1f2d0 71 6c 69 74 65 33 57 68 65 72 65 47 65 74 4d 61  qlite3WhereGetMa
1f2e0 73 6b 28 26 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  sk(&pWInfo->sMas
1f2f0 6b 53 65 74 2c 20 70 2d 3e 69 43 75 72 73 6f 72  kSet, p->iCursor
1f300 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1f310 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
1f320 77 68 65 72 65 4c 6f 6f 70 41 64 64 56 69 72 74  whereLoopAddVirt
1f330 75 61 6c 28 70 42 75 69 6c 64 65 72 2c 20 6d 50  ual(pBuilder, mP
1f340 72 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65  rereq, mUnusable
1f350 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
1f360 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
1f370 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
1f380 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 72  */.    {.      r
1f390 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1f3a0 42 74 72 65 65 28 70 42 75 69 6c 64 65 72 2c 20  Btree(pBuilder, 
1f3b0 6d 50 72 65 72 65 71 29 3b 0a 20 20 20 20 7d 0a  mPrereq);.    }.
1f3c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1f3d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1f3e0 63 20 3d 20 77 68 65 72 65 4c 6f 6f 70 41 64 64  c = whereLoopAdd
1f3f0 4f 72 28 70 42 75 69 6c 64 65 72 2c 20 6d 50 72  Or(pBuilder, mPr
1f400 65 72 65 71 2c 20 6d 55 6e 75 73 61 62 6c 65 29  ereq, mUnusable)
1f410 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 50 72 69  ;.    }.    mPri
1f420 6f 72 20 7c 3d 20 70 4e 65 77 2d 3e 6d 61 73 6b  or |= pNew->mask
1f430 53 65 6c 66 3b 0a 20 20 20 20 69 66 28 20 72 63  Self;.    if( rc
1f440 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
1f450 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  iled ) break;.  
1f460 7d 0a 0a 20 20 77 68 65 72 65 4c 6f 6f 70 43 6c  }..  whereLoopCl
1f470 65 61 72 28 64 62 2c 20 70 4e 65 77 29 3b 0a 20  ear(db, pNew);. 
1f480 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1f490 2a 0a 2a 2a 20 45 78 61 6d 69 6e 65 20 61 20 57  *.** Examine a W
1f4a0 68 65 72 65 50 61 74 68 20 28 77 69 74 68 20 74  herePath (with t
1f4b0 68 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 74  he addition of t
1f4c0 68 65 20 65 78 74 72 61 20 57 68 65 72 65 4c 6f  he extra WhereLo
1f4d0 6f 70 20 6f 66 20 74 68 65 20 36 74 68 0a 2a 2a  op of the 6th.**
1f4e0 20 70 61 72 61 6d 65 74 65 72 73 29 20 74 6f 20   parameters) to 
1f4f0 73 65 65 20 69 66 20 69 74 20 6f 75 74 70 75 74  see if it output
1f500 73 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65  s rows in the re
1f510 71 75 65 73 74 65 64 20 4f 52 44 45 52 20 42 59  quested ORDER BY
1f520 0a 2a 2a 20 28 6f 72 20 47 52 4f 55 50 20 42 59  .** (or GROUP BY
1f530 29 20 77 69 74 68 6f 75 74 20 72 65 71 75 69 72  ) without requir
1f540 69 6e 67 20 61 20 73 65 70 61 72 61 74 65 20 73  ing a separate s
1f550 6f 72 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ort operation.  
1f560 52 65 74 75 72 6e 20 4e 3a 0a 2a 2a 20 0a 2a 2a  Return N:.** .**
1f570 20 20 20 4e 3e 30 3a 20 20 20 4e 20 74 65 72 6d     N>0:   N term
1f580 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
1f590 59 20 63 6c 61 75 73 65 20 61 72 65 20 73 61 74  Y clause are sat
1f5a0 69 73 66 69 65 64 0a 2a 2a 20 20 20 4e 3d 3d 30  isfied.**   N==0
1f5b0 3a 20 20 4e 6f 20 74 65 72 6d 73 20 6f 66 20 74  :  No terms of t
1f5c0 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1f5d0 73 65 20 61 72 65 20 73 61 74 69 73 66 69 65 64  se are satisfied
1f5e0 0a 2a 2a 20 20 20 4e 3c 30 3a 20 20 20 55 6e 6b  .**   N<0:   Unk
1f5f0 6e 6f 77 6e 20 79 65 74 20 68 6f 77 20 6d 61 6e  nown yet how man
1f600 79 20 74 65 72 6d 73 20 6f 66 20 4f 52 44 45 52  y terms of ORDER
1f610 20 42 59 20 6d 69 67 68 74 20 62 65 20 73 61 74   BY might be sat
1f620 69 73 66 69 65 64 2e 20 20 20 0a 2a 2a 0a 2a 2a  isfied.   .**.**
1f630 20 4e 6f 74 65 20 74 68 61 74 20 70 72 6f 63 65   Note that proce
1f640 73 73 69 6e 67 20 66 6f 72 20 57 48 45 52 45 5f  ssing for WHERE_
1f650 47 52 4f 55 50 42 59 20 61 6e 64 20 57 48 45 52  GROUPBY and WHER
1f660 45 5f 44 49 53 54 49 4e 43 54 42 59 20 69 73 20  E_DISTINCTBY is 
1f670 6e 6f 74 20 61 73 0a 2a 2a 20 73 74 72 69 63 74  not as.** strict
1f680 2e 20 20 57 69 74 68 20 47 52 4f 55 50 20 42 59  .  With GROUP BY
1f690 20 61 6e 64 20 44 49 53 54 49 4e 43 54 20 74 68   and DISTINCT th
1f6a0 65 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 6d 65  e only requireme
1f6b0 6e 74 20 69 73 20 74 68 61 74 0a 2a 2a 20 65 71  nt is that.** eq
1f6c0 75 69 76 61 6c 65 6e 74 20 72 6f 77 73 20 61 70  uivalent rows ap
1f6d0 70 65 61 72 20 69 6d 6d 65 64 69 61 74 65 6c 79  pear immediately
1f6e0 20 61 64 6a 61 63 65 6e 74 20 74 6f 20 6f 6e 65   adjacent to one
1f6f0 20 61 6e 6f 74 68 65 72 2e 20 20 47 52 4f 55 50   another.  GROUP
1f700 20 42 59 0a 2a 2a 20 61 6e 64 20 44 49 53 54 49   BY.** and DISTI
1f710 4e 43 54 20 64 6f 20 6e 6f 74 20 72 65 71 75 69  NCT do not requi
1f720 72 65 20 72 6f 77 73 20 74 6f 20 61 70 70 65 61  re rows to appea
1f730 72 20 69 6e 20 61 6e 79 20 70 61 72 74 69 63 75  r in any particu
1f740 6c 61 72 20 6f 72 64 65 72 20 61 73 20 6c 6f 6e  lar order as lon
1f750 67 0a 2a 2a 20 61 73 20 65 71 75 69 76 61 6c 65  g.** as equivale
1f760 6e 74 20 72 6f 77 73 20 61 72 65 20 67 72 6f 75  nt rows are grou
1f770 70 65 64 20 74 6f 67 65 74 68 65 72 2e 20 20 54  ped together.  T
1f780 68 75 73 20 66 6f 72 20 47 52 4f 55 50 20 42 59  hus for GROUP BY
1f790 20 61 6e 64 20 44 49 53 54 49 4e 43 54 0a 2a 2a   and DISTINCT.**
1f7a0 20 74 68 65 20 70 4f 72 64 65 72 42 79 20 74 65   the pOrderBy te
1f7b0 72 6d 73 20 63 61 6e 20 62 65 20 6d 61 74 63 68  rms can be match
1f7c0 65 64 20 69 6e 20 61 6e 79 20 6f 72 64 65 72 2e  ed in any order.
1f7d0 20 20 57 69 74 68 20 4f 52 44 45 52 20 42 59 2c    With ORDER BY,
1f7e0 20 74 68 65 20 0a 2a 2a 20 70 4f 72 64 65 72 42   the .** pOrderB
1f7f0 79 20 74 65 72 6d 73 20 6d 75 73 74 20 62 65 20  y terms must be 
1f800 6d 61 74 63 68 65 64 20 69 6e 20 73 74 72 69 63  matched in stric
1f810 74 20 6c 65 66 74 2d 74 6f 2d 72 69 67 68 74 20  t left-to-right 
1f820 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
1f830 20 69 38 20 77 68 65 72 65 50 61 74 68 53 61 74   i8 wherePathSat
1f840 69 73 66 69 65 73 4f 72 64 65 72 42 79 28 0a 20  isfiesOrderBy(. 
1f850 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
1f860 66 6f 2c 20 20 20 20 2f 2a 20 54 68 65 20 57 48  fo,    /* The WH
1f870 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
1f880 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
1f890 42 79 2c 20 20 20 2f 2a 20 4f 52 44 45 52 20 42  By,   /* ORDER B
1f8a0 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 6f 72  Y or GROUP BY or
1f8b0 20 44 49 53 54 49 4e 43 54 20 63 6c 61 75 73 65   DISTINCT clause
1f8c0 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 57   to check */.  W
1f8d0 68 65 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c  herePath *pPath,
1f8e0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72       /* The Wher
1f8f0 65 50 61 74 68 20 74 6f 20 63 68 65 63 6b 20 2a  ePath to check *
1f900 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
1f910 67 73 2c 20 20 20 20 20 20 20 2f 2a 20 57 48 45  gs,       /* WHE
1f920 52 45 5f 47 52 4f 55 50 42 59 20 6f 72 20 5f 44  RE_GROUPBY or _D
1f930 49 53 54 49 4e 43 54 42 59 20 6f 72 20 5f 4f 52  ISTINCTBY or _OR
1f940 44 45 52 42 59 5f 4c 49 4d 49 54 20 2a 2f 0a 20  DERBY_LIMIT */. 
1f950 20 75 31 36 20 6e 4c 6f 6f 70 2c 20 20 20 20 20   u16 nLoop,     
1f960 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1f970 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 70   of entries in p
1f980 50 61 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f  Path->aLoop[] */
1f990 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c  .  WhereLoop *pL
1f9a0 61 73 74 2c 20 20 20 20 20 2f 2a 20 41 64 64 20  ast,     /* Add 
1f9b0 74 68 69 73 20 57 68 65 72 65 4c 6f 6f 70 20 74  this WhereLoop t
1f9c0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 70 50 61  o the end of pPa
1f9d0 74 68 2d 3e 61 4c 6f 6f 70 5b 5d 20 2a 2f 0a 20  th->aLoop[] */. 
1f9e0 20 42 69 74 6d 61 73 6b 20 2a 70 52 65 76 4d 61   Bitmask *pRevMa
1f9f0 73 6b 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d  sk     /* OUT: M
1fa00 61 73 6b 20 6f 66 20 57 68 65 72 65 4c 6f 6f 70  ask of WhereLoop
1fa10 73 20 74 6f 20 72 75 6e 20 69 6e 20 72 65 76 65  s to run in reve
1fa20 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 29 7b 0a  rse order */.){.
1fa30 20 20 75 38 20 72 65 76 53 65 74 3b 20 20 20 20    u8 revSet;    
1fa40 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1fa50 69 66 20 72 65 76 20 69 73 20 6b 6e 6f 77 6e 20  if rev is known 
1fa60 2a 2f 0a 20 20 75 38 20 72 65 76 3b 20 20 20 20  */.  u8 rev;    
1fa70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1fa80 6d 70 6f 73 69 74 65 20 73 6f 72 74 20 6f 72 64  mposite sort ord
1fa90 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 76 49 64  er */.  u8 revId
1faa0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  x;            /*
1fab0 20 49 6e 64 65 78 20 73 6f 72 74 20 6f 72 64 65   Index sort orde
1fac0 72 20 2a 2f 0a 20 20 75 38 20 69 73 4f 72 64 65  r */.  u8 isOrde
1fad0 72 44 69 73 74 69 6e 63 74 3b 20 20 20 2f 2a 20  rDistinct;   /* 
1fae0 41 6c 6c 20 70 72 69 6f 72 20 57 68 65 72 65 4c  All prior WhereL
1faf0 6f 6f 70 73 20 61 72 65 20 6f 72 64 65 72 2d 64  oops are order-d
1fb00 69 73 74 69 6e 63 74 20 2a 2f 0a 20 20 75 38 20  istinct */.  u8 
1fb10 64 69 73 74 69 6e 63 74 43 6f 6c 75 6d 6e 73 3b  distinctColumns;
1fb20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1fb30 65 20 6c 6f 6f 70 20 68 61 73 20 55 4e 49 51 55  e loop has UNIQU
1fb40 45 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6c 75 6d  E NOT NULL colum
1fb50 6e 73 20 2a 2f 0a 20 20 75 38 20 69 73 4d 61 74  ns */.  u8 isMat
1fb60 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ch;           /*
1fb70 20 69 43 6f 6c 75 6d 6e 20 6d 61 74 63 68 65 73   iColumn matches
1fb80 20 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f   a term of the O
1fb90 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
1fba0 2f 0a 20 20 75 31 36 20 65 71 4f 70 4d 61 73 6b  /.  u16 eqOpMask
1fbb0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  ;         /* All
1fbc0 6f 77 65 64 20 65 71 75 61 6c 69 74 79 20 6f 70  owed equality op
1fbd0 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 75 31 36  erators */.  u16
1fbe0 20 6e 4b 65 79 43 6f 6c 3b 20 20 20 20 20 20 20   nKeyCol;       
1fbf0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1fc00 6b 65 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 70  key columns in p
1fc10 49 6e 64 65 78 20 2a 2f 0a 20 20 75 31 36 20 6e  Index */.  u16 n
1fc20 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 20 20  Column;         
1fc30 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
1fc40 20 6f 66 20 6f 72 64 65 72 65 64 20 63 6f 6c 75   of ordered colu
1fc50 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
1fc60 20 2a 2f 0a 20 20 75 31 36 20 6e 4f 72 64 65 72   */.  u16 nOrder
1fc70 42 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  By;         /* N
1fc80 75 6d 62 65 72 20 74 65 72 6d 73 20 69 6e 20 74  umber terms in t
1fc90 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1fca0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f 6f  se */.  int iLoo
1fcb0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
1fcc0 20 49 6e 64 65 78 20 6f 66 20 57 68 65 72 65 4c   Index of WhereL
1fcd0 6f 6f 70 20 69 6e 20 70 50 61 74 68 20 62 65 69  oop in pPath bei
1fce0 6e 67 20 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a  ng processed */.
1fcf0 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
1fd00 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1fd10 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
1fd20 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
1fd30 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
1fd40 6d 62 65 72 20 66 6f 72 20 63 75 72 72 65 6e 74  mber for current
1fd50 20 57 68 65 72 65 4c 6f 6f 70 20 2a 2f 0a 20 20   WhereLoop */.  
1fd60 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20  int iColumn;    
1fd70 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d        /* A colum
1fd80 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20  n number within 
1fd90 74 61 62 6c 65 20 69 43 75 72 20 2a 2f 0a 20 20  table iCur */.  
1fda0 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70  WhereLoop *pLoop
1fdb0 20 3d 20 30 3b 20 2f 2a 20 43 75 72 72 65 6e 74   = 0; /* Current
1fdc0 20 57 68 65 72 65 4c 6f 6f 70 20 62 65 69 6e 67   WhereLoop being
1fdd0 20 70 72 6f 63 65 73 73 65 64 2e 20 2a 2f 0a 20   processed. */. 
1fde0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
1fdf0 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67  m;     /* A sing
1fe00 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  le term of the W
1fe10 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
1fe20 20 45 78 70 72 20 2a 70 4f 42 45 78 70 72 3b 20   Expr *pOBExpr; 
1fe30 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 70         /* An exp
1fe40 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65  ression from the
1fe50 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1fe60 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
1fe70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20 43  Coll;       /* C
1fe80 4f 4c 4c 41 54 45 20 66 75 6e 63 74 69 6f 6e 20  OLLATE function 
1fe90 66 72 6f 6d 20 61 6e 20 4f 52 44 45 52 20 42 59  from an ORDER BY
1fea0 20 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a   clause term */.
1feb0 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
1fec0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
1fed0 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
1fee0 77 69 74 68 20 70 4c 6f 6f 70 20 2a 2f 0a 20 20  with pLoop */.  
1fef0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 57  sqlite3 *db = pW
1ff00 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 64 62  Info->pParse->db
1ff10 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63  ;  /* Database c
1ff20 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 42  onnection */.  B
1ff30 69 74 6d 61 73 6b 20 6f 62 53 61 74 20 3d 20 30  itmask obSat = 0
1ff40 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  ;    /* Mask of 
1ff50 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 73  ORDER BY terms s
1ff60 61 74 69 73 66 69 65 64 20 73 6f 20 66 61 72 20  atisfied so far 
1ff70 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6f 62 44  */.  Bitmask obD
1ff80 6f 6e 65 3b 20 20 20 20 20 20 20 2f 2a 20 4d 61  one;       /* Ma
1ff90 73 6b 20 6f 66 20 61 6c 6c 20 4f 52 44 45 52 20  sk of all ORDER 
1ffa0 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 42 69  BY terms */.  Bi
1ffb0 74 6d 61 73 6b 20 6f 72 64 65 72 44 69 73 74 69  tmask orderDisti
1ffc0 6e 63 74 4d 61 73 6b 3b 20 20 2f 2a 20 4d 61 73  nctMask;  /* Mas
1ffd0 6b 20 6f 66 20 61 6c 6c 20 77 65 6c 6c 2d 6f 72  k of all well-or
1ffe0 64 65 72 65 64 20 6c 6f 6f 70 73 20 2a 2f 0a 20  dered loops */. 
1fff0 20 42 69 74 6d 61 73 6b 20 72 65 61 64 79 3b 20   Bitmask ready; 
20000 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20010 4d 61 73 6b 20 6f 66 20 69 6e 6e 65 72 20 6c 6f  Mask of inner lo
20020 6f 70 73 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  ops */..  /*.  *
20030 2a 20 57 65 20 73 61 79 20 74 68 65 20 57 68 65  * We say the Whe
20040 72 65 4c 6f 6f 70 20 69 73 20 22 6f 6e 65 2d 72  reLoop is "one-r
20050 6f 77 22 20 69 66 20 69 74 20 67 65 6e 65 72 61  ow" if it genera
20060 74 65 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  tes no more than
20070 20 6f 6e 65 0a 20 20 2a 2a 20 72 6f 77 20 6f 66   one.  ** row of
20080 20 6f 75 74 70 75 74 2e 20 20 41 20 57 68 65 72   output.  A Wher
20090 65 4c 6f 6f 70 20 69 73 20 6f 6e 65 2d 72 6f 77  eLoop is one-row
200a0 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66   if all of the f
200b0 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
200c0 65 3a 0a 20 20 2a 2a 20 20 28 61 29 20 41 6c 6c  e:.  **  (a) All
200d0 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 6d   index columns m
200e0 61 74 63 68 20 77 69 74 68 20 57 48 45 52 45 5f  atch with WHERE_
200f0 43 4f 4c 55 4d 4e 5f 45 51 2e 0a 20 20 2a 2a 20  COLUMN_EQ..  ** 
20100 20 28 62 29 20 54 68 65 20 69 6e 64 65 78 20 69   (b) The index i
20110 73 20 75 6e 69 71 75 65 0a 20 20 2a 2a 20 41 6e  s unique.  ** An
20120 79 20 57 68 65 72 65 4c 6f 6f 70 20 77 69 74 68  y WhereLoop with
20130 20 61 6e 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   an WHERE_COLUMN
20140 5f 45 51 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f  _EQ constraint o
20150 6e 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 6f  n the rowid is o
20160 6e 65 2d 72 6f 77 2e 0a 20 20 2a 2a 20 45 76 65  ne-row..  ** Eve
20170 72 79 20 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65  ry one-row Where
20180 4c 6f 6f 70 20 77 69 6c 6c 20 68 61 76 65 20 74  Loop will have t
20190 68 65 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 20  he WHERE_ONEROW 
201a0 62 69 74 20 73 65 74 20 69 6e 20 77 73 46 6c 61  bit set in wsFla
201b0 67 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 65  gs..  **.  ** We
201c0 20 73 61 79 20 74 68 65 20 57 68 65 72 65 4c 6f   say the WhereLo
201d0 6f 70 20 69 73 20 22 6f 72 64 65 72 2d 64 69 73  op is "order-dis
201e0 74 69 6e 63 74 22 20 69 66 20 74 68 65 20 73 65  tinct" if the se
201f0 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 66 72 6f  t of columns fro
20200 6d 0a 20 20 2a 2a 20 74 68 61 74 20 57 68 65 72  m.  ** that Wher
20210 65 4c 6f 6f 70 20 74 68 61 74 20 61 72 65 20 69  eLoop that are i
20220 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
20230 6c 61 75 73 65 20 61 72 65 20 64 69 66 66 65 72  lause are differ
20240 65 6e 74 20 66 6f 72 20 65 76 65 72 79 0a 20 20  ent for every.  
20250 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 57 68  ** row of the Wh
20260 65 72 65 4c 6f 6f 70 2e 20 20 45 76 65 72 79 20  ereLoop.  Every 
20270 6f 6e 65 2d 72 6f 77 20 57 68 65 72 65 4c 6f 6f  one-row WhereLoo
20280 70 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  p is automatical
20290 6c 79 0a 20 20 2a 2a 20 6f 72 64 65 72 2d 64 69  ly.  ** order-di
202a0 73 74 69 6e 63 74 2e 20 20 20 41 20 57 68 65 72  stinct.   A Wher
202b0 65 4c 6f 6f 70 20 74 68 61 74 20 68 61 73 20 6e  eLoop that has n
202c0 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  o columns in the
202d0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
202e0 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 6f 72 64  .  ** is not ord
202f0 65 72 2d 64 69 73 74 69 6e 63 74 2e 20 54 6f 20  er-distinct. To 
20300 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e 63  be order-distinc
20310 74 20 69 73 20 6e 6f 74 20 71 75 69 74 65 20 74  t is not quite t
20320 68 65 20 73 61 6d 65 20 61 73 20 62 65 69 6e 67  he same as being
20330 0a 20 20 2a 2a 20 55 4e 49 51 55 45 20 73 69 6e  .  ** UNIQUE sin
20340 63 65 20 61 20 55 4e 49 51 55 45 20 63 6f 6c 75  ce a UNIQUE colu
20350 6d 6e 20 6f 72 20 69 6e 64 65 78 20 63 61 6e 20  mn or index can 
20360 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f  have multiple ro
20370 77 73 20 74 68 61 74 20 0a 20 20 2a 2a 20 61 72  ws that .  ** ar
20380 65 20 4e 55 4c 4c 20 61 6e 64 20 4e 55 4c 4c 20  e NULL and NULL 
20390 76 61 6c 75 65 73 20 61 72 65 20 65 71 75 69 76  values are equiv
203a0 61 6c 65 6e 74 20 66 6f 72 20 74 68 65 20 70 75  alent for the pu
203b0 72 70 6f 73 65 20 6f 66 20 6f 72 64 65 72 2d 64  rpose of order-d
203c0 69 73 74 69 6e 63 74 2e 0a 20 20 2a 2a 20 54 6f  istinct..  ** To
203d0 20 62 65 20 6f 72 64 65 72 2d 64 69 73 74 69 6e   be order-distin
203e0 63 74 2c 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  ct, the columns 
203f0 6d 75 73 74 20 62 65 20 55 4e 49 51 55 45 20 61  must be UNIQUE a
20400 6e 64 20 4e 4f 54 20 4e 55 4c 4c 2e 0a 20 20 2a  nd NOT NULL..  *
20410 2a 0a 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64  *.  ** The rowid
20420 20 66 6f 72 20 61 20 74 61 62 6c 65 20 69 73 20   for a table is 
20430 61 6c 77 61 79 73 20 55 4e 49 51 55 45 20 61 6e  always UNIQUE an
20440 64 20 4e 4f 54 20 4e 55 4c 4c 20 73 6f 20 77 68  d NOT NULL so wh
20450 65 6e 65 76 65 72 20 74 68 65 0a 20 20 2a 2a 20  enever the.  ** 
20460 72 6f 77 69 64 20 61 70 70 65 61 72 73 20 69 6e  rowid appears in
20470 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
20480 61 75 73 65 2c 20 74 68 65 20 63 6f 72 72 65 73  ause, the corres
20490 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 4c 6f 6f  ponding WhereLoo
204a0 70 20 69 73 0a 20 20 2a 2a 20 61 75 74 6f 6d 61  p is.  ** automa
204b0 74 69 63 61 6c 6c 79 20 6f 72 64 65 72 2d 64 69  tically order-di
204c0 73 74 69 6e 63 74 2e 0a 20 20 2a 2f 0a 0a 20 20  stinct..  */..  
204d0 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
204e0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 4c 6f  !=0 );.  if( nLo
204f0 6f 70 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69  op && Optimizati
20500 6f 6e 44 69 73 61 62 6c 65 64 28 64 62 2c 20 53  onDisabled(db, S
20510 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78  QLITE_OrderByIdx
20520 4a 6f 69 6e 29 20 29 20 72 65 74 75 72 6e 20 30  Join) ) return 0
20530 3b 0a 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  ;..  nOrderBy = 
20540 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
20550 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 4f 72  .  testcase( nOr
20560 64 65 72 42 79 3d 3d 42 4d 53 2d 31 20 29 3b 0a  derBy==BMS-1 );.
20570 20 20 69 66 28 20 6e 4f 72 64 65 72 42 79 3e 42    if( nOrderBy>B
20580 4d 53 2d 31 20 29 20 72 65 74 75 72 6e 20 30 3b  MS-1 ) return 0;
20590 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 6f 70 74 69    /* Cannot opti
205a0 6d 69 7a 65 20 6f 76 65 72 6c 79 20 6c 61 72 67  mize overly larg
205b0 65 20 4f 52 44 45 52 20 42 59 73 20 2a 2f 0a 20  e ORDER BYs */. 
205c0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
205d0 20 3d 20 31 3b 0a 20 20 6f 62 44 6f 6e 65 20 3d   = 1;.  obDone =
205e0 20 4d 41 53 4b 42 49 54 28 6e 4f 72 64 65 72 42   MASKBIT(nOrderB
205f0 79 29 2d 31 3b 0a 20 20 6f 72 64 65 72 44 69 73  y)-1;.  orderDis
20600 74 69 6e 63 74 4d 61 73 6b 20 3d 20 30 3b 0a 20  tinctMask = 0;. 
20610 20 72 65 61 64 79 20 3d 20 30 3b 0a 20 20 65 71   ready = 0;.  eq
20620 4f 70 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 20 7c  OpMask = WO_EQ |
20630 20 57 4f 5f 49 53 20 7c 20 57 4f 5f 49 53 4e 55   WO_IS | WO_ISNU
20640 4c 4c 3b 0a 20 20 69 66 28 20 77 63 74 72 6c 46  LL;.  if( wctrlF
20650 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44  lags & WHERE_ORD
20660 45 52 42 59 5f 4c 49 4d 49 54 20 29 20 65 71 4f  ERBY_LIMIT ) eqO
20670 70 4d 61 73 6b 20 7c 3d 20 57 4f 5f 49 4e 3b 0a  pMask |= WO_IN;.
20680 20 20 66 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69    for(iLoop=0; i
20690 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 26  sOrderDistinct &
206a0 26 20 6f 62 53 61 74 3c 6f 62 44 6f 6e 65 20 26  & obSat<obDone &
206b0 26 20 69 4c 6f 6f 70 3c 3d 6e 4c 6f 6f 70 3b 20  & iLoop<=nLoop; 
206c0 69 4c 6f 6f 70 2b 2b 29 7b 0a 20 20 20 20 69 66  iLoop++){.    if
206d0 28 20 69 4c 6f 6f 70 3e 30 20 29 20 72 65 61 64  ( iLoop>0 ) read
206e0 79 20 7c 3d 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  y |= pLoop->mask
206f0 53 65 6c 66 3b 0a 20 20 20 20 69 66 28 20 69 4c  Self;.    if( iL
20700 6f 6f 70 3c 6e 4c 6f 6f 70 20 29 7b 0a 20 20 20  oop<nLoop ){.   
20710 20 20 20 70 4c 6f 6f 70 20 3d 20 70 50 61 74 68     pLoop = pPath
20720 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d 3b 0a  ->aLoop[iLoop];.
20730 20 20 20 20 20 20 69 66 28 20 77 63 74 72 6c 46        if( wctrlF
20740 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44  lags & WHERE_ORD
20750 45 52 42 59 5f 4c 49 4d 49 54 20 29 20 63 6f 6e  ERBY_LIMIT ) con
20760 74 69 6e 75 65 3b 0a 20 20 20 20 7d 65 6c 73 65  tinue;.    }else
20770 7b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20  {.      pLoop = 
20780 70 4c 61 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pLast;.    }.   
20790 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c   if( pLoop->wsFl
207a0 61 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54  ags & WHERE_VIRT
207b0 55 41 4c 54 41 42 4c 45 20 29 7b 0a 20 20 20 20  UALTABLE ){.    
207c0 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 76    if( pLoop->u.v
207d0 74 61 62 2e 69 73 4f 72 64 65 72 65 64 20 29 20  tab.isOrdered ) 
207e0 6f 62 53 61 74 20 3d 20 6f 62 44 6f 6e 65 3b 0a  obSat = obDone;.
207f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
20810 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 49 64  oop->u.btree.nId
20820 78 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  xCol = 0;.    }.
20830 20 20 20 20 69 43 75 72 20 3d 20 70 57 49 6e 66      iCur = pWInf
20840 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  o->pTabList->a[p
20850 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e 69 43 75 72  Loop->iTab].iCur
20860 73 6f 72 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 72  sor;..    /* Mar
20870 6b 20 6f 66 66 20 61 6e 79 20 4f 52 44 45 52 20  k off any ORDER 
20880 42 59 20 74 65 72 6d 20 58 20 74 68 61 74 20 69  BY term X that i
20890 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  s a column in th
208a0 65 20 74 61 62 6c 65 20 6f 66 0a 20 20 20 20 2a  e table of.    *
208b0 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  * the current lo
208c0 6f 70 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  op for which the
208d0 72 65 20 69 73 20 74 65 72 6d 20 69 6e 20 74 68  re is term in th
208e0 65 20 57 48 45 52 45 0a 20 20 20 20 2a 2a 20 63  e WHERE.    ** c
208f0 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 72  lause of the for
20900 6d 20 58 20 49 53 20 4e 55 4c 4c 20 6f 72 20 58  m X IS NULL or X
20910 3d 3f 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  =? that referenc
20920 65 20 6f 6e 6c 79 20 6f 75 74 65 72 0a 20 20 20  e only outer.   
20930 20 2a 2a 20 6c 6f 6f 70 73 2e 0a 20 20 20 20 2a   ** loops..    *
20940 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
20950 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
20960 0a 20 20 20 20 20 20 69 66 28 20 4d 41 53 4b 42  .      if( MASKB
20970 49 54 28 69 29 20 26 20 6f 62 53 61 74 20 29 20  IT(i) & obSat ) 
20980 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
20990 70 4f 42 45 78 70 72 20 3d 20 73 71 6c 69 74 65  pOBExpr = sqlite
209a0 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
209b0 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e  (pOrderBy->a[i].
209c0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
209d0 28 20 70 4f 42 45 78 70 72 2d 3e 6f 70 21 3d 54  ( pOBExpr->op!=T
209e0 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f 6e 74 69  K_COLUMN ) conti
209f0 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nue;.      if( p
20a00 4f 42 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d  OBExpr->iTable!=
20a10 69 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  iCur ) continue;
20a20 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 73  .      pTerm = s
20a30 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54  qlite3WhereFindT
20a40 65 72 6d 28 26 70 57 49 6e 66 6f 2d 3e 73 57 43  erm(&pWInfo->sWC
20a50 2c 20 69 43 75 72 2c 20 70 4f 42 45 78 70 72 2d  , iCur, pOBExpr-
20a60 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20  >iColumn,.      
20a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a80 20 7e 72 65 61 64 79 2c 20 65 71 4f 70 4d 61 73   ~ready, eqOpMas
20a90 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  k, 0);.      if(
20aa0 20 70 54 65 72 6d 3d 3d 30 20 29 20 63 6f 6e 74   pTerm==0 ) cont
20ab0 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
20ac0 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
20ad0 3d 3d 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20  ==WO_IN ){.     
20ae0 20 20 20 2f 2a 20 49 4e 20 74 65 72 6d 73 20 61     /* IN terms a
20af0 72 65 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f  re only valid fo
20b00 72 20 73 6f 72 74 69 6e 67 20 69 6e 20 74 68 65  r sorting in the
20b10 20 4f 52 44 45 52 20 42 59 20 4c 49 4d 49 54 20   ORDER BY LIMIT 
20b20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 70 74 69  .        ** opti
20b30 6d 69 7a 61 74 69 6f 6e 2c 20 61 6e 64 20 74 68  mization, and th
20b40 65 6e 20 6f 6e 6c 79 20 69 66 20 74 68 65 79 20  en only if they 
20b50 61 72 65 20 61 63 74 75 61 6c 6c 79 20 75 73 65  are actually use
20b60 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 20  d.        ** by 
20b70 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 2a  the query plan *
20b80 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
20b90 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ( wctrlFlags & W
20ba0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d  HERE_ORDERBY_LIM
20bb0 49 54 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  IT );.        fo
20bc0 72 28 6a 3d 30 3b 20 6a 3c 70 4c 6f 6f 70 2d 3e  r(j=0; j<pLoop->
20bd0 6e 4c 54 65 72 6d 20 26 26 20 70 54 65 72 6d 21  nLTerm && pTerm!
20be0 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b 6a  =pLoop->aLTerm[j
20bf0 5d 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  ]; j++){}.      
20c00 20 20 69 66 28 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e    if( j>=pLoop->
20c10 6e 4c 54 65 72 6d 20 29 20 63 6f 6e 74 69 6e 75  nLTerm ) continu
20c20 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
20c30 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70   if( (pTerm->eOp
20c40 65 72 61 74 6f 72 26 28 57 4f 5f 45 51 7c 57 4f  erator&(WO_EQ|WO
20c50 5f 49 53 29 29 21 3d 30 20 26 26 20 70 4f 42 45  _IS))!=0 && pOBE
20c60 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20  xpr->iColumn>=0 
20c70 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
20c80 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
20c90 71 4d 61 74 63 68 28 70 57 49 6e 66 6f 2d 3e 70  qMatch(pWInfo->p
20ca0 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
20cb0 20 20 20 20 20 20 20 20 20 20 70 4f 72 64 65 72            pOrder
20cc0 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  By->a[i].pExpr, 
20cd0 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 3d 3d 30  pTerm->pExpr)==0
20ce0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
20cf0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
20d00 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  }.        testca
20d10 73 65 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se( pTerm->pExpr
20d20 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20  ->op==TK_IS );. 
20d30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6f 62 53       }.      obS
20d40 61 74 20 7c 3d 20 4d 41 53 4b 42 49 54 28 69 29  at |= MASKBIT(i)
20d50 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
20d60 20 28 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73   (pLoop->wsFlags
20d70 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57 29   & WHERE_ONEROW)
20d80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
20d90 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20   pLoop->wsFlags 
20da0 26 20 57 48 45 52 45 5f 49 50 4b 20 29 7b 0a 20  & WHERE_IPK ){. 
20db0 20 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20         pIndex = 
20dc0 30 3b 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 43  0;.        nKeyC
20dd0 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ol = 0;.        
20de0 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20 20  nColumn = 1;.   
20df0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 49     }else if( (pI
20e00 6e 64 65 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e  ndex = pLoop->u.
20e10 62 74 72 65 65 2e 70 49 6e 64 65 78 29 3d 3d 30  btree.pIndex)==0
20e20 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 62 55 6e 6f   || pIndex->bUno
20e30 72 64 65 72 65 64 20 29 7b 0a 20 20 20 20 20 20  rdered ){.      
20e40 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
20e50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20e60 20 6e 4b 65 79 43 6f 6c 20 3d 20 70 49 6e 64 65   nKeyCol = pInde
20e70 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20  x->nKeyCol;.    
20e80 20 20 20 20 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49      nColumn = pI
20e90 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  ndex->nColumn;. 
20ea0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
20eb0 43 6f 6c 75 6d 6e 3d 3d 6e 4b 65 79 43 6f 6c 2b  Column==nKeyCol+
20ec0 31 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70  1 || !HasRowid(p
20ed0 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 20 29  Index->pTable) )
20ee0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
20ef0 28 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  ( pIndex->aiColu
20f00 6d 6e 5b 6e 43 6f 6c 75 6d 6e 2d 31 5d 3d 3d 58  mn[nColumn-1]==X
20f10 4e 5f 52 4f 57 49 44 0a 20 20 20 20 20 20 20 20  N_ROWID.        
20f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f30 20 20 7c 7c 20 21 48 61 73 52 6f 77 69 64 28 70    || !HasRowid(p
20f40 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 29 29 3b  Index->pTable));
20f50 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72  .        isOrder
20f60 44 69 73 74 69 6e 63 74 20 3d 20 49 73 55 6e 69  Distinct = IsUni
20f70 71 75 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29  queIndex(pIndex)
20f80 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
20f90 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
20fa0 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   all columns of 
20fb0 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 64 65  the index and de
20fc0 61 6c 20 77 69 74 68 20 74 68 65 20 6f 6e 65 73  al with the ones
20fd0 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61  .      ** that a
20fe0 72 65 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e  re not constrain
20ff0 65 64 20 62 79 20 3d 3d 20 6f 72 20 49 4e 2e 0a  ed by == or IN..
21000 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
21010 65 76 20 3d 20 72 65 76 53 65 74 20 3d 20 30 3b  ev = revSet = 0;
21020 0a 20 20 20 20 20 20 64 69 73 74 69 6e 63 74 43  .      distinctC
21030 6f 6c 75 6d 6e 73 20 3d 20 30 3b 0a 20 20 20 20  olumns = 0;.    
21040 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f    for(j=0; j<nCo
21050 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
21060 20 20 20 20 75 38 20 62 4f 6e 63 65 20 3d 20 31      u8 bOnce = 1
21070 3b 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 75 6e  ; /* True to run
21080 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 73 65   the ORDER BY se
21090 61 72 63 68 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20  arch loop */..  
210a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3e        assert( j>
210b0 3d 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e  =pLoop->u.btree.
210c0 6e 45 71 20 0a 20 20 20 20 20 20 20 20 20 20 20  nEq .           
210d0 20 7c 7c 20 28 70 4c 6f 6f 70 2d 3e 61 4c 54 65   || (pLoop->aLTe
210e0 72 6d 5b 6a 5d 3d 3d 30 29 3d 3d 28 6a 3c 70 4c  rm[j]==0)==(j<pL
210f0 6f 6f 70 2d 3e 6e 53 6b 69 70 29 0a 20 20 20 20  oop->nSkip).    
21100 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
21110 66 28 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74  f( j<pLoop->u.bt
21120 72 65 65 2e 6e 45 71 20 26 26 20 6a 3e 3d 70 4c  ree.nEq && j>=pL
21130 6f 6f 70 2d 3e 6e 53 6b 69 70 20 29 7b 0a 20 20  oop->nSkip ){.  
21140 20 20 20 20 20 20 20 20 75 31 36 20 65 4f 70 20          u16 eOp 
21150 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 5b  = pLoop->aLTerm[
21160 6a 5d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 0a  j]->eOperator;..
21170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69            /* Ski
21180 70 20 6f 76 65 72 20 3d 3d 20 61 6e 64 20 49 53  p over == and IS
21190 20 61 6e 64 20 49 53 4e 55 4c 4c 20 74 65 72 6d   and ISNULL term
211a0 73 2e 20 20 28 41 6c 73 6f 20 73 6b 69 70 20 49  s.  (Also skip I
211b0 4e 20 74 65 72 6d 73 20 77 68 65 6e 0a 20 20 20  N terms when.   
211c0 20 20 20 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20         ** doing 
211d0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49  WHERE_ORDERBY_LI
211e0 4d 49 54 20 70 72 6f 63 65 73 73 69 6e 67 29 2e  MIT processing).
211f0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20   .          **. 
21200 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
21210 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20  he current term 
21220 69 73 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 61  is a column of a
21230 6e 20 28 28 3f 2c 3f 29 20 49 4e 20 28 53 45 4c  n ((?,?) IN (SEL
21240 45 43 54 2e 2e 2e 29 29 20 0a 20 20 20 20 20 20  ECT...)) .      
21250 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
21260 6e 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  n for which the 
21270 53 45 4c 45 43 54 20 72 65 74 75 72 6e 73 20 6d  SELECT returns m
21280 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6c  ore than one col
21290 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 2a  umn,.          *
212a0 2a 20 63 68 65 63 6b 20 74 68 61 74 20 69 74 20  * check that it 
212b0 69 73 20 74 68 65 20 6f 6e 6c 79 20 63 6f 6c 75  is the only colu
212c0 6d 6e 20 75 73 65 64 20 62 79 20 74 68 69 73 20  mn used by this 
212d0 6c 6f 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c  loop. Otherwise,
212e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 66  .          ** if
212f0 20 69 74 20 69 73 20 6f 6e 65 20 6f 66 20 74 77   it is one of tw
21300 6f 20 6f 72 20 6d 6f 72 65 2c 20 6e 6f 6e 65 20  o or more, none 
21310 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 63  of the columns c
21320 61 6e 20 62 65 0a 20 20 20 20 20 20 20 20 20 20  an be.          
21330 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f  ** considered to
21340 20 6d 61 74 63 68 20 61 6e 20 4f 52 44 45 52 20   match an ORDER 
21350 42 59 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20  BY term.  */.   
21360 20 20 20 20 20 20 20 69 66 28 20 28 65 4f 70 20         if( (eOp 
21370 26 20 65 71 4f 70 4d 61 73 6b 29 21 3d 30 20 29  & eqOpMask)!=0 )
21380 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
21390 28 20 65 4f 70 20 26 20 57 4f 5f 49 53 4e 55 4c  ( eOp & WO_ISNUL
213a0 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L ){.           
213b0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f     testcase( isO
213c0 72 64 65 72 44 69 73 74 69 6e 63 74 20 29 3b 0a  rderDistinct );.
213d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
213e0 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20 3d 20  OrderDistinct = 
213f0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  0;.            }
21400 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
21410 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 20  tinue;  .       
21420 20 20 20 7d 65 6c 73 65 20 69 66 28 20 41 4c 57     }else if( ALW
21430 41 59 53 28 65 4f 70 20 26 20 57 4f 5f 49 4e 29  AYS(eOp & WO_IN)
21440 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21450 2f 2a 20 41 4c 57 41 59 53 28 29 20 6a 75 73 74  /* ALWAYS() just
21460 69 66 69 63 61 74 69 6f 6e 3a 20 65 4f 70 20 69  ification: eOp i
21470 73 20 61 6e 20 65 71 75 61 6c 69 74 79 20 6f 70  s an equality op
21480 65 72 61 74 6f 72 20 64 75 65 20 74 6f 20 74 68  erator due to th
21490 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
214a0 20 6a 3c 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65   j<pLoop->u.btre
214b0 65 2e 6e 45 71 20 63 6f 6e 73 74 72 61 69 6e 74  e.nEq constraint
214c0 20 61 62 6f 76 65 2e 20 20 41 6e 79 20 65 71 75   above.  Any equ
214d0 61 6c 69 74 79 20 6f 74 68 65 72 0a 20 20 20 20  ality other.    
214e0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e 20          ** than 
214f0 57 4f 5f 49 4e 20 69 73 20 63 61 70 74 75 72 65  WO_IN is capture
21500 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f 75  d by the previou
21510 73 20 22 69 66 22 2e 20 20 53 6f 20 74 68 69 73  s "if".  So this
21520 20 6f 6e 65 0a 20 20 20 20 20 20 20 20 20 20 20   one.           
21530 20 2a 2a 20 61 6c 77 61 79 73 20 68 61 73 20 74   ** always has t
21540 6f 20 62 65 20 57 4f 5f 49 4e 2e 20 2a 2f 0a 20  o be WO_IN. */. 
21550 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
21560 2a 70 58 20 3d 20 70 4c 6f 6f 70 2d 3e 61 4c 54  *pX = pLoop->aLT
21570 65 72 6d 5b 6a 5d 2d 3e 70 45 78 70 72 3b 0a 20  erm[j]->pExpr;. 
21580 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69             for(i
21590 3d 6a 2b 31 3b 20 69 3c 70 4c 6f 6f 70 2d 3e 75  =j+1; i<pLoop->u
215a0 2e 62 74 72 65 65 2e 6e 45 71 3b 20 69 2b 2b 29  .btree.nEq; i++)
215b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
215c0 69 66 28 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  if( pLoop->aLTer
215d0 6d 5b 69 5d 2d 3e 70 45 78 70 72 3d 3d 70 58 20  m[i]->pExpr==pX 
215e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
215f0 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 6f 6f     assert( (pLoo
21600 70 2d 3e 61 4c 54 65 72 6d 5b 69 5d 2d 3e 65 4f  p->aLTerm[i]->eO
21610 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 29  perator & WO_IN)
21620 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
21630 20 20 20 20 62 4f 6e 63 65 20 3d 20 30 3b 0a 20      bOnce = 0;. 
21640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
21650 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
21660 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21670 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
21680 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
21690 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 63 6f     /* Get the co
216a0 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 6e 20 74  lumn number in t
216b0 68 65 20 74 61 62 6c 65 20 28 69 43 6f 6c 75 6d  he table (iColum
216c0 6e 29 20 61 6e 64 20 73 6f 72 74 20 6f 72 64 65  n) and sort orde
216d0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 72 65  r.        ** (re
216e0 76 49 64 78 29 20 66 6f 72 20 74 68 65 20 6a 2d  vIdx) for the j-
216f0 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  th column of the
21700 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
21710 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
21720 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Index ){.       
21730 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 6e     iColumn = pIn
21740 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  dex->aiColumn[j]
21750 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 76 49  ;.          revI
21760 64 78 20 3d 20 70 49 6e 64 65 78 2d 3e 61 53 6f  dx = pIndex->aSo
21770 72 74 4f 72 64 65 72 5b 6a 5d 3b 0a 20 20 20 20  rtOrder[j];.    
21780 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d        if( iColum
21790 6e 3d 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  n==pIndex->pTabl
217a0 65 2d 3e 69 50 4b 65 79 20 29 20 69 43 6f 6c 75  e->iPKey ) iColu
217b0 6d 6e 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20  mn = XN_ROWID;. 
217c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
217d0 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20          iColumn 
217e0 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20 20 20  = XN_ROWID;.    
217f0 20 20 20 20 20 20 72 65 76 49 64 78 20 3d 20 30        revIdx = 0
21800 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
21810 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e 63 6f 6e       /* An uncon
21820 73 74 72 61 69 6e 65 64 20 63 6f 6c 75 6d 6e 20  strained column 
21830 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 4e 55  that might be NU
21840 4c 4c 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  LL means that th
21850 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 68  is.        ** Wh
21860 65 72 65 4c 6f 6f 70 20 69 73 20 6e 6f 74 20 77  ereLoop is not w
21870 65 6c 6c 2d 6f 72 64 65 72 65 64 0a 20 20 20 20  ell-ordered.    
21880 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
21890 66 28 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e  f( isOrderDistin
218a0 63 74 0a 20 20 20 20 20 20 20 20 20 26 26 20 69  ct.         && i
218b0 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 20 20 20 20  Column>=0.      
218c0 20 20 20 26 26 20 6a 3e 3d 70 4c 6f 6f 70 2d 3e     && j>=pLoop->
218d0 75 2e 62 74 72 65 65 2e 6e 45 71 0a 20 20 20 20  u.btree.nEq.    
218e0 20 20 20 20 20 26 26 20 70 49 6e 64 65 78 2d 3e       && pIndex->
218f0 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f  pTable->aCol[iCo
21900 6c 75 6d 6e 5d 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30  lumn].notNull==0
21910 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
21920 20 20 20 20 20 20 69 73 4f 72 64 65 72 44 69 73        isOrderDis
21930 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  tinct = 0;.     
21940 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
21950 20 46 69 6e 64 20 74 68 65 20 4f 52 44 45 52 20   Find the ORDER 
21960 42 59 20 74 65 72 6d 20 74 68 61 74 20 63 6f 72  BY term that cor
21970 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20  responds to the 
21980 6a 2d 74 68 20 63 6f 6c 75 6d 6e 0a 20 20 20 20  j-th column.    
21990 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e      ** of the in
219a0 64 65 78 20 61 6e 64 20 6d 61 72 6b 20 74 68 61  dex and mark tha
219b0 74 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  t ORDER BY term 
219c0 6f 66 66 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a  off .        */.
219d0 20 20 20 20 20 20 20 20 69 73 4d 61 74 63 68 20          isMatch 
219e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  = 0;.        for
219f0 28 69 3d 30 3b 20 62 4f 6e 63 65 20 26 26 20 69  (i=0; bOnce && i
21a00 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b  <nOrderBy; i++){
21a10 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4d  .          if( M
21a20 41 53 4b 42 49 54 28 69 29 20 26 20 6f 62 53 61  ASKBIT(i) & obSa
21a30 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
21a40 20 20 20 20 20 20 20 20 70 4f 42 45 78 70 72 20          pOBExpr 
21a50 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
21a60 70 43 6f 6c 6c 61 74 65 28 70 4f 72 64 65 72 42  pCollate(pOrderB
21a70 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  y->a[i].pExpr);.
21a80 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
21a90 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  se( wctrlFlags &
21aa0 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20 29   WHERE_GROUPBY )
21ab0 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
21ac0 63 61 73 65 28 20 77 63 74 72 6c 46 6c 61 67 73  case( wctrlFlags
21ad0 20 26 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   & WHERE_DISTINC
21ae0 54 42 59 20 29 3b 0a 20 20 20 20 20 20 20 20 20  TBY );.         
21af0 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73   if( (wctrlFlags
21b00 20 26 20 28 57 48 45 52 45 5f 47 52 4f 55 50 42   & (WHERE_GROUPB
21b10 59 7c 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54  Y|WHERE_DISTINCT
21b20 42 59 29 29 3d 3d 30 20 29 20 62 4f 6e 63 65 20  BY))==0 ) bOnce 
21b30 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
21b40 66 28 20 69 43 6f 6c 75 6d 6e 3e 3d 58 4e 5f 52  f( iColumn>=XN_R
21b50 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OWID ){.        
21b60 20 20 20 20 69 66 28 20 70 4f 42 45 78 70 72 2d      if( pOBExpr-
21b70 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op!=TK_COLUMN )
21b80 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
21b90 20 20 20 20 20 20 20 69 66 28 20 70 4f 42 45 78         if( pOBEx
21ba0 70 72 2d 3e 69 54 61 62 6c 65 21 3d 69 43 75 72  pr->iTable!=iCur
21bb0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
21bc0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 42           if( pOB
21bd0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69  Expr->iColumn!=i
21be0 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
21bf0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  e;.          }el
21c00 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
21c10 45 78 70 72 20 2a 70 49 64 78 45 78 70 72 20 3d  Expr *pIdxExpr =
21c20 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70   pIndex->aColExp
21c30 72 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20  r->a[j].pExpr;. 
21c40 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
21c50 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
21c60 65 53 6b 69 70 28 70 4f 42 45 78 70 72 2c 20 70  eSkip(pOBExpr, p
21c70 49 64 78 45 78 70 72 2c 20 69 43 75 72 29 20 29  IdxExpr, iCur) )
21c80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
21c90 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
21ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21cb0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
21cc0 28 20 69 43 6f 6c 75 6d 6e 21 3d 58 4e 5f 52 4f  ( iColumn!=XN_RO
21cd0 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  WID ){.         
21ce0 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
21cf0 65 33 45 78 70 72 4e 4e 43 6f 6c 6c 53 65 71 28  e3ExprNNCollSeq(
21d00 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2c 20  pWInfo->pParse, 
21d10 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70  pOrderBy->a[i].p
21d20 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
21d30 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
21d40 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61  rICmp(pColl->zNa
21d50 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  me, pIndex->azCo
21d60 6c 6c 5b 6a 5d 29 21 3d 30 20 29 20 63 6f 6e 74  ll[j])!=0 ) cont
21d70 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
21d80 7d 0a 20 20 20 20 20 20 20 20 20 20 70 4c 6f 6f  }.          pLoo
21d90 70 2d 3e 75 2e 62 74 72 65 65 2e 6e 49 64 78 43  p->u.btree.nIdxC
21da0 6f 6c 20 3d 20 6a 2b 31 3b 0a 20 20 20 20 20 20  ol = j+1;.      
21db0 20 20 20 20 69 73 4d 61 74 63 68 20 3d 20 31 3b      isMatch = 1;
21dc0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
21dd0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21de0 20 20 20 20 69 66 28 20 69 73 4d 61 74 63 68 20      if( isMatch 
21df0 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26  && (wctrlFlags &
21e00 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 29 3d   WHERE_GROUPBY)=
21e10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
21e20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
21e30 20 73 6f 72 74 20 6f 72 64 65 72 20 69 73 20 63   sort order is c
21e40 6f 6d 70 61 74 69 62 6c 65 20 69 6e 20 61 6e 20  ompatible in an 
21e50 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e  ORDER BY clause.
21e60 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 6f  .          ** So
21e70 72 74 20 6f 72 64 65 72 20 69 73 20 69 72 72 65  rt order is irre
21e80 6c 65 76 61 6e 74 20 66 6f 72 20 61 20 47 52 4f  levant for a GRO
21e90 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 2a 2f  UP BY clause. */
21ea0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
21eb0 65 76 53 65 74 20 29 7b 0a 20 20 20 20 20 20 20  evSet ){.       
21ec0 20 20 20 20 20 69 66 28 20 28 72 65 76 20 5e 20       if( (rev ^ 
21ed0 72 65 76 49 64 78 29 21 3d 70 4f 72 64 65 72 42  revIdx)!=pOrderB
21ee0 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
21ef0 72 20 29 20 69 73 4d 61 74 63 68 20 3d 20 30 3b  r ) isMatch = 0;
21f00 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
21f10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
21f20 76 20 3d 20 72 65 76 49 64 78 20 5e 20 70 4f 72  v = revIdx ^ pOr
21f30 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
21f40 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 20 20 20  Order;.         
21f50 20 20 20 69 66 28 20 72 65 76 20 29 20 2a 70 52     if( rev ) *pR
21f60 65 76 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49  evMask |= MASKBI
21f70 54 28 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20  T(iLoop);.      
21f80 20 20 20 20 20 20 72 65 76 53 65 74 20 3d 20 31        revSet = 1
21f90 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
21fa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21fb0 69 66 28 20 69 73 4d 61 74 63 68 20 29 7b 0a 20  if( isMatch ){. 
21fc0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f           if( iCo
21fd0 6c 75 6d 6e 3d 3d 58 4e 5f 52 4f 57 49 44 20 29  lumn==XN_ROWID )
21fe0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
21ff0 73 74 63 61 73 65 28 20 64 69 73 74 69 6e 63 74  stcase( distinct
22000 43 6f 6c 75 6d 6e 73 3d 3d 30 20 29 3b 0a 20 20  Columns==0 );.  
22010 20 20 20 20 20 20 20 20 20 20 64 69 73 74 69 6e            distin
22020 63 74 43 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20  ctColumns = 1;. 
22030 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22040 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d 41       obSat |= MA
22050 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20 20  SKBIT(i);.      
22060 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22070 20 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 66     /* No match f
22080 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ound */.        
22090 20 20 69 66 28 20 6a 3d 3d 30 20 7c 7c 20 6a 3c    if( j==0 || j<
220a0 6e 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20  nKeyCol ){.     
220b0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
220c0 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74   isOrderDistinct
220d0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
220e0 20 20 20 69 73 4f 72 64 65 72 44 69 73 74 69 6e     isOrderDistin
220f0 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ct = 0;.        
22100 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
22110 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
22120 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 4c 6f       } /* end Lo
22130 6f 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 65  op over all inde
22140 78 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  x columns */.   
22150 20 20 20 69 66 28 20 64 69 73 74 69 6e 63 74 43     if( distinctC
22160 6f 6c 75 6d 6e 73 20 29 7b 0a 20 20 20 20 20 20  olumns ){.      
22170 20 20 74 65 73 74 63 61 73 65 28 20 69 73 4f 72    testcase( isOr
22180 64 65 72 44 69 73 74 69 6e 63 74 3d 3d 30 20 29  derDistinct==0 )
22190 3b 0a 20 20 20 20 20 20 20 20 69 73 4f 72 64 65  ;.        isOrde
221a0 72 44 69 73 74 69 6e 63 74 20 3d 20 31 3b 0a 20  rDistinct = 1;. 
221b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20       }.    } /* 
221c0 65 6e 64 2d 69 66 20 6e 6f 74 20 6f 6e 65 2d 72  end-if not one-r
221d0 6f 77 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61  ow */..    /* Ma
221e0 72 6b 20 6f 66 66 20 61 6e 79 20 6f 74 68 65 72  rk off any other
221f0 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
22200 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20 70  that reference p
22210 4c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20  Loop */.    if( 
22220 69 73 4f 72 64 65 72 44 69 73 74 69 6e 63 74 20  isOrderDistinct 
22230 29 7b 0a 20 20 20 20 20 20 6f 72 64 65 72 44 69  ){.      orderDi
22240 73 74 69 6e 63 74 4d 61 73 6b 20 7c 3d 20 70 4c  stinctMask |= pL
22250 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66 3b 0a 20  oop->maskSelf;. 
22260 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
22270 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a  nOrderBy; i++){.
22280 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 3b          Expr *p;
22290 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
222a0 20 6d 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20   mTerm;.        
222b0 69 66 28 20 4d 41 53 4b 42 49 54 28 69 29 20 26  if( MASKBIT(i) &
222c0 20 6f 62 53 61 74 20 29 20 63 6f 6e 74 69 6e 75   obSat ) continu
222d0 65 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70  e;.        p = p
222e0 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
222f0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 6d 54 65  xpr;.        mTe
22300 72 6d 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  rm = sqlite3Wher
22310 65 45 78 70 72 55 73 61 67 65 28 26 70 57 49 6e  eExprUsage(&pWIn
22320 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 70 29 3b  fo->sMaskSet,p);
22330 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 54 65  .        if( mTe
22340 72 6d 3d 3d 30 20 26 26 20 21 73 71 6c 69 74 65  rm==0 && !sqlite
22350 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
22360 70 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  p) ) continue;. 
22370 20 20 20 20 20 20 20 69 66 28 20 28 6d 54 65 72         if( (mTer
22380 6d 26 7e 6f 72 64 65 72 44 69 73 74 69 6e 63 74  m&~orderDistinct
22390 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
223a0 20 20 20 20 20 20 6f 62 53 61 74 20 7c 3d 20 4d        obSat |= M
223b0 41 53 4b 42 49 54 28 69 29 3b 0a 20 20 20 20 20  ASKBIT(i);.     
223c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
223d0 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64 20 74 68   }.  } /* End th
223e0 65 20 6c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20  e loop over all 
223f0 57 68 65 72 65 4c 6f 6f 70 73 20 66 72 6f 6d 20  WhereLoops from 
22400 6f 75 74 65 72 2d 6d 6f 73 74 20 64 6f 77 6e 20  outer-most down 
22410 74 6f 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 2a 2f  to inner-most */
22420 0a 20 20 69 66 28 20 6f 62 53 61 74 3d 3d 6f 62  .  if( obSat==ob
22430 44 6f 6e 65 20 29 20 72 65 74 75 72 6e 20 28 69  Done ) return (i
22440 38 29 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66  8)nOrderBy;.  if
22450 28 20 21 69 73 4f 72 64 65 72 44 69 73 74 69 6e  ( !isOrderDistin
22460 63 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ct ){.    for(i=
22470 6e 4f 72 64 65 72 42 79 2d 31 3b 20 69 3e 30 3b  nOrderBy-1; i>0;
22480 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74   i--){.      Bit
22490 6d 61 73 6b 20 6d 20 3d 20 4d 41 53 4b 42 49 54  mask m = MASKBIT
224a0 28 69 29 20 2d 20 31 3b 0a 20 20 20 20 20 20 69  (i) - 1;.      i
224b0 66 28 20 28 6f 62 53 61 74 26 6d 29 3d 3d 6d 20  f( (obSat&m)==m 
224c0 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20  ) return i;.    
224d0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  }.    return 0;.
224e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
224f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
22500 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59 20  e WHERE_GROUPBY 
22510 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20 74  flag is set in t
22520 68 65 20 6d 61 73 6b 20 70 61 73 73 65 64 20 74  he mask passed t
22530 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
22540 67 69 6e 28 29 2c 0a 2a 2a 20 74 68 65 20 70 6c  gin(),.** the pl
22550 61 6e 6e 65 72 20 61 73 73 75 6d 65 73 20 74 68  anner assumes th
22560 61 74 20 74 68 65 20 73 70 65 63 69 66 69 65 64  at the specified
22570 20 70 4f 72 64 65 72 42 79 20 6c 69 73 74 20 69   pOrderBy list i
22580 73 20 61 63 74 75 61 6c 6c 79 20 61 20 47 52 4f  s actually a GRO
22590 55 50 0a 2a 2a 20 42 59 20 63 6c 61 75 73 65 20  UP.** BY clause 
225a0 2d 20 61 6e 64 20 73 6f 20 61 6e 79 20 6f 72 64  - and so any ord
225b0 65 72 20 74 68 61 74 20 67 72 6f 75 70 73 20 72  er that groups r
225c0 6f 77 73 20 61 73 20 72 65 71 75 69 72 65 64 20  ows as required 
225d0 73 61 74 69 73 66 69 65 73 20 74 68 65 0a 2a 2a  satisfies the.**
225e0 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a 2a 2a 20   request..**.** 
225f0 4e 6f 72 6d 61 6c 6c 79 2c 20 69 6e 20 74 68 69  Normally, in thi
22600 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74  s case it is not
22610 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
22620 65 20 63 61 6c 6c 65 72 20 74 6f 20 64 65 74 65  e caller to dete
22630 72 6d 69 6e 65 0a 2a 2a 20 77 68 65 74 68 65 72  rmine.** whether
22640 20 6f 72 20 6e 6f 74 20 74 68 65 20 72 6f 77 73   or not the rows
22650 20 61 72 65 20 72 65 61 6c 6c 79 20 62 65 69 6e   are really bein
22660 67 20 64 65 6c 69 76 65 72 65 64 20 69 6e 20 73  g delivered in s
22670 6f 72 74 65 64 20 6f 72 64 65 72 2c 20 6f 72 0a  orted order, or.
22680 2a 2a 20 6a 75 73 74 20 69 6e 20 73 6f 6d 65 20  ** just in some 
22690 6f 74 68 65 72 20 6f 72 64 65 72 20 74 68 61 74  other order that
226a0 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 72 65   provides the re
226b0 71 75 69 72 65 64 20 67 72 6f 75 70 69 6e 67 2e  quired grouping.
226c0 20 48 6f 77 65 76 65 72 2c 0a 2a 2a 20 69 66 20   However,.** if 
226d0 74 68 65 20 57 48 45 52 45 5f 53 4f 52 54 42 59  the WHERE_SORTBY
226e0 47 52 4f 55 50 20 66 6c 61 67 20 69 73 20 61 6c  GROUP flag is al
226f0 73 6f 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  so passed to sql
22700 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
22710 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66  , then.** this f
22720 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63  unction may be c
22730 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 72 65 74  alled on the ret
22740 75 72 6e 65 64 20 57 68 65 72 65 49 6e 66 6f 20  urned WhereInfo 
22750 6f 62 6a 65 63 74 2e 20 49 74 20 72 65 74 75 72  object. It retur
22760 6e 73 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68  ns.** true if th
22770 65 20 72 6f 77 73 20 72 65 61 6c 6c 79 20 77 69  e rows really wi
22780 6c 6c 20 62 65 20 73 6f 72 74 65 64 20 69 6e 20  ll be sorted in 
22790 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 72  the specified or
227a0 64 65 72 2c 20 6f 72 20 66 61 6c 73 65 0a 2a 2a  der, or false.**
227b0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
227c0 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61  * For example, a
227d0 73 73 75 6d 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  ssuming:.**.**  
227e0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 31   CREATE INDEX i1
227f0 20 4f 4e 20 74 31 28 78 2c 20 59 29 3b 0a 2a 2a   ON t1(x, Y);.**
22800 0a 2a 2a 20 74 68 65 6e 0a 2a 2a 0a 2a 2a 20 20  .** then.**.**  
22810 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
22820 31 20 47 52 4f 55 50 20 42 59 20 78 2c 79 20 4f  1 GROUP BY x,y O
22830 52 44 45 52 20 42 59 20 78 2c 79 3b 20 20 20 2d  RDER BY x,y;   -
22840 2d 20 49 73 53 6f 72 74 65 64 28 29 3d 3d 31 0a  - IsSorted()==1.
22850 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
22860 4f 4d 20 74 31 20 47 52 4f 55 50 20 42 59 20 79  OM t1 GROUP BY y
22870 2c 78 20 4f 52 44 45 52 20 42 59 20 79 2c 78 3b  ,x ORDER BY y,x;
22880 20 20 20 2d 2d 20 49 73 53 6f 72 74 65 64 28 29     -- IsSorted()
22890 3d 3d 30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ==0.*/.int sqlit
228a0 65 33 57 68 65 72 65 49 73 53 6f 72 74 65 64 28  e3WhereIsSorted(
228b0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
228c0 6f 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 57  o){.  assert( pW
228d0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
228e0 20 26 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59   & WHERE_GROUPBY
228f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   );.  assert( pW
22900 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
22910 20 26 20 57 48 45 52 45 5f 53 4f 52 54 42 59 47   & WHERE_SORTBYG
22920 52 4f 55 50 20 29 3b 0a 20 20 72 65 74 75 72 6e  ROUP );.  return
22930 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 3b   pWInfo->sorted;
22940 0a 7d 0a 0a 23 69 66 64 65 66 20 57 48 45 52 45  .}..#ifdef WHERE
22950 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 2f 2a  TRACE_ENABLED./*
22960 20 46 6f 72 20 64 65 62 75 67 67 69 6e 67 20 75   For debugging u
22970 73 65 20 6f 6e 6c 79 3a 20 2a 2f 0a 73 74 61 74  se only: */.stat
22980 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77  ic const char *w
22990 68 65 72 65 50 61 74 68 4e 61 6d 65 28 57 68 65  herePathName(Whe
229a0 72 65 50 61 74 68 20 2a 70 50 61 74 68 2c 20 69  rePath *pPath, i
229b0 6e 74 20 6e 4c 6f 6f 70 2c 20 57 68 65 72 65 4c  nt nLoop, WhereL
229c0 6f 6f 70 20 2a 70 4c 61 73 74 29 7b 0a 20 20 73  oop *pLast){.  s
229d0 74 61 74 69 63 20 63 68 61 72 20 7a 4e 61 6d 65  tatic char zName
229e0 5b 36 35 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  [65];.  int i;. 
229f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4c 6f 6f   for(i=0; i<nLoo
22a00 70 3b 20 69 2b 2b 29 7b 20 7a 4e 61 6d 65 5b 69  p; i++){ zName[i
22a10 5d 20 3d 20 70 50 61 74 68 2d 3e 61 4c 6f 6f 70  ] = pPath->aLoop
22a20 5b 69 5d 2d 3e 63 49 64 3b 20 7d 0a 20 20 69 66  [i]->cId; }.  if
22a30 28 20 70 4c 61 73 74 20 29 20 7a 4e 61 6d 65 5b  ( pLast ) zName[
22a40 69 2b 2b 5d 20 3d 20 70 4c 61 73 74 2d 3e 63 49  i++] = pLast->cI
22a50 64 3b 0a 20 20 7a 4e 61 6d 65 5b 69 5d 20 3d 20  d;.  zName[i] = 
22a60 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d  0;.  return zNam
22a70 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e;.}.#endif../*.
22a80 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 6f  ** Return the co
22a90 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20 6e 52  st of sorting nR
22aa0 6f 77 20 72 6f 77 73 2c 20 61 73 73 75 6d 69 6e  ow rows, assumin
22ab0 67 20 74 68 61 74 20 74 68 65 20 6b 65 79 73 20  g that the keys 
22ac0 68 61 76 65 20 0a 2a 2a 20 6e 4f 72 64 65 72 62  have .** nOrderb
22ad0 79 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 74 68  y columns and th
22ae0 61 74 20 74 68 65 20 66 69 72 73 74 20 6e 53 6f  at the first nSo
22af0 72 74 65 64 20 63 6f 6c 75 6d 6e 73 20 61 72 65  rted columns are
22b00 20 61 6c 72 65 61 64 79 20 69 6e 0a 2a 2a 20 6f   already in.** o
22b10 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
22b20 4c 6f 67 45 73 74 20 77 68 65 72 65 53 6f 72 74  LogEst whereSort
22b30 69 6e 67 43 6f 73 74 28 0a 20 20 57 68 65 72 65  ingCost(.  Where
22b40 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 0a 20 20  Info *pWInfo,.  
22b50 4c 6f 67 45 73 74 20 6e 52 6f 77 2c 0a 20 20 69  LogEst nRow,.  i
22b60 6e 74 20 6e 4f 72 64 65 72 42 79 2c 0a 20 20 69  nt nOrderBy,.  i
22b70 6e 74 20 6e 53 6f 72 74 65 64 0a 29 7b 0a 20 20  nt nSorted.){.  
22b80 2f 2a 20 54 55 4e 49 4e 47 3a 20 45 73 74 69 6d  /* TUNING: Estim
22b90 61 74 65 64 20 63 6f 73 74 20 6f 66 20 61 20 66  ated cost of a f
22ba0 75 6c 6c 20 65 78 74 65 72 6e 61 6c 20 73 6f 72  ull external sor
22bb0 74 2c 20 77 68 65 72 65 20 4e 20 69 73 20 0a 20  t, where N is . 
22bc0 20 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   ** the number o
22bd0 66 20 72 6f 77 73 20 74 6f 20 73 6f 72 74 20 69  f rows to sort i
22be0 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 63  s:.  **.  **   c
22bf0 6f 73 74 20 3d 20 28 33 2e 30 20 2a 20 4e 20 2a  ost = (3.0 * N *
22c00 20 6c 6f 67 28 4e 29 29 2e 0a 20 20 2a 2a 20 0a   log(N))..  ** .
22c10 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20    ** Or, if the 
22c20 6f 72 64 65 72 2d 62 79 20 63 6c 61 75 73 65 20  order-by clause 
22c30 68 61 73 20 58 20 74 65 72 6d 73 20 62 75 74 20  has X terms but 
22c40 6f 6e 6c 79 20 74 68 65 20 6c 61 73 74 20 59 20  only the last Y 
22c50 0a 20 20 2a 2a 20 74 65 72 6d 73 20 61 72 65 20  .  ** terms are 
22c60 6f 75 74 20 6f 66 20 6f 72 64 65 72 2c 20 74 68  out of order, th
22c70 65 6e 20 62 6c 6f 63 6b 2d 73 6f 72 74 69 6e 67  en block-sorting
22c80 20 77 69 6c 6c 20 72 65 64 75 63 65 20 74 68 65   will reduce the
22c90 20 0a 20 20 2a 2a 20 73 6f 72 74 69 6e 67 20 63   .  ** sorting c
22ca0 6f 73 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  ost to:.  **.  *
22cb0 2a 20 20 20 63 6f 73 74 20 3d 20 28 33 2e 30 20  *   cost = (3.0 
22cc0 2a 20 4e 20 2a 20 6c 6f 67 28 4e 29 29 20 2a 20  * N * log(N)) * 
22cd0 28 59 2f 58 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20  (Y/X).  **.  ** 
22ce0 54 68 65 20 28 59 2f 58 29 20 74 65 72 6d 20 69  The (Y/X) term i
22cf0 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73  s implemented us
22d00 69 6e 67 20 73 74 61 63 6b 20 76 61 72 69 61 62  ing stack variab
22d10 6c 65 20 72 53 63 61 6c 65 0a 20 20 2a 2a 20 62  le rScale.  ** b
22d20 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 4c 6f 67 45  elow.  */.  LogE
22d30 73 74 20 72 53 63 61 6c 65 2c 20 72 53 6f 72 74  st rScale, rSort
22d40 43 6f 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20  Cost;.  assert( 
22d50 6e 4f 72 64 65 72 42 79 3e 30 20 26 26 20 36 36  nOrderBy>0 && 66
22d60 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
22d70 31 30 30 29 20 29 3b 0a 20 20 72 53 63 61 6c 65  100) );.  rScale
22d80 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67 45 73 74   = sqlite3LogEst
22d90 28 28 6e 4f 72 64 65 72 42 79 2d 6e 53 6f 72 74  ((nOrderBy-nSort
22da0 65 64 29 2a 31 30 30 2f 6e 4f 72 64 65 72 42 79  ed)*100/nOrderBy
22db0 29 20 2d 20 36 36 3b 0a 20 20 72 53 6f 72 74 43  ) - 66;.  rSortC
22dc0 6f 73 74 20 3d 20 6e 52 6f 77 20 2b 20 72 53 63  ost = nRow + rSc
22dd0 61 6c 65 20 2b 20 31 36 3b 0a 0a 20 20 2f 2a 20  ale + 16;..  /* 
22de0 4d 75 6c 74 69 70 6c 65 20 62 79 20 6c 6f 67 28  Multiple by log(
22df0 4d 29 20 77 68 65 72 65 20 4d 20 69 73 20 74 68  M) where M is th
22e00 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  e number of outp
22e10 75 74 20 72 6f 77 73 2e 0a 20 20 2a 2a 20 55 73  ut rows..  ** Us
22e20 65 20 74 68 65 20 4c 49 4d 49 54 20 66 6f 72 20  e the LIMIT for 
22e30 4d 20 69 66 20 69 74 20 69 73 20 73 6d 61 6c 6c  M if it is small
22e40 65 72 20 2a 2f 0a 20 20 69 66 28 20 28 70 57 49  er */.  if( (pWI
22e50 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20  nfo->wctrlFlags 
22e60 26 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49  & WHERE_USE_LIMI
22e70 54 29 21 3d 30 20 26 26 20 70 57 49 6e 66 6f 2d  T)!=0 && pWInfo-
22e80 3e 69 4c 69 6d 69 74 3c 6e 52 6f 77 20 29 7b 0a  >iLimit<nRow ){.
22e90 20 20 20 20 6e 52 6f 77 20 3d 20 70 57 49 6e 66      nRow = pWInf
22ea0 6f 2d 3e 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20  o->iLimit;.  }. 
22eb0 20 72 53 6f 72 74 43 6f 73 74 20 2b 3d 20 65 73   rSortCost += es
22ec0 74 4c 6f 67 28 6e 52 6f 77 29 3b 0a 20 20 72 65  tLog(nRow);.  re
22ed0 74 75 72 6e 20 72 53 6f 72 74 43 6f 73 74 3b 0a  turn rSortCost;.
22ee0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
22ef0 68 65 20 6c 69 73 74 20 6f 66 20 57 68 65 72 65  he list of Where
22f00 4c 6f 6f 70 20 6f 62 6a 65 63 74 73 20 61 74 20  Loop objects at 
22f10 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20  pWInfo->pLoops, 
22f20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
22f30 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69 6e 64  attempts to find
22f40 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   the lowest cost
22f50 20 70 61 74 68 20 74 68 61 74 20 76 69 73 69 74   path that visit
22f60 73 20 65 61 63 68 20 57 68 65 72 65 4c 6f 6f 70  s each WhereLoop
22f70 0a 2a 2a 20 6f 6e 63 65 2e 20 20 54 68 69 73 20  .** once.  This 
22f80 70 61 74 68 20 69 73 20 74 68 65 6e 20 6c 6f 61  path is then loa
22f90 64 65 64 20 69 6e 74 6f 20 74 68 65 20 70 57 49  ded into the pWI
22fa0 6e 66 6f 2d 3e 61 5b 5d 2e 70 57 4c 6f 6f 70 20  nfo->a[].pWLoop 
22fb0 66 69 65 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 73  fields..**.** As
22fc0 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 74 6f  sume that the to
22fd0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  tal number of ou
22fe0 74 70 75 74 20 72 6f 77 73 20 74 68 61 74 20 77  tput rows that w
22ff0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73  ill need to be s
23000 6f 72 74 65 64 0a 2a 2a 20 77 69 6c 6c 20 62 65  orted.** will be
23010 20 6e 52 6f 77 45 73 74 20 28 69 6e 20 74 68 65   nRowEst (in the
23020 20 31 30 2a 6c 6f 67 32 20 72 65 70 72 65 73 65   10*log2 represe
23030 6e 74 61 74 69 6f 6e 29 2e 20 20 4f 72 2c 20 69  ntation).  Or, i
23040 67 6e 6f 72 65 20 73 6f 72 74 69 6e 67 0a 2a 2a  gnore sorting.**
23050 20 63 6f 73 74 73 20 69 66 20 6e 52 6f 77 45 73   costs if nRowEs
23060 74 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  t==0..**.** Retu
23070 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
23080 73 75 63 63 65 73 73 20 6f 72 20 53 51 4c 49 54  success or SQLIT
23090 45 5f 4e 4f 4d 45 4d 20 6f 66 20 61 20 6d 65 6d  E_NOMEM of a mem
230a0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ory allocation.*
230b0 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  * error occurs..
230c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
230d0 65 72 65 50 61 74 68 53 6f 6c 76 65 72 28 57 68  erePathSolver(Wh
230e0 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c  ereInfo *pWInfo,
230f0 20 4c 6f 67 45 73 74 20 6e 52 6f 77 45 73 74 29   LogEst nRowEst)
23100 7b 0a 20 20 69 6e 74 20 6d 78 43 68 6f 69 63 65  {.  int mxChoice
23110 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
23120 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
23130 6f 66 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20  of simultaneous 
23140 70 61 74 68 73 20 74 72 61 63 6b 65 64 20 2a 2f  paths tracked */
23150 0a 20 20 69 6e 74 20 6e 4c 6f 6f 70 3b 20 20 20  .  int nLoop;   
23160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23170 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
23180 69 6e 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 20  in the join */. 
23190 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
231a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
231b0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
231c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
231d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
231e0 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
231f0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
23200 20 69 4c 6f 6f 70 3b 20 20 20 20 20 20 20 20 20   iLoop;         
23210 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
23220 6f 75 6e 74 65 72 20 6f 76 65 72 20 74 68 65 20  ounter over the 
23230 74 65 72 6d 73 20 6f 66 20 74 68 65 20 6a 6f 69  terms of the joi
23240 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 2c 20 6a  n */.  int ii, j
23250 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
23260 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
23270 73 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 49 20 3d  s */.  int mxI =
23280 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
23290 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78   /* Index of nex
232a0 74 20 65 6e 74 72 79 20 74 6f 20 72 65 70 6c 61  t entry to repla
232b0 63 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 72 64  ce */.  int nOrd
232c0 65 72 42 79 3b 20 20 20 20 20 20 20 20 20 20 20  erBy;           
232d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f    /* Number of O
232e0 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74  RDER BY clause t
232f0 65 72 6d 73 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  erms */.  LogEst
23300 20 6d 78 43 6f 73 74 20 3d 20 30 3b 20 20 20 20   mxCost = 0;    
23310 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63      /* Maximum c
23320 6f 73 74 20 6f 66 20 61 20 73 65 74 20 6f 66 20  ost of a set of 
23330 70 61 74 68 73 20 2a 2f 0a 20 20 4c 6f 67 45 73  paths */.  LogEs
23340 74 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d 20 30  t mxUnsorted = 0
23350 3b 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  ;    /* Maximum 
23360 75 6e 73 6f 72 74 65 64 20 63 6f 73 74 20 6f 66  unsorted cost of
23370 20 61 20 73 65 74 20 6f 66 20 70 61 74 68 20 2a   a set of path *
23380 2f 0a 20 20 69 6e 74 20 6e 54 6f 2c 20 6e 46 72  /.  int nTo, nFr
23390 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  om;           /*
233a0 20 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   Number of valid
233b0 20 65 6e 74 72 69 65 73 20 69 6e 20 61 54 6f 5b   entries in aTo[
233c0 5d 20 61 6e 64 20 61 46 72 6f 6d 5b 5d 20 2a 2f  ] and aFrom[] */
233d0 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 61 46  .  WherePath *aF
233e0 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  rom;         /* 
233f0 41 6c 6c 20 6e 46 72 6f 6d 20 70 61 74 68 73 20  All nFrom paths 
23400 61 74 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  at the previous 
23410 6c 65 76 65 6c 20 2a 2f 0a 20 20 57 68 65 72 65  level */.  Where
23420 50 61 74 68 20 2a 61 54 6f 3b 20 20 20 20 20 20  Path *aTo;      
23430 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 54 6f 20       /* The nTo 
23440 62 65 73 74 20 70 61 74 68 73 20 61 74 20 74 68  best paths at th
23450 65 20 63 75 72 72 65 6e 74 20 6c 65 76 65 6c 20  e current level 
23460 2a 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a  */.  WherePath *
23470 70 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 2f  pFrom;         /
23480 2a 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20  * An element of 
23490 61 46 72 6f 6d 5b 5d 20 74 68 61 74 20 77 65 20  aFrom[] that we 
234a0 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a  are working on *
234b0 2f 0a 20 20 57 68 65 72 65 50 61 74 68 20 2a 70  /.  WherePath *p
234c0 54 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  To;           /*
234d0 20 41 6e 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61   An element of a
234e0 54 6f 5b 5d 20 74 68 61 74 20 77 65 20 61 72 65  To[] that we are
234f0 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20   working on */. 
23500 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 57 4c 6f   WhereLoop *pWLo
23510 6f 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  op;        /* On
23520 65 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f  e of the WhereLo
23530 6f 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  op objects */.  
23540 57 68 65 72 65 4c 6f 6f 70 20 2a 2a 70 58 3b 20  WhereLoop **pX; 
23550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
23560 64 20 74 6f 20 64 69 76 79 20 75 70 20 74 68 65  d to divy up the
23570 20 70 53 70 61 63 65 20 6d 65 6d 6f 72 79 20 2a   pSpace memory *
23580 2f 0a 20 20 4c 6f 67 45 73 74 20 2a 61 53 6f 72  /.  LogEst *aSor
23590 74 43 6f 73 74 20 3d 20 30 3b 20 20 20 20 2f 2a  tCost = 0;    /*
235a0 20 53 6f 72 74 69 6e 67 20 61 6e 64 20 70 61 72   Sorting and par
235b0 74 69 61 6c 20 73 6f 72 74 69 6e 67 20 63 6f 73  tial sorting cos
235c0 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53  ts */.  char *pS
235d0 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
235e0 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 6d    /* Temporary m
235f0 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68  emory used by th
23600 69 73 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  is routine */.  
23610 69 6e 74 20 6e 53 70 61 63 65 3b 20 20 20 20 20  int nSpace;     
23620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
23630 65 73 20 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f  es of space allo
23640 63 61 74 65 64 20 61 74 20 70 53 70 61 63 65 20  cated at pSpace 
23650 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70  */..  pParse = p
23660 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20  WInfo->pParse;. 
23670 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
23680 3b 0a 20 20 6e 4c 6f 6f 70 20 3d 20 70 57 49 6e  ;.  nLoop = pWIn
23690 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 2f 2a  fo->nLevel;.  /*
236a0 20 54 55 4e 49 4e 47 3a 20 46 6f 72 20 73 69 6d   TUNING: For sim
236b0 70 6c 65 20 71 75 65 72 69 65 73 2c 20 6f 6e 6c  ple queries, onl
236c0 79 20 74 68 65 20 62 65 73 74 20 70 61 74 68 20  y the best path 
236d0 69 73 20 74 72 61 63 6b 65 64 2e 0a 20 20 2a 2a  is tracked..  **
236e0 20 46 6f 72 20 32 2d 77 61 79 20 6a 6f 69 6e 73   For 2-way joins
236f0 2c 20 74 68 65 20 35 20 62 65 73 74 20 70 61 74  , the 5 best pat
23700 68 73 20 61 72 65 20 66 6f 6c 6c 6f 77 65 64 2e  hs are followed.
23710 0a 20 20 2a 2a 20 46 6f 72 20 6a 6f 69 6e 73 20  .  ** For joins 
23720 6f 66 20 33 20 6f 72 20 6d 6f 72 65 20 74 61 62  of 3 or more tab
23730 6c 65 73 2c 20 74 72 61 63 6b 20 74 68 65 20 31  les, track the 1
23740 30 20 62 65 73 74 20 70 61 74 68 73 20 2a 2f 0a  0 best paths */.
23750 20 20 6d 78 43 68 6f 69 63 65 20 3d 20 28 6e 4c    mxChoice = (nL
23760 6f 6f 70 3c 3d 31 29 20 3f 20 31 20 3a 20 28 6e  oop<=1) ? 1 : (n
23770 4c 6f 6f 70 3d 3d 32 20 3f 20 35 20 3a 20 31 30  Loop==2 ? 5 : 10
23780 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4c 6f  );.  assert( nLo
23790 6f 70 3c 3d 70 57 49 6e 66 6f 2d 3e 70 54 61 62  op<=pWInfo->pTab
237a0 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20  List->nSrc );.  
237b0 57 48 45 52 45 54 52 41 43 45 28 30 78 30 30 32  WHERETRACE(0x002
237c0 2c 20 28 22 2d 2d 2d 2d 20 62 65 67 69 6e 20 73  , ("---- begin s
237d0 6f 6c 76 65 72 2e 20 20 28 6e 52 6f 77 45 73 74  olver.  (nRowEst
237e0 3d 25 64 29 5c 6e 22 2c 20 6e 52 6f 77 45 73 74  =%d)\n", nRowEst
237f0 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e 52 6f  ));..  /* If nRo
23800 77 45 73 74 20 69 73 20 7a 65 72 6f 20 61 6e 64  wEst is zero and
23810 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
23820 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69 67  ER BY clause, ig
23830 6e 6f 72 65 20 69 74 2e 20 49 6e 20 74 68 69 73  nore it. In this
23840 0a 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 70  .  ** case the p
23850 75 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63  urpose of this c
23860 61 6c 6c 20 69 73 20 74 6f 20 65 73 74 69 6d 61  all is to estima
23870 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
23880 20 72 6f 77 73 20 72 65 74 75 72 6e 65 64 0a 20   rows returned. 
23890 20 2a 2a 20 62 79 20 74 68 65 20 6f 76 65 72 61   ** by the overa
238a0 6c 6c 20 71 75 65 72 79 2e 20 4f 6e 63 65 20 74  ll query. Once t
238b0 68 69 73 20 65 73 74 69 6d 61 74 65 20 68 61 73  his estimate has
238c0 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20   been obtained, 
238d0 74 68 65 20 63 61 6c 6c 65 72 0a 20 20 2a 2a 20  the caller.  ** 
238e0 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 69 73  will invoke this
238f0 20 66 75 6e 63 74 69 6f 6e 20 61 20 73 65 63 6f   function a seco
23900 6e 64 20 74 69 6d 65 2c 20 70 61 73 73 69 6e 67  nd time, passing
23910 20 74 68 65 20 65 73 74 69 6d 61 74 65 20 61 73   the estimate as
23920 20 74 68 65 0a 20 20 2a 2a 20 6e 52 6f 77 45 73   the.  ** nRowEs
23930 74 20 70 61 72 61 6d 65 74 65 72 2e 20 20 2a 2f  t parameter.  */
23940 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70  .  if( pWInfo->p
23950 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 6e 52  OrderBy==0 || nR
23960 6f 77 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  owEst==0 ){.    
23970 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  nOrderBy = 0;.  
23980 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4f 72 64 65  }else{.    nOrde
23990 72 42 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 4f  rBy = pWInfo->pO
239a0 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
239b0 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
239c0 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
239d0 20 73 70 61 63 65 20 66 6f 72 20 61 54 6f 2c 20   space for aTo, 
239e0 61 46 72 6f 6d 20 61 6e 64 20 61 53 6f 72 74 43  aFrom and aSortC
239f0 6f 73 74 5b 5d 20 2a 2f 0a 20 20 6e 53 70 61 63  ost[] */.  nSpac
23a00 65 20 3d 20 28 73 69 7a 65 6f 66 28 57 68 65 72  e = (sizeof(Wher
23a10 65 50 61 74 68 29 2b 73 69 7a 65 6f 66 28 57 68  ePath)+sizeof(Wh
23a20 65 72 65 4c 6f 6f 70 2a 29 2a 6e 4c 6f 6f 70 29  ereLoop*)*nLoop)
23a30 2a 6d 78 43 68 6f 69 63 65 2a 32 3b 0a 20 20 6e  *mxChoice*2;.  n
23a40 53 70 61 63 65 20 2b 3d 20 73 69 7a 65 6f 66 28  Space += sizeof(
23a50 4c 6f 67 45 73 74 29 20 2a 20 6e 4f 72 64 65 72  LogEst) * nOrder
23a60 42 79 3b 0a 20 20 70 53 70 61 63 65 20 3d 20 73  By;.  pSpace = s
23a70 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
23a80 77 4e 4e 28 64 62 2c 20 6e 53 70 61 63 65 29 3b  wNN(db, nSpace);
23a90 0a 20 20 69 66 28 20 70 53 70 61 63 65 3d 3d 30  .  if( pSpace==0
23aa0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
23ab0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 61  _NOMEM_BKPT;.  a
23ac0 54 6f 20 3d 20 28 57 68 65 72 65 50 61 74 68 2a  To = (WherePath*
23ad0 29 70 53 70 61 63 65 3b 0a 20 20 61 46 72 6f 6d  )pSpace;.  aFrom
23ae0 20 3d 20 61 54 6f 2b 6d 78 43 68 6f 69 63 65 3b   = aTo+mxChoice;
23af0 0a 20 20 6d 65 6d 73 65 74 28 61 46 72 6f 6d 2c  .  memset(aFrom,
23b00 20 30 2c 20 73 69 7a 65 6f 66 28 61 46 72 6f 6d   0, sizeof(aFrom
23b10 5b 30 5d 29 29 3b 0a 20 20 70 58 20 3d 20 28 57  [0]));.  pX = (W
23b20 68 65 72 65 4c 6f 6f 70 2a 2a 29 28 61 46 72 6f  hereLoop**)(aFro
23b30 6d 2b 6d 78 43 68 6f 69 63 65 29 3b 0a 20 20 66  m+mxChoice);.  f
23b40 6f 72 28 69 69 3d 6d 78 43 68 6f 69 63 65 2a 32  or(ii=mxChoice*2
23b50 2c 20 70 46 72 6f 6d 3d 61 54 6f 3b 20 69 69 3e  , pFrom=aTo; ii>
23b60 30 3b 20 69 69 2d 2d 2c 20 70 46 72 6f 6d 2b 2b  0; ii--, pFrom++
23b70 2c 20 70 58 20 2b 3d 20 6e 4c 6f 6f 70 29 7b 0a  , pX += nLoop){.
23b80 20 20 20 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70      pFrom->aLoop
23b90 20 3d 20 70 58 3b 0a 20 20 7d 0a 20 20 69 66 28   = pX;.  }.  if(
23ba0 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   nOrderBy ){.   
23bb0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
23bc0 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
23bd0 73 65 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74  se and it is not
23be0 20 62 65 69 6e 67 20 69 67 6e 6f 72 65 64 2c 20   being ignored, 
23bf0 73 65 74 20 75 70 0a 20 20 20 20 2a 2a 20 73 70  set up.    ** sp
23c00 61 63 65 20 66 6f 72 20 74 68 65 20 61 53 6f 72  ace for the aSor
23c10 74 43 6f 73 74 5b 5d 20 61 72 72 61 79 2e 20 45  tCost[] array. E
23c20 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ach element of t
23c30 68 65 20 61 53 6f 72 74 43 6f 73 74 20 61 72 72  he aSortCost arr
23c40 61 79 0a 20 20 20 20 2a 2a 20 69 73 20 65 69 74  ay.    ** is eit
23c50 68 65 72 20 7a 65 72 6f 20 2d 20 6d 65 61 6e 69  her zero - meani
23c60 6e 67 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65  ng it has not ye
23c70 74 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a  t been initializ
23c80 65 64 20 2d 20 6f 72 20 74 68 65 0a 20 20 20 20  ed - or the.    
23c90 2a 2a 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69  ** cost of sorti
23ca0 6e 67 20 6e 52 6f 77 45 73 74 20 72 6f 77 73 20  ng nRowEst rows 
23cb0 6f 66 20 64 61 74 61 20 77 68 65 72 65 20 74 68  of data where th
23cc0 65 20 66 69 72 73 74 20 58 20 74 65 72 6d 73 20  e first X terms 
23cd0 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 4f 52  of.    ** the OR
23ce0 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
23cf0 65 20 61 6c 72 65 61 64 79 20 69 6e 20 6f 72 64  e already in ord
23d00 65 72 2c 20 77 68 65 72 65 20 58 20 69 73 20 74  er, where X is t
23d10 68 65 20 61 72 72 61 79 20 0a 20 20 20 20 2a 2a  he array .    **
23d20 20 69 6e 64 65 78 2e 20 20 2a 2f 0a 20 20 20 20   index.  */.    
23d30 61 53 6f 72 74 43 6f 73 74 20 3d 20 28 4c 6f 67  aSortCost = (Log
23d40 45 73 74 2a 29 70 58 3b 0a 20 20 20 20 6d 65 6d  Est*)pX;.    mem
23d50 73 65 74 28 61 53 6f 72 74 43 6f 73 74 2c 20 30  set(aSortCost, 0
23d60 2c 20 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29  , sizeof(LogEst)
23d70 20 2a 20 6e 4f 72 64 65 72 42 79 29 3b 0a 20 20   * nOrderBy);.  
23d80 7d 0a 20 20 61 73 73 65 72 74 28 20 61 53 6f 72  }.  assert( aSor
23d90 74 43 6f 73 74 3d 3d 30 20 7c 7c 20 26 70 53 70  tCost==0 || &pSp
23da0 61 63 65 5b 6e 53 70 61 63 65 5d 3d 3d 28 63 68  ace[nSpace]==(ch
23db0 61 72 2a 29 26 61 53 6f 72 74 43 6f 73 74 5b 6e  ar*)&aSortCost[n
23dc0 4f 72 64 65 72 42 79 5d 20 29 3b 0a 20 20 61 73  OrderBy] );.  as
23dd0 73 65 72 74 28 20 61 53 6f 72 74 43 6f 73 74 21  sert( aSortCost!
23de0 3d 30 20 7c 7c 20 26 70 53 70 61 63 65 5b 6e 53  =0 || &pSpace[nS
23df0 70 61 63 65 5d 3d 3d 28 63 68 61 72 2a 29 70 58  pace]==(char*)pX
23e00 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 65 64 20 74   );..  /* Seed t
23e10 68 65 20 73 65 61 72 63 68 20 77 69 74 68 20 61  he search with a
23e20 20 73 69 6e 67 6c 65 20 57 68 65 72 65 50 61 74   single WherePat
23e30 68 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72  h containing zer
23e40 6f 20 57 68 65 72 65 4c 6f 6f 70 73 2e 0a 20 20  o WhereLoops..  
23e50 2a 2a 0a 20 20 2a 2a 20 54 55 4e 49 4e 47 3a 20  **.  ** TUNING: 
23e60 44 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20 6e  Do not let the n
23e70 75 6d 62 65 72 20 6f 66 20 69 74 65 72 61 74 69  umber of iterati
23e80 6f 6e 73 20 67 6f 20 61 62 6f 76 65 20 32 38 2e  ons go above 28.
23e90 20 20 49 66 20 74 68 65 20 63 6f 73 74 0a 20 20    If the cost.  
23ea0 2a 2a 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20  ** of computing 
23eb0 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
23ec0 65 78 20 69 73 20 6e 6f 74 20 70 61 69 64 20 62  ex is not paid b
23ed0 61 63 6b 20 77 69 74 68 69 6e 20 74 68 65 20 66  ack within the f
23ee0 69 72 73 74 20 32 38 0a 20 20 2a 2a 20 72 6f 77  irst 28.  ** row
23ef0 73 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 75  s, then do not u
23f00 73 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63  se the automatic
23f10 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 46 72   index. */.  aFr
23f20 6f 6d 5b 30 5d 2e 6e 52 6f 77 20 3d 20 4d 49 4e  om[0].nRow = MIN
23f30 28 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c  (pParse->nQueryL
23f40 6f 6f 70 2c 20 34 38 29 3b 20 20 61 73 73 65 72  oop, 48);  asser
23f50 74 28 20 34 38 3d 3d 73 71 6c 69 74 65 33 4c 6f  t( 48==sqlite3Lo
23f60 67 45 73 74 28 32 38 29 20 29 3b 0a 20 20 6e 46  gEst(28) );.  nF
23f70 72 6f 6d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72  rom = 1;.  asser
23f80 74 28 20 61 46 72 6f 6d 5b 30 5d 2e 69 73 4f 72  t( aFrom[0].isOr
23f90 64 65 72 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  dered==0 );.  if
23fa0 28 20 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( nOrderBy ){.  
23fb0 20 20 2f 2a 20 49 66 20 6e 4c 6f 6f 70 20 69 73    /* If nLoop is
23fc0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 72   zero, then ther
23fd0 65 20 61 72 65 20 6e 6f 20 46 52 4f 4d 20 74 65  e are no FROM te
23fe0 72 6d 73 20 69 6e 20 74 68 65 20 71 75 65 72 79  rms in the query
23ff0 2e 20 53 69 6e 63 65 0a 20 20 20 20 2a 2a 20 69  . Since.    ** i
24000 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
24010 71 75 65 72 79 20 6d 61 79 20 72 65 74 75 72 6e  query may return
24020 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6f 6e   a maximum of on
24030 65 20 72 6f 77 2c 20 74 68 65 20 72 65 73 75 6c  e row, the resul
24040 74 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6c  ts.    ** are al
24050 72 65 61 64 79 20 69 6e 20 74 68 65 20 72 65 71  ready in the req
24060 75 65 73 74 65 64 20 6f 72 64 65 72 2e 20 53 65  uested order. Se
24070 74 20 69 73 4f 72 64 65 72 65 64 20 74 6f 20 6e  t isOrdered to n
24080 4f 72 64 65 72 42 79 20 74 6f 0a 20 20 20 20 2a  OrderBy to.    *
24090 2a 20 69 6e 64 69 63 61 74 65 20 74 68 69 73 2e  * indicate this.
240a0 20 4f 72 2c 20 69 66 20 6e 4c 6f 6f 70 20 69 73   Or, if nLoop is
240b0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
240c0 72 6f 2c 20 73 65 74 20 69 73 4f 72 64 65 72 65  ro, set isOrdere
240d0 64 20 74 6f 0a 20 20 20 20 2a 2a 20 2d 31 2c 20  d to.    ** -1, 
240e0 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
240f0 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6d  the result set m
24100 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
24110 20 6f 72 64 65 72 65 64 2c 20 0a 20 20 20 20 2a   ordered, .    *
24120 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  * depending on t
24130 68 65 20 6c 6f 6f 70 73 20 61 64 64 65 64 20 74  he loops added t
24140 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6c  o the current pl
24150 61 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 46 72 6f  an.  */.    aFro
24160 6d 5b 30 5d 2e 69 73 4f 72 64 65 72 65 64 20 3d  m[0].isOrdered =
24170 20 6e 4c 6f 6f 70 3e 30 20 3f 20 2d 31 20 3a 20   nLoop>0 ? -1 : 
24180 6e 4f 72 64 65 72 42 79 3b 0a 20 20 7d 0a 0a 20  nOrderBy;.  }.. 
24190 20 2f 2a 20 43 6f 6d 70 75 74 65 20 73 75 63 63   /* Compute succ
241a0 65 73 73 69 76 65 6c 79 20 6c 6f 6e 67 65 72 20  essively longer 
241b0 57 68 65 72 65 50 61 74 68 73 20 75 73 69 6e 67  WherePaths using
241c0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 67 65   the previous ge
241d0 6e 65 72 61 74 69 6f 6e 0a 20 20 2a 2a 20 6f 66  neration.  ** of
241e0 20 57 68 65 72 65 50 61 74 68 73 20 61 73 20 74   WherePaths as t
241f0 68 65 20 62 61 73 69 73 20 66 6f 72 20 74 68 65  he basis for the
24200 20 6e 65 78 74 2e 20 20 4b 65 65 70 20 74 72 61   next.  Keep tra
24210 63 6b 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69  ck of the mxChoi
24220 63 65 0a 20 20 2a 2a 20 62 65 73 74 20 70 61 74  ce.  ** best pat
24230 68 73 20 61 74 20 65 61 63 68 20 67 65 6e 65 72  hs at each gener
24240 61 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 69  ation */.  for(i
24250 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f 70 3c 6e 4c  Loop=0; iLoop<nL
24260 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b 29 7b 0a 20  oop; iLoop++){. 
24270 20 20 20 6e 54 6f 20 3d 20 30 3b 0a 20 20 20 20     nTo = 0;.    
24280 66 6f 72 28 69 69 3d 30 2c 20 70 46 72 6f 6d 3d  for(ii=0, pFrom=
24290 61 46 72 6f 6d 3b 20 69 69 3c 6e 46 72 6f 6d 3b  aFrom; ii<nFrom;
242a0 20 69 69 2b 2b 2c 20 70 46 72 6f 6d 2b 2b 29 7b   ii++, pFrom++){
242b0 0a 20 20 20 20 20 20 66 6f 72 28 70 57 4c 6f 6f  .      for(pWLoo
242c0 70 3d 70 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73  p=pWInfo->pLoops
242d0 3b 20 70 57 4c 6f 6f 70 3b 20 70 57 4c 6f 6f 70  ; pWLoop; pWLoop
242e0 3d 70 57 4c 6f 6f 70 2d 3e 70 4e 65 78 74 4c 6f  =pWLoop->pNextLo
242f0 6f 70 29 7b 0a 20 20 20 20 20 20 20 20 4c 6f 67  op){.        Log
24300 45 73 74 20 6e 4f 75 74 3b 20 20 20 20 20 20 20  Est nOut;       
24310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24320 2a 20 52 6f 77 73 20 76 69 73 69 74 65 64 20 62  * Rows visited b
24330 79 20 28 70 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29  y (pFrom+pWLoop)
24340 20 2a 2f 0a 20 20 20 20 20 20 20 20 4c 6f 67 45   */.        LogE
24350 73 74 20 72 43 6f 73 74 3b 20 20 20 20 20 20 20  st rCost;       
24360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24370 20 43 6f 73 74 20 6f 66 20 70 61 74 68 20 28 70   Cost of path (p
24380 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a  From+pWLoop) */.
24390 20 20 20 20 20 20 20 20 4c 6f 67 45 73 74 20 72          LogEst r
243a0 55 6e 73 6f 72 74 65 64 3b 20 20 20 20 20 20 20  Unsorted;       
243b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
243c0 6f 72 74 65 64 20 63 6f 73 74 20 6f 66 20 28 70  orted cost of (p
243d0 46 72 6f 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a  From+pWLoop) */.
243e0 20 20 20 20 20 20 20 20 69 38 20 69 73 4f 72 64          i8 isOrd
243f0 65 72 65 64 20 3d 20 70 46 72 6f 6d 2d 3e 69 73  ered = pFrom->is
24400 4f 72 64 65 72 65 64 3b 20 20 2f 2a 20 69 73 4f  Ordered;  /* isO
24410 72 64 65 72 65 64 20 66 6f 72 20 28 70 46 72 6f  rdered for (pFro
24420 6d 2b 70 57 4c 6f 6f 70 29 20 2a 2f 0a 20 20 20  m+pWLoop) */.   
24430 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73       Bitmask mas
24440 6b 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  kNew;           
24450 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
24460 66 20 73 72 63 20 76 69 73 69 74 65 64 20 62 79  f src visited by
24470 20 28 2e 2e 29 20 2a 2f 0a 20 20 20 20 20 20 20   (..) */.       
24480 20 42 69 74 6d 61 73 6b 20 72 65 76 4d 61 73 6b   Bitmask revMask
24490 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
244a0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 72 65     /* Mask of re
244b0 76 2d 6f 72 64 65 72 20 6c 6f 6f 70 73 20 66 6f  v-order loops fo
244c0 72 20 28 2e 2e 29 20 2a 2f 0a 0a 20 20 20 20 20  r (..) */..     
244d0 20 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e     if( (pWLoop->
244e0 70 72 65 72 65 71 20 26 20 7e 70 46 72 6f 6d 2d  prereq & ~pFrom-
244f0 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20  >maskLoop)!=0 ) 
24500 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
24510 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 6d    if( (pWLoop->m
24520 61 73 6b 53 65 6c 66 20 26 20 70 46 72 6f 6d 2d  askSelf & pFrom-
24530 3e 6d 61 73 6b 4c 6f 6f 70 29 21 3d 30 20 29 20  >maskLoop)!=0 ) 
24540 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
24550 20 20 69 66 28 20 28 70 57 4c 6f 6f 70 2d 3e 77    if( (pWLoop->w
24560 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 41  sFlags & WHERE_A
24570 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30 20 26 26  UTO_INDEX)!=0 &&
24580 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3c 31 30 20   pFrom->nRow<10 
24590 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
245a0 44 6f 20 6e 6f 74 20 75 73 65 20 61 6e 20 61 75  Do not use an au
245b0 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 69 66  tomatic index if
245c0 20 74 68 65 20 74 68 69 73 20 6c 6f 6f 70 20 69   the this loop i
245d0 73 20 65 78 70 65 63 74 65 64 0a 20 20 20 20 20  s expected.     
245e0 20 20 20 20 20 2a 2a 20 74 6f 20 72 75 6e 20 6c       ** to run l
245f0 65 73 73 20 74 68 61 6e 20 32 20 74 69 6d 65 73  ess than 2 times
24600 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  . */.          a
24610 73 73 65 72 74 28 20 31 30 3d 3d 73 71 6c 69 74  ssert( 10==sqlit
24620 65 33 4c 6f 67 45 73 74 28 32 29 20 29 3b 0a 20  e3LogEst(2) );. 
24630 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
24640 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
24650 20 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20       /* At this 
24660 70 6f 69 6e 74 2c 20 70 57 4c 6f 6f 70 20 69 73  point, pWLoop is
24670 20 61 20 63 61 6e 64 69 64 61 74 65 20 74 6f 20   a candidate to 
24680 62 65 20 74 68 65 20 6e 65 78 74 20 6c 6f 6f 70  be the next loop
24690 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 6f  . .        ** Co
246a0 6d 70 75 74 65 20 69 74 73 20 63 6f 73 74 20 2a  mpute its cost *
246b0 2f 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72  /.        rUnsor
246c0 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f 67  ted = sqlite3Log
246d0 45 73 74 41 64 64 28 70 57 4c 6f 6f 70 2d 3e 72  EstAdd(pWLoop->r
246e0 53 65 74 75 70 2c 70 57 4c 6f 6f 70 2d 3e 72 52  Setup,pWLoop->rR
246f0 75 6e 20 2b 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77  un + pFrom->nRow
24700 29 3b 0a 20 20 20 20 20 20 20 20 72 55 6e 73 6f  );.        rUnso
24710 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4c 6f  rted = sqlite3Lo
24720 67 45 73 74 41 64 64 28 72 55 6e 73 6f 72 74 65  gEstAdd(rUnsorte
24730 64 2c 20 70 46 72 6f 6d 2d 3e 72 55 6e 73 6f 72  d, pFrom->rUnsor
24740 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 4f  ted);.        nO
24750 75 74 20 3d 20 70 46 72 6f 6d 2d 3e 6e 52 6f 77  ut = pFrom->nRow
24760 20 2b 20 70 57 4c 6f 6f 70 2d 3e 6e 4f 75 74 3b   + pWLoop->nOut;
24770 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 4e 65 77  .        maskNew
24780 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f   = pFrom->maskLo
24790 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73  op | pWLoop->mas
247a0 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 69  kSelf;.        i
247b0 66 28 20 69 73 4f 72 64 65 72 65 64 3c 30 20 29  f( isOrdered<0 )
247c0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 73 4f 72  {.          isOr
247d0 64 65 72 65 64 20 3d 20 77 68 65 72 65 50 61 74  dered = wherePat
247e0 68 53 61 74 69 73 66 69 65 73 4f 72 64 65 72 42  hSatisfiesOrderB
247f0 79 28 70 57 49 6e 66 6f 2c 0a 20 20 20 20 20 20  y(pWInfo,.      
24800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24810 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
24820 79 2c 20 70 46 72 6f 6d 2c 20 70 57 49 6e 66 6f  y, pFrom, pWInfo
24830 2d 3e 77 63 74 72 6c 46 6c 61 67 73 2c 0a 20 20  ->wctrlFlags,.  
24840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24850 20 20 20 20 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f       iLoop, pWLo
24860 6f 70 2c 20 26 72 65 76 4d 61 73 6b 29 3b 0a 20  op, &revMask);. 
24870 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
24880 20 20 20 20 20 20 20 20 72 65 76 4d 61 73 6b 20          revMask 
24890 3d 20 70 46 72 6f 6d 2d 3e 72 65 76 4c 6f 6f 70  = pFrom->revLoop
248a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
248b0 20 20 20 20 69 66 28 20 69 73 4f 72 64 65 72 65      if( isOrdere
248c0 64 3e 3d 30 20 26 26 20 69 73 4f 72 64 65 72 65  d>=0 && isOrdere
248d0 64 3c 6e 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  d<nOrderBy ){.  
248e0 20 20 20 20 20 20 20 20 69 66 28 20 61 53 6f 72          if( aSor
248f0 74 43 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d  tCost[isOrdered]
24900 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
24910 20 20 20 61 53 6f 72 74 43 6f 73 74 5b 69 73 4f     aSortCost[isO
24920 72 64 65 72 65 64 5d 20 3d 20 77 68 65 72 65 53  rdered] = whereS
24930 6f 72 74 69 6e 67 43 6f 73 74 28 0a 20 20 20 20  ortingCost(.    
24940 20 20 20 20 20 20 20 20 20 20 20 20 70 57 49 6e              pWIn
24950 66 6f 2c 20 6e 52 6f 77 45 73 74 2c 20 6e 4f 72  fo, nRowEst, nOr
24960 64 65 72 42 79 2c 20 69 73 4f 72 64 65 72 65 64  derBy, isOrdered
24970 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a  .            );.
24980 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
24990 20 20 20 20 20 20 72 43 6f 73 74 20 3d 20 73 71        rCost = sq
249a0 6c 69 74 65 33 4c 6f 67 45 73 74 41 64 64 28 72  lite3LogEstAdd(r
249b0 55 6e 73 6f 72 74 65 64 2c 20 61 53 6f 72 74 43  Unsorted, aSortC
249c0 6f 73 74 5b 69 73 4f 72 64 65 72 65 64 5d 29 3b  ost[isOrdered]);
249d0 0a 0a 20 20 20 20 20 20 20 20 20 20 57 48 45 52  ..          WHER
249e0 45 54 52 41 43 45 28 30 78 30 30 32 2c 0a 20 20  ETRACE(0x002,.  
249f0 20 20 20 20 20 20 20 20 20 20 20 20 28 22 2d 2d              ("--
24a00 2d 2d 20 73 6f 72 74 20 63 6f 73 74 3d 25 2d 33  -- sort cost=%-3
24a10 64 20 28 25 64 2f 25 64 29 20 69 6e 63 72 65 61  d (%d/%d) increa
24a20 73 65 73 20 63 6f 73 74 20 25 33 64 20 74 6f 20  ses cost %3d to 
24a30 25 2d 33 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %-3d\n",.       
24a40 20 20 20 20 20 20 20 20 61 53 6f 72 74 43 6f 73          aSortCos
24a50 74 5b 69 73 4f 72 64 65 72 65 64 5d 2c 20 28 6e  t[isOrdered], (n
24a60 4f 72 64 65 72 42 79 2d 69 73 4f 72 64 65 72 65  OrderBy-isOrdere
24a70 64 29 2c 20 6e 4f 72 64 65 72 42 79 2c 20 0a 20  d), nOrderBy, . 
24a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 55                rU
24a90 6e 73 6f 72 74 65 64 2c 20 72 43 6f 73 74 29 29  nsorted, rCost))
24aa0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
24ab0 0a 20 20 20 20 20 20 20 20 20 20 72 43 6f 73 74  .          rCost
24ac0 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b 0a 20 20   = rUnsorted;.  
24ad0 20 20 20 20 20 20 20 20 72 55 6e 73 6f 72 74 65          rUnsorte
24ae0 64 20 2d 3d 20 32 3b 20 20 2f 2a 20 54 55 4e 49  d -= 2;  /* TUNI
24af0 4e 47 3a 20 20 53 6c 69 67 68 74 20 62 69 61 73  NG:  Slight bias
24b00 20 69 6e 20 66 61 76 6f 72 20 6f 66 20 6e 6f 2d   in favor of no-
24b10 73 6f 72 74 20 70 6c 61 6e 73 20 2a 2f 0a 20 20  sort plans */.  
24b20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
24b30 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
24b40 20 69 66 20 70 57 4c 6f 6f 70 20 73 68 6f 75 6c   if pWLoop shoul
24b50 64 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  d be added to th
24b60 65 20 73 65 74 20 6f 66 0a 20 20 20 20 20 20 20  e set of.       
24b70 20 2a 2a 20 6d 78 43 68 6f 69 63 65 20 62 65 73   ** mxChoice bes
24b80 74 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 2e 0a  t-so-far paths..
24b90 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
24ba0 20 20 20 2a 2a 20 46 69 72 73 74 20 6c 6f 6f 6b     ** First look
24bb0 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67   for an existing
24bc0 20 70 61 74 68 20 61 6d 6f 6e 67 20 62 65 73 74   path among best
24bd0 2d 73 6f 2d 66 61 72 20 70 61 74 68 73 0a 20 20  -so-far paths.  
24be0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f        ** that co
24bf0 76 65 72 73 20 74 68 65 20 73 61 6d 65 20 73 65  vers the same se
24c00 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20 68  t of loops and h
24c10 61 73 20 74 68 65 20 73 61 6d 65 20 69 73 4f 72  as the same isOr
24c20 64 65 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  dered.        **
24c30 20 73 65 74 74 69 6e 67 20 61 73 20 74 68 65 20   setting as the 
24c40 63 75 72 72 65 6e 74 20 70 61 74 68 20 63 61 6e  current path can
24c50 64 69 64 61 74 65 2e 0a 20 20 20 20 20 20 20 20  didate..        
24c60 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
24c70 65 20 74 65 72 6d 20 22 28 28 70 54 6f 2d 3e 69  e term "((pTo->i
24c80 73 4f 72 64 65 72 65 64 5e 69 73 4f 72 64 65 72  sOrdered^isOrder
24c90 65 64 29 26 30 78 38 30 29 3d 3d 30 22 20 69 73  ed)&0x80)==0" is
24ca0 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20   equivalent.    
24cb0 20 20 20 20 2a 2a 20 74 6f 20 28 70 54 6f 2d 3e      ** to (pTo->
24cc0 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d 31 29 29  isOrdered==(-1))
24cd0 3d 3d 28 69 73 4f 72 64 65 72 65 64 3d 3d 28 2d  ==(isOrdered==(-
24ce0 31 29 29 22 20 66 6f 72 20 74 68 65 20 72 61 6e  1))" for the ran
24cf0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ge.        ** of
24d00 20 6c 65 67 61 6c 20 76 61 6c 75 65 73 20 66 6f   legal values fo
24d10 72 20 69 73 4f 72 64 65 72 65 64 2c 20 2d 31 2e  r isOrdered, -1.
24d20 2e 36 34 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  .64..        */.
24d30 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30          for(jj=0
24d40 2c 20 70 54 6f 3d 61 54 6f 3b 20 6a 6a 3c 6e 54  , pTo=aTo; jj<nT
24d50 6f 3b 20 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b  o; jj++, pTo++){
24d60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
24d70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70 3d 3d 6d 61  To->maskLoop==ma
24d80 73 6b 4e 65 77 0a 20 20 20 20 20 20 20 20 20 20  skNew.          
24d90 20 26 26 20 28 28 70 54 6f 2d 3e 69 73 4f 72 64   && ((pTo->isOrd
24da0 65 72 65 64 5e 69 73 4f 72 64 65 72 65 64 29 26  ered^isOrdered)&
24db0 30 78 38 30 29 3d 3d 30 0a 20 20 20 20 20 20 20  0x80)==0.       
24dc0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
24dd0 20 20 74 65 73 74 63 61 73 65 28 20 6a 6a 3d 3d    testcase( jj==
24de0 6e 54 6f 2d 31 20 29 3b 0a 20 20 20 20 20 20 20  nTo-1 );.       
24df0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
24e00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24e10 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a  }.        if( jj
24e20 3e 3d 6e 54 6f 20 29 7b 0a 20 20 20 20 20 20 20  >=nTo ){.       
24e30 20 20 20 2f 2a 20 4e 6f 6e 65 20 6f 66 20 74 68     /* None of th
24e40 65 20 65 78 69 73 74 69 6e 67 20 62 65 73 74 2d  e existing best-
24e50 73 6f 2d 66 61 72 20 70 61 74 68 73 20 6d 61 74  so-far paths mat
24e60 63 68 20 74 68 65 20 63 61 6e 64 69 64 61 74 65  ch the candidate
24e70 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
24e80 66 28 20 6e 54 6f 3e 3d 6d 78 43 68 6f 69 63 65  f( nTo>=mxChoice
24e90 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
24ea0 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20 7c 7c 20  rCost>mxCost || 
24eb0 28 72 43 6f 73 74 3d 3d 6d 78 43 6f 73 74 20 26  (rCost==mxCost &
24ec0 26 20 72 55 6e 73 6f 72 74 65 64 3e 3d 6d 78 55  & rUnsorted>=mxU
24ed0 6e 73 6f 72 74 65 64 29 29 0a 20 20 20 20 20 20  nsorted)).      
24ee0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
24ef0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e     /* The curren
24f00 74 20 63 61 6e 64 69 64 61 74 65 20 69 73 20 6e  t candidate is n
24f10 6f 20 62 65 74 74 65 72 20 74 68 61 6e 20 61 6e  o better than an
24f20 79 20 6f 66 20 74 68 65 20 6d 78 43 68 6f 69 63  y of the mxChoic
24f30 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  e.            **
24f40 20 70 61 74 68 73 20 63 75 72 72 65 6e 74 6c 79   paths currently
24f50 20 69 6e 20 74 68 65 20 62 65 73 74 2d 73 6f 2d   in the best-so-
24f60 66 61 72 20 62 75 66 66 65 72 2e 20 20 53 6f 20  far buffer.  So 
24f70 64 69 73 63 61 72 64 0a 20 20 20 20 20 20 20 20  discard.        
24f80 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 6e 64      ** this cand
24f90 69 64 61 74 65 20 61 73 20 6e 6f 74 20 76 69 61  idate as not via
24fa0 62 6c 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57  ble. */.#ifdef W
24fb0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
24fc0 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20  D /* 0x4 */.    
24fd0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
24fe0 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30 78  te3WhereTrace&0x
24ff0 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
25000 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
25010 72 69 6e 74 66 28 22 53 6b 69 70 20 20 20 25 73  rintf("Skip   %s
25020 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64 2c 25   cost=%-3d,%3d,%
25030 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22 2c 0a  3d order=%c\n",.
25040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25050 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d 65 28    wherePathName(
25060 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20 70 57  pFrom, iLoop, pW
25070 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20 6e 4f  Loop), rCost, nO
25080 75 74 2c 20 72 55 6e 73 6f 72 74 65 64 2c 0a 20  ut, rUnsorted,. 
25090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250a0 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20   isOrdered>=0 ? 
250b0 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20 3a 20  isOrdered+'0' : 
250c0 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20  '?');.          
250d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
250e0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
250f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
25100 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20         /* If we 
25110 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
25120 73 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  s it means that 
25130 74 68 65 20 6e 65 77 20 63 61 6e 64 69 64 61 74  the new candidat
25140 65 20 70 61 74 68 0a 20 20 20 20 20 20 20 20 20  e path.         
25150 20 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20   ** needs to be 
25160 61 64 64 65 64 20 74 6f 20 74 68 65 20 73 65 74  added to the set
25170 20 6f 66 20 62 65 73 74 2d 73 6f 2d 66 61 72 20   of best-so-far 
25180 70 61 74 68 73 2e 20 2a 2f 0a 20 20 20 20 20 20  paths. */.      
25190 20 20 20 20 69 66 28 20 6e 54 6f 3c 6d 78 43 68      if( nTo<mxCh
251a0 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  oice ){.        
251b0 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20      /* Increase 
251c0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
251d0 61 54 6f 20 73 65 74 20 62 79 20 6f 6e 65 20 2a  aTo set by one *
251e0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a  /.            jj
251f0 20 3d 20 6e 54 6f 2b 2b 3b 0a 20 20 20 20 20 20   = nTo++;.      
25200 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25210 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 70 61         /* New pa
25220 74 68 20 72 65 70 6c 61 63 65 73 20 74 68 65 20  th replaces the 
25230 70 72 69 6f 72 20 77 6f 72 73 74 20 74 6f 20 6b  prior worst to k
25240 65 65 70 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20  eep count below 
25250 6d 78 43 68 6f 69 63 65 20 2a 2f 0a 20 20 20 20  mxChoice */.    
25260 20 20 20 20 20 20 20 20 6a 6a 20 3d 20 6d 78 49          jj = mxI
25270 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
25280 20 20 20 20 20 20 20 20 70 54 6f 20 3d 20 26 61          pTo = &a
25290 54 6f 5b 6a 6a 5d 3b 0a 23 69 66 64 65 66 20 57  To[jj];.#ifdef W
252a0 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
252b0 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20  D /* 0x4 */.    
252c0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
252d0 33 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20  3WhereTrace&0x4 
252e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
252f0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
25300 66 28 22 4e 65 77 20 20 20 20 25 73 20 63 6f 73  f("New    %s cos
25310 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f  t=%-3d,%3d,%3d o
25320 72 64 65 72 3d 25 63 5c 6e 22 2c 0a 20 20 20 20  rder=%c\n",.    
25330 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65 72              wher
25340 65 50 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c  ePathName(pFrom,
25350 20 69 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c   iLoop, pWLoop),
25360 20 72 43 6f 73 74 2c 20 6e 4f 75 74 2c 20 72 55   rCost, nOut, rU
25370 6e 73 6f 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nsorted,.       
25380 20 20 20 20 20 20 20 20 20 69 73 4f 72 64 65 72           isOrder
25390 65 64 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65  ed>=0 ? isOrdere
253a0 64 2b 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20  d+'0' : '?');.  
253b0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
253c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
253d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
253e0 74 72 6f 6c 20 72 65 61 63 68 65 73 20 68 65 72  trol reaches her
253f0 65 20 69 66 20 62 65 73 74 2d 73 6f 2d 66 61 72  e if best-so-far
25400 20 70 61 74 68 20 70 54 6f 3d 61 54 6f 5b 6a 6a   path pTo=aTo[jj
25410 5d 20 63 6f 76 65 72 73 20 74 68 65 0a 20 20 20  ] covers the.   
25420 20 20 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 73         ** same s
25430 65 74 20 6f 66 20 6c 6f 6f 70 73 20 61 6e 64 20  et of loops and 
25440 68 61 73 20 74 68 65 20 73 61 6d 65 20 69 73 4f  has the same isO
25450 72 64 65 72 65 64 20 73 65 74 74 69 6e 67 20 61  rdered setting a
25460 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20  s the.          
25470 2a 2a 20 63 61 6e 64 69 64 61 74 65 20 70 61 74  ** candidate pat
25480 68 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  h.  Check to see
25490 20 69 66 20 74 68 65 20 63 61 6e 64 69 64 61 74   if the candidat
254a0 65 20 73 68 6f 75 6c 64 20 72 65 70 6c 61 63 65  e should replace
254b0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 54  .          ** pT
254c0 6f 20 6f 72 20 69 66 20 74 68 65 20 63 61 6e 64  o or if the cand
254d0 69 64 61 74 65 20 73 68 6f 75 6c 64 20 62 65 20  idate should be 
254e0 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 20 20 20  skipped..       
254f0 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 20     ** .         
25500 20 2a 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f   ** The conditio
25510 6e 61 6c 20 69 73 20 61 6e 20 65 78 70 61 6e 64  nal is an expand
25520 65 64 20 76 65 63 74 6f 72 20 63 6f 6d 70 61 72  ed vector compar
25530 69 73 6f 6e 20 65 71 75 69 76 61 6c 65 6e 74 20  ison equivalent 
25540 74 6f 3a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  to:.          **
25550 20 20 20 28 70 54 6f 2d 3e 72 43 6f 73 74 2c 70     (pTo->rCost,p
25560 54 6f 2d 3e 6e 52 6f 77 2c 70 54 6f 2d 3e 72 55  To->nRow,pTo->rU
25570 6e 73 6f 72 74 65 64 29 20 3c 3d 20 28 72 43 6f  nsorted) <= (rCo
25580 73 74 2c 6e 4f 75 74 2c 72 55 6e 73 6f 72 74 65  st,nOut,rUnsorte
25590 64 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  d).          */.
255a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
255b0 6f 2d 3e 72 43 6f 73 74 3c 72 43 6f 73 74 20 0a  o->rCost<rCost .
255c0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
255d0 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74  To->rCost==rCost
255e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
255f0 26 26 20 28 70 54 6f 2d 3e 6e 52 6f 77 3c 6e 4f  && (pTo->nRow<nO
25600 75 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ut.             
25610 20 20 20 20 20 20 7c 7c 20 28 70 54 6f 2d 3e 6e        || (pTo->n
25620 52 6f 77 3d 3d 6e 4f 75 74 20 26 26 20 70 54 6f  Row==nOut && pTo
25630 2d 3e 72 55 6e 73 6f 72 74 65 64 3c 3d 72 55 6e  ->rUnsorted<=rUn
25640 73 6f 72 74 65 64 29 0a 20 20 20 20 20 20 20 20  sorted).        
25650 20 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20            ).    
25660 20 20 20 20 20 20 20 20 20 20 29 0a 20 20 20 20            ).    
25670 20 20 20 20 20 20 29 7b 0a 23 69 66 64 65 66 20        ){.#ifdef 
25680 57 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c  WHERETRACE_ENABL
25690 45 44 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20  ED /* 0x4 */.   
256a0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
256b0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 26 30  ite3WhereTrace&0
256c0 78 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  x4 ){.          
256d0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
256e0 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  Printf(.        
256f0 20 20 20 20 20 20 20 20 20 20 22 53 6b 69 70 20            "Skip 
25700 20 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25    %s cost=%-3d,%
25710 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 22  3d,%3d order=%c"
25720 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25730 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
25740 65 28 70 46 72 6f 6d 2c 20 69 4c 6f 6f 70 2c 20  e(pFrom, iLoop, 
25750 70 57 4c 6f 6f 70 29 2c 20 72 43 6f 73 74 2c 20  pWLoop), rCost, 
25760 6e 4f 75 74 2c 20 72 55 6e 73 6f 72 74 65 64 2c  nOut, rUnsorted,
25770 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25780 20 20 20 69 73 4f 72 64 65 72 65 64 3e 3d 30 20     isOrdered>=0 
25790 3f 20 69 73 4f 72 64 65 72 65 64 2b 27 30 27 20  ? isOrdered+'0' 
257a0 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20 20 20  : '?');.        
257b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
257c0 75 67 50 72 69 6e 74 66 28 22 20 20 20 76 73 20  ugPrintf("   vs 
257d0 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25 33 64  %s cost=%-3d,%3d
257e0 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c 6e 22  ,%3d order=%c\n"
257f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25800 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
25810 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20  e(pTo, iLoop+1, 
25820 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20  0), pTo->rCost, 
25830 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20  pTo->nRow,.     
25840 20 20 20 20 20 20 20 20 20 20 20 20 20 70 54 6f               pTo
25850 2d 3e 72 55 6e 73 6f 72 74 65 64 2c 20 70 54 6f  ->rUnsorted, pTo
25860 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f  ->isOrdered>=0 ?
25870 20 70 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b   pTo->isOrdered+
25880 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
25890 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
258a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
258b0 44 69 73 63 61 72 64 20 74 68 65 20 63 61 6e 64  Discard the cand
258c0 69 64 61 74 65 20 70 61 74 68 20 66 72 6f 6d 20  idate path from 
258d0 66 75 72 74 68 65 72 20 63 6f 6e 73 69 64 65 72  further consider
258e0 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
258f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
25900 54 6f 2d 3e 72 43 6f 73 74 3d 3d 72 43 6f 73 74  To->rCost==rCost
25910 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
25920 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
25930 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
25940 74 65 73 74 63 61 73 65 28 20 70 54 6f 2d 3e 72  testcase( pTo->r
25950 43 6f 73 74 3d 3d 72 43 6f 73 74 2b 31 20 29 3b  Cost==rCost+1 );
25960 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  .          /* Co
25970 6e 74 72 6f 6c 20 72 65 61 63 68 65 73 20 68 65  ntrol reaches he
25980 72 65 20 69 66 20 74 68 65 20 63 61 6e 64 69 64  re if the candid
25990 61 74 65 20 70 61 74 68 20 69 73 20 62 65 74 74  ate path is bett
259a0 65 72 20 74 68 61 6e 20 74 68 65 0a 20 20 20 20  er than the.    
259b0 20 20 20 20 20 20 2a 2a 20 70 54 6f 20 70 61 74        ** pTo pat
259c0 68 2e 20 20 52 65 70 6c 61 63 65 20 70 54 6f 20  h.  Replace pTo 
259d0 77 69 74 68 20 74 68 65 20 63 61 6e 64 69 64 61  with the candida
259e0 74 65 2e 20 2a 2f 0a 23 69 66 64 65 66 20 57 48  te. */.#ifdef WH
259f0 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ERETRACE_ENABLED
25a00 20 2f 2a 20 30 78 34 20 2a 2f 0a 20 20 20 20 20   /* 0x4 */.     
25a10 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
25a20 57 68 65 72 65 54 72 61 63 65 26 30 78 34 20 29  WhereTrace&0x4 )
25a30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
25a40 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
25a50 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
25a60 20 20 22 55 70 64 61 74 65 20 25 73 20 63 6f 73    "Update %s cos
25a70 74 3d 25 2d 33 64 2c 25 33 64 2c 25 33 64 20 6f  t=%-3d,%3d,%3d o
25a80 72 64 65 72 3d 25 63 22 2c 0a 20 20 20 20 20 20  rder=%c",.      
25a90 20 20 20 20 20 20 20 20 20 20 77 68 65 72 65 50            whereP
25aa0 61 74 68 4e 61 6d 65 28 70 46 72 6f 6d 2c 20 69  athName(pFrom, i
25ab0 4c 6f 6f 70 2c 20 70 57 4c 6f 6f 70 29 2c 20 72  Loop, pWLoop), r
25ac0 43 6f 73 74 2c 20 6e 4f 75 74 2c 20 72 55 6e 73  Cost, nOut, rUns
25ad0 6f 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  orted,.         
25ae0 20 20 20 20 20 20 20 69 73 4f 72 64 65 72 65 64         isOrdered
25af0 3e 3d 30 20 3f 20 69 73 4f 72 64 65 72 65 64 2b  >=0 ? isOrdered+
25b00 27 30 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20  '0' : '?');.    
25b10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
25b20 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 77 61  ebugPrintf("  wa
25b30 73 20 25 73 20 63 6f 73 74 3d 25 2d 33 64 2c 25  s %s cost=%-3d,%
25b40 33 64 2c 25 33 64 20 6f 72 64 65 72 3d 25 63 5c  3d,%3d order=%c\
25b50 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
25b60 20 20 20 20 77 68 65 72 65 50 61 74 68 4e 61 6d      wherePathNam
25b70 65 28 70 54 6f 2c 20 69 4c 6f 6f 70 2b 31 2c 20  e(pTo, iLoop+1, 
25b80 30 29 2c 20 70 54 6f 2d 3e 72 43 6f 73 74 2c 20  0), pTo->rCost, 
25b90 70 54 6f 2d 3e 6e 52 6f 77 2c 0a 20 20 20 20 20  pTo->nRow,.     
25ba0 20 20 20 20 20 20 20 20 20 20 20 70 54 6f 2d 3e             pTo->
25bb0 72 55 6e 73 6f 72 74 65 64 2c 20 70 54 6f 2d 3e  rUnsorted, pTo->
25bc0 69 73 4f 72 64 65 72 65 64 3e 3d 30 20 3f 20 70  isOrdered>=0 ? p
25bd0 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 2b 27 30  To->isOrdered+'0
25be0 27 20 3a 20 27 3f 27 29 3b 0a 20 20 20 20 20 20  ' : '?');.      
25bf0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
25c00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f       }.        /
25c10 2a 20 70 57 4c 6f 6f 70 20 69 73 20 61 20 77 69  * pWLoop is a wi
25c20 6e 6e 65 72 2e 20 20 41 64 64 20 69 74 20 74 6f  nner.  Add it to
25c30 20 74 68 65 20 73 65 74 20 6f 66 20 62 65 73 74   the set of best
25c40 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 20   so far */.     
25c50 20 20 20 70 54 6f 2d 3e 6d 61 73 6b 4c 6f 6f 70     pTo->maskLoop
25c60 20 3d 20 70 46 72 6f 6d 2d 3e 6d 61 73 6b 4c 6f   = pFrom->maskLo
25c70 6f 70 20 7c 20 70 57 4c 6f 6f 70 2d 3e 6d 61 73  op | pWLoop->mas
25c80 6b 53 65 6c 66 3b 0a 20 20 20 20 20 20 20 20 70  kSelf;.        p
25c90 54 6f 2d 3e 72 65 76 4c 6f 6f 70 20 3d 20 72 65  To->revLoop = re
25ca0 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 70  vMask;.        p
25cb0 54 6f 2d 3e 6e 52 6f 77 20 3d 20 6e 4f 75 74 3b  To->nRow = nOut;
25cc0 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 72 43  .        pTo->rC
25cd0 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20 20 20  ost = rCost;.   
25ce0 20 20 20 20 20 70 54 6f 2d 3e 72 55 6e 73 6f 72       pTo->rUnsor
25cf0 74 65 64 20 3d 20 72 55 6e 73 6f 72 74 65 64 3b  ted = rUnsorted;
25d00 0a 20 20 20 20 20 20 20 20 70 54 6f 2d 3e 69 73  .        pTo->is
25d10 4f 72 64 65 72 65 64 20 3d 20 69 73 4f 72 64 65  Ordered = isOrde
25d20 72 65 64 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  red;.        mem
25d30 63 70 79 28 70 54 6f 2d 3e 61 4c 6f 6f 70 2c 20  cpy(pTo->aLoop, 
25d40 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 2c 20 73 69  pFrom->aLoop, si
25d50 7a 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 2a 29  zeof(WhereLoop*)
25d60 2a 69 4c 6f 6f 70 29 3b 0a 20 20 20 20 20 20 20  *iLoop);.       
25d70 20 70 54 6f 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f   pTo->aLoop[iLoo
25d80 70 5d 20 3d 20 70 57 4c 6f 6f 70 3b 0a 20 20 20  p] = pWLoop;.   
25d90 20 20 20 20 20 69 66 28 20 6e 54 6f 3e 3d 6d 78       if( nTo>=mx
25da0 43 68 6f 69 63 65 20 29 7b 0a 20 20 20 20 20 20  Choice ){.      
25db0 20 20 20 20 6d 78 49 20 3d 20 30 3b 0a 20 20 20      mxI = 0;.   
25dc0 20 20 20 20 20 20 20 6d 78 43 6f 73 74 20 3d 20         mxCost = 
25dd0 61 54 6f 5b 30 5d 2e 72 43 6f 73 74 3b 0a 20 20  aTo[0].rCost;.  
25de0 20 20 20 20 20 20 20 20 6d 78 55 6e 73 6f 72 74          mxUnsort
25df0 65 64 20 3d 20 61 54 6f 5b 30 5d 2e 6e 52 6f 77  ed = aTo[0].nRow
25e00 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
25e10 6a 6a 3d 31 2c 20 70 54 6f 3d 26 61 54 6f 5b 31  jj=1, pTo=&aTo[1
25e20 5d 3b 20 6a 6a 3c 6d 78 43 68 6f 69 63 65 3b 20  ]; jj<mxChoice; 
25e30 6a 6a 2b 2b 2c 20 70 54 6f 2b 2b 29 7b 0a 20 20  jj++, pTo++){.  
25e40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54            if( pT
25e50 6f 2d 3e 72 43 6f 73 74 3e 6d 78 43 6f 73 74 20  o->rCost>mxCost 
25e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
25e70 20 28 70 54 6f 2d 3e 72 43 6f 73 74 3d 3d 6d 78   (pTo->rCost==mx
25e80 43 6f 73 74 20 26 26 20 70 54 6f 2d 3e 72 55 6e  Cost && pTo->rUn
25e90 73 6f 72 74 65 64 3e 6d 78 55 6e 73 6f 72 74 65  sorted>mxUnsorte
25ea0 64 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  d) .            
25eb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
25ec0 20 6d 78 43 6f 73 74 20 3d 20 70 54 6f 2d 3e 72   mxCost = pTo->r
25ed0 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Cost;.          
25ee0 20 20 20 20 6d 78 55 6e 73 6f 72 74 65 64 20 3d      mxUnsorted =
25ef0 20 70 54 6f 2d 3e 72 55 6e 73 6f 72 74 65 64 3b   pTo->rUnsorted;
25f00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  .              m
25f10 78 49 20 3d 20 6a 6a 3b 0a 20 20 20 20 20 20 20  xI = jj;.       
25f20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
25f30 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
25f40 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64     }.    }..#ifd
25f50 65 66 20 57 48 45 52 45 54 52 41 43 45 5f 45 4e  ef WHERETRACE_EN
25f60 41 42 4c 45 44 20 20 2f 2a 20 3e 3d 32 20 2a 2f  ABLED  /* >=2 */
25f70 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
25f80 57 68 65 72 65 54 72 61 63 65 20 26 20 30 78 30  WhereTrace & 0x0
25f90 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
25fa0 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2d  e3DebugPrintf("-
25fb0 2d 2d 2d 20 61 66 74 65 72 20 72 6f 75 6e 64 20  --- after round 
25fc0 25 64 20 2d 2d 2d 2d 5c 6e 22 2c 20 69 4c 6f 6f  %d ----\n", iLoo
25fd0 70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69  p);.      for(ii
25fe0 3d 30 2c 20 70 54 6f 3d 61 54 6f 3b 20 69 69 3c  =0, pTo=aTo; ii<
25ff0 6e 54 6f 3b 20 69 69 2b 2b 2c 20 70 54 6f 2b 2b  nTo; ii++, pTo++
26000 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
26010 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
26020 25 73 20 63 6f 73 74 3d 25 2d 33 64 20 6e 72 6f  %s cost=%-3d nro
26030 77 3d 25 2d 33 64 20 6f 72 64 65 72 3d 25 63 22  w=%-3d order=%c"
26040 2c 0a 20 20 20 20 20 20 20 20 20 20 20 77 68 65  ,.           whe
26050 72 65 50 61 74 68 4e 61 6d 65 28 70 54 6f 2c 20  rePathName(pTo, 
26060 69 4c 6f 6f 70 2b 31 2c 20 30 29 2c 20 70 54 6f  iLoop+1, 0), pTo
26070 2d 3e 72 43 6f 73 74 2c 20 70 54 6f 2d 3e 6e 52  ->rCost, pTo->nR
26080 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ow,.           p
26090 54 6f 2d 3e 69 73 4f 72 64 65 72 65 64 3e 3d 30  To->isOrdered>=0
260a0 20 3f 20 28 70 54 6f 2d 3e 69 73 4f 72 64 65 72   ? (pTo->isOrder
260b0 65 64 2b 27 30 27 29 20 3a 20 27 3f 27 29 3b 0a  ed+'0') : '?');.
260c0 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 2d          if( pTo-
260d0 3e 69 73 4f 72 64 65 72 65 64 3e 30 20 29 7b 0a  >isOrdered>0 ){.
260e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
260f0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 72  3DebugPrintf(" r
26100 65 76 3d 30 78 25 6c 6c 78 5c 6e 22 2c 20 70 54  ev=0x%llx\n", pT
26110 6f 2d 3e 72 65 76 4c 6f 6f 70 29 3b 0a 20 20 20  o->revLoop);.   
26120 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
26130 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
26140 75 67 50 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ugPrintf("\n");.
26150 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26160 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
26170 20 20 20 20 2f 2a 20 53 77 61 70 20 74 68 65 20      /* Swap the 
26180 72 6f 6c 65 73 20 6f 66 20 61 46 72 6f 6d 20 61  roles of aFrom a
26190 6e 64 20 61 54 6f 20 66 6f 72 20 74 68 65 20 6e  nd aTo for the n
261a0 65 78 74 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a  ext generation *
261b0 2f 0a 20 20 20 20 70 46 72 6f 6d 20 3d 20 61 54  /.    pFrom = aT
261c0 6f 3b 0a 20 20 20 20 61 54 6f 20 3d 20 61 46 72  o;.    aTo = aFr
261d0 6f 6d 3b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20  om;.    aFrom = 
261e0 70 46 72 6f 6d 3b 0a 20 20 20 20 6e 46 72 6f 6d  pFrom;.    nFrom
261f0 20 3d 20 6e 54 6f 3b 0a 20 20 7d 0a 0a 20 20 69   = nTo;.  }..  i
26200 66 28 20 6e 46 72 6f 6d 3d 3d 30 20 29 7b 0a 20  f( nFrom==0 ){. 
26210 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
26220 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 71  sg(pParse, "no q
26230 75 65 72 79 20 73 6f 6c 75 74 69 6f 6e 22 29 3b  uery solution");
26240 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
26250 65 65 4e 4e 28 64 62 2c 20 70 53 70 61 63 65 29  eeNN(db, pSpace)
26260 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
26270 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
26280 20 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20   .  /* Find the 
26290 6c 6f 77 65 73 74 20 63 6f 73 74 20 70 61 74 68  lowest cost path
262a0 2e 20 20 70 46 72 6f 6d 20 77 69 6c 6c 20 62 65  .  pFrom will be
262b0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74   left pointing t
262c0 6f 20 74 68 61 74 20 70 61 74 68 20 2a 2f 0a 20  o that path */. 
262d0 20 70 46 72 6f 6d 20 3d 20 61 46 72 6f 6d 3b 0a   pFrom = aFrom;.
262e0 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e    for(ii=1; ii<n
262f0 46 72 6f 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  From; ii++){.   
26300 20 69 66 28 20 70 46 72 6f 6d 2d 3e 72 43 6f 73   if( pFrom->rCos
26310 74 3e 61 46 72 6f 6d 5b 69 69 5d 2e 72 43 6f 73  t>aFrom[ii].rCos
26320 74 20 29 20 70 46 72 6f 6d 20 3d 20 26 61 46 72  t ) pFrom = &aFr
26330 6f 6d 5b 69 69 5d 3b 0a 20 20 7d 0a 20 20 61 73  om[ii];.  }.  as
26340 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c  sert( pWInfo->nL
26350 65 76 65 6c 3d 3d 6e 4c 6f 6f 70 20 29 3b 0a 20  evel==nLoop );. 
26360 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 6c 6f 77   /* Load the low
26370 65 73 74 20 63 6f 73 74 20 70 61 74 68 20 69 6e  est cost path in
26380 74 6f 20 70 57 49 6e 66 6f 20 2a 2f 0a 20 20 66  to pWInfo */.  f
26390 6f 72 28 69 4c 6f 6f 70 3d 30 3b 20 69 4c 6f 6f  or(iLoop=0; iLoo
263a0 70 3c 6e 4c 6f 6f 70 3b 20 69 4c 6f 6f 70 2b 2b  p<nLoop; iLoop++
263b0 29 7b 0a 20 20 20 20 57 68 65 72 65 4c 65 76 65  ){.    WhereLeve
263c0 6c 20 2a 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e  l *pLevel = pWIn
263d0 66 6f 2d 3e 61 20 2b 20 69 4c 6f 6f 70 3b 0a 20  fo->a + iLoop;. 
263e0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f     pLevel->pWLoo
263f0 70 20 3d 20 70 57 4c 6f 6f 70 20 3d 20 70 46 72  p = pWLoop = pFr
26400 6f 6d 2d 3e 61 4c 6f 6f 70 5b 69 4c 6f 6f 70 5d  om->aLoop[iLoop]
26410 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46  ;.    pLevel->iF
26420 72 6f 6d 20 3d 20 70 57 4c 6f 6f 70 2d 3e 69 54  rom = pWLoop->iT
26430 61 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ab;.    pLevel->
26440 69 54 61 62 43 75 72 20 3d 20 70 57 49 6e 66 6f  iTabCur = pWInfo
26450 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
26460 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 2e 69 43 75  evel->iFrom].iCu
26470 72 73 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rsor;.  }.  if( 
26480 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c  (pWInfo->wctrlFl
26490 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e 54  ags & WHERE_WANT
264a0 5f 44 49 53 54 49 4e 43 54 29 21 3d 30 0a 20 20  _DISTINCT)!=0.  
264b0 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
264c0 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
264d0 44 49 53 54 49 4e 43 54 42 59 29 3d 3d 30 0a 20  DISTINCTBY)==0. 
264e0 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 65 44 69    && pWInfo->eDi
264f0 73 74 69 6e 63 74 3d 3d 57 48 45 52 45 5f 44 49  stinct==WHERE_DI
26500 53 54 49 4e 43 54 5f 4e 4f 4f 50 0a 20 20 20 26  STINCT_NOOP.   &
26510 26 20 6e 52 6f 77 45 73 74 0a 20 20 29 7b 0a 20  & nRowEst.  ){. 
26520 20 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 55 73     Bitmask notUs
26530 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  ed;.    int rc =
26540 20 77 68 65 72 65 50 61 74 68 53 61 74 69 73 66   wherePathSatisf
26550 69 65 73 4f 72 64 65 72 42 79 28 70 57 49 6e 66  iesOrderBy(pWInf
26560 6f 2c 20 70 57 49 6e 66 6f 2d 3e 70 52 65 73 75  o, pWInfo->pResu
26570 6c 74 53 65 74 2c 20 70 46 72 6f 6d 2c 0a 20 20  ltSet, pFrom,.  
26580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
26590 48 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 2c  HERE_DISTINCTBY,
265a0 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72 6f 6d 2d   nLoop-1, pFrom-
265b0 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d 31 5d 2c  >aLoop[nLoop-1],
265c0 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20   &notUsed);.    
265d0 69 66 28 20 72 63 3d 3d 70 57 49 6e 66 6f 2d 3e  if( rc==pWInfo->
265e0 70 52 65 73 75 6c 74 53 65 74 2d 3e 6e 45 78 70  pResultSet->nExp
265f0 72 20 29 7b 0a 20 20 20 20 20 20 70 57 49 6e 66  r ){.      pWInf
26600 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
26610 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
26620 44 45 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  DERED;.    }.  }
26630 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 70  .  if( pWInfo->p
26640 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69  OrderBy ){.    i
26650 66 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  f( pWInfo->wctrl
26660 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 44 49  Flags & WHERE_DI
26670 53 54 49 4e 43 54 42 59 20 29 7b 0a 20 20 20 20  STINCTBY ){.    
26680 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 69 73 4f    if( pFrom->isO
26690 72 64 65 72 65 64 3d 3d 70 57 49 6e 66 6f 2d 3e  rdered==pWInfo->
266a0 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20  pOrderBy->nExpr 
266b0 29 7b 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66  ){.        pWInf
266c0 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57  o->eDistinct = W
266d0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52  HERE_DISTINCT_OR
266e0 44 45 52 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20  DERED;.      }. 
266f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26700 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d  pWInfo->nOBSat =
26710 20 70 46 72 6f 6d 2d 3e 69 73 4f 72 64 65 72 65   pFrom->isOrdere
26720 64 3b 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d  d;.      pWInfo-
26730 3e 72 65 76 4d 61 73 6b 20 3d 20 70 46 72 6f 6d  >revMask = pFrom
26740 2d 3e 72 65 76 4c 6f 6f 70 3b 0a 20 20 20 20 20  ->revLoop;.     
26750 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42   if( pWInfo->nOB
26760 53 61 74 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sat<=0 ){.      
26770 20 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74    pWInfo->nOBSat
26780 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
26790 28 20 6e 4c 6f 6f 70 3e 30 20 29 7b 0a 20 20 20  ( nLoop>0 ){.   
267a0 20 20 20 20 20 20 20 75 33 32 20 77 73 46 6c 61         u32 wsFla
267b0 67 73 20 3d 20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f  gs = pFrom->aLoo
267c0 70 5b 6e 4c 6f 6f 70 2d 31 5d 2d 3e 77 73 46 6c  p[nLoop-1]->wsFl
267d0 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ags;.          i
267e0 66 28 20 28 77 73 46 6c 61 67 73 20 26 20 57 48  f( (wsFlags & WH
267f0 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 20 0a  ERE_ONEROW)==0 .
26800 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 77             && (w
26810 73 46 6c 61 67 73 26 28 57 48 45 52 45 5f 49 50  sFlags&(WHERE_IP
26820 4b 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  K|WHERE_COLUMN_I
26830 4e 29 29 21 3d 28 57 48 45 52 45 5f 49 50 4b 7c  N))!=(WHERE_IPK|
26840 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29  WHERE_COLUMN_IN)
26850 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
26860 20 20 20 20 20 20 20 20 20 20 42 69 74 6d 61 73            Bitmas
26870 6b 20 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  k m = 0;.       
26880 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 68       int rc = wh
26890 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
268a0 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20  OrderBy(pWInfo, 
268b0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
268c0 2c 20 70 46 72 6f 6d 2c 0a 20 20 20 20 20 20 20  , pFrom,.       
268d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
268e0 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4c 49 4d  HERE_ORDERBY_LIM
268f0 49 54 2c 20 6e 4c 6f 6f 70 2d 31 2c 20 70 46 72  IT, nLoop-1, pFr
26900 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f 6f 70 2d  om->aLoop[nLoop-
26910 31 5d 2c 20 26 6d 29 3b 0a 20 20 20 20 20 20 20  1], &m);.       
26920 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
26930 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
26940 50 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  PK );.          
26950 20 20 74 65 73 74 63 61 73 65 28 20 77 73 46 6c    testcase( wsFl
26960 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
26970 4d 4e 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 20  MN_IN );.       
26980 20 20 20 20 20 69 66 28 20 72 63 3d 3d 70 57 49       if( rc==pWI
26990 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e 6e  nfo->pOrderBy->n
269a0 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
269b0 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 62 4f        pWInfo->bO
269c0 72 64 65 72 65 64 49 6e 6e 65 72 4c 6f 6f 70 20  rderedInnerLoop 
269d0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
269e0 20 20 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61     pWInfo->revMa
269f0 73 6b 20 3d 20 6d 3b 0a 20 20 20 20 20 20 20 20  sk = m;.        
26a00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26a10 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
26a20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
26a30 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
26a40 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 53 4f  Flags & WHERE_SO
26a50 52 54 42 59 47 52 4f 55 50 29 0a 20 20 20 20 20  RTBYGROUP).     
26a60 20 20 20 26 26 20 70 57 49 6e 66 6f 2d 3e 6e 4f     && pWInfo->nO
26a70 42 53 61 74 3d 3d 70 57 49 6e 66 6f 2d 3e 70 4f  BSat==pWInfo->pO
26a80 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 26 26  rderBy->nExpr &&
26a90 20 6e 4c 6f 6f 70 3e 30 0a 20 20 20 20 29 7b 0a   nLoop>0.    ){.
26aa0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 72 65        Bitmask re
26ab0 76 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20  vMask = 0;.     
26ac0 20 69 6e 74 20 6e 4f 72 64 65 72 20 3d 20 77 68   int nOrder = wh
26ad0 65 72 65 50 61 74 68 53 61 74 69 73 66 69 65 73  erePathSatisfies
26ae0 4f 72 64 65 72 42 79 28 70 57 49 6e 66 6f 2c 20  OrderBy(pWInfo, 
26af0 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79  pWInfo->pOrderBy
26b00 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72  , .          pFr
26b10 6f 6d 2c 20 30 2c 20 6e 4c 6f 6f 70 2d 31 2c 20  om, 0, nLoop-1, 
26b20 70 46 72 6f 6d 2d 3e 61 4c 6f 6f 70 5b 6e 4c 6f  pFrom->aLoop[nLo
26b30 6f 70 2d 31 5d 2c 20 26 72 65 76 4d 61 73 6b 0a  op-1], &revMask.
26b40 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
26b50 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73  ssert( pWInfo->s
26b60 6f 72 74 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  orted==0 );.    
26b70 20 20 69 66 28 20 6e 4f 72 64 65 72 3d 3d 70 57    if( nOrder==pW
26b80 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 2d 3e  Info->pOrderBy->
26b90 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
26ba0 20 70 57 49 6e 66 6f 2d 3e 73 6f 72 74 65 64 20   pWInfo->sorted 
26bb0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 57 49  = 1;.        pWI
26bc0 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b 20 3d 20 72  nfo->revMask = r
26bd0 65 76 4d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a  evMask;.      }.
26be0 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 70 57      }.  }...  pW
26bf0 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d 20  Info->nRowOut = 
26c00 70 46 72 6f 6d 2d 3e 6e 52 6f 77 3b 0a 0a 20 20  pFrom->nRow;..  
26c10 2f 2a 20 46 72 65 65 20 74 65 6d 70 6f 72 61 72  /* Free temporar
26c20 79 20 6d 65 6d 6f 72 79 20 61 6e 64 20 72 65 74  y memory and ret
26c30 75 72 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20  urn success */. 
26c40 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e   sqlite3DbFreeNN
26c50 28 64 62 2c 20 70 53 70 61 63 65 29 3b 0a 20 20  (db, pSpace);.  
26c60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26c70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 73 74 20  ;.}../*.** Most 
26c80 71 75 65 72 69 65 73 20 75 73 65 20 6f 6e 6c 79  queries use only
26c90 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
26ca0 28 74 68 65 79 20 61 72 65 20 6e 6f 74 20 6a 6f  (they are not jo
26cb0 69 6e 73 29 20 61 6e 64 20 68 61 76 65 0a 2a 2a  ins) and have.**
26cc0 20 73 69 6d 70 6c 65 20 3d 3d 20 63 6f 6e 73 74   simple == const
26cd0 72 61 69 6e 74 73 20 61 67 61 69 6e 73 74 20 69  raints against i
26ce0 6e 64 65 78 65 64 20 66 69 65 6c 64 73 2e 20 20  ndexed fields.  
26cf0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74  This routine att
26d00 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 70 6c 61 6e  empts.** to plan
26d10 20 74 68 6f 73 65 20 73 69 6d 70 6c 65 20 63 61   those simple ca
26d20 73 65 73 20 75 73 69 6e 67 20 6d 75 63 68 20 6c  ses using much l
26d30 65 73 73 20 63 65 72 65 6d 6f 6e 79 20 74 68 61  ess ceremony tha
26d40 6e 20 74 68 65 0a 2a 2a 20 67 65 6e 65 72 61 6c  n the.** general
26d50 2d 70 75 72 70 6f 73 65 20 71 75 65 72 79 20 70  -purpose query p
26d60 6c 61 6e 6e 65 72 2c 20 61 6e 64 20 74 68 65 72  lanner, and ther
26d70 65 62 79 20 79 69 65 6c 64 20 66 61 73 74 65 72  eby yield faster
26d80 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
26d90 28 29 0a 2a 2a 20 74 69 6d 65 73 20 66 6f 72 20  ().** times for 
26da0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
26db0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f  .**.** Return no
26dc0 6e 2d 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73  n-zero on succes
26dd0 73 2c 20 69 66 20 74 68 69 73 20 71 75 65 72 79  s, if this query
26de0 20 63 61 6e 20 62 65 20 68 61 6e 64 6c 65 64 20   can be handled 
26df0 62 79 20 74 68 69 73 0a 2a 2a 20 6e 6f 2d 66 72  by this.** no-fr
26e00 69 6c 6c 73 20 71 75 65 72 79 20 70 6c 61 6e 6e  ills query plann
26e10 65 72 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f  er.  Return zero
26e20 20 69 66 20 74 68 69 73 20 71 75 65 72 79 20 6e   if this query n
26e30 65 65 64 73 20 74 68 65 20 0a 2a 2a 20 67 65 6e  eeds the .** gen
26e40 65 72 61 6c 2d 70 75 72 70 6f 73 65 20 71 75 65  eral-purpose que
26e50 72 79 20 70 6c 61 6e 6e 65 72 2e 0a 2a 2f 0a 73  ry planner..*/.s
26e60 74 61 74 69 63 20 69 6e 74 20 77 68 65 72 65 53  tatic int whereS
26e70 68 6f 72 74 43 75 74 28 57 68 65 72 65 4c 6f 6f  hortCut(WhereLoo
26e80 70 42 75 69 6c 64 65 72 20 2a 70 42 75 69 6c 64  pBuilder *pBuild
26e90 65 72 29 7b 0a 20 20 57 68 65 72 65 49 6e 66 6f  er){.  WhereInfo
26ea0 20 2a 70 57 49 6e 66 6f 3b 0a 20 20 73 74 72 75   *pWInfo;.  stru
26eb0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
26ec0 2a 70 49 74 65 6d 3b 0a 20 20 57 68 65 72 65 43  *pItem;.  WhereC
26ed0 6c 61 75 73 65 20 2a 70 57 43 3b 0a 20 20 57 68  lause *pWC;.  Wh
26ee0 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
26ef0 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 4c 6f    WhereLoop *pLo
26f00 6f 70 3b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a  op;.  int iCur;.
26f10 20 20 69 6e 74 20 6a 3b 0a 20 20 54 61 62 6c 65    int j;.  Table
26f20 20 2a 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20   *pTab;.  Index 
26f30 2a 70 49 64 78 3b 0a 0a 20 20 70 57 49 6e 66 6f  *pIdx;..  pWInfo
26f40 20 3d 20 70 42 75 69 6c 64 65 72 2d 3e 70 57 49   = pBuilder->pWI
26f50 6e 66 6f 3b 0a 20 20 69 66 28 20 70 57 49 6e 66  nfo;.  if( pWInf
26f60 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
26f70 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
26f80 53 45 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  SE ) return 0;. 
26f90 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
26fa0 3e 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e  >pTabList->nSrc>
26fb0 3d 31 20 29 3b 0a 20 20 70 49 74 65 6d 20 3d 20  =1 );.  pItem = 
26fc0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
26fd0 2d 3e 61 3b 0a 20 20 70 54 61 62 20 3d 20 70 49  ->a;.  pTab = pI
26fe0 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 69 66 28  tem->pTab;.  if(
26ff0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
27000 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
27010 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49  f( pItem->fg.isI
27020 6e 64 65 78 65 64 42 79 20 29 20 72 65 74 75 72  ndexedBy ) retur
27030 6e 20 30 3b 0a 20 20 69 43 75 72 20 3d 20 70 49  n 0;.  iCur = pI
27040 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
27050 70 57 43 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73  pWC = &pWInfo->s
27060 57 43 3b 0a 20 20 70 4c 6f 6f 70 20 3d 20 70 42  WC;.  pLoop = pB
27070 75 69 6c 64 65 72 2d 3e 70 4e 65 77 3b 0a 20 20  uilder->pNew;.  
27080 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 3d  pLoop->wsFlags =
27090 20 30 3b 0a 20 20 70 4c 6f 6f 70 2d 3e 6e 53 6b   0;.  pLoop->nSk
270a0 69 70 20 3d 20 30 3b 0a 20 20 70 54 65 72 6d 20  ip = 0;.  pTerm 
270b0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 46 69  = sqlite3WhereFi
270c0 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
270d0 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51 7c 57  , -1, 0, WO_EQ|W
270e0 4f 5f 49 53 2c 20 30 29 3b 0a 20 20 69 66 28 20  O_IS, 0);.  if( 
270f0 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 74 65 73  pTerm ){.    tes
27100 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
27110 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 20  perator & WO_IS 
27120 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73  );.    pLoop->ws
27130 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f  Flags = WHERE_CO
27140 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 49 50  LUMN_EQ|WHERE_IP
27150 4b 7c 57 48 45 52 45 5f 4f 4e 45 52 4f 57 3b 0a  K|WHERE_ONEROW;.
27160 20 20 20 20 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72      pLoop->aLTer
27170 6d 5b 30 5d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  m[0] = pTerm;.  
27180 20 20 70 4c 6f 6f 70 2d 3e 6e 4c 54 65 72 6d 20    pLoop->nLTerm 
27190 3d 20 31 3b 0a 20 20 20 20 70 4c 6f 6f 70 2d 3e  = 1;.    pLoop->
271a0 75 2e 62 74 72 65 65 2e 6e 45 71 20 3d 20 31 3b  u.btree.nEq = 1;
271b0 0a 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20  .    /* TUNING: 
271c0 43 6f 73 74 20 6f 66 20 61 20 72 6f 77 69 64 20  Cost of a rowid 
271d0 6c 6f 6f 6b 75 70 20 69 73 20 31 30 20 2a 2f 0a  lookup is 10 */.
271e0 20 20 20 20 70 4c 6f 6f 70 2d 3e 72 52 75 6e 20      pLoop->rRun 
271f0 3d 20 33 33 3b 20 20 2f 2a 20 33 33 3d 3d 73 71  = 33;  /* 33==sq
27200 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 29 20  lite3LogEst(10) 
27210 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
27220 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
27230 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
27240 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
27250 20 20 20 20 20 20 69 6e 74 20 6f 70 4d 61 73 6b        int opMask
27260 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
27270 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72 6d 53 70 61  pLoop->aLTermSpa
27280 63 65 3d 3d 70 4c 6f 6f 70 2d 3e 61 4c 54 65 72  ce==pLoop->aLTer
27290 6d 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  m );.      if( !
272a0 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70 49  IsUniqueIndex(pI
272b0 64 78 29 0a 20 20 20 20 20 20 20 7c 7c 20 70 49  dx).       || pI
272c0 64 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72  dx->pPartIdxWher
272d0 65 21 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20  e!=0 .       || 
272e0 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3e 41 72  pIdx->nKeyCol>Ar
272f0 72 61 79 53 69 7a 65 28 70 4c 6f 6f 70 2d 3e 61  raySize(pLoop->a
27300 4c 54 65 72 6d 53 70 61 63 65 29 20 0a 20 20 20  LTermSpace) .   
27310 20 20 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20     ) continue;. 
27320 20 20 20 20 20 6f 70 4d 61 73 6b 20 3d 20 70 49       opMask = pI
27330 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  dx->uniqNotNull 
27340 3f 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53 29 20  ? (WO_EQ|WO_IS) 
27350 3a 20 57 4f 5f 45 51 3b 0a 20 20 20 20 20 20 66  : WO_EQ;.      f
27360 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
27370 6e 4b 65 79 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  nKeyCol; j++){. 
27380 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 73         pTerm = s
27390 71 6c 69 74 65 33 57 68 65 72 65 46 69 6e 64 54  qlite3WhereFindT
273a0 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
273b0 2c 20 30 2c 20 6f 70 4d 61 73 6b 2c 20 70 49 64  , 0, opMask, pId
273c0 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
273d0 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b  pTerm==0 ) break
273e0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
273f0 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
27400 61 74 6f 72 20 26 20 57 4f 5f 49 53 20 29 3b 0a  ator & WO_IS );.
27410 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 61          pLoop->a
27420 4c 54 65 72 6d 5b 6a 5d 20 3d 20 70 54 65 72 6d  LTerm[j] = pTerm
27430 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27440 69 66 28 20 6a 21 3d 70 49 64 78 2d 3e 6e 4b 65  if( j!=pIdx->nKe
27450 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  yCol ) continue;
27460 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 77 73  .      pLoop->ws
27470 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f  Flags = WHERE_CO
27480 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f 4f 4e  LUMN_EQ|WHERE_ON
27490 45 52 4f 57 7c 57 48 45 52 45 5f 49 4e 44 45 58  EROW|WHERE_INDEX
274a0 45 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  ED;.      if( pI
274b0 64 78 2d 3e 69 73 43 6f 76 65 72 69 6e 67 20 7c  dx->isCovering |
274c0 7c 20 28 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  | (pItem->colUse
274d0 64 20 26 20 7e 63 6f 6c 75 6d 6e 73 49 6e 49 6e  d & ~columnsInIn
274e0 64 65 78 28 70 49 64 78 29 29 3d 3d 30 20 29 7b  dex(pIdx))==0 ){
274f0 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
27500 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
27510 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20  _IDX_ONLY;.     
27520 20 7d 0a 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e   }.      pLoop->
27530 6e 4c 54 65 72 6d 20 3d 20 6a 3b 0a 20 20 20 20  nLTerm = j;.    
27540 20 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65    pLoop->u.btree
27550 2e 6e 45 71 20 3d 20 6a 3b 0a 20 20 20 20 20 20  .nEq = j;.      
27560 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
27570 49 6e 64 65 78 20 3d 20 70 49 64 78 3b 0a 20 20  Index = pIdx;.  
27580 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 43      /* TUNING: C
27590 6f 73 74 20 6f 66 20 61 20 75 6e 69 71 75 65 20  ost of a unique 
275a0 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20 69 73 20  index lookup is 
275b0 31 35 20 2a 2f 0a 20 20 20 20 20 20 70 4c 6f 6f  15 */.      pLoo
275c0 70 2d 3e 72 52 75 6e 20 3d 20 33 39 3b 20 20 2f  p->rRun = 39;  /
275d0 2a 20 33 39 3d 3d 73 71 6c 69 74 65 33 4c 6f 67  * 39==sqlite3Log
275e0 45 73 74 28 31 35 29 20 2a 2f 0a 20 20 20 20 20  Est(15) */.     
275f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
27600 7d 0a 20 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77  }.  if( pLoop->w
27610 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 70 4c  sFlags ){.    pL
27620 6f 6f 70 2d 3e 6e 4f 75 74 20 3d 20 28 4c 6f 67  oop->nOut = (Log
27630 45 73 74 29 31 3b 0a 20 20 20 20 70 57 49 6e 66  Est)1;.    pWInf
27640 6f 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 20 3d  o->a[0].pWLoop =
27650 20 70 4c 6f 6f 70 3b 0a 20 20 20 20 61 73 73 65   pLoop;.    asse
27660 72 74 28 20 70 57 49 6e 66 6f 2d 3e 73 4d 61 73  rt( pWInfo->sMas
27670 6b 53 65 74 2e 6e 3d 3d 31 20 26 26 20 69 43 75  kSet.n==1 && iCu
27680 72 3d 3d 70 57 49 6e 66 6f 2d 3e 73 4d 61 73 6b  r==pWInfo->sMask
27690 53 65 74 2e 69 78 5b 30 5d 20 29 3b 0a 20 20 20  Set.ix[0] );.   
276a0 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
276b0 20 3d 20 31 3b 20 2f 2a 20 73 71 6c 69 74 65 33   = 1; /* sqlite3
276c0 57 68 65 72 65 47 65 74 4d 61 73 6b 28 26 70 57  WhereGetMask(&pW
276d0 49 6e 66 6f 2d 3e 73 4d 61 73 6b 53 65 74 2c 20  Info->sMaskSet, 
276e0 69 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 70 57  iCur); */.    pW
276f0 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 69 54 61 62 43  Info->a[0].iTabC
27700 75 72 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70  ur = iCur;.    p
27710 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20 3d  WInfo->nRowOut =
27720 20 31 3b 0a 20 20 20 20 69 66 28 20 70 57 49 6e   1;.    if( pWIn
27730 66 6f 2d 3e 70 4f 72 64 65 72 42 79 20 29 20 70  fo->pOrderBy ) p
27740 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20  WInfo->nOBSat = 
27750 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72 42   pWInfo->pOrderB
27760 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 69 66  y->nExpr;.    if
27770 28 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46  ( pWInfo->wctrlF
27780 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57 41 4e  lags & WHERE_WAN
27790 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a 20 20  T_DISTINCT ){.  
277a0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73      pWInfo->eDis
277b0 74 69 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49  tinct = WHERE_DI
277c0 53 54 49 4e 43 54 5f 55 4e 49 51 55 45 3b 0a 20  STINCT_UNIQUE;. 
277d0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
277e0 54 45 5f 44 45 42 55 47 0a 20 20 20 20 70 4c 6f  TE_DEBUG.    pLo
277f0 6f 70 2d 3e 63 49 64 20 3d 20 27 30 27 3b 0a 23  op->cId = '0';.#
27800 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
27810 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
27820 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c   0;.}../*.** Hel
27830 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  per function for
27840 20 65 78 70 72 49 73 44 65 74 65 72 6d 69 6e 69   exprIsDetermini
27850 73 74 69 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  stic()..*/.stati
27860 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49 73  c int exprNodeIs
27870 44 65 74 65 72 6d 69 6e 69 73 74 69 63 28 57 61  Deterministic(Wa
27880 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
27890 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
278a0 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
278b0 5f 46 55 4e 43 54 49 4f 4e 20 26 26 20 45 78 70  _FUNCTION && Exp
278c0 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
278d0 70 72 2c 20 45 50 5f 43 6f 6e 73 74 46 75 6e 63  pr, EP_ConstFunc
278e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 57 61 6c  )==0 ){.    pWal
278f0 6b 65 72 2d 3e 65 43 6f 64 65 20 3d 20 30 3b 0a  ker->eCode = 0;.
27900 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
27910 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  bort;.  }.  retu
27920 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
27930 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
27940 20 74 72 75 65 20 69 66 20 74 68 65 20 65 78 70   true if the exp
27950 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ression contains
27960 20 6e 6f 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e   no non-determin
27970 69 73 74 69 63 20 53 51 4c 20 0a 2a 2a 20 66 75  istic SQL .** fu
27980 6e 63 74 69 6f 6e 73 2e 20 44 6f 20 6e 6f 74 20  nctions. Do not 
27990 63 6f 6e 73 69 64 65 72 20 6e 6f 6e 2d 64 65 74  consider non-det
279a0 65 72 6d 69 6e 69 73 74 69 63 20 53 51 4c 20 66  erministic SQL f
279b0 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 61 72  unctions that ar
279c0 65 20 0a 2a 2a 20 70 61 72 74 20 6f 66 20 73 75  e .** part of su
279d0 62 2d 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  b-select stateme
279e0 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nts..*/.static i
279f0 6e 74 20 65 78 70 72 49 73 44 65 74 65 72 6d 69  nt exprIsDetermi
27a00 6e 69 73 74 69 63 28 45 78 70 72 20 2a 70 29 7b  nistic(Expr *p){
27a10 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 20 20 6d  .  Walker w;.  m
27a20 65 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a  emset(&w, 0, siz
27a30 65 6f 66 28 77 29 29 3b 0a 20 20 77 2e 65 43 6f  eof(w));.  w.eCo
27a40 64 65 20 3d 20 31 3b 0a 20 20 77 2e 78 45 78 70  de = 1;.  w.xExp
27a50 72 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72  rCallback = expr
27a60 4e 6f 64 65 49 73 44 65 74 65 72 6d 69 6e 69 73  NodeIsDeterminis
27a70 74 69 63 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  tic;.  w.xSelect
27a80 43 61 6c 6c 62 61 63 6b 20 3d 20 73 71 6c 69 74  Callback = sqlit
27a90 65 33 53 65 6c 65 63 74 57 61 6c 6b 46 61 69 6c  e3SelectWalkFail
27aa0 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  ;.  sqlite3WalkE
27ab0 78 70 72 28 26 77 2c 20 70 29 3b 0a 20 20 72 65  xpr(&w, p);.  re
27ac0 74 75 72 6e 20 77 2e 65 43 6f 64 65 3b 0a 7d 0a  turn w.eCode;.}.
27ad0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
27ae0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
27af0 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66   the loop used f
27b00 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  or WHERE clause 
27b10 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54  processing..** T
27b20 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
27b30 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
27b40 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63 74  an opaque struct
27b50 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ure that contain
27b60 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  s.** information
27b70 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69   needed to termi
27b80 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20  nate the loop.  
27b90 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69  Later, the calli
27ba0 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68  ng routine.** sh
27bb0 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69  ould invoke sqli
27bc0 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 77 69  te3WhereEnd() wi
27bd0 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  th the return va
27be0 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
27bf0 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72  tion.** in order
27c00 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
27c10 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
27c20 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ocessing..**.** 
27c30 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
27c40 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  rs, this routine
27c50 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a   returns NULL..*
27c60 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69  *.** The basic i
27c70 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e  dea is to do a n
27c80 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20  ested loop, one 
27c90 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61  loop for each ta
27ca0 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52  ble in.** the FR
27cb0 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73  OM clause of a s
27cc0 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20  elect.  (INSERT 
27cd0 61 6e 64 20 55 50 44 41 54 45 20 73 74 61 74 65  and UPDATE state
27ce0 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a  ments are the.**
27cf0 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43   same as a SELEC
27d00 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69  T with only a si
27d10 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68  ngle table in th
27d20 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20  e FROM clause.) 
27d30 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c   For.** example,
27d40 20 69 66 20 74 68 65 20 53 51 4c 20 69 73 20 74   if the SQL is t
27d50 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
27d60 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
27d70 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20  1, t2, t3 WHERE 
27d80 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ...;.**.** Then 
27d90 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
27da0 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c  ed is conceptual
27db0 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c  ly like the foll
27dc0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
27dd0 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69    foreach row1 i
27de0 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20  n t1 do       \ 
27df0 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65     Code generate
27e00 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65  d.**        fore
27e10 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64  ach row2 in t2 d
27e20 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71  o      |-- by sq
27e30 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
27e40 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f  ).**          fo
27e50 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33  reach row3 in t3
27e60 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20   do   /.**      
27e70 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20        ....**    
27e80 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
27e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20                \ 
27ea0 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65     Code generate
27eb0 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20  d.**        end 
27ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ed0 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71         |-- by sq
27ee0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a  lite3WhereEnd().
27ef0 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20 20  **      end     
27f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f10 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65      /.**.** Note
27f20 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20   that the loops 
27f30 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73  might not be nes
27f40 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72  ted in the order
27f50 20 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a   in which they.*
27f60 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  * appear in the 
27f70 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61  FROM clause if a
27f80 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72   different order
27f90 20 69 73 20 62 65 74 74 65 72 20 61 62 6c 65 20   is better able 
27fa0 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f  to make.** use o
27fb0 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65  f indices.  Note
27fc0 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20   also that when 
27fd0 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
27fe0 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68  appears in.** th
27ff0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  e WHERE clause, 
28000 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20  it might result 
28010 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65  in additional ne
28020 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a  sted loops for.*
28030 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75  * scanning throu
28040 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e  gh all values on
28050 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
28060 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a  side of the IN..
28070 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
28080 42 74 72 65 65 20 63 75 72 73 6f 72 73 20 61 73  Btree cursors as
28090 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61  sociated with ea
280a0 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73  ch table.  t1 us
280b0 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d  es cursor.** num
280c0 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ber pTabList->a[
280d0 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20  0].iCursor.  t2 
280e0 75 73 65 73 20 74 68 65 20 63 75 72 73 6f 72 20  uses the cursor 
280f0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69  pTabList->a[1].i
28100 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73  Cursor..** And s
28110 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72  o forth.  This r
28120 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
28130 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68   code to open th
28140 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f 72 73  ose VDBE cursors
28150 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57  .** and sqlite3W
28160 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61  hereEnd() genera
28170 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20  tes the code to 
28180 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a  close them..**.*
28190 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20  * The code that 
281a0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
281b0 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65  n() generates le
281c0 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 73  aves the cursors
281d0 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61   named.** in pTa
281e0 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61  bList pointing a
281f0 74 20 74 68 65 69 72 20 61 70 70 72 6f 70 72 69  t their appropri
28200 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68  ate entries.  Th
28210 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20  e [...] code.** 
28220 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d  can use OP_Colum
28230 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f  n and OP_Rowid o
28240 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20  pcodes on these 
28250 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61  cursors to extra
28260 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20  ct.** data from 
28270 74 68 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c  the various tabl
28280 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a  es of the loop..
28290 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45  **.** If the WHE
282a0 52 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70  RE clause is emp
282b0 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20  ty, the foreach 
282c0 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20  loops must each 
282d0 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e  scan their.** en
282e0 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68  tire tables.  Th
282f0 75 73 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a  us a three-way j
28300 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29  oin is an O(N^3)
28310 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74   operation.  But
28320 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   if.** the table
28330 73 20 68 61 76 65 20 69 6e 64 69 63 65 73 20 61  s have indices a
28340 6e 64 20 74 68 65 72 65 20 61 72 65 20 74 65 72  nd there are ter
28350 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ms in the WHERE 
28360 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72  clause that.** r
28370 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e  efer to those in
28380 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74  dices, a complet
28390 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e  e table scan can
283a0 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20   be avoided and 
283b0 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c  the.** code will
283c0 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72   run much faster
283d0 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77  .  Most of the w
283e0 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ork of this rout
283f0 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a  ine is checking.
28400 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ** to see if the
28410 72 65 20 61 72 65 20 69 6e 64 69 63 65 73 20 74  re are indices t
28420 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
28430 74 6f 20 73 70 65 65 64 20 75 70 20 74 68 65 20  to speed up the 
28440 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d  loop..**.** Term
28450 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
28460 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75  lause are also u
28470 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69  sed to limit whi
28480 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79  ch rows actually
28490 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74  .** make it to t
284a0 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20  he "..." in the 
284b0 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f  middle of the lo
284c0 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63 68 20  op.  After each 
284d0 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65  "foreach",.** te
284e0 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
284f0 20 63 6c 61 75 73 65 20 74 68 61 74 20 75 73 65   clause that use
28500 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74   only terms in t
28510 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74  hat loop and out
28520 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20  er.** loops are 
28530 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66  evaluated and if
28540 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73   false a jump is
28550 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c   made around all
28560 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69   subsequent.** i
28570 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61  nner loops (or a
28580 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20  round the "..." 
28590 69 66 20 74 68 65 20 74 65 73 74 20 6f 63 63 75  if the test occu
285a0 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e  rs within the in
285b0 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f  ner-.** most loo
285c0 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a  p).**.** OUTER J
285d0 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75  OINS.**.** An ou
285e0 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c  ter join of tabl
285f0 65 73 20 74 31 20 61 6e 64 20 74 32 20 69 73 20  es t1 and t2 is 
28600 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65  conceptally code
28610 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
28620 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72  .**    foreach r
28630 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20  ow1 in t1 do.** 
28640 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a       flag = 0.**
28650 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
28660 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20  w2 in t2 do.**  
28670 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20        start:.** 
28680 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20           ....** 
28690 20 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20           flag = 
286a0 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a  1.**      end.**
286b0 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30        if flag==0
286c0 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20   then.**        
286d0 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63 75  move the row2 cu
286e0 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72  rsor to a null r
286f0 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74  ow.**        got
28700 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20  o start.**      
28710 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a  fi.**    end.**.
28720 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55  ** ORDER BY CLAU
28730 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a  SE PROCESSING.**
28740 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20  .** pOrderBy is 
28750 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
28760 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
28770 20 28 6f 72 20 74 68 65 20 47 52 4f 55 50 20 42   (or the GROUP B
28780 59 20 63 6c 61 75 73 65 0a 2a 2a 20 69 66 20 74  Y clause.** if t
28790 68 65 20 57 48 45 52 45 5f 47 52 4f 55 50 42 59  he WHERE_GROUPBY
287a0 20 66 6c 61 67 20 69 73 20 73 65 74 20 69 6e 20   flag is set in 
287b0 77 63 74 72 6c 46 6c 61 67 73 29 20 6f 66 20 61  wctrlFlags) of a
287c0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
287d0 74 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  t.** if there is
287e0 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20   one.  If there 
287f0 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  is no ORDER BY c
28800 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68 69 73  lause or if this
28810 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
28820 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50  alled from an UP
28830 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
28840 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70  tatement, then p
28850 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e  OrderBy is NULL.
28860 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 49 64 78 43  .**.** The iIdxC
28870 75 72 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ur parameter is 
28880 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
28890 72 20 6f 66 20 61 6e 20 69 6e 64 65 78 2e 20 20  r of an index.  
288a0 49 66 20 0a 2a 2a 20 57 48 45 52 45 5f 4f 52 5f  If .** WHERE_OR_
288b0 53 55 42 43 4c 41 55 53 45 20 69 73 20 73 65 74  SUBCLAUSE is set
288c0 2c 20 69 49 64 78 43 75 72 20 69 73 20 74 68 65  , iIdxCur is the
288d0 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
288e0 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 74 6f  f an index.** to
288f0 20 75 73 65 20 66 6f 72 20 4f 52 20 63 6c 61 75   use for OR clau
28900 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20  se processing.  
28910 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
28920 20 73 68 6f 75 6c 64 20 75 73 65 20 74 68 69 73   should use this
28930 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 63 75 72  .** specific cur
28940 73 6f 72 2e 20 20 49 66 20 57 48 45 52 45 5f 4f  sor.  If WHERE_O
28950 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 20 69  NEPASS_DESIRED i
28960 73 20 73 65 74 2c 20 74 68 65 6e 20 69 49 64 78  s set, then iIdx
28970 43 75 72 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  Cur is.** the fi
28980 72 73 74 20 63 75 72 73 6f 72 20 69 6e 20 61 6e  rst cursor in an
28990 20 61 72 72 61 79 20 6f 66 20 63 75 72 73 6f 72   array of cursor
289a0 73 20 66 6f 72 20 61 6c 6c 20 69 6e 64 69 63 65  s for all indice
289b0 73 2e 20 20 69 49 64 78 43 75 72 20 73 68 6f 75  s.  iIdxCur shou
289c0 6c 64 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f  ld.** be used to
289d0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 61 70 70   compute the app
289e0 72 6f 70 72 69 61 74 65 20 63 75 72 73 6f 72 20  ropriate cursor 
289f0 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69  depending on whi
28a00 63 68 20 69 6e 64 65 78 20 69 73 0a 2a 2a 20 75  ch index is.** u
28a10 73 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66  sed..*/.WhereInf
28a20 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42  o *sqlite3WhereB
28a30 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70  egin(.  Parse *p
28a40 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
28a50 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
28a60 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
28a70 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
28a80 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73     /* FROM claus
28a90 65 3a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c  e: A list of all
28aa0 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63   tables to be sc
28ab0 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20  anned */.  Expr 
28ac0 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
28ad0 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
28ae0 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
28af0 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
28b00 20 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20      /* An ORDER 
28b10 42 59 20 28 6f 72 20 47 52 4f 55 50 20 42 59 29  BY (or GROUP BY)
28b20 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c   clause, or NULL
28b30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
28b40 70 52 65 73 75 6c 74 53 65 74 2c 20 20 20 2f 2a  pResultSet,   /*
28b50 20 51 75 65 72 79 20 72 65 73 75 6c 74 20 73 65   Query result se
28b60 74 2e 20 20 52 65 71 27 64 20 66 6f 72 20 44 49  t.  Req'd for DI
28b70 53 54 49 4e 43 54 20 2a 2f 0a 20 20 75 31 36 20  STINCT */.  u16 
28b80 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20  wctrlFlags,     
28b90 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
28ba0 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64  _* flags defined
28bb0 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20   in sqliteInt.h 
28bc0 2a 2f 0a 20 20 69 6e 74 20 69 41 75 78 41 72 67  */.  int iAuxArg
28bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28be0 49 66 20 57 48 45 52 45 5f 4f 52 5f 53 55 42 43  If WHERE_OR_SUBC
28bf0 4c 41 55 53 45 20 69 73 20 73 65 74 2c 20 69 6e  LAUSE is set, in
28c00 64 65 78 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  dex cursor numbe
28c10 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r.              
28c20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49              ** I
28c30 66 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49  f WHERE_USE_LIMI
28c40 54 2c 20 74 68 65 6e 20 74 68 65 20 6c 69 6d 69  T, then the limi
28c50 74 20 61 6d 6f 75 6e 74 20 2a 2f 0a 29 7b 0a 20  t amount */.){. 
28c60 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b   int nByteWInfo;
28c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
28c80 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61  um. bytes alloca
28c90 74 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66  ted for WhereInf
28ca0 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e  o struct */.  in
28cb0 74 20 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20  t nTabList;     
28cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
28cd0 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
28ce0 6e 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20  n pTabList */.  
28cf0 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
28d00 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69  o;         /* Wi
28d10 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65  ll become the re
28d20 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
28d30 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
28d40 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
28d50 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54  e->pVdbe;   /* T
28d60 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62  he virtual datab
28d70 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20  ase engine */.  
28d80 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79  Bitmask notReady
28d90 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  ;          /* Cu
28da0 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
28db0 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65  ot yet positione
28dc0 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 6f 6f 70  d */.  WhereLoop
28dd0 42 75 69 6c 64 65 72 20 73 57 4c 42 3b 20 20 20  Builder sWLB;   
28de0 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 4c 6f    /* The WhereLo
28df0 6f 70 20 62 75 69 6c 64 65 72 20 2a 2f 0a 20 20  op builder */.  
28e00 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
28e10 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54 68  askSet;    /* Th
28e20 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73  e expression mas
28e30 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65  k set */.  Where
28e40 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20  Level *pLevel;  
28e50 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
28e60 65 20 6c 65 76 65 6c 20 69 6e 20 70 57 49 6e 66  e level in pWInf
28e70 6f 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  o->a[] */.  Wher
28e80 65 4c 6f 6f 70 20 2a 70 4c 6f 6f 70 3b 20 20 20  eLoop *pLoop;   
28e90 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
28ea0 72 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 57 68  r to a single Wh
28eb0 65 72 65 4c 6f 6f 70 20 6f 62 6a 65 63 74 20 2a  ereLoop object *
28ec0 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20  /.  int ii;     
28ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28ee0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
28ef0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
28f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28f10 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
28f20 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ction */.  int r
28f30 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
28f40 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
28f50 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20 62 46 6f  code */.  u8 bFo
28f60 72 64 65 6c 65 74 65 20 3d 20 30 3b 20 20 20 20  rdelete = 0;    
28f70 20 20 20 20 20 2f 2a 20 4f 50 46 4c 41 47 5f 46       /* OPFLAG_F
28f80 4f 52 44 45 4c 45 54 45 20 6f 72 20 7a 65 72 6f  ORDELETE or zero
28f90 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  , as appropriate
28fa0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 28   */..  assert( (
28fb0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
28fc0 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49  RE_ONEPASS_MULTI
28fd0 52 4f 57 29 3d 3d 30 20 7c 7c 20 28 0a 20 20 20  ROW)==0 || (.   
28fe0 20 20 20 20 20 28 77 63 74 72 6c 46 6c 61 67 73       (wctrlFlags
28ff0 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53 53   & WHERE_ONEPASS
29000 5f 44 45 53 49 52 45 44 29 21 3d 30 20 0a 20 20  _DESIRED)!=0 .  
29010 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67     && (wctrlFlag
29020 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42  s & WHERE_OR_SUB
29030 43 4c 41 55 53 45 29 3d 3d 30 20 0a 20 20 29 29  CLAUSE)==0 .  ))
29040 3b 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 6f 6e 65  ;..  /* Only one
29050 20 6f 66 20 57 48 45 52 45 5f 4f 52 5f 53 55 42   of WHERE_OR_SUB
29060 43 4c 41 55 53 45 20 6f 72 20 57 48 45 52 45 5f  CLAUSE or WHERE_
29070 55 53 45 5f 4c 49 4d 49 54 20 2a 2f 0a 20 20 61  USE_LIMIT */.  a
29080 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61  ssert( (wctrlFla
29090 67 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55  gs & WHERE_OR_SU
290a0 42 43 4c 41 55 53 45 29 3d 3d 30 0a 20 20 20 20  BCLAUSE)==0.    
290b0 20 20 20 20 20 20 20 20 7c 7c 20 28 77 63 74 72          || (wctr
290c0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55  lFlags & WHERE_U
290d0 53 45 5f 4c 49 4d 49 54 29 3d 3d 30 20 29 3b 0a  SE_LIMIT)==0 );.
290e0 0a 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69  .  /* Variable i
290f0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f  nitialization */
29100 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
29110 64 62 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 57  db;.  memset(&sW
29120 4c 42 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 57  LB, 0, sizeof(sW
29130 4c 42 29 29 3b 0a 0a 20 20 2f 2a 20 41 6e 20 4f  LB));..  /* An O
29140 52 44 45 52 2f 47 52 4f 55 50 20 42 59 20 63 6c  RDER/GROUP BY cl
29150 61 75 73 65 20 6f 66 20 6d 6f 72 65 20 74 68 61  ause of more tha
29160 6e 20 36 33 20 74 65 72 6d 73 20 63 61 6e 6e 6f  n 63 terms canno
29170 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 2a  t be optimized *
29180 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 4f  /.  testcase( pO
29190 72 64 65 72 42 79 20 26 26 20 70 4f 72 64 65 72  rderBy && pOrder
291a0 42 79 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d 31  By->nExpr==BMS-1
291b0 20 29 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72   );.  if( pOrder
291c0 42 79 20 26 26 20 70 4f 72 64 65 72 42 79 2d 3e  By && pOrderBy->
291d0 6e 45 78 70 72 3e 3d 42 4d 53 20 29 20 70 4f 72  nExpr>=BMS ) pOr
291e0 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 73 57 4c  derBy = 0;.  sWL
291f0 42 2e 70 4f 72 64 65 72 42 79 20 3d 20 70 4f 72  B.pOrderBy = pOr
29200 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 44 69 73  derBy;..  /* Dis
29210 61 62 6c 65 20 74 68 65 20 44 49 53 54 49 4e 43  able the DISTINC
29220 54 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  T optimization i
29230 66 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63  f SQLITE_Distinc
29240 74 4f 70 74 20 69 73 20 73 65 74 20 76 69 61 0a  tOpt is set via.
29250 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    ** sqlite3_tes
29260 74 5f 63 74 72 6c 28 53 51 4c 49 54 45 5f 54 45  t_ctrl(SQLITE_TE
29270 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
29280 49 4f 4e 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69  IONS,...) */.  i
29290 66 28 20 4f 70 74 69 6d 69 7a 61 74 69 6f 6e 44  f( OptimizationD
292a0 69 73 61 62 6c 65 64 28 64 62 2c 20 53 51 4c 49  isabled(db, SQLI
292b0 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 29 20  TE_DistinctOpt) 
292c0 29 7b 0a 20 20 20 20 77 63 74 72 6c 46 6c 61 67  ){.    wctrlFlag
292d0 73 20 26 3d 20 7e 57 48 45 52 45 5f 57 41 4e 54  s &= ~WHERE_WANT
292e0 5f 44 49 53 54 49 4e 43 54 3b 0a 20 20 7d 0a 0a  _DISTINCT;.  }..
292f0 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
29300 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
29310 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
29320 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e  limited by the n
29330 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69  umber of.  ** bi
29340 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20  ts in a Bitmask 
29350 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
29360 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
29370 3d 3d 42 4d 53 20 29 3b 0a 20 20 69 66 28 20 70  ==BMS );.  if( p
29380 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d  TabList->nSrc>BM
29390 53 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  S ){.    sqlite3
293a0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
293b0 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62   "at most %d tab
293c0 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20  les in a join", 
293d0 42 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  BMS);.    return
293e0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   0;.  }..  /* Th
293f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d  is function norm
29400 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 73 20 61  ally generates a
29410 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 66 6f 72   nested loop for
29420 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 0a   all tables in .
29430 20 20 2a 2a 20 70 54 61 62 4c 69 73 74 2e 20 20    ** pTabList.  
29440 42 75 74 20 69 66 20 74 68 65 20 57 48 45 52 45  But if the WHERE
29450 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 20 66 6c  _OR_SUBCLAUSE fl
29460 61 67 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  ag is set, then 
29470 77 65 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f  we should.  ** o
29480 6e 6c 79 20 67 65 6e 65 72 61 74 65 20 63 6f 64  nly generate cod
29490 65 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  e for the first 
294a0 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73  table in pTabLis
294b0 74 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68 61  t and assume tha
294c0 74 0a 20 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f  t.  ** any curso
294d0 72 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  rs associated wi
294e0 74 68 20 73 75 62 73 65 71 75 65 6e 74 20 74 61  th subsequent ta
294f0 62 6c 65 73 20 61 72 65 20 75 6e 69 6e 69 74 69  bles are uniniti
29500 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e  alized..  */.  n
29510 54 61 62 4c 69 73 74 20 3d 20 28 77 63 74 72 6c  TabList = (wctrl
29520 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
29530 5f 53 55 42 43 4c 41 55 53 45 29 20 3f 20 31 20  _SUBCLAUSE) ? 1 
29540 3a 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  : pTabList->nSrc
29550 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
29560 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
29570 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74  the WhereInfo st
29580 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c  ructure that wil
29590 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a  l become the.  *
295a0 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20  * return value. 
295b0 41 20 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74  A single allocat
295c0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73  ion is used to s
295d0 74 6f 72 65 20 74 68 65 20 57 68 65 72 65 49 6e  tore the WhereIn
295e0 66 6f 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c 20  fo.  ** struct, 
295f0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
29600 57 68 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74  WhereInfo.a[], t
29610 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  he WhereClause s
29620 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e  tructure.  ** an
29630 64 20 74 68 65 20 57 68 65 72 65 4d 61 73 6b 53  d the WhereMaskS
29640 65 74 20 73 74 72 75 63 74 75 72 65 2e 20 53 69  et structure. Si
29650 6e 63 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  nce WhereClause 
29660 63 6f 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62 79  contains an 8-by
29670 74 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28 74  te.  ** field (t
29680 79 70 65 20 42 69 74 6d 61 73 6b 29 20 69 74 20  ype Bitmask) it 
29690 6d 75 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20  must be aligned 
296a0 6f 6e 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75  on an 8-byte bou
296b0 6e 64 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f  ndary on.  ** so
296c0 6d 65 20 61 72 63 68 69 74 65 63 74 75 72 65 73  me architectures
296d0 2e 20 48 65 6e 63 65 20 74 68 65 20 52 4f 55 4e  . Hence the ROUN
296e0 44 38 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f  D8() below..  */
296f0 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20  .  nByteWInfo = 
29700 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57 68  ROUND8(sizeof(Wh
29710 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c 69  ereInfo)+(nTabLi
29720 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65  st-1)*sizeof(Whe
29730 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57 49  reLevel));.  pWI
29740 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  nfo = sqlite3DbM
29750 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 6e  allocRawNN(db, n
29760 42 79 74 65 57 49 6e 66 6f 20 2b 20 73 69 7a 65  ByteWInfo + size
29770 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 29 3b 0a  of(WhereLoop));.
29780 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
29790 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
297a0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
297b0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49  pWInfo);.    pWI
297c0 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  nfo = 0;.    got
297d0 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
297e0 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d  r;.  }.  pWInfo-
297f0 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  >pParse = pParse
29800 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  ;.  pWInfo->pTab
29810 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b  List = pTabList;
29820 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65  .  pWInfo->pOrde
29830 72 42 79 20 3d 20 70 4f 72 64 65 72 42 79 3b 0a  rBy = pOrderBy;.
29840 20 20 70 57 49 6e 66 6f 2d 3e 70 57 68 65 72 65    pWInfo->pWhere
29850 20 3d 20 70 57 68 65 72 65 3b 0a 20 20 70 57 49   = pWhere;.  pWI
29860 6e 66 6f 2d 3e 70 52 65 73 75 6c 74 53 65 74 20  nfo->pResultSet 
29870 3d 20 70 52 65 73 75 6c 74 53 65 74 3b 0a 20 20  = pResultSet;.  
29880 70 57 49 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65  pWInfo->aiCurOne
29890 50 61 73 73 5b 30 5d 20 3d 20 70 57 49 6e 66 6f  Pass[0] = pWInfo
298a0 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73 73 5b 31  ->aiCurOnePass[1
298b0 5d 20 3d 20 2d 31 3b 0a 20 20 70 57 49 6e 66 6f  ] = -1;.  pWInfo
298c0 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c  ->nLevel = nTabL
298d0 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69  ist;.  pWInfo->i
298e0 42 72 65 61 6b 20 3d 20 70 57 49 6e 66 6f 2d 3e  Break = pWInfo->
298f0 69 43 6f 6e 74 69 6e 75 65 20 3d 20 73 71 6c 69  iContinue = sqli
29900 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
29910 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77  (v);.  pWInfo->w
29920 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72  ctrlFlags = wctr
29930 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66 6f  lFlags;.  pWInfo
29940 2d 3e 69 4c 69 6d 69 74 20 3d 20 69 41 75 78 41  ->iLimit = iAuxA
29950 72 67 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 73 61  rg;.  pWInfo->sa
29960 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d 20  vedNQueryLoop = 
29970 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
29980 6f 70 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 57  op;.  memset(&pW
29990 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c 20 30 2c  Info->nOBSat, 0,
299a0 20 0a 20 20 20 20 20 20 20 20 20 6f 66 66 73 65   .         offse
299b0 74 6f 66 28 57 68 65 72 65 49 6e 66 6f 2c 73 57  tof(WhereInfo,sW
299c0 43 29 20 2d 20 6f 66 66 73 65 74 6f 66 28 57 68  C) - offsetof(Wh
299d0 65 72 65 49 6e 66 6f 2c 6e 4f 42 53 61 74 29 29  ereInfo,nOBSat))
299e0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 57 49 6e  ;.  memset(&pWIn
299f0 66 6f 2d 3e 61 5b 30 5d 2c 20 30 2c 20 73 69 7a  fo->a[0], 0, siz
29a00 65 6f 66 28 57 68 65 72 65 4c 6f 6f 70 29 2b 6e  eof(WhereLoop)+n
29a10 54 61 62 4c 69 73 74 2a 73 69 7a 65 6f 66 28 57  TabList*sizeof(W
29a20 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 61  hereLevel));.  a
29a30 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d 3e 65  ssert( pWInfo->e
29a40 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53  OnePass==ONEPASS
29a50 5f 4f 46 46 20 29 3b 20 20 2f 2a 20 4f 4e 45 50  _OFF );  /* ONEP
29a60 41 53 53 20 64 65 66 61 75 6c 74 73 20 74 6f 20  ASS defaults to 
29a70 4f 46 46 20 2a 2f 0a 20 20 70 4d 61 73 6b 53 65  OFF */.  pMaskSe
29a80 74 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 73 4d 61  t = &pWInfo->sMa
29a90 73 6b 53 65 74 3b 0a 20 20 73 57 4c 42 2e 70 57  skSet;.  sWLB.pW
29aa0 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 3b 0a 20  Info = pWInfo;. 
29ab0 20 73 57 4c 42 2e 70 57 43 20 3d 20 26 70 57 49   sWLB.pWC = &pWI
29ac0 6e 66 6f 2d 3e 73 57 43 3b 0a 20 20 73 57 4c 42  nfo->sWC;.  sWLB
29ad0 2e 70 4e 65 77 20 3d 20 28 57 68 65 72 65 4c 6f  .pNew = (WhereLo
29ae0 6f 70 2a 29 28 28 28 63 68 61 72 2a 29 70 57 49  op*)(((char*)pWI
29af0 6e 66 6f 29 2b 6e 42 79 74 65 57 49 6e 66 6f 29  nfo)+nByteWInfo)
29b00 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  ;.  assert( EIGH
29b10 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
29b20 28 73 57 4c 42 2e 70 4e 65 77 29 20 29 3b 0a 20  (sWLB.pNew) );. 
29b30 20 77 68 65 72 65 4c 6f 6f 70 49 6e 69 74 28 73   whereLoopInit(s
29b40 57 4c 42 2e 70 4e 65 77 29 3b 0a 23 69 66 64 65  WLB.pNew);.#ifde
29b50 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
29b60 20 73 57 4c 42 2e 70 4e 65 77 2d 3e 63 49 64 20   sWLB.pNew->cId 
29b70 3d 20 27 2a 27 3b 0a 23 65 6e 64 69 66 0a 0a 20  = '*';.#endif.. 
29b80 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48   /* Split the WH
29b90 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20  ERE clause into 
29ba0 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70 72  separate subexpr
29bb0 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61  essions where ea
29bc0 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65  ch.  ** subexpre
29bd0 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74  ssion is separat
29be0 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65  ed by an AND ope
29bf0 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e  rator..  */.  in
29c00 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53  itMaskSet(pMaskS
29c10 65 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 68  et);.  sqlite3Wh
29c20 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26 70  ereClauseInit(&p
29c30 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 57 49 6e  WInfo->sWC, pWIn
29c40 66 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 57 68  fo);.  sqlite3Wh
29c50 65 72 65 53 70 6c 69 74 28 26 70 57 49 6e 66 6f  ereSplit(&pWInfo
29c60 2d 3e 73 57 43 2c 20 70 57 68 65 72 65 2c 20 54  ->sWC, pWhere, T
29c70 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f  K_AND);.    .  /
29c80 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
29c90 4e 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 20  No FROM clause. 
29ca0 20 2a 2f 0a 20 20 69 66 28 20 6e 54 61 62 4c 69   */.  if( nTabLi
29cb0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  st==0 ){.    if(
29cc0 20 70 4f 72 64 65 72 42 79 20 29 20 70 57 49 6e   pOrderBy ) pWIn
29cd0 66 6f 2d 3e 6e 4f 42 53 61 74 20 3d 20 70 4f 72  fo->nOBSat = pOr
29ce0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
29cf0 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73    if( wctrlFlags
29d00 20 26 20 57 48 45 52 45 5f 57 41 4e 54 5f 44 49   & WHERE_WANT_DI
29d10 53 54 49 4e 43 54 20 29 7b 0a 20 20 20 20 20 20  STINCT ){.      
29d20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63  pWInfo->eDistinc
29d30 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e  t = WHERE_DISTIN
29d40 43 54 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d  CT_UNIQUE;.    }
29d50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
29d60 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66 72   Assign a bit fr
29d70 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74  om the bitmask t
29d80 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20  o every term in 
29d90 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
29da0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
29db0 68 65 20 4e 2d 74 68 20 74 65 72 6d 20 6f 66 20  he N-th term of 
29dc0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
29dd0 69 73 20 61 73 73 69 67 6e 65 64 20 61 20 62 69  is assigned a bi
29de0 74 6d 61 73 6b 20 6f 66 20 31 3c 3c 4e 2e 0a 20  tmask of 1<<N.. 
29df0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
29e00 20 72 75 6c 65 20 6f 66 20 74 68 65 20 70 72 65   rule of the pre
29e10 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 65  vious sentence e
29e20 6e 73 75 72 65 73 20 74 68 74 61 20 69 66 20 58  nsures thta if X
29e30 20 69 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20   is the bitmask 
29e40 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 74 61 62  for.    ** a tab
29e50 6c 65 20 54 2c 20 74 68 65 6e 20 58 2d 31 20 69  le T, then X-1 i
29e60 73 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  s the bitmask fo
29e70 72 20 61 6c 6c 20 6f 74 68 65 72 20 74 61 62 6c  r all other tabl
29e80 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  es to the left o
29e90 66 20 54 2e 0a 20 20 20 20 2a 2a 20 4b 6e 6f 77  f T..    ** Know
29ea0 69 6e 67 20 74 68 65 20 62 69 74 6d 61 73 6b 20  ing the bitmask 
29eb0 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74  for all tables t
29ec0 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20  o the left of a 
29ed0 6c 65 66 74 20 6a 6f 69 6e 20 69 73 0a 20 20 20  left join is.   
29ee0 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20   ** important.  
29ef0 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a 20 20  Ticket #3015..  
29f00 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
29f10 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20 61   that bitmasks a
29f20 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20 61  re created for a
29f30 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  ll pTabList->nSr
29f40 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 20 20  c tables in.    
29f50 2a 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74  ** pTabList, not
29f60 20 6a 75 73 74 20 74 68 65 20 66 69 72 73 74 20   just the first 
29f70 6e 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e  nTabList tables.
29f80 20 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f    nTabList is no
29f90 72 6d 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 65 71  rmally.    ** eq
29fa0 75 61 6c 20 74 6f 20 70 54 61 62 4c 69 73 74 2d  ual to pTabList-
29fb0 3e 6e 53 72 63 20 62 75 74 20 6d 69 67 68 74 20  >nSrc but might 
29fc0 62 65 20 73 68 6f 72 74 65 6e 65 64 20 74 6f 20  be shortened to 
29fd0 31 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  1 if the.    ** 
29fe0 57 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55  WHERE_OR_SUBCLAU
29ff0 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  SE flag is set..
2a000 20 20 20 20 2a 2f 0a 20 20 20 20 69 69 20 3d 20      */.    ii = 
2a010 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  0;.    do{.     
2a020 20 63 72 65 61 74 65 4d 61 73 6b 28 70 4d 61 73   createMask(pMas
2a030 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e  kSet, pTabList->
2a040 61 5b 69 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  a[ii].iCursor);.
2a050 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
2a060 72 65 54 61 62 46 75 6e 63 41 72 67 73 28 70 50  reTabFuncArgs(pP
2a070 61 72 73 65 2c 20 26 70 54 61 62 4c 69 73 74 2d  arse, &pTabList-
2a080 3e 61 5b 69 69 5d 2c 20 26 70 57 49 6e 66 6f 2d  >a[ii], &pWInfo-
2a090 3e 73 57 43 29 3b 0a 20 20 20 20 7d 77 68 69 6c  >sWC);.    }whil
2a0a0 65 28 20 28 2b 2b 69 69 29 3c 70 54 61 62 4c 69  e( (++ii)<pTabLi
2a0b0 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 23 69  st->nSrc );.  #i
2a0c0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2a0d0 47 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 42 69  G.    {.      Bi
2a0e0 74 6d 61 73 6b 20 6d 78 20 3d 20 30 3b 0a 20 20  tmask mx = 0;.  
2a0f0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
2a100 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
2a110 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
2a120 42 69 74 6d 61 73 6b 20 6d 20 3d 20 73 71 6c 69  Bitmask m = sqli
2a130 74 65 33 57 68 65 72 65 47 65 74 4d 61 73 6b 28  te3WhereGetMask(
2a140 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  pMaskSet, pTabLi
2a150 73 74 2d 3e 61 5b 69 69 5d 2e 69 43 75 72 73 6f  st->a[ii].iCurso
2a160 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
2a170 72 74 28 20 6d 3e 3d 6d 78 20 29 3b 0a 20 20 20  rt( m>=mx );.   
2a180 20 20 20 20 20 6d 78 20 3d 20 6d 3b 0a 20 20 20       mx = m;.   
2a190 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 23 65 6e     }.    }.  #en
2a1a0 64 69 66 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  dif.  }.  .  /* 
2a1b0 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74  Analyze all of t
2a1c0 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
2a1d0 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 57  s. */.  sqlite3W
2a1e0 68 65 72 65 45 78 70 72 41 6e 61 6c 79 7a 65 28  hereExprAnalyze(
2a1f0 70 54 61 62 4c 69 73 74 2c 20 26 70 57 49 6e 66  pTabList, &pWInf
2a200 6f 2d 3e 73 57 43 29 3b 0a 20 20 69 66 28 20 64  o->sWC);.  if( d
2a210 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
2a220 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69  ) goto whereBegi
2a230 6e 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 53 70  nError;..  /* Sp
2a240 65 63 69 61 6c 20 63 61 73 65 3a 20 57 48 45 52  ecial case: WHER
2a250 45 20 74 65 72 6d 73 20 74 68 61 74 20 64 6f 20  E terms that do 
2a260 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61 6e 79  not refer to any
2a270 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a   tables in the j
2a280 6f 69 6e 0a 20 20 2a 2a 20 28 63 6f 6e 73 74 61  oin.  ** (consta
2a290 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 29 2e  nt expressions).
2a2a0 20 45 76 61 6c 75 61 74 65 20 65 61 63 68 20 73   Evaluate each s
2a2b0 75 63 68 20 74 65 72 6d 2c 20 61 6e 64 20 6a 75  uch term, and ju
2a2c0 6d 70 20 6f 76 65 72 20 61 6c 6c 20 74 68 65 0a  mp over all the.
2a2d0 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 63    ** generated c
2a2e0 6f 64 65 20 69 66 20 74 68 65 20 72 65 73 75 6c  ode if the resul
2a2f0 74 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 20  t is not true.  
2a300 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 6f 20 6e 6f  .  **.  ** Do no
2a310 74 20 64 6f 20 74 68 69 73 20 69 66 20 74 68 65  t do this if the
2a320 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74   expression cont
2a330 61 69 6e 73 20 6e 6f 6e 2d 64 65 74 65 72 6d 69  ains non-determi
2a340 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 73  nistic functions
2a350 0a 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 6e  .  ** that are n
2a360 6f 74 20 77 69 74 68 69 6e 20 61 20 73 75 62 2d  ot within a sub-
2a370 73 65 6c 65 63 74 2e 20 54 68 69 73 20 69 73 20  select. This is 
2a380 6e 6f 74 20 73 74 72 69 63 74 6c 79 20 72 65 71  not strictly req
2a390 75 69 72 65 64 2c 20 62 75 74 0a 20 20 2a 2a 20  uired, but.  ** 
2a3a0 70 72 65 73 65 72 76 65 73 20 53 51 4c 69 74 65  preserves SQLite
2a3b0 27 73 20 6c 65 67 61 63 79 20 62 65 68 61 76 69  's legacy behavi
2a3c0 6f 75 72 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  our in the follo
2a3d0 77 69 6e 67 20 74 77 6f 20 63 61 73 65 73 3a 0a  wing two cases:.
2a3e0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 46 52 4f 4d    **.  **   FROM
2a3f0 20 2e 2e 2e 20 57 48 45 52 45 20 72 61 6e 64 6f   ... WHERE rando
2a400 6d 28 29 3e 30 3b 20 20 20 20 20 20 20 20 20 20  m()>0;          
2a410 20 2d 2d 20 65 76 61 6c 20 72 61 6e 64 6f 6d 28   -- eval random(
2a420 29 20 6f 6e 63 65 20 70 65 72 20 72 6f 77 0a 20  ) once per row. 
2a430 20 2a 2a 20 20 20 46 52 4f 4d 20 2e 2e 2e 20 57   **   FROM ... W
2a440 48 45 52 45 20 28 53 45 4c 45 43 54 20 72 61 6e  HERE (SELECT ran
2a450 64 6f 6d 28 29 29 3e 30 3b 20 20 2d 2d 20 65 76  dom())>0;  -- ev
2a460 61 6c 20 72 61 6e 64 6f 6d 28 29 20 6f 6e 63 65  al random() once
2a470 20 6f 76 65 72 61 6c 6c 0a 20 20 2a 2f 0a 20 20   overall.  */.  
2a480 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 73 57 4c  for(ii=0; ii<sWL
2a490 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 69  B.pWC->nTerm; ii
2a4a0 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65  ++){.    WhereTe
2a4b0 72 6d 20 2a 70 54 20 3d 20 26 73 57 4c 42 2e 70  rm *pT = &sWLB.p
2a4c0 57 43 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 69  WC->a[ii];.    i
2a4d0 66 28 20 70 54 2d 3e 70 72 65 72 65 71 41 6c 6c  f( pT->prereqAll
2a4e0 3d 3d 30 20 26 26 20 28 6e 54 61 62 4c 69 73 74  ==0 && (nTabList
2a4f0 3d 3d 30 20 7c 7c 20 65 78 70 72 49 73 44 65 74  ==0 || exprIsDet
2a500 65 72 6d 69 6e 69 73 74 69 63 28 70 54 2d 3e 70  erministic(pT->p
2a510 45 78 70 72 29 29 20 29 7b 0a 20 20 20 20 20 20  Expr)) ){.      
2a520 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
2a530 73 65 28 70 50 61 72 73 65 2c 20 70 54 2d 3e 70  se(pParse, pT->p
2a540 45 78 70 72 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  Expr, pWInfo->iB
2a550 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  reak, SQLITE_JUM
2a560 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
2a570 70 54 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  pT->wtFlags |= T
2a580 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d  ERM_CODED;.    }
2a590 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 63 74 72  .  }..  if( wctr
2a5a0 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 57  lFlags & WHERE_W
2a5b0 41 4e 54 5f 44 49 53 54 49 4e 43 54 20 29 7b 0a  ANT_DISTINCT ){.
2a5c0 20 20 20 20 69 66 28 20 69 73 44 69 73 74 69 6e      if( isDistin
2a5d0 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61 72  ctRedundant(pPar
2a5e0 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 26 70  se, pTabList, &p
2a5f0 57 49 6e 66 6f 2d 3e 73 57 43 2c 20 70 52 65 73  WInfo->sWC, pRes
2a600 75 6c 74 53 65 74 29 20 29 7b 0a 20 20 20 20 20  ultSet) ){.     
2a610 20 2f 2a 20 54 68 65 20 44 49 53 54 49 4e 43 54   /* The DISTINCT
2a620 20 6d 61 72 6b 69 6e 67 20 69 73 20 70 6f 69 6e   marking is poin
2a630 74 6c 65 73 73 2e 20 20 49 67 6e 6f 72 65 20 69  tless.  Ignore i
2a640 74 2e 20 2a 2f 0a 20 20 20 20 20 20 70 57 49 6e  t. */.      pWIn
2a650 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
2a660 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
2a670 4e 49 51 55 45 3b 0a 20 20 20 20 7d 65 6c 73 65  NIQUE;.    }else
2a680 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
2a690 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79   ){.      /* Try
2a6a0 20 74 6f 20 4f 52 44 45 52 20 42 59 20 74 68 65   to ORDER BY the
2a6b0 20 72 65 73 75 6c 74 20 73 65 74 20 74 6f 20 6d   result set to m
2a6c0 61 6b 65 20 64 69 73 74 69 6e 63 74 20 70 72 6f  ake distinct pro
2a6d0 63 65 73 73 69 6e 67 20 65 61 73 69 65 72 20 2a  cessing easier *
2a6e0 2f 0a 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e  /.      pWInfo->
2a6f0 77 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 48  wctrlFlags |= WH
2a700 45 52 45 5f 44 49 53 54 49 4e 43 54 42 59 3b 0a  ERE_DISTINCTBY;.
2a710 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 4f        pWInfo->pO
2a720 72 64 65 72 42 79 20 3d 20 70 52 65 73 75 6c 74  rderBy = pResult
2a730 53 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Set;.    }.  }..
2a740 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 74    /* Construct t
2a750 68 65 20 57 68 65 72 65 4c 6f 6f 70 20 6f 62 6a  he WhereLoop obj
2a760 65 63 74 73 20 2a 2f 0a 23 69 66 20 64 65 66 69  ects */.#if defi
2a770 6e 65 64 28 57 48 45 52 45 54 52 41 43 45 5f 45  ned(WHERETRACE_E
2a780 4e 41 42 4c 45 44 29 0a 20 20 69 66 28 20 73 71  NABLED).  if( sq
2a790 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
2a7a0 26 20 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20  & 0xffff ){.    
2a7b0 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2a7c0 74 66 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  tf("*** Optimize
2a7d0 72 20 53 74 61 72 74 20 2a 2a 2a 20 28 77 63 74  r Start *** (wct
2a7e0 72 6c 46 6c 61 67 73 3a 20 30 78 25 78 22 2c 77  rlFlags: 0x%x",w
2a7f0 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20  ctrlFlags);.    
2a800 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 20 26  if( wctrlFlags &
2a810 20 57 48 45 52 45 5f 55 53 45 5f 4c 49 4d 49 54   WHERE_USE_LIMIT
2a820 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2a830 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 2c 20  3DebugPrintf(", 
2a840 6c 69 6d 69 74 3a 20 25 64 22 2c 20 69 41 75 78  limit: %d", iAux
2a850 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Arg);.    }.    
2a860 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2a870 74 66 28 22 29 5c 6e 22 29 3b 0a 20 20 7d 0a 20  tf(")\n");.  }. 
2a880 20 69 66 28 20 73 71 6c 69 74 65 33 57 68 65 72   if( sqlite3Wher
2a890 65 54 72 61 63 65 20 26 20 30 78 31 30 30 20 29  eTrace & 0x100 )
2a8a0 7b 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c  { /* Display all
2a8b0 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
2a8c0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
2a8d0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 43 6c    sqlite3WhereCl
2a8e0 61 75 73 65 50 72 69 6e 74 28 73 57 4c 42 2e 70  ausePrint(sWLB.p
2a8f0 57 43 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  WC);.  }.#endif.
2a900 0a 20 20 69 66 28 20 6e 54 61 62 4c 69 73 74 21  .  if( nTabList!
2a910 3d 31 20 7c 7c 20 77 68 65 72 65 53 68 6f 72 74  =1 || whereShort
2a920 43 75 74 28 26 73 57 4c 42 29 3d 3d 30 20 29 7b  Cut(&sWLB)==0 ){
2a930 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 4c  .    rc = whereL
2a940 6f 6f 70 41 64 64 41 6c 6c 28 26 73 57 4c 42 29  oopAddAll(&sWLB)
2a950 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2a960 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
2a970 72 6f 72 3b 0a 20 20 0a 23 69 66 64 65 66 20 57  ror;.  .#ifdef W
2a980 48 45 52 45 54 52 41 43 45 5f 45 4e 41 42 4c 45  HERETRACE_ENABLE
2a990 44 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  D.    if( sqlite
2a9a0 33 57 68 65 72 65 54 72 61 63 65 20 29 7b 20 20  3WhereTrace ){  
2a9b0 20 20 2f 2a 20 44 69 73 70 6c 61 79 20 61 6c 6c    /* Display all
2a9c0 20 6f 66 20 74 68 65 20 57 68 65 72 65 4c 6f 6f   of the WhereLoo
2a9d0 70 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 20  p objects */.   
2a9e0 20 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a 70 3b     WhereLoop *p;
2a9f0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
2aa00 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
2aa10 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 5d 20 3d   char zLabel[] =
2aa20 20 22 30 31 32 33 34 35 36 37 38 39 61 62 63 64   "0123456789abcd
2aa30 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
2aa40 75 76 77 79 78 7a 22 0a 20 20 20 20 20 20 20 20  uvwyxz".        
2aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa70 20 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a       "ABCDEFGHIJ
2aa80 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 59 58 5a  KLMNOPQRSTUVWYXZ
2aa90 22 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 3d 70  ";.      for(p=p
2aaa0 57 49 6e 66 6f 2d 3e 70 4c 6f 6f 70 73 2c 20 69  WInfo->pLoops, i
2aab0 3d 30 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  =0; p; p=p->pNex
2aac0 74 4c 6f 6f 70 2c 20 69 2b 2b 29 7b 0a 20 20 20  tLoop, i++){.   
2aad0 20 20 20 20 20 70 2d 3e 63 49 64 20 3d 20 7a 4c       p->cId = zL
2aae0 61 62 65 6c 5b 69 25 28 73 69 7a 65 6f 66 28 7a  abel[i%(sizeof(z
2aaf0 4c 61 62 65 6c 29 2d 31 29 5d 3b 0a 20 20 20 20  Label)-1)];.    
2ab00 20 20 20 20 77 68 65 72 65 4c 6f 6f 70 50 72 69      whereLoopPri
2ab10 6e 74 28 70 2c 20 73 57 4c 42 2e 70 57 43 29 3b  nt(p, sWLB.pWC);
2ab20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
2ab30 65 6e 64 69 66 0a 20 20 0a 20 20 20 20 77 68 65  endif.  .    whe
2ab40 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49  rePathSolver(pWI
2ab50 6e 66 6f 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  nfo, 0);.    if(
2ab60 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
2ab70 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42 65  d ) goto whereBe
2ab80 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 69 66  ginError;.    if
2ab90 28 20 70 57 49 6e 66 6f 2d 3e 70 4f 72 64 65 72  ( pWInfo->pOrder
2aba0 42 79 20 29 7b 0a 20 20 20 20 20 20 20 77 68 65  By ){.       whe
2abb0 72 65 50 61 74 68 53 6f 6c 76 65 72 28 70 57 49  rePathSolver(pWI
2abc0 6e 66 6f 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f  nfo, pWInfo->nRo
2abd0 77 4f 75 74 2b 31 29 3b 0a 20 20 20 20 20 20 20  wOut+1);.       
2abe0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
2abf0 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72  iled ) goto wher
2ac00 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20  eBeginError;.   
2ac10 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 49   }.  }.  if( pWI
2ac20 6e 66 6f 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  nfo->pOrderBy==0
2ac30 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26   && (db->flags &
2ac40 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f   SQLITE_ReverseO
2ac50 72 64 65 72 29 21 3d 30 20 29 7b 0a 20 20 20 20  rder)!=0 ){.    
2ac60 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
2ac70 20 3d 20 41 4c 4c 42 49 54 53 3b 0a 20 20 7d 0a   = ALLBITS;.  }.
2ac80 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
2ac90 72 72 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e  rr || NEVER(db->
2aca0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 29 7b  mallocFailed) ){
2acb0 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
2acc0 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 23  eginError;.  }.#
2acd0 69 66 64 65 66 20 57 48 45 52 45 54 52 41 43 45  ifdef WHERETRACE
2ace0 5f 45 4e 41 42 4c 45 44 0a 20 20 69 66 28 20 73  _ENABLED.  if( s
2acf0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
2ad00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
2ad10 65 62 75 67 50 72 69 6e 74 66 28 22 2d 2d 2d 2d  ebugPrintf("----
2ad20 20 53 6f 6c 75 74 69 6f 6e 20 6e 52 6f 77 3d 25   Solution nRow=%
2ad30 64 22 2c 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77  d", pWInfo->nRow
2ad40 4f 75 74 29 3b 0a 20 20 20 20 69 66 28 20 70 57  Out);.    if( pW
2ad50 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 3e 30 20 29  Info->nOBSat>0 )
2ad60 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
2ad70 65 62 75 67 50 72 69 6e 74 66 28 22 20 4f 52 44  ebugPrintf(" ORD
2ad80 45 52 42 59 3d 25 64 2c 30 78 25 6c 6c 78 22 2c  ERBY=%d,0x%llx",
2ad90 20 70 57 49 6e 66 6f 2d 3e 6e 4f 42 53 61 74 2c   pWInfo->nOBSat,
2ada0 20 70 57 49 6e 66 6f 2d 3e 72 65 76 4d 61 73 6b   pWInfo->revMask
2adb0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69  );.    }.    swi
2adc0 74 63 68 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69  tch( pWInfo->eDi
2add0 73 74 69 6e 63 74 20 29 7b 0a 20 20 20 20 20 20  stinct ){.      
2ade0 63 61 73 65 20 57 48 45 52 45 5f 44 49 53 54 49  case WHERE_DISTI
2adf0 4e 43 54 5f 55 4e 49 51 55 45 3a 20 7b 0a 20 20  NCT_UNIQUE: {.  
2ae00 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
2ae10 75 67 50 72 69 6e 74 66 28 22 20 20 44 49 53 54  ugPrintf("  DIST
2ae20 49 4e 43 54 3d 75 6e 69 71 75 65 22 29 3b 0a 20  INCT=unique");. 
2ae30 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2ae40 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
2ae50 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f   WHERE_DISTINCT_
2ae60 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20  ORDERED: {.     
2ae70 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2ae80 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43  rintf("  DISTINC
2ae90 54 3d 6f 72 64 65 72 65 64 22 29 3b 0a 20 20 20  T=ordered");.   
2aea0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2aeb0 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 57    }.      case W
2aec0 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e  HERE_DISTINCT_UN
2aed0 4f 52 44 45 52 45 44 3a 20 7b 0a 20 20 20 20 20  ORDERED: {.     
2aee0 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
2aef0 72 69 6e 74 66 28 22 20 20 44 49 53 54 49 4e 43  rintf("  DISTINC
2af00 54 3d 75 6e 6f 72 64 65 72 65 64 22 29 3b 0a 20  T=unordered");. 
2af10 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2af20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2af30 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
2af40 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f  tf("\n");.    fo
2af50 72 28 69 69 3d 30 3b 20 69 69 3c 70 57 49 6e 66  r(ii=0; ii<pWInf
2af60 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 69 2b 2b 29  o->nLevel; ii++)
2af70 7b 0a 20 20 20 20 20 20 77 68 65 72 65 4c 6f 6f  {.      whereLoo
2af80 70 50 72 69 6e 74 28 70 57 49 6e 66 6f 2d 3e 61  pPrint(pWInfo->a
2af90 5b 69 69 5d 2e 70 57 4c 6f 6f 70 2c 20 73 57 4c  [ii].pWLoop, sWL
2afa0 42 2e 70 57 43 29 3b 0a 20 20 20 20 7d 0a 20 20  B.pWC);.    }.  
2afb0 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 41 74  }.#endif.  /* At
2afc0 74 65 6d 70 74 20 74 6f 20 6f 6d 69 74 20 74 61  tempt to omit ta
2afd0 62 6c 65 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  bles from the jo
2afe0 69 6e 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 65  in that do not e
2aff0 66 66 65 63 74 20 74 68 65 20 72 65 73 75 6c 74  ffect the result
2b000 20 2a 2f 0a 20 20 69 66 28 20 70 57 49 6e 66 6f   */.  if( pWInfo
2b010 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 0a 20 20 20 26  ->nLevel>=2.   &
2b020 26 20 70 52 65 73 75 6c 74 53 65 74 21 3d 30 0a  & pResultSet!=0.
2b030 20 20 20 26 26 20 4f 70 74 69 6d 69 7a 61 74 69     && Optimizati
2b040 6f 6e 45 6e 61 62 6c 65 64 28 64 62 2c 20 53 51  onEnabled(db, SQ
2b050 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69  LITE_OmitNoopJoi
2b060 6e 29 0a 20 20 29 7b 0a 20 20 20 20 42 69 74 6d  n).  ){.    Bitm
2b070 61 73 6b 20 74 61 62 55 73 65 64 20 3d 20 73 71  ask tabUsed = sq
2b080 6c 69 74 65 33 57 68 65 72 65 45 78 70 72 4c 69  lite3WhereExprLi
2b090 73 74 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  stUsage(pMaskSet
2b0a0 2c 20 70 52 65 73 75 6c 74 53 65 74 29 3b 0a 20  , pResultSet);. 
2b0b0 20 20 20 69 66 28 20 73 57 4c 42 2e 70 4f 72 64     if( sWLB.pOrd
2b0c0 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 74 61  erBy ){.      ta
2b0d0 62 55 73 65 64 20 7c 3d 20 73 71 6c 69 74 65 33  bUsed |= sqlite3
2b0e0 57 68 65 72 65 45 78 70 72 4c 69 73 74 55 73 61  WhereExprListUsa
2b0f0 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 73 57 4c  ge(pMaskSet, sWL
2b100 42 2e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  B.pOrderBy);.   
2b110 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 70 57   }.    while( pW
2b120 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e 3d 32 20  Info->nLevel>=2 
2b130 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
2b140 72 6d 20 2a 70 54 65 72 6d 2c 20 2a 70 45 6e 64  rm *pTerm, *pEnd
2b150 3b 0a 20 20 20 20 20 20 70 4c 6f 6f 70 20 3d 20  ;.      pLoop = 
2b160 70 57 49 6e 66 6f 2d 3e 61 5b 70 57 49 6e 66 6f  pWInfo->a[pWInfo
2b170 2d 3e 6e 4c 65 76 65 6c 2d 31 5d 2e 70 57 4c 6f  ->nLevel-1].pWLo
2b180 6f 70 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  op;.      if( (p
2b190 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
2b1a0 3e 61 5b 70 4c 6f 6f 70 2d 3e 69 54 61 62 5d 2e  >a[pLoop->iTab].
2b1b0 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
2b1c0 5f 4c 45 46 54 29 3d 3d 30 20 29 20 62 72 65 61  _LEFT)==0 ) brea
2b1d0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 28 77 63  k;.      if( (wc
2b1e0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2b1f0 5f 57 41 4e 54 5f 44 49 53 54 49 4e 43 54 29 3d  _WANT_DISTINCT)=
2b200 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 70 4c  =0.       && (pL
2b210 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57  oop->wsFlags & W
2b220 48 45 52 45 5f 4f 4e 45 52 4f 57 29 3d 3d 30 0a  HERE_ONEROW)==0.
2b230 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
2b240 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2b250 20 20 20 20 20 20 69 66 28 20 28 74 61 62 55 73        if( (tabUs
2b260 65 64 20 26 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b  ed & pLoop->mask
2b270 53 65 6c 66 29 21 3d 30 20 29 20 62 72 65 61 6b  Self)!=0 ) break
2b280 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d 20 73  ;.      pEnd = s
2b290 57 4c 42 2e 70 57 43 2d 3e 61 20 2b 20 73 57 4c  WLB.pWC->a + sWL
2b2a0 42 2e 70 57 43 2d 3e 6e 54 65 72 6d 3b 0a 20 20  B.pWC->nTerm;.  
2b2b0 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 73 57      for(pTerm=sW
2b2c0 4c 42 2e 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d  LB.pWC->a; pTerm
2b2d0 3c 70 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  <pEnd; pTerm++){
2b2e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54  .        if( (pT
2b2f0 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
2b300 20 70 4c 6f 6f 70 2d 3e 6d 61 73 6b 53 65 6c 66   pLoop->maskSelf
2b310 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )!=0.         &&
2b320 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
2b330 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  y(pTerm->pExpr, 
2b340 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 0a 20 20 20  EP_FromJoin).   
2b350 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2b360 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2b370 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2b380 20 69 66 28 20 70 54 65 72 6d 3c 70 45 6e 64 20   if( pTerm<pEnd 
2b390 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 57  ) break;.      W
2b3a0 48 45 52 45 54 52 41 43 45 28 30 78 66 66 66 66  HERETRACE(0xffff
2b3b0 2c 20 28 22 2d 3e 20 64 72 6f 70 20 6c 6f 6f 70  , ("-> drop loop
2b3c0 20 25 63 20 6e 6f 74 20 75 73 65 64 5c 6e 22 2c   %c not used\n",
2b3d0 20 70 4c 6f 6f 70 2d 3e 63 49 64 29 29 3b 0a 20   pLoop->cId));. 
2b3e0 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65       pWInfo->nLe
2b3f0 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 6e 54 61  vel--;.      nTa
2b400 62 4c 69 73 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20  bList--;.    }. 
2b410 20 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45 28   }.  WHERETRACE(
2b420 30 78 66 66 66 66 2c 28 22 2a 2a 2a 20 4f 70 74  0xffff,("*** Opt
2b430 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20  imizer Finished 
2b440 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 70 57 49 6e  ***\n"));.  pWIn
2b450 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 6e 51 75 65  fo->pParse->nQue
2b460 72 79 4c 6f 6f 70 20 2b 3d 20 70 57 49 6e 66 6f  ryLoop += pWInfo
2b470 2d 3e 6e 52 6f 77 4f 75 74 3b 0a 0a 20 20 2f 2a  ->nRowOut;..  /*
2b480 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69   If the caller i
2b490 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  s an UPDATE or D
2b4a0 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20  ELETE statement 
2b4b0 74 68 61 74 20 69 73 20 72 65 71 75 65 73 74 69  that is requesti
2b4c0 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61  ng.  ** to use a
2b4d0 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69   one-pass algori
2b4e0 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69  thm, determine i
2b4f0 66 20 74 68 69 73 20 69 73 20 61 70 70 72 6f 70  f this is approp
2b500 72 69 61 74 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  riate..  */.  as
2b510 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61 67  sert( (wctrlFlag
2b520 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
2b530 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c 7c  S_DESIRED)==0 ||
2b540 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d   pWInfo->nLevel=
2b550 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63 74  =1 );.  if( (wct
2b560 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
2b570 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44 29  ONEPASS_DESIRED)
2b580 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 77  !=0 ){.    int w
2b590 73 46 6c 61 67 73 20 3d 20 70 57 49 6e 66 6f 2d  sFlags = pWInfo-
2b5a0 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77 73  >a[0].pWLoop->ws
2b5b0 46 6c 61 67 73 3b 0a 20 20 20 20 69 6e 74 20 62  Flags;.    int b
2b5c0 4f 6e 65 72 6f 77 20 3d 20 28 77 73 46 6c 61 67  Onerow = (wsFlag
2b5d0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 52 4f 57  s & WHERE_ONEROW
2b5e0 29 21 3d 30 3b 0a 20 20 20 20 69 66 28 20 62 4f  )!=0;.    if( bO
2b5f0 6e 65 72 6f 77 0a 20 20 20 20 20 7c 7c 20 28 28  nerow.     || ((
2b600 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
2b610 52 45 5f 4f 4e 45 50 41 53 53 5f 4d 55 4c 54 49  RE_ONEPASS_MULTI
2b620 52 4f 57 29 21 3d 30 0a 20 20 20 20 20 20 20 20  ROW)!=0.        
2b630 20 20 20 26 26 20 30 3d 3d 28 77 73 46 6c 61 67     && 0==(wsFlag
2b640 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
2b650 4c 54 41 42 4c 45 29 29 0a 20 20 20 20 29 7b 0a  LTABLE)).    ){.
2b660 20 20 20 20 20 20 70 57 49 6e 66 6f 2d 3e 65 4f        pWInfo->eO
2b670 6e 65 50 61 73 73 20 3d 20 62 4f 6e 65 72 6f 77  nePass = bOnerow
2b680 20 3f 20 4f 4e 45 50 41 53 53 5f 53 49 4e 47 4c   ? ONEPASS_SINGL
2b690 45 20 3a 20 4f 4e 45 50 41 53 53 5f 4d 55 4c 54  E : ONEPASS_MULT
2b6a0 49 3b 0a 20 20 20 20 20 20 69 66 28 20 48 61 73  I;.      if( Has
2b6b0 52 6f 77 69 64 28 70 54 61 62 4c 69 73 74 2d 3e  Rowid(pTabList->
2b6c0 61 5b 30 5d 2e 70 54 61 62 29 20 26 26 20 28 77  a[0].pTab) && (w
2b6d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
2b6e0 44 58 5f 4f 4e 4c 59 29 20 29 7b 0a 20 20 20 20  DX_ONLY) ){.    
2b6f0 20 20 20 20 69 66 28 20 77 63 74 72 6c 46 6c 61      if( wctrlFla
2b700 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
2b710 53 53 5f 4d 55 4c 54 49 52 4f 57 20 29 7b 0a 20  SS_MULTIROW ){. 
2b720 20 20 20 20 20 20 20 20 20 62 46 6f 72 64 65 6c           bFordel
2b730 65 74 65 20 3d 20 4f 50 46 4c 41 47 5f 46 4f 52  ete = OPFLAG_FOR
2b740 44 45 4c 45 54 45 3b 0a 20 20 20 20 20 20 20 20  DELETE;.        
2b750 7d 0a 20 20 20 20 20 20 20 20 70 57 49 6e 66 6f  }.        pWInfo
2b760 2d 3e 61 5b 30 5d 2e 70 57 4c 6f 6f 70 2d 3e 77  ->a[0].pWLoop->w
2b770 73 46 6c 61 67 73 20 3d 20 28 77 73 46 6c 61 67  sFlags = (wsFlag
2b780 73 20 26 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f  s & ~WHERE_IDX_O
2b790 4e 4c 59 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NLY);.      }.  
2b7a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70    }.  }..  /* Op
2b7b0 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  en all tables in
2b7c0 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61 6e   the pTabList an
2b7d0 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73 65  d any indices se
2b7e0 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20  lected for.  ** 
2b7f0 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65 20  searching those 
2b800 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66  tables..  */.  f
2b810 6f 72 28 69 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  or(ii=0, pLevel=
2b820 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 69 3c 6e 54  pWInfo->a; ii<nT
2b830 61 62 4c 69 73 74 3b 20 69 69 2b 2b 2c 20 70 4c  abList; ii++, pL
2b840 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62  evel++){.    Tab
2b850 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a  le *pTab;     /*
2b860 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   Table to open *
2b870 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20  /.    int iDb;  
2b880 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2b890 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  of database cont
2b8a0 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64  aining table/ind
2b8b0 65 78 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  ex */.    struct
2b8c0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2b8d0 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20 70 54  TabItem;..    pT
2b8e0 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
2b8f0 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
2b900 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d  rom];.    pTab =
2b910 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b   pTabItem->pTab;
2b920 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
2b930 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
2b940 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
2b950 61 29 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20  a);.    pLoop = 
2b960 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a  pLevel->pWLoop;.
2b970 20 20 20 20 69 66 28 20 28 70 54 61 62 2d 3e 74      if( (pTab->t
2b980 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45 70 68  abFlags & TF_Eph
2b990 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20 70 54  emeral)!=0 || pT
2b9a0 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
2b9b0 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69       /* Do nothi
2b9c0 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a  ng */.    }else.
2b9d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2b9e0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
2b9f0 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70 2d  .    if( (pLoop-
2ba00 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  >wsFlags & WHERE
2ba10 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d  _VIRTUALTABLE)!=
2ba20 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  0 ){.      const
2ba30 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20 28   char *pVTab = (
2ba40 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c  const char *)sql
2ba50 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62  ite3GetVTable(db
2ba60 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 69  , pTab);.      i
2ba70 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49 74  nt iCur = pTabIt
2ba80 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
2ba90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
2baa0 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e  dOp4(v, OP_VOpen
2bab0 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70 56  , iCur, 0, 0, pV
2bac0 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20  Tab, P4_VTAB);. 
2bad0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56     }else if( IsV
2bae0 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
2baf0 20 20 20 20 20 20 2f 2a 20 6e 6f 6f 70 20 2a 2f        /* noop */
2bb00 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
2bb10 66 0a 20 20 20 20 69 66 28 20 28 70 4c 6f 6f 70  f.    if( (pLoop
2bb20 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2bb30 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20  E_IDX_ONLY)==0. 
2bb40 20 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72          && (wctr
2bb50 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  lFlags & WHERE_O
2bb60 52 5f 53 55 42 43 4c 41 55 53 45 29 3d 3d 30 20  R_SUBCLAUSE)==0 
2bb70 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  ){.      int op 
2bb80 3d 20 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20  = OP_OpenRead;. 
2bb90 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d       if( pWInfo-
2bba0 3e 65 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41  >eOnePass!=ONEPA
2bbb0 53 53 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20  SS_OFF ){.      
2bbc0 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72    op = OP_OpenWr
2bbd0 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57 49  ite;.        pWI
2bbe0 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73  nfo->aiCurOnePas
2bbf0 73 5b 30 5d 20 3d 20 70 54 61 62 49 74 65 6d 2d  s[0] = pTabItem-
2bc00 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >iCursor;.      
2bc10 7d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  };.      sqlite3
2bc20 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
2bc30 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
2bc40 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  sor, iDb, pTab, 
2bc50 6f 70 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  op);.      asser
2bc60 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  t( pTabItem->iCu
2bc70 72 73 6f 72 3d 3d 70 4c 65 76 65 6c 2d 3e 69 54  rsor==pLevel->iT
2bc80 61 62 43 75 72 20 29 3b 0a 20 20 20 20 20 20 74  abCur );.      t
2bc90 65 73 74 63 61 73 65 28 20 70 57 49 6e 66 6f 2d  estcase( pWInfo-
2bca0 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41  >eOnePass==ONEPA
2bcb0 53 53 5f 4f 46 46 20 26 26 20 70 54 61 62 2d 3e  SS_OFF && pTab->
2bcc0 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  nCol==BMS-1 );. 
2bcd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2bce0 57 49 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d  WInfo->eOnePass=
2bcf0 3d 4f 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20  =ONEPASS_OFF && 
2bd00 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 20  pTab->nCol==BMS 
2bd10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 57 49  );.      if( pWI
2bd20 6e 66 6f 2d 3e 65 4f 6e 65 50 61 73 73 3d 3d 4f  nfo->eOnePass==O
2bd30 4e 45 50 41 53 53 5f 4f 46 46 20 26 26 20 70 54  NEPASS_OFF && pT
2bd40 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 26 26 20  ab->nCol<BMS && 
2bd50 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
2bd60 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  {.        Bitmas
2bd70 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  k b = pTabItem->
2bd80 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20  colUsed;.       
2bd90 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20   int n = 0;.    
2bda0 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62      for(; b; b=b
2bdb0 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20  >>1, n++){}.    
2bdc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
2bdd0 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 53  hangeP4(v, -1, S
2bde0 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
2bdf0 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a  (n), P4_INT32);.
2be00 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2be10 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  n<=pTab->nCol );
2be20 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20  .      }.#ifdef 
2be30 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55  SQLITE_ENABLE_CU
2be40 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 20  RSOR_HINTS.     
2be50 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74   if( pLoop->u.bt
2be60 72 65 65 2e 70 49 6e 64 65 78 21 3d 30 20 29 7b  ree.pIndex!=0 ){
2be70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2be80 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
2be90 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 7c 62 46  OPFLAG_SEEKEQ|bF
2bea0 6f 72 64 65 6c 65 74 65 29 3b 0a 20 20 20 20 20  ordelete);.     
2beb0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
2bec0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 73 71      {.        sq
2bed0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2bee0 35 28 76 2c 20 62 46 6f 72 64 65 6c 65 74 65 29  5(v, bFordelete)
2bef0 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66  ;.      }.#ifdef
2bf00 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
2bf10 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 0a  OLUMN_USED_MASK.
2bf20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2bf30 65 41 64 64 4f 70 34 44 75 70 38 28 76 2c 20 4f  eAddOp4Dup8(v, O
2bf40 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64 2c 20 70  P_ColumnsUsed, p
2bf50 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
2bf60 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
2bf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf80 20 20 20 20 28 63 6f 6e 73 74 20 75 38 2a 29 26      (const u8*)&
2bf90 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pTabItem->colUse
2bfa0 64 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 23 65  d, P4_INT64);.#e
2bfb0 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
2bfc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
2bfd0 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
2bfe0 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
2bff0 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
2c000 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
2c010 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2c020 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b  WHERE_INDEXED ){
2c030 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
2c040 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
2c050 65 65 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  ee.pIndex;.     
2c060 20 69 6e 74 20 69 49 6e 64 65 78 43 75 72 3b 0a   int iIndexCur;.
2c070 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 4f        int op = O
2c080 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20  P_OpenRead;.    
2c090 20 20 2f 2a 20 69 41 75 78 41 72 67 20 69 73 20    /* iAuxArg is 
2c0a0 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 61 20  always set to a 
2c0b0 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69  positive value i
2c0c0 66 20 4f 4e 45 50 41 53 53 20 69 73 20 70 6f 73  f ONEPASS is pos
2c0d0 73 69 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61  sible */.      a
2c0e0 73 73 65 72 74 28 20 69 41 75 78 41 72 67 21 3d  ssert( iAuxArg!=
2c0f0 30 20 7c 7c 20 28 70 57 49 6e 66 6f 2d 3e 77 63  0 || (pWInfo->wc
2c100 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2c110 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
2c120 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )==0 );.      if
2c130 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
2c140 29 20 26 26 20 49 73 50 72 69 6d 61 72 79 4b 65  ) && IsPrimaryKe
2c150 79 49 6e 64 65 78 28 70 49 78 29 0a 20 20 20 20  yIndex(pIx).    
2c160 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67     && (wctrlFlag
2c170 73 20 26 20 57 48 45 52 45 5f 4f 52 5f 53 55 42  s & WHERE_OR_SUB
2c180 43 4c 41 55 53 45 29 21 3d 30 0a 20 20 20 20 20  CLAUSE)!=0.     
2c190 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
2c1a0 68 69 73 20 69 73 20 6f 6e 65 20 74 65 72 6d 20  his is one term 
2c1b0 6f 66 20 61 6e 20 4f 52 2d 6f 70 74 69 6d 69 7a  of an OR-optimiz
2c1c0 61 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20  ation using the 
2c1d0 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 66 20 61  PRIMARY KEY of a
2c1e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 57 49 54 48  .        ** WITH
2c1f0 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e  OUT ROWID table.
2c200 20 20 4e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20    No need for a 
2c210 73 65 70 61 72 61 74 65 20 69 6e 64 65 78 20 2a  separate index *
2c220 2f 0a 20 20 20 20 20 20 20 20 69 49 6e 64 65 78  /.        iIndex
2c230 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54  Cur = pLevel->iT
2c240 61 62 43 75 72 3b 0a 20 20 20 20 20 20 20 20 6f  abCur;.        o
2c250 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  p = 0;.      }el
2c260 73 65 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 65  se if( pWInfo->e
2c270 4f 6e 65 50 61 73 73 21 3d 4f 4e 45 50 41 53 53  OnePass!=ONEPASS
2c280 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20 20 20 20  _OFF ){.        
2c290 49 6e 64 65 78 20 2a 70 4a 20 3d 20 70 54 61 62  Index *pJ = pTab
2c2a0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 70 49 6e 64  Item->pTab->pInd
2c2b0 65 78 3b 0a 20 20 20 20 20 20 20 20 69 49 6e 64  ex;.        iInd
2c2c0 65 78 43 75 72 20 3d 20 69 41 75 78 41 72 67 3b  exCur = iAuxArg;
2c2d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2c2e0 20 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48   wctrlFlags & WH
2c2f0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
2c300 52 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 77  RED );.        w
2c310 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4a 29  hile( ALWAYS(pJ)
2c320 20 26 26 20 70 4a 21 3d 70 49 78 20 29 7b 0a 20   && pJ!=pIx ){. 
2c330 20 20 20 20 20 20 20 20 20 69 49 6e 64 65 78 43           iIndexC
2c340 75 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ur++;.          
2c350 70 4a 20 3d 20 70 4a 2d 3e 70 4e 65 78 74 3b 0a  pJ = pJ->pNext;.
2c360 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c370 20 20 6f 70 20 3d 20 4f 50 5f 4f 70 65 6e 57 72    op = OP_OpenWr
2c380 69 74 65 3b 0a 20 20 20 20 20 20 20 20 70 57 49  ite;.        pWI
2c390 6e 66 6f 2d 3e 61 69 43 75 72 4f 6e 65 50 61 73  nfo->aiCurOnePas
2c3a0 73 5b 31 5d 20 3d 20 69 49 6e 64 65 78 43 75 72  s[1] = iIndexCur
2c3b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
2c3c0 28 20 69 41 75 78 41 72 67 20 26 26 20 28 77 63  ( iAuxArg && (wc
2c3d0 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
2c3e0 5f 4f 52 5f 53 55 42 43 4c 41 55 53 45 29 21 3d  _OR_SUBCLAUSE)!=
2c3f0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 49 6e  0 ){.        iIn
2c400 64 65 78 43 75 72 20 3d 20 69 41 75 78 41 72 67  dexCur = iAuxArg
2c410 3b 0a 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  ;.        op = O
2c420 50 5f 52 65 6f 70 65 6e 49 64 78 3b 0a 20 20 20  P_ReopenIdx;.   
2c430 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c440 20 20 69 49 6e 64 65 78 43 75 72 20 3d 20 70 50    iIndexCur = pP
2c450 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
2c460 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76      }.      pLev
2c470 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 69 49  el->iIdxCur = iI
2c480 6e 64 65 78 43 75 72 3b 0a 20 20 20 20 20 20 61  ndexCur;.      a
2c490 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68  ssert( pIx->pSch
2c4a0 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
2c4b0 6d 61 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ma );.      asse
2c4c0 72 74 28 20 69 49 6e 64 65 78 43 75 72 3e 3d 30  rt( iIndexCur>=0
2c4d0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70   );.      if( op
2c4e0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2c4f0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
2c500 20 6f 70 2c 20 69 49 6e 64 65 78 43 75 72 2c 20   op, iIndexCur, 
2c510 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b  pIx->tnum, iDb);
2c520 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2c530 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
2c540 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20  (pParse, pIx);. 
2c550 20 20 20 20 20 20 20 69 66 28 20 28 70 4c 6f 6f         if( (pLoo
2c560 70 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45  p->wsFlags & WHE
2c570 52 45 5f 43 4f 4e 53 54 52 41 49 4e 54 29 21 3d  RE_CONSTRAINT)!=
2c580 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70  0.         && (p
2c590 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2c5a0 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41  (WHERE_COLUMN_RA
2c5b0 4e 47 45 7c 57 48 45 52 45 5f 53 4b 49 50 53 43  NGE|WHERE_SKIPSC
2c5c0 41 4e 29 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  AN))==0.        
2c5d0 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74   && (pWInfo->wct
2c5e0 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52  rlFlags&WHERE_OR
2c5f0 44 45 52 42 59 5f 4d 49 4e 29 3d 3d 30 0a 20 20  DERBY_MIN)==0.  
2c600 20 20 20 20 20 20 20 26 26 20 70 57 49 6e 66 6f         && pWInfo
2c610 2d 3e 65 44 69 73 74 69 6e 63 74 21 3d 57 48 45  ->eDistinct!=WHE
2c620 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
2c630 52 45 44 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  RED.        ){. 
2c640 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2c650 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
2c660 4f 50 46 4c 41 47 5f 53 45 45 4b 45 51 29 3b 20  OPFLAG_SEEKEQ); 
2c670 2f 2a 20 48 69 6e 74 20 74 6f 20 43 4f 4d 44 42  /* Hint to COMDB
2c680 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  2 */.        }. 
2c690 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
2c6a0 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78  nt((v, "%s", pIx
2c6b0 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 23 69 66 64 65  ->zName));.#ifde
2c6c0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2c6d0 43 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b  COLUMN_USED_MASK
2c6e0 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
2c6f0 20 20 20 20 20 75 36 34 20 63 6f 6c 55 73 65 64       u64 colUsed
2c700 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2c710 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 20 20  int ii, jj;.    
2c720 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
2c730 69 69 3c 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  ii<pIx->nColumn;
2c740 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
2c750 20 20 20 20 6a 6a 20 3d 20 70 49 78 2d 3e 61 69      jj = pIx->ai
2c760 43 6f 6c 75 6d 6e 5b 69 69 5d 3b 0a 20 20 20 20  Column[ii];.    
2c770 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3c 30          if( jj<0
2c780 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2c790 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 6a 3e           if( jj>
2c7a0 36 33 20 29 20 6a 6a 20 3d 20 36 33 3b 0a 20 20  63 ) jj = 63;.  
2c7b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
2c7c0 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  TabItem->colUsed
2c7d0 20 26 20 4d 41 53 4b 42 49 54 28 6a 6a 29 29 3d   & MASKBIT(jj))=
2c7e0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2c7f0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 55 73             colUs
2c800 65 64 20 7c 3d 20 28 28 75 36 34 29 31 29 3c 3c  ed |= ((u64)1)<<
2c810 28 69 69 3c 36 33 20 3f 20 69 69 20 3a 20 36 33  (ii<63 ? ii : 63
2c820 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2c830 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2c840 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 76  VdbeAddOp4Dup8(v
2c850 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 73 55 73 65 64  , OP_ColumnsUsed
2c860 2c 20 69 49 6e 64 65 78 43 75 72 2c 20 30 2c 20  , iIndexCur, 0, 
2c870 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
2c880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c890 20 20 20 28 75 38 2a 29 26 63 6f 6c 55 73 65 64     (u8*)&colUsed
2c8a0 2c 20 50 34 5f 49 4e 54 36 34 29 3b 0a 20 20 20  , P4_INT64);.   
2c8b0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a       }.#endif /*
2c8c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
2c8d0 4f 4c 55 4d 4e 5f 55 53 45 44 5f 4d 41 53 4b 20  OLUMN_USED_MASK 
2c8e0 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
2c8f0 0a 20 20 20 20 69 66 28 20 69 44 62 3e 3d 30 20  .    if( iDb>=0 
2c900 29 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72  ) sqlite3CodeVer
2c910 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65  ifySchema(pParse
2c920 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57  , iDb);.  }.  pW
2c930 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c  Info->iTop = sql
2c940 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
2c950 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62  ddr(v);.  if( db
2c960 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2c970 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
2c980 45 72 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e  Error;..  /* Gen
2c990 65 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74  erate the code t
2c9a0 6f 20 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e  o do the search.
2c9b0 20 20 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e    Each iteration
2c9c0 20 6f 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a   of the for.  **
2c9d0 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65   loop below gene
2c9e0 72 61 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61  rates code for a
2c9f0 20 73 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c   single nested l
2ca00 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20  oop of the VM.  
2ca10 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f  ** program..  */
2ca20 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28  .  notReady = ~(
2ca30 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72  Bitmask)0;.  for
2ca40 28 69 69 3d 30 3b 20 69 69 3c 6e 54 61 62 4c 69  (ii=0; ii<nTabLi
2ca50 73 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69  st; ii++){.    i
2ca60 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a  nt addrExplain;.
2ca70 20 20 20 20 69 6e 74 20 77 73 46 6c 61 67 73 3b      int wsFlags;
2ca80 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  .    pLevel = &p
2ca90 57 49 6e 66 6f 2d 3e 61 5b 69 69 5d 3b 0a 20 20  WInfo->a[ii];.  
2caa0 20 20 77 73 46 6c 61 67 73 20 3d 20 70 4c 65 76    wsFlags = pLev
2cab0 65 6c 2d 3e 70 57 4c 6f 6f 70 2d 3e 77 73 46 6c  el->pWLoop->wsFl
2cac0 61 67 73 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ags;.#ifndef SQL
2cad0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54  ITE_OMIT_AUTOMAT
2cae0 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69 66 28  IC_INDEX.    if(
2caf0 20 28 70 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70   (pLevel->pWLoop
2cb00 2d 3e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ->wsFlags & WHER
2cb10 45 5f 41 55 54 4f 5f 49 4e 44 45 58 29 21 3d 30  E_AUTO_INDEX)!=0
2cb20 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72   ){.      constr
2cb30 75 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65  uctAutomaticInde
2cb40 78 28 70 50 61 72 73 65 2c 20 26 70 57 49 6e 66  x(pParse, &pWInf
2cb50 6f 2d 3e 73 57 43 2c 0a 20 20 20 20 20 20 20 20  o->sWC,.        
2cb60 20 20 20 20 20 20 20 20 26 70 54 61 62 4c 69 73          &pTabLis
2cb70 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
2cb80 6f 6d 5d 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70  om], notReady, p
2cb90 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 69 66  Level);.      if
2cba0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
2cbb0 65 64 20 29 20 67 6f 74 6f 20 77 68 65 72 65 42  ed ) goto whereB
2cbc0 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 20 20 7d  eginError;.    }
2cbd0 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 64 64 72  .#endif.    addr
2cbe0 45 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65  Explain = sqlite
2cbf0 33 57 68 65 72 65 45 78 70 6c 61 69 6e 4f 6e 65  3WhereExplainOne
2cc00 53 63 61 6e 28 0a 20 20 20 20 20 20 20 20 70 50  Scan(.        pP
2cc10 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
2cc20 70 4c 65 76 65 6c 2c 20 69 69 2c 20 70 4c 65 76  pLevel, ii, pLev
2cc30 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c  el->iFrom, wctrl
2cc40 46 6c 61 67 73 0a 20 20 20 20 29 3b 0a 20 20 20  Flags.    );.   
2cc50 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 6f 64   pLevel->addrBod
2cc60 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  y = sqlite3VdbeC
2cc70 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
2cc80 20 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 73 71     notReady = sq
2cc90 6c 69 74 65 33 57 68 65 72 65 43 6f 64 65 4f 6e  lite3WhereCodeOn
2cca0 65 4c 6f 6f 70 53 74 61 72 74 28 70 57 49 6e 66  eLoopStart(pWInf
2ccb0 6f 2c 20 69 69 2c 20 6e 6f 74 52 65 61 64 79 29  o, ii, notReady)
2ccc0 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43  ;.    pWInfo->iC
2ccd0 6f 6e 74 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c  ontinue = pLevel
2cce0 2d 3e 61 64 64 72 43 6f 6e 74 3b 0a 20 20 20 20  ->addrCont;.    
2ccf0 69 66 28 20 28 77 73 46 6c 61 67 73 26 57 48 45  if( (wsFlags&WHE
2cd00 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 3d 3d 30 20  RE_MULTI_OR)==0 
2cd10 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57  && (wctrlFlags&W
2cd20 48 45 52 45 5f 4f 52 5f 53 55 42 43 4c 41 55 53  HERE_OR_SUBCLAUS
2cd30 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  E)==0 ){.      s
2cd40 71 6c 69 74 65 33 57 68 65 72 65 41 64 64 53 63  qlite3WhereAddSc
2cd50 61 6e 53 74 61 74 75 73 28 76 2c 20 70 54 61 62  anStatus(v, pTab
2cd60 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 61 64  List, pLevel, ad
2cd70 64 72 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20  drExplain);.    
2cd80 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 6e 65  }.  }..  /* Done
2cd90 2e 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75 6c  . */.  VdbeModul
2cda0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 42 65  eComment((v, "Be
2cdb0 67 69 6e 20 57 48 45 52 45 2d 63 6f 72 65 22 29  gin WHERE-core")
2cdc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e  );.  return pWIn
2cdd0 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  fo;..  /* Jump h
2cde0 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ere if malloc fa
2cdf0 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69  ils */.whereBegi
2ce00 6e 45 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 57  nError:.  if( pW
2ce10 49 6e 66 6f 20 29 7b 0a 20 20 20 20 70 50 61 72  Info ){.    pPar
2ce20 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d  se->nQueryLoop =
2ce30 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51   pWInfo->savedNQ
2ce40 75 65 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68  ueryLoop;.    wh
2ce50 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20  ereInfoFree(db, 
2ce60 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72  pWInfo);.  }.  r
2ce70 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2ce80 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65  * Generate the e
2ce90 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
2cea0 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65  loop.  See comme
2ceb0 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74  nts on .** sqlit
2cec0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 66  e3WhereBegin() f
2ced0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
2cee0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  formation..*/.vo
2cef0 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  id sqlite3WhereE
2cf00 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  nd(WhereInfo *pW
2cf10 49 6e 66 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a  Info){.  Parse *
2cf20 70 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d  pParse = pWInfo-
2cf30 3e 70 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20  >pParse;.  Vdbe 
2cf40 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
2cf50 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57  be;.  int i;.  W
2cf60 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
2cf70 6c 3b 0a 20 20 57 68 65 72 65 4c 6f 6f 70 20 2a  l;.  WhereLoop *
2cf80 70 4c 6f 6f 70 3b 0a 20 20 53 72 63 4c 69 73 74  pLoop;.  SrcList
2cf90 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49   *pTabList = pWI
2cfa0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
2cfb0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
2cfc0 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  Parse->db;..  /*
2cfd0 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74   Generate loop t
2cfe0 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e  ermination code.
2cff0 0a 20 20 2a 2f 0a 20 20 56 64 62 65 4d 6f 64 75  .  */.  VdbeModu
2d000 6c 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 45  leComment((v, "E
2d010 6e 64 20 57 48 45 52 45 2d 63 6f 72 65 22 29 29  nd WHERE-core"))
2d020 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43  ;.  sqlite3ExprC
2d030 61 63 68 65 43 6c 65 61 72 28 70 50 61 72 73 65  acheClear(pParse
2d040 29 3b 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e 66  );.  for(i=pWInf
2d050 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d  o->nLevel-1; i>=
2d060 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
2d070 20 61 64 64 72 3b 0a 20 20 20 20 70 4c 65 76 65   addr;.    pLeve
2d080 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
2d090 5d 3b 0a 20 20 20 20 70 4c 6f 6f 70 20 3d 20 70  ];.    pLoop = p
2d0a0 4c 65 76 65 6c 2d 3e 70 57 4c 6f 6f 70 3b 0a 20  Level->pWLoop;. 
2d0b0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f     if( pLevel->o
2d0c0 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 23 69  p!=OP_Noop ){.#i
2d0d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53  fndef SQLITE_DIS
2d0e0 41 42 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f 44  ABLE_SKIPAHEAD_D
2d0f0 49 53 54 49 4e 43 54 0a 20 20 20 20 20 20 69 6e  ISTINCT.      in
2d100 74 20 61 64 64 72 53 65 65 6b 20 3d 20 30 3b 0a  t addrSeek = 0;.
2d110 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
2d120 78 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  x;.      int n;.
2d130 20 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f        if( pWInfo
2d140 2d 3e 65 44 69 73 74 69 6e 63 74 3d 3d 57 48 45  ->eDistinct==WHE
2d150 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f 52 44 45  RE_DISTINCT_ORDE
2d160 52 45 44 0a 20 20 20 20 20 20 20 26 26 20 28 70  RED.       && (p
2d170 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73 20 26 20  Loop->wsFlags & 
2d180 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
2d190 30 0a 20 20 20 20 20 20 20 26 26 20 28 70 49 64  0.       && (pId
2d1a0 78 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  x = pLoop->u.btr
2d1b0 65 65 2e 70 49 6e 64 65 78 29 2d 3e 68 61 73 53  ee.pIndex)->hasS
2d1c0 74 61 74 31 0a 20 20 20 20 20 20 20 26 26 20 28  tat1.       && (
2d1d0 6e 20 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72  n = pLoop->u.btr
2d1e0 65 65 2e 6e 49 64 78 43 6f 6c 29 3e 30 0a 20 20  ee.nIdxCol)>0.  
2d1f0 20 20 20 20 20 26 26 20 70 49 64 78 2d 3e 61 69       && pIdx->ai
2d200 52 6f 77 4c 6f 67 45 73 74 5b 6e 5d 3e 3d 33 36  RowLogEst[n]>=36
2d210 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
2d220 20 20 69 6e 74 20 72 31 20 3d 20 70 50 61 72 73    int r1 = pPars
2d230 65 2d 3e 6e 4d 65 6d 2b 31 3b 0a 20 20 20 20 20  e->nMem+1;.     
2d240 20 20 20 69 6e 74 20 6a 2c 20 6f 70 3b 0a 20 20     int j, op;.  
2d250 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2d260 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; j++){.      
2d270 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2d280 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75  ddOp3(v, OP_Colu
2d290 6d 6e 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  mn, pLevel->iIdx
2d2a0 43 75 72 2c 20 6a 2c 20 72 31 2b 6a 29 3b 0a 20  Cur, j, r1+j);. 
2d2b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d2c0 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d   pParse->nMem +=
2d2d0 20 6e 2b 31 3b 0a 20 20 20 20 20 20 20 20 6f 70   n+1;.        op
2d2e0 20 3d 20 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f   = pLevel->op==O
2d2f0 50 5f 50 72 65 76 20 3f 20 4f 50 5f 53 65 65 6b  P_Prev ? OP_Seek
2d300 4c 54 20 3a 20 4f 50 5f 53 65 65 6b 47 54 3b 0a  LT : OP_SeekGT;.
2d310 20 20 20 20 20 20 20 20 61 64 64 72 53 65 65 6b          addrSeek
2d320 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
2d330 64 4f 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 70  dOp4Int(v, op, p
2d340 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20  Level->iIdxCur, 
2d350 30 2c 20 72 31 2c 20 6e 29 3b 0a 20 20 20 20 20  0, r1, n);.     
2d360 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49     VdbeCoverageI
2d370 66 28 76 2c 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  f(v, op==OP_Seek
2d380 4c 54 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  LT);.        Vdb
2d390 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f  eCoverageIf(v, o
2d3a0 70 3d 3d 4f 50 5f 53 65 65 6b 47 54 29 3b 0a 20  p==OP_SeekGT);. 
2d3b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2d3c0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47  beAddOp2(v, OP_G
2d3d0 6f 74 6f 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e  oto, 1, pLevel->
2d3e0 70 32 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  p2);.      }.#en
2d3f0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 49  dif /* SQLITE_DI
2d400 53 41 42 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f  SABLE_SKIPAHEAD_
2d410 44 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 20 20  DISTINCT */.    
2d420 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20    /* The common 
2d430 63 61 73 65 3a 20 41 64 76 61 6e 63 65 20 74 6f  case: Advance to
2d440 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 2a 2f   the next row */
2d450 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2d460 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2d470 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  , pLevel->addrCo
2d480 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
2d490 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
2d4a0 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76  pLevel->op, pLev
2d4b0 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e  el->p1, pLevel->
2d4c0 70 32 2c 20 70 4c 65 76 65 6c 2d 3e 70 33 29 3b  p2, pLevel->p3);
2d4d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2d4e0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 4c  beChangeP5(v, pL
2d4f0 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 20  evel->p5);.     
2d500 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
2d510 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
2d520 72 61 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c  rageIf(v, pLevel
2d530 2d 3e 6f 70 3d 3d 4f 50 5f 4e 65 78 74 29 3b 0a  ->op==OP_Next);.
2d540 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
2d550 67 65 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  geIf(v, pLevel->
2d560 6f 70 3d 3d 4f 50 5f 50 72 65 76 29 3b 0a 20 20  op==OP_Prev);.  
2d570 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2d580 49 66 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  If(v, pLevel->op
2d590 3d 3d 4f 50 5f 56 4e 65 78 74 29 3b 0a 23 69 66  ==OP_VNext);.#if
2d5a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  ndef SQLITE_DISA
2d5b0 42 4c 45 5f 53 4b 49 50 41 48 45 41 44 5f 44 49  BLE_SKIPAHEAD_DI
2d5c0 53 54 49 4e 43 54 0a 20 20 20 20 20 20 69 66 28  STINCT.      if(
2d5d0 20 61 64 64 72 53 65 65 6b 20 29 20 73 71 6c 69   addrSeek ) sqli
2d5e0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
2d5f0 76 2c 20 61 64 64 72 53 65 65 6b 29 3b 0a 23 65  v, addrSeek);.#e
2d600 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ndif.    }else{.
2d610 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d620 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
2d630 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e   pLevel->addrCon
2d640 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
2d650 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
2d660 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45   & WHERE_IN_ABLE
2d670 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e   && pLevel->u.in
2d680 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  .nIn>0 ){.      
2d690 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70  struct InLoop *p
2d6a0 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  In;.      int j;
2d6b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
2d6c0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
2d6d0 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  , pLevel->addrNx
2d6e0 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  t);.      for(j=
2d6f0 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
2d700 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75  , pIn=&pLevel->u
2d710 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d  .in.aInLoop[j-1]
2d720 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d  ; j>0; j--, pIn-
2d730 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  -){.        sqli
2d740 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
2d750 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f  v, pIn->addrInTo
2d760 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  p+1);.        if
2d770 28 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f  ( pIn->eEndLoopO
2d780 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
2d790 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
2d7a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 49 6e  dbeAddOp2(v, pIn
2d7b0 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 2c 20 70 49  ->eEndLoopOp, pI
2d7c0 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64  n->iCur, pIn->ad
2d7d0 64 72 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20  drInTop);.      
2d7e0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
2d7f0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56  (v);.          V
2d800 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
2d810 20 70 49 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70   pIn->eEndLoopOp
2d820 3d 3d 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 29  ==OP_PrevIfOpen)
2d830 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65  ;.          Vdbe
2d840 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 70 49  CoverageIf(v, pI
2d850 6e 2d 3e 65 45 6e 64 4c 6f 6f 70 4f 70 3d 3d 4f  n->eEndLoopOp==O
2d860 50 5f 4e 65 78 74 49 66 4f 70 65 6e 29 3b 0a 20  P_NextIfOpen);. 
2d870 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d880 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
2d890 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64  Here(v, pIn->add
2d8a0 72 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20  rInTop-1);.     
2d8b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
2d8c0 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
2d8d0 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
2d8e0 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 69 66  addrBrk);.    if
2d8f0 28 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b  ( pLevel->addrSk
2d900 69 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ip ){.      sqli
2d910 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 70  te3VdbeGoto(v, p
2d920 4c 65 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29  Level->addrSkip)
2d930 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
2d940 65 6e 74 28 28 76 2c 20 22 6e 65 78 74 20 73 6b  ent((v, "next sk
2d950 69 70 2d 73 63 61 6e 20 6f 6e 20 25 73 22 2c 20  ip-scan on %s", 
2d960 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65 2e 70  pLoop->u.btree.p
2d970 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Index->zName));.
2d980 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d990 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65  eJumpHere(v, pLe
2d9a0 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 29 3b 0a  vel->addrSkip);.
2d9b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2d9c0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 4c 65  eJumpHere(v, pLe
2d9d0 76 65 6c 2d 3e 61 64 64 72 53 6b 69 70 2d 32 29  vel->addrSkip-2)
2d9e0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
2d9f0 53 51 4c 49 54 45 5f 4c 49 4b 45 5f 44 4f 45 53  SQLITE_LIKE_DOES
2da00 4e 54 5f 4d 41 54 43 48 5f 42 4c 4f 42 53 0a 20  NT_MATCH_BLOBS. 
2da10 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 61     if( pLevel->a
2da20 64 64 72 4c 69 6b 65 52 65 70 20 29 7b 0a 20 20  ddrLikeRep ){.  
2da30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
2da40 64 64 4f 70 32 28 76 2c 20 4f 50 5f 44 65 63 72  ddOp2(v, OP_Decr
2da50 4a 75 6d 70 5a 65 72 6f 2c 20 28 69 6e 74 29 28  JumpZero, (int)(
2da60 70 4c 65 76 65 6c 2d 3e 69 4c 69 6b 65 52 65 70  pLevel->iLikeRep
2da70 43 6e 74 72 3e 3e 31 29 2c 0a 20 20 20 20 20 20  Cntr>>1),.      
2da80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da90 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4c 69    pLevel->addrLi
2daa0 6b 65 52 65 70 29 3b 0a 20 20 20 20 20 20 56 64  keRep);.      Vd
2dab0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
2dac0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2dad0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
2dae0 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 69  tJoin ){.      i
2daf0 6e 74 20 77 73 20 3d 20 70 4c 6f 6f 70 2d 3e 77  nt ws = pLoop->w
2db00 73 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 61 64  sFlags;.      ad
2db10 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
2db20 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50  AddOp1(v, OP_IfP
2db30 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  os, pLevel->iLef
2db40 74 4a 6f 69 6e 29 3b 20 56 64 62 65 43 6f 76 65  tJoin); VdbeCove
2db50 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 61  rage(v);.      a
2db60 73 73 65 72 74 28 20 28 77 73 20 26 20 57 48 45  ssert( (ws & WHE
2db70 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20  RE_IDX_ONLY)==0 
2db80 7c 7c 20 28 77 73 20 26 20 57 48 45 52 45 5f 49  || (ws & WHERE_I
2db90 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a 20 20  NDEXED)!=0 );.  
2dba0 20 20 20 20 69 66 28 20 28 77 73 20 26 20 57 48      if( (ws & WH
2dbb0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30  ERE_IDX_ONLY)==0
2dbc0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2dbd0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
2dbe0 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61   OP_NullRow, pTa
2dbf0 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  bList->a[i].iCur
2dc00 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
2dc10 20 20 20 20 69 66 28 20 28 77 73 20 26 20 57 48      if( (ws & WH
2dc20 45 52 45 5f 49 4e 44 45 58 45 44 29 20 0a 20 20  ERE_INDEXED) .  
2dc30 20 20 20 20 20 7c 7c 20 28 28 77 73 20 26 20 57       || ((ws & W
2dc40 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 29 20 26  HERE_MULTI_OR) &
2dc50 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 70 43 6f 76  & pLevel->u.pCov
2dc60 69 64 78 29 20 0a 20 20 20 20 20 20 29 7b 0a 20  idx) .      ){. 
2dc70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
2dc80 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e  beAddOp1(v, OP_N
2dc90 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e  ullRow, pLevel->
2dca0 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20  iIdxCur);.      
2dcb0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  }.      if( pLev
2dcc0 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74 75 72  el->op==OP_Retur
2dcd0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  n ){.        sql
2dce0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
2dcf0 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c 65 76  , OP_Gosub, pLev
2dd00 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e  el->p1, pLevel->
2dd10 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20  addrFirst);.    
2dd20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2dd30 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f   sqlite3VdbeGoto
2dd40 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
2dd50 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  First);.      }.
2dd60 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
2dd70 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
2dd80 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 56 64  r);.    }.    Vd
2dd90 62 65 4d 6f 64 75 6c 65 43 6f 6d 6d 65 6e 74 28  beModuleComment(
2dda0 28 76 2c 20 22 45 6e 64 20 57 48 45 52 45 2d 6c  (v, "End WHERE-l
2ddb0 6f 6f 70 25 64 3a 20 25 73 22 2c 20 69 2c 0a 20  oop%d: %s", i,. 
2ddc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddd0 20 20 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62      pWInfo->pTab
2dde0 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
2ddf0 69 46 72 6f 6d 5d 2e 70 54 61 62 2d 3e 7a 4e 61  iFrom].pTab->zNa
2de00 6d 65 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  me));.  }..  /* 
2de10 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e  The "break" poin
2de20 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20  t is here, just 
2de30 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
2de40 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a  the outer loop..
2de50 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a    ** Set it..  *
2de60 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
2de70 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
2de80 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a  WInfo->iBreak);.
2de90 0a 20 20 61 73 73 65 72 74 28 20 70 57 49 6e 66  .  assert( pWInf
2dea0 6f 2d 3e 6e 4c 65 76 65 6c 3c 3d 70 54 61 62 4c  o->nLevel<=pTabL
2deb0 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66  ist->nSrc );.  f
2dec0 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  or(i=0, pLevel=p
2ded0 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e  WInfo->a; i<pWIn
2dee0 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c  fo->nLevel; i++,
2def0 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
2df00 69 6e 74 20 6b 2c 20 6c 61 73 74 3b 0a 20 20 20  int k, last;.   
2df10 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
2df20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
2df30 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  0;.    struct Sr
2df40 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
2df50 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
2df60 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
2df70 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  m];.    Table *p
2df80 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Tab = pTabItem->
2df90 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65 72 74  pTab;.    assert
2dfa0 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 20  ( pTab!=0 );.   
2dfb0 20 70 4c 6f 6f 70 20 3d 20 70 4c 65 76 65 6c 2d   pLoop = pLevel-
2dfc0 3e 70 57 4c 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a  >pWLoop;..    /*
2dfd0 20 46 6f 72 20 61 20 63 6f 2d 72 6f 75 74 69 6e   For a co-routin
2dfe0 65 2c 20 63 68 61 6e 67 65 20 61 6c 6c 20 4f 50  e, change all OP
2dff0 5f 43 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63  _Column referenc
2e000 65 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  es to the table 
2e010 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  of.    ** the co
2e020 2d 72 6f 75 74 69 6e 65 20 69 6e 74 6f 20 4f 50  -routine into OP
2e030 5f 43 6f 70 79 20 6f 66 20 72 65 73 75 6c 74 20  _Copy of result 
2e040 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61 20 72  contained in a r
2e050 65 67 69 73 74 65 72 2e 0a 20 20 20 20 2a 2a 20  egister..    ** 
2e060 4f 50 5f 52 6f 77 69 64 20 62 65 63 6f 6d 65 73  OP_Rowid becomes
2e070 20 4f 50 5f 4e 75 6c 6c 2e 0a 20 20 20 20 2a 2f   OP_Null..    */
2e080 0a 20 20 20 20 69 66 28 20 70 54 61 62 49 74 65  .    if( pTabIte
2e090 6d 2d 3e 66 67 2e 76 69 61 43 6f 72 6f 75 74 69  m->fg.viaCorouti
2e0a0 6e 65 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74  ne ){.      test
2e0b0 63 61 73 65 28 20 70 50 61 72 73 65 2d 3e 64 62  case( pParse->db
2e0c0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
2e0d0 3b 0a 20 20 20 20 20 20 74 72 61 6e 73 6c 61 74  ;.      translat
2e0e0 65 43 6f 6c 75 6d 6e 54 6f 43 6f 70 79 28 70 50  eColumnToCopy(pP
2e0f0 61 72 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  arse, pLevel->ad
2e100 64 72 42 6f 64 79 2c 20 70 4c 65 76 65 6c 2d 3e  drBody, pLevel->
2e110 69 54 61 62 43 75 72 2c 0a 20 20 20 20 20 20 20  iTabCur,.       
2e120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e130 20 20 20 20 20 70 54 61 62 49 74 65 6d 2d 3e 72       pTabItem->r
2e140 65 67 52 65 73 75 6c 74 2c 20 30 29 3b 0a 20 20  egResult, 0);.  
2e150 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2e160 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
2e170 68 69 73 20 73 63 61 6e 20 75 73 65 73 20 61 6e  his scan uses an
2e180 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 56 44 42   index, make VDB
2e190 45 20 63 6f 64 65 20 73 75 62 73 74 69 74 75 74  E code substitut
2e1a0 69 6f 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74  ions to read dat
2e1b0 61 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68  a.    ** from th
2e1c0 65 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64 20  e index instead 
2e1d0 6f 66 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  of from the tabl
2e1e0 65 20 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65  e where possible
2e1f0 2e 20 20 49 6e 20 73 6f 6d 65 20 63 61 73 65 73  .  In some cases
2e200 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 6f 70 74  .    ** this opt
2e210 69 6d 69 7a 61 74 69 6f 6e 20 70 72 65 76 65 6e  imization preven
2e220 74 73 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f  ts the table fro
2e230 6d 20 65 76 65 72 20 62 65 69 6e 67 20 72 65 61  m ever being rea
2e240 64 2c 20 77 68 69 63 68 20 63 61 6e 0a 20 20 20  d, which can.   
2e250 20 2a 2a 20 79 69 65 6c 64 20 61 20 73 69 67 6e   ** yield a sign
2e260 69 66 69 63 61 6e 74 20 70 65 72 66 6f 72 6d 61  ificant performa
2e270 6e 63 65 20 62 6f 6f 73 74 2e 0a 20 20 20 20 2a  nce boost..    *
2e280 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20  * .    ** Calls 
2e290 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  to the code gene
2e2a0 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e  rator in between
2e2b0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2e2c0 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71  in and.    ** sq
2e2d0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20 77 69  lite3WhereEnd wi
2e2e0 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65 64 20  ll have created 
2e2f0 63 6f 64 65 20 74 68 61 74 20 72 65 66 65 72 65  code that refere
2e300 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20  nces the table. 
2e310 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20     ** directly. 
2e320 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73   This loop scans
2e330 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c   all that code l
2e340 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64  ooking for opcod
2e350 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72  es.    ** that r
2e360 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62  eference the tab
2e370 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20  le and converts 
2e380 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65  them into opcode
2e390 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65  s that.    ** re
2e3a0 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65  ference the inde
2e3b0 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  x..    */.    if
2e3c0 28 20 70 4c 6f 6f 70 2d 3e 77 73 46 6c 61 67 73  ( pLoop->wsFlags
2e3d0 20 26 20 28 57 48 45 52 45 5f 49 4e 44 45 58 45   & (WHERE_INDEXE
2e3e0 44 7c 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  D|WHERE_IDX_ONLY
2e3f0 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 20  ) ){.      pIdx 
2e400 3d 20 70 4c 6f 6f 70 2d 3e 75 2e 62 74 72 65 65  = pLoop->u.btree
2e410 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c  .pIndex;.    }el
2e420 73 65 20 69 66 28 20 70 4c 6f 6f 70 2d 3e 77 73  se if( pLoop->ws
2e430 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55  Flags & WHERE_MU
2e440 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20  LTI_OR ){.      
2e450 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 75  pIdx = pLevel->u
2e460 2e 70 43 6f 76 69 64 78 3b 0a 20 20 20 20 7d 0a  .pCovidx;.    }.
2e470 20 20 20 20 69 66 28 20 70 49 64 78 0a 20 20 20      if( pIdx.   
2e480 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 65 4f    && (pWInfo->eO
2e490 6e 65 50 61 73 73 3d 3d 4f 4e 45 50 41 53 53 5f  nePass==ONEPASS_
2e4a0 4f 46 46 20 7c 7c 20 21 48 61 73 52 6f 77 69 64  OFF || !HasRowid
2e4b0 28 70 49 64 78 2d 3e 70 54 61 62 6c 65 29 29 0a  (pIdx->pTable)).
2e4c0 20 20 20 20 20 26 26 20 21 64 62 2d 3e 6d 61 6c       && !db->mal
2e4d0 6c 6f 63 46 61 69 6c 65 64 0a 20 20 20 20 29 7b  locFailed.    ){
2e4e0 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71  .      last = sq
2e4f0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
2e500 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 6b  Addr(v);.      k
2e510 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42   = pLevel->addrB
2e520 6f 64 79 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d  ody;.      pOp =
2e530 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
2e540 70 28 76 2c 20 6b 29 3b 0a 20 20 20 20 20 20 66  p(v, k);.      f
2e550 6f 72 28 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b  or(; k<last; k++
2e560 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20  , pOp++){.      
2e570 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70    if( pOp->p1!=p
2e580 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29  Level->iTabCur )
2e590 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2e5a0 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f     if( pOp->opco
2e5b0 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b  de==OP_Column ){
2e5c0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 78  .          int x
2e5d0 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20   = pOp->p2;.    
2e5e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
2e5f0 64 78 2d 3e 70 54 61 62 6c 65 3d 3d 70 54 61 62  dx->pTable==pTab
2e600 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
2e610 28 20 21 48 61 73 52 6f 77 69 64 28 70 54 61 62  ( !HasRowid(pTab
2e620 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2e630 20 49 6e 64 65 78 20 2a 70 50 6b 20 3d 20 73 71   Index *pPk = sq
2e640 6c 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49  lite3PrimaryKeyI
2e650 6e 64 65 78 28 70 54 61 62 29 3b 0a 20 20 20 20  ndex(pTab);.    
2e660 20 20 20 20 20 20 20 20 78 20 3d 20 70 50 6b 2d          x = pPk-
2e670 3e 61 69 43 6f 6c 75 6d 6e 5b 78 5d 3b 0a 20 20  >aiColumn[x];.  
2e680 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2e690 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( x>=0 );.      
2e6a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2e6b0 78 20 3d 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  x = sqlite3Colum
2e6c0 6e 4f 66 49 6e 64 65 78 28 70 49 64 78 2c 20 78  nOfIndex(pIdx, x
2e6d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2e6e0 20 78 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   x>=0 ){.       
2e6f0 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 78       pOp->p2 = x
2e700 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f  ;.            pO
2e710 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e  p->p1 = pLevel->
2e720 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
2e730 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61     }.          a
2e740 73 73 65 72 74 28 20 28 70 4c 6f 6f 70 2d 3e 77  ssert( (pLoop->w
2e750 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
2e760 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 7c 7c 20 78  DX_ONLY)==0 || x
2e770 3e 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  >=0 .           
2e780 20 20 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 65 4f     || pWInfo->eO
2e790 6e 65 50 61 73 73 20 29 3b 0a 20 20 20 20 20 20  nePass );.      
2e7a0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
2e7b0 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69  >opcode==OP_Rowi
2e7c0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  d ){.          p
2e7d0 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d  Op->p1 = pLevel-
2e7e0 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20  >iIdxCur;.      
2e7f0 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
2e800 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20  = OP_IdxRowid;. 
2e810 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2e820 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
2e830 5f 49 66 4e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20  _IfNullRow ){.  
2e840 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20          pOp->p1 
2e850 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
2e860 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  r;.        }.   
2e870 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2e880 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e    /* Final clean
2e890 75 70 0a 20 20 2a 2f 0a 20 20 70 50 61 72 73 65  up.  */.  pParse
2e8a0 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  ->nQueryLoop = p
2e8b0 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65  WInfo->savedNQue
2e8c0 72 79 4c 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49  ryLoop;.  whereI
2e8d0 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e  nfoFree(db, pWIn
2e8e0 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  fo);.  return;.}
2e8f0 0a                                               .