Annotation: assert.if_functions_compile
CREATE OR REPLACE FUNCTION assert.if_functions_compile(VARIADIC _schema_name text[], OUT message text, OUT result boolean)
RETURNS record
Information: assert.if_functions_compile
Schema | assert |
Function Name | if_functions_compile |
Arguments | VARIADIC _schema_name text[], OUT message text, OUT result boolean |
Owner | postgres |
Result Type | record |
Description | |
Implementation: assert.if_functions_compile
CREATE OR REPLACE FUNCTION assert.if_functions_compile(VARIADIC _schema_name text[], OUT message text, OUT result boolean)
RETURNS record
LANGUAGE plpgsql
AS $function$
DECLARE all_parameters text;
DECLARE current_function RECORD;
DECLARE current_function_name text;
DECLARE current_type text;
DECLARE current_type_schema text;
DECLARE current_parameter text;
DECLARE functions_count smallint := 0;
DECLARE current_parameters_count int;
DECLARE i int;
DECLARE command_text text;
DECLARE failed_functions text;
BEGIN
FOR current_function IN
SELECT proname, proargtypes, nspname
FROM pg_proc
INNER JOIN pg_namespace
ON pg_proc.pronamespace = pg_namespace.oid
WHERE pronamespace IN
(
SELECT oid FROM pg_namespace
WHERE nspname = ANY($1)
AND nspname NOT IN
(
'assert', 'unit_tests', 'information_schema'
)
AND proname NOT IN('if_functions_compile')
)
LOOP
current_parameters_count := array_upper(current_function.proargtypes, 1) + 1;
i := 0;
all_parameters := '';
LOOP
IF i < current_parameters_count THEN
IF i > 0 THEN
all_parameters := all_parameters || ', ';
END IF;
SELECT
nspname, typname
INTO
current_type_schema, current_type
FROM pg_type
INNER JOIN pg_namespace
ON pg_type.typnamespace = pg_namespace.oid
WHERE pg_type.oid = current_function.proargtypes[i];
IF(current_type IN('int4', 'int8', 'numeric', 'integer_strict', 'money_strict','decimal_strict', 'integer_strict2', 'money_strict2','decimal_strict2', 'money','decimal', 'numeric', 'bigint')) THEN
current_parameter := '1::' || current_type_schema || '.' || current_type;
ELSIF(substring(current_type, 1, 1) = '_') THEN
current_parameter := 'NULL::' || current_type_schema || '.' || substring(current_type, 2, length(current_type)) || '[]';
ELSIF(current_type in ('date')) THEN
current_parameter := '''1-1-2000''::' || current_type;
ELSIF(current_type = 'bool') THEN
current_parameter := 'false';
ELSE
current_parameter := '''''::' || quote_ident(current_type_schema) || '.' || quote_ident(current_type);
END IF;
all_parameters = all_parameters || current_parameter;
i := i + 1;
ELSE
EXIT;
END IF;
END LOOP;
BEGIN
current_function_name := quote_ident(current_function.nspname) || '.' || quote_ident(current_function.proname);
command_text := 'SELECT * FROM ' || current_function_name || '(' || all_parameters || ');';
EXECUTE command_text;
functions_count := functions_count + 1;
EXCEPTION WHEN OTHERS THEN
IF(failed_functions IS NULL) THEN
failed_functions := '';
END IF;
IF(SQLSTATE IN('42702', '42704')) THEN
failed_functions := failed_functions || E'\n' || command_text || E'\n' || SQLERRM || E'\n';
END IF;
END;
END LOOP;
IF(failed_functions != '') THEN
message := E'The test if_functions_compile failed. The following functions failed to compile : \n\n' || failed_functions;
result := false;
PERFORM assert.fail(message);
RETURN;
END IF;
END;
$function$