Fork the pg_repack extension

This commit is contained in:
Daniele Varrazzo
2012-11-10 22:33:57 +00:00
parent 0f8c33f72f
commit b7799c1782
32 changed files with 416 additions and 416 deletions

4
lib/.gitignore vendored
View File

@ -1,3 +1,3 @@
/.deps/
/pg_reorg.sql
/pg_reorg--[0-9.]*.sql
/pg_repack.sql
/pg_repack--[0-9.]*.sql

View File

@ -1,13 +1,13 @@
#
# pg_reorg: lib/Makefile
# pg_repack: lib/Makefile
#
# Portions Copyright (c) 2008-2012, NIPPON TELEGRAPH AND TELEPHONE CORPORATION
# Portions Copyright (c) 2011, Itagaki Takahiro
#
MODULE_big = pg_reorg
OBJS = reorg.o pgut/pgut-be.o pgut/pgut-spi.o
MODULE_big = pg_repack
OBJS = repack.o pgut/pgut-be.o pgut/pgut-spi.o
EXTENSION = pg_reorg
EXTENSION = pg_repack
# The version of the extension, read from the .control file.
# Note that it doesn't need to be the same of the library version: it should
@ -16,8 +16,8 @@ EXTVER = $(shell grep -e '^default_version' $(EXTENSION).control \
| sed -e "s/[^']*'\([^']*\)'.*/\1/")
#supports both EXTENSION (for >=9.1) and without_EXTENSION (for <PG 9.1)
DATA_built = pg_reorg.sql pg_reorg--$(EXTVER).sql
DATA = pg_reorg--1.1.7--1.1.8.sql uninstall_pg_reorg.sql
DATA_built = pg_repack.sql pg_repack--$(EXTVER).sql
DATA = pg_repack--1.1.7--1.1.8.sql uninstall_pg_repack.sql
ifndef USE_PGXS
top_builddir = ../../..
@ -41,12 +41,12 @@ endif
LIBS := $(filter-out -lxml2, $(LIBS))
LIBS := $(filter-out -lxslt, $(LIBS))
pg_reorg.sql: pg_reorg.sql.in
pg_repack.sql: pg_repack.sql.in
echo "BEGIN;\n" > $@; \
echo "CREATE SCHEMA reorg;\n" >> $@; \
echo "CREATE SCHEMA repack;\n" >> $@; \
sed 's,MODULE_PATHNAME,$$libdir/$(MODULE_big),g' $< >> $@; \
echo "\nCOMMIT;" >> $@;
pg_reorg--$(EXTVER).sql: pg_reorg.sql.in
echo '\echo Use "CREATE EXTENSION pg_reorg" to load this file. \quit' > $@; \
pg_repack--$(EXTVER).sql: pg_repack.sql.in
echo '\echo Use "CREATE EXTENSION pg_repack" to load this file. \quit' > $@; \
cat $< >> $@;

View File

@ -1,25 +0,0 @@
/* Create the pg_reorg extension from a loose set of objects */
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
\echo Use "CREATE EXTENSION pg_reorg FROM 1.1.7" to load this file. \quit
ALTER EXTENSION pg_reorg ADD FUNCTION reorg.version();
ALTER EXTENSION pg_reorg ADD AGGREGATE reorg.array_accum(anyelement);
ALTER EXTENSION pg_reorg ADD FUNCTION reorg.oid2text(oid);
ALTER EXTENSION pg_reorg ADD FUNCTION reorg.get_index_columns(oid, text);
ALTER EXTENSION pg_reorg ADD FUNCTION reorg.get_index_keys(oid, oid);
ALTER EXTENSION pg_reorg ADD FUNCTION reorg.get_create_index_type(oid, name);
ALTER EXTENSION pg_reorg ADD FUNCTION reorg.get_create_trigger(relid oid, pkid oid);
ALTER EXTENSION pg_reorg ADD FUNCTION reorg.get_assign(oid, text);
ALTER EXTENSION pg_reorg ADD FUNCTION reorg.get_compare_pkey(oid, text);
ALTER EXTENSION pg_reorg ADD FUNCTION reorg.get_columns_for_create_as(oid);
ALTER EXTENSION pg_reorg ADD FUNCTION reorg.get_drop_columns(oid, text);
ALTER EXTENSION pg_reorg ADD VIEW reorg.primary_keys;
ALTER EXTENSION pg_reorg ADD VIEW reorg.tables;
ALTER EXTENSION pg_reorg ADD FUNCTION reorg.reorg_indexdef(oid, oid);
ALTER EXTENSION pg_reorg ADD FUNCTION reorg.reorg_trigger();
ALTER EXTENSION pg_reorg ADD FUNCTION reorg.conflicted_triggers(oid);
ALTER EXTENSION pg_reorg ADD FUNCTION reorg.disable_autovacuum(regclass);
ALTER EXTENSION pg_reorg ADD FUNCTION reorg.reorg_apply(cstring,cstring,cstring,cstring,cstring,integer);
ALTER EXTENSION pg_reorg ADD FUNCTION reorg.reorg_swap(oid);
ALTER EXTENSION pg_reorg ADD FUNCTION reorg.reorg_drop(oid);

View File

