Skip to content

v0.8.0

Choose a tag to compare

@dbsmedya dbsmedya released this 23 May 02:19
· 218 commits to main since this release

Release Notes — 2026-05-22

Fixed

  • SQL slow-query MCP tools (search_sql, search_sql_api,
    search_sql_granite, search_sql_api_granite) no longer leak rows that
    don't match min_time / min_lock_time when combined with table_filter.
    LanceDB's bypass-index path was demoting prefilters to postfilters;
    filters now apply before the index strategy.
  • Hybrid search no longer returns the same fingerprint twice. The vector +
    FTS branches could double-emit; results are now deduped by fingerprint id.
  • The "Showing N of M results" header is no longer arithmetically impossible.
    If a future regression makes search and count_matching disagree, the
    header surfaces both numbers in-band and a WARNING is logged — no
    fabricated clamping.

Documentation

  • config.yaml / config.yaml.example engine descriptions now spell out
    the filter contract:
    • min_time — milliseconds, cumulative execution_time_ms across all
      calls of a fingerprint (not per-call avg).
    • min_lock_time — seconds, cumulative lock_time_sec.
    • table_filter — matches against the tables list column.

Skills

  • New: slow-query-triage — finds the most impacted query in one MCP call
    (min_time=999999 is the leverage point); Phase 2 validates root cause
    against live MySQL.
  • New: locking-query-triage — surfaces the entire lock-contention universe
    in one call and attributes damage to tables and services.
  • Removed: slow-query-investigator (had structural bugs in predicate
    attribution across JOINs).

Internals

  • IVectorStore.count_matching(...) added to the ports protocol, mirrored
    on SearchService, and implemented by LanceDBStore (filter-correct via
    table.count_rows(filter=...)). Used to compute total_matching for the
    result header.
  • _normalize_table_name() centralizes table_filter canonicalization:
    handles SQLGlot quoted identifiers, schema-qualified names, and case
    folding.
  • Python-side postfilter loop after to_polars() acts as defense-in-depth
    on the LanceDB prefilter, in case its prefilter semantics change again.

Tests

  • tests/integration/test_lancedb_filter_bugs.py pins all three bugs
    against a real LanceDB instance (4 tests, all green).
  • New unit tests guard the filter-ordering invariant, the dedup behavior,
    and the anomaly-flagged header.

Full Changelog: v0.7.3...v0.8.0