Skip to content

Commit b94d661

Browse files
committed
Merge branch 'rel_1_1_beta' of github.com:postgrespro/pg_pathman into rel_1_1_beta
2 parents 69c1b6d + af70495 commit b94d661

File tree

3 files changed

+142
-18
lines changed

3 files changed

+142
-18
lines changed

init.sql

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,7 @@ DECLARE
514514
v_rows INTEGER;
515515
v_part_count INTEGER := 0;
516516
conf_num_del INTEGER;
517+
v_relkind CHAR;
517518

518519
BEGIN
519520
PERFORM @extschema@.validate_relname(parent_relid);
@@ -547,7 +548,20 @@ BEGIN
547548
RAISE NOTICE '% rows copied from %', v_rows, v_rec.tbl;
548549
END IF;
549550

550-
EXECUTE format('DROP TABLE %s', v_rec.tbl);
551+
/*
552+
* Determine the kind of child relation. It can be either regular
553+
* table (r) or foreign table (f). Depending on relkind we use
554+
* DROP TABLE or DROP FOREIGN TABLE
555+
*/
556+
EXECUTE format('SELECT relkind FROM pg_class WHERE oid = ''%s''::regclass', v_rec.tbl)
557+
INTO v_relkind;
558+
559+
IF v_relkind = 'f' THEN
560+
EXECUTE format('DROP FOREIGN TABLE %s', v_rec.tbl);
561+
ELSE
562+
EXECUTE format('DROP TABLE %s', v_rec.tbl);
563+
END IF;
564+
551565
v_part_count := v_part_count + 1;
552566
END LOOP;
553567

tests/README.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# Tests
2+
3+
This directory contains script to tests some features which cannot be tested
4+
with only regression tests
5+
6+
## Running
7+
8+
First of all you need to install `testgres` python module which contains useful
9+
functions to start postgres clusters and make queries:
10+
11+
```
12+
pip install testgres
13+
```
14+
15+
To run tests execute:
16+
17+
```
18+
python -m unittest partitioning_test
19+
```
20+
21+
from current directory. If you want to run a specific postgres build then
22+
you should specify the path to your pg_config executable by setting PG_CONFIG
23+
environment variable:
24+
25+
```
26+
export PG_CONFIG=/path/to/pg_config
27+
```
28+
29+
To test FDW features you need to install postgres_fdw contrib module first.
30+
If you want to skip FDW tests set the FDW_DISABLED environment variable:
31+
32+
```
33+
export FDW_DISABLED=1
34+
```

tests/partitioning_test.py

Lines changed: 93 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,21 @@
1212
import os
1313

1414

15+
def if_fdw_enabled(func):
16+
"""To run tests with FDW support set environment variable TEST_FDW=1"""
17+
def wrapper(*args, **kwargs):
18+
if os.environ.get('FDW_DISABLED') != '1':
19+
func(*args, **kwargs)
20+
else:
21+
print('Warning: FDW features tests are disabled, skipping...')
22+
return wrapper
23+
24+
1525
class PartitioningTests(unittest.TestCase):
1626

