Macros

MACRO() turns a feature expression into a reusable function. You specify which inputs become parameters, and the result is a callable that you can invoke with different values — like defining a function in any programming language.

MACRO(expression USING INPUT param1, param2, ...)
sql

Creating and calling a macro

Define a feature expression, then wrap it in MACRO() to make it callable. Here, AREA_CIRCLE_FEATURE computes the area of a circle, and AREA_CIRCLE_FUNCTION turns it into a function that accepts a radius:

FeatureQL
WITH
    RADIUS := INPUT(DOUBLE),
    AREA_CIRCLE_FEATURE := PI() * POW(RADIUS, 2e0),
    AREA_CIRCLE_FUNCTION := MACRO(AREA_CIRCLE_FEATURE USING INPUT RADIUS)
SELECT
    AREA_CIRCLE_VALUE_FOR_2 := AREA_CIRCLE_FUNCTION(2e0),
    AREA_CIRCLE_VALUE_FOR_5 := AREA_CIRCLE_FUNCTION(5e0)
;
Result
AREA_CIRCLE_VALUE_FOR_2 VARCHARAREA_CIRCLE_VALUE_FOR_5 VARCHAR
12.56637061435917278.53981633974483

The macro is called like a regular function — AREA_CIRCLE_FUNCTION(2e0) evaluates the area formula with radius 2.

Inline expressions

You don't need to name the intermediate feature. The expression can go directly inside MACRO(), and arguments can be expressions too:

FeatureQL
WITH
    RADIUS := INPUT(DOUBLE),
    AREA_CIRCLE_FUNCTION := MACRO(PI() * POW(RADIUS, 2e0) USING INPUT RADIUS)
SELECT
    AREA_CIRCLE_VALUE_FOR_2 := AREA_CIRCLE_FUNCTION(1e0 + 1e0),
    AREA_CIRCLE_VALUE_FOR_5 := AREA_CIRCLE_FUNCTION(2.5e0 * 2e0)
;
Result
AREA_CIRCLE_VALUE_FOR_2 VARCHARAREA_CIRCLE_VALUE_FOR_5 VARCHAR
12.56637061435917278.53981633974483

Multiple parameters

Macros accept any number of input parameters. The order of parameters in the USING INPUTS clause determines the argument order when calling:

FeatureQL
WITH
    LENGTH := INPUT(DOUBLE),
    WIDTH := INPUT(DOUBLE),
    AREA_RECTANGLE_FUNCTION := MACRO(LENGTH * WIDTH USING INPUTS LENGTH, WIDTH)
SELECT
    AREA_RECTANGLE_VALUE_FOR_2_5 := AREA_RECTANGLE_FUNCTION(2e0, 5e0),
    AREA_RECTANGLE_VALUE_FOR_5_3 := AREA_RECTANGLE_FUNCTION(5e0, 3e0)
;
Result
AREA_RECTANGLE_VALUE_FOR_2_5 VARCHARAREA_RECTANGLE_VALUE_FOR_5_3 VARCHAR
10.015.0

Chaining syntax

Macros support FeatureQL's chaining syntax. The chained value becomes the first argument:

FeatureQL
WITH
    RADIUS := INPUT(DOUBLE),
    AREA_CIRCLE_FUNCTION := MACRO(PI() * POW(RADIUS, 2e0) USING INPUT RADIUS)
SELECT
    AREA_CIRCLE_VALUE_FOR_2_CHAINING := 2e0.AREA_CIRCLE_FUNCTION()
;
Result
AREA_CIRCLE_VALUE_FOR_2_CHAINING VARCHAR
12.566370614359172

2e0.AREA_CIRCLE_FUNCTION() is equivalent to AREA_CIRCLE_FUNCTION(2e0).

Limitations

Macros are not polymorphic — each input parameter accepts only the type declared in its INPUT() definition. If you need a function that works across multiple types (e.g., both DATE and TIMESTAMP), use a UDF instead.

When to use macros vs variants

MACRO()VARIANT()
PurposeCreate reusable function templatesCreate alternative versions of existing features
MechanismParameterizes a feature expressionReplaces dependencies in an existing DAG
Best forDRY patterns, reusable calculationsExperimentation, A/B testing, what-if analysis

See Variants for dependency replacement and UDFs for polymorphic custom functions.

Last update at: 2026/03/03 16:47:38
Last updated: 2026-03-03 16:48:19