Expand tests of test_ddl_deparse/ for ALTER TABLE
This module is expanded to track the description of the objects changed in the subcommands of ALTER TABLE by reworking the function get_altertable_subcmdtypes() (now named get_altertable_subcmdinfo) used in the event trigger of the test. It now returns a set of rows made of (subcommand type, object description) instead of a text array with only the information about the subcommand type. The tests have been lacking a lot of the subcommands added to AlterTableType over the years. All the missing subcommands are added, and the code is now structured so as the addition of a new subcommand is detected by removing the default clause used in the switch for the subcommand types. The coverage of the module is increased from roughly 30% to 50%. More could be done but this is already a nice improvement. Author: Michael Paquier, Hou Zhijie Reviewed-by: Álvaro Herrera, Amit Kapila, Hayato Kuroda Discussion: https://postgr.es/m/OS0PR01MB571626984BD099DADF53F38394899@OS0PR01MB5716.jpnprd01.prod.outlook.com
This commit is contained in:
parent
6a1f082aba
commit
07ff701dbd
@ -2,6 +2,24 @@ CREATE TABLE parent (
|
|||||||
a int
|
a int
|
||||||
);
|
);
|
||||||
NOTICE: DDL test: type simple, tag CREATE TABLE
|
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);
|
CREATE TABLE child () INHERITS (parent);
|
||||||
NOTICE: DDL test: type simple, tag CREATE TABLE
|
NOTICE: DDL test: type simple, tag CREATE TABLE
|
||||||
CREATE TABLE grandchild () INHERITS (child);
|
CREATE TABLE grandchild () INHERITS (child);
|
||||||
@ -9,21 +27,119 @@ NOTICE: DDL test: type simple, tag CREATE TABLE
|
|||||||
ALTER TABLE parent ADD COLUMN b serial;
|
ALTER TABLE parent ADD COLUMN b serial;
|
||||||
NOTICE: DDL test: type simple, tag CREATE SEQUENCE
|
NOTICE: DDL test: type simple, tag CREATE SEQUENCE
|
||||||
NOTICE: DDL test: type alter table, tag ALTER TABLE
|
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
|
NOTICE: DDL test: type simple, tag ALTER SEQUENCE
|
||||||
ALTER TABLE parent RENAME COLUMN b TO c;
|
ALTER TABLE parent RENAME COLUMN b TO c;
|
||||||
NOTICE: DDL test: type simple, tag ALTER TABLE
|
NOTICE: DDL test: type simple, tag ALTER TABLE
|
||||||
ALTER TABLE parent ADD CONSTRAINT a_pos CHECK (a > 0);
|
-- Constraint, no recursion
|
||||||
|
ALTER TABLE ONLY grandchild ADD CONSTRAINT a_pos CHECK (a > 0);
|
||||||
NOTICE: DDL test: type alter table, tag ALTER TABLE
|
NOTICE: DDL test: type alter table, tag ALTER TABLE
|
||||||
NOTICE: subcommand: ADD CONSTRAINT (and recurse)
|
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: type ADD CONSTRAINT (and recurse) desc constraint a_pos on table parent
|
||||||
CREATE TABLE part (
|
CREATE TABLE part (
|
||||||
a int
|
a int
|
||||||
) PARTITION BY RANGE (a);
|
) PARTITION BY RANGE (a);
|
||||||
NOTICE: DDL test: type simple, tag CREATE TABLE
|
NOTICE: DDL test: type simple, tag CREATE TABLE
|
||||||
CREATE TABLE part1 PARTITION OF part FOR VALUES FROM (1) to (100);
|
CREATE TABLE part1 PARTITION OF part FOR VALUES FROM (1) to (100);
|
||||||
NOTICE: DDL test: type simple, tag CREATE TABLE
|
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);
|
ALTER TABLE part ADD PRIMARY KEY (a);
|
||||||
NOTICE: DDL test: type alter table, tag ALTER TABLE
|
NOTICE: DDL test: type alter table, tag ALTER TABLE
|
||||||
NOTICE: subcommand: SET NOT NULL
|
NOTICE: subcommand: type SET NOT NULL desc column a of table part
|
||||||
NOTICE: subcommand: SET NOT NULL
|
NOTICE: subcommand: type SET NOT NULL desc column a of table part1
|
||||||
NOTICE: subcommand: ADD INDEX
|
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
|
||||||
|
@ -77,8 +77,8 @@ NOTICE: DDL test: type simple, tag CREATE TABLE
|
|||||||
NOTICE: DDL test: type simple, tag CREATE INDEX
|
NOTICE: DDL test: type simple, tag CREATE INDEX
|
||||||
NOTICE: DDL test: type simple, tag CREATE INDEX
|
NOTICE: DDL test: type simple, tag CREATE INDEX
|
||||||
NOTICE: DDL test: type alter table, tag ALTER TABLE
|
NOTICE: DDL test: type alter table, tag ALTER TABLE
|
||||||
NOTICE: subcommand: ADD CONSTRAINT (and recurse)
|
NOTICE: subcommand: type ADD CONSTRAINT (and recurse) desc constraint fkey_table_datatype_id_fkey on table fkey_table
|
||||||
NOTICE: subcommand: ADD CONSTRAINT (and recurse)
|
NOTICE: subcommand: type ADD CONSTRAINT (and recurse) desc constraint fkey_big_id on table fkey_table
|
||||||
-- Typed table
|
-- Typed table
|
||||||
CREATE TABLE employees OF employee_type (
|
CREATE TABLE employees OF employee_type (
|
||||||
PRIMARY KEY (name),
|
PRIMARY KEY (name),
|
||||||
@ -86,7 +86,7 @@ CREATE TABLE employees OF employee_type (
|
|||||||
);
|
);
|
||||||
NOTICE: DDL test: type simple, tag CREATE TABLE
|
NOTICE: DDL test: type simple, tag CREATE TABLE
|
||||||
NOTICE: DDL test: type alter table, tag ALTER TABLE
|
NOTICE: DDL test: type alter table, tag ALTER TABLE
|
||||||
NOTICE: subcommand: SET NOT NULL
|
NOTICE: subcommand: type SET NOT NULL desc column name of table employees
|
||||||
NOTICE: DDL test: type simple, tag CREATE INDEX
|
NOTICE: DDL test: type simple, tag CREATE INDEX
|
||||||
-- Inheritance
|
-- Inheritance
|
||||||
CREATE TABLE person (
|
CREATE TABLE person (
|
||||||
@ -136,7 +136,7 @@ CREATE TABLE like_fkey_table (
|
|||||||
);
|
);
|
||||||
NOTICE: DDL test: type simple, tag CREATE TABLE
|
NOTICE: DDL test: type simple, tag CREATE TABLE
|
||||||
NOTICE: DDL test: type alter table, tag ALTER TABLE
|
NOTICE: DDL test: type alter table, tag ALTER TABLE
|
||||||
NOTICE: subcommand: ALTER COLUMN SET DEFAULT (precooked)
|
NOTICE: subcommand: type ALTER COLUMN SET DEFAULT (precooked) desc column id of table like_fkey_table
|
||||||
NOTICE: DDL test: type simple, tag CREATE INDEX
|
NOTICE: DDL test: type simple, tag CREATE INDEX
|
||||||
NOTICE: DDL test: type simple, tag CREATE INDEX
|
NOTICE: DDL test: type simple, tag CREATE INDEX
|
||||||
-- Volatile table types
|
-- Volatile table types
|
||||||
|
@ -8,7 +8,7 @@ CREATE OR REPLACE VIEW static_view AS
|
|||||||
SELECT 'bar'::TEXT AS col;
|
SELECT 'bar'::TEXT AS col;
|
||||||
NOTICE: DDL test: type simple, tag CREATE VIEW
|
NOTICE: DDL test: type simple, tag CREATE VIEW
|
||||||
NOTICE: DDL test: type alter table, tag CREATE VIEW
|
NOTICE: DDL test: type alter table, tag CREATE VIEW
|
||||||
NOTICE: subcommand: REPLACE RELOPTIONS
|
NOTICE: subcommand: type REPLACE RELOPTIONS desc <NULL>
|
||||||
CREATE VIEW datatype_view AS
|
CREATE VIEW datatype_view AS
|
||||||
SELECT * FROM datatype_table;
|
SELECT * FROM datatype_table;
|
||||||
NOTICE: DDL test: type simple, tag CREATE VIEW
|
NOTICE: DDL test: type simple, tag CREATE VIEW
|
||||||
|
@ -28,9 +28,9 @@ BEGIN
|
|||||||
-- if alter table, log more
|
-- if alter table, log more
|
||||||
IF cmdtype = 'alter table' THEN
|
IF cmdtype = 'alter table' THEN
|
||||||
FOR r2 IN SELECT *
|
FOR r2 IN SELECT *
|
||||||
FROM unnest(public.get_altertable_subcmdtypes(r.command))
|
FROM public.get_altertable_subcmdinfo(r.command)
|
||||||
LOOP
|
LOOP
|
||||||
RAISE NOTICE ' subcommand: %', r2.unnest;
|
RAISE NOTICE ' subcommand: type % desc %', r2.cmdtype, r2.objdesc;
|
||||||
END LOOP;
|
END LOOP;
|
||||||
END IF;
|
END IF;
|
||||||
END LOOP;
|
END LOOP;
|
||||||
|
@ -2,6 +2,15 @@ CREATE TABLE parent (
|
|||||||
a int
|
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 child () INHERITS (parent);
|
||||||
|
|
||||||
CREATE TABLE grandchild () INHERITS (child);
|
CREATE TABLE grandchild () INHERITS (child);
|
||||||
@ -10,6 +19,9 @@ ALTER TABLE parent ADD COLUMN b serial;
|
|||||||
|
|
||||||
ALTER TABLE parent RENAME COLUMN b TO c;
|
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);
|
ALTER TABLE parent ADD CONSTRAINT a_pos CHECK (a > 0);
|
||||||
|
|
||||||
CREATE TABLE part (
|
CREATE TABLE part (
|
||||||
@ -18,4 +30,48 @@ CREATE TABLE part (
|
|||||||
|
|
||||||
CREATE TABLE part1 PARTITION OF part FOR VALUES FROM (1) to (100);
|
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 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;
|
||||||
|
@ -29,9 +29,9 @@ BEGIN
|
|||||||
-- if alter table, log more
|
-- if alter table, log more
|
||||||
IF cmdtype = 'alter table' THEN
|
IF cmdtype = 'alter table' THEN
|
||||||
FOR r2 IN SELECT *
|
FOR r2 IN SELECT *
|
||||||
FROM unnest(public.get_altertable_subcmdtypes(r.command))
|
FROM public.get_altertable_subcmdinfo(r.command)
|
||||||
LOOP
|
LOOP
|
||||||
RAISE NOTICE ' subcommand: %', r2.unnest;
|
RAISE NOTICE ' subcommand: type % desc %', r2.cmdtype, r2.objdesc;
|
||||||
END LOOP;
|
END LOOP;
|
||||||
END IF;
|
END IF;
|
||||||
END LOOP;
|
END LOOP;
|
||||||
|
@ -11,6 +11,8 @@ CREATE FUNCTION get_command_tag(pg_ddl_command)
|
|||||||
RETURNS text IMMUTABLE STRICT
|
RETURNS text IMMUTABLE STRICT
|
||||||
AS 'MODULE_PATHNAME' LANGUAGE C;
|
AS 'MODULE_PATHNAME' LANGUAGE C;
|
||||||
|
|
||||||
CREATE FUNCTION get_altertable_subcmdtypes(pg_ddl_command)
|
CREATE FUNCTION get_altertable_subcmdinfo(IN cmd pg_ddl_command,
|
||||||
RETURNS text[] IMMUTABLE STRICT
|
OUT cmdtype text,
|
||||||
|
OUT objdesc text)
|
||||||
|
RETURNS SETOF record IMMUTABLE STRICT
|
||||||
AS 'MODULE_PATHNAME' LANGUAGE C;
|
AS 'MODULE_PATHNAME' LANGUAGE C;
|
||||||
|
@ -11,6 +11,8 @@
|
|||||||
#include "postgres.h"
|
#include "postgres.h"
|
||||||
|
|
||||||
#include "catalog/pg_type.h"
|
#include "catalog/pg_type.h"
|
||||||
|
#include "funcapi.h"
|
||||||
|
#include "nodes/execnodes.h"
|
||||||
#include "tcop/deparse_utility.h"
|
#include "tcop/deparse_utility.h"
|
||||||
#include "tcop/utility.h"
|
#include "tcop/utility.h"
|
||||||
#include "utils/builtins.h"
|
#include "utils/builtins.h"
|
||||||
@ -19,7 +21,7 @@ PG_MODULE_MAGIC;
|
|||||||
|
|
||||||
PG_FUNCTION_INFO_V1(get_command_type);
|
PG_FUNCTION_INFO_V1(get_command_type);
|
||||||
PG_FUNCTION_INFO_V1(get_command_tag);
|
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
|
* Return the textual representation of the struct type used to represent a
|
||||||
@ -82,20 +84,30 @@ get_command_tag(PG_FUNCTION_ARGS)
|
|||||||
* command.
|
* command.
|
||||||
*/
|
*/
|
||||||
Datum
|
Datum
|
||||||
get_altertable_subcmdtypes(PG_FUNCTION_ARGS)
|
get_altertable_subcmdinfo(PG_FUNCTION_ARGS)
|
||||||
{
|
{
|
||||||
CollectedCommand *cmd = (CollectedCommand *) PG_GETARG_POINTER(0);
|
CollectedCommand *cmd = (CollectedCommand *) PG_GETARG_POINTER(0);
|
||||||
ArrayBuildState *astate = NULL;
|
|
||||||
ListCell *cell;
|
ListCell *cell;
|
||||||
|
ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
|
||||||
|
|
||||||
if (cmd->type != SCT_AlterTable)
|
if (cmd->type != SCT_AlterTable)
|
||||||
elog(ERROR, "command is not ALTER TABLE");
|
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)
|
foreach(cell, cmd->d.alterTable.subcmds)
|
||||||
{
|
{
|
||||||
CollectedATSubcmd *sub = lfirst(cell);
|
CollectedATSubcmd *sub = lfirst(cell);
|
||||||
AlterTableCmd *subcmd = castNode(AlterTableCmd, sub->parsetree);
|
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)
|
switch (subcmd->subtype)
|
||||||
{
|
{
|
||||||
@ -120,6 +132,9 @@ get_altertable_subcmdtypes(PG_FUNCTION_ARGS)
|
|||||||
case AT_SetNotNull:
|
case AT_SetNotNull:
|
||||||
strtype = "SET NOT NULL";
|
strtype = "SET NOT NULL";
|
||||||
break;
|
break;
|
||||||
|
case AT_DropExpression:
|
||||||
|
strtype = "DROP EXPRESSION";
|
||||||
|
break;
|
||||||
case AT_CheckNotNull:
|
case AT_CheckNotNull:
|
||||||
strtype = "CHECK NOT NULL";
|
strtype = "CHECK NOT NULL";
|
||||||
break;
|
break;
|
||||||
@ -135,6 +150,9 @@ get_altertable_subcmdtypes(PG_FUNCTION_ARGS)
|
|||||||
case AT_SetStorage:
|
case AT_SetStorage:
|
||||||
strtype = "SET STORAGE";
|
strtype = "SET STORAGE";
|
||||||
break;
|
break;
|
||||||
|
case AT_SetCompression:
|
||||||
|
strtype = "SET COMPRESSION";
|
||||||
|
break;
|
||||||
case AT_DropColumn:
|
case AT_DropColumn:
|
||||||
strtype = "DROP COLUMN";
|
strtype = "DROP COLUMN";
|
||||||
break;
|
break;
|
||||||
@ -156,6 +174,9 @@ get_altertable_subcmdtypes(PG_FUNCTION_ARGS)
|
|||||||
case AT_ReAddConstraint:
|
case AT_ReAddConstraint:
|
||||||
strtype = "(re) ADD CONSTRAINT";
|
strtype = "(re) ADD CONSTRAINT";
|
||||||
break;
|
break;
|
||||||
|
case AT_ReAddDomainConstraint:
|
||||||
|
strtype = "(re) ADD DOMAIN CONSTRAINT";
|
||||||
|
break;
|
||||||
case AT_AlterConstraint:
|
case AT_AlterConstraint:
|
||||||
strtype = "ALTER CONSTRAINT";
|
strtype = "ALTER CONSTRAINT";
|
||||||
break;
|
break;
|
||||||
@ -201,6 +222,9 @@ get_altertable_subcmdtypes(PG_FUNCTION_ARGS)
|
|||||||
case AT_DropOids:
|
case AT_DropOids:
|
||||||
strtype = "DROP OIDS";
|
strtype = "DROP OIDS";
|
||||||
break;
|
break;
|
||||||
|
case AT_SetAccessMethod:
|
||||||
|
strtype = "SET ACCESS METHOD";
|
||||||
|
break;
|
||||||
case AT_SetTableSpace:
|
case AT_SetTableSpace:
|
||||||
strtype = "SET TABLESPACE";
|
strtype = "SET TABLESPACE";
|
||||||
break;
|
break;
|
||||||
@ -279,18 +303,41 @@ get_altertable_subcmdtypes(PG_FUNCTION_ARGS)
|
|||||||
case AT_GenericOptions:
|
case AT_GenericOptions:
|
||||||
strtype = "SET OPTIONS";
|
strtype = "SET OPTIONS";
|
||||||
break;
|
break;
|
||||||
default:
|
case AT_DetachPartition:
|
||||||
strtype = "unrecognized";
|
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;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
astate =
|
values[0] = CStringGetTextDatum(strtype);
|
||||||
accumArrayResult(astate, CStringGetTextDatum(strtype),
|
if (OidIsValid(sub->address.objectId))
|
||||||
false, TEXTOID, CurrentMemoryContext);
|
{
|
||||||
|
char *objdesc;
|
||||||
|
objdesc = getObjectDescription((const ObjectAddress *) &sub->address, false);
|
||||||
|
values[1] = CStringGetTextDatum(objdesc);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
nulls[1] = true;
|
||||||
|
|
||||||
|
tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (astate == NULL)
|
return (Datum) 0;
|
||||||
elog(ERROR, "empty alter table subcommand list");
|
|
||||||
|
|
||||||
PG_RETURN_ARRAYTYPE_P(makeArrayResult(astate, CurrentMemoryContext));
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user