1
0
mirror of https://github.com/postgres/postgres.git synced 2025-04-25 21:42:33 +03:00

Start a separate test suite for plpgsql

The plpgsql.sql test file in the main regression tests is now by far the
largest after numeric_big, making editing and managing the test cases
very cumbersome.  The other PLs have their own test suites split up into
smaller files by topic.  It would be nice to have that for plpgsql as
well.  So, to get that started, set up test infrastructure in
src/pl/plpgsql/src/ and split out the recently added procedure test
cases into a new file there.  That file now mirrors the test cases added
to the other PLs, making managing those matching tests a bit easier too.

msvc build system changes with help from Michael Paquier
This commit is contained in:
Peter Eisentraut 2017-12-07 14:03:29 -05:00
parent 3d8874224f
commit 632b03da31
7 changed files with 125 additions and 101 deletions

View File

@ -1,3 +1,6 @@
/pl_gram.c /pl_gram.c
/pl_gram.h /pl_gram.h
/plerrcodes.h /plerrcodes.h
/log/
/results/
/tmp_check/

View File

@ -24,6 +24,8 @@ OBJS = pl_gram.o pl_handler.o pl_comp.o pl_exec.o \
DATA = plpgsql.control plpgsql--1.0.sql plpgsql--unpackaged--1.0.sql DATA = plpgsql.control plpgsql--1.0.sql plpgsql--unpackaged--1.0.sql
REGRESS = plpgsql_call
all: all-lib all: all-lib
# Shared library stuff # Shared library stuff
@ -65,6 +67,18 @@ pl_gram.c: BISONFLAGS += -d
plerrcodes.h: $(top_srcdir)/src/backend/utils/errcodes.txt generate-plerrcodes.pl plerrcodes.h: $(top_srcdir)/src/backend/utils/errcodes.txt generate-plerrcodes.pl
$(PERL) $(srcdir)/generate-plerrcodes.pl $< > $@ $(PERL) $(srcdir)/generate-plerrcodes.pl $< > $@
check: submake
$(pg_regress_check) $(REGRESS_OPTS) $(REGRESS)
installcheck: submake
$(pg_regress_installcheck) $(REGRESS_OPTS) $(REGRESS)
.PHONY: submake
submake:
$(MAKE) -C $(top_builddir)/src/test/regress pg_regress$(X)
distprep: pl_gram.h pl_gram.c plerrcodes.h distprep: pl_gram.h pl_gram.c plerrcodes.h
# pl_gram.c, pl_gram.h and plerrcodes.h are in the distribution tarball, # pl_gram.c, pl_gram.h and plerrcodes.h are in the distribution tarball,

View File

@ -0,0 +1,41 @@
--
-- Tests for procedures / CALL syntax
--
CREATE PROCEDURE test_proc1()
LANGUAGE plpgsql
AS $$
BEGIN
NULL;
END;
$$;
CALL test_proc1();
-- error: can't return non-NULL
CREATE PROCEDURE test_proc2()
LANGUAGE plpgsql
AS $$
BEGIN
RETURN 5;
END;
$$;
CALL test_proc2();
ERROR: cannot return a value from a procedure
CONTEXT: PL/pgSQL function test_proc2() while casting return value to function's return type
CREATE TABLE test1 (a int);
CREATE PROCEDURE test_proc3(x int)
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO test1 VALUES (x);
END;
$$;
CALL test_proc3(55);
SELECT * FROM test1;
a
----
55
(1 row)
DROP PROCEDURE test_proc1;
DROP PROCEDURE test_proc2;
DROP PROCEDURE test_proc3;
DROP TABLE test1;

View File

@ -0,0 +1,47 @@
--
-- Tests for procedures / CALL syntax
--
CREATE PROCEDURE test_proc1()
LANGUAGE plpgsql
AS $$
BEGIN
NULL;
END;
$$;
CALL test_proc1();
-- error: can't return non-NULL
CREATE PROCEDURE test_proc2()
LANGUAGE plpgsql
AS $$
BEGIN
RETURN 5;
END;
$$;
CALL test_proc2();
CREATE TABLE test1 (a int);
CREATE PROCEDURE test_proc3(x int)
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO test1 VALUES (x);
END;
$$;
CALL test_proc3(55);
SELECT * FROM test1;
DROP PROCEDURE test_proc1;
DROP PROCEDURE test_proc2;
DROP PROCEDURE test_proc3;
DROP TABLE test1;

View File

