Skip to content

Custom language declaration (functions, do statements, plpgsql, plv8, ...)

Olivier Guimbal edited this page Feb 8, 2021 · 3 revisions

When creating a function (or executing a DO statement), you must provide a language.

You can register such languages in pg-mem via the db.registerLanguage() api.

For instance, a simple implementation that will always throw on created functions call would be:

db.registerLanguage('mylang', () => {
    return () => {
        throw new Error('Functions not supported !')
    }
});

Doing that, this will work:

CREATE FUNCTION myfunc(integer) AS $$ whatever you want $$ LANGUAGE mylang

However, this will throw a Functions not supported ! error:

SELECT myfunc(42);

A special example: javascript via plv8

If you declare simple plv8 functions, you could mock plv8 like this:

db.registerLanguage('plv8', ({ code, args }) => {
            const argNames = args.map((x, i) => x.name ?? ('$' + i));
            return new Function(...argNames, code) as CompiledFunction;
        });

This, however, would only work for plv8 code that only use its arguments, and does not access any data, nor out arguments, such as:

create function add(x int, y int) returns int
as $$ x + y $$ language plv8;

select add(2, 40); -- 42 !

Please file an issue if you'd like more support for this !