From 5adff6ff0b88d6f162719eff7176069730537c2a Mon Sep 17 00:00:00 2001 From: Masahiko Sawada Date: Mon, 3 Apr 2017 18:52:17 +0900 Subject: [PATCH 1/5] 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 2/5] 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 3/5] 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 4/5] 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 5/5] 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)