a int
);
NOTICE: DDL test: type simple, tag CREATE TABLE
+ALTER TABLE parent SET (fillfactor = 50);
+NOTICE: DDL test: type alter table, tag ALTER TABLE
+NOTICE: subcommand: type SET RELOPTIONS desc <NULL>
+ALTER TABLE parent RESET (fillfactor);
+NOTICE: DDL test: type alter table, tag ALTER TABLE
+NOTICE: subcommand: type RESET RELOPTIONS desc <NULL>
+ALTER TABLE parent SET UNLOGGED;
+NOTICE: DDL test: type alter table, tag ALTER TABLE
+NOTICE: subcommand: type SET UNLOGGED desc <NULL>
+ALTER TABLE parent SET LOGGED;
+NOTICE: DDL test: type alter table, tag ALTER TABLE
+NOTICE: subcommand: type SET LOGGED desc <NULL>
+CREATE INDEX parent_index ON parent(a);
+NOTICE: DDL test: type simple, tag CREATE INDEX
+ALTER TABLE parent CLUSTER ON parent_index;
+NOTICE: DDL test: type alter table, tag ALTER TABLE
+NOTICE: subcommand: type CLUSTER desc index parent_index
+DROP INDEX parent_index;
CREATE TABLE child () INHERITS (parent);
NOTICE: DDL test: type simple, tag CREATE TABLE
CREATE TABLE grandchild () INHERITS (child);
ALTER TABLE parent ADD COLUMN b serial;
NOTICE: DDL test: type simple, tag CREATE SEQUENCE
NOTICE: DDL test: type alter table, tag ALTER TABLE
-NOTICE: subcommand: ADD COLUMN (and recurse)
+NOTICE: subcommand: type ADD COLUMN (and recurse) desc column b of table parent
NOTICE: DDL test: type simple, tag ALTER SEQUENCE
ALTER TABLE parent RENAME COLUMN b TO c;
NOTICE: DDL test: type simple, tag ALTER TABLE
+-- Constraint, no recursion
+ALTER TABLE ONLY grandchild ADD CONSTRAINT a_pos CHECK (a > 0);
+NOTICE: DDL test: type alter table, tag ALTER TABLE
+NOTICE: subcommand: type ADD CONSTRAINT desc constraint a_pos on table grandchild
+-- Constraint, with recursion
ALTER TABLE parent ADD CONSTRAINT a_pos CHECK (a > 0);
+NOTICE: merging constraint "a_pos" with inherited definition
NOTICE: DDL test: type alter table, tag ALTER TABLE
-NOTICE: subcommand: ADD CONSTRAINT (and recurse)
+NOTICE: subcommand: type ADD CONSTRAINT (and recurse) desc constraint a_pos on table parent
CREATE TABLE part (
a int
) PARTITION BY RANGE (a);
NOTICE: DDL test: type simple, tag CREATE TABLE
CREATE TABLE part1 PARTITION OF part FOR VALUES FROM (1) to (100);
NOTICE: DDL test: type simple, tag CREATE TABLE
+CREATE TABLE part2 (a int);
+NOTICE: DDL test: type simple, tag CREATE TABLE
+ALTER TABLE part ATTACH PARTITION part2 FOR VALUES FROM (101) to (200);
+NOTICE: DDL test: type alter table, tag ALTER TABLE
+NOTICE: subcommand: type ATTACH PARTITION desc <NULL>
+ALTER TABLE part DETACH PARTITION part2;
+NOTICE: DDL test: type alter table, tag ALTER TABLE
+NOTICE: subcommand: type DETACH PARTITION desc <NULL>
+DROP TABLE part2;
ALTER TABLE part ADD PRIMARY KEY (a);
NOTICE: DDL test: type alter table, tag ALTER TABLE
-NOTICE: subcommand: SET NOT NULL
-NOTICE: subcommand: SET NOT NULL
-NOTICE: subcommand: ADD INDEX
+NOTICE: subcommand: type SET NOT NULL desc column a of table part
+NOTICE: subcommand: type SET NOT NULL desc column a of table part1
+NOTICE: subcommand: type ADD INDEX desc index part_pkey
+ALTER TABLE parent ALTER COLUMN a SET NOT NULL;
+NOTICE: DDL test: type alter table, tag ALTER TABLE
+NOTICE: subcommand: type SET NOT NULL desc column a of table parent
+NOTICE: subcommand: type SET NOT NULL desc column a of table child
+NOTICE: subcommand: type SET NOT NULL desc column a of table grandchild
+ALTER TABLE parent ALTER COLUMN a DROP NOT NULL;
+NOTICE: DDL test: type alter table, tag ALTER TABLE
+NOTICE: subcommand: type DROP NOT NULL desc column a of table parent
+NOTICE: subcommand: type DROP NOT NULL desc column a of table child
+NOTICE: subcommand: type DROP NOT NULL desc column a of table grandchild
+ALTER TABLE parent ALTER COLUMN a SET NOT NULL;
+NOTICE: DDL test: type alter table, tag ALTER TABLE
+NOTICE: subcommand: type SET NOT NULL desc column a of table parent
+NOTICE: subcommand: type SET NOT NULL desc column a of table child
+NOTICE: subcommand: type SET NOT NULL desc column a of table grandchild
+ALTER TABLE parent ALTER COLUMN a ADD GENERATED ALWAYS AS IDENTITY;
+NOTICE: DDL test: type simple, tag CREATE SEQUENCE
+NOTICE: DDL test: type simple, tag ALTER SEQUENCE
+NOTICE: DDL test: type alter table, tag ALTER TABLE
+NOTICE: subcommand: type ADD IDENTITY desc column a of table parent
+ALTER TABLE parent ALTER COLUMN a SET GENERATED BY DEFAULT;
+NOTICE: DDL test: type simple, tag ALTER SEQUENCE
+NOTICE: DDL test: type alter table, tag ALTER TABLE
+NOTICE: subcommand: type SET IDENTITY desc column a of table parent
+ALTER TABLE parent ALTER COLUMN a DROP IDENTITY;
+NOTICE: DDL test: type alter table, tag ALTER TABLE
+NOTICE: subcommand: type DROP IDENTITY desc column a of table parent
+ALTER TABLE parent ALTER COLUMN a SET STATISTICS 100;
+NOTICE: DDL test: type alter table, tag ALTER TABLE
+NOTICE: subcommand: type SET STATS desc column a of table parent
+NOTICE: subcommand: type SET STATS desc column a of table child
+NOTICE: subcommand: type SET STATS desc column a of table grandchild
+ALTER TABLE parent ALTER COLUMN a SET STORAGE PLAIN;
+NOTICE: DDL test: type alter table, tag ALTER TABLE
+NOTICE: subcommand: type SET STORAGE desc column a of table parent
+NOTICE: subcommand: type SET STORAGE desc column a of table child
+NOTICE: subcommand: type SET STORAGE desc column a of table grandchild
+ALTER TABLE parent ENABLE ROW LEVEL SECURITY;
+NOTICE: DDL test: type alter table, tag ALTER TABLE
+NOTICE: subcommand: type ENABLE ROW SECURITY desc <NULL>
+ALTER TABLE parent NO FORCE ROW LEVEL SECURITY;
+NOTICE: DDL test: type alter table, tag ALTER TABLE
+NOTICE: subcommand: type NO FORCE ROW SECURITY desc <NULL>
+ALTER TABLE parent FORCE ROW LEVEL SECURITY;
+NOTICE: DDL test: type alter table, tag ALTER TABLE
+NOTICE: subcommand: type FORCE ROW SECURITY desc <NULL>
+ALTER TABLE parent DISABLE ROW LEVEL SECURITY;
+NOTICE: DDL test: type alter table, tag ALTER TABLE
+NOTICE: subcommand: type DISABLE ROW SECURITY desc <NULL>
+CREATE STATISTICS parent_stat (dependencies) ON a, c FROM parent;
+NOTICE: DDL test: type simple, tag CREATE STATISTICS
+ALTER TABLE parent ALTER COLUMN c TYPE numeric;
+NOTICE: DDL test: type alter table, tag ALTER TABLE
+NOTICE: subcommand: type ALTER COLUMN SET TYPE desc column c of table parent
+NOTICE: subcommand: type ALTER COLUMN SET TYPE desc column c of table child
+NOTICE: subcommand: type ALTER COLUMN SET TYPE desc column c of table grandchild
+NOTICE: subcommand: type (re) ADD STATS desc statistics object parent_stat
+ALTER TABLE parent ALTER COLUMN c SET DEFAULT 0;
+NOTICE: DDL test: type alter table, tag ALTER TABLE
+NOTICE: subcommand: type ALTER COLUMN SET DEFAULT desc column c of table parent
+NOTICE: subcommand: type ALTER COLUMN SET DEFAULT desc column c of table child
+NOTICE: subcommand: type ALTER COLUMN SET DEFAULT desc column c of table grandchild
+CREATE TABLE tbl (
+ a int generated always as (b::int * 2) stored,
+ b text
+);
+NOTICE: DDL test: type simple, tag CREATE TABLE
+ALTER TABLE tbl ALTER COLUMN a DROP EXPRESSION;
+NOTICE: DDL test: type alter table, tag ALTER TABLE
+NOTICE: subcommand: type DROP EXPRESSION desc column a of table tbl
+ALTER TABLE tbl ALTER COLUMN b SET COMPRESSION pglz;
+NOTICE: DDL test: type alter table, tag ALTER TABLE
+NOTICE: subcommand: type SET COMPRESSION desc column b of table tbl
+CREATE TYPE comptype AS (r float8);
+NOTICE: DDL test: type simple, tag CREATE TYPE
+CREATE DOMAIN dcomptype AS comptype;
+NOTICE: DDL test: type simple, tag CREATE DOMAIN
+ALTER DOMAIN dcomptype ADD CONSTRAINT c1 check ((value).r > 0);
+NOTICE: DDL test: type simple, tag ALTER DOMAIN
+ALTER TYPE comptype ALTER ATTRIBUTE r TYPE bigint;
+NOTICE: DDL test: type alter table, tag ALTER TYPE
+NOTICE: subcommand: type ALTER COLUMN SET TYPE desc column r of composite type comptype
+NOTICE: subcommand: type (re) ADD DOMAIN CONSTRAINT desc type dcomptype
a int
);
+ALTER TABLE parent SET (fillfactor = 50);
+ALTER TABLE parent RESET (fillfactor);
+ALTER TABLE parent SET UNLOGGED;
+ALTER TABLE parent SET LOGGED;
+
+CREATE INDEX parent_index ON parent(a);
+ALTER TABLE parent CLUSTER ON parent_index;
+DROP INDEX parent_index;
+
CREATE TABLE child () INHERITS (parent);
CREATE TABLE grandchild () INHERITS (child);
ALTER TABLE parent RENAME COLUMN b TO c;
+-- Constraint, no recursion
+ALTER TABLE ONLY grandchild ADD CONSTRAINT a_pos CHECK (a > 0);
+-- Constraint, with recursion
ALTER TABLE parent ADD CONSTRAINT a_pos CHECK (a > 0);
CREATE TABLE part (
CREATE TABLE part1 PARTITION OF part FOR VALUES FROM (1) to (100);
+CREATE TABLE part2 (a int);
+ALTER TABLE part ATTACH PARTITION part2 FOR VALUES FROM (101) to (200);
+ALTER TABLE part DETACH PARTITION part2;
+DROP TABLE part2;
+
ALTER TABLE part ADD PRIMARY KEY (a);
+
+ALTER TABLE parent ALTER COLUMN a SET NOT NULL;
+ALTER TABLE parent ALTER COLUMN a DROP NOT NULL;
+ALTER TABLE parent ALTER COLUMN a SET NOT NULL;
+
+ALTER TABLE parent ALTER COLUMN a ADD GENERATED ALWAYS AS IDENTITY;
+
+ALTER TABLE parent ALTER COLUMN a SET GENERATED BY DEFAULT;
+
+ALTER TABLE parent ALTER COLUMN a DROP IDENTITY;
+
+ALTER TABLE parent ALTER COLUMN a SET STATISTICS 100;
+
+ALTER TABLE parent ALTER COLUMN a SET STORAGE PLAIN;
+
+ALTER TABLE parent ENABLE ROW LEVEL SECURITY;
+ALTER TABLE parent NO FORCE ROW LEVEL SECURITY;
+ALTER TABLE parent FORCE ROW LEVEL SECURITY;
+ALTER TABLE parent DISABLE ROW LEVEL SECURITY;
+
+CREATE STATISTICS parent_stat (dependencies) ON a, c FROM parent;
+
+ALTER TABLE parent ALTER COLUMN c TYPE numeric;
+
+ALTER TABLE parent ALTER COLUMN c SET DEFAULT 0;
+
+CREATE TABLE tbl (
+ a int generated always as (b::int * 2) stored,
+ b text
+);
+
+ALTER TABLE tbl ALTER COLUMN a DROP EXPRESSION;
+
+ALTER TABLE tbl ALTER COLUMN b SET COMPRESSION pglz;
+
+CREATE TYPE comptype AS (r float8);
+CREATE DOMAIN dcomptype AS comptype;
+ALTER DOMAIN dcomptype ADD CONSTRAINT c1 check ((value).r > 0);
+ALTER TYPE comptype ALTER ATTRIBUTE r TYPE bigint;
#include "postgres.h"
#include "catalog/pg_type.h"
+#include "funcapi.h"
+#include "nodes/execnodes.h"
#include "tcop/deparse_utility.h"
#include "tcop/utility.h"
#include "utils/builtins.h"
PG_FUNCTION_INFO_V1(get_command_type);
PG_FUNCTION_INFO_V1(get_command_tag);
-PG_FUNCTION_INFO_V1(get_altertable_subcmdtypes);
+PG_FUNCTION_INFO_V1(get_altertable_subcmdinfo);
/*
* Return the textual representation of the struct type used to represent a
* command.
*/
Datum
-get_altertable_subcmdtypes(PG_FUNCTION_ARGS)
+get_altertable_subcmdinfo(PG_FUNCTION_ARGS)
{
CollectedCommand *cmd = (CollectedCommand *) PG_GETARG_POINTER(0);
- ArrayBuildState *astate = NULL;
ListCell *cell;
+ ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
if (cmd->type != SCT_AlterTable)
elog(ERROR, "command is not ALTER TABLE");
+ SetSingleFuncCall(fcinfo, 0);
+
+ if (list_length(cmd->d.alterTable.subcmds) == 0)
+ elog(ERROR, "empty alter table subcommand list");
+
foreach(cell, cmd->d.alterTable.subcmds)
{
CollectedATSubcmd *sub = lfirst(cell);
AlterTableCmd *subcmd = castNode(AlterTableCmd, sub->parsetree);
- const char *strtype;
+ const char *strtype = "unrecognized";
+ Datum values[2];
+ bool nulls[2];
+
+ memset(values, 0, sizeof(values));
+ memset(nulls, 0, sizeof(nulls));
switch (subcmd->subtype)
{
case AT_SetNotNull:
strtype = "SET NOT NULL";
break;
+ case AT_DropExpression:
+ strtype = "DROP EXPRESSION";
+ break;
case AT_CheckNotNull:
strtype = "CHECK NOT NULL";
break;
case AT_SetStorage:
strtype = "SET STORAGE";
break;
+ case AT_SetCompression:
+ strtype = "SET COMPRESSION";
+ break;
case AT_DropColumn:
strtype = "DROP COLUMN";
break;
case AT_ReAddConstraint:
strtype = "(re) ADD CONSTRAINT";
break;
+ case AT_ReAddDomainConstraint:
+ strtype = "(re) ADD DOMAIN CONSTRAINT";
+ break;
case AT_AlterConstraint:
strtype = "ALTER CONSTRAINT";
break;
case AT_DropOids:
strtype = "DROP OIDS";
break;
+ case AT_SetAccessMethod:
+ strtype = "SET ACCESS METHOD";
+ break;
case AT_SetTableSpace:
strtype = "SET TABLESPACE";
break;
case AT_GenericOptions:
strtype = "SET OPTIONS";
break;
- default:
- strtype = "unrecognized";
+ case AT_DetachPartition:
+ strtype = "DETACH PARTITION";
+ break;
+ case AT_AttachPartition:
+ strtype = "ATTACH PARTITION";
+ break;
+ case AT_DetachPartitionFinalize:
+ strtype = "DETACH PARTITION ... FINALIZE";
+ break;
+ case AT_AddIdentity:
+ strtype = "ADD IDENTITY";
+ break;
+ case AT_SetIdentity:
+ strtype = "SET IDENTITY";
+ break;
+ case AT_DropIdentity:
+ strtype = "DROP IDENTITY";
+ break;
+ case AT_ReAddStatistics:
+ strtype = "(re) ADD STATS";
break;
}
- astate =
- accumArrayResult(astate, CStringGetTextDatum(strtype),
- false, TEXTOID, CurrentMemoryContext);
- }
+ values[0] = CStringGetTextDatum(strtype);
+ if (OidIsValid(sub->address.objectId))
+ {
+ char *objdesc;
+ objdesc = getObjectDescription((const ObjectAddress *) &sub->address, false);
+ values[1] = CStringGetTextDatum(objdesc);
+ }
+ else
+ nulls[1] = true;
- if (astate == NULL)
- elog(ERROR, "empty alter table subcommand list");
+ tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls);
+ }
- PG_RETURN_ARRAYTYPE_P(makeArrayResult(astate, CurrentMemoryContext));
+ return (Datum) 0;
}