luajit

In-Process-LuaJIT-UDFs für DuckDB — JIT-kompiliert, parallel (Zustände pro Thread), vertrauenswürdige Sandbox, GROUP-BY-Aggregate, LIST-/STRUCT-/MAP-Brücken, eingebetteter Fennel-Compiler

Maintainer: alitrack

Installation und Laden

INSTALL luajit FROM community;
LOAD luajit;

Beispiel

-- Load and compile a UDF in one shot
LOAD luajit;
SELECT message FROM luajit_module(
mode := 'quick_compile',
source := 'return function(x) return x * 2 + 1 end',
sql_name := 'x2p1'
);
-- Use it immediately (auto-macro generated)
SELECT x2p1(5);
-- → 11

Über luajit

luajit — JIT-kompilierte Lua-UDFs für DuckDB

Schreiben und führen Sie Lua-Funktionen direkt in SQL aus. LuaJIT kompiliert sie mit trace-basiertem JIT zu nativem Maschinen- code, mit paralleler Ausführung: jeder DuckDB-Worker-Thread besitzt einen eigenen lua_State (keine globale Sperre), sodass Thread-Parallelität direkt auf LuaJIT-Parallelität abgebildet wird.

16 Funktionen:

  • luajit_i / luajit_f / luajit_b — typisierte Skalar-UDFs (BIGINT, DOUBLE, BOOLEAN)
  • luajit_v / luajit_vi / luajit_vschunk-gebündelte Skalare (1 Lua-Aufruf pro Chunk, ~1,9× Zeilenmodus)
  • luajit_m — Auto-Cast für gemischte Typen
  • luajit_l / luajit_s / luajit_map — LIST-/STRUCT-/MAP-Typbrücken (verschachtelte Typen einschl. DATE)
  • luajit_agg — Aggregat-UDFs mit GROUP-BY-Unterstützung (volle Wertetabelle pro Gruppe)
  • luajit_table — streamende tabellenerzeugende UDFs (O(1)-Speicher, 1 Mio. Zeilen)
  • luajit_module — Modulverwaltung (14 Modi: compile, quick_compile, fennel, trusted, inspect, macro, list, drop, reset, save, load, last_error, info)

Funktionen:

  • Autoerkennung (v0.23): quick_compile prüft die UDF (int/date/STRUCT/array) und erzeugt automatisch das passende Skalar- oder Batch-Makro — keine manuelle Stilwahl
  • lua_State-Pool pro Thread (P4): keine globale Sperre bei der Lua-Ausführung — DuckDB- Parallelität → LuaJIT-Parallelität (~2,6× bei 4 Threads, CPU-gebundene UDFs)
  • trusted-Sandbox-Modus: entfernt io/ffi/package/require/load*/debug, reduziert os (wird verzögert pro State angewendet, ein/aus über Threads hinweg)
  • _duckdb_query-Brücke: SQL aus Lua ausführen, Ergebnismengen als Lua-Tabellen erhalten
  • Eingebetteter Fennel-Compiler (mode:='fennel'): Lisp-Syntax (match-Muster, Compile-Zeit-Makros) nach Lua kompiliert — keine Laufzeitkosten
  • DATE-/TIMESTAMP-/DECIMAL-/HUGEINT-Brücken (einschl. int64-/int128-Dezimalspeicher)
  • GROUP-BY-Aggregate mit vollen Wertetabellen (Median, Standardabweichung, Perzentil, …)
  • GC64-Build: keine 2-GB-Speichergrenze; ~1 MB eigenständige Binärdatei, keine Laufzeitabhängigkeiten
  • save/load-Persistenz mit Escaping mehrzeiliger Quellen

Leistung (1 Mio. Zeilen, 2 BIGINT-Argumente, a*b+a, 4 Threads):

  • Batch luajit_vi: 13 ms; Zeile luajit_i: 13 ms (2,6× gegenüber Zeile+seriell)
  • Einzelthread: Batch 18 ms (1,9× Zeilenmodus 34 ms)

Plattformen: Linux x64/arm64, Windows (MSVC), macOS x64/arm64. WASM und mingw/rtools ausgeschlossen (LuaJIT erfordert bestimmte Toolchains); linux_arm64 geprüft (v0.31, CI + arm64-Laufzeittest).

Hinzugefügte Funktionen

function_name function_type description comment examples
luajit scalar NULL NULL
luajit_agg aggregate NULL NULL
luajit_b scalar NULL NULL
luajit_blob scalar NULL NULL
luajit_f scalar NULL NULL
luajit_i scalar NULL NULL
luajit_l scalar NULL NULL
luajit_m scalar NULL NULL
luajit_map scalar NULL NULL
luajit_module table NULL NULL
luajit_s scalar NULL NULL
luajit_table table NULL NULL
luajit_v scalar NULL NULL
luajit_vi scalar NULL NULL
luajit_vs scalar NULL NULL

Überladene Funktionen

Diese Erweiterung fügt keine Funktionsüberladungen hinzu.

Hinzugefügte Typen

Diese Erweiterung fügt keine Typen hinzu.

Hinzugefügte Einstellungen

Diese Erweiterung fügt keine Einstellungen hinzu.