From 914d1c4b3d81a9bbeb5b0e60f74b70619ddcc3cc Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Wed, 29 Mar 2017 03:13:13 +0100 Subject: [PATCH 01/23] Document supported versions are 9.1 to 9.6 --- doc/pg_repack.rst | 4 ++-- doc/pg_repack_jp.rst | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/doc/pg_repack.rst b/doc/pg_repack.rst index 388a261..2a39311 100644 --- a/doc/pg_repack.rst +++ b/doc/pg_repack.rst @@ -40,7 +40,7 @@ Requirements ------------ PostgreSQL versions - PostgreSQL 8.3, 8.4, 9.0, 9.1, 9.2, 9.3, 9.4, 9.5, 9.6 + PostgreSQL 9.1, 9.2, 9.3, 9.4, 9.5, 9.6 Disks Performing a full-table repack requires free disk space about twice as @@ -472,7 +472,7 @@ Releases * pg_repack 1.4 - * added support for PostgreSQL 9.6 + * added support for PostgreSQL 9.6, dropped support for versions before 9.1 * use ``AFTER`` trigger to solve concurrency problems with ``INSERT CONFLICT`` (issue #106) * added ``--no-kill-backend`` option (issue #108) diff --git a/doc/pg_repack_jp.rst b/doc/pg_repack_jp.rst index 3f397b4..937fc34 100644 --- a/doc/pg_repack_jp.rst +++ b/doc/pg_repack_jp.rst @@ -62,7 +62,7 @@ pg_repackでは再編成する方法として次のものが選択できます ------------ PostgreSQL versions - PostgreSQL 8.3, 8.4, 9.0, 9.1, 9.2, 9.3, 9.4, 9.5, 9.6 + PostgreSQL 9.1, 9.2, 9.3, 9.4, 9.5, 9.6 Disks Performing a full-table repack requires free disk space about twice as @@ -75,7 +75,7 @@ pg_repackでは再編成する方法として次のものが選択できます --------- PostgreSQL バージョン - PostgreSQL 8.3, 8.4, 9.0, 9.1, 9.2, 9.3, 9.4 + PostgreSQL 9.1, 9.2, 9.3, 9.4, 9.5, 9.6 ディスク テーブル全体の再編成を行うには、対象となるテーブルと付属するインデックスのおよそ2倍のサイズのディスク空き容量が必要です。例えば、テーブルとインデックスを合わせたサイズが1GBの場合、2GBのディスク領域が必要となります。 From 329f30e3cec2ad56dd5f6492d690418f171d6477 Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Wed, 29 Mar 2017 03:30:03 +0100 Subject: [PATCH 02/23] Streamline tests to run only on supported versions --- regress/Makefile | 20 +------------------- regress/expected/init-legacy.out | 3 --- regress/expected/plpgsql.out | 1 - regress/sql/init-legacy.sql | 5 ----- regress/sql/plpgsql.sql | 1 - 5 files changed, 1 insertion(+), 29 deletions(-) delete mode 100644 regress/expected/init-legacy.out delete mode 100644 regress/expected/plpgsql.out delete mode 100644 regress/sql/init-legacy.sql delete mode 100644 regress/sql/plpgsql.sql diff --git a/regress/Makefile b/regress/Makefile index f0425ca..943f440 100644 --- a/regress/Makefile +++ b/regress/Makefile @@ -17,26 +17,8 @@ INTVERSION := $(shell echo $$(($$(echo $(VERSION) | sed 's/\([[:digit:]]\{1,\}\) # Test suite # -ifeq ($(shell echo $$(($(INTVERSION) >= 901))),1) -REGRESS := init-extension -else -REGRESS := init-legacy -endif - -# plpgsql not available by default on pg < 9.0 -ifeq ($(shell echo $$(($(INTVERSION) < 900))),1) -REGRESS += plpgsql -endif - -REGRESS += repack tablespace - -# This test depends on collate, not supported before 9.1 -ifeq ($(shell echo $$(($(INTVERSION) >= 901))),1) -REGRESS += issue3 -endif - +REGRESS := init-extension repack tablespace issue3 USE_PGXS = 1 # use pgxs if not in contrib directory -PG_CONFIG = pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) include $(PGXS) diff --git a/regress/expected/init-legacy.out b/regress/expected/init-legacy.out deleted file mode 100644 index 43f11fa..0000000 --- a/regress/expected/init-legacy.out +++ /dev/null @@ -1,3 +0,0 @@ -SET client_min_messages = warning; -\set ECHO none -RESET client_min_messages; diff --git a/regress/expected/plpgsql.out b/regress/expected/plpgsql.out deleted file mode 100644 index bc028fb..0000000 --- a/regress/expected/plpgsql.out +++ /dev/null @@ -1 +0,0 @@ -CREATE LANGUAGE plpgsql; diff --git a/regress/sql/init-legacy.sql b/regress/sql/init-legacy.sql deleted file mode 100644 index 8b7b998..0000000 --- a/regress/sql/init-legacy.sql +++ /dev/null @@ -1,5 +0,0 @@ -SET client_min_messages = warning; -\set ECHO none -\i ../lib/pg_repack.sql -\set ECHO all -RESET client_min_messages; diff --git a/regress/sql/plpgsql.sql b/regress/sql/plpgsql.sql deleted file mode 100644 index bc028fb..0000000 --- a/regress/sql/plpgsql.sql +++ /dev/null @@ -1 +0,0 @@ -CREATE LANGUAGE plpgsql; From 46dd16a6ed9e837898f58de02b5bd6a86e6a376e Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Wed, 29 Mar 2017 03:32:55 +0100 Subject: [PATCH 03/23] Dropped doc about non-extension installation --- doc/pg_repack.rst | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/doc/pg_repack.rst b/doc/pg_repack.rst index 2a39311..c35c6fa 100644 --- a/doc/pg_repack.rst +++ b/doc/pg_repack.rst @@ -84,21 +84,12 @@ You can also use Microsoft Visual C++ 2010 to build the program on Windows. There are project files in the ``msvc`` folder. After installation, load the pg_repack extension in the database you want to -process. On PostgreSQL 9.1 and following pg_repack is packaged as an -extension, so you can execute:: +process. pg_repack is packaged as an extension, so you can execute:: $ psql -c "CREATE EXTENSION pg_repack" -d your_database -For previous PostgreSQL versions you should load the script -``$SHAREDIR/contrib/pg_repack.sql`` in the database to process; you can -get ``$SHAREDIR`` using ``pg_config --sharedir``, e.g. :: - - $ psql -f "$(pg_config --sharedir)/contrib/pg_repack.sql" -d your_database - -You can remove pg_repack from a PostgreSQL 9.1 and following database using -``DROP EXTENSION pg_repack``. For previous Postgresql versions load the -``$SHAREDIR/contrib/uninstall_pg_repack.sql`` script or just drop the -``repack`` schema. +You can remove pg_repack using ``DROP EXTENSION pg_repack`` or just dropping +the ``repack`` schema. If you are upgrading from a previous version of pg_repack or pg_reorg, just drop the old version from the database as explained above and install the new From 2af90dced1814f35c904592eb112abe476536b2c Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Wed, 29 Mar 2017 03:35:20 +0100 Subject: [PATCH 04/23] Dropped sql file for non-extension build --- lib/Makefile | 6 ------ lib/uninstall_pg_repack.sql | 9 --------- 2 files changed, 15 deletions(-) delete mode 100644 lib/uninstall_pg_repack.sql diff --git a/lib/Makefile b/lib/Makefile index 83351da..dc511c7 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -25,13 +25,7 @@ REPACK_VERSION = $(shell grep '"version":' ../META.json | head -1 \ PG_CPPFLAGS = -DREPACK_VERSION=$(REPACK_VERSION) -# Support CREATE EXTENSION for PG >= 9.1 and a simple sql script for PG < 9.1 -ifeq ($(shell echo $$(($(INTVERSION) >= 901))),1) DATA_built = pg_repack--$(REPACK_VERSION).sql pg_repack.control -else -DATA_built = pg_repack.sql -DATA = uninstall_pg_repack.sql -endif USE_PGXS = 1 PGXS := $(shell $(PG_CONFIG) --pgxs) diff --git a/lib/uninstall_pg_repack.sql b/lib/uninstall_pg_repack.sql deleted file mode 100644 index 7f5aa49..0000000 --- a/lib/uninstall_pg_repack.sql +++ /dev/null @@ -1,9 +0,0 @@ -/* - * pg_repack: lib/uninstall_repack.sql - * - * Portions Copyright (c) 2008-2011, NIPPON TELEGRAPH AND TELEPHONE CORPORATION - * Portions Copyright (c) 2011, Itagaki Takahiro - * Portions Copyright (c) 2012-2015, The Reorg Development Team - */ - -DROP SCHEMA IF EXISTS repack CASCADE; From ecb07f1e3fd02ff90cf4dc4e4db597263f413244 Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Wed, 29 Mar 2017 04:32:03 +0100 Subject: [PATCH 05/23] Force Postgres 9.1 in makefile --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index a0a0d8a..445575a 100644 --- a/Makefile +++ b/Makefile @@ -24,8 +24,8 @@ INTVERSION := $(shell echo $$(($$(echo $(VERSION) | sed 's/\([[:digit:]]\{1,\}\) EXTVERSION = $(shell grep '"version":' META.json | head -1 \ | sed -e 's/[ ]*"version":[ ]*"\(.*\)",/\1/') -ifeq ($(shell echo $$(($(INTVERSION) < 803))),1) -$(error $(EXTENSION) requires PostgreSQL 8.3 or later. This is $(VERSION)) +ifeq ($(shell echo $$(($(INTVERSION) < 901))),1) +$(error $(EXTENSION) requires PostgreSQL 9.1 or later. This is $(VERSION)) endif SUBDIRS = bin lib regress From acb73b5a209d000071a66dac5d041e535c8b95f7 Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Wed, 29 Mar 2017 04:43:19 +0100 Subject: [PATCH 06/23] Dropped unneeded test results variants --- regress/expected/repack_1.out | 64 +++-- regress/expected/repack_2.out | 389 --------------------------- regress/expected/repack_3.out | 423 ------------------------------ regress/expected/tablespace.out | 32 +-- regress/expected/tablespace_2.out | 234 ----------------- 5 files changed, 65 insertions(+), 1077 deletions(-) delete mode 100644 regress/expected/repack_2.out delete mode 100644 regress/expected/repack_3.out delete mode 100644 regress/expected/tablespace_2.out diff --git a/regress/expected/repack_1.out b/regress/expected/repack_1.out index 52ef915..f800f07 100644 --- a/regress/expected/repack_1.out +++ b/regress/expected/repack_1.out @@ -139,8 +139,8 @@ INFO: repacking table "tbl_idxopts" time | timestamp without time zone | ,") | text | not null Indexes: - "tbl_cluster_pkey" PRIMARY KEY, btree (","")", col1) WITH (fillfactor=75) - ",") cluster" btree ("time", length(","")"), ","")" text_pattern_ops) WITH (fillfactor=75) CLUSTER + "tbl_cluster_pkey" PRIMARY KEY, btree (","")", col1) WITH (fillfactor='75') + ",") cluster" btree ("time", length(","")"), ","")" text_pattern_ops) WITH (fillfactor='75') CLUSTER \d tbl_gistkey Table "public.tbl_gistkey" @@ -180,8 +180,8 @@ Table "public.tbl_with_dropped_column" c2 | text | c3 | text | Indexes: - "tbl_with_dropped_column_pkey" PRIMARY KEY, btree (id) WITH (fillfactor=75) CLUSTER - "idx_c1c2" btree (c1, c2) WITH (fillfactor=75) + "tbl_with_dropped_column_pkey" PRIMARY KEY, btree (id) WITH (fillfactor='75') CLUSTER + "idx_c1c2" btree (c1, c2) WITH (fillfactor='75') "idx_c2c1" btree (c2, c1) \d tbl_with_dropped_toast @@ -325,7 +325,7 @@ INFO: repacking table "tbl_pk_uk" -- => OK \! pg_repack --dbname=contrib_regression --table=tbl_pk_uk --only-indexes INFO: repacking indexes of "tbl_pk_uk" -INFO: repacking index "public"."tbl_pk_uk_col2_key" +INFO: repacking index "public"."tbl_pk_uk_col2_col1_key" INFO: repacking index "public"."tbl_pk_uk_pkey" -- => OK \! pg_repack --dbname=contrib_regression --table=tbl_nn_puk @@ -338,25 +338,19 @@ CREATE FUNCTION trgtest() RETURNS trigger AS $$BEGIN RETURN NEW; END$$ LANGUAGE plpgsql; CREATE TABLE trg1 (id integer PRIMARY KEY); -CREATE TRIGGER z_repack_triggeq BEFORE UPDATE ON trg1 FOR EACH ROW EXECUTE PROCEDURE trgtest(); +CREATE TRIGGER repack_trigger_1 AFTER UPDATE ON trg1 FOR EACH ROW EXECUTE PROCEDURE trgtest(); \! pg_repack --dbname=contrib_regression --table=trg1 INFO: repacking table "trg1" CREATE TABLE trg2 (id integer PRIMARY KEY); -CREATE TRIGGER z_repack_trigger BEFORE UPDATE ON trg2 FOR EACH ROW EXECUTE PROCEDURE trgtest(); +CREATE TRIGGER repack_trigger AFTER UPDATE ON trg2 FOR EACH ROW EXECUTE PROCEDURE trgtest(); \! pg_repack --dbname=contrib_regression --table=trg2 INFO: repacking table "trg2" -WARNING: the table "trg2" already has a trigger called "z_repack_trigger" +WARNING: the table "trg2" already has a trigger called "repack_trigger" DETAIL: The trigger was probably installed during a previous attempt to run pg_repack on the table which was interrupted and for some reason failed to clean up the temporary objects. Please drop the trigger or drop and recreate the pg_repack extension altogether to remove all the temporary objects left over. CREATE TABLE trg3 (id integer PRIMARY KEY); -CREATE TRIGGER z_repack_trigges BEFORE UPDATE ON trg3 FOR EACH ROW EXECUTE PROCEDURE trgtest(); +CREATE TRIGGER repack_trigger_1 BEFORE UPDATE ON trg3 FOR EACH ROW EXECUTE PROCEDURE trgtest(); \! pg_repack --dbname=contrib_regression --table=trg3 INFO: repacking table "trg3" -WARNING: trigger "z_repack_trigges" conflicting on table "trg3" -DETAIL: The trigger "z_repack_trigger" must be the last of the BEFORE triggers to fire on the table (triggers fire in alphabetical order). Please rename the trigger so that it sorts before "z_repack_trigger": you can use "ALTER TRIGGER z_repack_trigges ON trg3 RENAME TO newname". -CREATE TABLE trg4 (id integer PRIMARY KEY); -CREATE TRIGGER zzzzzz AFTER UPDATE ON trg4 FOR EACH ROW EXECUTE PROCEDURE trgtest(); -\! pg_repack --dbname=contrib_regression --table=trg4 -INFO: repacking table "trg4" -- -- Dry run -- @@ -387,3 +381,43 @@ ERROR: cannot repack specific table(s) in schema, use schema.table notation inst -- => ERROR \! pg_repack --dbname=contrib_regression --all --schema=test_schema1 ERROR: cannot repack specific schema(s) in all databases +-- +-- don't kill backend +-- +\! pg_repack --dbname=contrib_regression --table=tbl_cluster --no-kill-backend +INFO: repacking table "tbl_cluster" +-- +-- no superuser check +-- +DROP ROLE IF EXISTS nosuper; +CREATE ROLE nosuper WITH LOGIN; +-- => OK +\! pg_repack --dbname=contrib_regression --table=tbl_cluster --no-superuser-check +INFO: repacking table "tbl_cluster" +-- => ERROR +\! pg_repack --dbname=contrib_regression --table=tbl_cluster --username=nosuper +ERROR: pg_repack failed with error: You must be a superuser to use pg_repack +-- => ERROR +\! pg_repack --dbname=contrib_regression --table=tbl_cluster --username=nosuper --no-superuser-check +ERROR: pg_repack failed with error: ERROR: permission denied for schema repack +DROP ROLE IF EXISTS nosuper; +-- +-- exclude extension check +-- +CREATE SCHEMA exclude_extension_schema; +CREATE TABLE exclude_extension_schema.tbl(val integer primary key); +-- => ERROR +\! pg_repack --dbname=contrib_regression --table=dummy_table --exclude-extension=dummy_extension +ERROR: cannot specify --table (-t) and --exclude-extension (-C) +-- => ERROR +\! pg_repack --dbname=contrib_regression --table=dummy_table --exclude-extension=dummy_extension -x +ERROR: cannot specify --only-indexes (-x) and --exclude-extension (-C) +-- => ERROR +\! pg_repack --dbname=contrib_regression --index=dummy_index --exclude-extension=dummy_extension +ERROR: cannot specify --index (-i) and --exclude-extension (-C) +-- => OK +\! pg_repack --dbname=contrib_regression --schema=exclude_extension_schema --exclude-extension=dummy_extension +INFO: repacking table "exclude_extension_schema.tbl" +-- => OK +\! pg_repack --dbname=contrib_regression --schema=exclude_extension_schema --exclude-extension=dummy_extension --exclude-extension=dummy_extension +INFO: repacking table "exclude_extension_schema.tbl" diff --git a/regress/expected/repack_2.out b/regress/expected/repack_2.out deleted file mode 100644 index 017d5a4..0000000 --- a/regress/expected/repack_2.out +++ /dev/null @@ -1,389 +0,0 @@ -SET client_min_messages = warning; --- --- create table. --- -CREATE TABLE tbl_cluster ( - col1 int, - "time" timestamp, - ","")" text, - PRIMARY KEY (","")", col1) WITH (fillfactor = 75) -) WITH (fillfactor = 70); -CREATE INDEX ","") cluster" ON tbl_cluster ("time", length(","")"), ","")" text_pattern_ops) WITH (fillfactor = 75); -ALTER TABLE tbl_cluster CLUSTER ON ","") cluster"; -CREATE TABLE tbl_only_pkey ( - col1 int PRIMARY KEY, - ","")" text -); -CREATE TABLE tbl_only_ckey ( - col1 int, - col2 timestamp, - ","")" text -) WITH (fillfactor = 70); -CREATE INDEX cidx_only_ckey ON tbl_only_ckey (col2, ","")"); -ALTER TABLE tbl_only_ckey CLUSTER ON cidx_only_ckey; -CREATE TABLE tbl_gistkey ( - id integer PRIMARY KEY, - c circle -); -CREATE INDEX cidx_circle ON tbl_gistkey USING gist (c); -ALTER TABLE tbl_gistkey CLUSTER ON cidx_circle; -CREATE TABLE tbl_with_dropped_column ( - d1 text, - c1 text, - id integer PRIMARY KEY, - d2 text, - c2 text, - d3 text -); -ALTER INDEX tbl_with_dropped_column_pkey SET (fillfactor = 75); -ALTER TABLE tbl_with_dropped_column CLUSTER ON tbl_with_dropped_column_pkey; -CREATE INDEX idx_c1c2 ON tbl_with_dropped_column (c1, c2) WITH (fillfactor = 75); -CREATE INDEX idx_c2c1 ON tbl_with_dropped_column (c2, c1); -CREATE TABLE tbl_with_dropped_toast ( - i integer, - j integer, - t text, - PRIMARY KEY (i, j) -); -ALTER TABLE tbl_with_dropped_toast CLUSTER ON tbl_with_dropped_toast_pkey; -CREATE TABLE tbl_badindex ( - id integer PRIMARY KEY, - n integer -); -CREATE TABLE tbl_idxopts ( - i integer PRIMARY KEY, - t text -); -CREATE INDEX idxopts_t ON tbl_idxopts (t DESC NULLS LAST) WHERE (t != 'aaa'); --- --- insert data --- -INSERT INTO tbl_cluster VALUES(1, '2008-12-31 10:00:00', 'admin'); -INSERT INTO tbl_cluster VALUES(2, '2008-01-01 00:00:00', 'king'); -INSERT INTO tbl_cluster VALUES(3, '2008-03-04 12:00:00', 'joker'); -INSERT INTO tbl_cluster VALUES(4, '2008-03-05 15:00:00', 'queen'); -INSERT INTO tbl_cluster VALUES(5, '2008-01-01 00:30:00', sqrt(2::numeric(1000,999))::text || sqrt(3::numeric(1000,999))::text); -INSERT INTO tbl_only_pkey VALUES(1, 'abc'); -INSERT INTO tbl_only_pkey VALUES(2, 'def'); -INSERT INTO tbl_only_ckey VALUES(1, '2008-01-01 00:00:00', 'abc'); -INSERT INTO tbl_only_ckey VALUES(2, '2008-02-01 00:00:00', 'def'); -INSERT INTO tbl_gistkey VALUES(1, '<(1,2),3>'); -INSERT INTO tbl_gistkey VALUES(2, '<(4,5),6>'); -INSERT INTO tbl_with_dropped_column VALUES('d1', 'c1', 2, 'd2', 'c2', 'd3'); -INSERT INTO tbl_with_dropped_column VALUES('d1', 'c1', 1, 'd2', 'c2', 'd3'); -ALTER TABLE tbl_with_dropped_column DROP COLUMN d1; -ALTER TABLE tbl_with_dropped_column DROP COLUMN d2; -ALTER TABLE tbl_with_dropped_column DROP COLUMN d3; -ALTER TABLE tbl_with_dropped_column ADD COLUMN c3 text; -CREATE VIEW view_for_dropped_column AS - SELECT * FROM tbl_with_dropped_column; -INSERT INTO tbl_with_dropped_toast VALUES(1, 10, 'abc'); -INSERT INTO tbl_with_dropped_toast VALUES(2, 20, sqrt(2::numeric(1000,999))::text || sqrt(3::numeric(1000,999))::text); -ALTER TABLE tbl_with_dropped_toast DROP COLUMN t; -INSERT INTO tbl_badindex VALUES(1, 10); -INSERT INTO tbl_badindex VALUES(2, 10); --- This will fail. Silence the message as it's different across PG versions. -SET client_min_messages = fatal; -CREATE UNIQUE INDEX CONCURRENTLY idx_badindex_n ON tbl_badindex (n); -SET client_min_messages = warning; -INSERT INTO tbl_idxopts VALUES (0, 'abc'), (1, 'aaa'), (2, NULL), (3, 'bbb'); --- --- before --- -SELECT * FROM tbl_with_dropped_column; - c1 | id | c2 | c3 -----+----+----+---- - c1 | 2 | c2 | - c1 | 1 | c2 | -(2 rows) - -SELECT * FROM view_for_dropped_column; - c1 | id | c2 | c3 -----+----+----+---- - c1 | 2 | c2 | - c1 | 1 | c2 | -(2 rows) - -SELECT * FROM tbl_with_dropped_toast; - i | j ----+---- - 1 | 10 - 2 | 20 -(2 rows) - --- --- do repack --- -\! pg_repack --dbname=contrib_regression --table=tbl_cluster -INFO: repacking table "tbl_cluster" -\! pg_repack --dbname=contrib_regression --table=tbl_badindex -INFO: repacking table "tbl_badindex" -WARNING: skipping invalid index: CREATE UNIQUE INDEX idx_badindex_n ON tbl_badindex USING btree (n) -\! pg_repack --dbname=contrib_regression -INFO: repacking table "tbl_cluster" -INFO: repacking table "tbl_only_pkey" -INFO: repacking table "tbl_gistkey" -INFO: repacking table "tbl_with_dropped_column" -INFO: repacking table "tbl_with_dropped_toast" -INFO: repacking table "tbl_badindex" -WARNING: skipping invalid index: CREATE UNIQUE INDEX idx_badindex_n ON tbl_badindex USING btree (n) -INFO: repacking table "tbl_idxopts" --- --- after --- -\d tbl_cluster - Table "public.tbl_cluster" - Column | Type | Modifiers ---------+-----------------------------+----------- - col1 | integer | not null - time | timestamp without time zone | - ,") | text | not null -Indexes: - "tbl_cluster_pkey" PRIMARY KEY, btree (","")", col1) WITH (fillfactor=75) - ",") cluster" btree ("time", length(","")"), ","")" text_pattern_ops) WITH (fillfactor=75) CLUSTER - -\d tbl_gistkey - Table "public.tbl_gistkey" - Column | Type | Modifiers ---------+---------+----------- - id | integer | not null - c | circle | -Indexes: - "tbl_gistkey_pkey" PRIMARY KEY, btree (id) - "cidx_circle" gist (c) CLUSTER - -\d tbl_only_ckey - Table "public.tbl_only_ckey" - Column | Type | Modifiers ---------+-----------------------------+----------- - col1 | integer | - col2 | timestamp without time zone | - ,") | text | -Indexes: - "cidx_only_ckey" btree (col2, ","")") CLUSTER - -\d tbl_only_pkey - Table "public.tbl_only_pkey" - Column | Type | Modifiers ---------+---------+----------- - col1 | integer | not null - ,") | text | -Indexes: - "tbl_only_pkey_pkey" PRIMARY KEY, btree (col1) - -\d tbl_with_dropped_column -Table "public.tbl_with_dropped_column" - Column | Type | Modifiers ---------+---------+----------- - c1 | text | - id | integer | not null - c2 | text | - c3 | text | -Indexes: - "tbl_with_dropped_column_pkey" PRIMARY KEY, btree (id) WITH (fillfactor=75) CLUSTER - "idx_c1c2" btree (c1, c2) WITH (fillfactor=75) - "idx_c2c1" btree (c2, c1) - -\d tbl_with_dropped_toast -Table "public.tbl_with_dropped_toast" - Column | Type | Modifiers ---------+---------+----------- - i | integer | not null - j | integer | not null -Indexes: - "tbl_with_dropped_toast_pkey" PRIMARY KEY, btree (i, j) CLUSTER - -\d tbl_idxopts - Table "public.tbl_idxopts" - Column | Type | Modifiers ---------+---------+----------- - i | integer | not null - t | text | -Indexes: - "tbl_idxopts_pkey" PRIMARY KEY, btree (i) - "idxopts_t" btree (t DESC NULLS LAST) WHERE t <> 'aaa'::text - -SELECT col1, to_char("time", 'YYYY-MM-DD HH24:MI:SS'), ","")" FROM tbl_cluster; - col1 | to_char | ,") -------+---------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - 2 | 2008-01-01 00:00:00 | king - 5 | 2008-01-01 00:30:00 | 1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727350138462309122970249248360558507372126441214970999358314132226659275055927557999505011527820605714701095599716059702745345968620147285174186408891986095523292304843087143214508397626036279952514079896872533965463318088296406206152583523950547457502877599617298355752203375318570113543746034084988471603868999706990048150305440277903164542478230684929369186215805784631115966687130130156185689872372352885092648612494977154218334204285686060146824720771435854874155657069677653720226485447015858801620758474922657226002085584466521458398893944370926591800311388246468157082630100594858704003186480342194897278290641045072636881313739855256117322040245091227700226941127573627280495738108967504018369868368450725799364729060762996941380475654823728997180326802474420629269124859052181004459842150591120249441341728531478105803603371077309182869314710171111683916581726889419758716582152128229518488471.732050807568877293527446341505872366942805253810380628055806979451933016908800037081146186757248575675626141415406703029969945094998952478811655512094373648528093231902305582067974820101084674923265015312343266903322886650672254668921837971227047131660367861588019049986537379859389467650347506576050756618348129606100947602187190325083145829523959832997789824508288714463832917347224163984587855397667958063818353666110843173780894378316102088305524901670023520711144288695990956365797087168498072899493296484283020786408603988738697537582317317831395992983007838702877053913369563312103707264019249106768231199288375641141422016742752102372994270831059898459475987664288897796147837958390228854852903576033852808064381972344661059689722872865264153822664698420021195484155278441181286534507035191650016689294415480846071277143999762926834629577438361895110127148638746976545982451788550975379013880664961911962222957110555242923723192197738262561631468842032853716682938649611917049738836395495938 - 3 | 2008-03-04 12:00:00 | joker - 4 | 2008-03-05 15:00:00 | queen - 1 | 2008-12-31 10:00:00 | admin -(5 rows) - -SELECT * FROM tbl_only_ckey ORDER BY 1; - col1 | col2 | ,") -------+--------------------------+----- - 1 | Tue Jan 01 00:00:00 2008 | abc - 2 | Fri Feb 01 00:00:00 2008 | def -(2 rows) - -SELECT * FROM tbl_only_pkey ORDER BY 1; - col1 | ,") -------+----- - 1 | abc - 2 | def -(2 rows) - -SELECT * FROM tbl_gistkey ORDER BY 1; - id | c -----+----------- - 1 | <(1,2),3> - 2 | <(4,5),6> -(2 rows) - -SET enable_seqscan = on; -SET enable_indexscan = off; -SELECT * FROM tbl_with_dropped_column; - c1 | id | c2 | c3 -----+----+----+---- - c1 | 1 | c2 | - c1 | 2 | c2 | -(2 rows) - -SELECT * FROM view_for_dropped_column; - c1 | id | c2 | c3 -----+----+----+---- - c1 | 1 | c2 | - c1 | 2 | c2 | -(2 rows) - -SELECT * FROM tbl_with_dropped_toast; - i | j ----+---- - 1 | 10 - 2 | 20 -(2 rows) - -SET enable_seqscan = off; -SET enable_indexscan = on; -SELECT * FROM tbl_with_dropped_column; - c1 | id | c2 | c3 -----+----+----+---- - c1 | 1 | c2 | - c1 | 2 | c2 | -(2 rows) - -SELECT * FROM view_for_dropped_column; - c1 | id | c2 | c3 -----+----+----+---- - c1 | 1 | c2 | - c1 | 2 | c2 | -(2 rows) - -SELECT * FROM tbl_with_dropped_toast; - i | j ----+---- - 1 | 10 - 2 | 20 -(2 rows) - -RESET enable_seqscan; -RESET enable_indexscan; --- --- check broken links or orphan toast relations --- -SELECT oid, relname - FROM pg_class - WHERE relkind = 't' - AND oid NOT IN (SELECT reltoastrelid FROM pg_class WHERE relkind = 'r'); - oid | relname ------+--------- -(0 rows) - -SELECT oid, relname - FROM pg_class - WHERE relkind = 'r' - AND reltoastrelid <> 0 - AND reltoastrelid NOT IN (SELECT oid FROM pg_class WHERE relkind = 't'); - oid | relname ------+--------- -(0 rows) - --- --- NOT NULL UNIQUE --- -CREATE TABLE tbl_nn (col1 int NOT NULL, col2 int NOT NULL); -CREATE TABLE tbl_uk (col1 int NOT NULL, col2 int , UNIQUE(col1, col2)); -CREATE TABLE tbl_nn_uk (col1 int NOT NULL, col2 int NOT NULL, UNIQUE(col1, col2)); -CREATE TABLE tbl_pk_uk (col1 int NOT NULL, col2 int NOT NULL, PRIMARY KEY(col1, col2), UNIQUE(col2, col1)); -CREATE TABLE tbl_nn_puk (col1 int NOT NULL, col2 int NOT NULL); -CREATE UNIQUE INDEX tbl_nn_puk_pcol1_idx ON tbl_nn_puk(col1) WHERE col1 < 10; -\! pg_repack --dbname=contrib_regression --table=tbl_nn -WARNING: relation "tbl_nn" must have a primary key or not-null unique keys --- => WARNING -\! pg_repack --dbname=contrib_regression --table=tbl_uk -WARNING: relation "tbl_uk" must have a primary key or not-null unique keys --- => WARNING -\! pg_repack --dbname=contrib_regression --table=tbl_nn_uk -INFO: repacking table "tbl_nn_uk" --- => OK -\! pg_repack --dbname=contrib_regression --table=tbl_pk_uk -INFO: repacking table "tbl_pk_uk" --- => OK -\! pg_repack --dbname=contrib_regression --table=tbl_pk_uk --only-indexes -INFO: repacking indexes of "tbl_pk_uk" -INFO: repacking index "public"."tbl_pk_uk_col2_col1_key" -INFO: repacking index "public"."tbl_pk_uk_pkey" --- => OK -\! pg_repack --dbname=contrib_regression --table=tbl_nn_puk -WARNING: relation "tbl_nn_puk" must have a primary key or not-null unique keys --- => WARNING --- --- Triggers handling --- -CREATE FUNCTION trgtest() RETURNS trigger AS -$$BEGIN RETURN NEW; END$$ -LANGUAGE plpgsql; -CREATE TABLE trg1 (id integer PRIMARY KEY); -CREATE TRIGGER z_repack_triggeq BEFORE UPDATE ON trg1 FOR EACH ROW EXECUTE PROCEDURE trgtest(); -\! pg_repack --dbname=contrib_regression --table=trg1 -INFO: repacking table "trg1" -CREATE TABLE trg2 (id integer PRIMARY KEY); -CREATE TRIGGER z_repack_trigger BEFORE UPDATE ON trg2 FOR EACH ROW EXECUTE PROCEDURE trgtest(); -\! pg_repack --dbname=contrib_regression --table=trg2 -INFO: repacking table "trg2" -WARNING: the table "trg2" already has a trigger called "z_repack_trigger" -DETAIL: The trigger was probably installed during a previous attempt to run pg_repack on the table which was interrupted and for some reason failed to clean up the temporary objects. Please drop the trigger or drop and recreate the pg_repack extension altogether to remove all the temporary objects left over. -CREATE TABLE trg3 (id integer PRIMARY KEY); -CREATE TRIGGER z_repack_trigges BEFORE UPDATE ON trg3 FOR EACH ROW EXECUTE PROCEDURE trgtest(); -\! pg_repack --dbname=contrib_regression --table=trg3 -INFO: repacking table "trg3" -WARNING: trigger "z_repack_trigges" conflicting on table "trg3" -DETAIL: The trigger "z_repack_trigger" must be the last of the BEFORE triggers to fire on the table (triggers fire in alphabetical order). Please rename the trigger so that it sorts before "z_repack_trigger": you can use "ALTER TRIGGER z_repack_trigges ON trg3 RENAME TO newname". -CREATE TABLE trg4 (id integer PRIMARY KEY); -CREATE TRIGGER zzzzzz AFTER UPDATE ON trg4 FOR EACH ROW EXECUTE PROCEDURE trgtest(); -\! pg_repack --dbname=contrib_regression --table=trg4 -INFO: repacking table "trg4" --- --- Dry run --- -\! pg_repack --dbname=contrib_regression --table=tbl_cluster --dry-run -INFO: Dry run enabled, not executing repack -INFO: repacking table "tbl_cluster" --- Test --schema --- -CREATE SCHEMA test_schema1; -CREATE TABLE test_schema1.tbl1 (id INTEGER PRIMARY KEY); -CREATE TABLE test_schema1.tbl2 (id INTEGER PRIMARY KEY); -CREATE SCHEMA test_schema2; -CREATE TABLE test_schema2.tbl1 (id INTEGER PRIMARY KEY); -CREATE TABLE test_schema2.tbl2 (id INTEGER PRIMARY KEY); --- => OK -\! pg_repack --dbname=contrib_regression --schema=test_schema1 -INFO: repacking table "test_schema1.tbl1" -INFO: repacking table "test_schema1.tbl2" --- => OK -\! pg_repack --dbname=contrib_regression --schema=test_schema1 --schema=test_schema2 -INFO: repacking table "test_schema1.tbl1" -INFO: repacking table "test_schema1.tbl2" -INFO: repacking table "test_schema2.tbl1" -INFO: repacking table "test_schema2.tbl2" --- => ERROR -\! pg_repack --dbname=contrib_regression --schema=test_schema1 --table=tbl1 -ERROR: cannot repack specific table(s) in schema, use schema.table notation instead --- => ERROR -\! pg_repack --dbname=contrib_regression --all --schema=test_schema1 -ERROR: cannot repack specific schema(s) in all databases diff --git a/regress/expected/repack_3.out b/regress/expected/repack_3.out deleted file mode 100644 index f800f07..0000000 --- a/regress/expected/repack_3.out +++ /dev/null @@ -1,423 +0,0 @@ -SET client_min_messages = warning; --- --- create table. --- -CREATE TABLE tbl_cluster ( - col1 int, - "time" timestamp, - ","")" text, - PRIMARY KEY (","")", col1) WITH (fillfactor = 75) -) WITH (fillfactor = 70); -CREATE INDEX ","") cluster" ON tbl_cluster ("time", length(","")"), ","")" text_pattern_ops) WITH (fillfactor = 75); -ALTER TABLE tbl_cluster CLUSTER ON ","") cluster"; -CREATE TABLE tbl_only_pkey ( - col1 int PRIMARY KEY, - ","")" text -); -CREATE TABLE tbl_only_ckey ( - col1 int, - col2 timestamp, - ","")" text -) WITH (fillfactor = 70); -CREATE INDEX cidx_only_ckey ON tbl_only_ckey (col2, ","")"); -ALTER TABLE tbl_only_ckey CLUSTER ON cidx_only_ckey; -CREATE TABLE tbl_gistkey ( - id integer PRIMARY KEY, - c circle -); -CREATE INDEX cidx_circle ON tbl_gistkey USING gist (c); -ALTER TABLE tbl_gistkey CLUSTER ON cidx_circle; -CREATE TABLE tbl_with_dropped_column ( - d1 text, - c1 text, - id integer PRIMARY KEY, - d2 text, - c2 text, - d3 text -); -ALTER INDEX tbl_with_dropped_column_pkey SET (fillfactor = 75); -ALTER TABLE tbl_with_dropped_column CLUSTER ON tbl_with_dropped_column_pkey; -CREATE INDEX idx_c1c2 ON tbl_with_dropped_column (c1, c2) WITH (fillfactor = 75); -CREATE INDEX idx_c2c1 ON tbl_with_dropped_column (c2, c1); -CREATE TABLE tbl_with_dropped_toast ( - i integer, - j integer, - t text, - PRIMARY KEY (i, j) -); -ALTER TABLE tbl_with_dropped_toast CLUSTER ON tbl_with_dropped_toast_pkey; -CREATE TABLE tbl_badindex ( - id integer PRIMARY KEY, - n integer -); -CREATE TABLE tbl_idxopts ( - i integer PRIMARY KEY, - t text -); -CREATE INDEX idxopts_t ON tbl_idxopts (t DESC NULLS LAST) WHERE (t != 'aaa'); --- --- insert data --- -INSERT INTO tbl_cluster VALUES(1, '2008-12-31 10:00:00', 'admin'); -INSERT INTO tbl_cluster VALUES(2, '2008-01-01 00:00:00', 'king'); -INSERT INTO tbl_cluster VALUES(3, '2008-03-04 12:00:00', 'joker'); -INSERT INTO tbl_cluster VALUES(4, '2008-03-05 15:00:00', 'queen'); -INSERT INTO tbl_cluster VALUES(5, '2008-01-01 00:30:00', sqrt(2::numeric(1000,999))::text || sqrt(3::numeric(1000,999))::text); -INSERT INTO tbl_only_pkey VALUES(1, 'abc'); -INSERT INTO tbl_only_pkey VALUES(2, 'def'); -INSERT INTO tbl_only_ckey VALUES(1, '2008-01-01 00:00:00', 'abc'); -INSERT INTO tbl_only_ckey VALUES(2, '2008-02-01 00:00:00', 'def'); -INSERT INTO tbl_gistkey VALUES(1, '<(1,2),3>'); -INSERT INTO tbl_gistkey VALUES(2, '<(4,5),6>'); -INSERT INTO tbl_with_dropped_column VALUES('d1', 'c1', 2, 'd2', 'c2', 'd3'); -INSERT INTO tbl_with_dropped_column VALUES('d1', 'c1', 1, 'd2', 'c2', 'd3'); -ALTER TABLE tbl_with_dropped_column DROP COLUMN d1; -ALTER TABLE tbl_with_dropped_column DROP COLUMN d2; -ALTER TABLE tbl_with_dropped_column DROP COLUMN d3; -ALTER TABLE tbl_with_dropped_column ADD COLUMN c3 text; -CREATE VIEW view_for_dropped_column AS - SELECT * FROM tbl_with_dropped_column; -INSERT INTO tbl_with_dropped_toast VALUES(1, 10, 'abc'); -INSERT INTO tbl_with_dropped_toast VALUES(2, 20, sqrt(2::numeric(1000,999))::text || sqrt(3::numeric(1000,999))::text); -ALTER TABLE tbl_with_dropped_toast DROP COLUMN t; -INSERT INTO tbl_badindex VALUES(1, 10); -INSERT INTO tbl_badindex VALUES(2, 10); --- This will fail. Silence the message as it's different across PG versions. -SET client_min_messages = fatal; -CREATE UNIQUE INDEX CONCURRENTLY idx_badindex_n ON tbl_badindex (n); -SET client_min_messages = warning; -INSERT INTO tbl_idxopts VALUES (0, 'abc'), (1, 'aaa'), (2, NULL), (3, 'bbb'); --- --- before --- -SELECT * FROM tbl_with_dropped_column; - c1 | id | c2 | c3 -----+----+----+---- - c1 | 2 | c2 | - c1 | 1 | c2 | -(2 rows) - -SELECT * FROM view_for_dropped_column; - c1 | id | c2 | c3 -----+----+----+---- - c1 | 2 | c2 | - c1 | 1 | c2 | -(2 rows) - -SELECT * FROM tbl_with_dropped_toast; - i | j ----+---- - 1 | 10 - 2 | 20 -(2 rows) - --- --- do repack --- -\! pg_repack --dbname=contrib_regression --table=tbl_cluster -INFO: repacking table "tbl_cluster" -\! pg_repack --dbname=contrib_regression --table=tbl_badindex -INFO: repacking table "tbl_badindex" -WARNING: skipping invalid index: CREATE UNIQUE INDEX idx_badindex_n ON tbl_badindex USING btree (n) -\! pg_repack --dbname=contrib_regression -INFO: repacking table "tbl_cluster" -INFO: repacking table "tbl_only_pkey" -INFO: repacking table "tbl_gistkey" -INFO: repacking table "tbl_with_dropped_column" -INFO: repacking table "tbl_with_dropped_toast" -INFO: repacking table "tbl_badindex" -WARNING: skipping invalid index: CREATE UNIQUE INDEX idx_badindex_n ON tbl_badindex USING btree (n) -INFO: repacking table "tbl_idxopts" --- --- after --- -\d tbl_cluster - Table "public.tbl_cluster" - Column | Type | Modifiers ---------+-----------------------------+----------- - col1 | integer | not null - time | timestamp without time zone | - ,") | text | not null -Indexes: - "tbl_cluster_pkey" PRIMARY KEY, btree (","")", col1) WITH (fillfactor='75') - ",") cluster" btree ("time", length(","")"), ","")" text_pattern_ops) WITH (fillfactor='75') CLUSTER - -\d tbl_gistkey - Table "public.tbl_gistkey" - Column | Type | Modifiers ---------+---------+----------- - id | integer | not null - c | circle | -Indexes: - "tbl_gistkey_pkey" PRIMARY KEY, btree (id) - "cidx_circle" gist (c) CLUSTER - -\d tbl_only_ckey - Table "public.tbl_only_ckey" - Column | Type | Modifiers ---------+-----------------------------+----------- - col1 | integer | - col2 | timestamp without time zone | - ,") | text | -Indexes: - "cidx_only_ckey" btree (col2, ","")") CLUSTER - -\d tbl_only_pkey - Table "public.tbl_only_pkey" - Column | Type | Modifiers ---------+---------+----------- - col1 | integer | not null - ,") | text | -Indexes: - "tbl_only_pkey_pkey" PRIMARY KEY, btree (col1) - -\d tbl_with_dropped_column -Table "public.tbl_with_dropped_column" - Column | Type | Modifiers ---------+---------+----------- - c1 | text | - id | integer | not null - c2 | text | - c3 | text | -Indexes: - "tbl_with_dropped_column_pkey" PRIMARY KEY, btree (id) WITH (fillfactor='75') CLUSTER - "idx_c1c2" btree (c1, c2) WITH (fillfactor='75') - "idx_c2c1" btree (c2, c1) - -\d tbl_with_dropped_toast -Table "public.tbl_with_dropped_toast" - Column | Type | Modifiers ---------+---------+----------- - i | integer | not null - j | integer | not null -Indexes: - "tbl_with_dropped_toast_pkey" PRIMARY KEY, btree (i, j) CLUSTER - -\d tbl_idxopts - Table "public.tbl_idxopts" - Column | Type | Modifiers ---------+---------+----------- - i | integer | not null - t | text | -Indexes: - "tbl_idxopts_pkey" PRIMARY KEY, btree (i) - "idxopts_t" btree (t DESC NULLS LAST) WHERE t <> 'aaa'::text - -SELECT col1, to_char("time", 'YYYY-MM-DD HH24:MI:SS'), ","")" FROM tbl_cluster; - col1 | to_char | ,") -------+---------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ - 2 | 2008-01-01 00:00:00 | king - 5 | 2008-01-01 00:30:00 | 1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727350138462309122970249248360558507372126441214970999358314132226659275055927557999505011527820605714701095599716059702745345968620147285174186408891986095523292304843087143214508397626036279952514079896872533965463318088296406206152583523950547457502877599617298355752203375318570113543746034084988471603868999706990048150305440277903164542478230684929369186215805784631115966687130130156185689872372352885092648612494977154218334204285686060146824720771435854874155657069677653720226485447015858801620758474922657226002085584466521458398893944370926591800311388246468157082630100594858704003186480342194897278290641045072636881313739855256117322040245091227700226941127573627280495738108967504018369868368450725799364729060762996941380475654823728997180326802474420629269124859052181004459842150591120249441341728531478105803603371077309182869314710171111683916581726889419758716582152128229518488471.732050807568877293527446341505872366942805253810380628055806979451933016908800037081146186757248575675626141415406703029969945094998952478811655512094373648528093231902305582067974820101084674923265015312343266903322886650672254668921837971227047131660367861588019049986537379859389467650347506576050756618348129606100947602187190325083145829523959832997789824508288714463832917347224163984587855397667958063818353666110843173780894378316102088305524901670023520711144288695990956365797087168498072899493296484283020786408603988738697537582317317831395992983007838702877053913369563312103707264019249106768231199288375641141422016742752102372994270831059898459475987664288897796147837958390228854852903576033852808064381972344661059689722872865264153822664698420021195484155278441181286534507035191650016689294415480846071277143999762926834629577438361895110127148638746976545982451788550975379013880664961911962222957110555242923723192197738262561631468842032853716682938649611917049738836395495938 - 3 | 2008-03-04 12:00:00 | joker - 4 | 2008-03-05 15:00:00 | queen - 1 | 2008-12-31 10:00:00 | admin -(5 rows) - -SELECT * FROM tbl_only_ckey ORDER BY 1; - col1 | col2 | ,") -------+--------------------------+----- - 1 | Tue Jan 01 00:00:00 2008 | abc - 2 | Fri Feb 01 00:00:00 2008 | def -(2 rows) - -SELECT * FROM tbl_only_pkey ORDER BY 1; - col1 | ,") -------+----- - 1 | abc - 2 | def -(2 rows) - -SELECT * FROM tbl_gistkey ORDER BY 1; - id | c -----+----------- - 1 | <(1,2),3> - 2 | <(4,5),6> -(2 rows) - -SET enable_seqscan = on; -SET enable_indexscan = off; -SELECT * FROM tbl_with_dropped_column; - c1 | id | c2 | c3 -----+----+----+---- - c1 | 1 | c2 | - c1 | 2 | c2 | -(2 rows) - -SELECT * FROM view_for_dropped_column; - c1 | id | c2 | c3 -----+----+----+---- - c1 | 1 | c2 | - c1 | 2 | c2 | -(2 rows) - -SELECT * FROM tbl_with_dropped_toast; - i | j ----+---- - 1 | 10 - 2 | 20 -(2 rows) - -SET enable_seqscan = off; -SET enable_indexscan = on; -SELECT * FROM tbl_with_dropped_column; - c1 | id | c2 | c3 -----+----+----+---- - c1 | 1 | c2 | - c1 | 2 | c2 | -(2 rows) - -SELECT * FROM view_for_dropped_column; - c1 | id | c2 | c3 -----+----+----+---- - c1 | 1 | c2 | - c1 | 2 | c2 | -(2 rows) - -SELECT * FROM tbl_with_dropped_toast; - i | j ----+---- - 1 | 10 - 2 | 20 -(2 rows) - -RESET enable_seqscan; -RESET enable_indexscan; --- --- check broken links or orphan toast relations --- -SELECT oid, relname - FROM pg_class - WHERE relkind = 't' - AND oid NOT IN (SELECT reltoastrelid FROM pg_class WHERE relkind = 'r'); - oid | relname ------+--------- -(0 rows) - -SELECT oid, relname - FROM pg_class - WHERE relkind = 'r' - AND reltoastrelid <> 0 - AND reltoastrelid NOT IN (SELECT oid FROM pg_class WHERE relkind = 't'); - oid | relname ------+--------- -(0 rows) - --- --- NOT NULL UNIQUE --- -CREATE TABLE tbl_nn (col1 int NOT NULL, col2 int NOT NULL); -CREATE TABLE tbl_uk (col1 int NOT NULL, col2 int , UNIQUE(col1, col2)); -CREATE TABLE tbl_nn_uk (col1 int NOT NULL, col2 int NOT NULL, UNIQUE(col1, col2)); -CREATE TABLE tbl_pk_uk (col1 int NOT NULL, col2 int NOT NULL, PRIMARY KEY(col1, col2), UNIQUE(col2, col1)); -CREATE TABLE tbl_nn_puk (col1 int NOT NULL, col2 int NOT NULL); -CREATE UNIQUE INDEX tbl_nn_puk_pcol1_idx ON tbl_nn_puk(col1) WHERE col1 < 10; -\! pg_repack --dbname=contrib_regression --table=tbl_nn -WARNING: relation "tbl_nn" must have a primary key or not-null unique keys --- => WARNING -\! pg_repack --dbname=contrib_regression --table=tbl_uk -WARNING: relation "tbl_uk" must have a primary key or not-null unique keys --- => WARNING -\! pg_repack --dbname=contrib_regression --table=tbl_nn_uk -INFO: repacking table "tbl_nn_uk" --- => OK -\! pg_repack --dbname=contrib_regression --table=tbl_pk_uk -INFO: repacking table "tbl_pk_uk" --- => OK -\! pg_repack --dbname=contrib_regression --table=tbl_pk_uk --only-indexes -INFO: repacking indexes of "tbl_pk_uk" -INFO: repacking index "public"."tbl_pk_uk_col2_col1_key" -INFO: repacking index "public"."tbl_pk_uk_pkey" --- => OK -\! pg_repack --dbname=contrib_regression --table=tbl_nn_puk -WARNING: relation "tbl_nn_puk" must have a primary key or not-null unique keys --- => WARNING --- --- Triggers handling --- -CREATE FUNCTION trgtest() RETURNS trigger AS -$$BEGIN RETURN NEW; END$$ -LANGUAGE plpgsql; -CREATE TABLE trg1 (id integer PRIMARY KEY); -CREATE TRIGGER repack_trigger_1 AFTER UPDATE ON trg1 FOR EACH ROW EXECUTE PROCEDURE trgtest(); -\! pg_repack --dbname=contrib_regression --table=trg1 -INFO: repacking table "trg1" -CREATE TABLE trg2 (id integer PRIMARY KEY); -CREATE TRIGGER repack_trigger AFTER UPDATE ON trg2 FOR EACH ROW EXECUTE PROCEDURE trgtest(); -\! pg_repack --dbname=contrib_regression --table=trg2 -INFO: repacking table "trg2" -WARNING: the table "trg2" already has a trigger called "repack_trigger" -DETAIL: The trigger was probably installed during a previous attempt to run pg_repack on the table which was interrupted and for some reason failed to clean up the temporary objects. Please drop the trigger or drop and recreate the pg_repack extension altogether to remove all the temporary objects left over. -CREATE TABLE trg3 (id integer PRIMARY KEY); -CREATE TRIGGER repack_trigger_1 BEFORE UPDATE ON trg3 FOR EACH ROW EXECUTE PROCEDURE trgtest(); -\! pg_repack --dbname=contrib_regression --table=trg3 -INFO: repacking table "trg3" --- --- Dry run --- -\! pg_repack --dbname=contrib_regression --table=tbl_cluster --dry-run -INFO: Dry run enabled, not executing repack -INFO: repacking table "tbl_cluster" --- Test --schema --- -CREATE SCHEMA test_schema1; -CREATE TABLE test_schema1.tbl1 (id INTEGER PRIMARY KEY); -CREATE TABLE test_schema1.tbl2 (id INTEGER PRIMARY KEY); -CREATE SCHEMA test_schema2; -CREATE TABLE test_schema2.tbl1 (id INTEGER PRIMARY KEY); -CREATE TABLE test_schema2.tbl2 (id INTEGER PRIMARY KEY); --- => OK -\! pg_repack --dbname=contrib_regression --schema=test_schema1 -INFO: repacking table "test_schema1.tbl1" -INFO: repacking table "test_schema1.tbl2" --- => OK -\! pg_repack --dbname=contrib_regression --schema=test_schema1 --schema=test_schema2 -INFO: repacking table "test_schema1.tbl1" -INFO: repacking table "test_schema1.tbl2" -INFO: repacking table "test_schema2.tbl1" -INFO: repacking table "test_schema2.tbl2" --- => ERROR -\! pg_repack --dbname=contrib_regression --schema=test_schema1 --table=tbl1 -ERROR: cannot repack specific table(s) in schema, use schema.table notation instead --- => ERROR -\! pg_repack --dbname=contrib_regression --all --schema=test_schema1 -ERROR: cannot repack specific schema(s) in all databases --- --- don't kill backend --- -\! pg_repack --dbname=contrib_regression --table=tbl_cluster --no-kill-backend -INFO: repacking table "tbl_cluster" --- --- no superuser check --- -DROP ROLE IF EXISTS nosuper; -CREATE ROLE nosuper WITH LOGIN; --- => OK -\! pg_repack --dbname=contrib_regression --table=tbl_cluster --no-superuser-check -INFO: repacking table "tbl_cluster" --- => ERROR -\! pg_repack --dbname=contrib_regression --table=tbl_cluster --username=nosuper -ERROR: pg_repack failed with error: You must be a superuser to use pg_repack --- => ERROR -\! pg_repack --dbname=contrib_regression --table=tbl_cluster --username=nosuper --no-superuser-check -ERROR: pg_repack failed with error: ERROR: permission denied for schema repack -DROP ROLE IF EXISTS nosuper; --- --- exclude extension check --- -CREATE SCHEMA exclude_extension_schema; -CREATE TABLE exclude_extension_schema.tbl(val integer primary key); --- => ERROR -\! pg_repack --dbname=contrib_regression --table=dummy_table --exclude-extension=dummy_extension -ERROR: cannot specify --table (-t) and --exclude-extension (-C) --- => ERROR -\! pg_repack --dbname=contrib_regression --table=dummy_table --exclude-extension=dummy_extension -x -ERROR: cannot specify --only-indexes (-x) and --exclude-extension (-C) --- => ERROR -\! pg_repack --dbname=contrib_regression --index=dummy_index --exclude-extension=dummy_extension -ERROR: cannot specify --index (-i) and --exclude-extension (-C) --- => OK -\! pg_repack --dbname=contrib_regression --schema=exclude_extension_schema --exclude-extension=dummy_extension -INFO: repacking table "exclude_extension_schema.tbl" --- => OK -\! pg_repack --dbname=contrib_regression --schema=exclude_extension_schema --exclude-extension=dummy_extension --exclude-extension=dummy_extension -INFO: repacking table "exclude_extension_schema.tbl" diff --git a/regress/expected/tablespace.out b/regress/expected/tablespace.out index ef0424e..d0e7e43 100644 --- a/regress/expected/tablespace.out +++ b/regress/expected/tablespace.out @@ -23,11 +23,11 @@ SELECT regexp_replace( '_[0-9]+', '_OID', 'g') FROM pg_index i join pg_class c ON c.oid = indexrelid WHERE indrelid = 'testts1'::regclass ORDER BY relname; - regexp_replace ----------------------------------------------------------------------------------- - CREATE INDEX index_OID ON repack.table_OID USING btree (id) WHERE (id > 0) - CREATE UNIQUE INDEX index_OID ON repack.table_OID USING btree (id) - CREATE INDEX index_OID ON repack.table_OID USING btree (id) WITH (fillfactor=80) + regexp_replace +---------------------------------------------------------------------------------------------------------- + CREATE INDEX index_OID ON repack.table_OID USING btree (id) TABLESPACE pg_default WHERE (id > 0) + CREATE UNIQUE INDEX index_OID ON repack.table_OID USING btree (id) TABLESPACE pg_default + CREATE INDEX index_OID ON repack.table_OID USING btree (id) WITH (fillfactor='80') TABLESPACE pg_default (3 rows) SELECT regexp_replace( @@ -35,11 +35,11 @@ SELECT regexp_replace( '_[0-9]+', '_OID', 'g') FROM pg_index i join pg_class c ON c.oid = indexrelid WHERE indrelid = 'testts1'::regclass ORDER BY relname; - regexp_replace -------------------------------------------------------------------------------------------------- + regexp_replace +--------------------------------------------------------------------------------------------------- CREATE INDEX index_OID ON repack.table_OID USING btree (id) TABLESPACE foo WHERE (id > 0) CREATE UNIQUE INDEX index_OID ON repack.table_OID USING btree (id) TABLESPACE foo - CREATE INDEX index_OID ON repack.table_OID USING btree (id) WITH (fillfactor=80) TABLESPACE foo + CREATE INDEX index_OID ON repack.table_OID USING btree (id) WITH (fillfactor='80') TABLESPACE foo (3 rows) SELECT regexp_replace( @@ -47,11 +47,11 @@ SELECT regexp_replace( '_[0-9]+', '_OID', 'g') FROM pg_index i join pg_class c ON c.oid = indexrelid WHERE indrelid = 'testts1'::regclass ORDER BY relname; - regexp_replace --------------------------------------------------------------------------------------- - CREATE INDEX CONCURRENTLY index_OID ON testts1 USING btree (id) WHERE (id > 0) - CREATE UNIQUE INDEX CONCURRENTLY index_OID ON testts1 USING btree (id) - CREATE INDEX CONCURRENTLY index_OID ON testts1 USING btree (id) WITH (fillfactor=80) + regexp_replace +-------------------------------------------------------------------------------------------------------------- + CREATE INDEX CONCURRENTLY index_OID ON testts1 USING btree (id) TABLESPACE pg_default WHERE (id > 0) + CREATE UNIQUE INDEX CONCURRENTLY index_OID ON testts1 USING btree (id) TABLESPACE pg_default + CREATE INDEX CONCURRENTLY index_OID ON testts1 USING btree (id) WITH (fillfactor='80') TABLESPACE pg_default (3 rows) SELECT regexp_replace( @@ -59,11 +59,11 @@ SELECT regexp_replace( '_[0-9]+', '_OID', 'g') FROM pg_index i join pg_class c ON c.oid = indexrelid WHERE indrelid = 'testts1'::regclass ORDER BY relname; - regexp_replace ------------------------------------------------------------------------------------------------------ + regexp_replace +------------------------------------------------------------------------------------------------------- CREATE INDEX CONCURRENTLY index_OID ON testts1 USING btree (id) TABLESPACE foo WHERE (id > 0) CREATE UNIQUE INDEX CONCURRENTLY index_OID ON testts1 USING btree (id) TABLESPACE foo - CREATE INDEX CONCURRENTLY index_OID ON testts1 USING btree (id) WITH (fillfactor=80) TABLESPACE foo + CREATE INDEX CONCURRENTLY index_OID ON testts1 USING btree (id) WITH (fillfactor='80') TABLESPACE foo (3 rows) -- can move the tablespace from default diff --git a/regress/expected/tablespace_2.out b/regress/expected/tablespace_2.out deleted file mode 100644 index d0e7e43..0000000 --- a/regress/expected/tablespace_2.out +++ /dev/null @@ -1,234 +0,0 @@ -SET client_min_messages = warning; --- --- Tablespace features tests --- --- Note: in order to pass this test you must create a tablespace called 'testts' --- -SELECT spcname FROM pg_tablespace WHERE spcname = 'testts'; - spcname ---------- - testts -(1 row) - --- If the query above failed you must create the 'testts' tablespace; -CREATE TABLE testts1 (id serial primary key, data text); -CREATE INDEX testts1_partial_idx on testts1 (id) where (id > 0); -CREATE INDEX testts1_with_idx on testts1 (id) with (fillfactor=80); -INSERT INTO testts1 (data) values ('a'); -INSERT INTO testts1 (data) values ('b'); -INSERT INTO testts1 (data) values ('c'); --- check the indexes definitions -SELECT regexp_replace( - repack.repack_indexdef(indexrelid, 'testts1'::regclass, NULL, false), - '_[0-9]+', '_OID', 'g') -FROM pg_index i join pg_class c ON c.oid = indexrelid -WHERE indrelid = 'testts1'::regclass ORDER BY relname; - regexp_replace ----------------------------------------------------------------------------------------------------------- - CREATE INDEX index_OID ON repack.table_OID USING btree (id) TABLESPACE pg_default WHERE (id > 0) - CREATE UNIQUE INDEX index_OID ON repack.table_OID USING btree (id) TABLESPACE pg_default - CREATE INDEX index_OID ON repack.table_OID USING btree (id) WITH (fillfactor='80') TABLESPACE pg_default -(3 rows) - -SELECT regexp_replace( - repack.repack_indexdef(indexrelid, 'testts1'::regclass, 'foo', false), - '_[0-9]+', '_OID', 'g') -FROM pg_index i join pg_class c ON c.oid = indexrelid -WHERE indrelid = 'testts1'::regclass ORDER BY relname; - regexp_replace ---------------------------------------------------------------------------------------------------- - CREATE INDEX index_OID ON repack.table_OID USING btree (id) TABLESPACE foo WHERE (id > 0) - CREATE UNIQUE INDEX index_OID ON repack.table_OID USING btree (id) TABLESPACE foo - CREATE INDEX index_OID ON repack.table_OID USING btree (id) WITH (fillfactor='80') TABLESPACE foo -(3 rows) - -SELECT regexp_replace( - repack.repack_indexdef(indexrelid, 'testts1'::regclass, NULL, true), - '_[0-9]+', '_OID', 'g') -FROM pg_index i join pg_class c ON c.oid = indexrelid -WHERE indrelid = 'testts1'::regclass ORDER BY relname; - regexp_replace --------------------------------------------------------------------------------------------------------------- - CREATE INDEX CONCURRENTLY index_OID ON testts1 USING btree (id) TABLESPACE pg_default WHERE (id > 0) - CREATE UNIQUE INDEX CONCURRENTLY index_OID ON testts1 USING btree (id) TABLESPACE pg_default - CREATE INDEX CONCURRENTLY index_OID ON testts1 USING btree (id) WITH (fillfactor='80') TABLESPACE pg_default -(3 rows) - -SELECT regexp_replace( - repack.repack_indexdef(indexrelid, 'testts1'::regclass, 'foo', true), - '_[0-9]+', '_OID', 'g') -FROM pg_index i join pg_class c ON c.oid = indexrelid -WHERE indrelid = 'testts1'::regclass ORDER BY relname; - regexp_replace -------------------------------------------------------------------------------------------------------- - CREATE INDEX CONCURRENTLY index_OID ON testts1 USING btree (id) TABLESPACE foo WHERE (id > 0) - CREATE UNIQUE INDEX CONCURRENTLY index_OID ON testts1 USING btree (id) TABLESPACE foo - CREATE INDEX CONCURRENTLY index_OID ON testts1 USING btree (id) WITH (fillfactor='80') TABLESPACE foo -(3 rows) - --- can move the tablespace from default -\! pg_repack --dbname=contrib_regression --no-order --table=testts1 --tablespace testts -INFO: repacking table "testts1" -SELECT relname, spcname -FROM pg_class JOIN pg_tablespace ts ON ts.oid = reltablespace -WHERE relname ~ '^testts1' -ORDER BY relname; - relname | spcname ----------+--------- - testts1 | testts -(1 row) - -SELECT * from testts1 order by id; - id | data -----+------ - 1 | a - 2 | b - 3 | c -(3 rows) - --- tablespace stays where it is -\! pg_repack --dbname=contrib_regression --no-order --table=testts1 -INFO: repacking table "testts1" -SELECT relname, spcname -FROM pg_class JOIN pg_tablespace ts ON ts.oid = reltablespace -WHERE relname ~ '^testts1' -ORDER BY relname; - relname | spcname ----------+--------- - testts1 | testts -(1 row) - --- can move the ts back to default -\! pg_repack --dbname=contrib_regression --no-order --table=testts1 -s pg_default -INFO: repacking table "testts1" -SELECT relname, spcname -FROM pg_class JOIN pg_tablespace ts ON ts.oid = reltablespace -WHERE relname ~ '^testts1' -ORDER BY relname; - relname | spcname ----------+--------- -(0 rows) - --- can move the table together with the indexes -\! pg_repack --dbname=contrib_regression --no-order --table=testts1 --tablespace testts --moveidx -INFO: repacking table "testts1" -SELECT relname, spcname -FROM pg_class JOIN pg_tablespace ts ON ts.oid = reltablespace -WHERE relname ~ '^testts1' -ORDER BY relname; - relname | spcname ----------------------+--------- - testts1 | testts - testts1_partial_idx | testts - testts1_pkey | testts - testts1_with_idx | testts -(4 rows) - --- can't specify --moveidx without --tablespace -\! pg_repack --dbname=contrib_regression --no-order --table=testts1 --moveidx -ERROR: cannot specify --moveidx (-S) without --tablespace (-s) -\! pg_repack --dbname=contrib_regression --no-order --table=testts1 -S -ERROR: cannot specify --moveidx (-S) without --tablespace (-s) --- not broken with order -\! pg_repack --dbname=contrib_regression -o id --table=testts1 --tablespace pg_default --moveidx -INFO: repacking table "testts1" ---move all indexes of the table to a tablespace -\! pg_repack --dbname=contrib_regression --table=testts1 --only-indexes --tablespace=testts -INFO: repacking indexes of "testts1" -INFO: repacking index "public"."testts1_partial_idx" -INFO: repacking index "public"."testts1_pkey" -INFO: repacking index "public"."testts1_with_idx" -SELECT relname, spcname -FROM pg_class JOIN pg_tablespace ts ON ts.oid = reltablespace -WHERE relname ~ '^testts1' -ORDER BY relname; - relname | spcname ----------------------+--------- - testts1_partial_idx | testts - testts1_pkey | testts - testts1_with_idx | testts -(3 rows) - ---all indexes of tablespace remain in same tablespace -\! pg_repack --dbname=contrib_regression --table=testts1 --only-indexes -INFO: repacking indexes of "testts1" -INFO: repacking index "public"."testts1_partial_idx" -INFO: repacking index "public"."testts1_pkey" -INFO: repacking index "public"."testts1_with_idx" -SELECT relname, spcname -FROM pg_class JOIN pg_tablespace ts ON ts.oid = reltablespace -WHERE relname ~ '^testts1' -ORDER BY relname; - relname | spcname ----------------------+--------- - testts1_partial_idx | testts - testts1_pkey | testts - testts1_with_idx | testts -(3 rows) - ---move all indexes of the table to pg_default -\! pg_repack --dbname=contrib_regression --table=testts1 --only-indexes --tablespace=pg_default -INFO: repacking indexes of "testts1" -INFO: repacking index "public"."testts1_partial_idx" -INFO: repacking index "public"."testts1_pkey" -INFO: repacking index "public"."testts1_with_idx" -SELECT relname, spcname -FROM pg_class JOIN pg_tablespace ts ON ts.oid = reltablespace -WHERE relname ~ '^testts1' -ORDER BY relname; - relname | spcname ----------+--------- -(0 rows) - ---move one index to a tablespace -\! pg_repack --dbname=contrib_regression --index=testts1_pkey --tablespace=testts -INFO: repacking index "public"."testts1_pkey" -SELECT relname, spcname -FROM pg_class JOIN pg_tablespace ts ON ts.oid = reltablespace -WHERE relname ~ '^testts1' -ORDER BY relname; - relname | spcname ---------------+--------- - testts1_pkey | testts -(1 row) - ---index tablespace stays as is -\! pg_repack --dbname=contrib_regression --index=testts1_pkey -INFO: repacking index "public"."testts1_pkey" -SELECT relname, spcname -FROM pg_class JOIN pg_tablespace ts ON ts.oid = reltablespace -WHERE relname ~ '^testts1' -ORDER BY relname; - relname | spcname ---------------+--------- - testts1_pkey | testts -(1 row) - ---move index to pg_default -\! pg_repack --dbname=contrib_regression --index=testts1_pkey --tablespace=pg_default -INFO: repacking index "public"."testts1_pkey" -SELECT relname, spcname -FROM pg_class JOIN pg_tablespace ts ON ts.oid = reltablespace -WHERE relname ~ '^testts1' -ORDER BY relname; - relname | spcname ----------+--------- -(0 rows) - ---using multiple --index option -\! pg_repack --dbname=contrib_regression --index=testts1_pkey --index=testts1_with_idx --tablespace=testts -INFO: repacking index "public"."testts1_pkey" -INFO: repacking index "public"."testts1_with_idx" -SELECT relname, spcname -FROM pg_class JOIN pg_tablespace ts ON ts.oid = reltablespace -WHERE relname ~ '^testts1' -ORDER BY relname; - relname | spcname -------------------+--------- - testts1_pkey | testts - testts1_with_idx | testts -(2 rows) - ---using --indexes-only and --index option together -\! pg_repack --dbname=contrib_regression --table=testts1 --only-indexes --index=testts1_pkey -ERROR: cannot specify --index (-i) and --table (-t) From ac1333f9f354a5ce1b4d4c1af5aa60d289d38530 Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Sun, 9 Apr 2017 19:23:06 +0100 Subject: [PATCH 07/23] Declare supported versions are 9.1-9.6 --- doc/pg_repack.rst | 2 +- doc/pg_repack_jp.rst | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/doc/pg_repack.rst b/doc/pg_repack.rst index 388a261..a641e8e 100644 --- a/doc/pg_repack.rst +++ b/doc/pg_repack.rst @@ -40,7 +40,7 @@ Requirements ------------ PostgreSQL versions - PostgreSQL 8.3, 8.4, 9.0, 9.1, 9.2, 9.3, 9.4, 9.5, 9.6 + PostgreSQL 9.1, 9.2, 9.3, 9.4, 9.5, 9.6 Disks Performing a full-table repack requires free disk space about twice as diff --git a/doc/pg_repack_jp.rst b/doc/pg_repack_jp.rst index 3f397b4..937fc34 100644 --- a/doc/pg_repack_jp.rst +++ b/doc/pg_repack_jp.rst @@ -62,7 +62,7 @@ pg_repackでは再編成する方法として次のものが選択できます ------------ PostgreSQL versions - PostgreSQL 8.3, 8.4, 9.0, 9.1, 9.2, 9.3, 9.4, 9.5, 9.6 + PostgreSQL 9.1, 9.2, 9.3, 9.4, 9.5, 9.6 Disks Performing a full-table repack requires free disk space about twice as @@ -75,7 +75,7 @@ pg_repackでは再編成する方法として次のものが選択できます --------- PostgreSQL バージョン - PostgreSQL 8.3, 8.4, 9.0, 9.1, 9.2, 9.3, 9.4 + PostgreSQL 9.1, 9.2, 9.3, 9.4, 9.5, 9.6 ディスク テーブル全体の再編成を行うには、対象となるテーブルと付属するインデックスのおよそ2倍のサイズのディスク空き容量が必要です。例えば、テーブルとインデックスを合わせたサイズが1GBの場合、2GBのディスク領域が必要となります。 From 86eef300f1124be285f5991f449f4b12afe8e448 Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Mon, 10 Apr 2017 11:36:06 +0100 Subject: [PATCH 08/23] Dropped C code used by unsupported PG versions --- bin/pgut/pgut.c | 2 - bin/pgut/pgut.h | 19 -------- lib/pgut/pgut-be.c | 58 ----------------------- lib/pgut/pgut-be.h | 112 -------------------------------------------- lib/pgut/pgut-spi.c | 22 --------- lib/pgut/pgut-spi.h | 7 --- lib/repack.c | 53 --------------------- 7 files changed, 273 deletions(-) diff --git a/bin/pgut/pgut.c b/bin/pgut/pgut.c index 90ed8cb..66db463 100644 --- a/bin/pgut/pgut.c +++ b/bin/pgut/pgut.c @@ -79,11 +79,9 @@ pgut_init(int argc, char **argv) pthread_mutex_init(&pgut_conn_mutex, NULL); #endif -#if PG_VERSION_NUM >= 90000 /* application_name for 9.0 or newer versions */ if (getenv("PGAPPNAME") == NULL) pgut_putenv("PGAPPNAME", PROGRAM_NAME); -#endif init_cancel_handler(); atexit(on_cleanup); diff --git a/bin/pgut/pgut.h b/bin/pgut/pgut.h index ca1f381..c33f389 100644 --- a/bin/pgut/pgut.h +++ b/bin/pgut/pgut.h @@ -195,25 +195,6 @@ extern size_t simple_string_list_size(SimpleStringList list); extern int wait_for_socket(int sock, struct timeval *timeout); extern int wait_for_sockets(int nfds, fd_set *fds, struct timeval *timeout); -/* - * import from postgres.h and catalog/genbki.h in 8.4 - */ -#if PG_VERSION_NUM < 80400 - -typedef unsigned long Datum; -typedef struct MemoryContextData *MemoryContext; - -#define CATALOG(name,oid) typedef struct CppConcat(FormData_,name) -#define BKI_BOOTSTRAP -#define BKI_SHARED_RELATION -#define BKI_WITHOUT_OIDS -#define DATA(x) extern int no_such_variable -#define DESCR(x) extern int no_such_variable -#define SHDESCR(x) extern int no_such_variable -typedef int aclitem; - -#endif - #ifdef WIN32 extern int sleep(unsigned int seconds); extern int usleep(unsigned int usec); diff --git a/lib/pgut/pgut-be.c b/lib/pgut/pgut-be.c index af7097b..9caaec5 100644 --- a/lib/pgut/pgut-be.c +++ b/lib/pgut/pgut-be.c @@ -11,61 +11,3 @@ #include "postgres.h" #include "access/heapam.h" #include "pgut-be.h" - -#if PG_VERSION_NUM < 80400 - -char * -text_to_cstring(const text *t) -{ - text *tunpacked = pg_detoast_datum_packed((struct varlena *) t); - int len = VARSIZE_ANY_EXHDR(tunpacked); - char *result; - - result = (char *) palloc(len + 1); - memcpy(result, VARDATA_ANY(tunpacked), len); - result[len] = '\0'; - - if (tunpacked != t) - pfree(tunpacked); - - return result; -} - -text * -cstring_to_text(const char *s) -{ - int len = strlen(s); - text *result = palloc(len + VARHDRSZ); - - SET_VARSIZE(result, len + VARHDRSZ); - memcpy(VARDATA(result), s, len); - - return result; -} - -void -tuplestore_putvalues(Tuplestorestate *state, TupleDesc tdesc, - Datum *values, bool *isnull) -{ - tuplestore_puttuple(state, heap_form_tuple(tdesc, values, isnull)); -} - -Datum -ExecFetchSlotTupleDatum(TupleTableSlot *slot) -{ - HeapTuple tup; - HeapTupleHeader td; - TupleDesc tupdesc; - - /* Make sure we can scribble on the slot contents ... */ - tup = ExecMaterializeSlot(slot); - /* ... and set up the composite-Datum header fields, in case not done */ - td = tup->t_data; - tupdesc = slot->tts_tupleDescriptor; - HeapTupleHeaderSetDatumLength(td, tup->t_len); - HeapTupleHeaderSetTypeId(td, tupdesc->tdtypeid); - HeapTupleHeaderSetTypMod(td, tupdesc->tdtypmod); - return PointerGetDatum(td); -} - -#endif diff --git a/lib/pgut/pgut-be.h b/lib/pgut/pgut-be.h index ad57de7..fc09184 100644 --- a/lib/pgut/pgut-be.h +++ b/lib/pgut/pgut-be.h @@ -52,116 +52,4 @@ extern int no_such_variable #endif - -#if PG_VERSION_NUM < 80400 - -#define MAIN_FORKNUM 0 -#define HEAP_INSERT_SKIP_WAL 0x0001 -#define HEAP_INSERT_SKIP_FSM 0x0002 - -#define relpath(rnode, forknum) relpath((rnode)) -#define smgrimmedsync(reln, forknum) smgrimmedsync((reln)) -#define smgrread(reln, forknum, blocknum, buffer) \ - smgrread((reln), (blocknum), (buffer)) -#define mdclose(reln, forknum) mdclose((reln)) -#define heap_insert(relation, tup, cid, options, bistate) \ - heap_insert((relation), (tup), (cid), true, true) -#define GetBulkInsertState() (NULL) -#define FreeBulkInsertState(bistate) ((void)0) -#define FreeExprContext(econtext, isCommit) FreeExprContext((econtext)) -#define pgstat_init_function_usage(fcinfo, fcu) ((void)0) -#define pgstat_end_function_usage(fcu, finalize) ((void)0) -#define makeRangeVar(schemaname, relname, location) \ - makeRangeVar((schemaname), (relname)) -#define tuplestore_gettupleslot(state, forward, copy, slot) \ - tuplestore_gettupleslot(state, forward, slot) -#define pgstat_track_activity_query_size PGBE_ACTIVITY_SIZE -typedef void *BulkInsertState; - -#define DefineCustomBoolVariable(name, short_desc, long_desc, valueAddr, bootValue, context, flags, assign_hook, show_hook) \ - do { \ - *(valueAddr) = (bootValue); \ - DefineCustomBoolVariable((name), (short_desc), (long_desc), (valueAddr), (context), (assign_hook), (show_hook)); \ - } while(0) -#define DefineCustomIntVariable(name, short_desc, long_desc, valueAddr, bootValue, minValue, maxValue, context, flags, assign_hook, show_hook) \ - do { \ - *(valueAddr) = (bootValue); \ - DefineCustomIntVariable((name), (short_desc), (long_desc), (valueAddr), (minValue), (maxValue), (context), (assign_hook), (show_hook)); \ - } while(0) -#define DefineCustomRealVariable(name, short_desc, long_desc, valueAddr, bootValue, minValue, maxValue, context, flags, assign_hook, show_hook) \ - do { \ - *(valueAddr) = (bootValue); \ - DefineCustomRealVariable((name), (short_desc), (long_desc), (valueAddr), (minValue), (maxValue), (context), (assign_hook), (show_hook)); \ - } while(0) -#define DefineCustomStringVariable(name, short_desc, long_desc, valueAddr, bootValue, context, flags, assign_hook, show_hook) \ - do { \ - *(valueAddr) = (char *) (bootValue); \ - DefineCustomStringVariable((name), (short_desc), (long_desc), (valueAddr), (context), (assign_hook), (show_hook)); \ - } while(0) - -struct config_enum_entry -{ - const char *name; - int val; - bool hidden; -}; - -extern char *text_to_cstring(const text *t); -extern text *cstring_to_text(const char *s); -extern void tuplestore_putvalues(Tuplestorestate *state, TupleDesc tdesc, - Datum *values, bool *isnull); -extern Datum ExecFetchSlotTupleDatum(TupleTableSlot *slot); - -#define CStringGetTextDatum(s) PointerGetDatum(cstring_to_text(s)) -#define TextDatumGetCString(d) text_to_cstring((text *) DatumGetPointer(d)) - -#endif - -#if PG_VERSION_NUM < 90000 - -#define reindex_index(indexId, skip_constraint_checks) \ - reindex_index((indexId)) -#define func_signature_string(funcname, nargs, argnames, argtypes) \ - func_signature_string((funcname), (nargs), (argtypes)) - -#endif - -#if PG_VERSION_NUM < 90200 - -#define RangeVarGetRelid(relation, lockmode, missing_ok, nowait) \ - RangeVarGetRelid((relation), (missing_ok)) - -#endif - -#if PG_VERSION_NUM < 90100 - -#define ATExecChangeOwner(relationOid, newOwnerId, recursing, lockmode) \ - ATExecChangeOwner((relationOid), (newOwnerId), (recursing)) -#define deleteDependencyRecordsFor(classId, objectId, skipExtensionDeps) \ - deleteDependencyRecordsFor((classId), (objectId)) -#define PG_GET_COLLATION() (InvalidOid) - -#endif - -#if PG_VERSION_NUM < 90000 -#define RelationSetNewRelfilenode(rel, xid) \ - setNewRelfilenode((rel), (xid)) -#endif - -#if PG_VERSION_NUM < 80400 -#define FuncnameGetCandidates(names, nargs, argnames, variadic, defaults) \ - FuncnameGetCandidates((names), (nargs)) -#elif PG_VERSION_NUM < 90000 -#define FuncnameGetCandidates(names, nargs, argnames, variadic, defaults) \ - FuncnameGetCandidates((names), (nargs), (variadic), (defaults)) -#endif - -#if PG_VERSION_NUM < 90000 -#define GetConfigOption(name, missing_ok, restrict_superuser) \ - GetConfigOption((name)) -#elif PG_VERSION_NUM < 90200 -#define GetConfigOption(name, missing_ok, restrict_superuser) \ - GetConfigOption((name), (restrict_superuser)) -#endif - #endif /* PGUT_BE_H */ diff --git a/lib/pgut/pgut-spi.c b/lib/pgut/pgut-spi.c index ed26260..5bf2c95 100644 --- a/lib/pgut/pgut-spi.c +++ b/lib/pgut/pgut-spi.c @@ -115,25 +115,3 @@ execute_with_format_args(int expected, const char *format, int nargs, Oid argtyp termStringInfo(&sql); } - - -#if PG_VERSION_NUM < 80400 - -int -SPI_execute_with_args(const char *src, - int nargs, Oid *argtypes, - Datum *values, const char *nulls, - bool read_only, long tcount) -{ - SPIPlanPtr plan; - int ret; - - plan = SPI_prepare(src, nargs, argtypes); - if (plan == NULL) - return SPI_result; - ret = SPI_execute_plan(plan, values, nulls, read_only, tcount); - SPI_freeplan(plan); - return ret; -} - -#endif diff --git a/lib/pgut/pgut-spi.h b/lib/pgut/pgut-spi.h index 4ea0156..5406b36 100644 --- a/lib/pgut/pgut-spi.h +++ b/lib/pgut/pgut-spi.h @@ -12,13 +12,6 @@ #include "executor/spi.h" -#if PG_VERSION_NUM < 80400 - -extern int SPI_execute_with_args(const char *src, int nargs, Oid *argtypes, - Datum *values, const char *nulls, bool read_only, long tcount); - -#endif - extern void execute(int expected, const char *sql); extern void execute_plan(int expected, SPIPlanPtr plan, Datum *values, const char *nulls); extern void execute_with_format(int expected, const char *format, ...) diff --git a/lib/repack.c b/lib/repack.c index 4e6711b..33ea053 100644 --- a/lib/repack.c +++ b/lib/repack.c @@ -93,14 +93,6 @@ must_be_superuser(const char *func) } -/* Include an implementation of RenameRelationInternal for old - * versions which don't have one. - */ -#if PG_VERSION_NUM < 80400 -static void RenameRelationInternal(Oid myrelid, const char *newrelname, Oid namespaceId); -#endif - - /* The API of RenameRelationInternal() was changed in 9.2. * Use the RENAME_REL macro for compatibility across versions. */ @@ -1016,19 +1008,6 @@ repack_drop(PG_FUNCTION_ARGS) --numobj; } -#if PG_VERSION_NUM < 80400 - /* delete autovacuum settings */ - execute_with_format( - SPI_OK_DELETE, - "DELETE FROM pg_catalog.pg_autovacuum v" - " USING pg_class c, pg_namespace n" - " WHERE relname IN ('log_%u', 'table_%u')" - " AND n.nspname = 'repack'" - " AND c.relnamespace = n.oid" - " AND v.vacrelid = c.oid", - oid, oid); -#endif - /* drop temp table */ if (numobj > 0) { @@ -1052,17 +1031,10 @@ repack_disable_autovacuum(PG_FUNCTION_ARGS) /* connect to SPI manager */ repack_init(); -#if PG_VERSION_NUM >= 80400 execute_with_format( SPI_OK_UTILITY, "ALTER TABLE %s SET (autovacuum_enabled = off)", get_relation_name(oid)); -#else - execute_with_format( - SPI_OK_INSERT, - "INSERT INTO pg_catalog.pg_autovacuum VALUES (%u, false, -1, -1, -1, -1, -1, -1, -1, -1)", - oid); -#endif SPI_finish(); @@ -1317,28 +1289,3 @@ repack_index_swap(PG_FUNCTION_ARGS) SPI_finish(); PG_RETURN_VOID(); } - -#if PG_VERSION_NUM < 80400 - -/* XXX: You might need to add PGDLLIMPORT into your miscadmin.h. */ -extern PGDLLIMPORT bool allowSystemTableMods; - -static void -RenameRelationInternal(Oid myrelid, const char *newrelname, Oid namespaceId) -{ - bool save_allowSystemTableMods = allowSystemTableMods; - - allowSystemTableMods = true; - PG_TRY(); - { - renamerel(myrelid, newrelname, OBJECT_TABLE); - allowSystemTableMods = save_allowSystemTableMods; - } - PG_CATCH(); - { - allowSystemTableMods = save_allowSystemTableMods; - PG_RE_THROW(); - } - PG_END_TRY(); -} -#endif From 7d752f2b4eb44de2c6a5dc441b8fdb2256bb4344 Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Mon, 10 Apr 2017 11:58:41 +0100 Subject: [PATCH 09/23] Dropped C file now unused --- lib/Makefile | 2 +- lib/pgut/pgut-be.c | 13 ------------- 2 files changed, 1 insertion(+), 14 deletions(-) delete mode 100644 lib/pgut/pgut-be.c diff --git a/lib/Makefile b/lib/Makefile index dc511c7..db2aeda 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -15,7 +15,7 @@ INTVERSION := $(shell echo $$(($$(echo $(VERSION) | sed 's/\([[:digit:]]\{1,\}\) EXTENSION = pg_repack MODULE_big = $(EXTENSION) -OBJS = repack.o pgut/pgut-be.o pgut/pgut-spi.o +OBJS = repack.o pgut/pgut-spi.o SHLIB_EXPORTS = exports.txt diff --git a/lib/pgut/pgut-be.c b/lib/pgut/pgut-be.c deleted file mode 100644 index 9caaec5..0000000 --- a/lib/pgut/pgut-be.c +++ /dev/null @@ -1,13 +0,0 @@ -/*------------------------------------------------------------------------- - * - * pgut-be.c - * - * Copyright (c) 2009-2011, NIPPON TELEGRAPH AND TELEPHONE CORPORATION - * Portions Copyright (c) 2012-2015, The Reorg Development Team - * - *------------------------------------------------------------------------- - */ - -#include "postgres.h" -#include "access/heapam.h" -#include "pgut-be.h" From a297acc3b3d50db9a06df9d432338c4c87af6492 Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Mon, 10 Apr 2017 12:06:26 +0100 Subject: [PATCH 10/23] Dropped piece of no more relevant news from README --- README.rst | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.rst b/README.rst index c39afd8..0c68459 100644 --- a/README.rst +++ b/README.rst @@ -23,10 +23,6 @@ CLUSTER directly. Please check the documentation (in the ``doc`` directory or online_) for installation and usage instructions. -All users of pg_reorg 1.1.9 or earlier, and pg_repack 1.2.0-beta1 or earlier, -are **urged to upgrade** to the latest pg_repack version to fix a serious -data corruption issue_. - .. _pg_repack: http://reorg.github.com/pg_repack .. _CLUSTER: http://www.postgresql.org/docs/current/static/sql-cluster.html .. _VACUUM FULL: VACUUM_ From cf6fe7d4cf4f12a4a8d2c5427247b100762fcbdc Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Mon, 10 Apr 2017 22:04:28 +0100 Subject: [PATCH 11/23] Dropped redundant/wrong pg_config definition Fix issue #24. The OP reported that the issue is solved by dropping this assignment. The one in regress has been already dropped in the refactoring to drop pre-9.1 support. --- bin/Makefile | 1 - 1 file changed, 1 deletion(-) diff --git a/bin/Makefile b/bin/Makefile index 9732439..bc2f52b 100644 --- a/bin/Makefile +++ b/bin/Makefile @@ -26,7 +26,6 @@ endif PG_LIBS = $(libpq) USE_PGXS = 1 # use pgxs if not in contrib directory -PG_CONFIG = pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) include $(PGXS) From 6d7b1dbca495d7a27a2d9f067ef5a500cf4c112d Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Mon, 10 Apr 2017 23:07:40 +0100 Subject: [PATCH 12/23] Added test to verify the attribute options are respected --- regress/expected/repack.out | 15 +++++++++++++++ regress/expected/repack_1.out | 15 +++++++++++++++ regress/sql/repack.sql | 11 +++++++++++ 3 files changed, 41 insertions(+) diff --git a/regress/expected/repack.out b/regress/expected/repack.out index 4539043..ef0ed4a 100644 --- a/regress/expected/repack.out +++ b/regress/expected/repack.out @@ -55,6 +55,9 @@ CREATE TABLE tbl_idxopts ( t text ); CREATE INDEX idxopts_t ON tbl_idxopts (t DESC NULLS LAST) WHERE (t != 'aaa'); +-- Use this table to play with attribute options too +ALTER TABLE tbl_idxopts ALTER i SET STATISTICS 1; +ALTER TABLE tbl_idxopts ALTER t SET (n_distinct = -0.5); -- -- insert data -- @@ -302,6 +305,18 @@ SELECT oid, relname -----+--------- (0 rows) +-- check columns options +SELECT attname, attstattarget, attoptions +FROM pg_attribute +WHERE attrelid = 'tbl_idxopts'::regclass +AND attnum > 0 +ORDER BY attnum; + attname | attstattarget | attoptions +---------+---------------+------------------- + i | 1 | + t | -1 | {n_distinct=-0.5} +(2 rows) + -- -- NOT NULL UNIQUE -- diff --git a/regress/expected/repack_1.out b/regress/expected/repack_1.out index f800f07..bc0333c 100644 --- a/regress/expected/repack_1.out +++ b/regress/expected/repack_1.out @@ -55,6 +55,9 @@ CREATE TABLE tbl_idxopts ( t text ); CREATE INDEX idxopts_t ON tbl_idxopts (t DESC NULLS LAST) WHERE (t != 'aaa'); +-- Use this table to play with attribute options too +ALTER TABLE tbl_idxopts ALTER i SET STATISTICS 1; +ALTER TABLE tbl_idxopts ALTER t SET (n_distinct = -0.5); -- -- insert data -- @@ -302,6 +305,18 @@ SELECT oid, relname -----+--------- (0 rows) +-- check columns options +SELECT attname, attstattarget, attoptions +FROM pg_attribute +WHERE attrelid = 'tbl_idxopts'::regclass +AND attnum > 0 +ORDER BY attnum; + attname | attstattarget | attoptions +---------+---------------+------------------- + i | 1 | + t | -1 | {n_distinct=-0.5} +(2 rows) + -- -- NOT NULL UNIQUE -- diff --git a/regress/sql/repack.sql b/regress/sql/repack.sql index d7baa7d..58b358f 100644 --- a/regress/sql/repack.sql +++ b/regress/sql/repack.sql @@ -66,6 +66,10 @@ CREATE TABLE tbl_idxopts ( ); CREATE INDEX idxopts_t ON tbl_idxopts (t DESC NULLS LAST) WHERE (t != 'aaa'); +-- Use this table to play with attribute options too +ALTER TABLE tbl_idxopts ALTER i SET STATISTICS 1; +ALTER TABLE tbl_idxopts ALTER t SET (n_distinct = -0.5); + -- -- insert data -- @@ -168,6 +172,13 @@ SELECT oid, relname AND reltoastrelid <> 0 AND reltoastrelid NOT IN (SELECT oid FROM pg_class WHERE relkind = 't'); +-- check columns options +SELECT attname, attstattarget, attoptions +FROM pg_attribute +WHERE attrelid = 'tbl_idxopts'::regclass +AND attnum > 0 +ORDER BY attnum; + -- -- NOT NULL UNIQUE -- From ca5ca11d4dba6c29d34c46861f206b943983b18b Mon Sep 17 00:00:00 2001 From: Masahiko Sawada Date: Mon, 3 Apr 2017 20:30:00 +0900 Subject: [PATCH 13/23] Specify the storage option for TOAST table when create table. The storage option such as AUTOVACUUM_VACUUM_SCALE_FACTOR can be set to both heap table and TOAST table. But the storage parameter for TOAST table had gone after repacked. This change create new function get_storage_param which returns all storage paramters including for TOAST table and OID setting. Issue #10. --- lib/pg_repack.sql.in | 37 ++++++++++++++++++++++++++++++++++++- regress/expected/repack.out | 21 +++++++++++++++++++++ regress/sql/repack.sql | 14 ++++++++++++++ 3 files changed, 71 insertions(+), 1 deletion(-) diff --git a/lib/pg_repack.sql.in b/lib/pg_repack.sql.in index d294548..ef7d160 100644 --- a/lib/pg_repack.sql.in +++ b/lib/pg_repack.sql.in @@ -152,6 +152,41 @@ WHERE $$ LANGUAGE sql STABLE STRICT; +-- Get a comma-separated storage paramter for the table including +-- paramters for the corresponding TOAST table. +-- Note that since oid setting is always not NULL, this function +-- never returns NULL +CREATE FUNCTION repack.get_storage_param(oid) + RETURNS TEXT AS +$$ +SELECT array_to_string(array_agg(param), ', ') +FROM ( + -- table storage parameter + SELECT unnest(reloptions) as param + FROM pg_class + WHERE oid = $1 + UNION ALL + -- TOAST table storage parameter + SELECT ('toast.' || unnest(reloptions)) as param + FROM ( + SELECT reltoastrelid from pg_class where oid = $1 + ) as t, + pg_class as c + WHERE c.oid = t.reltoastrelid + UNION ALL + -- table oid + SELECT 'oids = ' || + CASE WHEN relhasoids + THEN 'true' + ELSE 'false' + END + FROM pg_class + WHERE oid = $1 + + ) as t +$$ +LANGUAGE sql STABLE STRICT; + -- includes not only PRIMARY KEYS but also UNIQUE NOT NULL keys CREATE VIEW repack.primary_keys AS SELECT indrelid, (repack.array_accum(indexrelid))[1] AS indexrelid @@ -183,7 +218,7 @@ CREATE VIEW repack.tables AS '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_enable_trigger(R.oid) as enable_trigger, - '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 ' AS create_table_1, + 'CREATE TABLE repack.table_' || R.oid || ' WITH (' || repack.get_storage_param(R.oid) || ') TABLESPACE ' AS create_table_1, coalesce(quote_ident(S.spcname), 'pg_default') as tablespace_orig, ' AS SELECT ' || repack.get_columns_for_create_as(R.oid) || ' FROM ONLY ' || repack.oid2text(R.oid) AS create_table_2, repack.get_drop_columns(R.oid, 'repack.table_' || R.oid) AS drop_columns, diff --git a/regress/expected/repack.out b/regress/expected/repack.out index ef0ed4a..f5d4ac2 100644 --- a/regress/expected/repack.out +++ b/regress/expected/repack.out @@ -58,6 +58,12 @@ CREATE INDEX idxopts_t ON tbl_idxopts (t DESC NULLS LAST) WHERE (t != 'aaa'); -- Use this table to play with attribute options too ALTER TABLE tbl_idxopts ALTER i SET STATISTICS 1; ALTER TABLE tbl_idxopts ALTER t SET (n_distinct = -0.5); +CREATE TABLE tbl_with_toast ( + i integer PRIMARY KEY, + c text +); +ALTER TABLE tbl_with_toast SET (AUTOVACUUM_VACUUM_SCALE_FACTOR = 30, AUTOVACUUM_VACUUM_THRESHOLD = 300); +ALTER TABLE tbl_with_toast SET (TOAST.AUTOVACUUM_VACUUM_SCALE_FACTOR = 40, TOAST.AUTOVACUUM_VACUUM_THRESHOLD = 400); -- -- insert data -- @@ -131,6 +137,7 @@ INFO: repacking table "tbl_with_dropped_toast" INFO: repacking table "tbl_badindex" WARNING: skipping invalid index: CREATE UNIQUE INDEX idx_badindex_n ON tbl_badindex USING btree (n) INFO: repacking table "tbl_idxopts" +INFO: repacking table "tbl_with_toast" -- -- after -- @@ -285,6 +292,20 @@ SELECT * FROM tbl_with_dropped_toast; RESET enable_seqscan; RESET enable_indexscan; +-- check if storage option for both table and TOAST table didn't go away. +SELECT CASE relkind + WHEN 'r' THEN relname + WHEN 't' THEN 'toast_table' + END as table, + reloptions +FROM pg_class +WHERE relname = 'tbl_with_toast' OR relname = 'pg_toast_' || 'tbl_with_toast'::regclass::oid; + table | reloptions +----------------+--------------------------------------------------------------------- + toast_table | {autovacuum_vacuum_scale_factor=40,autovacuum_vacuum_threshold=400} + tbl_with_toast | {autovacuum_vacuum_scale_factor=30,autovacuum_vacuum_threshold=300} +(2 rows) + -- -- check broken links or orphan toast relations -- diff --git a/regress/sql/repack.sql b/regress/sql/repack.sql index 58b358f..fa2ef8a 100644 --- a/regress/sql/repack.sql +++ b/regress/sql/repack.sql @@ -69,6 +69,12 @@ CREATE INDEX idxopts_t ON tbl_idxopts (t DESC NULLS LAST) WHERE (t != 'aaa'); -- Use this table to play with attribute options too ALTER TABLE tbl_idxopts ALTER i SET STATISTICS 1; ALTER TABLE tbl_idxopts ALTER t SET (n_distinct = -0.5); +CREATE TABLE tbl_with_toast ( + i integer PRIMARY KEY, + c text +); +ALTER TABLE tbl_with_toast SET (AUTOVACUUM_VACUUM_SCALE_FACTOR = 30, AUTOVACUUM_VACUUM_THRESHOLD = 300); +ALTER TABLE tbl_with_toast SET (TOAST.AUTOVACUUM_VACUUM_SCALE_FACTOR = 40, TOAST.AUTOVACUUM_VACUUM_THRESHOLD = 400); -- -- insert data @@ -157,6 +163,14 @@ SELECT * FROM view_for_dropped_column; SELECT * FROM tbl_with_dropped_toast; RESET enable_seqscan; RESET enable_indexscan; +-- check if storage option for both table and TOAST table didn't go away. +SELECT CASE relkind + WHEN 'r' THEN relname + WHEN 't' THEN 'toast_table' + END as table, + reloptions +FROM pg_class +WHERE relname = 'tbl_with_toast' OR relname = 'pg_toast_' || 'tbl_with_toast'::regclass::oid; -- -- check broken links or orphan toast relations From c44306ba742ca6a148a293668b618f9c200ffa52 Mon Sep 17 00:00:00 2001 From: Masahiko Sawada Date: Mon, 3 Apr 2017 21:10:28 +0900 Subject: [PATCH 14/23] Fix regression test failure. --- regress/expected/repack.out | 5 +++-- regress/expected/repack_1.out | 22 ++++++++++++++++++++++ regress/sql/repack.sql | 3 ++- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/regress/expected/repack.out b/regress/expected/repack.out index f5d4ac2..4840b64 100644 --- a/regress/expected/repack.out +++ b/regress/expected/repack.out @@ -299,11 +299,12 @@ SELECT CASE relkind END as table, reloptions FROM pg_class -WHERE relname = 'tbl_with_toast' OR relname = 'pg_toast_' || 'tbl_with_toast'::regclass::oid; +WHERE relname = 'tbl_with_toast' OR relname = 'pg_toast_' || 'tbl_with_toast'::regclass::oid +ORDER BY 1; table | reloptions ----------------+--------------------------------------------------------------------- - toast_table | {autovacuum_vacuum_scale_factor=40,autovacuum_vacuum_threshold=400} tbl_with_toast | {autovacuum_vacuum_scale_factor=30,autovacuum_vacuum_threshold=300} + toast_table | {autovacuum_vacuum_scale_factor=40,autovacuum_vacuum_threshold=400} (2 rows) -- diff --git a/regress/expected/repack_1.out b/regress/expected/repack_1.out index bc0333c..38a91ac 100644 --- a/regress/expected/repack_1.out +++ b/regress/expected/repack_1.out @@ -58,6 +58,12 @@ CREATE INDEX idxopts_t ON tbl_idxopts (t DESC NULLS LAST) WHERE (t != 'aaa'); -- Use this table to play with attribute options too ALTER TABLE tbl_idxopts ALTER i SET STATISTICS 1; ALTER TABLE tbl_idxopts ALTER t SET (n_distinct = -0.5); +CREATE TABLE tbl_with_toast ( + i integer PRIMARY KEY, + c text +); +ALTER TABLE tbl_with_toast SET (AUTOVACUUM_VACUUM_SCALE_FACTOR = 30, AUTOVACUUM_VACUUM_THRESHOLD = 300); +ALTER TABLE tbl_with_toast SET (TOAST.AUTOVACUUM_VACUUM_SCALE_FACTOR = 40, TOAST.AUTOVACUUM_VACUUM_THRESHOLD = 400); -- -- insert data -- @@ -131,6 +137,7 @@ INFO: repacking table "tbl_with_dropped_toast" INFO: repacking table "tbl_badindex" WARNING: skipping invalid index: CREATE UNIQUE INDEX idx_badindex_n ON tbl_badindex USING btree (n) INFO: repacking table "tbl_idxopts" +INFO: repacking table "tbl_with_toast" -- -- after -- @@ -285,6 +292,21 @@ SELECT * FROM tbl_with_dropped_toast; RESET enable_seqscan; RESET enable_indexscan; +-- check if storage option for both table and TOAST table didn't go away. +SELECT CASE relkind + WHEN 'r' THEN relname + WHEN 't' THEN 'toast_table' + END as table, + reloptions +FROM pg_class +WHERE relname = 'tbl_with_toast' OR relname = 'pg_toast_' || 'tbl_with_toast'::regclass::oid +ORDER BY 1; + table | reloptions +----------------+--------------------------------------------------------------------- + tbl_with_toast | {autovacuum_vacuum_scale_factor=30,autovacuum_vacuum_threshold=300} + toast_table | {autovacuum_vacuum_scale_factor=40,autovacuum_vacuum_threshold=400} +(2 rows) + -- -- check broken links or orphan toast relations -- diff --git a/regress/sql/repack.sql b/regress/sql/repack.sql index fa2ef8a..b04e86f 100644 --- a/regress/sql/repack.sql +++ b/regress/sql/repack.sql @@ -170,7 +170,8 @@ SELECT CASE relkind END as table, reloptions FROM pg_class -WHERE relname = 'tbl_with_toast' OR relname = 'pg_toast_' || 'tbl_with_toast'::regclass::oid; +WHERE relname = 'tbl_with_toast' OR relname = 'pg_toast_' || 'tbl_with_toast'::regclass::oid +ORDER BY 1; -- -- check broken links or orphan toast relations From 3afe19e7c4ea92c39f5fbef4f6a1919fe40ec6ee Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Mon, 10 Apr 2017 23:16:19 +0100 Subject: [PATCH 15/23] Report issue fixed in docs Close #10 --- doc/pg_repack.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/pg_repack.rst b/doc/pg_repack.rst index c35c6fa..89baf8d 100644 --- a/doc/pg_repack.rst +++ b/doc/pg_repack.rst @@ -469,6 +469,7 @@ Releases * added ``--no-kill-backend`` option (issue #108) * added ``--no-superuser-check`` option (issue #114) * added ``--exclude-extension`` option (#97) + * restore TOAST storage parameters on repacked tables (issue #10) * pg_repack 1.3.4 From 5adff6ff0b88d6f162719eff7176069730537c2a Mon Sep 17 00:00:00 2001 From: Masahiko Sawada Date: Mon, 3 Apr 2017 18:52:17 +0900 Subject: [PATCH 16/23] Set column storage type before first copying table. Previously, even if the table whose column storage type has been changed the pg_repack did first copy the data to table without changing column storage paramater. This cause of that the existing data is pushed out to its toast table even if actual column storage type is "main". Issue #94. --- bin/pg_repack.c | 70 ++++++++++++++++++++++--------------- lib/pg_repack.sql.in | 33 +++++++++++++++++ regress/expected/repack.out | 30 +++++++++++----- regress/sql/repack.sql | 17 ++++++--- 4 files changed, 109 insertions(+), 41 deletions(-) diff --git a/bin/pg_repack.c b/bin/pg_repack.c index 87658a1..bc42649 100644 --- a/bin/pg_repack.c +++ b/bin/pg_repack.c @@ -193,7 +193,9 @@ typedef struct repack_table const char *create_log; /* CREATE TABLE log */ const char *create_trigger; /* CREATE TRIGGER repack_trigger */ const char *enable_trigger; /* ALTER TABLE ENABLE ALWAYS TRIGGER repack_trigger */ - const char *create_table; /* CREATE TABLE table AS SELECT */ + const char *create_table; /* CREATE TABLE table AS SELECT WITH NO DATA*/ + const char *copy_data; /* INSERT INTO */ + const char *alter_col_storage; /* ALTER TABLE ALTER COLUMN SET STORAGE */ const char *drop_columns; /* ALTER TABLE DROP COLUMNs */ const char *delete_log; /* DELETE FROM log */ const char *lock_table; /* LOCK TABLE table */ @@ -759,6 +761,8 @@ repack_one_database(const char *orderby, char *errbuf, size_t errsize) create_table_1 = getstr(res, i, c++); tablespace = getstr(res, i, c++); /* to be clobbered */ create_table_2 = getstr(res, i, c++); + table.copy_data = getstr(res, i , c++); + table.alter_col_storage = getstr(res, i, c++); table.drop_columns = getstr(res, i, c++); table.delete_log = getstr(res, i, c++); table.lock_table = getstr(res, i, c++); @@ -781,27 +785,25 @@ repack_one_database(const char *orderby, char *errbuf, size_t errsize) /* CLUSTER mode */ appendStringInfoString(&sql, " ORDER BY "); appendStringInfoString(&sql, ckey); - table.create_table = sql.data; - } - else - { - /* VACUUM FULL mode (non-clustered tables) */ - table.create_table = sql.data; } + + /* else, VACUUM FULL mode (non-clustered tables) */ } else if (!orderby[0]) { - /* VACUUM FULL mode (for clustered tables too) */ - table.create_table = sql.data; + /* VACUUM FULL mode (for clustered tables too), do nothing */ } else { /* User specified ORDER BY */ appendStringInfoString(&sql, " ORDER BY "); appendStringInfoString(&sql, orderby); - table.create_table = sql.data; } + /* Always append WITH NOT DATA */ + appendStringInfoString(&sql, " WITH NO DATA"); + table.create_table = sql.data; + repack_one_table(&table, orderby); } ret = true; @@ -1086,25 +1088,28 @@ repack_one_table(repack_table *table, const char *orderby) elog(INFO, "repacking table \"%s\"", table->target_name); elog(DEBUG2, "---- repack_one_table ----"); - elog(DEBUG2, "target_name : %s", table->target_name); - elog(DEBUG2, "target_oid : %u", table->target_oid); - elog(DEBUG2, "target_toast : %u", table->target_toast); - elog(DEBUG2, "target_tidx : %u", table->target_tidx); - elog(DEBUG2, "pkid : %u", table->pkid); - elog(DEBUG2, "ckid : %u", table->ckid); - 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, "enable_trigger : %s", table->enable_trigger); - 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); - elog(DEBUG2, "lock_table : %s", table->lock_table); - elog(DEBUG2, "sql_peek : %s", table->sql_peek); - elog(DEBUG2, "sql_insert : %s", table->sql_insert); - elog(DEBUG2, "sql_delete : %s", table->sql_delete); - elog(DEBUG2, "sql_update : %s", table->sql_update); - elog(DEBUG2, "sql_pop : %s", table->sql_pop); + elog(DEBUG2, "target_name : %s", table->target_name); + elog(DEBUG2, "target_oid : %u", table->target_oid); + elog(DEBUG2, "target_toast : %u", table->target_toast); + elog(DEBUG2, "target_tidx : %u", table->target_tidx); + elog(DEBUG2, "pkid : %u", table->pkid); + elog(DEBUG2, "ckid : %u", table->ckid); + 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, "enable_trigger : %s", table->enable_trigger); + elog(DEBUG2, "create_table : %s", table->create_table); + elog(DEBUG2, "copy_data : %s", table->copy_data); + elog(DEBUG2, "alter_col_storage : %s", table->alter_col_storage ? + table->alter_col_storage : "(skipped)"); + elog(DEBUG2, "drop_columns : %s", table->drop_columns ? table->drop_columns : "(skipped)"); + elog(DEBUG2, "delete_log : %s", table->delete_log); + elog(DEBUG2, "lock_table : %s", table->lock_table); + elog(DEBUG2, "sql_peek : %s", table->sql_peek); + elog(DEBUG2, "sql_insert : %s", table->sql_insert); + elog(DEBUG2, "sql_delete : %s", table->sql_delete); + elog(DEBUG2, "sql_update : %s", table->sql_update); + elog(DEBUG2, "sql_pop : %s", table->sql_pop); if (dryrun) return; @@ -1346,7 +1351,14 @@ repack_one_table(repack_table *table, const char *orderby) if (!(lock_access_share(connection, table->target_oid, table->target_name))) goto cleanup; + /* + * Before copying data to the target table, we need to set the column storage + * type if its storage type has been changed from the type default. + */ command(table->create_table, 0, NULL); + if (table->alter_col_storage) + command(table->alter_col_storage, 0, NULL); + command(table->copy_data, 0, NULL); temp_obj_num++; printfStringInfo(&sql, "SELECT repack.disable_autovacuum('repack.table_%u')", table->target_oid); if (table->drop_columns) diff --git a/lib/pg_repack.sql.in b/lib/pg_repack.sql.in index d294548..4fb0746 100644 --- a/lib/pg_repack.sql.in +++ b/lib/pg_repack.sql.in @@ -152,6 +152,37 @@ WHERE $$ LANGUAGE sql STABLE STRICT; +-- GET a SQL text to set column storage option for the table. +CREATE FUNCTION repack.get_alter_col_storage(oid) + RETURNS text AS +$$ + SELECT 'ALTER TABLE repack.table_' || $1 || array_to_string(column_storage, ',') + FROM ( + SELECT + repack.array_accum(' ALTER ' || quote_ident(attname) || + CASE attstorage + WHEN 'p' THEN ' SET STORAGE PLAIN' + WHEN 'm' THEN ' SET STORAGE MAIN' + WHEN 'e' THEN ' SET STORAGE EXTERNAL' + WHEN 'x' THEN ' SET STORAGE EXTENDED' + END) AS column_storage + FROM ( + SELECT * + FROM pg_attribute a + JOIN pg_type t on t.oid = atttypid + JOIN pg_class r on r.oid = a.attrelid + JOIN pg_namespace s on s.oid = r.relnamespace + WHERE typstorage <> attstorage + AND attrelid = $1 + AND attnum > 0 + AND NOT attisdropped + ORDER BY attnum + ) T + ) T +WHERE array_upper(column_storage , 1) > 0 +$$ +LANGUAGE sql STABLE STRICT; + -- includes not only PRIMARY KEYS but also UNIQUE NOT NULL keys CREATE VIEW repack.primary_keys AS SELECT indrelid, (repack.array_accum(indexrelid))[1] AS indexrelid @@ -186,6 +217,8 @@ CREATE VIEW repack.tables AS '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 ' AS create_table_1, coalesce(quote_ident(S.spcname), 'pg_default') as tablespace_orig, ' AS SELECT ' || repack.get_columns_for_create_as(R.oid) || ' FROM ONLY ' || repack.oid2text(R.oid) AS create_table_2, + 'INSERT INTO repack.table_' || R.oid || ' SELECT ' || repack.get_columns_for_create_as(R.oid) || ' FROM ONLY ' || repack.oid2text(R.oid) AS copy_data, + repack.get_alter_col_storage(R.oid) AS alter_col_storage, 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, diff --git a/regress/expected/repack.out b/regress/expected/repack.out index ef0ed4a..6e4825f 100644 --- a/regress/expected/repack.out +++ b/regress/expected/repack.out @@ -58,6 +58,11 @@ CREATE INDEX idxopts_t ON tbl_idxopts (t DESC NULLS LAST) WHERE (t != 'aaa'); -- Use this table to play with attribute options too ALTER TABLE tbl_idxopts ALTER i SET STATISTICS 1; ALTER TABLE tbl_idxopts ALTER t SET (n_distinct = -0.5); +CREATE TABLE tbl_with_mod_column_storage ( + id integer PRIMARY KEY, + c text +); +ALTER TABLE tbl_with_mod_column_storage ALTER c SET STORAGE MAIN; -- -- insert data -- @@ -85,6 +90,8 @@ INSERT INTO tbl_with_dropped_toast VALUES(2, 20, sqrt(2::numeric(1000,999))::tex ALTER TABLE tbl_with_dropped_toast DROP COLUMN t; INSERT INTO tbl_badindex VALUES(1, 10); INSERT INTO tbl_badindex VALUES(2, 10); +-- insert data that is always stored into the toast table if column type is extended. +INSERT INTO tbl_with_mod_column_storage SELECT 1, array_to_string(ARRAY(SELECT chr(code) FROM generate_series(33,3000) code), ''); -- This will fail. Silence the message as it's different across PG versions. SET client_min_messages = fatal; CREATE UNIQUE INDEX CONCURRENTLY idx_badindex_n ON tbl_badindex (n); @@ -131,6 +138,7 @@ INFO: repacking table "tbl_with_dropped_toast" INFO: repacking table "tbl_badindex" WARNING: skipping invalid index: CREATE UNIQUE INDEX idx_badindex_n ON tbl_badindex USING btree (n) INFO: repacking table "tbl_idxopts" +INFO: repacking table "tbl_with_mod_column_storage" -- -- after -- @@ -206,14 +214,14 @@ Indexes: "tbl_idxopts_pkey" PRIMARY KEY, btree (i) "idxopts_t" btree (t DESC NULLS LAST) WHERE t <> 'aaa'::text -SELECT col1, to_char("time", 'YYYY-MM-DD HH24:MI:SS'), ","")" FROM tbl_cluster; +SELECT col1, to_char("time", 'YYYY-MM-DD HH24:MI:SS'), ","")" FROM tbl_cluster ORDER BY 1, 2; col1 | to_char | ,") ------+---------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + 1 | 2008-12-31 10:00:00 | admin 2 | 2008-01-01 00:00:00 | king - 5 | 2008-01-01 00:30:00 | 1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727350138462309122970249248360558507372126441214970999358314132226659275055927557999505011527820605714701095599716059702745345968620147285174186408891986095523292304843087143214508397626036279952514079896872533965463318088296406206152583523950547457502877599617298355752203375318570113543746034084988471603868999706990048150305440277903164542478230684929369186215805784631115966687130130156185689872372352885092648612494977154218334204285686060146824720771435854874155657069677653720226485447015858801620758474922657226002085584466521458398893944370926591800311388246468157082630100594858704003186480342194897278290641045072636881313739855256117322040245091227700226941127573627280495738108967504018369868368450725799364729060762996941380475654823728997180326802474420629269124859052181004459842150591120249441341728531478105803603371077309182869314710171111683916581726889419758716582152128229518488471.732050807568877293527446341505872366942805253810380628055806979451933016908800037081146186757248575675626141415406703029969945094998952478811655512094373648528093231902305582067974820101084674923265015312343266903322886650672254668921837971227047131660367861588019049986537379859389467650347506576050756618348129606100947602187190325083145829523959832997789824508288714463832917347224163984587855397667958063818353666110843173780894378316102088305524901670023520711144288695990956365797087168498072899493296484283020786408603988738697537582317317831395992983007838702877053913369563312103707264019249106768231199288375641141422016742752102372994270831059898459475987664288897796147837958390228854852903576033852808064381972344661059689722872865264153822664698420021195484155278441181286534507035191650016689294415480846071277143999762926834629577438361895110127148638746976545982451788550975379013880664961911962222957110555242923723192197738262561631468842032853716682938649611917049738836395495938 3 | 2008-03-04 12:00:00 | joker 4 | 2008-03-05 15:00:00 | queen - 1 | 2008-12-31 10:00:00 | admin + 5 | 2008-01-01 00:30:00 | 1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727350138462309122970249248360558507372126441214970999358314132226659275055927557999505011527820605714701095599716059702745345968620147285174186408891986095523292304843087143214508397626036279952514079896872533965463318088296406206152583523950547457502877599617298355752203375318570113543746034084988471603868999706990048150305440277903164542478230684929369186215805784631115966687130130156185689872372352885092648612494977154218334204285686060146824720771435854874155657069677653720226485447015858801620758474922657226002085584466521458398893944370926591800311388246468157082630100594858704003186480342194897278290641045072636881313739855256117322040245091227700226941127573627280495738108967504018369868368450725799364729060762996941380475654823728997180326802474420629269124859052181004459842150591120249441341728531478105803603371077309182869314710171111683916581726889419758716582152128229518488471.732050807568877293527446341505872366942805253810380628055806979451933016908800037081146186757248575675626141415406703029969945094998952478811655512094373648528093231902305582067974820101084674923265015312343266903322886650672254668921837971227047131660367861588019049986537379859389467650347506576050756618348129606100947602187190325083145829523959832997789824508288714463832917347224163984587855397667958063818353666110843173780894378316102088305524901670023520711144288695990956365797087168498072899493296484283020786408603988738697537582317317831395992983007838702877053913369563312103707264019249106768231199288375641141422016742752102372994270831059898459475987664288897796147837958390228854852903576033852808064381972344661059689722872865264153822664698420021195484155278441181286534507035191650016689294415480846071277143999762926834629577438361895110127148638746976545982451788550975379013880664961911962222957110555242923723192197738262561631468842032853716682938649611917049738836395495938 (5 rows) SELECT * FROM tbl_only_ckey ORDER BY 1; @@ -239,14 +247,14 @@ SELECT * FROM tbl_gistkey ORDER BY 1; SET enable_seqscan = on; SET enable_indexscan = off; -SELECT * FROM tbl_with_dropped_column; +SELECT * FROM tbl_with_dropped_column ; c1 | id | c2 | c3 ----+----+----+---- - c1 | 1 | c2 | c1 | 2 | c2 | + c1 | 1 | c2 | (2 rows) -SELECT * FROM view_for_dropped_column; +SELECT * FROM view_for_dropped_column ORDER BY 1, 2; c1 | id | c2 | c3 ----+----+----+---- c1 | 1 | c2 | @@ -262,7 +270,7 @@ SELECT * FROM tbl_with_dropped_toast; SET enable_seqscan = off; SET enable_indexscan = on; -SELECT * FROM tbl_with_dropped_column; +SELECT * FROM tbl_with_dropped_column ORDER BY 1, 2; c1 | id | c2 | c3 ----+----+----+---- c1 | 1 | c2 | @@ -272,8 +280,8 @@ SELECT * FROM tbl_with_dropped_column; SELECT * FROM view_for_dropped_column; c1 | id | c2 | c3 ----+----+----+---- - c1 | 1 | c2 | c1 | 2 | c2 | + c1 | 1 | c2 | (2 rows) SELECT * FROM tbl_with_dropped_toast; @@ -285,6 +293,12 @@ SELECT * FROM tbl_with_dropped_toast; RESET enable_seqscan; RESET enable_indexscan; +SELECT pg_relation_size(reltoastrelid) = 0 as check_toast_rel_size FROM pg_class WHERE relname = 'tbl_with_mod_column_storage'; + check_toast_rel_size +---------------------- + t +(1 row) + -- -- check broken links or orphan toast relations -- diff --git a/regress/sql/repack.sql b/regress/sql/repack.sql index 58b358f..902e0eb 100644 --- a/regress/sql/repack.sql +++ b/regress/sql/repack.sql @@ -69,6 +69,11 @@ CREATE INDEX idxopts_t ON tbl_idxopts (t DESC NULLS LAST) WHERE (t != 'aaa'); -- Use this table to play with attribute options too ALTER TABLE tbl_idxopts ALTER i SET STATISTICS 1; ALTER TABLE tbl_idxopts ALTER t SET (n_distinct = -0.5); +CREATE TABLE tbl_with_mod_column_storage ( + id integer PRIMARY KEY, + c text +); +ALTER TABLE tbl_with_mod_column_storage ALTER c SET STORAGE MAIN; -- -- insert data @@ -105,6 +110,9 @@ ALTER TABLE tbl_with_dropped_toast DROP COLUMN t; INSERT INTO tbl_badindex VALUES(1, 10); INSERT INTO tbl_badindex VALUES(2, 10); +-- insert data that is always stored into the toast table if column type is extended. +INSERT INTO tbl_with_mod_column_storage SELECT 1, array_to_string(ARRAY(SELECT chr(code) FROM generate_series(33,3000) code), ''); + -- This will fail. Silence the message as it's different across PG versions. SET client_min_messages = fatal; CREATE UNIQUE INDEX CONCURRENTLY idx_badindex_n ON tbl_badindex (n); @@ -140,23 +148,24 @@ SELECT * FROM tbl_with_dropped_toast; \d tbl_with_dropped_toast \d tbl_idxopts -SELECT col1, to_char("time", 'YYYY-MM-DD HH24:MI:SS'), ","")" FROM tbl_cluster; +SELECT col1, to_char("time", 'YYYY-MM-DD HH24:MI:SS'), ","")" FROM tbl_cluster ORDER BY 1, 2; SELECT * FROM tbl_only_ckey ORDER BY 1; SELECT * FROM tbl_only_pkey ORDER BY 1; SELECT * FROM tbl_gistkey ORDER BY 1; SET enable_seqscan = on; SET enable_indexscan = off; -SELECT * FROM tbl_with_dropped_column; -SELECT * FROM view_for_dropped_column; +SELECT * FROM tbl_with_dropped_column ; +SELECT * FROM view_for_dropped_column ORDER BY 1, 2; SELECT * FROM tbl_with_dropped_toast; SET enable_seqscan = off; SET enable_indexscan = on; -SELECT * FROM tbl_with_dropped_column; +SELECT * FROM tbl_with_dropped_column ORDER BY 1, 2; SELECT * FROM view_for_dropped_column; SELECT * FROM tbl_with_dropped_toast; RESET enable_seqscan; RESET enable_indexscan; +SELECT pg_relation_size(reltoastrelid) = 0 as check_toast_rel_size FROM pg_class WHERE relname = 'tbl_with_mod_column_storage'; -- -- check broken links or orphan toast relations From 789e819d7481fa7b26bfa1a5e6498459273db7b6 Mon Sep 17 00:00:00 2001 From: Masahiko Sawada Date: Mon, 3 Apr 2017 21:15:20 +0900 Subject: [PATCH 17/23] Fix regression test failure. --- regress/expected/repack_1.out | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/regress/expected/repack_1.out b/regress/expected/repack_1.out index bc0333c..82bb8d1 100644 --- a/regress/expected/repack_1.out +++ b/regress/expected/repack_1.out @@ -58,6 +58,11 @@ CREATE INDEX idxopts_t ON tbl_idxopts (t DESC NULLS LAST) WHERE (t != 'aaa'); -- Use this table to play with attribute options too ALTER TABLE tbl_idxopts ALTER i SET STATISTICS 1; ALTER TABLE tbl_idxopts ALTER t SET (n_distinct = -0.5); +CREATE TABLE tbl_with_mod_column_storage ( + id integer PRIMARY KEY, + c text +); +ALTER TABLE tbl_with_mod_column_storage ALTER c SET STORAGE MAIN; -- -- insert data -- @@ -85,6 +90,8 @@ INSERT INTO tbl_with_dropped_toast VALUES(2, 20, sqrt(2::numeric(1000,999))::tex ALTER TABLE tbl_with_dropped_toast DROP COLUMN t; INSERT INTO tbl_badindex VALUES(1, 10); INSERT INTO tbl_badindex VALUES(2, 10); +-- insert data that is always stored into the toast table if column type is extended. +INSERT INTO tbl_with_mod_column_storage SELECT 1, array_to_string(ARRAY(SELECT chr(code) FROM generate_series(33,3000) code), ''); -- This will fail. Silence the message as it's different across PG versions. SET client_min_messages = fatal; CREATE UNIQUE INDEX CONCURRENTLY idx_badindex_n ON tbl_badindex (n); @@ -131,6 +138,7 @@ INFO: repacking table "tbl_with_dropped_toast" INFO: repacking table "tbl_badindex" WARNING: skipping invalid index: CREATE UNIQUE INDEX idx_badindex_n ON tbl_badindex USING btree (n) INFO: repacking table "tbl_idxopts" +INFO: repacking table "tbl_with_mod_column_storage" -- -- after -- @@ -206,14 +214,14 @@ Indexes: "tbl_idxopts_pkey" PRIMARY KEY, btree (i) "idxopts_t" btree (t DESC NULLS LAST) WHERE t <> 'aaa'::text -SELECT col1, to_char("time", 'YYYY-MM-DD HH24:MI:SS'), ","")" FROM tbl_cluster; +SELECT col1, to_char("time", 'YYYY-MM-DD HH24:MI:SS'), ","")" FROM tbl_cluster ORDER BY 1, 2; col1 | to_char | ,") ------+---------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + 1 | 2008-12-31 10:00:00 | admin 2 | 2008-01-01 00:00:00 | king - 5 | 2008-01-01 00:30:00 | 1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727350138462309122970249248360558507372126441214970999358314132226659275055927557999505011527820605714701095599716059702745345968620147285174186408891986095523292304843087143214508397626036279952514079896872533965463318088296406206152583523950547457502877599617298355752203375318570113543746034084988471603868999706990048150305440277903164542478230684929369186215805784631115966687130130156185689872372352885092648612494977154218334204285686060146824720771435854874155657069677653720226485447015858801620758474922657226002085584466521458398893944370926591800311388246468157082630100594858704003186480342194897278290641045072636881313739855256117322040245091227700226941127573627280495738108967504018369868368450725799364729060762996941380475654823728997180326802474420629269124859052181004459842150591120249441341728531478105803603371077309182869314710171111683916581726889419758716582152128229518488471.732050807568877293527446341505872366942805253810380628055806979451933016908800037081146186757248575675626141415406703029969945094998952478811655512094373648528093231902305582067974820101084674923265015312343266903322886650672254668921837971227047131660367861588019049986537379859389467650347506576050756618348129606100947602187190325083145829523959832997789824508288714463832917347224163984587855397667958063818353666110843173780894378316102088305524901670023520711144288695990956365797087168498072899493296484283020786408603988738697537582317317831395992983007838702877053913369563312103707264019249106768231199288375641141422016742752102372994270831059898459475987664288897796147837958390228854852903576033852808064381972344661059689722872865264153822664698420021195484155278441181286534507035191650016689294415480846071277143999762926834629577438361895110127148638746976545982451788550975379013880664961911962222957110555242923723192197738262561631468842032853716682938649611917049738836395495938 3 | 2008-03-04 12:00:00 | joker 4 | 2008-03-05 15:00:00 | queen - 1 | 2008-12-31 10:00:00 | admin + 5 | 2008-01-01 00:30:00 | 1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727350138462309122970249248360558507372126441214970999358314132226659275055927557999505011527820605714701095599716059702745345968620147285174186408891986095523292304843087143214508397626036279952514079896872533965463318088296406206152583523950547457502877599617298355752203375318570113543746034084988471603868999706990048150305440277903164542478230684929369186215805784631115966687130130156185689872372352885092648612494977154218334204285686060146824720771435854874155657069677653720226485447015858801620758474922657226002085584466521458398893944370926591800311388246468157082630100594858704003186480342194897278290641045072636881313739855256117322040245091227700226941127573627280495738108967504018369868368450725799364729060762996941380475654823728997180326802474420629269124859052181004459842150591120249441341728531478105803603371077309182869314710171111683916581726889419758716582152128229518488471.732050807568877293527446341505872366942805253810380628055806979451933016908800037081146186757248575675626141415406703029969945094998952478811655512094373648528093231902305582067974820101084674923265015312343266903322886650672254668921837971227047131660367861588019049986537379859389467650347506576050756618348129606100947602187190325083145829523959832997789824508288714463832917347224163984587855397667958063818353666110843173780894378316102088305524901670023520711144288695990956365797087168498072899493296484283020786408603988738697537582317317831395992983007838702877053913369563312103707264019249106768231199288375641141422016742752102372994270831059898459475987664288897796147837958390228854852903576033852808064381972344661059689722872865264153822664698420021195484155278441181286534507035191650016689294415480846071277143999762926834629577438361895110127148638746976545982451788550975379013880664961911962222957110555242923723192197738262561631468842032853716682938649611917049738836395495938 (5 rows) SELECT * FROM tbl_only_ckey ORDER BY 1; @@ -239,14 +247,14 @@ SELECT * FROM tbl_gistkey ORDER BY 1; SET enable_seqscan = on; SET enable_indexscan = off; -SELECT * FROM tbl_with_dropped_column; +SELECT * FROM tbl_with_dropped_column ; c1 | id | c2 | c3 ----+----+----+---- - c1 | 1 | c2 | c1 | 2 | c2 | + c1 | 1 | c2 | (2 rows) -SELECT * FROM view_for_dropped_column; +SELECT * FROM view_for_dropped_column ORDER BY 1, 2; c1 | id | c2 | c3 ----+----+----+---- c1 | 1 | c2 | @@ -262,7 +270,7 @@ SELECT * FROM tbl_with_dropped_toast; SET enable_seqscan = off; SET enable_indexscan = on; -SELECT * FROM tbl_with_dropped_column; +SELECT * FROM tbl_with_dropped_column ORDER BY 1, 2; c1 | id | c2 | c3 ----+----+----+---- c1 | 1 | c2 | @@ -272,8 +280,8 @@ SELECT * FROM tbl_with_dropped_column; SELECT * FROM view_for_dropped_column; c1 | id | c2 | c3 ----+----+----+---- - c1 | 1 | c2 | c1 | 2 | c2 | + c1 | 1 | c2 | (2 rows) SELECT * FROM tbl_with_dropped_toast; @@ -285,6 +293,12 @@ SELECT * FROM tbl_with_dropped_toast; RESET enable_seqscan; RESET enable_indexscan; +SELECT pg_relation_size(reltoastrelid) = 0 as check_toast_rel_size FROM pg_class WHERE relname = 'tbl_with_mod_column_storage'; + check_toast_rel_size +---------------------- + t +(1 row) + -- -- check broken links or orphan toast relations -- From b6ea2ca3c98a52ef3a3af3ba5edae82a9ae87d1a Mon Sep 17 00:00:00 2001 From: Masahiko Sawada Date: Mon, 10 Apr 2017 18:00:17 +0900 Subject: [PATCH 18/23] Fix the mix of tabs and space. --- lib/pg_repack.sql.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pg_repack.sql.in b/lib/pg_repack.sql.in index 4fb0746..846a820 100644 --- a/lib/pg_repack.sql.in +++ b/lib/pg_repack.sql.in @@ -217,8 +217,8 @@ CREATE VIEW repack.tables AS '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 ' AS create_table_1, coalesce(quote_ident(S.spcname), 'pg_default') as tablespace_orig, ' AS SELECT ' || repack.get_columns_for_create_as(R.oid) || ' FROM ONLY ' || repack.oid2text(R.oid) AS create_table_2, - 'INSERT INTO repack.table_' || R.oid || ' SELECT ' || repack.get_columns_for_create_as(R.oid) || ' FROM ONLY ' || repack.oid2text(R.oid) AS copy_data, - repack.get_alter_col_storage(R.oid) AS alter_col_storage, + 'INSERT INTO repack.table_' || R.oid || ' SELECT ' || repack.get_columns_for_create_as(R.oid) || ' FROM ONLY ' || repack.oid2text(R.oid) AS copy_data, + repack.get_alter_col_storage(R.oid) AS alter_col_storage, 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, From 467389abd616310d971ba28ac382c8e50dd4f9cf Mon Sep 17 00:00:00 2001 From: Daniele Varrazzo Date: Mon, 10 Apr 2017 23:31:52 +0100 Subject: [PATCH 19/23] Report column storage issue fixed in docs Close #94. --- doc/pg_repack.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/pg_repack.rst b/doc/pg_repack.rst index c35c6fa..40240f5 100644 --- a/doc/pg_repack.rst +++ b/doc/pg_repack.rst @@ -469,6 +469,7 @@ Releases * added ``--no-kill-backend`` option (issue #108) * added ``--no-superuser-check`` option (issue #114) * added ``--exclude-extension`` option (#97) + * restore columns storage types in repacked tables (issue #94) * pg_repack 1.3.4 From c75a55d229814e8df147be6df4936c52934d119a Mon Sep 17 00:00:00 2001 From: Masahiko Sawada Date: Tue, 11 Apr 2017 23:10:08 +0900 Subject: [PATCH 20/23] Update new item in Japanese doc. --- doc/pg_repack_jp.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/pg_repack_jp.rst b/doc/pg_repack_jp.rst index 937fc34..168ba72 100644 --- a/doc/pg_repack_jp.rst +++ b/doc/pg_repack_jp.rst @@ -862,6 +862,7 @@ ACCESS EXCLUSIVEロックを取得します。その他のステップでは、A .. * added ``--no-kill-backend`` option (issue #108) .. * added ``--no-superuser-check`` option (issue #114) .. * added ``--exclude-extension`` option (#97) +.. * restore columns storage types in repacked tables (issue #94) * pg_repack 1.4 @@ -871,6 +872,7 @@ ACCESS EXCLUSIVEロックを取得します。その他のステップでは、A * ``--no-kill-backend`` オプションを追加しました (issue #108) * ``--no-superuser-check`` オプションを追加しました (issue #114) * ``--exclude-extension`` オプションを追加しました (#97) + * 列の格納タイプを再編成後のテーブルに再設定する様にしました (issue #94) .. * pg_repack 1.3.4 .. * grab exclusive lock before dropping original table (#81) From a6b2b0e82ee05c0d055ff58e633f93b822e0f87a Mon Sep 17 00:00:00 2001 From: Masahiko Sawada Date: Tue, 11 Apr 2017 23:43:11 +0900 Subject: [PATCH 21/23] Fix a mistake of merging. Also fix regression test failure. --- lib/pg_repack.sql.in | 2 ++ regress/expected/repack.out | 1 + regress/expected/repack_1.out | 1 + 3 files changed, 4 insertions(+) diff --git a/lib/pg_repack.sql.in b/lib/pg_repack.sql.in index 33c9868..862ed84 100644 --- a/lib/pg_repack.sql.in +++ b/lib/pg_repack.sql.in @@ -184,6 +184,8 @@ FROM ( WHERE oid = $1 ) as t +$$ +LANGUAGE sql STABLE STRICT; -- GET a SQL text to set column storage option for the table. CREATE FUNCTION repack.get_alter_col_storage(oid) diff --git a/regress/expected/repack.out b/regress/expected/repack.out index ebecc9a..dd4541d 100644 --- a/regress/expected/repack.out +++ b/regress/expected/repack.out @@ -314,6 +314,7 @@ ORDER BY 1; tbl_with_toast | {autovacuum_vacuum_scale_factor=30,autovacuum_vacuum_threshold=300} toast_table | {autovacuum_vacuum_scale_factor=40,autovacuum_vacuum_threshold=400} (2 rows) + SELECT pg_relation_size(reltoastrelid) = 0 as check_toast_rel_size FROM pg_class WHERE relname = 'tbl_with_mod_column_storage'; check_toast_rel_size ---------------------- diff --git a/regress/expected/repack_1.out b/regress/expected/repack_1.out index 3c2f62e..a7bbe2f 100644 --- a/regress/expected/repack_1.out +++ b/regress/expected/repack_1.out @@ -314,6 +314,7 @@ ORDER BY 1; tbl_with_toast | {autovacuum_vacuum_scale_factor=30,autovacuum_vacuum_threshold=300} toast_table | {autovacuum_vacuum_scale_factor=40,autovacuum_vacuum_threshold=400} (2 rows) + SELECT pg_relation_size(reltoastrelid) = 0 as check_toast_rel_size FROM pg_class WHERE relname = 'tbl_with_mod_column_storage'; check_toast_rel_size ---------------------- From 6de31a1249f95abc4662865a6c1d19aa123bdab9 Mon Sep 17 00:00:00 2001 From: Masahiko Sawada Date: Tue, 11 Apr 2017 23:49:10 +0900 Subject: [PATCH 22/23] Add new item in Japanese doc. --- doc/pg_repack_jp.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/pg_repack_jp.rst b/doc/pg_repack_jp.rst index 168ba72..fecee17 100644 --- a/doc/pg_repack_jp.rst +++ b/doc/pg_repack_jp.rst @@ -862,6 +862,7 @@ ACCESS EXCLUSIVEロックを取得します。その他のステップでは、A .. * added ``--no-kill-backend`` option (issue #108) .. * added ``--no-superuser-check`` option (issue #114) .. * added ``--exclude-extension`` option (#97) +.. * restore TOAST storage parameters on repacked tables (issue #10) .. * restore columns storage types in repacked tables (issue #94) * pg_repack 1.4 @@ -872,7 +873,8 @@ ACCESS EXCLUSIVEロックを取得します。その他のステップでは、A * ``--no-kill-backend`` オプションを追加しました (issue #108) * ``--no-superuser-check`` オプションを追加しました (issue #114) * ``--exclude-extension`` オプションを追加しました (#97) - * 列の格納タイプを再編成後のテーブルに再設定する様にしました (issue #94) + * TOASTテーブルの格納オプションを再編成後のテーブルに再設定するようにしました (issue #10) + * 列の格納タイプを再編成後のテーブルに再設定するようにしました (issue #94) .. * pg_repack 1.3.4 .. * grab exclusive lock before dropping original table (#81) From 05fac2dac33e9cd3938618ec8bbb442bc4d8bd29 Mon Sep 17 00:00:00 2001 From: Nicola Murino Date: Fri, 3 Feb 2017 14:38:31 +0100 Subject: [PATCH 23/23] fix compilation with msvc __attribute__ macro is not defined in msvc and it is not essential to the implementation. All it does is tell the compiler that this function is similar to printf, and expects a printf-like format string So for MSVC we define __attribute__ as a macro that do nothing --- bin/pgut/pgut.h | 4 ++++ lib/pgut/pgut-spi.h | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/bin/pgut/pgut.h b/bin/pgut/pgut.h index c33f389..e8816d3 100644 --- a/bin/pgut/pgut.h +++ b/bin/pgut/pgut.h @@ -24,6 +24,10 @@ #define INFINITE_STR "INFINITE" +#ifdef _MSC_VER +#define __attribute__(x) +#endif + typedef enum YesNo { DEFAULT, diff --git a/lib/pgut/pgut-spi.h b/lib/pgut/pgut-spi.h index 5406b36..c5ce52f 100644 --- a/lib/pgut/pgut-spi.h +++ b/lib/pgut/pgut-spi.h @@ -12,6 +12,10 @@ #include "executor/spi.h" +#ifdef _MSC_VER +#define __attribute__(x) +#endif + extern void execute(int expected, const char *sql); extern void execute_plan(int expected, SPIPlanPtr plan, Datum *values, const char *nulls); extern void execute_with_format(int expected, const char *format, ...)