Do not drop and recreate materialized views while creating local table

velioglu/dont_drop_mat_view_alter_table
Burak Velioglu 2022-06-16 15:46:52 +03:00
parent 1ee3e8b7f4
commit 147a110917
3 changed files with 23 additions and 9 deletions

View File

@ -585,7 +585,7 @@ ConvertTable(TableConversionState *con)
postLoadCommands =
list_concat(postLoadCommands,
GetViewCreationTableDDLCommandsOfTable(con->relationId));
GetViewCreationTableDDLCommandsOfTable(con->relationId, true));
List *foreignKeyCommands = NIL;
if (con->conversionType == ALTER_DISTRIBUTED_TABLE)
@ -1354,7 +1354,7 @@ DoesCascadeDropUnsupportedObject(Oid classId, Oid objectId, HTAB *nodeMap)
* that recursively depend on the table too.
*/
List *
GetViewCreationCommandsOfTable(Oid relationId)
GetViewCreationCommandsOfTable(Oid relationId, bool includeMatViews)
{
List *views = GetDependingViews(relationId);
List *commands = NIL;
@ -1367,6 +1367,11 @@ GetViewCreationCommandsOfTable(Oid relationId)
/* See comments on CreateMaterializedViewDDLCommand for its limitations */
if (get_rel_relkind(viewOid) == RELKIND_MATVIEW)
{
if (!includeMatViews)
{
continue;
}
char *matViewCreateCommands = CreateMaterializedViewDDLCommand(viewOid);
appendStringInfoString(query, matViewCreateCommands);
}
@ -1391,9 +1396,9 @@ GetViewCreationCommandsOfTable(Oid relationId)
* but the returned list includes objects of TableDDLCommand's, not strings.
*/
List *
GetViewCreationTableDDLCommandsOfTable(Oid relationId)
GetViewCreationTableDDLCommandsOfTable(Oid relationId, bool includeMatViews)
{
List *commands = GetViewCreationCommandsOfTable(relationId);
List *commands = GetViewCreationCommandsOfTable(relationId, includeMatViews);
List *tableDDLCommands = NIL;
char *command = NULL;

View File

@ -330,7 +330,7 @@ CreateCitusLocalTable(Oid relationId, bool cascadeViaForeignKeys, bool autoConve
EnsureReferenceTablesExistOnAllNodes();
List *shellTableDDLEvents = GetShellTableDDLEventsForCitusLocalTable(relationId);
List *tableViewCreationCommands = GetViewCreationCommandsOfTable(relationId);
List *tableViewCreationCommands = GetViewCreationCommandsOfTable(relationId, false);
char *relationName = get_rel_name(relationId);
Oid relationSchemaId = get_rel_namespace(relationId);
@ -1053,8 +1053,16 @@ DropViewsOnTable(Oid relationId)
char *qualifiedViewName = quote_qualified_identifier(schemaName, viewName);
StringInfo dropCommand = makeStringInfo();
appendStringInfo(dropCommand, "DROP VIEW IF EXISTS %s",
qualifiedViewName);
if (get_rel_relkind(viewId) == RELKIND_MATVIEW)
{
/*
* Since materialized views are not supported with Citus right now,
* skip them
*/
continue;
}
appendStringInfo(dropCommand, "DROP VIEW IF EXISTS %s", qualifiedViewName);
ExecuteAndLogUtilityCommand(dropCommand->data);
}

View File

@ -564,8 +564,9 @@ extern ObjectAddress AlterViewStmtObjectAddress(Node *node, bool missing_ok);
extern List * PreprocessDropViewStmt(Node *node, const char *queryString,
ProcessUtilityContext processUtilityContext);
extern char * CreateViewDDLCommand(Oid viewOid);
extern List * GetViewCreationCommandsOfTable(Oid relationId);
extern List * GetViewCreationTableDDLCommandsOfTable(Oid relationId);
extern List * GetViewCreationCommandsOfTable(Oid relationId, bool includeMatViews);
extern List * GetViewCreationTableDDLCommandsOfTable(Oid relationId, bool
includeMatViews);
extern char * AlterViewOwnerCommand(Oid viewOid);
extern char * DeparseViewStmt(Node *node);
extern char * DeparseDropViewStmt(Node *node);