From df12c37edf69ef96e58d3e275fecd9972605b177 Mon Sep 17 00:00:00 2001 From: Josh Kupershmidt Date: Sun, 14 Oct 2012 10:50:05 -0700 Subject: [PATCH] Add in a call to: ALTER TABLE [table_name] ENABLE ALWAYS TRIGGER z_reorg_trigger so that pg_reorg and the z_reorg_trigger can properly work in "replica" mode, as when using pg_reorg on a Slony slave. Bug report and patch by Norman Yamada. --- bin/pg_reorg.c | 4 ++++ lib/pg_reorg.sql.in | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/bin/pg_reorg.c b/bin/pg_reorg.c index 275edce..4875976 100755 --- a/bin/pg_reorg.c +++ b/bin/pg_reorg.c @@ -48,6 +48,7 @@ typedef struct reorg_table const char *create_pktype; /* CREATE TYPE pk */ const char *create_log; /* CREATE TABLE log */ const char *create_trigger; /* CREATE TRIGGER z_reorg_trigger */ + const char *alter_table; /* ALTER TABLE ENABLE ALWAYS TRIGGER z_reorg_trigger */ const char *create_table; /* CREATE TABLE table AS SELECT */ const char *drop_columns; /* ALTER TABLE DROP COLUMNs */ const char *delete_log; /* DELETE FROM log */ @@ -288,6 +289,7 @@ reorg_one_database(const char *orderby, const char *table) table.create_pktype = getstr(res, i, c++); table.create_log = getstr(res, i, c++); table.create_trigger = getstr(res, i, c++); + table.alter_table = getstr(res, i, c++); create_table = getstr(res, i, c++); table.drop_columns = getstr(res, i, c++); @@ -384,6 +386,7 @@ reorg_one_table(const reorg_table *table, const char *orderby) elog(DEBUG2, "create_pktype : %s", table->create_pktype); elog(DEBUG2, "create_log : %s", table->create_log); elog(DEBUG2, "create_trigger : %s", table->create_trigger); + elog(DEBUG2, "alter_table : %s", table->alter_table); elog(DEBUG2, "create_table : %s", table->create_table); elog(DEBUG2, "drop_columns : %s", table->drop_columns ? table->drop_columns : "(skipped)"); elog(DEBUG2, "delete_log : %s", table->delete_log); @@ -417,6 +420,7 @@ reorg_one_table(const reorg_table *table, const char *orderby) command(table->create_pktype, 0, NULL); command(table->create_log, 0, NULL); command(table->create_trigger, 0, NULL); + command(table->alter_table, 0, NULL); printfStringInfo(&sql, "SELECT reorg.disable_autovacuum('reorg.log_%u')", table->target_oid); command(sql.data, 0, NULL); command("COMMIT", 0, NULL); diff --git a/lib/pg_reorg.sql.in b/lib/pg_reorg.sql.in index 97146ac..b9720f3 100755 --- a/lib/pg_reorg.sql.in +++ b/lib/pg_reorg.sql.in @@ -78,6 +78,14 @@ $$ $$ LANGUAGE sql STABLE STRICT; +CREATE FUNCTION reorg.get_alter_table(relid oid) + RETURNS text AS +$$ + SELECT 'ALTER TABLE ' || reorg.oid2text($1) || + ' ENABLE ALWAYS TRIGGER z_reorg_trigger'; +$$ +LANGUAGE sql STABLE STRICT; + CREATE FUNCTION reorg.get_assign(oid, text) RETURNS text AS $$ SELECT '(' || array_to_string(reorg.array_accum(quote_ident(attname)), ', ') || @@ -168,6 +176,7 @@ CREATE VIEW reorg.tables AS reorg.get_create_index_type(PK.indexrelid, 'reorg.pk_' || R.oid) AS create_pktype, 'CREATE TABLE reorg.log_' || R.oid || ' (id bigserial PRIMARY KEY, pk reorg.pk_' || R.oid || ', row ' || reorg.oid2text(R.oid) || ')' AS create_log, reorg.get_create_trigger(R.oid, PK.indexrelid) AS create_trigger, + reorg.get_alter_table(R.oid) as alter_table, 'CREATE TABLE reorg.table_' || R.oid || ' WITH (' || array_to_string(array_append(R.reloptions, 'oids=' || CASE WHEN R.relhasoids THEN 'true' ELSE 'false' END), ',') || ') TABLESPACE ' || coalesce(quote_ident(S.spcname), 'pg_default') || ' AS SELECT ' || reorg.get_columns_for_create_as(R.oid) || ' FROM ONLY ' || reorg.oid2text(R.oid) AS create_table, reorg.get_drop_columns(R.oid, 'reorg.table_' || R.oid) AS drop_columns, 'DELETE FROM reorg.log_' || R.oid AS delete_log,