diff --git a/META.json b/META.json index b67b0be..9ab89fd 100644 --- a/META.json +++ b/META.json @@ -2,11 +2,12 @@ "name": "pg_repack", "abstract": "PostgreSQL module for data reorganization", "description": "Reorganize tables in PostgreSQL databases with minimal locks", - "version": "1.4", + "version": "1.4.1", "maintainer": [ + "Beena Emerson ", "Josh Kupershmidt ", - "Daniele Varrazzo ", - "Beena Emerson " + "Masahiko Sawada ", + "Daniele Varrazzo " ], "tags": [ "bloat", "maintenance", "vacuum", "cluster" ], "release_status": "stable", @@ -14,14 +15,14 @@ "provides": { "pg_repack": { "file": "lib/pg_repack.sql", - "version": "1.4", + "version": "1.4.1", "abstract": "Reorganize tables in PostgreSQL databases with minimal locks" } }, "prereqs": { "runtime": { "requires": { - "PostgreSQL": "8.3.0" + "PostgreSQL": "9.1.0" } } }, diff --git a/Makefile b/Makefile index 0962722..0abb250 100644 --- a/Makefile +++ b/Makefile @@ -24,6 +24,7 @@ INTVERSION := $(shell echo $$(($$(echo $(VERSION).0 | sed 's/\([[:digit:]]\{1,\} EXTVERSION = $(shell grep '"version":' META.json | head -1 \ | sed -e 's/[ ]*"version":[ ]*"\(.*\)",/\1/') +# NOTE: keep consistent with META.json ifeq ($(shell echo $$(($(INTVERSION) < 901))),1) $(error $(EXTENSION) requires PostgreSQL 9.1 or later. This is $(VERSION)) endif diff --git a/bin/pg_repack.c b/bin/pg_repack.c index f8988e0..9a62a47 100644 --- a/bin/pg_repack.c +++ b/bin/pg_repack.c @@ -772,6 +772,7 @@ repack_one_database(const char *orderby, char *errbuf, size_t errsize) for (i = 0; i < num; i++) { repack_table table; + StringInfoData copy_sql; const char *create_table_1; const char *create_table_2; const char *tablespace; @@ -814,17 +815,27 @@ repack_one_database(const char *orderby, char *errbuf, size_t errsize) table.sql_pop = getstr(res, i, c++); tablespace = getstr(res, i, c++); + /* Craft CREATE TABLE SQL */ resetStringInfo(&sql); appendStringInfoString(&sql, create_table_1); appendStringInfoString(&sql, tablespace); appendStringInfoString(&sql, create_table_2); + + /* Always append WITH NO DATA to CREATE TABLE SQL*/ + appendStringInfoString(&sql, " WITH NO DATA"); + table.create_table = sql.data; + + /* Craft Copy SQL */ + initStringInfo(©_sql); + appendStringInfoString(©_sql, table.copy_data); if (!orderby) + { if (ckey != NULL) { /* CLUSTER mode */ - appendStringInfoString(&sql, " ORDER BY "); - appendStringInfoString(&sql, ckey); + appendStringInfoString(©_sql, " ORDER BY "); + appendStringInfoString(©_sql, ckey); } /* else, VACUUM FULL mode (non-clustered tables) */ @@ -836,13 +847,10 @@ repack_one_database(const char *orderby, char *errbuf, size_t errsize) else { /* User specified ORDER BY */ - appendStringInfoString(&sql, " ORDER BY "); - appendStringInfoString(&sql, orderby); + appendStringInfoString(©_sql, " ORDER BY "); + appendStringInfoString(©_sql, orderby); } - - /* Always append WITH NOT DATA */ - appendStringInfoString(&sql, " WITH NO DATA"); - table.create_table = sql.data; + table.copy_data = copy_sql.data; repack_one_table(&table, orderby); } @@ -852,6 +860,7 @@ cleanup: CLEARPGRES(res); disconnect(); termStringInfo(&sql); + free(params); return ret; } @@ -1771,6 +1780,12 @@ lock_exclusive(PGconn *conn, const char *relid, const char *lock_query, bool sta { elog(WARNING, "timed out, do not cancel conflicting backends"); ret = false; + + /* Before exit the loop reset the transaction */ + if (start_xact) + pgut_rollback(conn); + else + pgut_command(conn, "ROLLBACK TO SAVEPOINT repack_sp1", 0, NULL); break; } else diff --git a/doc/pg_repack.rst b/doc/pg_repack.rst index 0969676..d32a48d 100644 --- a/doc/pg_repack.rst +++ b/doc/pg_repack.rst @@ -466,6 +466,10 @@ Creating indexes concurrently comes with a few caveats, please see `the document Releases -------- +* pg_repack 1.4.1 + + * fixed broken ``--order-by`` option (issue #138) + * pg_repack 1.4 * added support for PostgreSQL 9.6, dropped support for versions before 9.1 diff --git a/doc/pg_repack_jp.rst b/doc/pg_repack_jp.rst index 7d5ee14..5ed4469 100644 --- a/doc/pg_repack_jp.rst +++ b/doc/pg_repack_jp.rst @@ -289,6 +289,7 @@ OPTIONには以下のものが指定できます。 .. ``-I TABLE``, ``--parent-table=TABLE`` Reorganize both the specified table(s) and its inheritors. Multiple table hierarchies may be reorganized by writing multiple ``-I`` switches. + ``-I TABLE``, ``--parent-table=TABLE`` 指定したテーブルとその子テーブルのみを再編成します。 ``-I`` オプションを複数同時に使用することで、複数の親テーブルを指定することができます。 @@ -863,6 +864,12 @@ ACCESS EXCLUSIVEロックを取得します。その他のステップでは、A リリースノート --------------- +.. * pg_repack 1.4.1 +.. * fixed broken ``--order-by`` option (issue #138) + +* pg_repack 1.4.1 + * 壊れていた ``--order-by`` オプションを修正しました (issue #138) + .. * pg_repack 1.4 .. * added support for PostgreSQL 9.6 .. * use ``AFTER`` trigger to solve concurrency problems with ``INSERT diff --git a/doc/release.rst b/doc/release.rst index 2a2c277..8e9719c 100644 --- a/doc/release.rst +++ b/doc/release.rst @@ -14,9 +14,6 @@ with the right privileges: contact Daniele Varrazzo to obtain them. places). - Set the right release_status in ``META.json``: ``testing`` or ``stable``. - Commit the above metadata changes. -- Create a tag, signed if possible:: - - git tag -a -s ver_$VER - Create a package running ``make package``. The package will be called ``dist/pg_repack-$VER.zip``. @@ -32,25 +29,31 @@ with the right privileges: contact Daniele Varrazzo to obtain them. .. __: http://pgxnclient.projects.pgfoundry.org/ -- Push the code changes and tags on github:: +- Push the code changes on github:: git push - git push --tags - Upload the package on http://manager.pgxn.org/. -- Check the uploaded package works as expected:: +- Check the uploaded package works as expected; if not fix and push more:: pgxn install --sudo -- pg_repack pgxn check pg_repack +- Create a tag, signed if possible:: + + git tag -a -s ver_$VER + +- Push the new tag on github:: + + git push --tags + - Upload the docs by pushing in the repos at http://reorg.github.io/pg_repack/. The operations are roughly:: - git clone git@github.com:reorg/reorg.github.com.git + git clone --recursive git@github.com:reorg/reorg.github.com.git cd reorg.github.com.git - git submodule init - git submodule update + make sm make git commit -a -m "Docs upload for release $VER" git push diff --git a/regress/expected/repack.out b/regress/expected/repack.out index ee0c603..205cd1b 100644 --- a/regress/expected/repack.out +++ b/regress/expected/repack.out @@ -84,6 +84,7 @@ CREATE TABLE tbl_with_mod_column_storage ( c text ); ALTER TABLE tbl_with_mod_column_storage ALTER c SET STORAGE MAIN; +CREATE TABLE tbl_order (c int primary key); -- -- insert data -- @@ -118,6 +119,10 @@ 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'); +-- Insert no-ordered data +INSERT INTO tbl_order SELECT generate_series(100, 51, -1); +CLUSTER tbl_order USING tbl_order_pkey; +INSERT INTO tbl_order SELECT generate_series(50, 1, -1); -- -- before -- @@ -161,6 +166,7 @@ WARNING: skipping invalid index: CREATE UNIQUE INDEX idx_badindex_n ON tbl_badin INFO: repacking table "tbl_idxopts" INFO: repacking table "tbl_with_toast" INFO: repacking table "tbl_with_mod_column_storage" +INFO: repacking table "tbl_order" -- -- after -- @@ -272,8 +278,8 @@ SET enable_indexscan = off; SELECT * FROM tbl_with_dropped_column ; c1 | id | c2 | c3 ----+----+----+---- - c1 | 2 | c2 | c1 | 1 | c2 | + c1 | 2 | c2 | (2 rows) SELECT * FROM view_for_dropped_column ORDER BY 1, 2; @@ -302,8 +308,8 @@ SELECT * FROM tbl_with_dropped_column ORDER BY 1, 2; SELECT * FROM view_for_dropped_column; c1 | id | c2 | c3 ----+----+----+---- - c1 | 2 | c2 | c1 | 1 | c2 | + c1 | 2 | c2 | (2 rows) SELECT * FROM tbl_with_dropped_toast; @@ -417,6 +423,45 @@ 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" +-- +-- Table re-organization using specific column +-- +-- reorganize table using cluster key. Sort in ascending order. +\! pg_repack --dbname=contrib_regression --table=tbl_order +INFO: repacking table "tbl_order" +SELECT ctid, c FROM tbl_order WHERE ctid <= '(0,10)'; + ctid | c +--------+---- + (0,1) | 1 + (0,2) | 2 + (0,3) | 3 + (0,4) | 4 + (0,5) | 5 + (0,6) | 6 + (0,7) | 7 + (0,8) | 8 + (0,9) | 9 + (0,10) | 10 +(10 rows) + +-- reorganize table using specific column order. Sort in descending order. +\! pg_repack --dbname=contrib_regression --table=tbl_order -o "c DESC" +INFO: repacking table "tbl_order" +SELECT ctid, c FROM tbl_order WHERE ctid <= '(0,10)'; + ctid | c +--------+----- + (0,1) | 100 + (0,2) | 99 + (0,3) | 98 + (0,4) | 97 + (0,5) | 96 + (0,6) | 95 + (0,7) | 94 + (0,8) | 93 + (0,9) | 92 + (0,10) | 91 +(10 rows) + -- -- Dry run -- diff --git a/regress/expected/repack_1.out b/regress/expected/repack_1.out index 83878f4..85d665f 100644 --- a/regress/expected/repack_1.out +++ b/regress/expected/repack_1.out @@ -84,6 +84,7 @@ CREATE TABLE tbl_with_mod_column_storage ( c text ); ALTER TABLE tbl_with_mod_column_storage ALTER c SET STORAGE MAIN; +CREATE TABLE tbl_order (c int primary key); -- -- insert data -- @@ -118,6 +119,10 @@ 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'); +-- Insert no-ordered data +INSERT INTO tbl_order SELECT generate_series(100, 51, -1); +CLUSTER tbl_order USING tbl_order_pkey; +INSERT INTO tbl_order SELECT generate_series(50, 1, -1); -- -- before -- @@ -161,6 +166,7 @@ WARNING: skipping invalid index: CREATE UNIQUE INDEX idx_badindex_n ON tbl_badin INFO: repacking table "tbl_idxopts" INFO: repacking table "tbl_with_toast" INFO: repacking table "tbl_with_mod_column_storage" +INFO: repacking table "tbl_order" -- -- after -- @@ -272,8 +278,8 @@ SET enable_indexscan = off; SELECT * FROM tbl_with_dropped_column ; c1 | id | c2 | c3 ----+----+----+---- - c1 | 2 | c2 | c1 | 1 | c2 | + c1 | 2 | c2 | (2 rows) SELECT * FROM view_for_dropped_column ORDER BY 1, 2; @@ -302,8 +308,8 @@ SELECT * FROM tbl_with_dropped_column ORDER BY 1, 2; SELECT * FROM view_for_dropped_column; c1 | id | c2 | c3 ----+----+----+---- - c1 | 2 | c2 | c1 | 1 | c2 | + c1 | 2 | c2 | (2 rows) SELECT * FROM tbl_with_dropped_toast; @@ -417,6 +423,45 @@ 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" +-- +-- Table re-organization using specific column +-- +-- reorganize table using cluster key. Sort in ascending order. +\! pg_repack --dbname=contrib_regression --table=tbl_order +INFO: repacking table "tbl_order" +SELECT ctid, c FROM tbl_order WHERE ctid <= '(0,10)'; + ctid | c +--------+---- + (0,1) | 1 + (0,2) | 2 + (0,3) | 3 + (0,4) | 4 + (0,5) | 5 + (0,6) | 6 + (0,7) | 7 + (0,8) | 8 + (0,9) | 9 + (0,10) | 10 +(10 rows) + +-- reorganize table using specific column order. Sort in descending order. +\! pg_repack --dbname=contrib_regression --table=tbl_order -o "c DESC" +INFO: repacking table "tbl_order" +SELECT ctid, c FROM tbl_order WHERE ctid <= '(0,10)'; + ctid | c +--------+----- + (0,1) | 100 + (0,2) | 99 + (0,3) | 98 + (0,4) | 97 + (0,5) | 96 + (0,6) | 95 + (0,7) | 94 + (0,8) | 93 + (0,9) | 92 + (0,10) | 91 +(10 rows) + -- -- Dry run -- diff --git a/regress/sql/repack.sql b/regress/sql/repack.sql index 65eea3c..917d79f 100644 --- a/regress/sql/repack.sql +++ b/regress/sql/repack.sql @@ -92,6 +92,7 @@ CREATE TABLE tbl_with_mod_column_storage ( ); ALTER TABLE tbl_with_mod_column_storage ALTER c SET STORAGE MAIN; +CREATE TABLE tbl_order (c int primary key); -- -- insert data -- @@ -137,6 +138,10 @@ SET client_min_messages = warning; INSERT INTO tbl_idxopts VALUES (0, 'abc'), (1, 'aaa'), (2, NULL), (3, 'bbb'); +-- Insert no-ordered data +INSERT INTO tbl_order SELECT generate_series(100, 51, -1); +CLUSTER tbl_order USING tbl_order_pkey; +INSERT INTO tbl_order SELECT generate_series(50, 1, -1); -- -- before -- @@ -252,6 +257,19 @@ 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 +-- +-- Table re-organization using specific column +-- + +-- reorganize table using cluster key. Sort in ascending order. +\! pg_repack --dbname=contrib_regression --table=tbl_order +SELECT ctid, c FROM tbl_order WHERE ctid <= '(0,10)'; + +-- reorganize table using specific column order. Sort in descending order. +\! pg_repack --dbname=contrib_regression --table=tbl_order -o "c DESC" +SELECT ctid, c FROM tbl_order WHERE ctid <= '(0,10)'; + + -- -- Dry run --