Explore features
The SHOW FEATURES command lets you search, filter, and analyze features in the registry. Use it to discover what's available, understand dependencies, and audit how features relate to each other.
Syntax
SHOW [MY] [RECENT] FEATURES [(INCLUDE <fields> | EXCLUDE <fields> | COLUMNS <fields>)] [<feature_name>, ...] [IN <namespace> [UP TO LEVEL <n>]] [LIKE <pattern>] [WHERE <condition>] [ORDER BY <expression>] [LIMIT <n>]
Available metadata fields
These fields can be used in INCLUDE, EXCLUDE, COLUMNS, WHERE, and ORDER BY clauses:
| Field | Type | Description |
|---|---|---|
name | VARCHAR | Fully qualified name (includes namespace) |
datatype | VARCHAR | Data type of the feature |
function | VARCHAR | Function used in the definition |
formula | VARCHAR | The feature's expression |
params | ROW | Parameter details (kind, name, type) |
created_at | ROW | Creation timestamp |
updated_at | ROW | Last update timestamp |
Basic usage
Let's create a few features and then explore them:
CREATE OR REPLACE FEATURES AS
SELECT
FM.TUTORIALS.EXPLORE.FEATURE1 := 1,
FM.TUTORIALS.EXPLORE.FEATURE2 := 2
;| feature_name VARCHAR | status VARCHAR | message VARCHAR |
|---|---|---|
| FM.TUTORIALS.EXPLORE.FEATURE1 | CREATED | Feature created as not exists |
| FM.TUTORIALS.EXPLORE.FEATURE2 | CREATED | Feature created as not exists |
List the features we just created:
SHOW FEATURES (COLUMNS (NAME)) IN FM.TUTORIALS.EXPLORE;| NAME VARCHAR |
|---|
| FM.TUTORIALS.EXPLORE.FEATURE1 |
| FM.TUTORIALS.EXPLORE.FEATURE2 |
After replacing and adding features, SHOW FEATURES reflects the current state:
CREATE OR REPLACE FEATURES AS
SELECT
FM.TUTORIALS.EXPLORE.FEATURE1 := 11,
FM.TUTORIALS.EXPLORE.FEATURE11 := FM.TUTORIALS.EXPLORE.FEATURE1 + 1,
FM.TUTORIALS.EXPLORE.FEATURE12 := FM.TUTORIALS.EXPLORE.FEATURE1 + FM.TUTORIALS.EXPLORE.FEATURE2
COMMENT 'Adds FEATURE1 and FEATURE2',
;| feature_name VARCHAR | status VARCHAR | message VARCHAR |
|---|---|---|
| FM.TUTORIALS.EXPLORE.FEATURE1 | REPLACED | Feature was replaced |
| FM.TUTORIALS.EXPLORE.FEATURE11 | CREATED | Feature created as not exists |
| FM.TUTORIALS.EXPLORE.FEATURE12 | CREATED | Feature created as not exists |
Shorthand queries
SHOW FEATURES supports several shortcuts that map to common filter patterns:
| Shorthand | What it does |
|---|---|
SHOW FEATURE NAME_OF_FEATURE | Exact name match |
SHOW FEATURES NAME1, NAME2 | Filter to specific names |
SHOW FEATURES LIKE 'fm.customers.%' | Pattern match |
SHOW FEATURES IN 'fm.customers' | Features directly in a namespace (one level) |
SHOW FEATURES IN 'fm.customers' UP TO LEVEL 2 | Features in a namespace up to a given depth |
SHOW MY FEATURES | Features where you are point of contact |
SHOW RECENT FEATURES | Most recently created features (last 50) |
These shortcuts combine freely. For example, pattern matching within a namespace with depth and a result limit:
SHOW FEATURES LIKE '%EXPLORE%1' IN FM.TUTORIALS UP TO LEVEL 2 ORDER BY NAME LIMIT 10;| NAME VARCHAR | DATATYPE VARCHAR | FUNCTION VARCHAR | INPUTS VARCHAR | FORMULA VARCHAR | RESTRICTIONS VARCHAR | STATUS VARCHAR | META VARCHAR | SIGNATURE VARCHAR | POSITION BIGINT | DEPENDENCIES VARCHAR | CREATED_AT VARCHAR | CREATED_BY VARCHAR | UPDATED_AT VARCHAR | UPDATED_BY VARCHAR |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| FM.TUTORIALS.EXPLORE.FEATURE1 | BIGINT | VALUE | [] | VALUE(11) | [] | DEV | {} | VALUE.custom.BIGINT | 50 | {"FM.TUTORIALS.EXPLORE.FEATURE1": 1} | 2025-12-13 11:33:59.145000 | -- None -- | 2025-12-13 11:33:59.147000 | WEBGUEST_USER_SLTTESTS |
| FM.TUTORIALS.EXPLORE.FEATURE11 | BIGINT | ADD | [] | FM.TUTORIALS.EXPLORE.FEATURE1 + 1 | [] | DEV | {} | ADD.BIGINT.BIGINT.BIGINT | 50 | {"FM.TUTORIALS.EXPLORE.FEATURE1": 1, "FM.TUTORIALS.EXPLORE.FEATURE11": 2} | 2025-12-13 11:33:59.133000 | WEBGUEST_USER_SLTTESTS 2025-12-13 11:33:59.133000 WEBGUEST_USER_SLTTESTS |
Dependency analysis
FeatureQL tracks how features depend on each other. Three operators let you query these relationships:
| Operator | Description |
|---|---|
IS_UPSTREAM_OF(feature) | True if the feature is a dependency of the specified feature |
IS_DOWNSTREAM_OF(feature) | True if the feature depends on the specified feature |
DEPTH_RELATIVE_TO(feature) | Signed distance in the dependency graph |
Let's create a chain of features to explore: RFEATURE0 and RFEATURE1 are inputs, RFEATURE2 depends on RFEATURE0, RFEATURE3 depends on both RFEATURE1 and RFEATURE2, and RFEATURE4 depends on RFEATURE3.
CREATE OR REPLACE FEATURES IN FM.TUTORIALS.EXPLORE AS
SELECT
RFEATURE0 := INPUT(BIGINT),
RFEATURE1 := INPUT(BIGINT),
RFEATURE2 := RFEATURE0 + 1,
RFEATURE3 := RFEATURE1 + RFEATURE2,
RFEATURE4 := RFEATURE3 + 2;| feature_name VARCHAR | status VARCHAR | message VARCHAR |
|---|---|---|
| FM.TUTORIALS.EXPLORE.RFEATURE0 | CREATED | Feature created as not exists |
| FM.TUTORIALS.EXPLORE.RFEATURE1 | CREATED | Feature created as not exists |
| FM.TUTORIALS.EXPLORE.RFEATURE2 | CREATED | Feature created as not exists |
| FM.TUTORIALS.EXPLORE.RFEATURE3 | CREATED | Feature created as not exists |
| FM.TUTORIALS.EXPLORE.RFEATURE4 | CREATED | Feature created as not exists |
Finding upstream dependencies
What does RFEATURE3 depend on?
SHOW FEATURES (COLUMNS (NAME, FORMULA)) WHERE IS_UPSTREAM_OF('FM.TUTORIALS.EXPLORE.RFEATURE3')| NAME VARCHAR | FORMULA VARCHAR |
|---|---|
| FM.TUTORIALS.EXPLORE.RFEATURE2 | FM.TUTORIALS.EXPLORE.RFEATURE0 + 1 |
| FM.TUTORIALS.EXPLORE.RFEATURE1 | INPUT(BIGINT) |
| FM.TUTORIALS.EXPLORE.RFEATURE0 | INPUT(BIGINT) |
Finding downstream dependents
What depends on RFEATURE3?
SHOW FEATURES (COLUMNS (NAME, FORMULA)) WHERE IS_DOWNSTREAM_OF('FM.TUTORIALS.EXPLORE.RFEATURE3')| NAME VARCHAR | FORMULA VARCHAR |
|---|---|
| FM.TUTORIALS.EXPLORE.RFEATURE4 | FM.TUTORIALS.EXPLORE.RFEATURE3 + 2 |
Visualizing depth in the dependency graph
DEPTH_RELATIVE_TO returns negative values for upstream features and positive values for downstream ones, giving you a sense of the dependency distance:
SHOW FEATURES (
COLUMNS (NAME, FORMULA),
INCLUDE (DEPTH_RELATIVE_TO('FM.TUTORIALS.EXPLORE.RFEATURE3') as DEPTH_IN_DAG)
)
WHERE DEPTH_IN_DAG IS NOT NULL::BIGINT
ORDER BY DEPTH_IN_DAG ASC| NAME VARCHAR | FORMULA VARCHAR | DEPTH_IN_DAG VARCHAR |
|---|---|---|
| FM.TUTORIALS.EXPLORE.RFEATURE0 | INPUT(BIGINT) | -2 |
| FM.TUTORIALS.EXPLORE.RFEATURE1 | INPUT(BIGINT) | -2 |
| FM.TUTORIALS.EXPLORE.RFEATURE2 | FM.TUTORIALS.EXPLORE.RFEATURE0 + 1 | -1 |
| FM.TUTORIALS.EXPLORE.RFEATURE3 | FM.TUTORIALS.EXPLORE.RFEATURE1 + FM.TUTORIALS.EXPLORE.RFEATURE2 | 0 |
| FM.TUTORIALS.EXPLORE.RFEATURE4 | FM.TUTORIALS.EXPLORE.RFEATURE3 + 2 | 1 |
Tracing feature dependencies with SELECT TRACE
SELECT TRACE is a shorthand that automatically expands a feature into its full dependency chain. Instead of returning only the features you name, TRACE includes all named upstream dependencies in topological order — inputs first, the requested feature last.
This is useful when you want to see every intermediate step that leads to a result, without manually listing each dependency.
A simple inline example — TRACE reorders features by their dependency depth regardless of how you wrote them:
SELECT TRACE
F4 := F2 + F3,
F1 := 1,
F2 := F1 + 1,
F3 := F1 * 2;| F1 BIGINT | F2 BIGINT | F3 BIGINT | F4 BIGINT |
|---|---|---|---|
| 1 | 2 | 2 | 4 |
With persisted features, TRACE goes further: it expands a single feature into its entire upstream tree. Here, selecting only RFEATURE4 with TRACE returns all five features in the chain:
SELECT TRACE
FM.TUTORIALS.EXPLORE.RFEATURE4
FROM FM.TUTORIALS.EXPLORE
FOR CROSS
FM.TUTORIALS.EXPLORE.RFEATURE0 := BIND_VALUE(2),
FM.TUTORIALS.EXPLORE.RFEATURE1 := BIND_VALUE(3);| FM.TUTORIALS.EXPLORE.RFEATURE0 BIGINT | FM.TUTORIALS.EXPLORE.RFEATURE1 BIGINT | FM.TUTORIALS.EXPLORE.RFEATURE2 BIGINT | FM.TUTORIALS.EXPLORE.RFEATURE3 BIGINT | FM.TUTORIALS.EXPLORE.RFEATURE4 BIGINT |
|---|---|---|---|---|
| 2 | 3 | 3 | 6 | 8 |