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 extensionLOAD func_apply;
-- Call scalar functions dynamicallySELECT apply('upper', 'hello world');-- Result: HELLO WORLD
SELECT apply('substr', 'hello world', 7, 5);-- Result: world
-- Call table functions dynamicallySELECT * 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 callingSELECT 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 tableCREATE TABLE transforms (column_name VARCHAR, func_name VARCHAR);INSERT INTO transforms VALUES ('name', 'upper'), ('email', 'lower');
-- Apply transformations dynamicallySELECT apply(t.func_name, d.value) as resultFROM data d JOIN transforms t ON d.column = t.column_name;Dynamische Funktionsauswahl
-- Choose function based on data typeSELECT 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.