resolve conflicts
This commit is contained in:
@ -152,6 +152,72 @@ 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;
|
||||
|
||||
-- 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
|
||||
@ -183,9 +249,11 @@ 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,
|
||||
'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