1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
|
--
\set VERBOSITY terse
--
-- 5.4-specific features.
-- simple close metamethod
do language pllua $$
local tc <close>
= setmetatable({}, { __close = function() print("close called") end })
spi.error("error")
$$;
INFO: close called
ERROR: error
-- close metamethod on cursor
begin;
do language pllua $$
for r in spi.rows([[ select * from generate_series(1,5) i ]]) do
print(r)
if r.i > 2 then break end
end
$$;
INFO: (1)
INFO: (2)
INFO: (3)
select * from pg_cursors; -- should be empty
name | statement | is_holdable | is_binary | is_scrollable | creation_time
------+-----------+-------------+-----------+---------------+---------------
(0 rows)
commit;
-- lua error in close method
do language pllua $$
local tc <close>
= setmetatable({}, { __close = function() error("inner error") end })
error("outer error")
$$;
ERROR: pllua: [string "DO-block"]:3: inner error
-- db access in close method with outer lua error
do language pllua $$
local tc <close>
= setmetatable({}, { __close = function() print(pgtype.numeric(0)) end })
error("outer error")
$$;
INFO: 0
ERROR: pllua: [string "DO-block"]:4: outer error
-- db access in close method with outer db error
do language pllua $$
local tc <close>
= setmetatable({}, { __close = function() print(pgtype.numeric(0)) end })
spi.error("outer error")
$$;
ERROR: pllua: cannot call into PostgreSQL with pending errors
-- close metamethod in SRF
create function pg_temp.sf1(n integer) returns setof integer
language pllua
as $$
local x <close>
= setmetatable({}, { __close = function() print("close called") end })
for i = n, n+3 do
coroutine.yield(i)
end
$$;
select * from (values (1),(2)) v(n), lateral (select * from pg_temp.sf1(v.n) limit 1) s;
INFO: close called
INFO: close called
n | sf1
---+-----
1 | 1
2 | 2
(2 rows)
--end
|