Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e92fee7

Browse files
authored
Pass proper old rlocator to smgr when creating relations and indexes (#156)
1 parent 3bf4f5c commit e92fee7

File tree

11 files changed

+241
-13
lines changed

11 files changed

+241
-13
lines changed

contrib/pg_tde/Makefile

+2-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ alter_index_basic \
2525
merge_join_basic \
2626
tablespace_basic \
2727
relocate \
28-
version
28+
version \
29+
recreate_storage
2930
TAP_TESTS = 1
3031

3132
OBJS = src/encryption/enc_tde.o \
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
CREATE EXTENSION IF NOT EXISTS pg_tde;
2+
SELECT pg_tde_add_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per');
3+
pg_tde_add_key_provider_file
4+
------------------------------
5+
1
6+
(1 row)
7+
8+
SELECT pg_tde_set_principal_key('test-db-principal-key','file-vault');
9+
pg_tde_set_principal_key
10+
--------------------------
11+
t
12+
(1 row)
13+
14+
SET default_table_access_method = "tde_heap";
15+
CREATE TABLE t1(n integer);
16+
SELECT pg_tde_is_encrypted('t1');
17+
pg_tde_is_encrypted
18+
---------------------
19+
t
20+
(1 row)
21+
22+
VACUUM FULL t1;
23+
SELECT pg_tde_is_encrypted('t1');
24+
pg_tde_is_encrypted
25+
---------------------
26+
t
27+
(1 row)
28+
29+
CREATE TABLE test_tab1 AS SELECT generate_series(1,10) a;
30+
CREATE INDEX test_idx1 ON test_tab1(a);
31+
SELECT pg_tde_is_encrypted('test_tab1');
32+
pg_tde_is_encrypted
33+
---------------------
34+
t
35+
(1 row)
36+
37+
SELECT pg_tde_is_encrypted('test_idx1');
38+
pg_tde_is_encrypted
39+
---------------------
40+
t
41+
(1 row)
42+
43+
REINDEX index CONCURRENTLY test_idx1;
44+
SELECT pg_tde_is_encrypted('test_tab1');
45+
pg_tde_is_encrypted
46+
---------------------
47+
t
48+
(1 row)
49+
50+
SELECT pg_tde_is_encrypted('test_idx1');
51+
pg_tde_is_encrypted
52+
---------------------
53+
t
54+
(1 row)
55+
56+
CREATE TABLE mvtest_t (id int NOT NULL PRIMARY KEY, type text NOT NULL, amt numeric NOT NULL);
57+
INSERT INTO mvtest_t VALUES
58+
(1, 'x', 2),
59+
(2, 'x', 3),
60+
(3, 'y', 5),
61+
(4, 'y', 7),
62+
(5, 'z', 11);
63+
CREATE MATERIALIZED VIEW mvtest_tm AS SELECT type, sum(amt) AS totamt FROM mvtest_t GROUP BY type WITH NO DATA;
64+
SELECT pg_tde_is_encrypted('mvtest_tm');
65+
pg_tde_is_encrypted
66+
---------------------
67+
t
68+
(1 row)
69+
70+
REFRESH MATERIALIZED VIEW mvtest_tm;
71+
SELECT pg_tde_is_encrypted('mvtest_tm');
72+
pg_tde_is_encrypted
73+
---------------------
74+
t
75+
(1 row)
76+
77+
CREATE TYPE rewritetype AS (a int);
78+
CREATE TABLE rewritemetoo1 OF rewritetype;
79+
CREATE TABLE rewritemetoo2 OF rewritetype;
80+
SELECT pg_tde_is_encrypted('rewritemetoo1');
81+
pg_tde_is_encrypted
82+
---------------------
83+
t
84+
(1 row)
85+
86+
SELECT pg_tde_is_encrypted('rewritemetoo2');
87+
pg_tde_is_encrypted
88+
---------------------
89+
t
90+
(1 row)
91+
92+
ALTER TYPE rewritetype ALTER ATTRIBUTE a TYPE text cascade;
93+
SELECT pg_tde_is_encrypted('rewritemetoo1');
94+
pg_tde_is_encrypted
95+
---------------------
96+
t
97+
(1 row)
98+
99+
SELECT pg_tde_is_encrypted('rewritemetoo2');
100+
pg_tde_is_encrypted
101+
---------------------
102+
t
103+
(1 row)
104+
105+
CREATE TABLE encrypted_table (
106+
id SERIAL,
107+
data TEXT,
108+
created_at DATE NOT NULL,
109+
PRIMARY KEY (id, created_at)
110+
) USING tde_heap;
111+
CREATE INDEX idx_date ON encrypted_table (created_at);
112+
SELECT pg_tde_is_encrypted('encrypted_table');
113+
pg_tde_is_encrypted
114+
---------------------
115+
t
116+
(1 row)
117+
118+
CLUSTER encrypted_table USING idx_date;
119+
SELECT pg_tde_is_encrypted('encrypted_table');
120+
pg_tde_is_encrypted
121+
---------------------
122+
t
123+
(1 row)
124+
125+
DROP EXTENSION pg_tde CASCADE;
126+
NOTICE: drop cascades to 7 other objects
127+
DETAIL: drop cascades to table t1
128+
drop cascades to table test_tab1
129+
drop cascades to table mvtest_t
130+
drop cascades to materialized view mvtest_tm
131+
drop cascades to table rewritemetoo1
132+
drop cascades to table rewritemetoo2
133+
drop cascades to table encrypted_table
134+
RESET default_table_access_method;

contrib/pg_tde/meson.build

+1
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ sql_tests = [
108108
'update_basic',
109109
'key_provider',
110110
'relocate',
111+
'recreate_storage',
111112
]
112113

113114
tap_tests = [
+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
CREATE EXTENSION IF NOT EXISTS pg_tde;
2+
3+
SELECT pg_tde_add_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per');
4+
SELECT pg_tde_set_principal_key('test-db-principal-key','file-vault');
5+
6+
SET default_table_access_method = "tde_heap";
7+
8+
CREATE TABLE t1(n integer);
9+
SELECT pg_tde_is_encrypted('t1');
10+
VACUUM FULL t1;
11+
SELECT pg_tde_is_encrypted('t1');
12+
13+
CREATE TABLE test_tab1 AS SELECT generate_series(1,10) a;
14+
CREATE INDEX test_idx1 ON test_tab1(a);
15+
SELECT pg_tde_is_encrypted('test_tab1');
16+
SELECT pg_tde_is_encrypted('test_idx1');
17+
REINDEX index CONCURRENTLY test_idx1;
18+
SELECT pg_tde_is_encrypted('test_tab1');
19+
SELECT pg_tde_is_encrypted('test_idx1');
20+
21+
CREATE TABLE mvtest_t (id int NOT NULL PRIMARY KEY, type text NOT NULL, amt numeric NOT NULL);
22+
INSERT INTO mvtest_t VALUES
23+
(1, 'x', 2),
24+
(2, 'x', 3),
25+
(3, 'y', 5),
26+
(4, 'y', 7),
27+
(5, 'z', 11);
28+
CREATE MATERIALIZED VIEW mvtest_tm AS SELECT type, sum(amt) AS totamt FROM mvtest_t GROUP BY type WITH NO DATA;
29+
SELECT pg_tde_is_encrypted('mvtest_tm');
30+
REFRESH MATERIALIZED VIEW mvtest_tm;
31+
SELECT pg_tde_is_encrypted('mvtest_tm');
32+
33+
CREATE TYPE rewritetype AS (a int);
34+
CREATE TABLE rewritemetoo1 OF rewritetype;
35+
CREATE TABLE rewritemetoo2 OF rewritetype;
36+
SELECT pg_tde_is_encrypted('rewritemetoo1');
37+
SELECT pg_tde_is_encrypted('rewritemetoo2');
38+
ALTER TYPE rewritetype ALTER ATTRIBUTE a TYPE text cascade;
39+
SELECT pg_tde_is_encrypted('rewritemetoo1');
40+
SELECT pg_tde_is_encrypted('rewritemetoo2');
41+
42+
CREATE TABLE encrypted_table (
43+
id SERIAL,
44+
data TEXT,
45+
created_at DATE NOT NULL,
46+
PRIMARY KEY (id, created_at)
47+
) USING tde_heap;
48+
CREATE INDEX idx_date ON encrypted_table (created_at);
49+
SELECT pg_tde_is_encrypted('encrypted_table');
50+
CLUSTER encrypted_table USING idx_date;
51+
SELECT pg_tde_is_encrypted('encrypted_table');
52+
53+
DROP EXTENSION pg_tde CASCADE;
54+
RESET default_table_access_method;

src/backend/bootstrap/bootparse.y

+2-1
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,8 @@ Boot_CreateStmt:
210210
true,
211211
&relfrozenxid,
212212
&relminmxid,
213-
true);
213+
true,
214+
NULL);
214215
elog(DEBUG4, "bootstrap relation created");
215216
}
216217
else

