The attached patch changes all implicit casts to text to assignment and cleans up the associated regression test damage. This change has been discussed for the longest time; I propose that we bite the bullet and do it now.
The issue described in <http://archives.postgresql.org/pgsql-hackers/2007-02/msg01729.php> should also be fixed but can be considered separately later. -- Peter Eisentraut http://developer.postgresql.org/~petere/
diff -cr ../cvs-pgsql/src/include/catalog/pg_cast.h ./src/include/catalog/pg_cast.h *** ../cvs-pgsql/src/include/catalog/pg_cast.h 2007-02-03 15:06:55.000000000 +0100 --- ./src/include/catalog/pg_cast.h 2007-04-01 22:26:13.000000000 +0200 *************** *** 264,304 **** /* * Cross-category casts to and from TEXT - * - * For historical reasons, most casts to TEXT are implicit. This is BAD - * and should be reined in. */ ! DATA(insert ( 20 25 1289 i )); DATA(insert ( 25 20 1290 e )); ! DATA(insert ( 21 25 113 i )); DATA(insert ( 25 21 818 e )); ! DATA(insert ( 23 25 112 i )); DATA(insert ( 25 23 819 e )); ! DATA(insert ( 26 25 114 i )); DATA(insert ( 25 26 817 e )); DATA(insert ( 25 650 1714 e )); ! DATA(insert ( 700 25 841 i )); DATA(insert ( 25 700 839 e )); ! DATA(insert ( 701 25 840 i )); DATA(insert ( 25 701 838 e )); DATA(insert ( 829 25 752 e )); DATA(insert ( 25 829 767 e )); DATA(insert ( 650 25 730 e )); DATA(insert ( 869 25 730 e )); DATA(insert ( 25 869 1713 e )); ! DATA(insert ( 1082 25 749 i )); DATA(insert ( 25 1082 748 e )); ! DATA(insert ( 1083 25 948 i )); DATA(insert ( 25 1083 837 e )); ! DATA(insert ( 1114 25 2034 i )); DATA(insert ( 25 1114 2022 e )); ! DATA(insert ( 1184 25 1192 i )); DATA(insert ( 25 1184 1191 e )); ! DATA(insert ( 1186 25 1193 i )); DATA(insert ( 25 1186 1263 e )); ! DATA(insert ( 1266 25 939 i )); DATA(insert ( 25 1266 938 e )); ! DATA(insert ( 1700 25 1688 i )); DATA(insert ( 25 1700 1686 e )); DATA(insert ( 142 25 2922 e )); DATA(insert ( 25 142 2896 e )); --- 264,301 ---- /* * Cross-category casts to and from TEXT */ ! DATA(insert ( 20 25 1289 a )); DATA(insert ( 25 20 1290 e )); ! DATA(insert ( 21 25 113 a )); DATA(insert ( 25 21 818 e )); ! DATA(insert ( 23 25 112 a )); DATA(insert ( 25 23 819 e )); ! DATA(insert ( 26 25 114 a )); DATA(insert ( 25 26 817 e )); DATA(insert ( 25 650 1714 e )); ! DATA(insert ( 700 25 841 a )); DATA(insert ( 25 700 839 e )); ! DATA(insert ( 701 25 840 a )); DATA(insert ( 25 701 838 e )); DATA(insert ( 829 25 752 e )); DATA(insert ( 25 829 767 e )); DATA(insert ( 650 25 730 e )); DATA(insert ( 869 25 730 e )); DATA(insert ( 25 869 1713 e )); ! DATA(insert ( 1082 25 749 a )); DATA(insert ( 25 1082 748 e )); ! DATA(insert ( 1083 25 948 a )); DATA(insert ( 25 1083 837 e )); ! DATA(insert ( 1114 25 2034 a )); DATA(insert ( 25 1114 2022 e )); ! DATA(insert ( 1184 25 1192 a )); DATA(insert ( 25 1184 1191 e )); ! DATA(insert ( 1186 25 1193 a )); DATA(insert ( 25 1186 1263 e )); ! DATA(insert ( 1266 25 939 a )); DATA(insert ( 25 1266 938 e )); ! DATA(insert ( 1700 25 1688 a )); DATA(insert ( 25 1700 1686 e )); DATA(insert ( 142 25 2922 e )); DATA(insert ( 25 142 2896 e )); *************** *** 306,312 **** /* * Cross-category casts to and from VARCHAR * ! * We support all the same casts as for TEXT, but none are implicit. */ DATA(insert ( 20 1043 1289 a )); DATA(insert ( 1043 20 1290 e )); --- 303,309 ---- /* * Cross-category casts to and from VARCHAR * ! * We support all the same casts as for TEXT. */ DATA(insert ( 20 1043 1289 a )); DATA(insert ( 1043 20 1290 e )); diff -cr ../cvs-pgsql/src/test/regress/expected/foreign_key.out ./src/test/regress/expected/foreign_key.out *** ../cvs-pgsql/src/test/regress/expected/foreign_key.out 2007-02-14 19:35:53.000000000 +0100 --- ./src/test/regress/expected/foreign_key.out 2007-04-01 22:45:19.000000000 +0200 *************** *** 1125,1134 **** FOREIGN KEY (x3) REFERENCES pktable(id1); ERROR: foreign key constraint "fk_3_1" cannot be implemented DETAIL: Key columns "x3" and "id1" are of incompatible types: real and integer. ! -- should succeed ! -- int4 promotes to text, so this is allowed (though pretty durn debatable) ALTER TABLE fktable ADD CONSTRAINT fk_1_2 FOREIGN KEY (x1) REFERENCES pktable(id2); -- int4 promotes to real ALTER TABLE fktable ADD CONSTRAINT fk_1_3 FOREIGN KEY (x1) REFERENCES pktable(id3); --- 1125,1136 ---- FOREIGN KEY (x3) REFERENCES pktable(id1); ERROR: foreign key constraint "fk_3_1" cannot be implemented DETAIL: Key columns "x3" and "id1" are of incompatible types: real and integer. ! -- int4 does not promote to text ALTER TABLE fktable ADD CONSTRAINT fk_1_2 FOREIGN KEY (x1) REFERENCES pktable(id2); + ERROR: foreign key constraint "fk_1_2" cannot be implemented + DETAIL: Key columns "x1" and "id2" are of incompatible types: integer and character varying. + -- should succeed -- int4 promotes to real ALTER TABLE fktable ADD CONSTRAINT fk_1_3 FOREIGN KEY (x1) REFERENCES pktable(id3); *************** *** 1150,1156 **** ALTER TABLE fktable ADD CONSTRAINT fk_123_231 FOREIGN KEY (x1,x2,x3) REFERENCES pktable(id2,id3,id1); ERROR: foreign key constraint "fk_123_231" cannot be implemented ! DETAIL: Key columns "x2" and "id3" are of incompatible types: character varying and real. ALTER TABLE fktable ADD CONSTRAINT fk_241_132 FOREIGN KEY (x2,x4,x1) REFERENCES pktable(id1,id3,id2); ERROR: foreign key constraint "fk_241_132" cannot be implemented --- 1152,1158 ---- ALTER TABLE fktable ADD CONSTRAINT fk_123_231 FOREIGN KEY (x1,x2,x3) REFERENCES pktable(id2,id3,id1); ERROR: foreign key constraint "fk_123_231" cannot be implemented ! DETAIL: Key columns "x1" and "id2" are of incompatible types: integer and character varying. ALTER TABLE fktable ADD CONSTRAINT fk_241_132 FOREIGN KEY (x2,x4,x1) REFERENCES pktable(id1,id3,id2); ERROR: foreign key constraint "fk_241_132" cannot be implemented *************** *** 1162,1168 **** NOTICE: drop cascades to constraint fk_5_1 on table fktable NOTICE: drop cascades to constraint fktable_x1_fkey on table fktable NOTICE: drop cascades to constraint fk_4_2 on table fktable - NOTICE: drop cascades to constraint fk_1_2 on table fktable NOTICE: drop cascades to constraint fktable_x2_fkey on table fktable NOTICE: drop cascades to constraint fk_1_3 on table fktable NOTICE: drop cascades to constraint fktable_x3_fkey on table fktable --- 1164,1169 ---- diff -cr ../cvs-pgsql/src/test/regress/expected/strings.out ./src/test/regress/expected/strings.out *** ../cvs-pgsql/src/test/regress/expected/strings.out 2007-03-25 17:24:15.000000000 +0200 --- ./src/test/regress/expected/strings.out 2007-04-01 22:34:16.000000000 +0200 *************** *** 450,456 **** t (1 row) ! SELECT POSITION(5 IN '1234567890') = '5' AS "5"; 5 --- t --- 450,456 ---- t (1 row) ! SELECT POSITION('5' IN '1234567890') = '5' AS "5"; 5 --- t diff -cr ../cvs-pgsql/src/test/regress/expected/subselect.out ./src/test/regress/expected/subselect.out *** ../cvs-pgsql/src/test/regress/expected/subselect.out 2005-12-03 22:30:52.000000000 +0100 --- ./src/test/regress/expected/subselect.out 2007-04-01 22:40:52.000000000 +0200 *************** *** 354,360 **** insert into shipped values('wt', new.ordnum, new.partnum, new.value); insert into parts (partnum, cost) values (1, 1234.56); insert into shipped_view (ordnum, partnum, value) ! values (0, 1, (select cost from parts where partnum = 1)); select * from shipped_view; ttype | ordnum | partnum | value -------+--------+---------+--------- --- 354,360 ---- insert into shipped values('wt', new.ordnum, new.partnum, new.value); insert into parts (partnum, cost) values (1, 1234.56); insert into shipped_view (ordnum, partnum, value) ! values (0, 1, (select cost from parts where partnum = '1')); select * from shipped_view; ttype | ordnum | partnum | value -------+--------+---------+--------- diff -cr ../cvs-pgsql/src/test/regress/sql/foreign_key.sql ./src/test/regress/sql/foreign_key.sql *** ../cvs-pgsql/src/test/regress/sql/foreign_key.sql 2007-02-14 19:35:53.000000000 +0100 --- ./src/test/regress/sql/foreign_key.sql 2007-04-01 22:42:58.000000000 +0200 *************** *** 760,771 **** ALTER TABLE fktable ADD CONSTRAINT fk_3_1 FOREIGN KEY (x3) REFERENCES pktable(id1); ! -- should succeed ! ! -- int4 promotes to text, so this is allowed (though pretty durn debatable) ALTER TABLE fktable ADD CONSTRAINT fk_1_2 FOREIGN KEY (x1) REFERENCES pktable(id2); -- int4 promotes to real ALTER TABLE fktable ADD CONSTRAINT fk_1_3 FOREIGN KEY (x1) REFERENCES pktable(id3); --- 760,771 ---- ALTER TABLE fktable ADD CONSTRAINT fk_3_1 FOREIGN KEY (x3) REFERENCES pktable(id1); ! -- int4 does not promote to text ALTER TABLE fktable ADD CONSTRAINT fk_1_2 FOREIGN KEY (x1) REFERENCES pktable(id2); + -- should succeed + -- int4 promotes to real ALTER TABLE fktable ADD CONSTRAINT fk_1_3 FOREIGN KEY (x1) REFERENCES pktable(id3); diff -cr ../cvs-pgsql/src/test/regress/sql/strings.sql ./src/test/regress/sql/strings.sql *** ../cvs-pgsql/src/test/regress/sql/strings.sql 2007-03-25 17:24:17.000000000 +0200 --- ./src/test/regress/sql/strings.sql 2007-04-01 22:32:23.000000000 +0200 *************** *** 142,148 **** -- E021-11 position expression SELECT POSITION('4' IN '1234567890') = '4' AS "4"; ! SELECT POSITION(5 IN '1234567890') = '5' AS "5"; -- T312 character overlay function SELECT OVERLAY('abcdef' PLACING '45' FROM 4) AS "abc45f"; --- 142,148 ---- -- E021-11 position expression SELECT POSITION('4' IN '1234567890') = '4' AS "4"; ! SELECT POSITION('5' IN '1234567890') = '5' AS "5"; -- T312 character overlay function SELECT OVERLAY('abcdef' PLACING '45' FROM 4) AS "abc45f"; diff -cr ../cvs-pgsql/src/test/regress/sql/subselect.sql ./src/test/regress/sql/subselect.sql *** ../cvs-pgsql/src/test/regress/sql/subselect.sql 2005-12-03 22:30:52.000000000 +0100 --- ./src/test/regress/sql/subselect.sql 2007-04-01 22:39:05.000000000 +0200 *************** *** 218,224 **** insert into parts (partnum, cost) values (1, 1234.56); insert into shipped_view (ordnum, partnum, value) ! values (0, 1, (select cost from parts where partnum = 1)); select * from shipped_view; --- 218,224 ---- insert into parts (partnum, cost) values (1, 1234.56); insert into shipped_view (ordnum, partnum, value) ! values (0, 1, (select cost from parts where partnum = '1')); select * from shipped_view;
---------------------------(end of broadcast)--------------------------- TIP 7: You can help support the PostgreSQL project by donating at http://www.postgresql.org/about/donate