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
|
||||
contain_param_walker(Node *node, void *context)
|
||||
{
|
||||
if (node == NULL)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (IsA(node, Param))
|
||||
{
|
||||
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: other_databases grant_role_from_non_maindb role_operations_from_non_maindb seclabel_non_maindb
|
||||
test: citus_internal_access
|
||||
test: function_with_case_when
|
||||
|
||||
# Causal clock test
|
||||
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