mirror of
https://github.com/timescale/timescaledb.git
synced 2025-05-16 18:43:18 +08:00
Users can now call `show_tablespaces()` to list the tablespaces attached to a particular hypertable.
121 lines
4.4 KiB
SQL
121 lines
4.4 KiB
SQL
\set ON_ERROR_STOP 0
|
|
|
|
\c single :ROLE_SUPERUSER
|
|
SET client_min_messages = ERROR;
|
|
DROP TABLESPACE IF EXISTS tablespace1;
|
|
DROP TABLESPACE IF EXISTS tablespace2;
|
|
SET client_min_messages = NOTICE;
|
|
|
|
--test hypertable with tables space
|
|
CREATE TABLESPACE tablespace1 OWNER :ROLE_DEFAULT_PERM_USER LOCATION :TEST_TABLESPACE1_PATH;
|
|
\c single :ROLE_DEFAULT_PERM_USER
|
|
|
|
--assigning a tablespace via the main table should work
|
|
CREATE TABLE tspace_2dim(time timestamp, temp float, device text) TABLESPACE tablespace1;
|
|
SELECT create_hypertable('tspace_2dim', 'time', 'device', 2);
|
|
|
|
INSERT INTO tspace_2dim VALUES ('2017-01-20T09:00:01', 24.3, 'blue');
|
|
|
|
--verify that the table chunk has the correct tablespace
|
|
SELECT relname, spcname FROM pg_class c
|
|
INNER JOIN pg_tablespace t ON (c.reltablespace = t.oid)
|
|
INNER JOIN _timescaledb_catalog.chunk ch ON (ch.table_name = c.relname);
|
|
|
|
--check some error conditions
|
|
SELECT attach_tablespace('tablespace2', NULL);
|
|
SELECT attach_tablespace(NULL, 'tspace_2dim');
|
|
SELECT attach_tablespace('none_existing_tablespace', 'tspace_2dim');
|
|
SELECT attach_tablespace('tablespace2', 'none_existing_table');
|
|
|
|
--attach another tablespace without first creating it --> should generate error
|
|
SELECT attach_tablespace('tablespace2', 'tspace_2dim');
|
|
--attach the same tablespace twice to same table should also generate error
|
|
SELECT attach_tablespace('tablespace1', 'tspace_2dim');
|
|
|
|
\c single :ROLE_SUPERUSER
|
|
CREATE TABLESPACE tablespace2 OWNER :ROLE_DEFAULT_PERM_USER_2 LOCATION :TEST_TABLESPACE2_PATH;
|
|
\c single :ROLE_DEFAULT_PERM_USER_2
|
|
|
|
--attach without permissions on the table should fail
|
|
SELECT attach_tablespace('tablespace2', 'tspace_2dim');
|
|
|
|
\c single :ROLE_DEFAULT_PERM_USER
|
|
|
|
--attach without permissions on the tablespace should also fail
|
|
SELECT attach_tablespace('tablespace2', 'tspace_2dim');
|
|
|
|
\c single :ROLE_SUPERUSER
|
|
GRANT :ROLE_DEFAULT_PERM_USER_2 TO :ROLE_DEFAULT_PERM_USER;
|
|
\c single :ROLE_DEFAULT_PERM_USER
|
|
|
|
--should work with permissions on both the table and the tablespace
|
|
SELECT attach_tablespace('tablespace2', 'tspace_2dim');
|
|
|
|
SELECT * FROM _timescaledb_catalog.tablespace;
|
|
SELECT * FROM show_tablespaces('tspace_2dim');
|
|
|
|
--insert into another chunk
|
|
INSERT INTO tspace_2dim VALUES ('2017-01-20T09:00:01', 24.3, 'brown');
|
|
|
|
SELECT relname, spcname FROM pg_class c
|
|
INNER JOIN pg_tablespace t ON (c.reltablespace = t.oid)
|
|
INNER JOIN _timescaledb_catalog.chunk ch ON (ch.table_name = c.relname);
|
|
|
|
--
|
|
SET ROLE :ROLE_DEFAULT_PERM_USER_2;
|
|
-- User doesn't have permission on tablespace1 --> error
|
|
CREATE TABLE tspace_1dim(time timestamp, temp float, device text) TABLESPACE tablespace1;
|
|
|
|
-- Grant permission to tablespace1
|
|
SET ROLE :ROLE_DEFAULT_PERM_USER;
|
|
GRANT CREATE ON TABLESPACE tablespace1 TO :ROLE_DEFAULT_PERM_USER_2;
|
|
SET ROLE :ROLE_DEFAULT_PERM_USER_2;
|
|
CREATE TABLE tspace_1dim(time timestamp, temp float, device text) TABLESPACE tablespace1;
|
|
|
|
SELECT create_hypertable('tspace_1dim', 'time');
|
|
SELECT attach_tablespace('tablespace2', 'tspace_1dim');
|
|
|
|
SELECT * FROM _timescaledb_catalog.tablespace;
|
|
|
|
INSERT INTO tspace_1dim VALUES ('2017-01-20T09:00:01', 24.3, 'blue');
|
|
INSERT INTO tspace_1dim VALUES ('2017-03-20T09:00:01', 24.3, 'brown');
|
|
|
|
SELECT relname, spcname FROM pg_class c
|
|
INNER JOIN pg_tablespace t ON (c.reltablespace = t.oid)
|
|
INNER JOIN _timescaledb_catalog.chunk ch ON (ch.table_name = c.relname);
|
|
|
|
--detach tablespace1 from all tables. Due to lack of permissions,
|
|
--should only detach from 'tspace_1dim' (1 tablespace)
|
|
SELECT detach_tablespace('tablespace1');
|
|
SELECT * FROM _timescaledb_catalog.tablespace;
|
|
SELECT * FROM show_tablespaces('tspace_1dim');
|
|
SELECT * FROM show_tablespaces('tspace_2dim');
|
|
|
|
--detach the other tablespace
|
|
SELECT detach_tablespace('tablespace2', 'tspace_1dim');
|
|
SELECT * FROM _timescaledb_catalog.tablespace;
|
|
SELECT * FROM show_tablespaces('tspace_1dim');
|
|
SELECT * FROM show_tablespaces('tspace_2dim');
|
|
|
|
--detaching a tablespace from table without permissions should fail
|
|
SELECT detach_tablespace('tablespace2', 'tspace_2dim');
|
|
SELECT detach_tablespaces('tspace_2dim');
|
|
|
|
--set other user should make detach work
|
|
SET ROLE :ROLE_DEFAULT_PERM_USER;
|
|
SELECT detach_tablespaces('tspace_2dim');
|
|
SELECT * FROM _timescaledb_catalog.tablespace;
|
|
SELECT * FROM show_tablespaces('tspace_1dim');
|
|
SELECT * FROM show_tablespaces('tspace_2dim');
|
|
|
|
--cleanup
|
|
DROP TABLE tspace_1dim CASCADE;
|
|
DROP TABLE tspace_2dim CASCADE;
|
|
|
|
DROP TABLESPACE tablespace1;
|
|
DROP TABLESPACE tablespace2;
|
|
|
|
-- revoke grants
|
|
\c single :ROLE_SUPERUSER
|
|
REVOKE :ROLE_DEFAULT_PERM_USER_2 FROM :ROLE_DEFAULT_PERM_USER;
|