Skip to content
Snippets Groups Projects
Commit 6eb98f58 authored by Jakub Jirutka's avatar Jakub Jirutka :flag_ua:
Browse files

main/pllua: change upstream to pllua-ng and upgrade to 2.0

The original project is not compatible with PostgreSQL 11.0 and is
not maintained anymore.
parent 7a7e7673
No related branches found
No related tags found
No related merge requests found
# Contributor: Michael Mason <ms13sp@gmail.com>
# Contributor: Jakub Jirutka <jakub@jirutka.cz>
# Maintainer: Michael Mason <ms13sp@gmail.com>
pkgname=pllua
pkgver=1.1.0
pkgrel=1
_pkgname=pllua-ng
pkgver=2.0
_pkgver="REL_${pkgver//./_}"
pkgrel=0
pkgdesc="Procedural language for PostgreSQL using Lua"
url="https://github.com/pllua/pllua"
url="https://github.com/RhodiumToad/pllua-ng"
arch="all"
license="MIT"
depends="postgresql"
# LuaJIT does not support s390x.
case "$CARCH" in
s390x) _lua=lua5.3;;
*) _lua=luajit;;
*) _lua=luajit; _luajit=luajit;;
esac
makedepends="postgresql-dev $_lua-dev"
source="$pkgname-$pkgver.tar.gz::https://github.com/pllua/$pkgname/archive/v$pkgver.tar.gz
fix-on-32bit.patch
fix-postgres10.patch"
builddir="$srcdir/$pkgname-$pkgver"
options="!check" # tests require running PostgreSQL
subpackages="$pkgname-dev"
source="https://github.com/RhodiumToad/$_pkgname/archive/$_pkgver/$_pkgname-$_pkgver.tar.gz"
builddir="$srcdir/$_pkgname-$_pkgver"
build() {
cd "$builddir"
make LUA_INCDIR=$(pkgconf --variable=includedir $_lua) \
make ${_luajit:+"LUAJIT=$_luajit"} \
LUA_INCDIR=$(pkgconf --variable=includedir $_lua) \
LUALIB=$(pkgconf --libs $_lua) \
USE_PGXS=1
}
......@@ -33,6 +36,4 @@ package() {
make USE_PGXS=1 DESTDIR="$pkgdir" install
}
sha512sums="bd882a5782d72b24aaca81f6678eefae191bbf53b7e8152f3d83b1b89e49d6a1c9a17be5edbc7673ff6b4f48426cf3b4ee5c6b8349555ed55078fb1e7cc6829d pllua-1.1.0.tar.gz
cf415243d0e99af2976f03261b80272ea7eb297711dc0a3386817d0b48f77aeb26b70741c594b7b8a089eb2b550e226bfd45e5077949be8e9fa0a36395ce3de1 fix-on-32bit.patch
2ea14f3415f3cb3ba425cb850feb38718c29e48b3c2b6cb98297e48ea5cec29f65356df4b3ee13fe3513d99d0014782d9591d8a044a667de6a8e9d3bd43ff460 fix-postgres10.patch"
sha512sums="fa933c07460d7b292b7837b0b32601a7932d6037fb87db64e84e676d6a8487491750be365727ae4da1706081a733a435f8960b5d417d9ca446d32938aaf2e1a9 pllua-ng-REL_2_0.tar.gz"
From 904a53bcc696a683f4a114d05400e5315e0ae70d Mon Sep 17 00:00:00 2001
From: eugwne <eugeney.sergeev@gmail.com>
Date: Mon, 10 Jul 2017 19:51:01 +0300
Subject: [PATCH] 64 lua -> pg 32bit system
Patch-Source: https://github.com/pllua/pllua/commit/904a53bcc696a683f4a114d05400e5315e0ae70d
---
plluaapi.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/plluaapi.c b/plluaapi.c
index f47a3b9..d0a1b4d 100644
--- a/plluaapi.c
+++ b/plluaapi.c
@@ -1095,8 +1095,18 @@ Datum luaP_todatum (lua_State *L, Oid type, int typmod, bool *isnull, int idx) {
dat = Int32GetDatum(lua_tointeger(L, idx));
break;
case INT8OID:
+#ifdef USE_FLOAT8_BYVAL
dat = Int64GetDatum(get64lua(L, idx));
break;
+#else
+ {
+ int64* value = (int64*)SPI_palloc(sizeof(int64));
+ *value = get64lua(L, idx);
+ dat = PointerGetDatum(value);
+ break;
+ }
+#endif
+
case TEXTOID: {
const char *s = lua_tostring(L, idx);
if (s == NULL) elog(ERROR,
From 3fcf91f71b8a8a6ceb46b59b132ed8d7cc81eb63 Mon Sep 17 00:00:00 2001
From: eugwne <eugeney.sergeev@gmail.com>
Date: Mon, 2 Oct 2017 20:13:36 +0300
Subject: [PATCH] text pgtype to oid
Patch-Source: https://github.com/pllua/pllua/commit/3fcf91f71b8a8a6ceb46b59b132ed8d7cc81eb63
diff --git a/expected/error_info.out b/expected/error_info.out
index f29edb0..32be0fa 100644
--- a/expected/error_info.out
+++ b/expected/error_info.out
@@ -117,3 +117,10 @@ CONTEXT:
stack traceback(trusted):
[C]: in function 'error'
[string "anonymous"]:2: in main chunk
+do $$
+local status, err = subtransaction(function() local _ = fromstring('no_type_text','qwerty') end)
+if (err) then
+ print(err)
+end
+$$ language pllua
+INFO: type "no_type_text" does not exist
diff --git a/expected/pgfunctest.out b/expected/pgfunctest.out
index 81a225e..fc058c4 100644
--- a/expected/pgfunctest.out
+++ b/expected/pgfunctest.out
@@ -52,14 +52,12 @@ begin
raise exception '%', $1;
end
$$ language plpgsql;
+\set VERBOSITY 'terse'
do $$
pgfunc('pg_temp.throw_error(text)',{only_internal=false})("exception test")
$$ language pllua;
ERROR: exception test
-CONTEXT:
-stack traceback(trusted):
- [C]: ?
- [string "anonymous"]:2: in main chunk
+\set VERBOSITY 'default'
do $$
local f = pgfunc('pg_temp.throw_error(text)',{only_internal=false})
print(pcall(f, "exception test"))
diff --git a/pllua.c b/pllua.c
index 4ef2f3b..2139eb3 100644
--- a/pllua.c
+++ b/pllua.c
@@ -150,7 +150,7 @@ void luaL_setfuncs(lua_State *L, const luaL_Reg *l, int nup) {
}
#endif
-int pg_to_regtype(char *typ_name)
+Oid pg_to_regtype(const char *typ_name)
{
Oid result;
@@ -161,14 +161,17 @@ int pg_to_regtype(char *typ_name)
*/
#if PG_VERSION_NUM < 90400
- parseTypeString(typ_name, &result, &typmod);
+ PG_TRY();
+ {
+ parseTypeString(typ_name, &result, &typmod);
+ }
+ PG_CATCH();
+ {
+ result = InvalidOid;
+ }
+ PG_END_TRY();
#else
- parseTypeString(typ_name, &result, &typmod, true);
+ parseTypeString(typ_name, &result, &typmod, true);
#endif
-
-
- if (OidIsValid(result))
- return result;
- else
- return -1;
+ return result;
}
diff --git a/pllua.h b/pllua.h
index 0a9fe99..d8d5df6 100644
--- a/pllua.h
+++ b/pllua.h
@@ -40,7 +40,6 @@ void luaP_pushtuple_trg (lua_State *L, TupleDesc desc, HeapTuple tuple,
HeapTuple luaP_totuple (lua_State *L);
HeapTuple luaP_casttuple (lua_State *L, TupleDesc tupdesc);
/* SPI */
-Oid luaP_gettypeoid (const char *type_name);
void luaP_pushdesctable(lua_State *L, TupleDesc desc);
void luaP_registerspi(lua_State *L);
void luaP_pushcursor (lua_State *L, Portal cursor);
diff --git a/plluaapi.c b/plluaapi.c
index d0a1b4d..adbe9e4 100644
--- a/plluaapi.c
+++ b/plluaapi.c
@@ -452,16 +452,22 @@ static int luaP_warning (lua_State *L) {
#undef PLLUA_REPORT
static int luaP_fromstring (lua_State *L) {
- int oid = luaP_gettypeoid(luaL_checkstring(L, 1));
- const char *s = luaL_checkstring(L, 2);
- luaP_Typeinfo *ti = luaP_gettypeinfo(L, oid);
- int inoid = oid;
- Datum v;
- /* from getTypeIOParam in lsyscache.c */
- if (ti->type == TYPTYPE_BASE && OidIsValid(ti->elem)) inoid = ti->elem;
- v = InputFunctionCall(&ti->input, (char *) s, inoid, 0); /* typmod = 0 */
- luaP_pushdatum(L, v, oid);
- return 1;
+ const char *type_name = luaL_checkstring(L, 1);
+ Oid oid = pg_to_regtype(type_name);
+ if (oid == InvalidOid) {
+ return luaL_error(L,"type \"%s\" does not exist",type_name);
+ } else {
+ const char *s = luaL_checkstring(L, 2);
+ luaP_Typeinfo *ti = luaP_gettypeinfo(L, oid);
+ Oid inoid = oid;
+ Datum v;
+
+ /* from getTypeIOParam in lsyscache.c */
+ if (ti->type == TYPTYPE_BASE && OidIsValid(ti->elem)) inoid = ti->elem;
+ v = InputFunctionCall(&ti->input, (char *) s, inoid, 0); /* typmod = 0 */
+ luaP_pushdatum(L, v, oid);
+ }
+ return 1;
}
#ifdef PLLUA_DEBUG
diff --git a/plluacommon.h b/plluacommon.h
index dc7a5fa..c2f9852 100644
--- a/plluacommon.h
+++ b/plluacommon.h
@@ -93,6 +93,6 @@ int pllua_getmaster_index(lua_State *L);
___m = MemoryContextSwitchTo(___mcxt)
#define MTOPG MemoryContextSwitchTo(___m);}
-int pg_to_regtype(char *typ_name);
+Oid pg_to_regtype(const char *typ_name);
#endif // PLLUACOMMON_H
diff --git a/plluaspi.c b/plluaspi.c
index c50d107..f87280f 100644
--- a/plluaspi.c
+++ b/plluaspi.c
@@ -958,21 +958,6 @@ static int luaP_rowsplan (lua_State *L) {
/* ======= SPI ======= */
-
-Oid luaP_gettypeoid (const char *type_name) {
-#if PG_VERSION_NUM < 80300
- List *namelist = stringToQualifiedNameList(type_name, NULL);
- HeapTuple typetup = typenameType(NULL, makeTypeNameFromNameList(namelist));
-#else
- List *namelist = stringToQualifiedNameList(type_name);
- HeapTuple typetup = typenameType(NULL, makeTypeNameFromNameList(namelist), NULL);
-#endif
- Oid typeoid = HeapTupleGetOid(typetup);
- ReleaseSysCache(typetup);
- list_free(namelist);
- return typeoid;
-}
-
static int luaP_prepare (lua_State *L) {
int nargs, cursoropt;
const char *q = luaL_checkstring(L, 1);
@@ -995,7 +980,7 @@ static int luaP_prepare (lua_State *L) {
int k = lua_tointeger(L, -2);
if (k > 0) {
const char *s = luaL_checkstring(L, -1);
- Oid type = luaP_gettypeoid(s);
+ Oid type = pg_to_regtype(s);
if (type == InvalidOid)
return luaL_error(L, "invalid type to plan: %s", s);
p->type[k - 1] = type;
diff --git a/sql/error_info.sql b/sql/error_info.sql
index 3a8ed85..aef7e7c 100644
--- a/sql/error_info.sql
+++ b/sql/error_info.sql
@@ -71,3 +71,10 @@ do $$
error()
$$language pllua;
+do $$
+local status, err = subtransaction(function() local _ = fromstring('no_type_text','qwerty') end)
+if (err) then
+ print(err)
+end
+$$ language pllua
+
diff --git a/sql/pgfunctest.sql b/sql/pgfunctest.sql
index 40c5350..65eaf33 100644
--- a/sql/pgfunctest.sql
+++ b/sql/pgfunctest.sql
@@ -47,9 +47,11 @@ raise exception '%', $1;
end
$$ language plpgsql;
+\set VERBOSITY 'terse'
do $$
pgfunc('pg_temp.throw_error(text)',{only_internal=false})("exception test")
$$ language pllua;
+\set VERBOSITY 'default'
do $$
local f = pgfunc('pg_temp.throw_error(text)',{only_internal=false})
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment