aboutsummaryrefslogtreecommitdiff
path: root/src/test/modules/test_misc/t/002_tablespace.pl
blob: 3f258fd69a2b50371ab1ccd804d3f2cf3e7d0f57 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# Copyright (c) 2024, PostgreSQL Global Development Group

# Simple tablespace tests that can't be replicated on the same host
# due to the use of absolute paths, so we keep them out of the regular
# regression tests.

use strict;
use warnings FATAL => 'all';
use PostgreSQL::Test::Cluster;
use PostgreSQL::Test::Utils;
use Test::More;

my $node = PostgreSQL::Test::Cluster->new('main');
$node->init;
$node->start;

# Create a couple of directories to use as tablespaces.
my $basedir = $node->basedir();
my $TS1_LOCATION = "$basedir/ts1";
$TS1_LOCATION =~ s/\/\.\//\//g;    # collapse foo/./bar to foo/bar
mkdir($TS1_LOCATION);
my $TS2_LOCATION = "$basedir/ts2";
$TS2_LOCATION =~ s/\/\.\//\//g;
mkdir($TS2_LOCATION);

my $result;

# Create a tablespace with an absolute path
$result = $node->psql('postgres',
	"CREATE TABLESPACE regress_ts1 LOCATION '$TS1_LOCATION'");
ok($result == 0, 'create tablespace with absolute path');

# Can't create a tablespace where there is one already
$result = $node->psql('postgres',
	"CREATE TABLESPACE regress_ts1 LOCATION '$TS1_LOCATION'");
ok($result != 0, 'clobber tablespace with absolute path');

# Create table in it
$result = $node->psql('postgres', "CREATE TABLE t () TABLESPACE regress_ts1");
ok($result == 0, 'create table in tablespace with absolute path');

# Can't drop a tablespace that still has a table in it
$result = $node->psql('postgres', "DROP TABLESPACE regress_ts1");
ok($result != 0, 'drop tablespace with absolute path');

# Drop the table
$result = $node->psql('postgres', "DROP TABLE t");
ok($result == 0, 'drop table in tablespace with absolute path');

# Drop the tablespace
$result = $node->psql('postgres', "DROP TABLESPACE regress_ts1");
ok($result == 0, 'drop tablespace with absolute path');

# Create two absolute tablespaces and two in-place tablespaces, so we can
# testing various kinds of tablespace moves.
$result = $node->psql('postgres',
	"CREATE TABLESPACE regress_ts1 LOCATION '$TS1_LOCATION'");
ok($result == 0, 'create tablespace 1 with absolute path');
$result = $node->psql('postgres',
	"CREATE TABLESPACE regress_ts2 LOCATION '$TS2_LOCATION'");
ok($result == 0, 'create tablespace 2 with absolute path');
$result = $node->psql('postgres',
	"SET allow_in_place_tablespaces=on; CREATE TABLESPACE regress_ts3 LOCATION ''"
);
ok($result == 0, 'create tablespace 3 with in-place directory');
$result = $node->psql('postgres',
	"SET allow_in_place_tablespaces=on; CREATE TABLESPACE regress_ts4 LOCATION ''"
);
ok($result == 0, 'create tablespace 4 with in-place directory');

# Create a table and test moving between absolute and in-place tablespaces
$result = $node->psql('postgres', "CREATE TABLE t () TABLESPACE regress_ts1");
ok($result == 0, 'create table in tablespace 1');
$result = $node->psql('postgres', "ALTER TABLE t SET tablespace regress_ts2");
ok($result == 0, 'move table abs->abs');
$result = $node->psql('postgres', "ALTER TABLE t SET tablespace regress_ts3");
ok($result == 0, 'move table abs->in-place');
$result = $node->psql('postgres', "ALTER TABLE t SET tablespace regress_ts4");
ok($result == 0, 'move table in-place->in-place');
$result = $node->psql('postgres', "ALTER TABLE t SET tablespace regress_ts1");
ok($result == 0, 'move table in-place->abs');

# Drop everything
$result = $node->psql('postgres', "DROP TABLE t");
ok($result == 0, 'create table in tablespace 1');
$result = $node->psql('postgres', "DROP TABLESPACE regress_ts1");
ok($result == 0, 'drop tablespace 1');
$result = $node->psql('postgres', "DROP TABLESPACE regress_ts2");
ok($result == 0, 'drop tablespace 2');
$result = $node->psql('postgres', "DROP TABLESPACE regress_ts3");
ok($result == 0, 'drop tablespace 3');
$result = $node->psql('postgres', "DROP TABLESPACE regress_ts4");
ok($result == 0, 'drop tablespace 4');

$node->stop;

done_testing();