@ -6067,44 +6067,3 @@ END; $$ LANGUAGE plpgsql;
ERROR: "x" is not a scalar variable ERROR: "x" is not a scalar variable
LINE 3: GET DIAGNOSTICS x = ROW_COUNT; LINE 3: GET DIAGNOSTICS x = ROW_COUNT;
^ ^
--
-- Procedures
--
CREATE PROCEDURE test_proc1()
LANGUAGE plpgsql
AS $$
BEGIN
NULL;
END;
$$;
CALL test_proc1();
-- error: can't return non-NULL
CREATE PROCEDURE test_proc2()
LANGUAGE plpgsql
AS $$
BEGIN
RETURN 5;
END;
$$;
CALL test_proc2();
ERROR: cannot return a value from a procedure
CONTEXT: PL/pgSQL function test_proc2() while casting return value to function's return type
CREATE TABLE proc_test1 (a int);
CREATE PROCEDURE test_proc3(x int)
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO proc_test1 VALUES (x);
END;
$$;
CALL test_proc3(55);
SELECT * FROM proc_test1;
a
----
55
(1 row)
DROP PROCEDURE test_proc1;
DROP PROCEDURE test_proc2;
DROP PROCEDURE test_proc3;
DROP TABLE proc_test1;

View File

@ -4843,52 +4843,3 @@ BEGIN
GET DIAGNOSTICS x = ROW_COUNT; GET DIAGNOSTICS x = ROW_COUNT;
RETURN; RETURN;
END; $$ LANGUAGE plpgsql; END; $$ LANGUAGE plpgsql;
--
-- Procedures
--
CREATE PROCEDURE test_proc1()
LANGUAGE plpgsql
AS $$
BEGIN
NULL;
END;
$$;
CALL test_proc1();
-- error: can't return non-NULL
CREATE PROCEDURE test_proc2()
LANGUAGE plpgsql
AS $$
BEGIN
RETURN 5;
END;
$$;
CALL test_proc2();
CREATE TABLE proc_test1 (a int);
CREATE PROCEDURE test_proc3(x int)
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO proc_test1 VALUES (x);
END;
$$;
CALL test_proc3(55);
SELECT * FROM proc_test1;
DROP PROCEDURE test_proc1;
DROP PROCEDURE test_proc2;
DROP PROCEDURE test_proc3;
DROP TABLE proc_test1;

View File

@ -248,23 +248,32 @@ sub taptest
sub plcheck sub plcheck
{ {
chdir "../../pl"; chdir "$topdir/src/pl";
foreach my $pl (glob("*")) foreach my $dir (glob("*/src *"))
{ {
next unless -d "$pl/sql" && -d "$pl/expected"; next unless -d "$dir/sql" && -d "$dir/expected";
my $lang = $pl eq 'tcl' ? 'pltcl' : $pl; my $lang;
if ($dir eq 'plpgsql/src') {
$lang = 'plpgsql';
}
elsif ($dir eq 'tcl') {
$lang = 'pltcl';
}
else {
$lang = $dir;
}
if ($lang eq 'plpython') if ($lang eq 'plpython')
{ {
next unless -d "../../$Config/plpython2"; next unless -d "$topdir/$Config/plpython2";
$lang = 'plpythonu'; $lang = 'plpythonu';
} }
else else
{ {
next unless -d "../../$Config/$lang"; next unless -d "$topdir/$Config/$lang";
} }
my @lang_args = ("--load-extension=$lang"); my @lang_args = ("--load-extension=$lang");
chdir $pl; chdir $dir;
my @tests = fetchTests(); my @tests = fetchTests();
if ($lang eq 'plperl') if ($lang eq 'plperl')
{ {
@ -285,16 +294,16 @@ sub plcheck
"============================================================\n"; "============================================================\n";
print "Checking $lang\n"; print "Checking $lang\n";
my @args = ( my @args = (
"../../../$Config/pg_regress/pg_regress", "$topdir/$Config/pg_regress/pg_regress",
"--bindir=../../../$Config/psql", "--bindir=$topdir/$Config/psql",
"--dbname=pl_regression", @lang_args, @tests); "--dbname=pl_regression", @lang_args, @tests);
system(@args); system(@args);
my $status = $? >> 8; my $status = $? >> 8;
exit $status if $status; exit $status if $status;
chdir ".."; chdir "$topdir/src/pl";
} }
chdir "../../.."; chdir "$topdir";
} }
sub subdircheck sub subdircheck