*** ./src/backend/commands/tablecmds.c.orig Wed Mar 3 09:18:19 2004 --- ./src/backend/commands/tablecmds.c Wed Mar 3 09:30:57 2004 *************** *** 3131,3141 **** * fktypoid[i] is the foreign key table's i'th element's type * pktypoid[i] is the primary key table's i'th element's type * ! * We let oper() do our work for us, including ereport(ERROR) if the ! * types don't compare with = */ ! Operator o = oper(makeList1(makeString("=")), ! fktypoid[i], pktypoid[i], false); ReleaseSysCache(o); } --- 3131,3154 ---- * fktypoid[i] is the foreign key table's i'th element's type * pktypoid[i] is the primary key table's i'th element's type * ! * First we try to find an inexpensive comparison =, ! * but there is no error if none is found. */ ! Operator o = compatible_oper(makeList1(makeString("=")), ! fktypoid[i], pktypoid[i], true); ! ! if (o == (Operator) NULL) ! { ! /* Now we let oper() do our work for us, including ereport(ERROR) ! * if the types don't compare with = ! */ ! o = oper(makeList1(makeString("=")), ! fktypoid[i], pktypoid[i], false); ! ! if (o != (Operator) NULL) ! ereport(NOTICE, (errmsg("costly cross-type foreign key: " ! "coercion needed"))); ! } ReleaseSysCache(o); } *** ./src/test/regress/expected/alter_table.out.orig Wed Mar 3 10:51:40 2004 --- ./src/test/regress/expected/alter_table.out Wed Mar 3 10:51:52 2004 *************** *** 206,213 **** --- 206,215 ---- DROP TABLE FKTABLE; CREATE TEMP TABLE FKTABLE (ftest1 varchar); ALTER TABLE FKTABLE ADD FOREIGN KEY(ftest1) references pktable; + NOTICE: costly cross-type foreign key: coercion needed -- As should this ALTER TABLE FKTABLE ADD FOREIGN KEY(ftest1) references pktable(ptest1); + NOTICE: costly cross-type foreign key: coercion needed DROP TABLE pktable cascade; NOTICE: drop cascades to constraint $2 on table fktable NOTICE: drop cascades to constraint $1 on table fktable *** ./src/test/regress/expected/foreign_key.out.orig Wed Mar 3 10:51:37 2004 --- ./src/test/regress/expected/foreign_key.out Wed Mar 3 10:51:49 2004 *************** *** 738,746 **** --- 738,748 ---- -- This should succeed, even though they are different types -- because varchar=int does exist CREATE TABLE FKTABLE (ftest1 varchar REFERENCES pktable); + NOTICE: costly cross-type foreign key: coercion needed DROP TABLE FKTABLE; -- As should this CREATE TABLE FKTABLE (ftest1 varchar REFERENCES pktable(ptest1)); + NOTICE: costly cross-type foreign key: coercion needed DROP TABLE FKTABLE; DROP TABLE PKTABLE; -- Two columns, two tables