src/backend/catalog/heap.c

+34-4
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,8 @@ heap_create(const char *relname,
300300
bool allow_system_table_mods,
301301
TransactionId *relfrozenxid,
302302
MultiXactId *relminmxid,
303-
bool create_storage)
303+
bool create_storage,
304+
RelFileLocator *old_rlocator)
304305
{
305306
Relation rel;
306307

@@ -385,14 +386,31 @@ heap_create(const char *relname,
385386
*/
386387
if (create_storage)
387388
{
389+
RelFileLocator prev_rlocator = rel->rd_locator;
390+
RelFileLocator new_rlocator = rel->rd_locator;
391+
392+
if (old_rlocator != NULL)
393+
{
394+
prev_rlocator = *old_rlocator;
395+
396+
/*
397+
* table_relation_set_new_filelocator() takes old_rlocator from
398+
* rel->rd_locator
399+
*/
400+
rel->rd_locator = prev_rlocator;
401+
}
402+
388403
if (RELKIND_HAS_TABLE_AM(rel->rd_rel->relkind))
389-
table_relation_set_new_filelocator(rel, &rel->rd_locator,
404+
table_relation_set_new_filelocator(rel, &new_rlocator,
390405
relpersistence,
391406
relfrozenxid, relminmxid);
392407
else if (RELKIND_HAS_STORAGE(rel->rd_rel->relkind))
393-
RelationCreateStorage(rel->rd_locator, rel->rd_locator, relpersistence, true);
408+
RelationCreateStorage(prev_rlocator, new_rlocator, relpersistence, true);
394409
else
395410
Assert(false);
411+
412+
/* restore the orginal rel's locator */
413+
rel->rd_locator = new_rlocator;
396414
}
397415

398416
/*
@@ -1129,6 +1147,8 @@ heap_create_with_catalog(const char *relname,
11291147
Oid existing_relid;
11301148
Oid old_type_oid;
11311149
Oid new_type_oid;
1150+
RelFileLocator *old_rlocator = NULL;
1151+
Relation old_rel;
11321152

11331153
/* By default set to InvalidOid unless overridden by binary-upgrade */
11341154
RelFileNumber relfilenumber = InvalidRelFileNumber;
@@ -1283,6 +1303,12 @@ heap_create_with_catalog(const char *relname,
12831303
else
12841304
relacl = NULL;
12851305

1306+
if (relrewrite != InvalidOid)
1307+
{
1308+
old_rel = table_open(relrewrite, AccessShareLock);
1309+
old_rlocator = &old_rel->rd_locator;
1310+
}
1311+
12861312
/*
12871313
* Create the relcache entry (mostly dummy at this point) and the physical
12881314
* disk file. (If we fail further down, it's the smgr's responsibility to
@@ -1306,7 +1332,11 @@ heap_create_with_catalog(const char *relname,
13061332
allow_system_table_mods,
13071333
&relfrozenxid,
13081334
&relminmxid,
1309-
true);
1335+
true,
1336+
old_rlocator);
1337+
1338+
if (relrewrite != InvalidOid)
1339+
table_close(old_rel, AccessShareLock);
13101340

13111341
Assert(relid == RelationGetRelid(new_rel_desc));
13121342

src/backend/catalog/index.c

+6-3
Original file line numberDiff line numberDiff line change
@@ -741,7 +741,8 @@ index_create(Relation heapRelation,
741741
bits16 constr_flags,
742742
bool allow_system_table_mods,
743743
bool is_internal,
744-
Oid *constraintId)
744+
Oid *constraintId,
745+
RelFileLocator *old_rlocator)
745746
{
746747
Oid heapRelationId = RelationGetRelid(heapRelation);
747748
Relation pg_class;
@@ -985,7 +986,8 @@ index_create(Relation heapRelation,
985986
allow_system_table_mods,
986987
&relfrozenxid,
987988
&relminmxid,
988-
create_storage);
989+
create_storage,
990+
old_rlocator);
989991

990992
Assert(relfrozenxid == InvalidTransactionId);
991993
Assert(relminmxid == InvalidMultiXactId);
@@ -1459,7 +1461,8 @@ index_concurrently_create_copy(Relation heapRelation, Oid oldIndexId,
14591461
0,
14601462
true, /* allow table to be a system catalog? */
14611463
false, /* is_internal? */
1462-
NULL);
1464+
NULL,
1465+
&indexRelation->rd_locator);
14631466

14641467
/* Close the relations used and clean up */
14651468
index_close(indexRelation, NoLock);

src/backend/catalog/toasting.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ create_toast_table(Relation rel, Oid toastOid, Oid toastIndexOid,
325325
BTREE_AM_OID,
326326
rel->rd_rel->reltablespace,
327327
collationIds, opclassIds, NULL, coloptions, NULL, (Datum) 0,
328-
INDEX_CREATE_IS_PRIMARY, 0, true, true, NULL);
328+
INDEX_CREATE_IS_PRIMARY, 0, true, true, NULL, NULL);
329329

330330
table_close(toast_rel, NoLock);
331331

src/backend/commands/indexcmds.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -1208,7 +1208,7 @@ DefineIndex(Oid tableId,
12081208
coloptions, NULL, reloptions,
12091209
flags, constr_flags,
12101210
allowSystemTableMods, !check_rights,
1211-
&createdConstraintId);
1211+
&createdConstraintId, NULL);
12121212

