Fix MOT table database dependency generation

This commit is contained in:
Vinoth Veeraraghavan
2020-09-15 18:30:14 +08:00
parent 5ed8dc1706
commit 6da0072c29
4 changed files with 13 additions and 7 deletions

View File

@ -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);
}
}

View File

@ -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;
}

View File

@ -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 */

View File

@ -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;