Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ TESTS = $(wildcard test/sql/*.sql)
REGRESS = $(patsubst test/sql/%.sql,%,$(TESTS))
REGRESS_OPTS = --inputdir=test \
--load-extension=$(EXTENSION) \
--temp-instance=$$PWD/tmp
--temp-instance=$$PWD/tmp
REGRESS_PREP = mktblspace
SQLSRC = $(wildcard sql/*.sql)
include $(PGXS)
Expand All @@ -21,4 +21,4 @@ $(EXTENSION)--$(EXTVERSION).sql: $(SQLSRC)
@cat $^ >> $@

mktblspace:
mkdir -p /tmp/tsttblsp
mkdir -p /tmp/tsttblsp
23 changes: 23 additions & 0 deletions mvtbl--0.0.2--0.0.3.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
\echo Use "ALTER EXTENSION mvtbl UPDATE TO '0.0.3'" to load this file. \quit

CREATE FUNCTION mvtbl(tbl text, tblspace text, retries int, sleep_sec int DEFAULT 10)
RETURNS bigint AS
$$
DECLARE
res bigint;
BEGIN
FOR i in 1..retries LOOP
BEGIN
res = mvtbl(tbl, tblspace);
EXIT;
EXCEPTION WHEN lock_not_available THEN
IF i = retries THEN
RAISE;
END IF;
PERFORM pg_sleep(sleep_sec);
END;
END LOOP;
RETURN res;
END;
$$ LANGUAGE plpgsql STRICT;
4 changes: 4 additions & 0 deletions mvtbl--0.0.3--0.0.2.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
\echo Use "ALTER EXTENSION mvtbl UPDATE TO '0.0.2'" to load this file. \quit

DROP FUNCTION mvtbl(tbl text, tblspace text, retries int, sleep_sec int)
46 changes: 46 additions & 0 deletions mvtbl--0.0.3.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
\echo Use "CREATE EXTENSION mvtbl" to load this file. \quit

CREATE FUNCTION mvtbl(tbl text, tblspace text)
RETURNS bigint AS
$$
DECLARE
r RECORD;
tbl_oid oid := tbl::regclass::oid;
res bigint = 0;
BEGIN
EXECUTE format($sql$ ALTER TABLE %s SET TABLESPACE %s $sql$, tbl, tblspace);
SELECT pg_catalog.pg_total_relation_size(tbl) INTO res;

FOR r IN SELECT
c2.oid::regclass as iname
FROM pg_catalog.pg_class c, pg_catalog.pg_class c2, pg_catalog.pg_index i
WHERE c.oid = tbl_oid AND c.oid = i.indrelid AND i.indexrelid = c2.oid
ORDER BY i.indisprimary DESC, i.indisunique DESC, c2.relname LOOP

EXECUTE format($sql$ ALTER INDEX %s SET TABLESPACE %s $sql$, r.iname, tblspace);
END LOOP;
RETURN res;
END;
$$ LANGUAGE plpgsql STRICT;

CREATE FUNCTION mvtbl(tbl text, tblspace text, retries int, sleep_sec int DEFAULT 10)
RETURNS bigint AS
$$
DECLARE
res bigint;
BEGIN
FOR i in 1..retries LOOP
BEGIN
res = mvtbl(tbl, tblspace);
EXIT;
EXCEPTION WHEN lock_not_available THEN
IF i = retries THEN
RAISE;
END IF;
PERFORM pg_sleep(sleep_sec);
END;
END LOOP;
RETURN res;
END;
$$ LANGUAGE plpgsql STRICT;
2 changes: 1 addition & 1 deletion mvtbl.control
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# mvtbl extension
comment = 'Helper to move tables around tablespaces'
default_version = '0.0.2'
default_version = '0.0.3'
relocatable = true
requires = ''
27 changes: 24 additions & 3 deletions sql/mvtbl.sql
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
CREATE FUNCTION mvtbl(tbl text, tblspace text)
CREATE FUNCTION mvtbl(tbl text, tblspace text)
RETURNS bigint AS
$$
DECLARE
r RECORD;
r RECORD;
tbl_oid oid := tbl::regclass::oid;
res bigint = 0;
BEGIN
EXECUTE format($sql$ ALTER TABLE %s SET TABLESPACE %s $sql$, tbl, tblspace);
SELECT pg_catalog.pg_total_relation_size(tbl) INTO res;

FOR r IN SELECT
FOR r IN SELECT
c2.oid::regclass as iname
FROM pg_catalog.pg_class c, pg_catalog.pg_class c2, pg_catalog.pg_index i
WHERE c.oid = tbl_oid AND c.oid = i.indrelid AND i.indexrelid = c2.oid
Expand All @@ -20,3 +20,24 @@ $$
RETURN res;
END;
$$ LANGUAGE plpgsql STRICT;

CREATE FUNCTION mvtbl(tbl text, tblspace text, retries int, sleep_sec int DEFAULT 10)
RETURNS bigint AS
$$
DECLARE
res bigint;
BEGIN
FOR i in 1..retries LOOP
Comment thread
rapimo marked this conversation as resolved.
BEGIN
res = mvtbl(tbl, tblspace);
EXIT;
EXCEPTION WHEN lock_not_available THEN
IF i = retries THEN
RAISE;
END IF;
pg_sleep(sleep_sec);
END;
END LOOP;
RETURN res;
END;
$$ LANGUAGE plpgsql STRICT;
14 changes: 14 additions & 0 deletions test/expected/mvtbl_test.out
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,18 @@ SELECT pg_size_pretty(mvtbl('test','pg_default'));
123 MB
(1 row)

SELECT pg_size_pretty(mvtbl('test','mvtbl_test_tblspace', 3, 3));
pg_size_pretty
----------------
123 MB
(1 row)

SELECT pg_size_pretty(mvtbl('test','pg_default', 3));
pg_size_pretty
----------------
123 MB
(1 row)

ALTER EXTENSION mvtbl UPDATE TO '0.0.2';
ALTER EXTENSION mvtbl UPDATE TO '0.0.3';
DROP TABLESPACE mvtbl_test_tblspace;
6 changes: 6 additions & 0 deletions test/sql/mvtbl_test.sql
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,10 @@ CREATE INDEX ON test(c);
SELECT pg_size_pretty(mvtbl('test','mvtbl_test_tblspace'));
SELECT pg_size_pretty(mvtbl('test','pg_default'));

SELECT pg_size_pretty(mvtbl('test','mvtbl_test_tblspace', 3, 3));
SELECT pg_size_pretty(mvtbl('test','pg_default', 3));

ALTER EXTENSION mvtbl UPDATE TO '0.0.2';
ALTER EXTENSION mvtbl UPDATE TO '0.0.3';

DROP TABLESPACE mvtbl_test_tblspace;