Where-Provenance

Where-provenance [Buneman et al., 2001] tracks, for each value in a query result, the specific cell (table, row, and column) in the database from which it originated. This is a finer-grained form of provenance than token-based lineage.

Enabling Where-Provenance

Where-provenance is disabled by default. Enable it for a session with:

SET provsql.where_provenance = on;

Or enable it permanently in postgresql.conf:

provsql.where_provenance = on

When enabled, each output cell in a provenance-tracked query carries an annotation identifying its source.

Note

Where-provenance adds overhead to every query. Enable it only when needed.

Using Where-Provenance

With where-provenance enabled, you can query the source location of a value using the where_provenance function:

SET provsql.where_provenance = on;
SELECT name, where_provenance(name)
FROM employees;

The function returns a where_provenance value describing the origin of the column value.

For interactive exploration, see Studio’s Where mode. It runs your query, displays the result alongside the source relations, and highlights the contributing cells when you hover over an output value: no explicit call to where_provenance required.

Projection Gates

Where-provenance introduces additional gate types in the circuit:

  • project – tracks which column a value was projected from.

  • eq – tracks equijoin conditions that constrained a value.

These gates appear alongside the usual plus/times gates when where-provenance is active.

Example

SELECT add_provenance('person');

-- Track where each name came from
SELECT p.name, where_provenance(p.name) AS name_source
FROM person p
JOIN sightings s ON p.id = s.person;

Limitations

Where-provenance is an experimental feature. Not all SQL constructs are fully supported when where-provenance is enabled. In particular, aggregate queries may not annotate all output cells correctly.