mirror of https://github.com/citusdata/citus.git
Fix segfault when using certain DO block in function (#7554)
When using a CASE WHEN expression in the body of the function that is used in the DO block, a segmentation fault occured. This fixes that. Fixes #7381 --------- Co-authored-by: Konstantin Morozov <vzbdryn@yahoo.com>pull/6876/merge
parent
f0043b64a1
commit
12f56438fc
|
@ -91,6 +91,10 @@ bool InDelegatedFunctionCall = false;
|
||||||
static bool
|
static bool
|
||||||
contain_param_walker(Node *node, void *context)
|
contain_param_walker(Node *node, void *context)
|
||||||
{
|
{
|
||||||
|
if (node == NULL)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
if (IsA(node, Param))
|
if (IsA(node, Param))
|
||||||
{
|
{
|
||||||
Param *paramNode = (Param *) node;
|
Param *paramNode = (Param *) node;
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
CREATE SCHEMA function_with_case;
|
||||||
|
SET search_path TO function_with_case;
|
||||||
|
-- create function
|
||||||
|
CREATE OR REPLACE FUNCTION test_err(v1 text)
|
||||||
|
RETURNS text
|
||||||
|
LANGUAGE plpgsql
|
||||||
|
SECURITY DEFINER
|
||||||
|
AS $function$
|
||||||
|
|
||||||
|
begin
|
||||||
|
return v1 || ' - ok';
|
||||||
|
END;
|
||||||
|
$function$;
|
||||||
|
do $$ declare
|
||||||
|
lNewValues text;
|
||||||
|
val text;
|
||||||
|
begin
|
||||||
|
val = 'test';
|
||||||
|
lNewValues = test_err(v1 => case when val::text = 'test'::text then 'yes' else 'no' end);
|
||||||
|
raise notice 'lNewValues= %', lNewValues;
|
||||||
|
end;$$ ;
|
||||||
|
NOTICE: lNewValues= yes - ok
|
||||||
|
CONTEXT: PL/pgSQL function inline_code_block line XX at RAISE
|
||||||
|
-- call function
|
||||||
|
SELECT test_err('test');
|
||||||
|
test_err
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
test - ok
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
DROP SCHEMA function_with_case CASCADE;
|
||||||
|
NOTICE: drop cascades to function test_err(text)
|
|
@ -110,6 +110,7 @@ test: run_command_on_all_nodes
|
||||||
test: background_task_queue_monitor
|
test: background_task_queue_monitor
|
||||||
test: other_databases grant_role_from_non_maindb role_operations_from_non_maindb seclabel_non_maindb
|
test: other_databases grant_role_from_non_maindb role_operations_from_non_maindb seclabel_non_maindb
|
||||||
test: citus_internal_access
|
test: citus_internal_access
|
||||||
|
test: function_with_case_when
|
||||||
|
|
||||||
# Causal clock test
|
# Causal clock test
|
||||||
test: clock
|
test: clock
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
CREATE SCHEMA function_with_case;
|
||||||
|
SET search_path TO function_with_case;
|
||||||
|
|
||||||
|
-- create function
|
||||||
|
CREATE OR REPLACE FUNCTION test_err(v1 text)
|
||||||
|
RETURNS text
|
||||||
|
LANGUAGE plpgsql
|
||||||
|
SECURITY DEFINER
|
||||||
|
AS $function$
|
||||||
|
|
||||||
|
begin
|
||||||
|
return v1 || ' - ok';
|
||||||
|
END;
|
||||||
|
$function$;
|
||||||
|
do $$ declare
|
||||||
|
lNewValues text;
|
||||||
|
val text;
|
||||||
|
begin
|
||||||
|
val = 'test';
|
||||||
|
lNewValues = test_err(v1 => case when val::text = 'test'::text then 'yes' else 'no' end);
|
||||||
|
raise notice 'lNewValues= %', lNewValues;
|
||||||
|
end;$$ ;
|
||||||
|
|
||||||
|
-- call function
|
||||||
|
SELECT test_err('test');
|
||||||
|
|
||||||
|
DROP SCHEMA function_with_case CASCADE;
|
Loading…
Reference in New Issue