diff --git a/doc/src/sgml/release.sgml b/doc/src/sgml/release.sgml index 00d78c58ca137a11ae62e4f95980959be7168a0b..ca19741968888115dc1d4e8debeef31ae0b43c68 100644 --- a/doc/src/sgml/release.sgml +++ b/doc/src/sgml/release.sgml @@ -179,7 +179,7 @@ Add Win1250 (Czech) support (Pavel Behal) <surname>Momjian</surname> </author> </authorgroup> -<date>1998-06-09</date> +<date>1999-06-09</date> </docinfo> --> diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out index 174925df849c77702856a39183d120f827ce1cf5..6ef19f56cf66cb044a6f8d148b84cb2c89ac92d7 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -269,3 +269,27 @@ SELECT unique1 FROM tenk1 WHERE unique1 < 5; 4 (5 rows) +-- FOREIGN KEY CONSTRAINT adding TEST +CREATE TABLE tmp2 (a int primary key); +NOTICE: CREATE TABLE/PRIMARY KEY will create implicit index 'tmp2_pkey' for table 'tmp2' +CREATE TABLE tmp3 (a int, b int); +-- Insert rows into tmp2 (pktable) +INSERT INTO tmp2 values (1); +INSERT INTO tmp2 values (2); +INSERT INTO tmp2 values (3); +INSERT INTO tmp2 values (4); +-- Insert rows into tmp3 +INSERT INTO tmp3 values (1,10); +INSERT INTO tmp3 values (1,20); +INSERT INTO tmp3 values (5,50); +-- Try (and fail) to add constraint due to invalid data +ALTER TABLE tmp3 add constraint tmpconstr foreign key (a) references tmp2 match full; +NOTICE: ALTER TABLE ... ADD CONSTRAINT will create implicit trigger(s) for FOREIGN KEY check(s) +ERROR: <unnamed> referential integrity violation - key referenced from tmp3 not found in tmp2 +-- Delete failing row +DELETE FROM tmp3 where a=5; +-- Try (and succeed) +ALTER TABLE tmp3 add constraint tmpconstr foreign key (a) references tmp2 match full; +NOTICE: ALTER TABLE ... ADD CONSTRAINT will create implicit trigger(s) for FOREIGN KEY check(s) +DROP TABLE tmp3 +DROP TABLE tmp2 diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql index 5ba66c46e8f62d3d4cd3acdfe6b5e2eb6b8cf1f9..512b74d49c33a6acc6b1ba49fd879fcf857a1dbe 100644 --- a/src/test/regress/sql/alter_table.sql +++ b/src/test/regress/sql/alter_table.sql @@ -163,3 +163,33 @@ ALTER TABLE ten_k RENAME TO tenk1; -- 5 values, sorted SELECT unique1 FROM tenk1 WHERE unique1 < 5; +-- FOREIGN KEY CONSTRAINT adding TEST + +CREATE TABLE tmp2 (a int primary key); + +CREATE TABLE tmp3 (a int, b int); + +-- Insert rows into tmp2 (pktable) +INSERT INTO tmp2 values (1); +INSERT INTO tmp2 values (2); +INSERT INTO tmp2 values (3); +INSERT INTO tmp2 values (4); + +-- Insert rows into tmp3 +INSERT INTO tmp3 values (1,10); +INSERT INTO tmp3 values (1,20); +INSERT INTO tmp3 values (5,50); + +-- Try (and fail) to add constraint due to invalid data +ALTER TABLE tmp3 add constraint tmpconstr foreign key (a) references tmp2 match full; + +-- Delete failing row +DELETE FROM tmp3 where a=5; + +-- Try (and succeed) +ALTER TABLE tmp3 add constraint tmpconstr foreign key (a) references tmp2 match full; + +DROP TABLE tmp3 + +DROP TABLE tmp2 + diff --git a/src/test/regress/sql/run_check.tests b/src/test/regress/sql/run_check.tests index 33d8904237656ed46aca9492f2704f4912a1474e..8c832e016c441aa4590282186d36b9cf7e7586d3 100644 --- a/src/test/regress/sql/run_check.tests +++ b/src/test/regress/sql/run_check.tests @@ -119,6 +119,7 @@ parallel group5 test alter_table test portals_p2 test rules + test foreign_key endparallel # ---------- diff --git a/src/tools/pgcvslog b/src/tools/pgcvslog new file mode 100755 index 0000000000000000000000000000000000000000..c54177e81c684901e55091bfb78487a9d4d2df8e --- /dev/null +++ b/src/tools/pgcvslog @@ -0,0 +1,96 @@ +: +# This utility is used to generate a compact list of changes for each +# release, bjm 2000-02-22 + +# Usage $0 [-r 'revision pattern'] file + +# cvs log -d '>1999-06-14 00:00:00 GMT' > log +# pgcvslog -r '\.2\.[0-9]*$' log + +if [ "X$1" = "X-r" ] +then REV="$2" + shift 2 +else REV=".*" +fi + +cat "$@" | + +# mark each line with a datetime and line number, for sorting and merging +# we don't print anything from the -- or == line and the date: + +awk ' + $0 ~ /^Working file:/ {workingfile = $0} + + $1 == "revision" && $2 !~ /'"$REV"'/ {skip = "Y"} + + ($0 ~ /^====*$/ || $0 ~ /^----*$/) && skip == "N" \ + { + /* print blank line separating entries */ + if (datetime != "") + { + printf ("%s| %10d|%s\n", datetime, NR, ""); + printf ("%s| %10d|%s\n", datetime, NR, "---"); + printf ("%s| %10d|%s\n", datetime, NR+1, ""); + } + } + + $0 ~ /^====*$/ || $0 ~ /^----*$/ \ + { + datetime=""; + skip="N"; + } + + datetime != "" && skip == "N" \ + {printf ("%s| %10d| %s\n", datetime, NR, $0);} + + $1 == "date:" \ + { + /* get entry date */ + datetime=$2"-"$3 + if (workingfile != "" && skip == "N") + { + printf ("%s| %10d|%s\n", datetime, NR-1, workingfile); + printf ("%s| %10d|%s\n", datetime, NR, $0); + printf ("%s| %10d|%s\n", datetime, NR+1, ""); + } + } + + $0 ~ /^====*$/ {workingfile=""}' | + +sort | cut -d'|' -f3 | cat | + +# collect duplicate narratives +awk ' BEGIN { slot = 0;} + { + if ($0 ~ /^Working file:/) + { + if (slot != oldslot) + same = 0; + else + { + same = 1; + for (i=1; i <= slot; i++) + { + if (oldnarr[i] != narr[i]) + same = 0; + } + } + + if (oldslot && !same) + for (i=1; i <= oldslot; i++) + print oldnarr[i]; + for (i=1; i <= slot; i++) + oldnarr[i] = narr[i]; + oldslot = slot; + slot = 0; + print save_working; + save_working = $0; + } + else if ($1 != "date:") + narr[++slot] = $0; + } + END { + print save_working; + for (i=1; i <= slot; i++) + print narr[i]; + }'