1727
def setUp(self):
1828
self.setup_cmd = [
19-
'create extension pg_pathman',
29+
# 'create extension pg_pathman',
2030
'create table abc(id serial, t text)',
2131
'insert into abc select generate_series(1, 300000)',
2232
'select create_hash_partitions(\'abc\', \'id\', 3, partition_data := false)',
@@ -26,6 +36,16 @@ def tearDown(self):
2636
stop_all()
2737
# clean_all()
2838

39+
def start_new_pathman_cluster(self, name='test', allows_streaming=False):
40+
node = get_new_node(name)
41+
node.init(allows_streaming=allows_streaming)
42+
node.append_conf(
43+
'postgresql.conf',
44+
'shared_preload_libraries=\'pg_pathman\'\n')
45+
node.start()
46+
node.psql('postgres', 'create extension pg_pathman')
47+
return node
48+
2949
def init_test_data(self, node):
3050
"""Initialize pg_pathman extension and test data"""
3151
for cmd in self.setup_cmd:
@@ -42,17 +62,12 @@ def catchup_replica(self, master, replica):
4262
def printlog(self, logfile):
4363
with open(logfile, 'r') as log:
4464
for line in log.readlines():
45-
print line
65+
print(line)
4666

4767
def test_concurrent(self):
4868
"""Tests concurrent partitioning"""
49-
node = get_new_node('test')
5069
try:
51-
node.init()
52-
node.append_conf(
53-
'postgresql.conf',
54-
'shared_preload_libraries=\'pg_pathman\'\n')
55-
node.start()
70+
node = self.start_new_pathman_cluster()
5671
self.init_test_data(node)
5772

5873
node.psql(
@@ -95,11 +110,7 @@ def test_replication(self):
95110

96111
try:
97112
# initialize master server
98-
node.init(allows_streaming=True)
99-
node.append_conf(
100-
'postgresql.conf',
101-
'shared_preload_libraries=\'pg_pathman\'\n')
102-
node.start()
113+
node = self.start_new_pathman_cluster(allows_streaming=True)
103114
node.backup('my_backup')
104115

105116
# initialize replica from backup
@@ -238,8 +249,8 @@ def add_partition(node, flag, query):
238249
con.commit()
239250

240251
# Now wait until each thread finishes
241-
for i in range(3):
242-
threads[i].join()
252+
for thread in threads:
253+
thread.join()
243254

244255
# Check flags, it should be true which means that threads are
245256
# finished
@@ -277,11 +288,11 @@ def check_tablespace(node, tablename, tablespace):
277288
'postgresql.conf',
278289
'shared_preload_libraries=\'pg_pathman\'\n')
279290
node.start()
280-
path = os.path.join(node.data_dir, 'test_space_location')
281-
os.mkdir(path)
282291
node.psql('postgres', 'create extension pg_pathman')
283292

284293
# create tablespace
294+
path = os.path.join(node.data_dir, 'test_space_location')
295+
os.mkdir(path)
285296
node.psql(
286297
'postgres',
287298
'create tablespace test_space location \'{}\''.format(path))
@@ -330,6 +341,71 @@ def check_tablespace(node, tablename, tablespace):
330341
self.assertTrue(check_tablespace(node, 'abc_prepended_2', 'pg_default'))
331342
self.assertTrue(check_tablespace(node, 'abc_added_2', 'pg_default'))
332343

344+
@if_fdw_enabled
345+
def test_foreign_table(self):
346+
"""Test foreign tables"""
347+
348+
# Start master server
349+
master = get_new_node('test')
350+
master.init()
351+
master.append_conf(
352+
'postgresql.conf',
353+
'shared_preload_libraries=\'pg_pathman, postgres_fdw\'\n')
354+
master.start()
355+
master.psql('postgres', 'create extension pg_pathman')
356+
master.psql('postgres', 'create extension postgres_fdw')
357+
master.psql(
358+
'postgres',
359+
'''create table abc(id serial, name text);
360+
select create_range_partitions('abc', 'id', 0, 10, 2)''')
361+
362+
# Current user name (needed for user mapping)
363+
username = master.execute('postgres', 'select current_user')[0][0]
364+
365+
# Start foreign server
366+
fserv = get_new_node('fserv')
367+
fserv.init().start()
368+
fserv.safe_psql('postgres', 'create table ftable(id serial, name text)')
369+
fserv.safe_psql('postgres', 'insert into ftable values (25, \'foreign\')')
370+
371+
# Create foreign table and attach it to partitioned table
372+
master.safe_psql(
373+
'postgres',
374+
'''create server fserv
375+
foreign data wrapper postgres_fdw
376+
options (dbname 'postgres', host '127.0.0.1', port '{}')'''.format(fserv.port)
377+
)
378+
master.safe_psql(
379+
'postgres',
380+
'''create user mapping for {0}
381+
server fserv
382+
options (user '{0}')'''.format(username)
383+
)
384+
master.safe_psql(
385+
'postgres',
386+
'''import foreign schema public limit to (ftable)
387+
from server fserv into public'''
388+
)
389+
master.safe_psql(
390+
'postgres',
391+
'select attach_range_partition(\'abc\', \'ftable\', 20, 30)')
392+
393+
# Check that table attached to partitioned table
394+
self.assertEqual(
395+
master.safe_psql('postgres', 'select * from ftable'),
396+
'25|foreign\n'
397+
)
398+
399+
# Check that we can successfully insert new data into foreign partition
400+
master.safe_psql('postgres', 'insert into abc values (26, \'part\')')
401+
self.assertEqual(
402+
master.safe_psql('postgres', 'select * from ftable order by id'),
403+
'25|foreign\n26|part\n'
404+
)
405+
406+
# Testing drop partitions (including foreign partitions)
407+
master.safe_psql('postgres', 'select drop_partitions(\'abc\')')
408+
333409

334410
if __name__ == "__main__":
335411
unittest.main()

0 commit comments

Comments
 (0)