DO $test40$
DECLARE
v_body text;
v_pattern text :=
'(\mfrom[[:space:]]+report\.conf_scheduler_sfr'
'[[:space:]]+where[[:space:]]+is_active'
'[[:space:]]*=[[:space:]]*true\M)';
v_matches integer;
BEGIN
IF EXISTS (
SELECT 1
FROM report.fns_reference_request_journal
WHERE created_at >= current_date + time '16:30'
AND contract_id IN (13644952, 13687399, 13687807)
) THEN
RAISE EXCEPTION
'После 16:30 уже есть новые записи по тестовым договорам. Повторное формирование остановлено.';
END IF;
SELECT p.prosrc
INTO STRICT v_body
FROM pg_proc p
WHERE p.oid = 'smev.f3_create_sfr_register()'::regprocedure;
SELECT count(*)
INTO v_matches
FROM regexp_matches(v_body, v_pattern, 'gi');
IF v_matches <> 1 THEN
RAISE EXCEPTION
'Не удалось однозначно выделить отбор настроек: найдено %. Запуск отменён.',
v_matches;
END IF;
v_body := regexp_replace(
v_body,
v_pattern,
'\1 AND id = 40',
'gi'
);
IF v_body !~* '\mreturn[[:space:]]+0[[:space:]]*;' THEN
RAISE EXCEPTION
'Структура функции отличается от ожидаемой. Запуск отменён.';
END IF;
v_body := regexp_replace(
v_body,
'\mreturn[[:space:]]+0[[:space:]]*;',
'RETURN;',
'gi'
);
RAISE NOTICE 'TEST40: начало формирования только №40';
EXECUTE format('DO %L;', v_body);
RAISE NOTICE 'TEST40: вызов завершён; результат проверяем по выводу и журналу';
END;
$test40$;