|
6 | 6 | * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
|
7 | 7 | * Portions Copyright (c) 1994, Regents of the University of California
|
8 | 8 | *
|
9 |
| - *$Id: analyze.c,v 1.135 2000/02/04 18:49:32 wieck Exp $ |
| 9 | + *$Id: analyze.c,v 1.136 2000/02/05 00:20:38 wieck Exp $ |
10 | 10 | *
|
11 | 11 | *-------------------------------------------------------------------------
|
12 | 12 | */
|
@@ -967,11 +967,36 @@ transformCreateStmt(ParseState *pstate, CreateStmt *stmt)
|
967 | 967 |
|
968 | 968 | /*
|
969 | 969 | * If the attribute list for the referenced table was
|
970 |
| - * omitted, lookup for the definition of the primary key |
| 970 | + * omitted, lookup for the definition of the primary key. |
| 971 | + * If the referenced table is this table, use the definition |
| 972 | + * we found above, rather than looking to the system |
| 973 | + * tables. |
971 | 974 | *
|
972 | 975 | */
|
973 | 976 | if (fkconstraint->fk_attrs!=NIL&&fkconstraint->pk_attrs==NIL)
|
974 |
| -transformFkeyGetPrimaryKey(fkconstraint); |
| 977 | +if (strcmp(fkconstraint->pktable_name,stmt->relname)!=0) |
| 978 | +transformFkeyGetPrimaryKey(fkconstraint); |
| 979 | +elseif (pkey!=NULL) |
| 980 | +{ |
| 981 | +List*pkey_attr=pkey->indexParams; |
| 982 | +List*attr; |
| 983 | +IndexElem*ielem; |
| 984 | +Ident*pkattr; |
| 985 | + |
| 986 | +foreach (attr,pkey_attr) |
| 987 | +{ |
| 988 | +ielem=lfirst(attr); |
| 989 | +pkattr= (Ident*)makeNode(Ident); |
| 990 | +pkattr->name=pstrdup(ielem->name); |
| 991 | +pkattr->indirection=NIL; |
| 992 | +pkattr->isRel= false; |
| 993 | +fkconstraint->pk_attrs=lappend(fkconstraint->pk_attrs,pkattr); |
| 994 | +} |
| 995 | +} |
| 996 | +else { |
| 997 | +elog(ERROR,"PRIMARY KEY for referenced table \"%s\" not found", |
| 998 | +fkconstraint->pktable_name); |
| 999 | +} |
975 | 1000 |
|
976 | 1001 | /*
|
977 | 1002 | * Build a CREATE CONSTRAINT TRIGGER statement for the CHECK
|
|