Skip to content

Commit f330f14

Browse files
committed
Clean up partitioning support
- improve and simplify the metadata queries - rework the regression tests - Fix whitespace
1 parent b42eb6f commit f330f14

File tree

7 files changed

+249
-245
lines changed

7 files changed

+249
-245
lines changed

README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,16 @@ This is used to clean up after you have finished migrating from Oracle.
346346
- `pgstage_schema` (default `pgsql_stage`): The name of the PostgreSQL stage
347347
created by `oracle_migrate_prepare`
348348

349+
Limitations
350+
===========
351+
352+
Not all Oracle partitioning options are supported by `ora_migrator`.
353+
Only list, hash and range partitioning are supported in PostgreSQL, so other
354+
partitioning strategies are not supported. Also, list and range
355+
partitioning with a partitioning key with two or more columns is not
356+
supported. When `ora_migrator` encounters a partitioning schema that it
357+
cannot migrate, it will migrate the table to an unpartitioned table.
358+
349359
Replication
350360
===========
351361

expected/migrate.out

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,6 @@
77
* environment and the Oracle library directory is in the
88
* library path.
99
*/
10-
SET client_min_messages = WARNING;
11-
/* create a user to perform the migration */
12-
DROP ROLE IF EXISTS migrator;
13-
CREATE ROLE migrator LOGIN;
14-
/* triggers shouldn't run during replication */
15-
ALTER ROLE migrator SET session_replication_role = replica;
16-
/* create all requisite extensions */
17-
CREATE EXTENSION oracle_fdw;
18-
CREATE EXTENSION db_migrator;
19-
CREATE EXTENSION ora_migrator;
20-
/* create a foreign server and a user mapping */
21-
CREATE SERVER oracle FOREIGN DATA WRAPPER oracle_fdw
22-
OPTIONS (dbserver '');
23-
CREATE USER MAPPING FOR PUBLIC SERVER oracle
24-
OPTIONS (user 'testschema1', password 'good_password');
25-
/* give the user the required permissions */
26-
GRANT CREATE ON DATABASE contrib_regression TO migrator;
27-
GRANT USAGE ON FOREIGN SERVER oracle TO migrator;
2810
/* connect as migration user */
2911
\connect - migrator
3012
SET client_min_messages = WARNING;

expected/partitioning.out

