2014-01-21 1 views
0

Это pgTAP тестpgTAP с plpgsql, но не с SQL

BEGIN; 

CREATE OR REPLACE FUNCTION test.testXUnitStyle() RETURNS SETOF TEXT AS $$ 
    SELECT ok(4 * 5 = 20, 'math should work in postgres'); 
$$ LANGUAGE plpgsql; 

SELECT * FROM runtests('test'::name); 

дает мне эту ошибку синтаксиса:

prove --ext .sql t/pgtap-xunit.sql --source pgTAP --pgtap-option dbname=test 
psql:t/pgtap-xunit.sql:5: ERROR: syntax error at or near "SELECT" 
LINE 2:  SELECT ok(4 * 5 = 20, 'math should work in postgres'); 
      ^
t/pgtap-xunit.sql .. Dubious, test returned 3 (wstat 768, 0x300) 
No subtests run 

Test Summary Report 
------------------- 
t/pgtap-xunit.sql (Wstat: 768 Tests: 0 Failed: 0) 
    Non-zero exit status: 3 
    Parse errors: No plan found in TAP output 
Files=1, Tests=0, 0 wallclock secs (0.03 usr + 0.00 sys = 0.03 CPU) 
Result: FAIL 

, но если я изменить LANGUAGE plpgsql только LANGUAGE sql это работает.

Что мне нужно сделать, чтобы запустить тест как plpgsql?

ответ

1

PL/PgSQL имеет разную структуру. Вы не можете просто скопировать тело функции SQL, объявите его language plpgsql и ожидайте его работы.

Выполнить это автономный, и вы увидите:

regress=> CREATE SCHEMA test; 
CREATE SCHEMA 
regress=> CREATE OR REPLACE FUNCTION test.testXUnitStyle() RETURNS SETOF TEXT AS $$ 
    SELECT ok(4 * 5 = 20, 'math should work in postgres'); 
$$ LANGUAGE plpgsql; 
ERROR: syntax error at or near "SELECT" 
LINE 2:  SELECT ok(4 * 5 = 20, 'math should work in postgres'); 
      ^

Если вы read the manual for Pl/PgSQL вы быстро поймете, почему: PL/PgSQL имеет общую [DECLARE ...] BEGIN ... END; в то структура. Вы также должны использовать PERFORM для выполнения запроса и отменить результат, или RETURN QUERY, если вы хотите вернуть результат. Таким образом, вы перепишете свой код в PL/PgSQL как:

CREATE OR REPLACE FUNCTION test.testXUnitStyle() RETURNS SETOF TEXT AS $$ 
BEGIN 
    RETURN QUERY SELECT ok(4 * 5 = 20, 'math should work in postgres'); 
END; 
$$ LANGUAGE plpgsql; 
Смежные вопросы