12131213
ObjectAddressSet(address, RelationRelationId, indexRelationId);
12141214

src/include/catalog/heap.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "catalog/indexing.h"
1818
#include "catalog/objectaddress.h"
1919
#include "parser/parse_node.h"
20+
#include "storage/relfilelocator.h"
2021

2122

2223
/* flag bits for CheckAttributeType/CheckAttributeNamesTypes */
@@ -60,7 +61,8 @@ extern Relation heap_create(const char *relname,
6061
bool allow_system_table_mods,
6162
TransactionId *relfrozenxid,
6263
MultiXactId *relminmxid,
63-
bool create_storage);
64+
bool create_storage,
65+
RelFileLocator *old_rlocator);
6466

6567
extern Oid heap_create_with_catalog(const char *relname,
6668
Oid relnamespace,

src/include/catalog/index.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
#include "catalog/objectaddress.h"
1818
#include "nodes/execnodes.h"
19+
#include "storage/relfilelocator.h"
1920

2021

2122
#define DEFAULT_INDEX_TYPE "btree"
@@ -86,7 +87,8 @@ extern Oid index_create(Relation heapRelation,
8687
bits16 constr_flags,
8788
bool allow_system_table_mods,
8889
bool is_internal,
89-
Oid *constraintId);
90+
Oid *constraintId,
91+
RelFileLocator *old_rlocator);
9092

9193
#define INDEX_CONSTR_CREATE_MARK_AS_PRIMARY (1 << 0)
9294
#define INDEX_CONSTR_CREATE_DEFERRABLE (1 << 1)

0 commit comments

Comments
 (0)