Skip site navigation (1) Skip section navigation (2)

Peripheral Links

Header And Logo

PostgreSQL
| The world's most advanced open source database.

Site Navigation

Search archives
  Advanced Search

Implicit casts to text



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;
  


Home | Main Index | Thread Index

Privacy Policy | PostgreSQL Archives hosted by Command Prompt, Inc. | Designed by tinysofa
Copyright © 1996 – 2008 PostgreSQL Global Development Group