提交 375c1ba7 编写于 作者: H Heikki Linnakangas

Re-enable upstream 'plpgsql' test.

It was not enabled, because there were a lot of errors in it, because of
features that have been disabled in Greenplum. Like enforcing foreign keys,
INSERT RETURNING, and doing SPI in functions in segments. Those limitations
make these tests a less interesting than in the upstream, but there are
still many good tests in there too. Like the test for anonymous DO blocks,
that are not tested by any other tests.

The .sql file was almost identical to the upstream version. Clean it up
to be even closer, by re-enabling some commented queries in it, removing
the duplicated tests for RETURN QUERY, removing the READS/CONTAINS/MODIFIES
SQL DATA noise words etc.

Memorize the expected output as it is. That's quite different from the
upstream, because of all the disabled functionality, but also because of
some cosmetic differences in error messages.

The 'schema_topology' test contained a copy of the for_vect(), so remove
that, now that we run the real thing.
上级 633817a3
...@@ -3950,57 +3950,6 @@ CREATE TABLE col_check_constraint ( ...@@ -3950,57 +3950,6 @@ CREATE TABLE col_check_constraint (
INSERT into col_check_constraint values (100,'text1'); INSERT into col_check_constraint values (100,'text1');
INSERT into col_check_constraint values (200,'text2'); INSERT into col_check_constraint values (200,'text2');
INSERT into col_check_constraint values (300,'text3'); INSERT into col_check_constraint values (300,'text3');
--Set Returning Functions
create function srf_vect() returns void as $proc$
<<lbl>>declare a integer; b varchar; c varchar; r record;
begin
-- fori
for i in 1 .. 3 loop
raise notice '%', i;
end loop;
-- fore with record var
for r in select gs as aa, 'BB' as bb, 'CC' as cc from generate_series(1,4) gs loop
raise notice '% % %', r.aa, r.bb, r.cc;
end loop;
-- fore with single scalar
for a in select gs from generate_series(1,4) gs loop
raise notice '%', a;
end loop;
-- fore with multiple scalars
for a,b,c in select gs, 'BB','CC' from generate_series(1,4) gs loop
raise notice '% % %', a, b, c;
end loop;
-- using qualified names in fors, fore is enabled, disabled only for fori
for lbl.a, lbl.b, lbl.c in execute $$select gs, 'bb','cc' from generate_series(1,4) gs$$ loop
raise notice '% % %', a, b, c;
end loop;
end;
$proc$ language plpgsql;
select srf_vect();
NOTICE: 1
NOTICE: 2
NOTICE: 3
NOTICE: 1 BB CC
NOTICE: 2 BB CC
NOTICE: 3 BB CC
NOTICE: 4 BB CC
NOTICE: 1
NOTICE: 2
NOTICE: 3
NOTICE: 4
NOTICE: 1 BB CC
NOTICE: 2 BB CC
NOTICE: 3 BB CC
NOTICE: 4 BB CC
NOTICE: 1 bb cc
NOTICE: 2 bb cc
NOTICE: 3 bb cc
NOTICE: 4 bb cc
srf_vect
----------
(1 row)
-- start_ignore -- start_ignore
drop role "ISO"; drop role "ISO";
drop role "geography"; drop role "geography";
......
...@@ -3203,35 +3203,6 @@ INSERT into col_check_constraint values (100,'text1'); ...@@ -3203,35 +3203,6 @@ INSERT into col_check_constraint values (100,'text1');
INSERT into col_check_constraint values (200,'text2'); INSERT into col_check_constraint values (200,'text2');
INSERT into col_check_constraint values (300,'text3'); INSERT into col_check_constraint values (300,'text3');
--Set Returning Functions
create function srf_vect() returns void as $proc$
<<lbl>>declare a integer; b varchar; c varchar; r record;
begin
-- fori
for i in 1 .. 3 loop
raise notice '%', i;
end loop;
-- fore with record var
for r in select gs as aa, 'BB' as bb, 'CC' as cc from generate_series(1,4) gs loop
raise notice '% % %', r.aa, r.bb, r.cc;
end loop;
-- fore with single scalar
for a in select gs from generate_series(1,4) gs loop
raise notice '%', a;
end loop;
-- fore with multiple scalars
for a,b,c in select gs, 'BB','CC' from generate_series(1,4) gs loop
raise notice '% % %', a, b, c;
end loop;
-- using qualified names in fors, fore is enabled, disabled only for fori
for lbl.a, lbl.b, lbl.c in execute $$select gs, 'bb','cc' from generate_series(1,4) gs$$ loop
raise notice '% % %', a, b, c;
end loop;
end;
$proc$ language plpgsql;
select srf_vect();
-- start_ignore -- start_ignore
drop role "ISO"; drop role "ISO";
drop role "geography"; drop role "geography";
......
此差异已折叠。
...@@ -119,16 +119,12 @@ test: select_views portals_p2 cluster dependency guc tsearch tsdicts json ...@@ -119,16 +119,12 @@ test: select_views portals_p2 cluster dependency guc tsearch tsdicts json
# ---------- # ----------
# Another group of parallel tests # Another group of parallel tests
# ---------- # ----------
# "plpgsql" cannot run concurrently with "rules" # "plpgsql" cannot run concurrently with "rules", nor can "plancache"
test: plancache limit copy2 temp domain rangefuncs prepare without_oid conversion truncate alter_table sequence polymorphism rowtypes xml test: plancache limit plpgsql copy2 temp domain rangefuncs prepare without_oid conversion truncate alter_table sequence polymorphism rowtypes xml
# GPDB_83_MERGE_FIXME: the largeobject test is temporarily disabled due to test errors # GPDB_83_MERGE_FIXME: the largeobject test is temporarily disabled due to test errors
# test: largeobject # test: largeobject
# 'plpgsql' test is disabled in GPDB, because it produces a lot of errors on
# because of cross-segment accesses in functions.
#test: plpgsql
# INSERT RETURNING is not supported by GPDB # INSERT RETURNING is not supported by GPDB
#test: returning #test: returning
......
...@@ -99,7 +99,7 @@ test: tsearch ...@@ -99,7 +99,7 @@ test: tsearch
test: plancache test: plancache
test: json test: json
test: limit test: limit
ignore: plpgsql test: plpgsql
test: copy2 test: copy2
test: temp test: temp
test: domain test: domain
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
-- you look behind the wall when looking at a patchfield -- you look behind the wall when looking at a patchfield
-- or into a room. -- or into a room.
-- --
set log_statement='all';
create table Room ( create table Room (
roomno char(8), roomno char(8),
...@@ -134,7 +134,7 @@ begin ...@@ -134,7 +134,7 @@ begin
end if; end if;
return new; return new;
end; end;
' language plpgsql MODIFIES SQL DATA; ' language plpgsql;
create trigger tg_room_au after update create trigger tg_room_au after update
on Room for each row execute procedure tg_room_au(); on Room for each row execute procedure tg_room_au();
...@@ -149,7 +149,7 @@ begin ...@@ -149,7 +149,7 @@ begin
delete from WSlot where roomno = old.roomno; delete from WSlot where roomno = old.roomno;
return old; return old;
end; end;
' language plpgsql MODIFIES SQL DATA; ' language plpgsql;
create trigger tg_room_ad after delete create trigger tg_room_ad after delete
on Room for each row execute procedure tg_room_ad(); on Room for each row execute procedure tg_room_ad();
...@@ -166,7 +166,7 @@ begin ...@@ -166,7 +166,7 @@ begin
end if; end if;
return new; return new;
end; end;
$$ language plpgsql READS SQL DATA; $$ language plpgsql;
create trigger tg_wslot_biu before insert or update create trigger tg_wslot_biu before insert or update
on WSlot for each row execute procedure tg_wslot_biu(); on WSlot for each row execute procedure tg_wslot_biu();
...@@ -183,7 +183,7 @@ begin ...@@ -183,7 +183,7 @@ begin
end if; end if;
return new; return new;
end; end;
' language plpgsql MODIFIES SQL DATA; ' language plpgsql;
create trigger tg_pfield_au after update create trigger tg_pfield_au after update
on PField for each row execute procedure tg_pfield_au(); on PField for each row execute procedure tg_pfield_au();
...@@ -198,7 +198,7 @@ begin ...@@ -198,7 +198,7 @@ begin
delete from PSlot where pfname = old.name; delete from PSlot where pfname = old.name;
return old; return old;
end; end;
' language plpgsql MODIFIES SQL DATA; ' language plpgsql;
create trigger tg_pfield_ad after delete create trigger tg_pfield_ad after delete
on PField for each row execute procedure tg_pfield_ad(); on PField for each row execute procedure tg_pfield_ad();
...@@ -219,7 +219,7 @@ begin ...@@ -219,7 +219,7 @@ begin
end if; end if;
return ps; return ps;
end; end;
$proc$ language plpgsql READS SQL DATA; $proc$ language plpgsql;
create trigger tg_pslot_biu before insert or update create trigger tg_pslot_biu before insert or update
on PSlot for each row execute procedure tg_pslot_biu(); on PSlot for each row execute procedure tg_pslot_biu();
...@@ -236,7 +236,7 @@ begin ...@@ -236,7 +236,7 @@ begin
end if; end if;
return new; return new;
end; end;
' language plpgsql MODIFIES SQL DATA; ' language plpgsql;
create trigger tg_system_au after update create trigger tg_system_au after update
on System for each row execute procedure tg_system_au(); on System for each row execute procedure tg_system_au();
...@@ -264,7 +264,7 @@ begin ...@@ -264,7 +264,7 @@ begin
new.slotname := sname; new.slotname := sname;
return new; return new;
end; end;
$$ language plpgsql READS SQL DATA; $$ language plpgsql;
create trigger tg_iface_biu before insert or update create trigger tg_iface_biu before insert or update
on IFace for each row execute procedure tg_iface_biu(); on IFace for each row execute procedure tg_iface_biu();
...@@ -295,7 +295,7 @@ begin ...@@ -295,7 +295,7 @@ begin
return old; return old;
end if; end if;
end; end;
' language plpgsql MODIFIES SQL DATA; ' language plpgsql;
create trigger tg_hub_a after insert or update or delete create trigger tg_hub_a after insert or update or delete
on Hub for each row execute procedure tg_hub_a(); on Hub for each row execute procedure tg_hub_a();
...@@ -322,7 +322,7 @@ begin ...@@ -322,7 +322,7 @@ begin
end loop; end loop;
return 0; return 0;
end end
' language plpgsql MODIFIES SQL DATA; ' language plpgsql;
-- Test comments -- Test comments
COMMENT ON FUNCTION tg_hub_adjustslots_wrong(bpchar, integer, integer) IS 'function with args'; COMMENT ON FUNCTION tg_hub_adjustslots_wrong(bpchar, integer, integer) IS 'function with args';
...@@ -363,7 +363,7 @@ begin ...@@ -363,7 +363,7 @@ begin
new.slotname := sname; new.slotname := sname;
return new; return new;
end; end;
' language plpgsql READS SQL DATA; ' language plpgsql;
create trigger tg_hslot_biu before insert or update create trigger tg_hslot_biu before insert or update
on HSlot for each row execute procedure tg_hslot_biu(); on HSlot for each row execute procedure tg_hslot_biu();
...@@ -386,7 +386,7 @@ begin ...@@ -386,7 +386,7 @@ begin
end if; end if;
raise exception ''no manual manipulation of HSlot''; raise exception ''no manual manipulation of HSlot'';
end; end;
' language plpgsql READS SQL DATA; ' language plpgsql;
create trigger tg_hslot_bd before delete create trigger tg_hslot_bd before delete
on HSlot for each row execute procedure tg_hslot_bd(); on HSlot for each row execute procedure tg_hslot_bd();
...@@ -403,7 +403,7 @@ begin ...@@ -403,7 +403,7 @@ begin
end if; end if;
return new; return new;
end; end;
' language plpgsql NO SQL; ' language plpgsql;
create trigger tg_chkslotname before insert create trigger tg_chkslotname before insert
on PSlot for each row execute procedure tg_chkslotname('PS'); on PSlot for each row execute procedure tg_chkslotname('PS');
...@@ -432,7 +432,7 @@ begin ...@@ -432,7 +432,7 @@ begin
end if; end if;
return new; return new;
end; end;
' language plpgsql NO SQL; ' language plpgsql;
create trigger tg_chkslotlink before insert or update create trigger tg_chkslotlink before insert or update
on PSlot for each row execute procedure tg_chkslotlink(); on PSlot for each row execute procedure tg_chkslotlink();
...@@ -461,7 +461,7 @@ begin ...@@ -461,7 +461,7 @@ begin
end if; end if;
return new; return new;
end; end;
' language plpgsql NO SQL; ' language plpgsql;
create trigger tg_chkbacklink before insert or update create trigger tg_chkbacklink before insert or update
on PSlot for each row execute procedure tg_chkbacklink(); on PSlot for each row execute procedure tg_chkbacklink();
...@@ -496,7 +496,7 @@ begin ...@@ -496,7 +496,7 @@ begin
end if; end if;
return new; return new;
end; end;
' language plpgsql MODIFIES SQL DATA; ' language plpgsql;
create trigger tg_pslot_bu before update create trigger tg_pslot_bu before update
on PSlot for each row execute procedure tg_pslot_bu(); on PSlot for each row execute procedure tg_pslot_bu();
...@@ -525,7 +525,7 @@ begin ...@@ -525,7 +525,7 @@ begin
end if; end if;
return new; return new;
end; end;
' language plpgsql MODIFIES SQL DATA; ' language plpgsql;
create trigger tg_wslot_bu before update create trigger tg_wslot_bu before update
on WSlot for each row execute procedure tg_Wslot_bu(); on WSlot for each row execute procedure tg_Wslot_bu();
...@@ -554,7 +554,7 @@ begin ...@@ -554,7 +554,7 @@ begin
end if; end if;
return new; return new;
end; end;
' language plpgsql MODIFIES SQL DATA; ' language plpgsql;
create trigger tg_pline_bu before update create trigger tg_pline_bu before update
on PLine for each row execute procedure tg_pline_bu(); on PLine for each row execute procedure tg_pline_bu();
...@@ -583,7 +583,7 @@ begin ...@@ -583,7 +583,7 @@ begin
end if; end if;
return new; return new;
end; end;
' language plpgsql MODIFIES SQL DATA; ' language plpgsql;
create trigger tg_iface_bu before update create trigger tg_iface_bu before update
on IFace for each row execute procedure tg_iface_bu(); on IFace for each row execute procedure tg_iface_bu();
...@@ -612,7 +612,7 @@ begin ...@@ -612,7 +612,7 @@ begin
end if; end if;
return new; return new;
end; end;
' language plpgsql MODIFIES SQL DATA; ' language plpgsql;
create trigger tg_hslot_bu before update create trigger tg_hslot_bu before update
on HSlot for each row execute procedure tg_hslot_bu(); on HSlot for each row execute procedure tg_hslot_bu();
...@@ -639,7 +639,7 @@ begin ...@@ -639,7 +639,7 @@ begin
end if; end if;
return new; return new;
end; end;
' language plpgsql MODIFIES SQL DATA; ' language plpgsql;
create trigger tg_phone_bu before update create trigger tg_phone_bu before update
on PHone for each row execute procedure tg_phone_bu(); on PHone for each row execute procedure tg_phone_bu();
...@@ -681,7 +681,7 @@ begin ...@@ -681,7 +681,7 @@ begin
return old; return old;
end if; end if;
end; end;
' language plpgsql NO SQL; ' language plpgsql;
create trigger tg_backlink_a after insert or update or delete create trigger tg_backlink_a after insert or update or delete
...@@ -747,7 +747,7 @@ begin ...@@ -747,7 +747,7 @@ begin
end if; end if;
raise exception ''illegal backlink beginning with %'', mytype; raise exception ''illegal backlink beginning with %'', mytype;
end; end;
' language plpgsql MODIFIES SQL DATA; ' language plpgsql;
-- ************************************************************ -- ************************************************************
...@@ -794,7 +794,7 @@ begin ...@@ -794,7 +794,7 @@ begin
return 0; return 0;
end if; end if;
end end
' language plpgsql MODIFIES SQL DATA; ' language plpgsql;
-- ************************************************************ -- ************************************************************
...@@ -833,7 +833,7 @@ begin ...@@ -833,7 +833,7 @@ begin
return old; return old;
end if; end if;
end; end;
' language plpgsql NO SQL; ' language plpgsql;
create trigger tg_slotlink_a after insert or update or delete create trigger tg_slotlink_a after insert or update or delete
...@@ -935,7 +935,7 @@ begin ...@@ -935,7 +935,7 @@ begin
end if; end if;
raise exception ''illegal slotlink beginning with %'', mytype; raise exception ''illegal slotlink beginning with %'', mytype;
end; end;
' language plpgsql MODIFIES SQL DATA; ' language plpgsql;
-- ************************************************************ -- ************************************************************
...@@ -1002,7 +1002,7 @@ begin ...@@ -1002,7 +1002,7 @@ begin
return 0; return 0;
end if; end if;
end; end;
' language plpgsql MODIFIES SQL DATA; ' language plpgsql;
-- ************************************************************ -- ************************************************************
...@@ -1047,7 +1047,7 @@ begin ...@@ -1047,7 +1047,7 @@ begin
end if; end if;
return rec.backlink; return rec.backlink;
end; end;
' language plpgsql READS SQL DATA; ' language plpgsql;
-- ************************************************************ -- ************************************************************
...@@ -1083,7 +1083,7 @@ begin ...@@ -1083,7 +1083,7 @@ begin
end if; end if;
return psrec.slotlink; return psrec.slotlink;
end; end;
' language plpgsql READS SQL DATA; ' language plpgsql;
-- ************************************************************ -- ************************************************************
...@@ -1133,7 +1133,7 @@ begin ...@@ -1133,7 +1133,7 @@ begin
end if; end if;
return rec.slotlink; return rec.slotlink;
end; end;
' language plpgsql READS SQL DATA; ' language plpgsql;
...@@ -1437,7 +1437,7 @@ BEGIN ...@@ -1437,7 +1437,7 @@ BEGIN
rslt = CAST($1 AS TEXT) || '','' || recursion_test($1 - 1, $2); rslt = CAST($1 AS TEXT) || '','' || recursion_test($1 - 1, $2);
END IF; END IF;
RETURN rslt; RETURN rslt;
END;' LANGUAGE plpgsql NO SQL; END;' LANGUAGE plpgsql;
SELECT recursion_test(4,3); SELECT recursion_test(4,3);
...@@ -1480,7 +1480,7 @@ create function test_found() ...@@ -1480,7 +1480,7 @@ create function test_found()
insert into found_test_tbl values (6); insert into found_test_tbl values (6);
end if; end if;
return true; return true;
end;' language plpgsql MODIFIES SQL DATA; end;' language plpgsql;
select test_found(); select test_found();
select * from found_test_tbl; select * from found_test_tbl;
...@@ -1497,7 +1497,7 @@ BEGIN ...@@ -1497,7 +1497,7 @@ BEGIN
RETURN NEXT rec; RETURN NEXT rec;
END LOOP; END LOOP;
RETURN; RETURN;
END;' language plpgsql READS SQL DATA; END;' language plpgsql;
select * from test_table_func_rec(); select * from test_table_func_rec();
...@@ -1509,7 +1509,7 @@ BEGIN ...@@ -1509,7 +1509,7 @@ BEGIN
RETURN NEXT row; RETURN NEXT row;
END LOOP; END LOOP;
RETURN; RETURN;
END;' language plpgsql READS SQL DATA; END;' language plpgsql;
select * from test_table_func_row(); select * from test_table_func_row();
...@@ -1521,7 +1521,7 @@ BEGIN ...@@ -1521,7 +1521,7 @@ BEGIN
RETURN NEXT i + 1; RETURN NEXT i + 1;
END LOOP; END LOOP;
RETURN; RETURN;
END;' language plpgsql NO SQL; END;' language plpgsql;
select * from test_ret_set_scalar(1,10); select * from test_ret_set_scalar(1,10);
...@@ -1539,7 +1539,7 @@ BEGIN ...@@ -1539,7 +1539,7 @@ BEGIN
RETURN NEXT retval; RETURN NEXT retval;
END IF; END IF;
RETURN; RETURN;
END;' language plpgsql CONTAINS SQL; END;' language plpgsql;
SELECT * FROM test_ret_set_rec_dyn(1500) AS (a int, b int, c int); SELECT * FROM test_ret_set_rec_dyn(1500) AS (a int, b int, c int);
SELECT * FROM test_ret_set_rec_dyn(5) AS (a int, b numeric, c text); SELECT * FROM test_ret_set_rec_dyn(5) AS (a int, b numeric, c text);
...@@ -1555,7 +1555,7 @@ BEGIN ...@@ -1555,7 +1555,7 @@ BEGIN
SELECT INTO retval 50, 5::numeric, ''xxx''::text; SELECT INTO retval 50, 5::numeric, ''xxx''::text;
RETURN retval; RETURN retval;
END IF; END IF;
END;' language plpgsql CONTAINS SQL; END;' language plpgsql;
SELECT * FROM test_ret_rec_dyn(1500) AS (a int, b int, c int); SELECT * FROM test_ret_rec_dyn(1500) AS (a int, b int, c int);
SELECT * FROM test_ret_rec_dyn(5) AS (a int, b numeric, c text); SELECT * FROM test_ret_rec_dyn(5) AS (a int, b numeric, c text);
...@@ -1569,7 +1569,7 @@ SELECT * FROM test_ret_rec_dyn(5) AS (a int, b numeric, c text); ...@@ -1569,7 +1569,7 @@ SELECT * FROM test_ret_rec_dyn(5) AS (a int, b numeric, c text);
create function f1(in i int, out j int) returns int as $$ create function f1(in i int, out j int) returns int as $$
begin begin
return i+1; return i+1;
end$$ language plpgsql NO SQL; end$$ language plpgsql;
create function f1(in i int, out j int) as $$ create function f1(in i int, out j int) as $$
begin begin
...@@ -1597,7 +1597,7 @@ begin ...@@ -1597,7 +1597,7 @@ begin
j := i+2; j := i+2;
return next; return next;
return; return;
end$$ language plpgsql NO SQL; end$$ language plpgsql;
select * from f1(42); select * from f1(42);
...@@ -1623,7 +1623,7 @@ begin ...@@ -1623,7 +1623,7 @@ begin
j := j+1; j := j+1;
k := 'foot'; k := 'foot';
return next; return next;
end$$ language plpgsql NO SQL; end$$ language plpgsql;
select * from f1(42); select * from f1(42);
...@@ -1658,7 +1658,7 @@ BEGIN ...@@ -1658,7 +1658,7 @@ BEGIN
ELSE ELSE
RETURN FALSE; RETURN FALSE;
END IF; END IF;
END;' language plpgsql MODIFIES SQL DATA; END;' language plpgsql;
create function perform_test_func() returns void as ' create function perform_test_func() returns void as '
BEGIN BEGIN
...@@ -1679,7 +1679,7 @@ BEGIN ...@@ -1679,7 +1679,7 @@ BEGIN
END IF; END IF;
RETURN; RETURN;
END;' language plpgsql MODIFIES SQL DATA; END;' language plpgsql;
SELECT perform_test_func(); SELECT perform_test_func();
SELECT * FROM perform_test; SELECT * FROM perform_test;
...@@ -1712,7 +1712,7 @@ begin ...@@ -1712,7 +1712,7 @@ begin
x := -2; x := -2;
end; end;
return x; return x;
end$$ language plpgsql NO SQL; end$$ language plpgsql;
select trap_zero_divide(50); select trap_zero_divide(50);
select trap_zero_divide(0); select trap_zero_divide(0);
...@@ -1738,7 +1738,7 @@ begin ...@@ -1738,7 +1738,7 @@ begin
x := -2; x := -2;
end; end;
return x; return x;
end$$ language plpgsql CONTAINS SQL; end$$ language plpgsql;
select trap_matching_test(50); select trap_matching_test(50);
select trap_matching_test(0); select trap_matching_test(0);
...@@ -1767,7 +1767,7 @@ begin ...@@ -1767,7 +1767,7 @@ begin
end; end;
insert into foo values(x); insert into foo values(x);
return x; return x;
end$$ language plpgsql MODIFIES SQL DATA; end$$ language plpgsql;
set statement_timeout to 2000; set statement_timeout to 2000;
...@@ -1793,7 +1793,7 @@ begin ...@@ -1793,7 +1793,7 @@ begin
x := x || '9012'; x := x || '9012';
end; end;
return x; return x;
end$$ language plpgsql NO SQL; end$$ language plpgsql;
select test_variable_storage(); select test_variable_storage();
...@@ -1819,7 +1819,7 @@ begin ...@@ -1819,7 +1819,7 @@ begin
return 0; return 0;
end; end;
return 1; return 1;
end$$ language plpgsql MODIFIES SQL DATA; end$$ language plpgsql;
create function trap_foreign_key_2() returns int as $$ create function trap_foreign_key_2() returns int as $$
begin begin
...@@ -1831,7 +1831,7 @@ begin ...@@ -1831,7 +1831,7 @@ begin
return 0; return 0;
end; end;
return 1; return 1;
end$$ language plpgsql NO SQL; end$$ language plpgsql;
select trap_foreign_key(1); select trap_foreign_key(1);
select trap_foreign_key(2); -- detects FK violation select trap_foreign_key(2); -- detects FK violation
...@@ -1860,7 +1860,7 @@ begin ...@@ -1860,7 +1860,7 @@ begin
select into x id from users where login = a_login; select into x id from users where login = a_login;
if found then return x; end if; if found then return x; end if;
return 0; return 0;
end$$ language plpgsql stable READS SQL DATA; end$$ language plpgsql stable;
insert into users values('user1'); insert into users values('user1');
...@@ -1880,7 +1880,7 @@ begin ...@@ -1880,7 +1880,7 @@ begin
RETURN -2; -- error code for insertion failure RETURN -2; -- error code for insertion failure
END IF; END IF;
RETURN my_id_user; RETURN my_id_user;
end$$ language plpgsql MODIFIES SQL DATA; end$$ language plpgsql;
select sp_add_user('user1'); select sp_add_user('user1');
select sp_add_user('user2'); select sp_add_user('user2');
...@@ -1903,25 +1903,25 @@ copy rc_test from stdin; ...@@ -1903,25 +1903,25 @@ copy rc_test from stdin;
create function return_refcursor(rc refcursor) returns refcursor as $$ create function return_refcursor(rc refcursor) returns refcursor as $$
begin begin
open rc for select a from rc_test; open rc for select a from rc_test order by a;
return rc; return rc;
end end
$$ language plpgsql READS SQL DATA; $$ language plpgsql;
create function refcursor_test1(refcursor) returns refcursor as $$ create function refcursor_test1(refcursor) returns refcursor as $$
begin begin
perform return_refcursor($1); perform return_refcursor($1);
return $1; return $1;
end end
$$ language plpgsql CONTAINS SQL; $$ language plpgsql;
begin; begin;
select refcursor_test1('test1'); select refcursor_test1('test1');
fetch next in test1; fetch next in test1;
--select refcursor_test1('test2'); select refcursor_test1('test2');
--fetch all from test2; fetch all from test2;
commit; commit;
...@@ -1942,10 +1942,10 @@ begin ...@@ -1942,10 +1942,10 @@ begin
return false; return false;
end if; end if;
end end
$$ language plpgsql READS SQL DATA; $$ language plpgsql;
--select refcursor_test2(20000, 20000) as "Should be false", select refcursor_test2(20000, 20000) as "Should be false",
-- refcursor_test2(20, 20) as "Should be true"; refcursor_test2(20, 20) as "Should be true";
-- --
-- tests for "raise" processing -- tests for "raise" processing
...@@ -1955,7 +1955,7 @@ begin ...@@ -1955,7 +1955,7 @@ begin
raise notice 'This message has too many parameters!', $1; raise notice 'This message has too many parameters!', $1;
return $1; return $1;
end; end;
$$ language plpgsql NO SQL; $$ language plpgsql;
select raise_test1(5); select raise_test1(5);
...@@ -1964,7 +1964,7 @@ begin ...@@ -1964,7 +1964,7 @@ begin
raise notice 'This message has too few parameters: %, %, %', $1, $1; raise notice 'This message has too few parameters: %, %, %', $1, $1;
return $1; return $1;
end; end;
$$ language plpgsql NO SQL; $$ language plpgsql;
select raise_test2(10); select raise_test2(10);
...@@ -1979,7 +1979,7 @@ begin ...@@ -1979,7 +1979,7 @@ begin
Johnny Yuma; Johnny Yuma;
a := 10; a := 10;
return a; return a;
end$$ language plpgsql NO SQL; end$$ language plpgsql;
create function bad_sql2() returns int as $$ create function bad_sql2() returns int as $$
declare r record; declare r record;
...@@ -1988,25 +1988,25 @@ begin ...@@ -1988,25 +1988,25 @@ begin
raise notice 'in loop'; raise notice 'in loop';
end loop; end loop;
return 5; return 5;
end;$$ language plpgsql NO SQL; end;$$ language plpgsql;
-- a RETURN expression is mandatory, except for void-returning -- a RETURN expression is mandatory, except for void-returning
-- functions, where it is not allowed -- functions, where it is not allowed
create function missing_return_expr() returns int as $$ create function missing_return_expr() returns int as $$
begin begin
return ; return ;
end;$$ language plpgsql NO SQL; end;$$ language plpgsql;
create function void_return_expr() returns void as $$ create function void_return_expr() returns void as $$
begin begin
return 5; return 5;
end;$$ language plpgsql NO SQL; end;$$ language plpgsql;
-- VOID functions are allowed to omit RETURN -- VOID functions are allowed to omit RETURN
create function void_return_expr() returns void as $$ create function void_return_expr() returns void as $$
begin begin
perform 2+2; perform 2+2;
end;$$ language plpgsql NO SQL; end;$$ language plpgsql;
select void_return_expr(); select void_return_expr();
...@@ -2014,7 +2014,7 @@ select void_return_expr(); ...@@ -2014,7 +2014,7 @@ select void_return_expr();
create function missing_return_expr() returns int as $$ create function missing_return_expr() returns int as $$
begin begin
perform 2+2; perform 2+2;
end;$$ language plpgsql NO SQL; end;$$ language plpgsql;
select missing_return_expr(); select missing_return_expr();
...@@ -2046,7 +2046,7 @@ begin ...@@ -2046,7 +2046,7 @@ begin
raise notice '% % %', i, j, k; raise notice '% % %', i, j, k;
execute 'select 1,2' into _v; execute 'select 1,2' into _v;
return _v; return _v;
end; $$ language plpgsql MODIFIES SQL DATA; end; $$ language plpgsql;
select execute_into_test('eifoo'); select execute_into_test('eifoo');
...@@ -2060,7 +2060,7 @@ drop type eitype cascade; ...@@ -2060,7 +2060,7 @@ drop type eitype cascade;
create function excpt_test1() returns void as $$ create function excpt_test1() returns void as $$
begin begin
raise notice '% %', sqlstate, sqlerrm; raise notice '% %', sqlstate, sqlerrm;
end; $$ language plpgsql NO SQL; end; $$ language plpgsql;
-- should fail: SQLSTATE and SQLERRM are only in defined EXCEPTION -- should fail: SQLSTATE and SQLERRM are only in defined EXCEPTION
-- blocks -- blocks
select excpt_test1(); select excpt_test1();
...@@ -2072,7 +2072,7 @@ begin ...@@ -2072,7 +2072,7 @@ begin
raise notice '% %', sqlstate, sqlerrm; raise notice '% %', sqlstate, sqlerrm;
end; end;
end; end;
end; $$ language plpgsql NO SQL; end; $$ language plpgsql;
-- should fail -- should fail
select excpt_test2(); select excpt_test2();
...@@ -2094,7 +2094,7 @@ begin ...@@ -2094,7 +2094,7 @@ begin
end; end;
raise notice '% %', sqlstate, sqlerrm; raise notice '% %', sqlstate, sqlerrm;
end; end;
end; $$ language plpgsql NO SQL; end; $$ language plpgsql;
select excpt_test3(); select excpt_test3();
drop function excpt_test1(); drop function excpt_test1();
...@@ -2110,7 +2110,7 @@ declare ...@@ -2110,7 +2110,7 @@ declare
begin begin
i := 2; i := 2;
raise notice '%; %; %; %; %; %', a, a[i], c, (select c || 'abc'), row(10,'aaa',NULL,30), NULL; raise notice '%; %; %; %; %; %', a, a[i], c, (select c || 'abc'), row(10,'aaa',NULL,30), NULL;
end;$$ language plpgsql CONTAINS SQL; end;$$ language plpgsql;
select raise_exprs(); select raise_exprs();
drop function raise_exprs(); drop function raise_exprs();
...@@ -2198,7 +2198,7 @@ begin ...@@ -2198,7 +2198,7 @@ begin
raise notice '%', _r.v; raise notice '%', _r.v;
continue; continue;
end loop; end loop;
end; $$ language plpgsql READS SQL DATA; end; $$ language plpgsql;
select continue_test1(); select continue_test1();
...@@ -2210,7 +2210,7 @@ begin ...@@ -2210,7 +2210,7 @@ begin
end; end;
return; return;
end; end;
$$ language plpgsql NO SQL; $$ language plpgsql;
-- should fail -- should fail
select continue_test2(); select continue_test2();
...@@ -2225,7 +2225,7 @@ begin ...@@ -2225,7 +2225,7 @@ begin
end loop; end loop;
end; end;
end; end;
$$ language plpgsql NO SQL; $$ language plpgsql;
-- should fail -- should fail
select continue_test3(); select continue_test3();
...@@ -2248,7 +2248,7 @@ begin ...@@ -2248,7 +2248,7 @@ begin
exit flbl2; exit flbl2;
end loop; end loop;
end blbl; end blbl;
$$ language plpgsql NO SQL; $$ language plpgsql;
select end_label1(); select end_label1();
drop function end_label1(); drop function end_label1();
...@@ -2260,7 +2260,7 @@ begin ...@@ -2260,7 +2260,7 @@ begin
exit; exit;
end loop flbl1; end loop flbl1;
end; end;
$$ language plpgsql NO SQL; $$ language plpgsql;
-- should fail: end label does not match start label -- should fail: end label does not match start label
create function end_label3() returns void as $$ create function end_label3() returns void as $$
...@@ -2271,7 +2271,7 @@ begin ...@@ -2271,7 +2271,7 @@ begin
exit; exit;
end loop outer_label; end loop outer_label;
end; end;
$$ language plpgsql NO SQL; $$ language plpgsql;
-- should fail: end label on a block without a start label -- should fail: end label on a block without a start label
create function end_label4() returns void as $$ create function end_label4() returns void as $$
...@@ -2281,7 +2281,7 @@ begin ...@@ -2281,7 +2281,7 @@ begin
exit; exit;
end loop outer_label; end loop outer_label;
end; end;
$$ language plpgsql NO SQL; $$ language plpgsql;
-- using list of scalars in fori and fore stmts -- using list of scalars in fori and fore stmts
create function for_vect() returns void as $proc$ create function for_vect() returns void as $proc$
...@@ -2308,7 +2308,7 @@ begin ...@@ -2308,7 +2308,7 @@ begin
raise notice '% % %', a, b, c; raise notice '% % %', a, b, c;
end loop; end loop;
end; end;
$proc$ language plpgsql CONTAINS SQL; $proc$ language plpgsql;
select for_vect(); select for_vect();
...@@ -2323,7 +2323,7 @@ declare ...@@ -2323,7 +2323,7 @@ declare
begin begin
select into x,y unique1/p1, unique1/$1 from tenk1 group by unique1/p1; select into x,y unique1/p1, unique1/$1 from tenk1 group by unique1/p1;
return x = y; return x = y;
end$$ language plpgsql READS SQL DATA; end$$ language plpgsql;
select multi_datum_use(42); select multi_datum_use(42);
...@@ -2343,7 +2343,7 @@ begin ...@@ -2343,7 +2343,7 @@ begin
-- should work -- should work
insert into foo values(5,6) returning * into x; insert into foo values(5,6) returning * into x;
raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2;
end$$ language plpgsql MODIFIES SQL DATA; end$$ language plpgsql;
select footest(); select footest();
...@@ -2353,7 +2353,7 @@ begin ...@@ -2353,7 +2353,7 @@ begin
-- should fail due to implicit strict -- should fail due to implicit strict
insert into foo values(7,8),(9,10) returning * into x; insert into foo values(7,8),(9,10) returning * into x;
raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2;
end$$ language plpgsql MODIFIES SQL DATA; end$$ language plpgsql;
select footest(); select footest();
...@@ -2363,7 +2363,7 @@ begin ...@@ -2363,7 +2363,7 @@ begin
-- should work -- should work
execute 'insert into foo values(5,6) returning *' into x; execute 'insert into foo values(5,6) returning *' into x;
raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2;
end$$ language plpgsql MODIFIES SQL DATA; end$$ language plpgsql;
select footest(); select footest();
...@@ -2373,7 +2373,7 @@ begin ...@@ -2373,7 +2373,7 @@ begin
-- this should work since EXECUTE isn't as picky -- this should work since EXECUTE isn't as picky
execute 'insert into foo values(7,8),(9,10) returning *' into x; execute 'insert into foo values(7,8),(9,10) returning *' into x;
raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2;
end$$ language plpgsql MODIFIES SQL DATA; end$$ language plpgsql;
select footest(); select footest();
...@@ -2385,7 +2385,7 @@ begin ...@@ -2385,7 +2385,7 @@ begin
-- should work -- should work
select * from foo where f1 = 3 into strict x; select * from foo where f1 = 3 into strict x;
raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2;
end$$ language plpgsql READS SQL DATA; end$$ language plpgsql;
select footest(); select footest();
...@@ -2395,7 +2395,7 @@ begin ...@@ -2395,7 +2395,7 @@ begin
-- should fail, no rows -- should fail, no rows
select * from foo where f1 = 0 into strict x; select * from foo where f1 = 0 into strict x;
raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2;
end$$ language plpgsql READS SQL DATA; end$$ language plpgsql;
select footest(); select footest();
...@@ -2405,7 +2405,7 @@ begin ...@@ -2405,7 +2405,7 @@ begin
-- should fail, too many rows -- should fail, too many rows
select * from foo where f1 > 3 into strict x; select * from foo where f1 > 3 into strict x;
raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2;
end$$ language plpgsql READS SQL DATA; end$$ language plpgsql;
select footest(); select footest();
...@@ -2415,7 +2415,7 @@ begin ...@@ -2415,7 +2415,7 @@ begin
-- should work -- should work
execute 'select * from foo where f1 = 3' into strict x; execute 'select * from foo where f1 = 3' into strict x;
raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2;
end$$ language plpgsql READS SQL DATA; end$$ language plpgsql;
select footest(); select footest();
...@@ -2425,7 +2425,7 @@ begin ...@@ -2425,7 +2425,7 @@ begin
-- should fail, no rows -- should fail, no rows
execute 'select * from foo where f1 = 0' into strict x; execute 'select * from foo where f1 = 0' into strict x;
raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2;
end$$ language plpgsql READS SQL DATA; end$$ language plpgsql;
select footest(); select footest();
...@@ -2435,7 +2435,7 @@ begin ...@@ -2435,7 +2435,7 @@ begin
-- should fail, too many rows -- should fail, too many rows
execute 'select * from foo where f1 > 3' into strict x; execute 'select * from foo where f1 > 3' into strict x;
raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2; raise notice 'x.f1 = %, x.f2 = %', x.f1, x.f2;
end$$ language plpgsql READS SQL DATA; end$$ language plpgsql;
select footest(); select footest();
...@@ -2706,27 +2706,3 @@ begin ...@@ -2706,27 +2706,3 @@ begin
end loop; end loop;
end; end;
$outer$; $outer$;
-- tests for RETURN QUERY
create function ret_query1(out int, out int) returns setof record as $$
begin
$1 := -1;
$2 := -2;
return next;
return query select x + 1, x * 10 from generate_series(0, 10) s (x);
return next;
end;
$$ language plpgsql;
select * from ret_query1();
create type record_type as (x text, y int, z boolean);
create or replace function ret_query2(lim int) returns setof record_type as $$
begin
return query select md5(s.x::text), s.x, s.x > 0
from generate_series(-8, lim) s (x) where s.x % 2 = 0;
end;
$$ language plpgsql;
select * from ret_query2(8);
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册