Fix MOT table database dependency generation
This commit is contained in:
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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 */
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user