@ -0,0 +1,25 @@
/* Create the pg_repack extension from a loose set of objects */
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
\echo Use "CREATE EXTENSION pg_repack FROM 1.1.7" to load this file. \quit
ALTER EXTENSION pg_repack ADD FUNCTION repack.version();
ALTER EXTENSION pg_repack ADD AGGREGATE repack.array_accum(anyelement);
ALTER EXTENSION pg_repack ADD FUNCTION repack.oid2text(oid);
ALTER EXTENSION pg_repack ADD FUNCTION repack.get_index_columns(oid, text);
ALTER EXTENSION pg_repack ADD FUNCTION repack.get_index_keys(oid, oid);
ALTER EXTENSION pg_repack ADD FUNCTION repack.get_create_index_type(oid, name);
ALTER EXTENSION pg_repack ADD FUNCTION repack.get_create_trigger(relid oid, pkid oid);
ALTER EXTENSION pg_repack ADD FUNCTION repack.get_assign(oid, text);
ALTER EXTENSION pg_repack ADD FUNCTION repack.get_compare_pkey(oid, text);
ALTER EXTENSION pg_repack ADD FUNCTION repack.get_columns_for_create_as(oid);
ALTER EXTENSION pg_repack ADD FUNCTION repack.get_drop_columns(oid, text);
ALTER EXTENSION pg_repack ADD VIEW repack.primary_keys;
ALTER EXTENSION pg_repack ADD VIEW repack.tables;
ALTER EXTENSION pg_repack ADD FUNCTION repack.repack_indexdef(oid, oid);
ALTER EXTENSION pg_repack ADD FUNCTION repack.repack_trigger();
ALTER EXTENSION pg_repack ADD FUNCTION repack.conflicted_triggers(oid);
ALTER EXTENSION pg_repack ADD FUNCTION repack.disable_autovacuum(regclass);
ALTER EXTENSION pg_repack ADD FUNCTION repack.repack_apply(cstring,cstring,cstring,cstring,cstring,integer);
ALTER EXTENSION pg_repack ADD FUNCTION repack.repack_swap(oid);
ALTER EXTENSION pg_repack ADD FUNCTION repack.repack_drop(oid);

View File

@ -1,6 +1,6 @@
# pg_reorg extension
# pg_repack extension
comment = 're-organizes a PostgreSQL database'
default_version = '1.2dev0'
module_pathname = '$libdir/pg_reorg'
module_pathname = '$libdir/pg_repack'
relocatable = false
schema = reorg
schema = repack

View File

