Disallow adding local table with identity column to metadata (#4633)

pg_get_tableschemadef_string doesn't know how to deparse identity
columns so we cannot reflect those columns when creating shell
relation.
For this reason, we don't allow adding local tables -having identity cols-
to metadata.
pull/4635/head
Onur Tirtir 2021-02-03 19:05:17 +03:00 committed by GitHub
parent 5efb742f8a
commit 3a403090fd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 52 additions and 2 deletions

View File

@ -49,6 +49,7 @@ static void citus_add_local_table_to_metadata_internal(Oid relationId,
bool cascadeViaForeignKeys);
static void ErrorIfUnsupportedCreateCitusLocalTable(Relation relation);
static void ErrorIfUnsupportedCitusLocalTableKind(Oid relationId);
static void ErrorIfUnsupportedCitusLocalColumnDefinition(Relation relation);
static List * GetShellTableDDLEventsForCitusLocalTable(Oid relationId);
static uint64 ConvertLocalTableToShard(Oid relationId);
static void RenameRelationToShardRelation(Oid shellRelationId, uint64 shardId);
@ -338,6 +339,7 @@ ErrorIfUnsupportedCreateCitusLocalTable(Relation relation)
ErrorIfCoordinatorNotAddedAsWorkerNode();
ErrorIfUnsupportedCitusLocalTableKind(relationId);
EnsureTableNotDistributed(relationId);
ErrorIfUnsupportedCitusLocalColumnDefinition(relation);
/*
* When creating other citus table types, we don't need to check that case as
@ -405,6 +407,30 @@ ErrorIfUnsupportedCitusLocalTableKind(Oid relationId)
}
/*
* ErrorIfUnsupportedCitusLocalColumnDefinition errors out if given relation
* has unsupported column definition for citus local table creation.
*/
static void
ErrorIfUnsupportedCitusLocalColumnDefinition(Relation relation)
{
TupleDesc relationDesc = RelationGetDescr(relation);
if (RelationUsesIdentityColumns(relationDesc))
{
/*
* pg_get_tableschemadef_string doesn't know how to deparse identity
* columns so we cannot reflect those columns when creating shell
* relation. For this reason, error out here.
*/
Oid relationId = relation->rd_id;
ereport(ERROR, (errmsg("cannot add %s to citus metadata since table "
"has identity column",
generate_qualified_relation_name(relationId)),
errhint("Drop the identity columns and re-try the command")));
}
}
/*
* GetShellTableDDLEventsForCitusLocalTable returns a list of DDL commands
* to create the shell table from scratch.

View File

@ -122,7 +122,6 @@ static void DropFKeysRelationInvolvedWithTableType(Oid relationId, int tableType
static bool LocalTableEmpty(Oid tableId);
static void CopyLocalDataIntoShards(Oid relationId);
static List * TupleDescColumnNameList(TupleDesc tupleDescriptor);
static bool RelationUsesIdentityColumns(TupleDesc relationDesc);
static bool DistributionColumnUsesGeneratedStoredColumn(TupleDesc relationDesc,
Var *distributionColumn);
static bool CanUseExclusiveConnections(Oid relationId, bool localTableEmpty);
@ -1636,7 +1635,7 @@ TupleDescColumnNameList(TupleDesc tupleDescriptor)
* RelationUsesIdentityColumns returns whether a given relation uses
* GENERATED ... AS IDENTITY
*/
static bool
bool
RelationUsesIdentityColumns(TupleDesc relationDesc)
{
for (int attributeIndex = 0; attributeIndex < relationDesc->natts; attributeIndex++)

View File

@ -249,6 +249,7 @@ extern void EnsureTableNotDistributed(Oid relationId);
extern void EnsureReplicationSettings(Oid relationId, char replicationModel);
extern void EnsureRelationExists(Oid relationId);
extern bool RegularTable(Oid relationId);
extern bool RelationUsesIdentityColumns(TupleDesc relationDesc);
extern char * ConstructQualifiedShardName(ShardInterval *shardInterval);
extern uint64 GetFirstShardId(Oid relationId);
extern Datum StringToDatum(char *inputString, Oid dataType);

View File

@ -56,6 +56,18 @@ BEGIN;
SELECT citus_add_local_table_to_metadata('temp_table');
ERROR: constraints on temporary tables may reference only temporary tables
ROLLBACK;
-- below two errors out since we don't support adding local tables
-- having any identity columns to metadata
BEGIN;
CREATE TABLE identity_cols_test (a int generated by default as identity (start with 42));
SELECT citus_add_local_table_to_metadata('identity_cols_test');
ERROR: cannot add citus_local_tables_test_schema.identity_cols_test to citus metadata since table has identity column
ROLLBACK;
BEGIN;
CREATE TABLE identity_cols_test (a int generated always as identity (increment by 42));
SELECT citus_add_local_table_to_metadata('identity_cols_test');
ERROR: cannot add citus_local_tables_test_schema.identity_cols_test to citus metadata since table has identity column
ROLLBACK;
-- creating citus local table having no data initially would work
SELECT citus_add_local_table_to_metadata('citus_local_table_1');
citus_add_local_table_to_metadata

View File

@ -46,6 +46,18 @@ BEGIN;
SELECT citus_add_local_table_to_metadata('temp_table');
ROLLBACK;
-- below two errors out since we don't support adding local tables
-- having any identity columns to metadata
BEGIN;
CREATE TABLE identity_cols_test (a int generated by default as identity (start with 42));
SELECT citus_add_local_table_to_metadata('identity_cols_test');
ROLLBACK;
BEGIN;
CREATE TABLE identity_cols_test (a int generated always as identity (increment by 42));
SELECT citus_add_local_table_to_metadata('identity_cols_test');
ROLLBACK;
-- creating citus local table having no data initially would work
SELECT citus_add_local_table_to_metadata('citus_local_table_1');