Dynamic
Dynamic stores values of different concrete types in the same declared column. Each value retains its active type, which can be inspected or extracted by a function.
Use Dynamic when the types are not known in advance. Use Variant to restrict values to a declared alternative list.
Creating Dynamic
Dynamic
Dynamic(max_types=N)N— A value from 0 through 254, defaulting to 32. This parameter is retained as type metadata; it does not limit the types admitted by CoordinatorDB.
SQL NULL is accepted without a Nullable wrapper.
Using Dynamic type in functions
dynamic_type(value) returns the active type name, or 'None' for NULL. dynamic_element(value, 'Type') extracts the payload when the active type matches and returns NULL otherwise.
Arithmetic uses the actual payload and retains a Dynamic result. Numeric aggregates require extraction or an explicit numeric cast. Ordering uses the active type's canonical name and then its value; distinct active numeric types are not collapsed merely because their numeric values are equal.
Examples
Different types in one column
CREATE TABLE observations(id UInt32, value Dynamic);
INSERT INTO observations VALUES
(1, CAST(7 AS UInt64)),
(2, 'hello'),
(3, NULL);SELECT id, dynamic_type(value)
FROM observations
ORDER BY id
FORMAT csv;1,"UInt64"
2,"String"
3,"None"Extracting a matching type
SELECT dynamic_element(CAST('hello' AS Dynamic), 'String'),
dynamic_element(CAST('hello' AS Dynamic), 'UInt64')
FORMAT csv;"hello",\N