Free Plan

Change Log

New and updated Power Query Lint rules. See all rules on the Rules page.

October 5, 2026

New Rules

  • preserve-dataverse-lookup-tables-for-joins

    When a query performs a manual Table.Join or Table.NestedJoin, flags removing Dataverse table-typed navigation columns with Table.ColumnsOfType. Those relationship columns may already provide the data the manual join is recreating.

  • no-unnecessary-table-sort

    Flags Table.Sort steps whose result is not used by an order-sensitive operation. Power BI does not preserve load order, so refresh-time sorting is otherwise wasted.

  • require-manual-status-handling-for-web-contents

    Flags Web.Contents calls without ManualStatusHandling. Without it, any non-2xx response (404, 429, 500) raises a generic DataSource.Error instead of being handled explicitly.

  • require-aggregation-function-for-table-pivot

    Flags Table.Pivot calls without an aggregation function as the fifth argument. Without one, the query fails when a pivoted attribute/value combination has more than one row for the same key.

  • require-try-otherwise-for-type-conversions

    Flags conversions like Number.From or Date.From that are not wrapped in try ... otherwise, so a single bad cell fails the whole step.

  • require-try-otherwise-for-text-split-index-access

    Flags indexed access on Text.Split results (e.g. Text.Split([Phone], "x"){1}) that is not wrapped in try ... otherwise, which errors when the input has fewer parts than expected.

  • require-guard-for-text-position-of-not-found

    Flags Text.PositionOf results used without checking for -1 (not found), which can slice incorrectly or error in functions like Text.Range.

  • require-distinct-lookup-table-before-nested-join

    Flags a Table.NestedJoin whose lookup table (third argument) is never deduplicated on the join keys, which silently multiplies rows. Traces the lookup through earlier steps: Table.Distinct, Table.Group and Table.AddKey count as deduplication, and later steps that can repeat rows undo it.

  • require-distinct-lookup-table-before-nested-join-across-queries

    Flags a Table.NestedJoin whose lookup table comes from another query that never deduplicates on the join keys. Runs on TMDL, and on pasted Power Query when the paste contains several queries with // QueryName headers.

  • require-null-guard-before-table-expand

    Flags Table.ExpandRecordColumn/Table.ExpandListColumn on a JSON- or API-sourced column with no null guard, since a null record or list raises an error. Checked per column, so a guard on one column does not clear another.

  • require-null-check-in-conditional-column

    Flags relational comparisons (>=, <=, >, <) on a possibly-null column with no null guard, since a null comparison silently falls through to the else branch. Null checks in the same if/else if chain, or a Table.SelectRows/Table.ReplaceValue guard upstream, count as guarded.

Rule Changes

  • use-adbc-implementation-for-odbc-drivers

    Updated to match Microsoft's current ADBC transition timeline: service-side ODBC removal is planned for early Q1 2027 and Desktop/gateway removal for spring 2027. Implementation="1.0" (or "default") is called out as the highest-risk case because it always forces ODBC, while an unpinned Implementation follows the tenant/workspace ADBC default.

  • no-plain-text-client-secret-as-parameter

    No longer flags URL/API path literals (e.g. a Databricks HttpPath such as "/sql/1.0/warehouses/...") as client secrets.