func_apply

Dynamischer Funktionsaufruf — jede Skalarfunktion oder jedes Makro zur Laufzeit per Namen aufrufen

Maintainer: teaguesterling

Installation und Laden

INSTALL func_apply FROM community;
LOAD func_apply;

Beispiel

-- Load the extension
LOAD func_apply;
-- Call scalar functions dynamically
SELECT apply('upper', 'hello world');
-- Result: HELLO WORLD
SELECT apply('substr', 'hello world', 7, 5);
-- Result: world
-- Call table functions dynamically
SELECT * FROM apply_table('range', 5);
-- Returns: 0, 1, 2, 3, 4
SELECT * FROM apply_table('generate_series', 1, 10, 2);
-- Returns: 1, 3, 5, 7, 9
-- Check if a function exists before calling
SELECT function_exists('my_custom_func');
-- Result: true/false

Über func_apply

Die FuncApply-Erweiterung ermöglicht dynamische Funktionsaufrufe in DuckDB, sodass Sie jede Skalarfunktion oder jedes Makro zur Laufzeit per Namen aufrufen können. Das eignet sich für datengesteuerte Transformationen, dynamische SQL-Erzeugung und den Aufbau flexibler Datenpipelines.

Funktionen

Function Description
apply(func_name, ...args) Eine Funktion per Namen mit Argumenten aufrufen
apply_with(func_name, args, kwargs) Eine Funktion mit Argumenten als Liste aufrufen
apply_table(func_name, ...args) Eine Tabellenfunktion per Namen mit Argumenten aufrufen
apply_table_with(func_name, args, kwargs) Eine Tabellenfunktion mit Argumenten als Liste aufrufen
function_exists(name) Prüfen, ob eine Funktion existiert

Anwendungsfälle

Datengesteuerte Transformationen

-- Store transformation rules in a table
CREATE TABLE transforms (column_name VARCHAR, func_name VARCHAR);
INSERT INTO transforms VALUES ('name', 'upper'), ('email', 'lower');
-- Apply transformations dynamically
SELECT apply(t.func_name, d.value) as result
FROM data d JOIN transforms t ON d.column = t.column_name;

Dynamische Funktionsauswahl

-- Choose function based on data type
SELECT apply(
CASE typeof(value)
WHEN 'VARCHAR' THEN 'upper'
WHEN 'INTEGER' THEN 'abs'
END,
value
) FROM my_table;

Unterstützte Funktionstypen

  • Skalarfunktionen (z. B. upper, abs, substr)
  • Makros (z. B. list_sum, list_reverse)

Aggregat- und Tabellenfunktionen werden nicht unterstützt.

Sicherheitsmodell

apply und apply_table laufen im eigenen Kontext des Aufrufers — sie gewähren kein zusätzliches Privileg über das SQL hinaus, das der Aufrufer bereits direkt ausführen könnte. Sie sind eine Bequemlichkeit für dynamisches Dispatch, kein Sandkasten.

Für Szenarien, die func_apply einbetten und einschränken möchten, welche Funktionen aufgerufen werden dürfen (z. B. wenn ein Funktionsname aus weniger vertrauenswürdiger Eingabe kommt), steht eine optionale Opt-in-Richtlinie zur Verfügung. Sie gilt pro Sitzung und ist standardmäßig none (keine Einschränkung):

Function Description
func_apply_set_security_mode(mode) 'none', 'blacklist', 'whitelist' oder 'validator'
func_apply_set_whitelist([...]) / func_apply_set_blacklist([...]) Erlaubte bzw. verweigerte Funktionsnamen setzen
func_apply_lock_security() Die Richtlinie der aktuellen Sitzung unwiderruflich sperren

Die Richtlinie liegt im ClientContext der Sitzung und sickert nicht über Verbindungen hinweg. Versionen vor 0.2.0 speicherten sie prozessglobal und konnten eingeschleuste Identifikatoren per Quote-Escape umgehen — siehe Sicherheitshinweis GHSA-55g5-vp25-phpg; aktualisieren Sie auf 0.2.0 (DuckDB-v1.5.4-Track).

Hinzugefügte Funktionen

function_name function_type description comment examples
apply_table table NULL NULL
apply_table_with table NULL NULL
apply_with scalar NULL NULL
func_apply_get_security_config scalar NULL NULL
func_apply_lock_security scalar NULL NULL
func_apply_set_blacklist scalar NULL NULL
func_apply_set_block_default scalar NULL NULL
func_apply_set_on_block scalar NULL NULL
func_apply_set_security_mode scalar NULL NULL
func_apply_set_validator scalar NULL NULL
func_apply_set_whitelist scalar NULL NULL
function_exists scalar NULL NULL

Überladene Funktionen

function_name function_type description comment examples
apply scalar Returns a list that is the result of applying the lambda function to each element of the input list. The return type is defined by the return type of the lambda function. NULL [apply([1, 2, 3], lambda x : x + 1)]

Hinzugefügte Typen

Diese Erweiterung fügt keine Typen hinzu.

Hinzugefügte Einstellungen

Diese Erweiterung fügt keine Einstellungen hinzu.