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.
This commit is contained in:
committed by
Daniele Varrazzo
parent
6d7b1dbca4
commit
5adff6ff0b
@ -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,
|
||||
|
Reference in New Issue
Block a user