Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitaf70495

Browse files
committed
Merge branch 'fdw' into rel_1_1_beta
2 parents44d88c6 +bb05f9d commitaf70495

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_rowsINTEGER;
515515
v_part_countINTEGER :=0;
516516
conf_num_delINTEGER;
517+
v_relkindCHAR;
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
importos
1313

1414

15+
defif_fdw_enabled(func):
16+
"""To run tests with FDW support set environment variable TEST_FDW=1"""
17+
defwrapper(*args,**kwargs):
18+
ifos.environ.get('FDW_DISABLED')!='1':
19+
func(*args,**kwargs)
20+
else:
21+
print('Warning: FDW features tests are disabled, skipping...')
22+
returnwrapper
23+
24+
1525
classPartitioningTests(unittest.TestCase):
1626

1727
defsetUp(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+
defstart_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+
returnnode
48+
2949
definit_test_data(self,node):
3050
"""Initialize pg_pathman extension and test data"""
3151
forcmdinself.setup_cmd:
@@ -42,17 +62,12 @@ def catchup_replica(self, master, replica):
4262
defprintlog(self,logfile):
4363
withopen(logfile,'r')aslog:
4464
forlineinlog.readlines():
45-
printline
65+
print(line)
4666

4767
deftest_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-
foriinrange(3):
242-
threads[i].join()
252+
forthreadinthreads:
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+
deftest_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)

[8]ページ先頭

©2009-2025 Movatter.jp