List *constraintList);
static void transformColumnType(CreateStmtContext *cxt, ColumnDef *column);
static void setSchemaName(char *context_schema, char **stmt_schema_name);
-static void transformAttachPartition(CreateStmtContext *cxt, PartitionCmd *cmd);
+static void transformPartitionCmd(CreateStmtContext *cxt, PartitionCmd *cmd);
/*
}
case AT_AttachPartition:
+ case AT_DetachPartition:
{
PartitionCmd *partcmd = (PartitionCmd *) cmd->def;
- transformAttachPartition(&cxt, partcmd);
-
- /* assign transformed values */
+ transformPartitionCmd(&cxt, partcmd);
+ /* assign transformed value of the partition bound */
partcmd->bound = cxt.partbound;
}
}
/*
- * transformAttachPartition
- * Analyze ATTACH PARTITION ... FOR VALUES ...
+ * transformPartitionCmd
+ * Analyze the ATTACH/DETACH PARTITION command
+ *
+ * In case of the ATTACH PARTITION command, cxt->partbound is set to the
+ * transformed value of cmd->bound.
*/
static void
-transformAttachPartition(CreateStmtContext *cxt, PartitionCmd *cmd)
+transformPartitionCmd(CreateStmtContext *cxt, PartitionCmd *cmd)
{
Relation parentRel = cxt->rel;
- /*
- * We are going to try to validate the partition bound specification
- * against the partition key of rel, so it better have one.
- */
+ /* the table must be partitioned */
if (parentRel->rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
ereport(ERROR,
(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
errmsg("\"%s\" is not partitioned",
RelationGetRelationName(parentRel))));
- /* transform the values */
+ /* transform the partition bound, if any */
Assert(RelationGetPartitionKey(parentRel) != NULL);
- cxt->partbound = transformPartitionBound(cxt->pstate, parentRel,
- cmd->bound);
+ if (cmd->bound != NULL)
+ cxt->partbound = transformPartitionBound(cxt->pstate, parentRel,
+ cmd->bound);
}
/*
--
-- DETACH PARTITION
--
+-- check that the table is partitioned at all
+CREATE TABLE regular_table (a int);
+ALTER TABLE regular_table DETACH PARTITION any_name;
+ERROR: "regular_table" is not partitioned
+DROP TABLE regular_table;
-- check that the partition being detached exists at all
ALTER TABLE list_parted2 DETACH PARTITION part_4;
ERROR: relation "part_4" does not exist