mirror of https://github.com/citusdata/citus.git
Enable CREATE TABLE PARTITION OF syntax for distributed tables
parent
c594a056ae
commit
1f8c343d15
|
@ -78,9 +78,6 @@ static char LookupDistributionMethod(Oid distributionMethodOid);
|
|||
static Oid SupportFunctionForColumn(Var *partitionColumn, Oid accessMethodId,
|
||||
int16 supportFunctionNumber);
|
||||
static bool LocalTableEmpty(Oid tableId);
|
||||
static void CreateHashDistributedTable(Oid relationId, char *distributionColumnName,
|
||||
char *colocateWithTableName,
|
||||
int shardCount, int replicationFactor);
|
||||
static Oid ColumnType(Oid relationId, char *columnName);
|
||||
static void CopyLocalDataIntoShards(Oid destinationDistributedRelationId, List *
|
||||
sourceLocalRelationList);
|
||||
|
@ -618,7 +615,7 @@ CreateTruncateTrigger(Oid relationId)
|
|||
/*
|
||||
* CreateHashDistributedTable creates a hash distributed table.
|
||||
*/
|
||||
static void
|
||||
void
|
||||
CreateHashDistributedTable(Oid relationId, char *distributionColumnName,
|
||||
char *colocateWithTableName, int shardCount,
|
||||
int replicationFactor)
|
||||
|
|
|
@ -512,6 +512,41 @@ multi_ProcessUtility(PlannedStmt *pstmt,
|
|||
}
|
||||
}
|
||||
|
||||
#if (PG_VERSION_NUM >= 100000)
|
||||
if (IsA(parsetree, CreateStmt))
|
||||
{
|
||||
CreateStmt *createStatement = (CreateStmt *) parsetree;
|
||||
|
||||
/* if a partition is being created */
|
||||
if (createStatement->inhRelations != NIL && createStatement->partbound != NULL)
|
||||
{
|
||||
RangeVar *parentRelation = linitial(createStatement->inhRelations);
|
||||
char *parentSchemaName = parentRelation->schemaname ?
|
||||
parentRelation->schemaname : "public";
|
||||
|
||||
Oid parentId = get_relname_relid(parentRelation->relname, get_namespace_oid(
|
||||
parentSchemaName, false));
|
||||
char *schemaName = createStatement->relation->schemaname ?
|
||||
createStatement->relation->schemaname : "public";
|
||||
|
||||
Oid relationId = get_relname_relid(createStatement->relation->relname,
|
||||
get_namespace_oid(schemaName, false));
|
||||
|
||||
/* if the table is being attached to a distribtued table, it should be distributed as well */
|
||||
if (IsDistributedTable(parentId))
|
||||
{
|
||||
Var *parentPartitionKey = DistPartitionKey(parentId);
|
||||
char *parentPartitionKeyStr =
|
||||
get_relid_attribute_name(parentId,
|
||||
parentPartitionKey->varattno);
|
||||
|
||||
CreateHashDistributedTable(relationId, parentPartitionKeyStr,
|
||||
get_rel_name(parentId), 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* TODO: fold VACUUM's processing into the above block */
|
||||
if (IsA(parsetree, VacuumStmt))
|
||||
{
|
||||
|
|
|
@ -49,5 +49,9 @@ extern void deparse_shard_query(Query *query, Oid distrelid, int64 shardid,
|
|||
extern char * generate_relation_name(Oid relid, List *namespaces);
|
||||
extern char * generate_qualified_relation_name(Oid relid);
|
||||
|
||||
/* TODO: THIS SHOULD NOT BE HERE */
|
||||
extern void CreateHashDistributedTable(Oid relationId, char *distributionColumnName,
|
||||
char *colocateWithTableName,
|
||||
int shardCount, int replicationFactor);
|
||||
|
||||
#endif /* CITUS_RULEUTILS_H */
|
||||
|
|
|
@ -81,6 +81,55 @@ ORDER BY
|
|||
localhost | 57638 | 6
|
||||
(2 rows)
|
||||
|
||||
-- now create a partition and see that it also becomes a distributed table
|
||||
CREATE TABLE partitioning_test_2011 PARTITION OF partitioning_test FOR VALUES FROM ('2011-01-01') TO ('2012-01-01');
|
||||
SELECT
|
||||
*
|
||||
FROM
|
||||
pg_dist_partition
|
||||
WHERE
|
||||
logicalrelid IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010', 'partitioning_test_2011')
|
||||
ORDER BY 1;
|
||||
logicalrelid | partmethod | partkey | colocationid | repmodel
|
||||
------------------------+------------+------------------------------------------------------------------------------------------------------------------------+--------------+----------
|
||||
partitioning_test | h | {VAR :varno 1 :varattno 1 :vartype 23 :vartypmod -1 :varcollid 0 :varlevelsup 0 :varnoold 1 :varoattno 1 :location -1} | 2 | c
|
||||
partitioning_test_2009 | h | {VAR :varno 1 :varattno 1 :vartype 23 :vartypmod -1 :varcollid 0 :varlevelsup 0 :varnoold 1 :varoattno 1 :location -1} | 2 | c
|
||||
partitioning_test_2010 | h | {VAR :varno 1 :varattno 1 :vartype 23 :vartypmod -1 :varcollid 0 :varlevelsup 0 :varnoold 1 :varoattno 1 :location -1} | 2 | c
|
||||
partitioning_test_2011 | h | {VAR :varno 1 :varattno 1 :vartype 23 :vartypmod -1 :varcollid 0 :varlevelsup 0 :varnoold 1 :varoattno 1 :location -1} | 2 | c
|
||||
(4 rows)
|
||||
|
||||
SELECT
|
||||
logicalrelid, count(*)
|
||||
FROM pg_dist_shard
|
||||
WHERE logicalrelid IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010', 'partitioning_test_2011')
|
||||
GROUP BY
|
||||
logicalrelid
|
||||
ORDER BY
|
||||
1,2;
|
||||
logicalrelid | count
|
||||
------------------------+-------
|
||||
partitioning_test | 4
|
||||
partitioning_test_2009 | 4
|
||||
partitioning_test_2010 | 4
|
||||
partitioning_test_2011 | 4
|
||||
(4 rows)
|
||||
|
||||
SELECT
|
||||
nodename, nodeport, count(*)
|
||||
FROM
|
||||
pg_dist_shard_placement
|
||||
WHERE
|
||||
shardid IN (SELECT shardid FROM pg_dist_shard WHERE logicalrelid IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010', 'partitioning_test_2011') )
|
||||
GROUP BY
|
||||
nodename, nodeport
|
||||
ORDER BY
|
||||
1,2,3;
|
||||
nodename | nodeport | count
|
||||
-----------+----------+-------
|
||||
localhost | 57637 | 8
|
||||
localhost | 57638 | 8
|
||||
(2 rows)
|
||||
|
||||
-- dropping the parent should CASCADE to the children as well
|
||||
DROP TABLE partitioning_test;
|
||||
\d+ partitioning_test*
|
||||
|
|
|
@ -80,6 +80,45 @@ GROUP BY
|
|||
ORDER BY
|
||||
1,2,3;
|
||||
ERROR: relation "partitioning_test" does not exist
|
||||
LINE 6: ...shardid FROM pg_dist_shard WHERE logicalrelid IN ('partition...
|
||||
^
|
||||
-- now create a partition and see that it also becomes a distributed table
|
||||
CREATE TABLE partitioning_test_2011 PARTITION OF partitioning_test FOR VALUES FROM ('2011-01-01') TO ('2012-01-01');
|
||||
ERROR: syntax error at or near "PARTITION"
|
||||
LINE 1: CREATE TABLE partitioning_test_2011 PARTITION OF partitionin...
|
||||
^
|
||||
SELECT
|
||||
*
|
||||
FROM
|
||||
pg_dist_partition
|
||||
WHERE
|
||||
logicalrelid IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010', 'partitioning_test_2011')
|
||||
ORDER BY 1;
|
||||
ERROR: relation "partitioning_test" does not exist
|
||||
LINE 6: logicalrelid IN ('partitioning_test', 'partitioning_test_20...
|
||||
^
|
||||
SELECT
|
||||
logicalrelid, count(*)
|
||||
FROM pg_dist_shard
|
||||
WHERE logicalrelid IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010', 'partitioning_test_2011')
|
||||
GROUP BY
|
||||
logicalrelid
|
||||
ORDER BY
|
||||
1,2;
|
||||
ERROR: relation "partitioning_test" does not exist
|
||||
LINE 4: WHERE logicalrelid IN ('partitioning_test', 'partitioning_t...
|
||||
^
|
||||
SELECT
|
||||
nodename, nodeport, count(*)
|
||||
FROM
|
||||
pg_dist_shard_placement
|
||||
WHERE
|
||||
shardid IN (SELECT shardid FROM pg_dist_shard WHERE logicalrelid IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010', 'partitioning_test_2011') )
|
||||
GROUP BY
|
||||
nodename, nodeport
|
||||
ORDER BY
|
||||
1,2,3;
|
||||
ERROR: relation "partitioning_test" does not exist
|
||||
LINE 6: ...shardid FROM pg_dist_shard WHERE logicalrelid IN ('partition...
|
||||
^
|
||||
-- dropping the parent should CASCADE to the children as well
|
||||
|
|
|
@ -54,6 +54,37 @@ GROUP BY
|
|||
ORDER BY
|
||||
1,2,3;
|
||||
|
||||
-- now create a partition and see that it also becomes a distributed table
|
||||
CREATE TABLE partitioning_test_2011 PARTITION OF partitioning_test FOR VALUES FROM ('2011-01-01') TO ('2012-01-01');
|
||||
|
||||
SELECT
|
||||
*
|
||||
FROM
|
||||
pg_dist_partition
|
||||
WHERE
|
||||
logicalrelid IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010', 'partitioning_test_2011')
|
||||
ORDER BY 1;
|
||||
|
||||
SELECT
|
||||
logicalrelid, count(*)
|
||||
FROM pg_dist_shard
|
||||
WHERE logicalrelid IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010', 'partitioning_test_2011')
|
||||
GROUP BY
|
||||
logicalrelid
|
||||
ORDER BY
|
||||
1,2;
|
||||
|
||||
SELECT
|
||||
nodename, nodeport, count(*)
|
||||
FROM
|
||||
pg_dist_shard_placement
|
||||
WHERE
|
||||
shardid IN (SELECT shardid FROM pg_dist_shard WHERE logicalrelid IN ('partitioning_test', 'partitioning_test_2009', 'partitioning_test_2010', 'partitioning_test_2011') )
|
||||
GROUP BY
|
||||
nodename, nodeport
|
||||
ORDER BY
|
||||
1,2,3;
|
||||
|
||||
-- dropping the parent should CASCADE to the children as well
|
||||
DROP TABLE partitioning_test;
|
||||
|
||||
|
|
Loading…
Reference in New Issue