@ -1,30 +1,30 @@
/*
* pg_reorg: lib/pg_reorg.sql.in
* pg_repack: lib/pg_repack.sql.in
*
* Portions Copyright (c) 2008-2011, NIPPON TELEGRAPH AND TELEPHONE CORPORATION
* Portions Copyright (c) 2011, Itagaki Takahiro
*/
CREATE FUNCTION reorg.version() RETURNS text AS
'MODULE_PATHNAME', 'reorg_version'
CREATE FUNCTION repack.version() RETURNS text AS
'MODULE_PATHNAME', 'repack_version'
LANGUAGE C IMMUTABLE STRICT;
CREATE AGGREGATE reorg.array_accum (
CREATE AGGREGATE repack.array_accum (
sfunc = array_append,
basetype = anyelement,
stype = anyarray,
initcond = '{}'
);
CREATE FUNCTION reorg.oid2text(oid) RETURNS text AS
CREATE FUNCTION repack.oid2text(oid) RETURNS text AS
$$
SELECT textin(regclassout($1));
$$
LANGUAGE sql STABLE STRICT;
CREATE FUNCTION reorg.get_index_columns(oid, text) RETURNS text AS
CREATE FUNCTION repack.get_index_columns(oid, text) RETURNS text AS
$$
SELECT array_to_string(reorg.array_accum(quote_ident(attname)), $2)
SELECT array_to_string(repack.array_accum(quote_ident(attname)), $2)
FROM pg_attribute,
(SELECT indrelid,
indkey,
@ -37,14 +37,14 @@ $$
$$
LANGUAGE sql STABLE STRICT;
CREATE FUNCTION reorg.get_index_keys(oid, oid) RETURNS text AS
'MODULE_PATHNAME', 'reorg_get_index_keys'
CREATE FUNCTION repack.get_index_keys(oid, oid) RETURNS text AS
'MODULE_PATHNAME', 'repack_get_index_keys'
LANGUAGE C STABLE STRICT;
CREATE FUNCTION reorg.get_create_index_type(oid, name) RETURNS text AS
CREATE FUNCTION repack.get_create_index_type(oid, name) RETURNS text AS
$$
SELECT 'CREATE TYPE ' || $2 || ' AS (' ||
array_to_string(reorg.array_accum(quote_ident(attname) || ' ' ||
array_to_string(repack.array_accum(quote_ident(attname) || ' ' ||
pg_catalog.format_type(atttypid, atttypmod)), ', ') || ')'
FROM pg_attribute,
(SELECT indrelid,
@ -58,44 +58,44 @@ $$
$$
LANGUAGE sql STABLE STRICT;
CREATE FUNCTION reorg.get_create_trigger(relid oid, pkid oid)
CREATE FUNCTION repack.get_create_trigger(relid oid, pkid oid)
RETURNS text AS
$$
SELECT 'CREATE TRIGGER z_reorg_trigger' ||
' BEFORE INSERT OR DELETE OR UPDATE ON ' || reorg.oid2text($1) ||
' FOR EACH ROW EXECUTE PROCEDURE reorg.reorg_trigger(' ||
'''INSERT INTO reorg.log_' || $1 || '(pk, row) VALUES(' ||
SELECT 'CREATE TRIGGER z_repack_trigger' ||
' BEFORE INSERT OR DELETE OR UPDATE ON ' || repack.oid2text($1) ||
' FOR EACH ROW EXECUTE PROCEDURE repack.repack_trigger(' ||
'''INSERT INTO repack.log_' || $1 || '(pk, row) VALUES(' ||
' CASE WHEN $1 IS NULL THEN NULL ELSE (ROW($1.' ||
reorg.get_index_columns($2, ', $1.') || ')::reorg.pk_' ||
repack.get_index_columns($2, ', $1.') || ')::repack.pk_' ||
$1 || ') END, $2)'')';
$$
LANGUAGE sql STABLE STRICT;
CREATE FUNCTION reorg.get_alter_table(relid oid)
CREATE FUNCTION repack.get_alter_table(relid oid)
RETURNS text AS
$$
SELECT 'ALTER TABLE ' || reorg.oid2text($1) ||
' ENABLE ALWAYS TRIGGER z_reorg_trigger';
SELECT 'ALTER TABLE ' || repack.oid2text($1) ||
' ENABLE ALWAYS TRIGGER z_repack_trigger';
$$
LANGUAGE sql STABLE STRICT;
CREATE FUNCTION reorg.get_assign(oid, text) RETURNS text AS
CREATE FUNCTION repack.get_assign(oid, text) RETURNS text AS
$$
SELECT '(' || array_to_string(reorg.array_accum(quote_ident(attname)), ', ') ||
SELECT '(' || array_to_string(repack.array_accum(quote_ident(attname)), ', ') ||
') = (' || $2 || '.' ||
array_to_string(reorg.array_accum(quote_ident(attname)), ', ' || $2 || '.') || ')'
array_to_string(repack.array_accum(quote_ident(attname)), ', ' || $2 || '.') || ')'
FROM (SELECT attname FROM pg_attribute
WHERE attrelid = $1 AND attnum > 0 AND NOT attisdropped
ORDER BY attnum) tmp;
$$
LANGUAGE sql STABLE STRICT;
CREATE FUNCTION reorg.get_compare_pkey(oid, text)
CREATE FUNCTION repack.get_compare_pkey(oid, text)
RETURNS text AS
$$
SELECT '(' || array_to_string(reorg.array_accum(quote_ident(attname)), ', ') ||
SELECT '(' || array_to_string(repack.array_accum(quote_ident(attname)), ', ') ||
') = (' || $2 || '.' ||
array_to_string(reorg.array_accum(quote_ident(attname)), ', ' || $2 || '.') || ')'
array_to_string(repack.array_accum(quote_ident(attname)), ', ' || $2 || '.') || ')'
FROM pg_attribute,
(SELECT indrelid,
indkey,
@ -110,10 +110,10 @@ LANGUAGE sql STABLE STRICT;
-- Get a column list for SELECT all columns including dropped ones.
-- We use NULLs of integer types for dropped columns (types are not important).
CREATE FUNCTION reorg.get_columns_for_create_as(oid)
CREATE FUNCTION repack.get_columns_for_create_as(oid)
RETURNS text AS
$$
SELECT array_to_string(reorg.array_accum(c), ',') FROM (SELECT
SELECT array_to_string(repack.array_accum(c), ',') FROM (SELECT
CASE WHEN attisdropped
THEN 'NULL::integer AS ' || quote_ident(attname)
ELSE quote_ident(attname)
@ -126,14 +126,14 @@ LANGUAGE sql STABLE STRICT;
-- Get a SQL text to DROP dropped columns for the table,
-- or NULL if it has no dropped columns.
CREATE FUNCTION reorg.get_drop_columns(oid, text)
CREATE FUNCTION repack.get_drop_columns(oid, text)
RETURNS text AS
$$
SELECT
'ALTER TABLE ' || $2 || ' ' || array_to_string(dropped_columns, ', ')
FROM (
SELECT
reorg.array_accum('DROP COLUMN ' || quote_ident(attname)) AS dropped_columns
repack.array_accum('DROP COLUMN ' || quote_ident(attname)) AS dropped_columns
FROM (
SELECT * FROM pg_attribute
WHERE attrelid = $1 AND attnum > 0 AND attisdropped
@ -146,8 +146,8 @@ $$
LANGUAGE sql STABLE STRICT;
-- includes not only PRIMARY KEYS but also UNIQUE NOT NULL keys
CREATE VIEW reorg.primary_keys AS
SELECT indrelid, (reorg.array_accum(indexrelid))[1] AS indexrelid
CREATE VIEW repack.primary_keys AS
SELECT indrelid, (repack.array_accum(indexrelid))[1] AS indexrelid
FROM (SELECT indrelid, indexrelid FROM pg_index
WHERE indisunique
AND indisvalid
@ -160,30 +160,30 @@ CREATE VIEW reorg.primary_keys AS
ORDER BY indrelid, indisprimary DESC, indnatts, indkey) tmp
GROUP BY indrelid;
CREATE VIEW reorg.tables AS
CREATE VIEW repack.tables AS
SELECT R.oid::regclass AS relname,
R.oid AS relid,
R.reltoastrelid AS reltoastrelid,
CASE WHEN R.reltoastrelid = 0 THEN 0 ELSE (SELECT reltoastidxid FROM pg_class WHERE oid = R.reltoastrelid) END AS reltoastidxid,
PK.indexrelid AS pkid,
CK.indexrelid AS ckid,
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,
'LOCK TABLE ' || reorg.oid2text(R.oid) || ' IN ACCESS EXCLUSIVE MODE' AS lock_table,
reorg.get_index_keys(CK.indexrelid, R.oid) AS ckey,
'SELECT * FROM reorg.log_' || R.oid || ' ORDER BY id LIMIT $1' AS sql_peek,
'INSERT INTO reorg.table_' || R.oid || ' VALUES ($1.*)' AS sql_insert,
'DELETE FROM reorg.table_' || R.oid || ' WHERE ' || reorg.get_compare_pkey(PK.indexrelid, '$1') AS sql_delete,
'UPDATE reorg.table_' || R.oid || ' SET ' || reorg.get_assign(R.oid, '$2') || ' WHERE ' || reorg.get_compare_pkey(PK.indexrelid, '$1') AS sql_update,
'DELETE FROM reorg.log_' || R.oid || ' WHERE id <= $1' AS sql_pop
repack.get_create_index_type(PK.indexrelid, 'repack.pk_' || R.oid) AS create_pktype,
'CREATE TABLE repack.log_' || R.oid || ' (id bigserial PRIMARY KEY, pk repack.pk_' || R.oid || ', row ' || repack.oid2text(R.oid) || ')' AS create_log,
repack.get_create_trigger(R.oid, PK.indexrelid) AS create_trigger,
repack.get_alter_table(R.oid) as alter_table,
'CREATE TABLE repack.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 ' || repack.get_columns_for_create_as(R.oid) || ' FROM ONLY ' || repack.oid2text(R.oid) AS create_table,
repack.get_drop_columns(R.oid, 'repack.table_' || R.oid) AS drop_columns,
'DELETE FROM repack.log_' || R.oid AS delete_log,
'LOCK TABLE ' || repack.oid2text(R.oid) || ' IN ACCESS EXCLUSIVE MODE' AS lock_table,
repack.get_index_keys(CK.indexrelid, R.oid) AS ckey,
'SELECT * FROM repack.log_' || R.oid || ' ORDER BY id LIMIT $1' AS sql_peek,
'INSERT INTO repack.table_' || R.oid || ' VALUES ($1.*)' AS sql_insert,
'DELETE FROM repack.table_' || R.oid || ' WHERE ' || repack.get_compare_pkey(PK.indexrelid, '$1') AS sql_delete,
'UPDATE repack.table_' || R.oid || ' SET ' || repack.get_assign(R.oid, '$2') || ' WHERE ' || repack.get_compare_pkey(PK.indexrelid, '$1') AS sql_update,
'DELETE FROM repack.log_' || R.oid || ' WHERE id <= $1' AS sql_pop
FROM pg_class R
LEFT JOIN pg_class T ON R.reltoastrelid = T.oid
LEFT JOIN reorg.primary_keys PK
LEFT JOIN repack.primary_keys PK
ON R.oid = PK.indrelid
LEFT JOIN (SELECT CKI.* FROM pg_index CKI, pg_class CKT
WHERE CKI.indisvalid
@ -197,26 +197,26 @@ CREATE VIEW reorg.tables AS
AND N.nspname NOT IN ('pg_catalog', 'information_schema')
AND N.nspname NOT LIKE E'pg\\_temp\\_%';
CREATE FUNCTION reorg.reorg_indexdef(oid, oid) RETURNS text AS
'MODULE_PATHNAME', 'reorg_indexdef'
CREATE FUNCTION repack.repack_indexdef(oid, oid) RETURNS text AS
'MODULE_PATHNAME', 'repack_indexdef'
LANGUAGE C STABLE STRICT;
CREATE FUNCTION reorg.reorg_trigger() RETURNS trigger AS
'MODULE_PATHNAME', 'reorg_trigger'
CREATE FUNCTION repack.repack_trigger() RETURNS trigger AS
'MODULE_PATHNAME', 'repack_trigger'
LANGUAGE C VOLATILE STRICT SECURITY DEFINER;
CREATE FUNCTION reorg.conflicted_triggers(oid) RETURNS SETOF name AS
CREATE FUNCTION repack.conflicted_triggers(oid) RETURNS SETOF name AS
$$
SELECT tgname FROM pg_trigger
WHERE tgrelid = $1 AND tgname >= 'z_reorg_trigger'
WHERE tgrelid = $1 AND tgname >= 'z_repack_trigger'
$$
LANGUAGE sql STABLE STRICT;
CREATE FUNCTION reorg.disable_autovacuum(regclass) RETURNS void AS
'MODULE_PATHNAME', 'reorg_disable_autovacuum'
CREATE FUNCTION repack.disable_autovacuum(regclass) RETURNS void AS
'MODULE_PATHNAME', 'repack_disable_autovacuum'
LANGUAGE C VOLATILE STRICT;
CREATE FUNCTION reorg.reorg_apply(
CREATE FUNCTION repack.repack_apply(
sql_peek cstring,
sql_insert cstring,
sql_delete cstring,
@ -224,13 +224,13 @@ CREATE FUNCTION reorg.reorg_apply(
sql_pop cstring,
count integer)
RETURNS integer AS
'MODULE_PATHNAME', 'reorg_apply'
'MODULE_PATHNAME', 'repack_apply'
LANGUAGE C VOLATILE;
CREATE FUNCTION reorg.reorg_swap(oid) RETURNS void AS
'MODULE_PATHNAME', 'reorg_swap'
CREATE FUNCTION repack.repack_swap(oid) RETURNS void AS
'MODULE_PATHNAME', 'repack_swap'
LANGUAGE C VOLATILE STRICT;
CREATE FUNCTION reorg.reorg_drop(oid) RETURNS void AS
'MODULE_PATHNAME', 'reorg_drop'
CREATE FUNCTION repack.repack_drop(oid) RETURNS void AS
'MODULE_PATHNAME', 'repack_drop'
LANGUAGE C VOLATILE STRICT;

View File

@ -1,5 +1,5 @@
/*
* pg_reorg: lib/reorg.c
* pg_repack: lib/repack.c
*
* Portions Copyright (c) 2008-2011, NIPPON TELEGRAPH AND TELEPHONE CORPORATION
* Portions Copyright (c) 2011, Itagaki Takahiro
@ -37,26 +37,26 @@
PG_MODULE_MAGIC;
extern Datum PGUT_EXPORT reorg_version(PG_FUNCTION_ARGS);
extern Datum PGUT_EXPORT reorg_trigger(PG_FUNCTION_ARGS);
extern Datum PGUT_EXPORT reorg_apply(PG_FUNCTION_ARGS);
extern Datum PGUT_EXPORT reorg_get_index_keys(PG_FUNCTION_ARGS);
extern Datum PGUT_EXPORT reorg_indexdef(PG_FUNCTION_ARGS);
extern Datum PGUT_EXPORT reorg_swap(PG_FUNCTION_ARGS);
extern Datum PGUT_EXPORT reorg_drop(PG_FUNCTION_ARGS);
extern Datum PGUT_EXPORT reorg_disable_autovacuum(PG_FUNCTION_ARGS);
extern Datum PGUT_EXPORT repack_version(PG_FUNCTION_ARGS);
extern Datum PGUT_EXPORT repack_trigger(PG_FUNCTION_ARGS);
extern Datum PGUT_EXPORT repack_apply(PG_FUNCTION_ARGS);
extern Datum PGUT_EXPORT repack_get_index_keys(PG_FUNCTION_ARGS);
extern Datum PGUT_EXPORT repack_indexdef(PG_FUNCTION_ARGS);
extern Datum PGUT_EXPORT repack_swap(PG_FUNCTION_ARGS);
extern Datum PGUT_EXPORT repack_drop(PG_FUNCTION_ARGS);
extern Datum PGUT_EXPORT repack_disable_autovacuum(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(reorg_version);
PG_FUNCTION_INFO_V1(reorg_trigger);
PG_FUNCTION_INFO_V1(reorg_apply);
PG_FUNCTION_INFO_V1(reorg_get_index_keys);
PG_FUNCTION_INFO_V1(reorg_indexdef);
PG_FUNCTION_INFO_V1(reorg_swap);
PG_FUNCTION_INFO_V1(reorg_drop);
PG_FUNCTION_INFO_V1(reorg_disable_autovacuum);
PG_FUNCTION_INFO_V1(repack_version);
PG_FUNCTION_INFO_V1(repack_trigger);
PG_FUNCTION_INFO_V1(repack_apply);
PG_FUNCTION_INFO_V1(repack_get_index_keys);
PG_FUNCTION_INFO_V1(repack_indexdef);
PG_FUNCTION_INFO_V1(repack_swap);
PG_FUNCTION_INFO_V1(repack_drop);
PG_FUNCTION_INFO_V1(repack_disable_autovacuum);
static void reorg_init(void);
static SPIPlanPtr reorg_prepare(const char *src, int nargs, Oid *argtypes);
static void repack_init(void);
static SPIPlanPtr repack_prepare(const char *src, int nargs, Oid *argtypes);
static const char *get_quoted_relname(Oid oid);
static const char *get_quoted_nspname(Oid oid);
static void swap_heap_or_index_files(Oid r1, Oid r2);
@ -95,21 +95,21 @@ static void RenameRelationInternal(Oid myrelid, const char *newrelname, Oid name
Datum
reorg_version(PG_FUNCTION_ARGS)
repack_version(PG_FUNCTION_ARGS)
{
return CStringGetTextDatum("pg_reorg 1.1.6");
return CStringGetTextDatum("pg_repack 1.1.6");
}
/**
* @fn Datum reorg_trigger(PG_FUNCTION_ARGS)
* @fn Datum repack_trigger(PG_FUNCTION_ARGS)
* @brief Insert a operation log into log-table.
*
* reorg_trigger(sql)
* repack_trigger(sql)
*
* @param sql SQL to insert a operation log into log-table.
*/
Datum
reorg_trigger(PG_FUNCTION_ARGS)
repack_trigger(PG_FUNCTION_ARGS)
{
TriggerData *trigdata = (TriggerData *) fcinfo->context;
TupleDesc desc;
@ -120,14 +120,14 @@ reorg_trigger(PG_FUNCTION_ARGS)
const char *sql;
/* authority check */
must_be_superuser("reorg_trigger");
must_be_superuser("repack_trigger");
/* make sure it's called as a trigger at all */
if (!CALLED_AS_TRIGGER(fcinfo) ||
!TRIGGER_FIRED_BEFORE(trigdata->tg_event) ||
!TRIGGER_FIRED_FOR_ROW(trigdata->tg_event) ||
trigdata->tg_trigger->tgnargs != 1)
elog(ERROR, "reorg_trigger: invalid trigger call");
elog(ERROR, "repack_trigger: invalid trigger call");
/* retrieve parameters */
sql = trigdata->tg_trigger->tgargs[0];
@ -135,7 +135,7 @@ reorg_trigger(PG_FUNCTION_ARGS)
argtypes[0] = argtypes[1] = trigdata->tg_relation->rd_rel->reltype;
/* connect to SPI manager */
reorg_init();
repack_init();
if (TRIGGER_FIRED_BY_INSERT(trigdata->tg_event))
{
@ -159,7 +159,7 @@ reorg_trigger(PG_FUNCTION_ARGS)
values[1] = copy_tuple(tuple, desc);
}
/* INSERT INTO reorg.log VALUES ($1, $2) */
/* INSERT INTO repack.log VALUES ($1, $2) */
execute_with_args(SPI_OK_INSERT, sql, 2, argtypes, values, nulls);
SPI_finish();
@ -168,10 +168,10 @@ reorg_trigger(PG_FUNCTION_ARGS)
}
/**
* @fn Datum reorg_apply(PG_FUNCTION_ARGS)
* @fn Datum repack_apply(PG_FUNCTION_ARGS)
* @brief Apply operations in log table into temp table.
*
* reorg_apply(sql_peek, sql_insert, sql_delete, sql_update, sql_pop, count)
* repack_apply(sql_peek, sql_insert, sql_delete, sql_update, sql_pop, count)
*
* @param sql_peek SQL to pop tuple from log table.
* @param sql_insert SQL to insert into temp table.
@ -182,7 +182,7 @@ reorg_trigger(PG_FUNCTION_ARGS)
* @retval Number of performed operations.
*/
Datum
reorg_apply(PG_FUNCTION_ARGS)
repack_apply(PG_FUNCTION_ARGS)
{
#define DEFAULT_PEEK_COUNT 1000
@ -204,13 +204,13 @@ reorg_apply(PG_FUNCTION_ARGS)
bool nulls_peek[1] = { 0 };
/* authority check */
must_be_superuser("reorg_apply");
must_be_superuser("repack_apply");
/* connect to SPI manager */
reorg_init();
repack_init();
/* peek tuple in log */
plan_peek = reorg_prepare(sql_peek, 1, argtypes_peek);
plan_peek = repack_prepare(sql_peek, 1, argtypes_peek);
for (n = 0;;)
{
@ -252,28 +252,28 @@ reorg_apply(PG_FUNCTION_ARGS)
{
/* INSERT */
if (plan_insert == NULL)
plan_insert = reorg_prepare(sql_insert, 1, &argtypes[2]);
plan_insert = repack_prepare(sql_insert, 1, &argtypes[2]);
execute_plan(SPI_OK_INSERT, plan_insert, &values[2], &nulls[2]);
}
else if (nulls[2])
{
/* DELETE */
if (plan_delete == NULL)
plan_delete = reorg_prepare(sql_delete, 1, &argtypes[1]);
plan_delete = repack_prepare(sql_delete, 1, &argtypes[1]);
execute_plan(SPI_OK_DELETE, plan_delete, &values[1], &nulls[1]);
}
else
{
/* UPDATE */
if (plan_update == NULL)
plan_update = reorg_prepare(sql_update, 2, &argtypes[1]);
plan_update = repack_prepare(sql_update, 2, &argtypes[1]);
execute_plan(SPI_OK_UPDATE, plan_update, &values[1], &nulls[1]);
}
}
/* delete tuple in log */
if (plan_pop == NULL)
plan_pop = reorg_prepare(sql_pop, 1, argtypes);
plan_pop = repack_prepare(sql_pop, 1, argtypes);
execute_plan(SPI_OK_DELETE, plan_pop, values, nulls);
SPI_freetuptable(tuptable);
@ -464,10 +464,10 @@ parse_indexdef(IndexDef *stmt, Oid index, Oid table)
}
/**
* @fn Datum reorg_get_index_keys(PG_FUNCTION_ARGS)
* @fn Datum repack_get_index_keys(PG_FUNCTION_ARGS)
* @brief Get key definition of the index.
*
* reorg_get_index_keys(index, table)
* repack_get_index_keys(index, table)
*
* @param index Oid of target index.
* @param table Oid of table of the index.
@ -477,7 +477,7 @@ parse_indexdef(IndexDef *stmt, Oid index, Oid table)
* an expression for ORDER BY clause. get_order_by() might be a better name.
*/
Datum
reorg_get_index_keys(PG_FUNCTION_ARGS)
repack_get_index_keys(PG_FUNCTION_ARGS)
{
Oid index = PG_GETARG_OID(0);
Oid table = PG_GETARG_OID(1);
@ -564,17 +564,17 @@ reorg_get_index_keys(PG_FUNCTION_ARGS)
}
/**
* @fn Datum reorg_indexdef(PG_FUNCTION_ARGS)
* @fn Datum repack_indexdef(PG_FUNCTION_ARGS)
* @brief Reproduce DDL that create index at the temp table.
*
* reorg_indexdef(index, table)
* repack_indexdef(index, table)
*
* @param index Oid of target index.
* @param table Oid of table of the index.
* @retval Create index DDL for temp table.
*/
Datum
reorg_indexdef(PG_FUNCTION_ARGS)
repack_indexdef(PG_FUNCTION_ARGS)
{
Oid index = PG_GETARG_OID(0);
Oid table = PG_GETARG_OID(1);
@ -583,7 +583,7 @@ reorg_indexdef(PG_FUNCTION_ARGS)
parse_indexdef(&stmt, index, table);
initStringInfo(&str);
appendStringInfo(&str, "%s index_%u ON reorg.table_%u USING %s (%s)%s",
appendStringInfo(&str, "%s index_%u ON repack.table_%u USING %s (%s)%s",
stmt.create, index, table, stmt.type, stmt.columns, stmt.options);
PG_RETURN_TEXT_P(cstring_to_text(str.data));
@ -598,11 +598,11 @@ getoid(HeapTuple tuple, TupleDesc desc, int column)
}
/**
* @fn Datum reorg_swap(PG_FUNCTION_ARGS)
* @fn Datum repack_swap(PG_FUNCTION_ARGS)
* @brief Swapping relfilenode of tables and relation ids of toast tables
* and toast indexes.
*
* reorg_swap(oid, relname)
* repack_swap(oid, relname)
*
* TODO: remove useless CommandCounterIncrement().
*
@ -610,7 +610,7 @@ getoid(HeapTuple tuple, TupleDesc desc, int column)
* @retval None.
*/
Datum
reorg_swap(PG_FUNCTION_ARGS)
repack_swap(PG_FUNCTION_ARGS)
{
Oid oid = PG_GETARG_OID(0);
const char *relname = get_quoted_relname(oid);
@ -633,10 +633,10 @@ reorg_swap(PG_FUNCTION_ARGS)
Oid owner2;
/* authority check */
must_be_superuser("reorg_swap");
must_be_superuser("repack_swap");
/* connect to SPI manager */
reorg_init();
repack_init();
/* swap relfilenode and dependencies for tables. */
values[0] = ObjectIdGetDatum(oid);
@ -648,7 +648,7 @@ reorg_swap(PG_FUNCTION_ARGS)
" pg_catalog.pg_class Y LEFT JOIN pg_catalog.pg_class TY"
" ON Y.reltoastrelid = TY.oid"
" WHERE X.oid = $1"
" AND Y.oid = ('reorg.table_' || X.oid)::regclass",
" AND Y.oid = ('repack.table_' || X.oid)::regclass",
1, argtypes, values, nulls);
tuptable = SPI_tuptable;
@ -656,7 +656,7 @@ reorg_swap(PG_FUNCTION_ARGS)
records = SPI_processed;
if (records == 0)
elog(ERROR, "reorg_swap : no swap target");
elog(ERROR, "repack_swap : no swap target");
tuple = tuptable->vals[0];
@ -689,7 +689,7 @@ reorg_swap(PG_FUNCTION_ARGS)
" WHERE I.indrelid = $1"
" AND I.indexrelid = X.oid"
" AND I.indisvalid"
" AND Y.oid = ('reorg.index_' || X.oid)::regclass",
" AND Y.oid = ('repack.index_' || X.oid)::regclass",
1, argtypes, values, nulls);
tuptable = SPI_tuptable;
@ -714,7 +714,7 @@ reorg_swap(PG_FUNCTION_ARGS)
if (reltoastidxid1 != InvalidOid ||
reltoastrelid2 != InvalidOid ||
reltoastidxid2 != InvalidOid)
elog(ERROR, "reorg_swap : unexpected toast relations (T1=%u, I1=%u, T2=%u, I2=%u",
elog(ERROR, "repack_swap : unexpected toast relations (T1=%u, I1=%u, T2=%u, I2=%u",
reltoastrelid1, reltoastidxid1, reltoastrelid2, reltoastidxid2);
/* do nothing */
}
@ -724,7 +724,7 @@ reorg_swap(PG_FUNCTION_ARGS)
if (reltoastidxid1 == InvalidOid ||
reltoastidxid2 != InvalidOid)
elog(ERROR, "reorg_swap : unexpected toast relations (T1=%u, I1=%u, T2=%u, I2=%u",
elog(ERROR, "repack_swap : unexpected toast relations (T1=%u, I1=%u, T2=%u, I2=%u",
reltoastrelid1, reltoastidxid1, reltoastrelid2, reltoastidxid2);
/* rename X to Y */
@ -761,10 +761,10 @@ reorg_swap(PG_FUNCTION_ARGS)
CommandCounterIncrement();
}
/* drop reorg trigger */
/* drop repack trigger */
execute_with_format(
SPI_OK_UTILITY,
"DROP TRIGGER IF EXISTS z_reorg_trigger ON %s.%s CASCADE",
"DROP TRIGGER IF EXISTS z_repack_trigger ON %s.%s CASCADE",
nspname, relname);
SPI_finish();
@ -773,34 +773,34 @@ reorg_swap(PG_FUNCTION_ARGS)
}
/**
* @fn Datum reorg_drop(PG_FUNCTION_ARGS)
* @fn Datum repack_drop(PG_FUNCTION_ARGS)
* @brief Delete temporarily objects.
*
* reorg_drop(oid, relname)
* repack_drop(oid, relname)
*
* @param oid Oid of target table.
* @retval None.
*/
Datum
reorg_drop(PG_FUNCTION_ARGS)
repack_drop(PG_FUNCTION_ARGS)
{
Oid oid = PG_GETARG_OID(0);
const char *relname = get_quoted_relname(oid);
const char *nspname = get_quoted_nspname(oid);
/* authority check */
must_be_superuser("reorg_drop");
must_be_superuser("repack_drop");
/* connect to SPI manager */
reorg_init();
repack_init();
/*
* drop reorg trigger: We have already dropped the trigger in normal
* drop repack trigger: We have already dropped the trigger in normal
* cases, but it can be left on error.
*/
execute_with_format(
SPI_OK_UTILITY,
"DROP TRIGGER IF EXISTS z_reorg_trigger ON %s.%s CASCADE",
"DROP TRIGGER IF EXISTS z_repack_trigger ON %s.%s CASCADE",
nspname, relname);
#if PG_VERSION_NUM < 80400
@ -810,7 +810,7 @@ reorg_drop(PG_FUNCTION_ARGS)
"DELETE FROM pg_catalog.pg_autovacuum v"
" USING pg_class c, pg_namespace n"
" WHERE relname IN ('log_%u', 'table_%u')"
" AND n.nspname = 'reorg'"
" AND n.nspname = 'repack'"
" AND c.relnamespace = n.oid"
" AND v.vacrelid = c.oid",
oid, oid);
@ -819,19 +819,19 @@ reorg_drop(PG_FUNCTION_ARGS)
/* drop log table */
execute_with_format(
SPI_OK_UTILITY,
"DROP TABLE IF EXISTS reorg.log_%u CASCADE",
"DROP TABLE IF EXISTS repack.log_%u CASCADE",
oid);
/* drop temp table */
execute_with_format(
SPI_OK_UTILITY,
"DROP TABLE IF EXISTS reorg.table_%u CASCADE",
"DROP TABLE IF EXISTS repack.table_%u CASCADE",
oid);
/* drop type for log table */
execute_with_format(
SPI_OK_UTILITY,
"DROP TYPE IF EXISTS reorg.pk_%u CASCADE",
"DROP TYPE IF EXISTS repack.pk_%u CASCADE",
oid);
SPI_finish();
@ -840,12 +840,12 @@ reorg_drop(PG_FUNCTION_ARGS)
}
Datum
reorg_disable_autovacuum(PG_FUNCTION_ARGS)
repack_disable_autovacuum(PG_FUNCTION_ARGS)
{
Oid oid = PG_GETARG_OID(0);
/* connect to SPI manager */
reorg_init();
repack_init();
#if PG_VERSION_NUM >= 80400
execute_with_format(
@ -866,20 +866,20 @@ reorg_disable_autovacuum(PG_FUNCTION_ARGS)
/* init SPI */
static void
reorg_init(void)
repack_init(void)
{
int ret = SPI_connect();
if (ret != SPI_OK_CONNECT)
elog(ERROR, "pg_reorg: SPI_connect returned %d", ret);
elog(ERROR, "pg_repack: SPI_connect returned %d", ret);
}
/* prepare plan */
static SPIPlanPtr
reorg_prepare(const char *src, int nargs, Oid *argtypes)
repack_prepare(const char *src, int nargs, Oid *argtypes)
{
SPIPlanPtr plan = SPI_prepare(src, nargs, argtypes);
if (plan == NULL)
elog(ERROR, "pg_reorg: reorg_prepare failed (code=%d, query=%s)", SPI_result, src);
elog(ERROR, "pg_repack: repack_prepare failed (code=%d, query=%s)", SPI_result, src);
return plan;
}

View File

@ -1,8 +1,8 @@
/*
* pg_reorg: lib/uninstall_reorg.sql
* pg_repack: lib/uninstall_repack.sql
*
* Portions Copyright (c) 2008-2011, NIPPON TELEGRAPH AND TELEPHONE CORPORATION
* Portions Copyright (c) 2011, Itagaki Takahiro
*/
DROP SCHEMA IF EXISTS reorg CASCADE;
DROP SCHEMA IF EXISTS repack CASCADE;