mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-18 03:23:37 +08:00
Segfault when executing IMMUTABLE functions
Executing an IMMUTABLE function that has parameters and exception handling block multiple times in the same transaction causes a null pointer segfault when try to reset a non-initialized ts_baserel_info. Fixed it by preventing to reset a non-initialized `ts_baserel_info`. Fixes #4489
This commit is contained in:
parent
a608d7db61
commit
335f298ef7
@ -16,6 +16,7 @@ accidentally triggering the load of a previous DB version.**
|
||||
|
||||
**Thanks**
|
||||
@nikugogoi for reporting a bug with CTEs and upserts on distributed hypertables
|
||||
@jflambert for reporting a bug with IMMUTABLE functions
|
||||
|
||||
## 2.7.0 (2022-05-24)
|
||||
|
||||
|
@ -562,7 +562,7 @@ timescaledb_planner(Query *parse, int cursor_opts, ParamListInfo bound_params)
|
||||
ts_data_node_fetcher_scan_type = AutoFetcherType;
|
||||
}
|
||||
|
||||
if (reset_baserel_info)
|
||||
if (reset_baserel_info && ts_baserel_info)
|
||||
{
|
||||
BaserelInfo_destroy(ts_baserel_info);
|
||||
ts_baserel_info = NULL;
|
||||
|
@ -555,3 +555,34 @@ SELECT create_hypertable('part_custom_dim', 'time', 'combo', 4);
|
||||
NOTICE: adding not-null constraint to column "time"
|
||||
ERROR: could not find hash function for type tuple
|
||||
\set ON_ERROR_STOP 1
|
||||
-- immutable functions with sub-transaction (issue #4489)
|
||||
CREATE FUNCTION i4489(value TEXT DEFAULT '') RETURNS INTEGER
|
||||
AS
|
||||
$$
|
||||
BEGIN
|
||||
RETURN value::INTEGER;
|
||||
EXCEPTION WHEN invalid_text_representation THEN
|
||||
RETURN 0;
|
||||
END;
|
||||
$$
|
||||
LANGUAGE PLPGSQL IMMUTABLE;
|
||||
-- should return 1 (one) in both cases
|
||||
SELECT i4489('1'), i4489('1');
|
||||
i4489 | i4489
|
||||
-------+-------
|
||||
1 | 1
|
||||
(1 row)
|
||||
|
||||
-- should return 0 (zero) in all cases handled by the exception
|
||||
SELECT i4489(), i4489();
|
||||
i4489 | i4489
|
||||
-------+-------
|
||||
0 | 0
|
||||
(1 row)
|
||||
|
||||
SELECT i4489('a'), i4489('a');
|
||||
i4489 | i4489
|
||||
-------+-------
|
||||
0 | 0
|
||||
(1 row)
|
||||
|
||||
|
@ -555,3 +555,34 @@ SELECT create_hypertable('part_custom_dim', 'time', 'combo', 4);
|
||||
NOTICE: adding not-null constraint to column "time"
|
||||
ERROR: could not find hash function for type tuple
|
||||
\set ON_ERROR_STOP 1
|
||||
-- immutable functions with sub-transaction (issue #4489)
|
||||
CREATE FUNCTION i4489(value TEXT DEFAULT '') RETURNS INTEGER
|
||||
AS
|
||||
$$
|
||||
BEGIN
|
||||
RETURN value::INTEGER;
|
||||
EXCEPTION WHEN invalid_text_representation THEN
|
||||
RETURN 0;
|
||||
END;
|
||||
$$
|
||||
LANGUAGE PLPGSQL IMMUTABLE;
|
||||
-- should return 1 (one) in both cases
|
||||
SELECT i4489('1'), i4489('1');
|
||||
i4489 | i4489
|
||||
-------+-------
|
||||
1 | 1
|
||||
(1 row)
|
||||
|
||||
-- should return 0 (zero) in all cases handled by the exception
|
||||
SELECT i4489(), i4489();
|
||||
i4489 | i4489
|
||||
-------+-------
|
||||
0 | 0
|
||||
(1 row)
|
||||
|
||||
SELECT i4489('a'), i4489('a');
|
||||
i4489 | i4489
|
||||
-------+-------
|
||||
0 | 0
|
||||
(1 row)
|
||||
|
||||
|
@ -559,3 +559,34 @@ NOTICE: adding not-null constraint to column "time"
|
||||
(1 row)
|
||||
|
||||
\set ON_ERROR_STOP 1
|
||||
-- immutable functions with sub-transaction (issue #4489)
|
||||
CREATE FUNCTION i4489(value TEXT DEFAULT '') RETURNS INTEGER
|
||||
AS
|
||||
$$
|
||||
BEGIN
|
||||
RETURN value::INTEGER;
|
||||
EXCEPTION WHEN invalid_text_representation THEN
|
||||
RETURN 0;
|
||||
END;
|
||||
$$
|
||||
LANGUAGE PLPGSQL IMMUTABLE;
|
||||
-- should return 1 (one) in both cases
|
||||
SELECT i4489('1'), i4489('1');
|
||||
i4489 | i4489
|
||||
-------+-------
|
||||
1 | 1
|
||||
(1 row)
|
||||
|
||||
-- should return 0 (zero) in all cases handled by the exception
|
||||
SELECT i4489(), i4489();
|
||||
i4489 | i4489
|
||||
-------+-------
|
||||
0 | 0
|
||||
(1 row)
|
||||
|
||||
SELECT i4489('a'), i4489('a');
|
||||
i4489 | i4489
|
||||
-------+-------
|
||||
0 | 0
|
||||
(1 row)
|
||||
|
||||
|
@ -116,3 +116,21 @@ CREATE TABLE part_custom_dim (time TIMESTAMPTZ, combo TUPLE, device TEXT);
|
||||
-- on PG14 custom types are hashable
|
||||
SELECT create_hypertable('part_custom_dim', 'time', 'combo', 4);
|
||||
\set ON_ERROR_STOP 1
|
||||
|
||||
-- immutable functions with sub-transaction (issue #4489)
|
||||
CREATE FUNCTION i4489(value TEXT DEFAULT '') RETURNS INTEGER
|
||||
AS
|
||||
$$
|
||||
BEGIN
|
||||
RETURN value::INTEGER;
|
||||
EXCEPTION WHEN invalid_text_representation THEN
|
||||
RETURN 0;
|
||||
END;
|
||||
$$
|
||||
LANGUAGE PLPGSQL IMMUTABLE;
|
||||
|
||||
-- should return 1 (one) in both cases
|
||||
SELECT i4489('1'), i4489('1');
|
||||
-- should return 0 (zero) in all cases handled by the exception
|
||||
SELECT i4489(), i4489();
|
||||
SELECT i4489('a'), i4489('a');
|
||||
|
Loading…
x
Reference in New Issue
Block a user