M Language Specification in Review: 2022

, , ,

During 2022, the Power Query M Language Specification received seven substantiative revisions (beyond typo fixes, formatting tweaks, and the such). Each brought clarification to ambiguous points or corrected cases where the specification did not align with actual mashup engine behavior. None of the revisions added new language functionality or otherwise resulted in the mashup engine changing.

Interestingly, while the M language gained two new features last year (try‘s catch and structured error messages), neither of these has yet to make it into the language spec.

Specification Revisions

Basic Concepts: Identifier references

Correction [2022-08-19] – Change Diff

Previously incorrectly implied that an inclusive identifier reference (@identifierName) was required to reference the current section member. Revised to reflect that actually normal (exclusive) references (identifierName) are acceptable.

Sections: #shared

Correction [2022-09-21] – Change Diff

Expanded the description of #shared to reflect that it contains both shared section members (as previously stated) and any identifiers directly added to the global environment by the mashup engine (existing behavior, but previously not reflected in the spec).

Types: Ascribed type of a value

Correction [2022-11-03] – Change Diff

Previously stated that, during ascription, only the nullable primitive type was checked. Revised to reflect the actual conformance rules used.

Types: Type equivalence and compatibility

Clarification [2022-12-16] – Change Diff

Prior wording made it sound like using the equality operator (=) between type values could produce random results. Actually, an M implementation may return false for all type equality comparisons, or may choose to use its own rules to decide whether the two values are equivalent, returning true or false as it deems appropriate.

Types: Type anynonnull and nullable primitive types

Correction [2022-09-21] – Change Diff

anynonnull is actually an abstract type. The nullable counterpart of a primitive-type is not a custom type. Operators is and as work with nullable primitive types (not just primitive types). 

Consolidated Grammar: Type expressions


  • Type time was missing from list of primitive types. [2022-08-26] – Change Diff
  • A table’s row type can actually be empty. [2022-09-01] – Change Diff
  • Syntax for defining types using expressions was more limited than what is actually supported. [2022-11-22] – Change Diff

Leave a Reply

Your email address will not be published. Required fields are marked *