diff --git a/src/common/backend/catalog/pg_shdepend.cpp b/src/common/backend/catalog/pg_shdepend.cpp index a8fe88d45..69486b68c 100755 --- a/src/common/backend/catalog/pg_shdepend.cpp +++ b/src/common/backend/catalog/pg_shdepend.cpp @@ -40,7 +40,6 @@ #include "catalog/pg_tablespace.h" #include "catalog/pg_ts_dict.h" #include "catalog/pg_type.h" -#include "catalog/pg_foreign_table.h" #include "commands/dbcommands.h" #include "commands/collationcmds.h" #include "commands/conversioncmds.h" @@ -98,7 +97,7 @@ void recordSharedDependencyOn( /* * Objects in pg_shdepend can't have SubIds. */ - Assert(depender->classId == ForeignTableRelationId || depender->objectSubId == 0); + Assert(deptype == SHARED_DEPENDENCY_MOT_TABLE || depender->objectSubId == 0); Assert(referenced->objectSubId == 0); /* @@ -160,7 +159,7 @@ void recordDependencyOnDatabase(Oid classId, Oid objectId, Oid serverId, Oid dat referenced.objectId = database; referenced.objectSubId = 0; - recordSharedDependencyOn(&myself, &referenced, SHARED_DEPENDENCY_OWNER, objfile); + recordSharedDependencyOn(&myself, &referenced, SHARED_DEPENDENCY_MOT_TABLE, objfile); } /* @@ -764,7 +763,7 @@ void dropDatabaseDependencies(Oid databaseId) while (HeapTupleIsValid(tup = systable_getnext(scan))) { Form_pg_shdepend shdepForm = (Form_pg_shdepend)GETSTRUCT(tup); - if (shdepForm->classid == ForeignTableRelationId && shdepForm->objsubid != 0) { + if (shdepForm->deptype == SHARED_DEPENDENCY_MOT_TABLE && shdepForm->objsubid != 0) { FdwRoutine* fdwRoutine = GetFdwRoutineByServerId(shdepForm->objsubid); /* forward drop stmt to fdw */ if (fdwRoutine != NULL && fdwRoutine->GetFdwType != NULL && @@ -774,6 +773,7 @@ void dropDatabaseDependencies(Oid databaseId) stmt.relkind = RELKIND_RELATION; stmt.reloid = shdepForm->objid; stmt.indexoid = 0; + stmt.name = "#FROM DROP DB#"; fdwRoutine->ValidateTableDef((Node*)&stmt); } } diff --git a/src/common/backend/pgxc_single/nodemgr/groupmgr.cpp b/src/common/backend/pgxc_single/nodemgr/groupmgr.cpp index 20a086b9d..c723e5f44 100644 --- a/src/common/backend/pgxc_single/nodemgr/groupmgr.cpp +++ b/src/common/backend/pgxc_single/nodemgr/groupmgr.cpp @@ -927,7 +927,9 @@ static List* PgxcGetRelationRoleList() shdepend = (Form_pg_shdepend)GETSTRUCT(tuple); if ((shdepend->classid != RelationRelationId && shdepend->classid != NamespaceRelationId && shdepend->classid != ProcedureRelationId) || - (shdepend->deptype != SHARED_DEPENDENCY_OWNER && shdepend->deptype != SHARED_DEPENDENCY_ACL)) { + (shdepend->deptype != SHARED_DEPENDENCY_OWNER && + shdepend->deptype != SHARED_DEPENDENCY_ACL && + shdepend->deptype != SHARED_DEPENDENCY_MOT_TABLE)) { tuple = heap_getnext(scan, ForwardScanDirection); continue; } diff --git a/src/gausskernel/optimizer/commands/foreigncmds.cpp b/src/gausskernel/optimizer/commands/foreigncmds.cpp index 62cf24b5d..3ee850e7f 100755 --- a/src/gausskernel/optimizer/commands/foreigncmds.cpp +++ b/src/gausskernel/optimizer/commands/foreigncmds.cpp @@ -1887,8 +1887,8 @@ void CreateForeignTable(CreateForeignTableStmt* stmt, Oid relid) referenced.objectSubId = 0; recordDependencyOn(&myself, &referenced, DEPENDENCY_NORMAL); - //For external lookup when drop database - recordDependencyOnDatabase(ForeignTableRelationId, relid, server->serverid, u_sess->proc_cxt.MyDatabaseId); + // For external lookup when drop database + recordDependencyOnDatabase(RelationRelationId, relid, server->serverid, u_sess->proc_cxt.MyDatabaseId); if (errortableOid != InvalidOid) { /* Add dependency on error info table */ diff --git a/src/include/catalog/dependency.h b/src/include/catalog/dependency.h index 3a46fcf84..3ee3211e3 100644 --- a/src/include/catalog/dependency.h +++ b/src/include/catalog/dependency.h @@ -120,6 +120,9 @@ struct ObjectAddresses { * is the role mentioned in a policy object. The referenced object must be a * pg_authid entry. * + * (m) a SHARED_DEPENDENCY_MOT_TABLE entry means that the referenced object + * is the database holding FDW table. The dependent object must be a FDW table entry. + * * SHARED_DEPENDENCY_INVALID is a value used as a parameter in internal * routines, and is not valid in the catalog itself. */ @@ -128,6 +131,7 @@ typedef enum SharedDependencyType { SHARED_DEPENDENCY_OWNER = 'o', SHARED_DEPENDENCY_ACL = 'a', SHARED_DEPENDENCY_RLSPOLICY = 'r', + SHARED_DEPENDENCY_MOT_TABLE = 'm', SHARED_DEPENDENCY_INVALID = 0 } SharedDependencyType;