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>
(cherry picked from commit 12f56438fc
)
pull/7588/head
parent
f2d102d54b
commit
2ee43fd00c
|
@ -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)
|
|
@ -107,6 +107,7 @@ test: object_propagation_debug
|
|||
test: undistribute_table
|
||||
test: run_command_on_all_nodes
|
||||
test: background_task_queue_monitor
|
||||
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