Platform

Column masking

Mask expressions annotated onto the plan's output columns - nulling, hashing, partial reveal or rounding to a bucket - resolved by priority and applied at execution instead of by the client

On this page

The question it answers

Row rules decide which rows. Masking decides which values in those rows - the case where somebody may legitimately work with a dataset but must not read a particular field at full fidelity.

A support analyst needs to match a customer without reading the full document number. A regional manager needs salary distribution without individual salaries. Those are not row problems.

What a mask can express

Masks are declared in a dialect-neutral form and evaluated at execution:

Mask Effect Typical use
Null The value is removed A field that must not be read at all
Hash A stable one-way digest Joining and counting distinct values without reading them
Partial reveal The first N characters, then a marker Matching a record against a customer's own reference
Round to a bucket Value rounded to a multiple Distributions and cohorts without individual figures

The hash case is worth noting: it preserves what analysis actually needs - equality and cardinality - while removing what it does not need, which is the value itself.

Conflicts resolve by priority

Where more than one mask applies to a column, the highest priority wins. One value per column per caller, not an ambiguous stack.

Applied in the plan

A mask annotates the output column in the query plan, and is applied during execution. It is not a client-side transformation, which means:

  • a dashboard, a page of an application, an MCP client and an AI agent are masked identically;
  • an export contains masked values, because the export is the query result;
  • and no caller can request the unmasked value by asking a different way, since there is no path where the mask is applied by the caller.