Skip to content

Commit adf5fd7

Browse files
committed
Start working on update checking script
1 parent d739585 commit adf5fd7

File tree

1 file changed

+253
-0
lines changed

1 file changed

+253
-0
lines changed

tests/update/check_update.py

Lines changed: 253 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,253 @@
1+
#!/usr/bin/env python
2+
#coding: utf-8
3+
4+
import os
5+
import contextlib
6+
import sys
7+
import argparse
8+
import testgres
9+
import subprocess
10+
import difflib
11+
12+
repo_dir = os.path.abspath(os.path.join('../..', os.path.dirname(__file__)))
13+
14+
compilation = '''
15+
make USE_PGXS=1 clean
16+
make USE_PGXS=1 install
17+
'''
18+
19+
# just bunch of tables to create
20+
run_sql = '''
21+
CREATE EXTENSION pg_pathman;
22+
23+
CREATE TABLE hash_rel (
24+
id SERIAL PRIMARY KEY,
25+
value INTEGER NOT NULL);
26+
INSERT INTO hash_rel VALUES (1, 1);
27+
INSERT INTO hash_rel VALUES (2, 2);
28+
INSERT INTO hash_rel VALUES (3, 3);
29+
30+
SELECT create_hash_partitions('hash_rel', 'Value', 3);
31+
32+
CREATE TABLE range_rel (
33+
id SERIAL PRIMARY KEY,
34+
dt TIMESTAMP,
35+
txt TEXT);
36+
CREATE INDEX ON range_rel (dt);
37+
INSERT INTO range_rel (dt, txt)
38+
SELECT g, md5(g::TEXT) FROM generate_series('2015-01-01', '2015-04-30', '1 day'::interval) as g;
39+
SELECT create_range_partitions('range_rel', 'DT', '2015-01-01'::DATE, '1 month'::INTERVAL);
40+
41+
CREATE TABLE num_range_rel (
42+
id SERIAL PRIMARY KEY,
43+
txt TEXT);
44+
SELECT create_range_partitions('num_range_rel', 'id', 0, 1000, 4);
45+
INSERT INTO num_range_rel
46+
SELECT g, md5(g::TEXT) FROM generate_series(1, 3000) as g;
47+
48+
CREATE TABLE improved_dummy_test1 (id BIGSERIAL, name TEXT NOT NULL);
49+
INSERT INTO improved_dummy_test1 (name) SELECT md5(g::TEXT) FROM generate_series(1, 100) as g;
50+
SELECT create_range_partitions('improved_dummy_test1', 'id', 1, 10);
51+
INSERT INTO improved_dummy_test1 (name) VALUES ('test'); /* spawns new partition */
52+
ALTER TABLE improved_dummy_1 ADD CHECK (name != 'ib'); /* make improved_dummy_1 disappear */
53+
54+
CREATE TABLE test_improved_dummy_test2 (val INT NOT NULL);
55+
SELECT create_range_partitions('test_improved_dummy_test2', 'val',
56+
generate_range_bounds(1, 1, 2),
57+
partition_names := '{p1, p2}');
58+
59+
CREATE TABLE insert_into_select(val int NOT NULL);
60+
INSERT INTO insert_into_select SELECT generate_series(1, 100);
61+
SELECT create_range_partitions('insert_into_select', 'val', 1, 20);
62+
CREATE TABLE insert_into_select_copy (LIKE insert_into_select); /* INSERT INTO ... SELECT ... */
63+
64+
# just a lot of actions
65+
66+
SELECT split_range_partition('num_range_rel_1', 500);
67+
SELECT split_range_partition('range_rel_1', '2015-01-15'::DATE);
68+
69+
/* Merge two partitions into one */
70+
SELECT merge_range_partitions('num_range_rel_1', 'num_range_rel_' || currval('num_range_rel_seq'));
71+
SELECT merge_range_partitions('range_rel_1', 'range_rel_' || currval('range_rel_seq'));
72+
73+
/* Append and prepend partitions */
74+
SELECT append_range_partition('num_range_rel');
75+
SELECT prepend_range_partition('num_range_rel');
76+
SELECT drop_range_partition('num_range_rel_7');
77+
78+
SELECT drop_range_partition_expand_next('num_range_rel_4');
79+
SELECT drop_range_partition_expand_next('num_range_rel_6');
80+
81+
SELECT append_range_partition('range_rel');
82+
SELECT prepend_range_partition('range_rel');
83+
SELECT drop_range_partition('range_rel_7');
84+
SELECT add_range_partition('range_rel', '2014-12-01'::DATE, '2015-01-02'::DATE);
85+
SELECT add_range_partition('range_rel', '2014-12-01'::DATE, '2015-01-01'::DATE);
86+
87+
CREATE TABLE range_rel_archive (LIKE range_rel INCLUDING ALL);
88+
SELECT attach_range_partition('range_rel', 'range_rel_archive', '2014-01-01'::DATE, '2015-01-01'::DATE);
89+
SELECT attach_range_partition('range_rel', 'range_rel_archive', '2014-01-01'::DATE, '2014-12-01'::DATE);
90+
SELECT detach_range_partition('range_rel_archive');
91+
92+
CREATE TABLE range_rel_test1 (
93+
id SERIAL PRIMARY KEY,
94+
dt TIMESTAMP,
95+
txt TEXT,
96+
abc INTEGER);
97+
SELECT attach_range_partition('range_rel', 'range_rel_test1', '2013-01-01'::DATE, '2014-01-01'::DATE);
98+
CREATE TABLE range_rel_test2 (
99+
id SERIAL PRIMARY KEY,
100+
dt TIMESTAMP);
101+
SELECT attach_range_partition('range_rel', 'range_rel_test2', '2013-01-01'::DATE, '2014-01-01'::DATE);
102+
103+
/* Half open ranges */
104+
SELECT add_range_partition('range_rel', NULL, '2014-12-01'::DATE, 'range_rel_minus_infinity');
105+
SELECT add_range_partition('range_rel', '2015-06-01'::DATE, NULL, 'range_rel_plus_infinity');
106+
SELECT append_range_partition('range_rel');
107+
SELECT prepend_range_partition('range_rel');
108+
109+
CREATE TABLE range_rel_minus_infinity (LIKE range_rel INCLUDING ALL);
110+
SELECT attach_range_partition('range_rel', 'range_rel_minus_infinity', NULL, '2014-12-01'::DATE);
111+
INSERT INTO range_rel (dt) VALUES ('2012-06-15');
112+
INSERT INTO range_rel (dt) VALUES ('2015-12-15');
113+
114+
CREATE TABLE zero(
115+
id SERIAL PRIMARY KEY,
116+
value INT NOT NULL);
117+
INSERT INTO zero SELECT g, g FROM generate_series(1, 100) as g;
118+
SELECT create_range_partitions('zero', 'value', 50, 10, 0);
119+
SELECT append_range_partition('zero', 'zero_0');
120+
SELECT prepend_range_partition('zero', 'zero_1');
121+
SELECT add_range_partition('zero', 50, 70, 'zero_50');
122+
SELECT append_range_partition('zero', 'zero_appended');
123+
SELECT prepend_range_partition('zero', 'zero_prepended');
124+
SELECT split_range_partition('zero_50', 60, 'zero_60');
125+
126+
CREATE TABLE hash_rel_extern (LIKE hash_rel INCLUDING ALL);
127+
SELECT replace_hash_partition('hash_rel_0', 'hash_rel_extern');
128+
129+
-- automatic partitions creation
130+
CREATE TABLE range_rel_test1 (
131+
id SERIAL PRIMARY KEY,
132+
dt TIMESTAMP NOT NULL,
133+
data TEXT);
134+
SELECT create_range_partitions('range_rel_test1', 'dt', '2015-01-01'::DATE, '10 days'::INTERVAL, 1);
135+
INSERT INTO range_rel_test1 (dt)
136+
SELECT generate_series('2015-01-01', '2015-04-30', '1 day'::interval);
137+
138+
INSERT INTO range_rel_test1 (dt)
139+
SELECT generate_series('2014-12-31', '2014-12-01', '-1 day'::interval);
140+
141+
/* CaMeL cAsE table names and attributes */
142+
CREATE TABLE "TeSt" (a INT NOT NULL, b INT);
143+
SELECT create_hash_partitions('TeSt', 'a', 3);
144+
SELECT create_hash_partitions('"TeSt"', 'a', 3);
145+
INSERT INTO "TeSt" VALUES (1, 1);
146+
INSERT INTO "TeSt" VALUES (2, 2);
147+
INSERT INTO "TeSt" VALUES (3, 3);
148+
149+
CREATE TABLE "RangeRel" (
150+
id SERIAL PRIMARY KEY,
151+
dt TIMESTAMP NOT NULL,
152+
txt TEXT);
153+
INSERT INTO "RangeRel" (dt, txt)
154+
SELECT g, md5(g::TEXT) FROM generate_series('2015-01-01', '2015-01-03', '1 day'::interval) as g;
155+
SELECT create_range_partitions('"RangeRel"', 'dt', '2015-01-01'::DATE, '1 day'::INTERVAL);
156+
SELECT append_range_partition('"RangeRel"');
157+
SELECT prepend_range_partition('"RangeRel"');
158+
SELECT merge_range_partitions('"RangeRel_1"', '"RangeRel_' || currval('"RangeRel_seq"') || '"');
159+
SELECT split_range_partition('"RangeRel_1"', '2015-01-01'::DATE);
160+
161+
CREATE TABLE hash_rel_next1 (
162+
id SERIAL PRIMARY KEY,
163+
value INTEGER NOT NULL);
164+
INSERT INTO hash_rel_next1 (value) SELECT g FROM generate_series(1, 10000) as g;
165+
SELECT create_hash_partitions('hash_rel_next1', 'value', 3);
166+
167+
CREATE TABLE range_rel_next1 (
168+
id SERIAL PRIMARY KEY,
169+
dt TIMESTAMP NOT NULL,
170+
value INTEGER);
171+
INSERT INTO range_rel_next1 (dt, value) SELECT g, extract(day from g) FROM generate_series('2010-01-01'::date, '2010-12-31'::date, '1 day') as g;
172+
SELECT create_range_partitions('range_rel_next1', 'dt', '2010-01-01'::date, '1 month'::interval, 12);
173+
SELECT merge_range_partitions('range_rel_1', 'range_rel_2');
174+
SELECT split_range_partition('range_rel_1', '2010-02-15'::date);
175+
SELECT append_range_partition('range_rel_next1');
176+
SELECT prepend_range_partition('range_rel_next1');
177+
'''
178+
179+
@contextlib.contextmanager
180+
def cwd(path):
181+
print("cwd: ", path)
182+
curdir = os.getcwd()
183+
os.chdir(path)
184+
185+
try:
186+
yield
187+
finally:
188+
print("cwd:", curdir)
189+
os.chdir(curdir)
190+
191+
dump1_file = '/tmp/dump1.sql'
192+
dump2_file = '/tmp/dump2.sql'
193+
194+
if __name__ == '__main__':
195+
parser = argparse.ArgumentParser(description='pg_pathman update checker')
196+
parser.add_argument('branches', nargs=2,
197+
help='specify branches ("main rel_1.5")')
198+
199+
args = parser.parse_args()
200+
201+
with open('dump_pathman_objects.sql') as f:
202+
dump_sql = f.read()
203+
204+
with cwd(repo_dir):
205+
subprocess.check_output("git checkout %s" % args.branches[0], shell=True)
206+
subprocess.check_output(compilation, shell=True)
207+
208+
with testgres.get_new_node('updated') as node:
209+
node.init()
210+
node.append_conf("shared_preload_libraries='pg_pathman'\n")
211+
212+
node.start()
213+
node.safe_psql('postgres', run_sql)
214+
node.dump(dump1_file, 'postgres')
215+
node.stop()
216+
217+
subprocess.check_output("git checkout %s" % args.branches[1], shell=True)
218+
subprocess.check_output(compilation, shell=True)
219+
220+
version = None
221+
with open('pg_pathman.control') as f:
222+
for line in f.readlines():
223+
if line.startswith('default_version'):
224+
version = line.split('=').strip()
225+
226+
if version is None:
227+
print("cound not find version in second branch")
228+
exit(1)
229+
230+
node.start()
231+
node.safe_psql("postgres", "alter extension pg_pathman update to %s" % version)
232+
dumped_objects_old = node.safe_psql("postgres", dump_sql)
233+
node.stop()
234+
235+
# now make clean install
236+
with testgres.get_new_node('from_scratch') as node:
237+
node.init()
238+
node.append_conf("shared_preload_libraries='pg_pathman'\n")
239+
node.start()
240+
node.safe_psql('postgres', run_sql)
241+
dumped_objects_new = node.safe_psql("postgres", dump_sql)
242+
node.dump(dump2_file, 'postgres')
243+
244+
# check dumps
245+
node.safe_psql('postgres', 'create database d1')
246+
node.restore(dump1_file, 'd1')
247+
248+
node.safe_psql('postgres', 'create database d2')
249+
node.restore(dump2_file, 'd2')
250+
node.stop()
251+
252+
if dumped_objects != dumped_objects_new:
253+
pass

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy