mirror of https://github.com/citusdata/citus.git
Disable ALTER TABLE .. SET SCHEMA for tenant tables (#6973)
Disables `ALTER TABLE .. SET SCHEMA` for tenant tables. Disables `ALTER TABLE .. SET SCHEMA` for tenant schemas.pull/6976/head^2
parent
3f7bc0cbf5
commit
8d8968ae63
|
@ -258,3 +258,20 @@ ErrorIfTenantTable(Oid relationId, char *operationName)
|
||||||
operationName)));
|
operationName)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ErrorIfTenantSchema errors out with the given operation name,
|
||||||
|
* if the given schema is a tenant schema.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
ErrorIfTenantSchema(Oid nspOid, char *operationName)
|
||||||
|
{
|
||||||
|
if (IsTenantSchema(nspOid))
|
||||||
|
{
|
||||||
|
ereport(ERROR, (errmsg(
|
||||||
|
"%s is not allowed for %s because it is a distributed schema",
|
||||||
|
get_namespace_name(nspOid),
|
||||||
|
operationName)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -2293,6 +2293,10 @@ PreprocessAlterTableSchemaStmt(Node *node, const char *queryString,
|
||||||
return NIL;
|
return NIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ErrorIfTenantTable(relationId, "ALTER TABLE SET SCHEMA");
|
||||||
|
ErrorIfTenantSchema(get_namespace_oid(stmt->newschema, false),
|
||||||
|
"ALTER TABLE SET SCHEMA");
|
||||||
|
|
||||||
DDLJob *ddlJob = palloc0(sizeof(DDLJob));
|
DDLJob *ddlJob = palloc0(sizeof(DDLJob));
|
||||||
QualifyTreeNode((Node *) stmt);
|
QualifyTreeNode((Node *) stmt);
|
||||||
ObjectAddressSet(ddlJob->targetObjectAddress, RelationRelationId, relationId);
|
ObjectAddressSet(ddlJob->targetObjectAddress, RelationRelationId, relationId);
|
||||||
|
|
|
@ -790,5 +790,6 @@ extern void ErrorIfIllegalPartitioningInTenantSchema(Oid parentRelationId,
|
||||||
Oid partitionRelationId);
|
Oid partitionRelationId);
|
||||||
extern void CreateTenantSchemaTable(Oid relationId);
|
extern void CreateTenantSchemaTable(Oid relationId);
|
||||||
extern void ErrorIfTenantTable(Oid relationId, char *operationName);
|
extern void ErrorIfTenantTable(Oid relationId, char *operationName);
|
||||||
|
extern void ErrorIfTenantSchema(Oid nspOid, char *operationName);
|
||||||
|
|
||||||
#endif /*CITUS_COMMANDS_H */
|
#endif /*CITUS_COMMANDS_H */
|
||||||
|
|
|
@ -89,6 +89,15 @@ ERROR: tenant_2.test_table is not allowed for alter_distributed_table because i
|
||||||
-- verify we also don't allow colocate_with a tenant table
|
-- verify we also don't allow colocate_with a tenant table
|
||||||
SELECT alter_distributed_table('regular_schema.test_table', colocate_with => 'tenant_2.test_table');
|
SELECT alter_distributed_table('regular_schema.test_table', colocate_with => 'tenant_2.test_table');
|
||||||
ERROR: tenant_2.test_table is not allowed for colocate_with because it is a tenant table
|
ERROR: tenant_2.test_table is not allowed for colocate_with because it is a tenant table
|
||||||
|
-- verify we don't allow ALTER TABLE SET SCHEMA for tenant tables
|
||||||
|
ALTER TABLE tenant_2.test_table SET SCHEMA regular_schema;
|
||||||
|
ERROR: tenant_2.test_table is not allowed for ALTER TABLE SET SCHEMA because it is a tenant table
|
||||||
|
-- verify we don't allow ALTER TABLE SET SCHEMA for tenant schemas
|
||||||
|
ALTER TABLE regular_schema.test_table SET SCHEMA tenant_2;
|
||||||
|
ERROR: tenant_2 is not allowed for ALTER TABLE SET SCHEMA because it is a distributed schema
|
||||||
|
-- the same, from tenant schema to tenant schema
|
||||||
|
ALTER TABLE tenant_2.test_table SET SCHEMA tenant_3;
|
||||||
|
ERROR: tenant_2.test_table is not allowed for ALTER TABLE SET SCHEMA because it is a tenant table
|
||||||
-- (on coordinator) verify that colocation id is set for empty tenants too
|
-- (on coordinator) verify that colocation id is set for empty tenants too
|
||||||
SELECT colocationid > 0 FROM pg_dist_tenant_schema
|
SELECT colocationid > 0 FROM pg_dist_tenant_schema
|
||||||
WHERE schemaid::regnamespace::text IN ('tenant_1', 'tenant_3');
|
WHERE schemaid::regnamespace::text IN ('tenant_1', 'tenant_3');
|
||||||
|
|
|
@ -65,6 +65,12 @@ SELECT undistribute_table('tenant_2.test_table');
|
||||||
SELECT alter_distributed_table('tenant_2.test_table', colocate_with => 'none');
|
SELECT alter_distributed_table('tenant_2.test_table', colocate_with => 'none');
|
||||||
-- verify we also don't allow colocate_with a tenant table
|
-- verify we also don't allow colocate_with a tenant table
|
||||||
SELECT alter_distributed_table('regular_schema.test_table', colocate_with => 'tenant_2.test_table');
|
SELECT alter_distributed_table('regular_schema.test_table', colocate_with => 'tenant_2.test_table');
|
||||||
|
-- verify we don't allow ALTER TABLE SET SCHEMA for tenant tables
|
||||||
|
ALTER TABLE tenant_2.test_table SET SCHEMA regular_schema;
|
||||||
|
-- verify we don't allow ALTER TABLE SET SCHEMA for tenant schemas
|
||||||
|
ALTER TABLE regular_schema.test_table SET SCHEMA tenant_2;
|
||||||
|
-- the same, from tenant schema to tenant schema
|
||||||
|
ALTER TABLE tenant_2.test_table SET SCHEMA tenant_3;
|
||||||
|
|
||||||
-- (on coordinator) verify that colocation id is set for empty tenants too
|
-- (on coordinator) verify that colocation id is set for empty tenants too
|
||||||
SELECT colocationid > 0 FROM pg_dist_tenant_schema
|
SELECT colocationid > 0 FROM pg_dist_tenant_schema
|
||||||
|
|
Loading…
Reference in New Issue