Lines changed: 69 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
/* for requirements, see "migrate.sql" */
12
/* connect as migration user */
23
\connect - migrator
34
SET client_min_messages = WARNING;
@@ -14,7 +15,7 @@ SELECT db_migrate_prepare(
1415
0
1516
(1 row)
1617

17-
/* perform the data migration */
18+
/* create foreign tables */
1819
SELECT db_migrate_mkforeign(
1920
plugin => 'ora_migrator',
2021
server => 'oracle',
@@ -25,7 +26,7 @@ SELECT db_migrate_mkforeign(
2526
0
2627
(1 row)
2728

28-
/* migrate the rest of the database */
29+
/* migrate the data */
2930
SELECT db_migrate_tables(
3031
plugin => 'ora_migrator'
3132
);
@@ -34,14 +35,16 @@ SELECT db_migrate_tables(
3435
0
3536
(1 row)
3637

37-
/* we have to check the log table before we drop the schema */
38-
SELECT operation, schema_name, object_name, failed_sql, error_message
39-
FROM pgsql_stage.migrate_log
40-
ORDER BY log_time;
41-
operation | schema_name | object_name | failed_sql | error_message
42-
-----------+-------------+-------------+------------+---------------
43-
(0 rows)
38+
/* migrate the constraints */
39+
SELECT db_migrate_constraints(
40+
plugin => 'ora_migrator'
41+
);
42+
db_migrate_constraints
43+
------------------------
44+
0
45+
(1 row)
4446

47+
/* clean up */
4548
SELECT db_migrate_finish();
4649
db_migrate_finish
4750
-------------------
@@ -53,98 +56,75 @@ SELECT db_migrate_finish();
5356
Partitioned table "testschema3.part1"
5457
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
5558
--------+------------------------+-----------+----------+---------+----------+--------------+-------------
56-
c1 | numeric | | | | main | |
57-
c2 | character varying(100) | | | | extended | |
59+
c1 | integer | | not null | | plain | |
60+
c2 | character varying(100) | | not null | | extended | |
5861
Partition key: LIST (c1)
59-
Partitions: testschema3.part1_a FOR VALUES IN ('1', '2', '3'),
60-
testschema3.part1_b FOR VALUES IN ('4', '5'),
62+
Partitions: testschema3.part1_a FOR VALUES IN (1, 2, 3),
63+
testschema3.part1_b FOR VALUES IN (4, 5),
6164
testschema3.part1_default DEFAULT
6265

6366
\d+ testschema3.part2
64-
Partitioned table "testschema3.part2"
65-
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
66-
--------+------------------------+-----------+----------+---------+----------+--------------+-------------
67-
c1 | numeric | | | | main | |
68-
c2 | character varying(100) | | | | extended | |
69-
Partition key: RANGE (c1)
70-
Partitions: testschema3.part2_a FOR VALUES FROM (MINVALUE) TO ('0'),
71-
testschema3.part2_b FOR VALUES FROM ('0') TO ('100'),
72-
testschema3.part2_c FOR VALUES FROM ('100') TO (MAXVALUE)
73-
74-
\d testschema3.part3
75-
Partitioned table "testschema3.part3"
76-
Column | Type | Collation | Nullable | Default
77-
--------+------------------------+-----------+----------+---------
78-
c1 | numeric | | |
79-
c2 | character varying(100) | | |
80-
Partition key: HASH (c1)
81-
Number of partitions: 3 (Use \d+ to list them.)
82-
83-
\d+ testschema3.part4
84-
Partitioned table "testschema3.part4"
85-
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
86-
--------+--------------------------------+-----------+----------+---------+----------+--------------+-------------
87-
c1 | character(1) | | | | extended | |
88-
c2 | timestamp(0) without time zone | | | | plain | |
89-
Partition key: LIST (c1)
90-
Partitions: testschema3.part4_a FOR VALUES IN ('A'), PARTITIONED,
91-
testschema3.part4_b FOR VALUES IN ('B'), PARTITIONED
92-
93-
\d+ testschema3.part4_a
94-
Partitioned table "testschema3.part4_a"
67+
Partitioned table "testschema3.part2"
9568
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
9669
--------+--------------------------------+-----------+----------+---------+----------+--------------+-------------
97-
c1 | character(1) | | | | extended | |
98-
c2 | timestamp(0) without time zone | | | | plain | |
99-
Partition of: testschema3.part4 FOR VALUES IN ('A')
100-
Partition constraint: ((c1 IS NOT NULL) AND (c1 = 'A'::character(1)))
101-
Partition key: RANGE (c2)
102-
Partitions: testschema3.part4_a_2020 FOR VALUES FROM (MINVALUE) TO ('2021-01-01 00:00:00'),
103-
testschema3.part4_a_2021 FOR VALUES FROM ('2021-01-01 00:00:00') TO ('2022-01-01 00:00:00'),
104-
testschema3.part4_a_2022 FOR VALUES FROM ('2022-01-01 00:00:00') TO ('2023-01-01 00:00:00')
70+
r1 | integer | | not null | | plain | |
71+
h1 | character varying(100) | | not null | | extended | |
72+
h2 | timestamp(6) without time zone | | not null | | plain | |
73+
Partition key: RANGE (r1)
74+
Partitions: testschema3.part2_a FOR VALUES FROM (MINVALUE) TO (10), PARTITIONED,
75+
testschema3.part2_b FOR VALUES FROM (10) TO (100), PARTITIONED,
76+
testschema3.part2_c FOR VALUES FROM (100) TO (MAXVALUE), PARTITIONED
10577

106-
\d+ testschema3.part4_b
107-
Partitioned table "testschema3.part4_b"
108-
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
109-
--------+--------------------------------+-----------+----------+---------+----------+--------------+-------------
110-
c1 | character(1) | | | | extended | |
111-
c2 | timestamp(0) without time zone | | | | plain | |
112-
Partition of: testschema3.part4 FOR VALUES IN ('B')
113-
Partition constraint: ((c1 IS NOT NULL) AND (c1 = 'B'::character(1)))
114-
Partition key: RANGE (c2)
115-
Partitions: testschema3.part4_b_2020 FOR VALUES FROM (MINVALUE) TO ('2021-01-01 00:00:00'),
116-
testschema3.part4_b_2021 FOR VALUES FROM ('2021-01-01 00:00:00') TO ('2022-01-01 00:00:00'),
117-
testschema3.part4_b_2022 FOR VALUES FROM ('2022-01-01 00:00:00') TO ('2023-01-01 00:00:00')
78+
\d+ testschema3.part3
79+
Partitioned table "testschema3.part3"
80+
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
81+
--------+------------------------+-----------+----------+---------+----------+--------------+-------------
82+
c1 | integer | | | | plain | |
83+
c2 | character varying(100) | | | | extended | |
84+
Partition key: HASH (c2)
85+
Partitions: testschema3.part3_a FOR VALUES WITH (modulus 3, remainder 0), PARTITIONED,
86+
testschema3.part3_b FOR VALUES WITH (modulus 3, remainder 1), PARTITIONED,
87+
testschema3.part3_c FOR VALUES WITH (modulus 3, remainder 2), PARTITIONED
11888

11989
SELECT tableoid::regclass partname, * FROM testschema3.part1;
120-
partname | c1 | c2
121-
---------------------------+----+----
122-
testschema3.part1_a | 1 |
123-
testschema3.part1_b | 5 |
124-
testschema3.part1_default | 10 |
90+
partname | c1 | c2
91+
---------------------------+----+------
92+
testschema3.part1_a | 1 | one
93+
testschema3.part1_b | 5 | five
94+
testschema3.part1_default | 10 | ten
12595
(3 rows)
12696

12797
SELECT tableoid::regclass partname, * FROM testschema3.part2;
128-
partname | c1 | c2
129-
---------------------+-----+----
130-
testschema3.part2_a | -1 |
131-
testschema3.part2_b | 99 |
132-
testschema3.part2_c | 100 |
133-
(3 rows)
98+
partname | r1 | h1 | h2
99+
-----------------------+-----+-----------+---------------------
100+
testschema3.part2_a_2 | 1 | other | 2023-01-01 23:00:00
101+
testschema3.part2_a_2 | 1 | something | 2023-01-01 13:00:00
102+
testschema3.part2_b_2 | 50 | other | 2023-01-01 23:00:00
103+
testschema3.part2_b_2 | 50 | something | 2023-01-01 13:00:00
104+
testschema3.part2_c_2 | 500 | other | 2023-01-01 23:00:00
105+
testschema3.part2_c_2 | 500 | something | 2023-01-01 13:00:00
106+
(6 rows)
134107

135108
SELECT tableoid::regclass partname, * FROM testschema3.part3;
136-
partname | c1 | c2
137-
----------+----+----
138-
(0 rows)
139-
140-
SELECT tableoid::regclass partname, * FROM testschema3.part4;
141-
partname | c1 | c2
142-
--------------------------+----+---------------------
143-
testschema3.part4_a_2020 | A | 2020-12-31 00:00:00
144-
testschema3.part4_a_2021 | A | 2021-12-31 00:00:00
145-
testschema3.part4_a_2022 | A | 2022-12-31 00:00:00
146-
testschema3.part4_b_2020 | B | 2020-12-31 00:00:00
147-
testschema3.part4_b_2021 | B | 2021-12-31 00:00:00
148-
testschema3.part4_b_2022 | B | 2022-12-31 00:00:00
149-
(6 rows)
109+
partname | c1 | c2
110+
-----------------------+----+----
111+
testschema3.part3_a_1 | 1 | b
112+
testschema3.part3_a_1 | 1 | d
113+
testschema3.part3_a_1 | 1 | e
114+
testschema3.part3_a_1 | 1 | f
115+
testschema3.part3_a_2 | 5 | b
116+
testschema3.part3_a_2 | 5 | d
117+
testschema3.part3_a_2 | 5 | e
118+
testschema3.part3_a_2 | 5 | f
119+
testschema3.part3_a_3 | 9 | b
120+
testschema3.part3_a_3 | 9 | d
121+
testschema3.part3_a_3 | 9 | e
122+
testschema3.part3_a_3 | 9 | f
123+
testschema3.part3_c_1 | 1 | c
124+
testschema3.part3_c_1 | 1 | a
125+
testschema3.part3_c_2 | 5 | c
126+
testschema3.part3_c_2 | 5 | a
127+
testschema3.part3_c_3 | 9 | c
128+
testschema3.part3_c_3 | 9 | a
129+
(18 rows)
150130

0 commit comments

Comments
 (0)