diff --git a/contrib/plpgsql/test/README b/contrib/plpgsql/test/README
deleted file mode 100644
index 2cbe21ebd393461980c74722b1fa386beb05ecf2..0000000000000000000000000000000000000000
--- a/contrib/plpgsql/test/README
+++ /dev/null
@@ -1,22 +0,0 @@
-Test suite for PL/pgSQL
-
-Scenario:
-
-    A building with a modern TP cabel installation where any
-    of the wall connectors can be used to plug in phones,
-    ethernet interfaces or local office hubs. The backside
-    of the wall connectors is wired to one of several patch-
-    fields in the building.
-
-    In the patchfields, there are hubs and all the slots
-    representing the wall connectors. In addition there are
-    slots that can represent a phone line from the central
-    phone system.
-
-    Triggers ensure consistency of the patching information.
-
-    Functions are used to build up powerful views that let
-    you look behind the wall when looking at a patchfield
-    or into a room.
-
-
diff --git a/contrib/plpgsql/test/mklang.sql b/contrib/plpgsql/test/mklang.sql
deleted file mode 100644
index 5a4e6dc23e04064ffdffab7f5d47b07a448c1d99..0000000000000000000000000000000000000000
--- a/contrib/plpgsql/test/mklang.sql
+++ /dev/null
@@ -1,14 +0,0 @@
---
--- PL/pgSQL language declaration
---
--- $Header: /cvsroot/pgsql/contrib/plpgsql/test/Attic/mklang.sql,v 1.1 1998/08/22 12:38:36 momjian Exp $
---
-
-create function plpgsql_call_handler() returns opaque
-	as '/usr/local/pgsql/lib/plpgsql.so'
-	language 'C';
-
-create trusted procedural language 'plpgsql'
-	handler plpgsql_call_handler
-	lancompiler 'PL/pgSQL';
-
diff --git a/contrib/plpgsql/test/runtest b/contrib/plpgsql/test/runtest
deleted file mode 100755
index c8001f0d3f8c86fbcd7ad14fa1429d72ea04415c..0000000000000000000000000000000000000000
--- a/contrib/plpgsql/test/runtest
+++ /dev/null
@@ -1,49 +0,0 @@
-#!/bin/sh
-
-DB=plpgsql_test
-export DB
-
-FRONTEND="psql -n -e -q"
-export FRONTEND
-
-echo "*** destroy old $DB database ***"
-destroydb $DB
-
-echo "*** create new $DB database ***"
-createdb $DB
-
-echo "*** install PL/pgSQL ***"
-$FRONTEND -f mklang.sql -d $DB >/dev/null 2>&1
-
-echo "*** create tables ***"
-$FRONTEND -f tables.sql -d $DB >output/tables.out 2>&1
-if cmp -s output/tables.out expected/tables.out ; then
-    echo "OK"
-else
-    echo "FAILED"
-fi
-
-echo "*** create triggers ***"
-$FRONTEND -f triggers.sql -d $DB >output/triggers.out 2>&1
-if cmp -s output/triggers.out expected/triggers.out ; then
-    echo "OK"
-else
-    echo "FAILED"
-fi
-
-echo "*** create views and support functions ***"
-$FRONTEND -f views.sql -d $DB >output/views.out 2>&1
-if cmp -s output/views.out expected/views.out ; then
-    echo "OK"
-else
-    echo "FAILED"
-fi
-
-echo "*** running tests ***"
-$FRONTEND -f test.sql -d $DB >output/test.out 2>&1
-if cmp -s output/test.out expected/test.out ; then
-    echo "OK"
-else
-    echo "FAILED"
-fi
-
diff --git a/contrib/plpgsql/test/tables.sql b/contrib/plpgsql/test/tables.sql
deleted file mode 100644
index 90ec47453e05a968675088ea732978befc6b0598..0000000000000000000000000000000000000000
--- a/contrib/plpgsql/test/tables.sql
+++ /dev/null
@@ -1,101 +0,0 @@
--- ************************************************************
--- * 
--- * Tables for the patchfield test of PL/pgSQL
--- * 
--- * $Header: /cvsroot/pgsql/contrib/plpgsql/test/Attic/tables.sql,v 1.1 1998/08/22 12:38:36 momjian Exp $
--- * 
--- ************************************************************
-
-create table Room (
-    roomno	char(8),
-    comment	text
-);
-
-create unique index Room_rno on Room using btree (roomno bpchar_ops);
-
-
-create table WSlot (
-    slotname	char(20),
-    roomno	char(8),
-    slotlink	char(20),
-    backlink	char(20)
-);
-
-create unique index WSlot_name on WSlot using btree (slotname bpchar_ops);
-
-
-create table PField (
-    name	text,
-    comment	text
-);
-
-create unique index PField_name on PField using btree (name text_ops);
-
-
-create table PSlot (
-    slotname	char(20),
-    pfname	text,
-    slotlink	char(20),
-    backlink	char(20)
-);
-
-create unique index PSlot_name on PSlot using btree (slotname bpchar_ops);
-
-
-create table PLine (
-    slotname	char(20),
-    phonenumber	char(20),
-    comment	text,
-    backlink	char(20)
-);
-
-create unique index PLine_name on PLine using btree (slotname bpchar_ops);
-
-
-create table Hub (
-    name	char(14),
-    comment	text,
-    nslots	integer
-);
-
-create unique index Hub_name on Hub using btree (name bpchar_ops);
-
-
-create table HSlot (
-    slotname	char(20),
-    hubname	char(14),
-    slotno	integer,
-    slotlink	char(20)
-);
-
-create unique index HSlot_name on HSlot using btree (slotname bpchar_ops);
-create index HSlot_hubname on HSlot using btree (hubname bpchar_ops);
-
-
-create table System (
-    name	text,
-    comment	text
-);
-
-create unique index System_name on System using btree (name text_ops);
-
-
-create table IFace (
-    slotname	char(20),
-    sysname	text,
-    ifname	text,
-    slotlink	char(20)
-);
-
-create unique index IFace_name on IFace using btree (slotname bpchar_ops);
-
-
-create table PHone (
-    slotname	char(20),
-    comment	text,
-    slotlink	char(20)
-);
-
-create unique index PHone_name on PHone using btree (slotname bpchar_ops);
-
-
diff --git a/contrib/plpgsql/test/test.sql b/contrib/plpgsql/test/test.sql
deleted file mode 100644
index 8d522d15d5854a16f1b29dc16f373d5dea7272a4..0000000000000000000000000000000000000000
--- a/contrib/plpgsql/test/test.sql
+++ /dev/null
@@ -1,272 +0,0 @@
---
--- First we build the house - so we create the rooms
---
-insert into Room values ('001', 'Entrance');
-insert into Room values ('002', 'Office');
-insert into Room values ('003', 'Office');
-insert into Room values ('004', 'Technical');
-insert into Room values ('101', 'Office');
-insert into Room values ('102', 'Conference');
-insert into Room values ('103', 'Restroom');
-insert into Room values ('104', 'Technical');
-insert into Room values ('105', 'Office');
-insert into Room values ('106', 'Office');
-
---
--- Second we install the wall connectors
---
-insert into WSlot values ('WS.001.1a', '001', '', '');
-insert into WSlot values ('WS.001.1b', '001', '', '');
-insert into WSlot values ('WS.001.2a', '001', '', '');
-insert into WSlot values ('WS.001.2b', '001', '', '');
-insert into WSlot values ('WS.001.3a', '001', '', '');
-insert into WSlot values ('WS.001.3b', '001', '', '');
-
-insert into WSlot values ('WS.002.1a', '002', '', '');
-insert into WSlot values ('WS.002.1b', '002', '', '');
-insert into WSlot values ('WS.002.2a', '002', '', '');
-insert into WSlot values ('WS.002.2b', '002', '', '');
-insert into WSlot values ('WS.002.3a', '002', '', '');
-insert into WSlot values ('WS.002.3b', '002', '', '');
-
-insert into WSlot values ('WS.003.1a', '003', '', '');
-insert into WSlot values ('WS.003.1b', '003', '', '');
-insert into WSlot values ('WS.003.2a', '003', '', '');
-insert into WSlot values ('WS.003.2b', '003', '', '');
-insert into WSlot values ('WS.003.3a', '003', '', '');
-insert into WSlot values ('WS.003.3b', '003', '', '');
-
-insert into WSlot values ('WS.101.1a', '101', '', '');
-insert into WSlot values ('WS.101.1b', '101', '', '');
-insert into WSlot values ('WS.101.2a', '101', '', '');
-insert into WSlot values ('WS.101.2b', '101', '', '');
-insert into WSlot values ('WS.101.3a', '101', '', '');
-insert into WSlot values ('WS.101.3b', '101', '', '');
-
-insert into WSlot values ('WS.102.1a', '102', '', '');
-insert into WSlot values ('WS.102.1b', '102', '', '');
-insert into WSlot values ('WS.102.2a', '102', '', '');
-insert into WSlot values ('WS.102.2b', '102', '', '');
-insert into WSlot values ('WS.102.3a', '102', '', '');
-insert into WSlot values ('WS.102.3b', '102', '', '');
-
-insert into WSlot values ('WS.105.1a', '105', '', '');
-insert into WSlot values ('WS.105.1b', '105', '', '');
-insert into WSlot values ('WS.105.2a', '105', '', '');
-insert into WSlot values ('WS.105.2b', '105', '', '');
-insert into WSlot values ('WS.105.3a', '105', '', '');
-insert into WSlot values ('WS.105.3b', '105', '', '');
-
-insert into WSlot values ('WS.106.1a', '106', '', '');
-insert into WSlot values ('WS.106.1b', '106', '', '');
-insert into WSlot values ('WS.106.2a', '106', '', '');
-insert into WSlot values ('WS.106.2b', '106', '', '');
-insert into WSlot values ('WS.106.3a', '106', '', '');
-insert into WSlot values ('WS.106.3b', '106', '', '');
-
---
--- Now create the patch fields and their slots
---
-insert into PField values ('PF0_1', 'Wallslots basement');
-
---
--- The cables for these will be made later, so they are unconnected for now
---
-insert into PSlot values ('PS.base.a1', 'PF0_1', '', '');
-insert into PSlot values ('PS.base.a2', 'PF0_1', '', '');
-insert into PSlot values ('PS.base.a3', 'PF0_1', '', '');
-insert into PSlot values ('PS.base.a4', 'PF0_1', '', '');
-insert into PSlot values ('PS.base.a5', 'PF0_1', '', '');
-insert into PSlot values ('PS.base.a6', 'PF0_1', '', '');
-
---
--- These are already wired to the wall connectors
---
-insert into PSlot values ('PS.base.b1', 'PF0_1', '', 'WS.002.1a');
-insert into PSlot values ('PS.base.b2', 'PF0_1', '', 'WS.002.1b');
-insert into PSlot values ('PS.base.b3', 'PF0_1', '', 'WS.002.2a');
-insert into PSlot values ('PS.base.b4', 'PF0_1', '', 'WS.002.2b');
-insert into PSlot values ('PS.base.b5', 'PF0_1', '', 'WS.002.3a');
-insert into PSlot values ('PS.base.b6', 'PF0_1', '', 'WS.002.3b');
-
-insert into PSlot values ('PS.base.c1', 'PF0_1', '', 'WS.003.1a');
-insert into PSlot values ('PS.base.c2', 'PF0_1', '', 'WS.003.1b');
-insert into PSlot values ('PS.base.c3', 'PF0_1', '', 'WS.003.2a');
-insert into PSlot values ('PS.base.c4', 'PF0_1', '', 'WS.003.2b');
-insert into PSlot values ('PS.base.c5', 'PF0_1', '', 'WS.003.3a');
-insert into PSlot values ('PS.base.c6', 'PF0_1', '', 'WS.003.3b');
-
---
--- This patchfield will be renamed later into PF0_2 - so its
--- slots references in pfname should follow
---
-insert into PField values ('PF0_X', 'Phonelines basement');
-
-insert into PSlot values ('PS.base.ta1', 'PF0_X', '', '');
-insert into PSlot values ('PS.base.ta2', 'PF0_X', '', '');
-insert into PSlot values ('PS.base.ta3', 'PF0_X', '', '');
-insert into PSlot values ('PS.base.ta4', 'PF0_X', '', '');
-insert into PSlot values ('PS.base.ta5', 'PF0_X', '', '');
-insert into PSlot values ('PS.base.ta6', 'PF0_X', '', '');
-
-insert into PSlot values ('PS.base.tb1', 'PF0_X', '', '');
-insert into PSlot values ('PS.base.tb2', 'PF0_X', '', '');
-insert into PSlot values ('PS.base.tb3', 'PF0_X', '', '');
-insert into PSlot values ('PS.base.tb4', 'PF0_X', '', '');
-insert into PSlot values ('PS.base.tb5', 'PF0_X', '', '');
-insert into PSlot values ('PS.base.tb6', 'PF0_X', '', '');
-
-insert into PField values ('PF1_1', 'Wallslots 1st floor');
-
-insert into PSlot values ('PS.1st.a1', 'PF1_1', '', 'WS.101.1a');
-insert into PSlot values ('PS.1st.a2', 'PF1_1', '', 'WS.101.1b');
-insert into PSlot values ('PS.1st.a3', 'PF1_1', '', 'WS.101.2a');
-insert into PSlot values ('PS.1st.a4', 'PF1_1', '', 'WS.101.2b');
-insert into PSlot values ('PS.1st.a5', 'PF1_1', '', 'WS.101.3a');
-insert into PSlot values ('PS.1st.a6', 'PF1_1', '', 'WS.101.3b');
-
-insert into PSlot values ('PS.1st.b1', 'PF1_1', '', 'WS.102.1a');
-insert into PSlot values ('PS.1st.b2', 'PF1_1', '', 'WS.102.1b');
-insert into PSlot values ('PS.1st.b3', 'PF1_1', '', 'WS.102.2a');
-insert into PSlot values ('PS.1st.b4', 'PF1_1', '', 'WS.102.2b');
-insert into PSlot values ('PS.1st.b5', 'PF1_1', '', 'WS.102.3a');
-insert into PSlot values ('PS.1st.b6', 'PF1_1', '', 'WS.102.3b');
-
-insert into PSlot values ('PS.1st.c1', 'PF1_1', '', 'WS.105.1a');
-insert into PSlot values ('PS.1st.c2', 'PF1_1', '', 'WS.105.1b');
-insert into PSlot values ('PS.1st.c3', 'PF1_1', '', 'WS.105.2a');
-insert into PSlot values ('PS.1st.c4', 'PF1_1', '', 'WS.105.2b');
-insert into PSlot values ('PS.1st.c5', 'PF1_1', '', 'WS.105.3a');
-insert into PSlot values ('PS.1st.c6', 'PF1_1', '', 'WS.105.3b');
-
-insert into PSlot values ('PS.1st.d1', 'PF1_1', '', 'WS.106.1a');
-insert into PSlot values ('PS.1st.d2', 'PF1_1', '', 'WS.106.1b');
-insert into PSlot values ('PS.1st.d3', 'PF1_1', '', 'WS.106.2a');
-insert into PSlot values ('PS.1st.d4', 'PF1_1', '', 'WS.106.2b');
-insert into PSlot values ('PS.1st.d5', 'PF1_1', '', 'WS.106.3a');
-insert into PSlot values ('PS.1st.d6', 'PF1_1', '', 'WS.106.3b');
-
---
--- Now we wire the wall connectors 1a-2a in room 001 to the
--- patchfield. In the second update we make an error, and
--- correct it after
---
-update PSlot set backlink = 'WS.001.1a' where slotname = 'PS.base.a1';
-update PSlot set backlink = 'WS.001.1b' where slotname = 'PS.base.a3';
-select * from WSlot where roomno = '001' order by slotname;
-select * from PSlot where slotname ~ 'PS.base.a' order by slotname;
-update PSlot set backlink = 'WS.001.2a' where slotname = 'PS.base.a3';
-select * from WSlot where roomno = '001' order by slotname;
-select * from PSlot where slotname ~ 'PS.base.a' order by slotname;
-update PSlot set backlink = 'WS.001.1b' where slotname = 'PS.base.a2';
-select * from WSlot where roomno = '001' order by slotname;
-select * from PSlot where slotname ~ 'PS.base.a' order by slotname;
-
---
--- Same procedure for 2b-3b but this time updating the WSlot instead
--- of the PSlot. Due to the triggers the result is the same:
--- WSlot and corresponding PSlot point to each other.
---
-update WSlot set backlink = 'PS.base.a4' where slotname = 'WS.001.2b';
-update WSlot set backlink = 'PS.base.a6' where slotname = 'WS.001.3a';
-select * from WSlot where roomno = '001' order by slotname;
-select * from PSlot where slotname ~ 'PS.base.a' order by slotname;
-update WSlot set backlink = 'PS.base.a6' where slotname = 'WS.001.3b';
-select * from WSlot where roomno = '001' order by slotname;
-select * from PSlot where slotname ~ 'PS.base.a' order by slotname;
-update WSlot set backlink = 'PS.base.a5' where slotname = 'WS.001.3a';
-select * from WSlot where roomno = '001' order by slotname;
-select * from PSlot where slotname ~ 'PS.base.a' order by slotname;
-
-insert into PField values ('PF1_2', 'Phonelines 1st floor');
-
-insert into PSlot values ('PS.1st.ta1', 'PF1_2', '', '');
-insert into PSlot values ('PS.1st.ta2', 'PF1_2', '', '');
-insert into PSlot values ('PS.1st.ta3', 'PF1_2', '', '');
-insert into PSlot values ('PS.1st.ta4', 'PF1_2', '', '');
-insert into PSlot values ('PS.1st.ta5', 'PF1_2', '', '');
-insert into PSlot values ('PS.1st.ta6', 'PF1_2', '', '');
-
-insert into PSlot values ('PS.1st.tb1', 'PF1_2', '', '');
-insert into PSlot values ('PS.1st.tb2', 'PF1_2', '', '');
-insert into PSlot values ('PS.1st.tb3', 'PF1_2', '', '');
-insert into PSlot values ('PS.1st.tb4', 'PF1_2', '', '');
-insert into PSlot values ('PS.1st.tb5', 'PF1_2', '', '');
-insert into PSlot values ('PS.1st.tb6', 'PF1_2', '', '');
-
---
--- Fix the wrong name for patchfield PF0_2
---
-update PField set name = 'PF0_2' where name = 'PF0_X';
-
-select * from PSlot order by slotname;
-select * from WSlot order by slotname;
-
---
--- Install the central phone system and create the phone numbers.
--- They are weired on insert to the patchfields. Again the
--- triggers automatically tell the PSlots to update their
--- backlink field.
---
-insert into PLine values ('PL.001', '-0', 'Central call', 'PS.base.ta1');
-insert into PLine values ('PL.002', '-101', '', 'PS.base.ta2');
-insert into PLine values ('PL.003', '-102', '', 'PS.base.ta3');
-insert into PLine values ('PL.004', '-103', '', 'PS.base.ta5');
-insert into PLine values ('PL.005', '-104', '', 'PS.base.ta6');
-insert into PLine values ('PL.006', '-106', '', 'PS.base.tb2');
-insert into PLine values ('PL.007', '-108', '', 'PS.base.tb3');
-insert into PLine values ('PL.008', '-109', '', 'PS.base.tb4');
-insert into PLine values ('PL.009', '-121', '', 'PS.base.tb5');
-insert into PLine values ('PL.010', '-122', '', 'PS.base.tb6');
-insert into PLine values ('PL.015', '-134', '', 'PS.1st.ta1');
-insert into PLine values ('PL.016', '-137', '', 'PS.1st.ta3');
-insert into PLine values ('PL.017', '-139', '', 'PS.1st.ta4');
-insert into PLine values ('PL.018', '-362', '', 'PS.1st.tb1');
-insert into PLine values ('PL.019', '-363', '', 'PS.1st.tb2');
-insert into PLine values ('PL.020', '-364', '', 'PS.1st.tb3');
-insert into PLine values ('PL.021', '-365', '', 'PS.1st.tb5');
-insert into PLine values ('PL.022', '-367', '', 'PS.1st.tb6');
-insert into PLine values ('PL.028', '-501', 'Fax entrance', 'PS.base.ta2');
-insert into PLine values ('PL.029', '-502', 'Fax 1st floor', 'PS.1st.ta1');
-
---
--- Buy some phones, plug them into the wall and patch the
--- phone lines to the corresponding patchfield slots.
---
-insert into PHone values ('PH.hc001', 'Hicom standard', 'WS.001.1a');
-update PSlot set slotlink = 'PS.base.ta1' where slotname = 'PS.base.a1';
-insert into PHone values ('PH.hc002', 'Hicom standard', 'WS.002.1a');
-update PSlot set slotlink = 'PS.base.ta5' where slotname = 'PS.base.b1';
-insert into PHone values ('PH.hc003', 'Hicom standard', 'WS.002.2a');
-update PSlot set slotlink = 'PS.base.tb2' where slotname = 'PS.base.b3';
-insert into PHone values ('PH.fax001', 'Canon fax', 'WS.001.2a');
-update PSlot set slotlink = 'PS.base.ta2' where slotname = 'PS.base.a3';
-
---
--- Install a hub at one of the patchfields, plug a computers
--- ethernet interface into the wall and patch it to the hub.
---
-insert into Hub values ('base.hub1', 'Patchfield PF0_1 hub', 16);
-insert into System values ('orion', 'PC');
-insert into IFace values ('IF', 'orion', 'eth0', 'WS.002.1b');
-update PSlot set slotlink = 'HS.base.hub1.1' where slotname = 'PS.base.b2';
-
---
--- Now we take a look at the patchfield
---
-select * from PField_v1 where pfname = 'PF0_1' order by slotname;
-select * from PField_v1 where pfname = 'PF0_2' order by slotname;
-
---
--- Finally we want errors
---
-insert into PField values ('PF1_1', 'should fail due to unique index');
-update PSlot set backlink = 'WS.not.there' where slotname = 'PS.base.a1';
-update PSlot set backlink = 'XX.illegal' where slotname = 'PS.base.a1';
-update PSlot set slotlink = 'PS.not.there' where slotname = 'PS.base.a1';
-update PSlot set slotlink = 'XX.illegal' where slotname = 'PS.base.a1';
-insert into HSlot values ('HS', 'base.hub1', 1, '');
-insert into HSlot values ('HS', 'base.hub1', 20, '');
-delete from HSlot;
-insert into IFace values ('IF', 'notthere', 'eth0', '');
-insert into IFace values ('IF', 'orion', 'ethernet_interface_name_too_long', '');
diff --git a/contrib/plpgsql/test/triggers.sql b/contrib/plpgsql/test/triggers.sql
deleted file mode 100644
index 185db97b29f43632810590f03446834a595a9a55..0000000000000000000000000000000000000000
--- a/contrib/plpgsql/test/triggers.sql
+++ /dev/null
@@ -1,892 +0,0 @@
--- ************************************************************
--- * 
--- * Trigger procedures and functions for the patchfield
--- * test of PL/pgSQL
--- * 
--- * $Header: /cvsroot/pgsql/contrib/plpgsql/test/Attic/triggers.sql,v 1.1 1998/08/22 12:38:37 momjian Exp $
--- * 
--- ************************************************************
-
-
--- ************************************************************
--- * AFTER UPDATE on Room
--- *	- If room no changes let wall slots follow
--- ************************************************************
-create function tg_room_au() returns opaque as '
-begin
-    if new.roomno != old.roomno then
-        update WSlot set roomno = new.roomno where roomno = old.roomno;
-    end if;
-    return new;
-end;
-' language 'plpgsql';
-
-create trigger tg_room_au after update
-    on Room for each row execute procedure tg_room_au();
-
-
--- ************************************************************
--- * AFTER DELETE on Room
--- *	- delete wall slots in this room
--- ************************************************************
-create function tg_room_ad() returns opaque as '
-begin
-    delete from WSlot where roomno = old.roomno;
-    return old;
-end;
-' language 'plpgsql';
-
-create trigger tg_room_ad after delete
-    on Room for each row execute procedure tg_room_ad();
-
-
--- ************************************************************
--- * BEFORE INSERT or UPDATE on WSlot
--- *	- Check that room exists
--- ************************************************************
-create function tg_wslot_biu() returns opaque as '
-begin
-    if count(*) = 0 from Room where roomno = new.roomno then
-        raise exception ''Room % does not exist'', new.roomno;
-    end if;
-    return new;
-end;
-' language 'plpgsql';
-
-create trigger tg_wslot_biu before insert or update
-    on WSlot for each row execute procedure tg_wslot_biu();
-
-
--- ************************************************************
--- * AFTER UPDATE on PField
--- *	- Let PSlots of this field follow
--- ************************************************************
-create function tg_pfield_au() returns opaque as '
-begin
-    if new.name != old.name then
-        update PSlot set pfname = new.name where pfname = old.name;
-    end if;
-    return new;
-end;
-' language 'plpgsql';
-
-create trigger tg_pfield_au after update
-    on PField for each row execute procedure tg_pfield_au();
-
-
--- ************************************************************
--- * AFTER DELETE on PField
--- *	- Remove all slots of this patchfield
--- ************************************************************
-create function tg_pfield_ad() returns opaque as '
-begin
-    delete from PSlot where pfname = old.name;
-    return old;
-end;
-' language 'plpgsql';
-
-create trigger tg_pfield_ad after delete
-    on PField for each row execute procedure tg_pfield_ad();
-
-
--- ************************************************************
--- * BEFORE INSERT or UPDATE on PSlot
--- *	- Ensure that our patchfield does exist
--- ************************************************************
-create function tg_pslot_biu() returns opaque as '
-declare
-    pfrec	record;
-    rename new to ps;
-begin
-    select into pfrec * from PField where name = ps.pfname;
-    if not found then
-        raise exception ''Patchfield "%" does not exist'', ps.pfname;
-    end if;
-    return ps;
-end;
-' language 'plpgsql';
-
-create trigger tg_pslot_biu before insert or update
-    on PSlot for each row execute procedure tg_pslot_biu();
-
-
--- ************************************************************
--- * AFTER UPDATE on System
--- *	- If system name changes let interfaces follow
--- ************************************************************
-create function tg_system_au() returns opaque as '
-begin
-    if new.name != old.name then
-        update IFace set sysname = new.name where sysname = old.name;
-    end if;
-    return new;
-end;
-' language 'plpgsql';
-
-create trigger tg_system_au after update
-    on System for each row execute procedure tg_system_au();
-
-
--- ************************************************************
--- * BEFORE INSERT or UPDATE on IFace
--- *	- set the slotname to IF.sysname.ifname
--- ************************************************************
-create function tg_iface_biu() returns opaque as '
-declare
-    sname	text;
-    sysrec	record;
-begin
-    select into sysrec * from system where name = new.sysname;
-    if not found then
-        raise exception ''system "%" does not exist'', new.sysname;
-    end if;
-    sname := ''IF.'' || new.sysname;
-    sname := sname || ''.'';
-    sname := sname || new.ifname;
-    if length(sname) > 20 then
-        raise exception ''IFace slotname "%" too long (20 char max)'', sname;
-    end if;
-    new.slotname := sname;
-    return new;
-end;
-' language 'plpgsql';
-
-create trigger tg_iface_biu before insert or update
-    on IFace for each row execute procedure tg_iface_biu();
-
-
--- ************************************************************
--- * AFTER INSERT or UPDATE or DELETE on Hub
--- *	- insert/delete/rename slots as required
--- ************************************************************
-create function tg_hub_a() returns opaque as '
-declare
-    hname	text;
-    dummy	integer;
-begin
-    if tg_op = ''INSERT'' then
-	dummy := tg_hub_adjustslots(new.name, 0, new.nslots);
-	return new;
-    end if;
-    if tg_op = ''UPDATE'' then
-	if new.name != old.name then
-	    update HSlot set hubname = new.name where hubname = old.name;
-	end if;
-	dummy := tg_hub_adjustslots(new.name, old.nslots, new.nslots);
-	return new;
-    end if;
-    if tg_op = ''DELETE'' then
-	dummy := tg_hub_adjustslots(old.name, old.nslots, 0);
-	return old;
-    end if;
-end;
-' language 'plpgsql';
-
-create trigger tg_hub_a after insert or update or delete
-    on Hub for each row execute procedure tg_hub_a();
-
-
--- ************************************************************
--- * Support function to add/remove slots of Hub
--- ************************************************************
-create function tg_hub_adjustslots(bpchar, integer, integer)
-returns integer as '
-declare
-    hname	alias for $1;
-    oldnslots	alias for $2;
-    newnslots	alias for $3;
-begin
-    if newnslots = oldnslots then
-        return 0;
-    end if;
-    if newnslots < oldnslots then
-        delete from HSlot where hubname = hname and slotno > newnslots;
-	return 0;
-    end if;
-    for i in oldnslots + 1 .. newnslots loop
-        insert into HSlot (slotname, hubname, slotno, slotlink)
-		values (''HS.dummy'', hname, i, '''');
-    end loop;
-    return 0;
-end;
-' language 'plpgsql';
-
-
--- ************************************************************
--- * BEFORE INSERT or UPDATE on HSlot
--- *	- prevent from manual manipulation
--- *	- set the slotname to HS.hubname.slotno
--- ************************************************************
-create function tg_hslot_biu() returns opaque as '
-declare
-    sname	text;
-    xname	HSlot.slotname%TYPE;
-    hubrec	record;
-begin
-    select into hubrec * from Hub where name = new.hubname;
-    if not found then
-        raise exception ''no manual manipulation of HSlot'';
-    end if;
-    if new.slotno < 1 or new.slotno > hubrec.nslots then
-        raise exception ''no manual manipulation of HSlot'';
-    end if;
-    if tg_op = ''UPDATE'' then
-	if new.hubname != old.hubname then
-	    if count(*) > 0 from Hub where name = old.hubname then
-		raise exception ''no manual manipulation of HSlot'';
-	    end if;
-	end if;
-    end if;
-    sname := ''HS.'' || trim(new.hubname);
-    sname := sname || ''.'';
-    sname := sname || new.slotno::text;
-    if length(sname) > 20 then
-        raise exception ''HSlot slotname "%" too long (20 char max)'', sname;
-    end if;
-    new.slotname := sname;
-    return new;
-end;
-' language 'plpgsql';
-
-create trigger tg_hslot_biu before insert or update
-    on HSlot for each row execute procedure tg_hslot_biu();
-
-
--- ************************************************************
--- * BEFORE DELETE on HSlot
--- *	- prevent from manual manipulation
--- ************************************************************
-create function tg_hslot_bd() returns opaque as '
-declare
-    hubrec	record;
-begin
-    select into hubrec * from Hub where name = old.hubname;
-    if not found then
-        return old;
-    end if;
-    if old.slotno > hubrec.nslots then
-        return old;
-    end if;
-    raise exception ''no manual manipulation of HSlot'';
-end;
-' language 'plpgsql';
-
-create trigger tg_hslot_bd before delete
-    on HSlot for each row execute procedure tg_hslot_bd();
-
-
--- ************************************************************
--- * BEFORE INSERT on all slots
--- *	- Check name prefix
--- ************************************************************
-create function tg_chkslotname() returns opaque as '
-begin
-    if substr(new.slotname, 1, 2) != tg_argv[0] then
-        raise exception ''slotname must begin with %'', tg_argv[0];
-    end if;
-    return new;
-end;
-' language 'plpgsql';
-
-create trigger tg_chkslotname before insert
-    on PSlot for each row execute procedure tg_chkslotname('PS');
-
-create trigger tg_chkslotname before insert
-    on WSlot for each row execute procedure tg_chkslotname('WS');
-
-create trigger tg_chkslotname before insert
-    on PLine for each row execute procedure tg_chkslotname('PL');
-
-create trigger tg_chkslotname before insert
-    on IFace for each row execute procedure tg_chkslotname('IF');
-
-create trigger tg_chkslotname before insert
-    on PHone for each row execute procedure tg_chkslotname('PH');
-
-
--- ************************************************************
--- * BEFORE INSERT or UPDATE on all slots with slotlink
--- *	- Set slotlink to empty string if NULL value given
--- ************************************************************
-create function tg_chkslotlink() returns opaque as '
-begin
-    if new.slotlink isnull then
-        new.slotlink := '''';
-    end if;
-    return new;
-end;
-' language 'plpgsql';
-
-create trigger tg_chkslotlink before insert or update
-    on PSlot for each row execute procedure tg_chkslotlink();
-
-create trigger tg_chkslotlink before insert or update
-    on WSlot for each row execute procedure tg_chkslotlink();
-
-create trigger tg_chkslotlink before insert or update
-    on IFace for each row execute procedure tg_chkslotlink();
-
-create trigger tg_chkslotlink before insert or update
-    on HSlot for each row execute procedure tg_chkslotlink();
-
-create trigger tg_chkslotlink before insert or update
-    on PHone for each row execute procedure tg_chkslotlink();
-
-
--- ************************************************************
--- * BEFORE INSERT or UPDATE on all slots with backlink
--- *	- Set backlink to empty string if NULL value given
--- ************************************************************
-create function tg_chkbacklink() returns opaque as '
-begin
-    if new.backlink isnull then
-        new.backlink := '''';
-    end if;
-    return new;
-end;
-' language 'plpgsql';
-
-create trigger tg_chkbacklink before insert or update
-    on PSlot for each row execute procedure tg_chkbacklink();
-
-create trigger tg_chkbacklink before insert or update
-    on WSlot for each row execute procedure tg_chkbacklink();
-
-create trigger tg_chkbacklink before insert or update
-    on PLine for each row execute procedure tg_chkbacklink();
-
-
--- ************************************************************
--- * BEFORE UPDATE on PSlot
--- *	- do delete/insert instead of update if name changes
--- ************************************************************
-create function tg_pslot_bu() returns opaque as '
-begin
-    if new.slotname != old.slotname then
-        delete from PSlot where slotname = old.slotname;
-	insert into PSlot (
-		    slotname,
-		    pfname,
-		    slotlink,
-		    backlink
-		) values (
-		    new.slotname,
-		    new.pfname,
-		    new.slotlink,
-		    new.backlink
-		);
-        return null;
-    end if;
-    return new;
-end;
-' language 'plpgsql';
-
-create trigger tg_pslot_bu before update
-    on PSlot for each row execute procedure tg_pslot_bu();
-
-
--- ************************************************************
--- * BEFORE UPDATE on WSlot
--- *	- do delete/insert instead of update if name changes
--- ************************************************************
-create function tg_wslot_bu() returns opaque as '
-begin
-    if new.slotname != old.slotname then
-        delete from WSlot where slotname = old.slotname;
-	insert into WSlot (
-		    slotname,
-		    roomno,
-		    slotlink,
-		    backlink
-		) values (
-		    new.slotname,
-		    new.roomno,
-		    new.slotlink,
-		    new.backlink
-		);
-        return null;
-    end if;
-    return new;
-end;
-' language 'plpgsql';
-
-create trigger tg_wslot_bu before update
-    on WSlot for each row execute procedure tg_Wslot_bu();
-
-
--- ************************************************************
--- * BEFORE UPDATE on PLine
--- *	- do delete/insert instead of update if name changes
--- ************************************************************
-create function tg_pline_bu() returns opaque as '
-begin
-    if new.slotname != old.slotname then
-        delete from PLine where slotname = old.slotname;
-	insert into PLine (
-		    slotname,
-		    phonenumber,
-		    comment,
-		    backlink
-		) values (
-		    new.slotname,
-		    new.phonenumber,
-		    new.comment,
-		    new.backlink
-		);
-        return null;
-    end if;
-    return new;
-end;
-' language 'plpgsql';
-
-create trigger tg_pline_bu before update
-    on PLine for each row execute procedure tg_pline_bu();
-
-
--- ************************************************************
--- * BEFORE UPDATE on IFace
--- *	- do delete/insert instead of update if name changes
--- ************************************************************
-create function tg_iface_bu() returns opaque as '
-begin
-    if new.slotname != old.slotname then
-        delete from IFace where slotname = old.slotname;
-	insert into IFace (
-		    slotname,
-		    sysname,
-		    ifname,
-		    slotlink
-		) values (
-		    new.slotname,
-		    new.sysname,
-		    new.ifname,
-		    new.slotlink
-		);
-        return null;
-    end if;
-    return new;
-end;
-' language 'plpgsql';
-
-create trigger tg_iface_bu before update
-    on IFace for each row execute procedure tg_iface_bu();
-
-
--- ************************************************************
--- * BEFORE UPDATE on HSlot
--- *	- do delete/insert instead of update if name changes
--- ************************************************************
-create function tg_hslot_bu() returns opaque as '
-begin
-    if new.slotname != old.slotname or new.hubname != old.hubname then
-        delete from HSlot where slotname = old.slotname;
-	insert into HSlot (
-		    slotname,
-		    hubname,
-		    slotno,
-		    slotlink
-		) values (
-		    new.slotname,
-		    new.hubname,
-		    new.slotno,
-		    new.slotlink
-		);
-        return null;
-    end if;
-    return new;
-end;
-' language 'plpgsql';
-
-create trigger tg_hslot_bu before update
-    on HSlot for each row execute procedure tg_hslot_bu();
-
-
--- ************************************************************
--- * BEFORE UPDATE on PHone
--- *	- do delete/insert instead of update if name changes
--- ************************************************************
-create function tg_phone_bu() returns opaque as '
-begin
-    if new.slotname != old.slotname then
-        delete from PHone where slotname = old.slotname;
-	insert into PHone (
-		    slotname,
-		    comment,
-		    slotlink
-		) values (
-		    new.slotname,
-		    new.comment,
-		    new.slotlink
-		);
-        return null;
-    end if;
-    return new;
-end;
-' language 'plpgsql';
-
-create trigger tg_phone_bu before update
-    on PHone for each row execute procedure tg_phone_bu();
-
-
--- ************************************************************
--- * AFTER INSERT or UPDATE or DELETE on slot with backlink
--- *	- Ensure that the opponent correctly points back to us
--- ************************************************************
-create function tg_backlink_a() returns opaque as '
-declare
-    dummy	integer;
-begin
-    if tg_op = ''INSERT'' then
-        if new.backlink != '''' then
-	    dummy := tg_backlink_set(new.backlink, new.slotname);
-	end if;
-	return new;
-    end if;
-    if tg_op = ''UPDATE'' then
-        if new.backlink != old.backlink then
-	    if old.backlink != '''' then
-	        dummy := tg_backlink_unset(old.backlink, old.slotname);
-	    end if;
-	    if new.backlink != '''' then
-	        dummy := tg_backlink_set(new.backlink, new.slotname);
-	    end if;
-	else
-	    if new.slotname != old.slotname and new.backlink != '''' then
-	        dummy := tg_slotlink_set(new.backlink, new.slotname);
-	    end if;
-	end if;
-	return new;
-    end if;
-    if tg_op = ''DELETE'' then
-        if old.backlink != '''' then
-	    dummy := tg_backlink_unset(old.backlink, old.slotname);
-	end if;
-	return old;
-    end if;
-end;
-' language 'plpgsql';
-
-
-create trigger tg_backlink_a after insert or update or delete
-    on PSlot for each row execute procedure tg_backlink_a('PS');
-
-create trigger tg_backlink_a after insert or update or delete
-    on WSlot for each row execute procedure tg_backlink_a('WS');
-
-create trigger tg_backlink_a after insert or update or delete
-    on PLine for each row execute procedure tg_backlink_a('PL');
-
-
--- ************************************************************
--- * Support function to set the opponents backlink field
--- * if it does not already point to the requested slot
--- ************************************************************
-create function tg_backlink_set(bpchar, bpchar)
-returns integer as '
-declare
-    myname	alias for $1;
-    blname	alias for $2;
-    mytype	char(2);
-    link	char(4);
-    rec		record;
-begin
-    mytype := substr(myname, 1, 2);
-    link := mytype || substr(blname, 1, 2);
-    if link = ''PLPL'' then
-        raise exception 
-		''backlink between two phone lines does not make sense'';
-    end if;
-    if link in (''PLWS'', ''WSPL'') then
-        raise exception 
-		''direct link of phone line to wall slot not permitted'';
-    end if;
-    if mytype = ''PS'' then
-        select into rec * from PSlot where slotname = myname;
-	if not found then
-	    raise exception ''% does not exists'', myname;
-	end if;
-	if rec.backlink != blname then
-	    update PSlot set backlink = blname where slotname = myname;
-	end if;
-	return 0;
-    end if;
-    if mytype = ''WS'' then
-        select into rec * from WSlot where slotname = myname;
-	if not found then
-	    raise exception ''% does not exists'', myname;
-	end if;
-	if rec.backlink != blname then
-	    update WSlot set backlink = blname where slotname = myname;
-	end if;
-	return 0;
-    end if;
-    if mytype = ''PL'' then
-        select into rec * from PLine where slotname = myname;
-	if not found then
-	    raise exception ''% does not exists'', myname;
-	end if;
-	if rec.backlink != blname then
-	    update PLine set backlink = blname where slotname = myname;
-	end if;
-	return 0;
-    end if;
-    raise exception ''illegal backlink beginning with %'', mytype;
-end;
-' language 'plpgsql';
-
-
--- ************************************************************
--- * Support function to clear out the backlink field if
--- * it still points to specific slot
--- ************************************************************
-create function tg_backlink_unset(bpchar, bpchar)
-returns integer as '
-declare
-    myname	alias for $1;
-    blname	alias for $2;
-    mytype	char(2);
-    rec		record;
-begin
-    mytype := substr(myname, 1, 2);
-    if mytype = ''PS'' then
-        select into rec * from PSlot where slotname = myname;
-	if not found then
-	    return 0;
-	end if;
-	if rec.backlink = blname then
-	    update PSlot set backlink = '''' where slotname = myname;
-	end if;
-	return 0;
-    end if;
-    if mytype = ''WS'' then
-        select into rec * from WSlot where slotname = myname;
-	if not found then
-	    return 0;
-	end if;
-	if rec.backlink = blname then
-	    update WSlot set backlink = '''' where slotname = myname;
-	end if;
-	return 0;
-    end if;
-    if mytype = ''PL'' then
-        select into rec * from PLine where slotname = myname;
-	if not found then
-	    return 0;
-	end if;
-	if rec.backlink = blname then
-	    update PLine set backlink = '''' where slotname = myname;
-	end if;
-	return 0;
-    end if;
-end;
-' language 'plpgsql';
-
-
--- ************************************************************
--- * AFTER INSERT or UPDATE or DELETE on slot with slotlink
--- *	- Ensure that the opponent correctly points back to us
--- ************************************************************
-create function tg_slotlink_a() returns opaque as '
-declare
-    dummy	integer;
-begin
-    if tg_op = ''INSERT'' then
-        if new.slotlink != '''' then
-	    dummy := tg_slotlink_set(new.slotlink, new.slotname);
-	end if;
-	return new;
-    end if;
-    if tg_op = ''UPDATE'' then
-        if new.slotlink != old.slotlink then
-	    if old.slotlink != '''' then
-	        dummy := tg_slotlink_unset(old.slotlink, old.slotname);
-	    end if;
-	    if new.slotlink != '''' then
-	        dummy := tg_slotlink_set(new.slotlink, new.slotname);
-	    end if;
-	else
-	    if new.slotname != old.slotname and new.slotlink != '''' then
-	        dummy := tg_slotlink_set(new.slotlink, new.slotname);
-	    end if;
-	end if;
-	return new;
-    end if;
-    if tg_op = ''DELETE'' then
-        if old.slotlink != '''' then
-	    dummy := tg_slotlink_unset(old.slotlink, old.slotname);
-	end if;
-	return old;
-    end if;
-end;
-' language 'plpgsql';
-
-
-create trigger tg_slotlink_a after insert or update or delete
-    on PSlot for each row execute procedure tg_slotlink_a('PS');
-
-create trigger tg_slotlink_a after insert or update or delete
-    on WSlot for each row execute procedure tg_slotlink_a('WS');
-
-create trigger tg_slotlink_a after insert or update or delete
-    on IFace for each row execute procedure tg_slotlink_a('IF');
-
-create trigger tg_slotlink_a after insert or update or delete
-    on HSlot for each row execute procedure tg_slotlink_a('HS');
-
-create trigger tg_slotlink_a after insert or update or delete
-    on PHone for each row execute procedure tg_slotlink_a('PH');
-
-
--- ************************************************************
--- * Support function to set the opponents slotlink field
--- * if it does not already point to the requested slot
--- ************************************************************
-create function tg_slotlink_set(bpchar, bpchar)
-returns integer as '
-declare
-    myname	alias for $1;
-    blname	alias for $2;
-    mytype	char(2);
-    link	char(4);
-    rec		record;
-begin
-    mytype := substr(myname, 1, 2);
-    link := mytype || substr(blname, 1, 2);
-    if link = ''PHPH'' then
-        raise exception 
-		''slotlink between two phones does not make sense'';
-    end if;
-    if link in (''PHHS'', ''HSPH'') then
-        raise exception 
-		''link of phone to hub does not make sense'';
-    end if;
-    if link in (''PHIF'', ''IFPH'') then
-        raise exception 
-		''link of phone to hub does not make sense'';
-    end if;
-    if link in (''PSWS'', ''WSPS'') then
-        raise exception 
-		''slotlink from patchslot to wallslot not permitted'';
-    end if;
-    if mytype = ''PS'' then
-        select into rec * from PSlot where slotname = myname;
-	if not found then
-	    raise exception ''% does not exists'', myname;
-	end if;
-	if rec.slotlink != blname then
-	    update PSlot set slotlink = blname where slotname = myname;
-	end if;
-	return 0;
-    end if;
-    if mytype = ''WS'' then
-        select into rec * from WSlot where slotname = myname;
-	if not found then
-	    raise exception ''% does not exists'', myname;
-	end if;
-	if rec.slotlink != blname then
-	    update WSlot set slotlink = blname where slotname = myname;
-	end if;
-	return 0;
-    end if;
-    if mytype = ''IF'' then
-        select into rec * from IFace where slotname = myname;
-	if not found then
-	    raise exception ''% does not exists'', myname;
-	end if;
-	if rec.slotlink != blname then
-	    update IFace set slotlink = blname where slotname = myname;
-	end if;
-	return 0;
-    end if;
-    if mytype = ''HS'' then
-        select into rec * from HSlot where slotname = myname;
-	if not found then
-	    raise exception ''% does not exists'', myname;
-	end if;
-	if rec.slotlink != blname then
-	    update HSlot set slotlink = blname where slotname = myname;
-	end if;
-	return 0;
-    end if;
-    if mytype = ''PH'' then
-        select into rec * from PHone where slotname = myname;
-	if not found then
-	    raise exception ''% does not exists'', myname;
-	end if;
-	if rec.slotlink != blname then
-	    update PHone set slotlink = blname where slotname = myname;
-	end if;
-	return 0;
-    end if;
-    raise exception ''illegal slotlink beginning with %'', mytype;
-end;
-' language 'plpgsql';
-
-
--- ************************************************************
--- * Support function to clear out the slotlink field if
--- * it still points to specific slot
--- ************************************************************
-create function tg_slotlink_unset(bpchar, bpchar)
-returns integer as '
-declare
-    myname	alias for $1;
-    blname	alias for $2;
-    mytype	char(2);
-    rec		record;
-begin
-    mytype := substr(myname, 1, 2);
-    if mytype = ''PS'' then
-        select into rec * from PSlot where slotname = myname;
-	if not found then
-	    return 0;
-	end if;
-	if rec.slotlink = blname then
-	    update PSlot set slotlink = '''' where slotname = myname;
-	end if;
-	return 0;
-    end if;
-    if mytype = ''WS'' then
-        select into rec * from WSlot where slotname = myname;
-	if not found then
-	    return 0;
-	end if;
-	if rec.slotlink = blname then
-	    update WSlot set slotlink = '''' where slotname = myname;
-	end if;
-	return 0;
-    end if;
-    if mytype = ''IF'' then
-        select into rec * from IFace where slotname = myname;
-	if not found then
-	    return 0;
-	end if;
-	if rec.slotlink = blname then
-	    update IFace set slotlink = '''' where slotname = myname;
-	end if;
-	return 0;
-    end if;
-    if mytype = ''HS'' then
-        select into rec * from HSlot where slotname = myname;
-	if not found then
-	    return 0;
-	end if;
-	if rec.slotlink = blname then
-	    update HSlot set slotlink = '''' where slotname = myname;
-	end if;
-	return 0;
-    end if;
-    if mytype = ''PH'' then
-        select into rec * from PHone where slotname = myname;
-	if not found then
-	    return 0;
-	end if;
-	if rec.slotlink = blname then
-	    update PHone set slotlink = '''' where slotname = myname;
-	end if;
-	return 0;
-    end if;
-end;
-' language 'plpgsql';
-
-
diff --git a/contrib/plpgsql/test/views.sql b/contrib/plpgsql/test/views.sql
deleted file mode 100644
index 642359dbdc9e536d66d88ebc675cf7a3dd082805..0000000000000000000000000000000000000000
--- a/contrib/plpgsql/test/views.sql
+++ /dev/null
@@ -1,141 +0,0 @@
--- ************************************************************
--- * Describe the backside of a patchfield slot
--- ************************************************************
-create function pslot_backlink_view(bpchar)
-returns text as '
-<<outer>>
-declare
-    rec		record;
-    bltype	char(2);
-    retval	text;
-begin
-    select into rec * from PSlot where slotname = $1;
-    if not found then
-        return '''';
-    end if;
-    if rec.backlink = '''' then
-        return ''-'';
-    end if;
-    bltype := substr(rec.backlink, 1, 2);
-    if bltype = ''PL'' then
-        declare
-	    rec		record;
-	begin
-	    select into rec * from PLine where slotname = outer.rec.backlink;
-	    retval := ''Phone line '' || trim(rec.phonenumber);
-	    if rec.comment != '''' then
-	        retval := retval || '' ('';
-		retval := retval || rec.comment;
-		retval := retval || '')'';
-	    end if;
-	    return retval;
-	end;
-    end if;
-    if bltype = ''WS'' then
-        select into rec * from WSlot where slotname = rec.backlink;
-	retval := trim(rec.slotname) || '' in room '';
-	retval := retval || trim(rec.roomno);
-	retval := retval || '' -> '';
-	return retval || wslot_slotlink_view(rec.slotname);
-    end if;
-    return rec.backlink;
-end;
-' language 'plpgsql';
-
-
--- ************************************************************
--- * Describe the front of a patchfield slot
--- ************************************************************
-create function pslot_slotlink_view(bpchar)
-returns text as '
-declare
-    psrec	record;
-    sltype	char(2);
-    retval	text;
-begin
-    select into psrec * from PSlot where slotname = $1;
-    if not found then
-        return '''';
-    end if;
-    if psrec.slotlink = '''' then
-        return ''-'';
-    end if;
-    sltype := substr(psrec.slotlink, 1, 2);
-    if sltype = ''PS'' then
-	retval := trim(psrec.slotlink) || '' -> '';
-	return retval || pslot_backlink_view(psrec.slotlink);
-    end if;
-    if sltype = ''HS'' then
-        retval := comment from Hub H, HSlot HS
-			where HS.slotname = psrec.slotlink
-			  and H.name = HS.hubname;
-        retval := retval || '' slot '';
-	retval := retval || slotno::text from HSlot
-			where slotname = psrec.slotlink;
-	return retval;
-    end if;
-    return psrec.slotlink;
-end;
-' language 'plpgsql';
-
-
--- ************************************************************
--- * Describe the front of a wall connector slot
--- ************************************************************
-create function wslot_slotlink_view(bpchar)
-returns text as '
-declare
-    rec		record;
-    sltype	char(2);
-    retval	text;
-begin
-    select into rec * from WSlot where slotname = $1;
-    if not found then
-        return '''';
-    end if;
-    if rec.slotlink = '''' then
-        return ''-'';
-    end if;
-    sltype := substr(rec.slotlink, 1, 2);
-    if sltype = ''PH'' then
-        select into rec * from PHone where slotname = rec.slotlink;
-	retval := ''Phone '' || trim(rec.slotname);
-	if rec.comment != '''' then
-	    retval := retval || '' ('';
-	    retval := retval || rec.comment;
-	    retval := retval || '')'';
-	end if;
-	return retval;
-    end if;
-    if sltype = ''IF'' then
-	declare
-	    syrow	System%RowType;
-	    ifrow	IFace%ROWTYPE;
-        begin
-	    select into ifrow * from IFace where slotname = rec.slotlink;
-	    select into syrow * from System where name = ifrow.sysname;
-	    retval := syrow.name || '' IF '';
-	    retval := retval || ifrow.ifname;
-	    if syrow.comment != '''' then
-	        retval := retval || '' ('';
-		retval := retval || syrow.comment;
-		retval := retval || '')'';
-	    end if;
-	    return retval;
-	end;
-    end if;
-    return rec.slotlink;
-end;
-' language 'plpgsql';
-
-
-
--- ************************************************************
--- * View of a patchfield describing backside and patches
--- ************************************************************
-create view Pfield_v1 as select PF.pfname, PF.slotname,
-	pslot_backlink_view(PF.slotname) as backside,
-	pslot_slotlink_view(PF.slotname) as patch
-    from PSlot PF;
-
-
diff --git a/contrib/plpgsql/doc/plpgsql.txt b/src/pl/plpgsql/doc/plpgsql.txt
similarity index 100%
rename from contrib/plpgsql/doc/plpgsql.txt
rename to src/pl/plpgsql/doc/plpgsql.txt
diff --git a/contrib/plpgsql/src/INSTALL b/src/pl/plpgsql/src/INSTALL
similarity index 100%
rename from contrib/plpgsql/src/INSTALL
rename to src/pl/plpgsql/src/INSTALL
diff --git a/contrib/plpgsql/src/gram.y b/src/pl/plpgsql/src/gram.y
similarity index 99%
rename from contrib/plpgsql/src/gram.y
rename to src/pl/plpgsql/src/gram.y
index 12e2fc167ab92455c3a8297dc77021bcca3e3f86..30bc55f69e7f419cd7af2df6d1975b090178a8c4 100644
--- a/contrib/plpgsql/src/gram.y
+++ b/src/pl/plpgsql/src/gram.y
@@ -4,7 +4,7 @@
  *			  procedural language
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/contrib/plpgsql/src/Attic/gram.y,v 1.1 1998/08/22 12:38:30 momjian Exp $
+ *    $Header: /cvsroot/pgsql/src/pl/plpgsql/src/gram.y,v 1.1 1998/08/24 19:14:47 momjian Exp $
  *
  *    This software is copyrighted by Jan Wieck - Hamburg.
  *
diff --git a/contrib/plpgsql/src/mklang.sql b/src/pl/plpgsql/src/mklang.sql
similarity index 70%
rename from contrib/plpgsql/src/mklang.sql
rename to src/pl/plpgsql/src/mklang.sql
index 7bfe0e04d0cd857bb55fb4c48f3172670b24d1de..d68f5c336e9708661641206dea774167bb4cbcfe 100644
--- a/contrib/plpgsql/src/mklang.sql
+++ b/src/pl/plpgsql/src/mklang.sql
@@ -1,7 +1,7 @@
 --
 -- PL/pgSQL language declaration
 --
--- $Header: /cvsroot/pgsql/contrib/plpgsql/src/Attic/mklang.sql,v 1.1 1998/08/22 12:38:31 momjian Exp $
+-- $Header: /cvsroot/pgsql/src/pl/plpgsql/src/Attic/mklang.sql,v 1.1 1998/08/24 19:14:48 momjian Exp $
 --
 
 create function plpgsql_call_handler() returns opaque
diff --git a/contrib/plpgsql/src/pl_comp.c b/src/pl/plpgsql/src/pl_comp.c
similarity index 99%
rename from contrib/plpgsql/src/pl_comp.c
rename to src/pl/plpgsql/src/pl_comp.c
index 3d894f81b9fac22246a20f701c897694451e9d7d..82232104e295e63004fb03233a368b8c6bddbb21 100644
--- a/contrib/plpgsql/src/pl_comp.c
+++ b/src/pl/plpgsql/src/pl_comp.c
@@ -3,7 +3,7 @@
  *			  procedural language
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/contrib/plpgsql/src/Attic/pl_comp.c,v 1.1 1998/08/22 12:38:32 momjian Exp $
+ *    $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_comp.c,v 1.1 1998/08/24 19:14:48 momjian Exp $
  *
  *    This software is copyrighted by Jan Wieck - Hamburg.
  *
diff --git a/contrib/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c
similarity index 99%
rename from contrib/plpgsql/src/pl_exec.c
rename to src/pl/plpgsql/src/pl_exec.c
index 306169fc95cf17cd5dd3897f1449ace97163b8c8..d33b79ef53e1c225765dfe5f3c9a490c04131feb 100644
--- a/contrib/plpgsql/src/pl_exec.c
+++ b/src/pl/plpgsql/src/pl_exec.c
@@ -3,7 +3,7 @@
  *			  procedural language
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/contrib/plpgsql/src/Attic/pl_exec.c,v 1.1 1998/08/22 12:38:32 momjian Exp $
+ *    $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.1 1998/08/24 19:14:48 momjian Exp $
  *
  *    This software is copyrighted by Jan Wieck - Hamburg.
  *
diff --git a/contrib/plpgsql/src/pl_funcs.c b/src/pl/plpgsql/src/pl_funcs.c
similarity index 99%
rename from contrib/plpgsql/src/pl_funcs.c
rename to src/pl/plpgsql/src/pl_funcs.c
index 94de9e4c9a60922dead099529a6aa5d5b2945545..e7f9fe722c7a6fb5f386f87cbabb491947068885 100644
--- a/contrib/plpgsql/src/pl_funcs.c
+++ b/src/pl/plpgsql/src/pl_funcs.c
@@ -3,7 +3,7 @@
  *			  procedural language
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/contrib/plpgsql/src/Attic/pl_funcs.c,v 1.1 1998/08/22 12:38:32 momjian Exp $
+ *    $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_funcs.c,v 1.1 1998/08/24 19:14:48 momjian Exp $
  *
  *    This software is copyrighted by Jan Wieck - Hamburg.
  *
diff --git a/contrib/plpgsql/src/pl_handler.c b/src/pl/plpgsql/src/pl_handler.c
similarity index 97%
rename from contrib/plpgsql/src/pl_handler.c
rename to src/pl/plpgsql/src/pl_handler.c
index fb01e38b697cd8e1fe5558397da37b276d69b156..285fac81aff76c6799ff8b9534b941942d4cb77f 100644
--- a/contrib/plpgsql/src/pl_handler.c
+++ b/src/pl/plpgsql/src/pl_handler.c
@@ -3,7 +3,7 @@
  *			  procedural language
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/contrib/plpgsql/src/Attic/pl_handler.c,v 1.1 1998/08/22 12:38:32 momjian Exp $
+ *    $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_handler.c,v 1.1 1998/08/24 19:14:49 momjian Exp $
  *
  *    This software is copyrighted by Jan Wieck - Hamburg.
  *
diff --git a/contrib/plpgsql/src/plpgsql.h b/src/pl/plpgsql/src/plpgsql.h
similarity index 99%
rename from contrib/plpgsql/src/plpgsql.h
rename to src/pl/plpgsql/src/plpgsql.h
index 406a6897521d8e433de71c90e145049640659219..1c56ba814c3dda22fada5d0eeae766c3be27cc14 100644
--- a/contrib/plpgsql/src/plpgsql.h
+++ b/src/pl/plpgsql/src/plpgsql.h
@@ -3,7 +3,7 @@
  *			  procedural language
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/contrib/plpgsql/src/Attic/plpgsql.h,v 1.1 1998/08/22 12:38:33 momjian Exp $
+ *    $Header: /cvsroot/pgsql/src/pl/plpgsql/src/plpgsql.h,v 1.1 1998/08/24 19:14:49 momjian Exp $
  *
  *    This software is copyrighted by Jan Wieck - Hamburg.
  *
diff --git a/contrib/plpgsql/src/scan.l b/src/pl/plpgsql/src/scan.l
similarity index 98%
rename from contrib/plpgsql/src/scan.l
rename to src/pl/plpgsql/src/scan.l
index 64ddbc17505a74f2a49f829f156bb6636f4f6eaa..6575bdd77b879467e85ec165016e3f08e39c7276 100644
--- a/contrib/plpgsql/src/scan.l
+++ b/src/pl/plpgsql/src/scan.l
@@ -4,7 +4,7 @@
  *			  procedural language
  *
  * IDENTIFICATION
- *    $Header: /cvsroot/pgsql/contrib/plpgsql/src/Attic/scan.l,v 1.1 1998/08/22 12:38:33 momjian Exp $
+ *    $Header: /cvsroot/pgsql/src/pl/plpgsql/src/Attic/scan.l,v 1.1 1998/08/24 19:14:49 momjian Exp $
  *
  *    This software is copyrighted by Jan Wieck - Hamburg.
  *
diff --git a/contrib/plpgsql/test/expected/tables.out b/src/pl/plpgsql/test/expected/tables.out
similarity index 100%
rename from contrib/plpgsql/test/expected/tables.out
rename to src/pl/plpgsql/test/expected/tables.out
diff --git a/contrib/plpgsql/test/expected/test.out b/src/pl/plpgsql/test/expected/test.out
similarity index 100%
rename from contrib/plpgsql/test/expected/test.out
rename to src/pl/plpgsql/test/expected/test.out
diff --git a/contrib/plpgsql/test/expected/triggers.out b/src/pl/plpgsql/test/expected/triggers.out
similarity index 100%
rename from contrib/plpgsql/test/expected/triggers.out
rename to src/pl/plpgsql/test/expected/triggers.out
diff --git a/contrib/plpgsql/test/expected/views.out b/src/pl/plpgsql/test/expected/views.out
similarity index 100%
rename from contrib/plpgsql/test/expected/views.out
rename to src/pl/plpgsql/test/expected/views.out