pllua

pllua : Lua as a procedural language

Overview

IDExtensionPackageVersionCategoryLicenseLanguage
3020
pllua
pllua
2.0.12
LANG
MIT
C
AttributeHas BinaryHas LibraryNeed LoadHas DDLRelocatableTrusted
--s-d--
No
Yes
No
Yes
no
no
Relationships
Schemaspg_catalog
Need By
hstore_pllua
See Also
plperl
plpgsql
plpython3u
pg_tle
plv8
pljava
plperlu
Siblings
hstore_pllua
plluau
hstore_plluau

missing pg12-15 on el.aarch64

Packages

TypeRepoVersionPG Major CompatibilityPackage PatternDependencies
EXT
PGDG
2.0.12
18
17
16
15
14
pllua-
RPM
PGDG
2.0.12
18
17
16
15
14
pllua_$v-
DEB
PGDG
2.0.12
18
17
16
15
14
postgresql-$v-pllua-
Linux / PGPG18PG17PG16PG15PG14
el8.x86_64
MISS
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.11
PGDG 2.0.11
el8.aarch64
MISS
PGDG 2.0.12
PGDG 2.0.12
MISS
MISS
el9.x86_64
MISS
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.11
PGDG 2.0.11
el9.aarch64
MISS
PGDG 2.0.12
PGDG 2.0.12
MISS
MISS
el10.x86_64
MISS
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.12
el10.aarch64
MISS
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.12
d12.x86_64
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.12
d12.aarch64
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.12
d13.x86_64
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.12
d13.aarch64
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.12
u22.x86_64
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.12
u22.aarch64
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.12
u24.x86_64
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.12
u24.aarch64
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.12
PGDG 2.0.12
PackageVersionOSORGSIZEFile URL
postgresql-18-pllua2.0.12d12.x86_64pgdg347.6 KiBpostgresql-18-pllua_2.0.12-7.pgdg12+1_amd64.deb
postgresql-18-pllua2.0.12d12.aarch64pgdg336.3 KiBpostgresql-18-pllua_2.0.12-7.pgdg12+1_arm64.deb
postgresql-18-pllua2.0.12d13.x86_64pgdg348.2 KiBpostgresql-18-pllua_2.0.12-7.pgdg13+1_amd64.deb
postgresql-18-pllua2.0.12d13.aarch64pgdg336.2 KiBpostgresql-18-pllua_2.0.12-7.pgdg13+1_arm64.deb
postgresql-18-pllua2.0.12u22.x86_64pgdg354.5 KiBpostgresql-18-pllua_2.0.12-7.pgdg22.04+1_amd64.deb
postgresql-18-pllua2.0.12u22.aarch64pgdg341.8 KiBpostgresql-18-pllua_2.0.12-7.pgdg22.04+1_arm64.deb
postgresql-18-pllua2.0.12u24.x86_64pgdg347.6 KiBpostgresql-18-pllua_2.0.12-7.pgdg24.04+1_amd64.deb
postgresql-18-pllua2.0.12u24.aarch64pgdg335.4 KiBpostgresql-18-pllua_2.0.12-7.pgdg24.04+1_arm64.deb

Source

Install

Make sure PGDG repo available:

pig repo add pgdg -u    # add pgdg repo and update cache

Install this extension with pig:

pig install pllua;		# install via package name, for the active PG version

pig install pllua -v 18;   # install for PG 18
pig install pllua -v 17;   # install for PG 17
pig install pllua -v 16;   # install for PG 16
pig install pllua -v 15;   # install for PG 15
pig install pllua -v 14;   # install for PG 14

Create this extension with:

CREATE EXTENSION pllua;

Usage

pllua: Lua as a procedural language

pllua enables writing PostgreSQL functions in Lua (5.3, 5.4, or LuaJIT 2.1).

CREATE EXTENSION pllua;

Create Functions

CREATE FUNCTION lua_max(a integer, b integer) RETURNS integer LANGUAGE pllua AS $$
  if a > b then return a else return b end
$$;

CREATE FUNCTION hello(name text) RETURNS text LANGUAGE pllua AS $$
  return "Hello, " .. name .. "!"
$$;

Data Type Handling

Arguments are automatically converted: integers/floats to Lua numbers, text/varchar to strings, booleans to Lua booleans, NULL to nil. Other types remain as datum objects.

Construct typed values with pgtype:

pgtype.numeric(1234)
pgtype.date('2017-12-01')
pgtype.array.integer(1, 2, 3, 4)
pgtype.numrange(1, 2)

Composite Types (Rows)

row.columnname     -- access by name
row[3]             -- access by attribute number
for colname, value, attnum in pairs(row) do ... end

Set-Returning Functions

CREATE FUNCTION generate_n(n integer) RETURNS SETOF integer LANGUAGE pllua AS $$
  for i = 1, n do
    coroutine.yield(i)
  end
$$;

SPI Database Access

-- Simple query
local rows = spi.execute("SELECT * FROM mytable WHERE id = $1", 42)

-- Row iterator
for row in spi.rows("SELECT * FROM mytable") do
  print(row.name)
end

-- Prepared statements
local stmt = spi.prepare("SELECT * FROM users WHERE id = $1", {'integer'})
local result = stmt:execute(42)
for row in stmt:rows(42) do ... end

Cursors

local cursor = spi.newcursor()
cursor:open("SELECT * FROM items")
local rows = cursor:fetch(10)
cursor:move(5)
cursor:close()

Trigger Functions

CREATE FUNCTION my_trigger() RETURNS trigger LANGUAGE pllua AS $$
  function(trigger, old, new)
    trigger.row = new
    return trigger.row
  end
$$;

Trigger fields: trigger.event (INSERT/UPDATE/DELETE), trigger.when (BEFORE/AFTER), trigger.level (ROW/STATEMENT), trigger.new, trigger.old, trigger.row.

Error Handling

spi.error('division_by_zero', 'Cannot divide by zero')
spi.notice('informational message')
spi.warning('warning message')

-- Subtransactions with pcall
local ok, err = pcall(function()
  spi.execute("INSERT INTO mytable VALUES ($1)", val)
end)

Logging

print("info message")
spi.debug("debug")
spi.notice("notice")
spi.warning("warning")
spi.error("error")
Last updated on