Re: Add CREATE support to event triggers

From: Alvaro Herrera <alvherre(at)2ndquadrant(dot)com>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: Robert Haas <robertmhaas(at)gmail(dot)com>, Dimitri Fontaine <dimitri(at)2ndquadrant(dot)fr>, Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>, Pg Hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Add CREATE support to event triggers
Date: 2014-02-06 17:20:05
Message-ID: 20140206172005.GX10723@eldon.alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Tom Lane escribió:
> Alvaro Herrera <alvherre(at)2ndquadrant(dot)com> writes:

> > One idea is to chop the typmod output string at the closing parens.
>
> +1. The only reason timestamptypmodout works like that is that we're
> trying to match the SQL standard's spelling of the type names, and
> that committee apparently considers it an off day whenever they can't
> invent some randomly-incompatible-with-everything syntax.

Okay, I did it that way.

I also fixed the sequence OWNED BY problem simply by adding support for
ALTER SEQUENCE. Of course, the intention is that all forms of CREATE
and ALTER are supported, but this one seems reasonable standalone
because CREATE TABLE uses it internally.

So in the attached patch I have fixed all the three problems I reported
for the previous version.

I also changed the EventTriggerStashCreatedObject() function in two
ways:

1. rename it to EventTriggerStashCommand(). This is because it will
take ALTER commands as arguments, so the old name seemed a misnomer.
(I guess I was initially thinking it'd only handle object creation,
but obviously that will not work.)

2. Take ObjectType instead of ObjectClass. I'm not really sure about
this change; the old usage of OCLASS at the utility.c level seemed
wrong (in particular, in the DefineStmt case it was having to
translate the stmt->kind into ObjClass manually). But on the other
hand, the new usage of OBJECT_FOO requires a function to translate
each enum value to the catalog that contains objects of that type
(which is repetitive; the OCLASS_FOO code in dependency.c already has
a table with that). And also I had to add OBJECT_USER_MAPPING, which
was missing. I think I might end up reverting this bit, unless
somebody sees a way to beautify the Objtype->catalog OID
transformation. (The bit about missing USER MAPPING stuff seems a
bit troubling; EventTriggerSupportsObjectType wasn't aware of that
object type.)

By way of illustration, here's the output a simple command using the
snitch() function previously posted. You can see that the CREATE TABLE
command is expanded as three commands: CREATE SEQUENCE, CREATE TABLE,
ALTER SEQUENCE.

alvherre=# create unlogged table t1 (a serial);
NOTICE: JSON blob: {
"definition": [
{
"clause": "cache",
"fmt": "CACHE %{value}s",
"value": "1"
},
{
"clause": "cycle",
"fmt": "%{no}s CYCLE",
"no": "NO"
},
{
"clause": "increment_by",
"fmt": "INCREMENT BY %{value}s",
"value": "1"
},
{
"clause": "minvalue",
"fmt": "MINVALUE %{value}s",
"value": "1"
},
{
"clause": "maxvalue",
"fmt": "MAXVALUE %{value}s",
"value": "9223372036854775807"
},
{
"clause": "start",
"fmt": "START WITH %{value}s",
"value": "1"
},
{
"clause": "restart",
"fmt": "RESTART %{value}s",
"value": "1"
}
],
"fmt": "CREATE %{persistence}s SEQUENCE %{identity}D %{definition: }s",
"identity": {
"objname": "t1_a_seq",
"schemaname": "public"
},
"persistence": ""
}
NOTICE: expanded: CREATE SEQUENCE public.t1_a_seq CACHE 1 NO CYCLE INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775807 START WITH 1 RESTART 1
NOTICE: JSON blob: {
"fmt": "CREATE %{persistence}s TABLE %{identity}D %{if_not_exists}s (%{table_elements:, }s) %{inherits}s %{on_commit}s %{tablespace}s",
"identity": {
"objname": "t1",
"schemaname": "public"
},
"if_not_exists": "",
"inherits": {
"fmt": "INHERITS (%{parents:, }D)",
"parents": null,
"present": false
},
"on_commit": {
"fmt": "ON COMMIT %{on_commit_value}s",
"on_commit_value": null,
"present": false
},
"persistence": "UNLOGGED",
"table_elements": [
{
"collation": {
"fmt": "COLLATE %{name}D",
"present": false
},
"coltype": {
"is_array": false,
"schemaname": "pg_catalog",
"typename": "int4",
"typmod": ""
},
"default": {
"default": "nextval('t1_a_seq'::regclass)",
"fmt": "DEFAULT %{default}s"
},
"fmt": "%{name}I %{coltype}T %{default}s %{not_null}s %{collation}s",
"name": "a",
"not_null": "NOT NULL",
"type": "column"
}
],
"table_kind": "plain",
"tablespace": {
"fmt": "TABLESPACE %{tablespace}I",
"present": false,
"tablespace": null
}
}
NOTICE: expanded: CREATE UNLOGGED TABLE public.t1 (a pg_catalog.int4 DEFAULT nextval('t1_a_seq'::regclass) NOT NULL )
NOTICE: JSON blob: {
"definition": [
{
"clause": "owned",
"fmt": "OWNED BY %{owner}D",
"owner": {
"attrname": "a",
"objname": "t1",
"schemaname": "public"
}
}
],
"fmt": "ALTER SEQUENCE %{identity}D %{definition: }s",
"identity": {
"objname": "t1_a_seq",
"schemaname": "public"
}
}
NOTICE: expanded: ALTER SEQUENCE public.t1_a_seq OWNED BY public.t1.a
CREATE TABLE

--
Álvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

Attachment Content-Type Size
event-trigger-create-5.patch text/x-diff 115.6 KB

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Sawada Masahiko 2014-02-06 18:20:53 'dml' value for log_statement
Previous Message Greg Stark 2014-02-06 17:14:58 Re: extension_control_path