Я использую pgtap для проверки хранимых процедур postgresql.ее функция results_eq берет результат хранимой процедуры, сравнивает его с ожидаемым результатом и сообщает об ошибке, если оба не равны.
это код, который я выполняю:
PREPARE result_have AS SELECT select_some_data(12345, 'test_string');
PREPARE result_want AS VALUES ('("2010-09-07 06:05:00+00",100.0)');
SELECT results_eq('result_have', 'result_want');
и это вывод ошибки:
not ok 21
# Failed test 21: "this should return a result"
# Columns differ between queries:
# have: ("(""2010-09-07 06:05:00+00"",100.0)")
# want: ("(""2010-09-07 06:05:00+00"",100.0)")
# Looks like you failed 1 test of 21
я мог бы быть действительно лишенным сна, но хотел бы и выглядел очень похожим на меня.
кто-нибудь знает, почему этосообщается как сбой?
обновление относительно деталей: так я определяю хранимую процедуру, о которой идет речь:
CREATE OR REPLACE FUNCTION select_some_data
(
IN p_some_pkey integer,
IN p_some_code varchar(16)
)
RETURNS TABLE(timestamp_utc timestamp with time zone, value varchar)
...
, чтобы следовать Питерс совет , я пытался изменить свой код, но безуспешно:
PREPARE result_have AS SELECT select_some_data(12345, 'test_string');
-- TODO: none of these work, syntax error at or near "TABLE"
-- PREPARE result_want AS VALUES ('("2010-09-07 06:05:00+00",100.0)'::TABLE(timestamp with time zone, varchar));
-- PREPARE result_want AS VALUES ('("2010-09-07 06:05:00+00",100.0)'::'TABLE(timestamp with time zone, varchar)');
-- this is the old code...
PREPARE result_want AS VALUES ('("2010-09-07 06:05:00+00",100.0)');
SELECT results_eq('result_have', 'result_want');
, как вы, вероятно, можете сказать, я довольно сильно теряю сознание даже из-за основного синтаксиса postgresql - и ни один из Googleни поиск на postgresql.org не возвращает ничего полезного при поиске ::
.В конце концов я рискнул предположить, что это может быть оператор, и обнаружил, что ::
- это тип приведения .В документации параметров column_name
для CREATE FUNCTION говорится, что 'RETURNS TABLE
также подразумевает RETURNS SETOF
', что приводит меня, например, здесь и, возможно, здесь и здесь .Новые попытки:
PREPARE result_have AS SELECT select_some_data(12345, 'test_string');
-- TODO: doesn't work, syntax error at or near "("
-- PREPARE result_want AS VALUES ('("2010-09-07 06:05:00+00",100.0)'::SETOF(timestamp with time zone, varchar));
-- TODO: doesn't work, syntax error at or near ","
-- PREPARE result_want AS VALUES ('("2010-09-07 06:05:00+00",100.0)'::SETOF RECORD(timestamp with time zone, varchar));
-- this is the old code...
PREPARE result_want AS VALUES ('("2010-09-07 06:05:00+00",100.0)');
SELECT results_eq('result_have', 'result_want');
это бессмысленно, я просто делаю догадки здесь.Кто-нибудь может помочь мне с правильным синтаксисом?Также обратите внимание, что эта функция просто RETURNS TABLE
, потому что это было первое, что я смог заставить работать, поэтому, если есть решение, которое потребовало бы его изменить, я рад его изменить.
обновление 2 : RhodiumToad на IRC-канале postgresql (irc: //irc.freenode.net/#postgresql) помог мне с правильным синтаксисом.если бы я знал о postgresql немного больше, чем я, я мог бы подумать, что это имеет смысл только: два типа данных, два приведения (DOH!): o).
также, на данный момент, естьтолько один набор данных в тестовой базе данных, поэтому синтаксис, используемый выше, все еще может работать.насколько я понимаю, он, скорее всего, потерпит неудачу, когда будет возвращено более одного набора данных, поэтому он должен быть SELECT * FROM
, а не просто SELECT
:
PREPARE result_have AS SELECT * FROM select_some_data(12345, 'test_param_code');
PREPARE result_want AS VALUES ('2010-09-07 06:05:00+00'::timestamp with time zone, '100.0'::varchar);
SELECT results_eq('result_have', 'result_want', 'have and want should be equal');
теперь иметь и результаты хотят сравнивать как равныеи тест проходит.вывод журнала при запуске тестов:
ok 21 - have and want should be equal
ok
All tests successful.
Files=1, Tests=21, 1 wallclock secs ( 0.02 usr 0.00 sys + 0.05 cusr 0.03 csys = 0.10 CPU)
Result: PASS
WOOT !!: -)