Skip to content

Commit 1b13352

Browse files
avaminglimy-ship-it
authored andcommitted
Add materialized view relative triggers case in SingleNode mode.
Triggers like BEFORE/AFTER INSERT/UPDATE/DELETE could be possible in SingleNode mode because all tables including user tables are on QD. An such triiger may change the data of another table who has relative materialized views. We should update that views' data status as well. Add test cases for that. Authored-by: Zhang Mingli avamingli@gmail.com
1 parent 9604600 commit 1b13352

2 files changed

Lines changed: 132 additions & 1 deletion

File tree

src/test/singlenode_regress/expected/matview_data.out

Lines changed: 88 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -324,10 +324,97 @@ select mvname, datastatus from gp_matview_aux where mvname in ('mv0','mv1', 'mv2
324324
mv3 | e
325325
(1 row)
326326

327+
--
328+
-- Test triggers only for singlenode mode.
329+
-- All tables are on QD, so triggers could work well, ex
330+
-- modify another table.
331+
create table tri_t1(a int, b int);
332+
create table tri_t2(a int, b int);
333+
create table tri_t3(a int, b int);
334+
create materialized view tri_mv1 as select * from tri_t1;
335+
create materialized view tri_mv2 as select * from tri_t2;
336+
insert into tri_t3 values (1, 2);
337+
create materialized view tri_mv3 as select * from tri_t3;
338+
create function trigger_insert_tri_t2()
339+
returns trigger AS
340+
$$
341+
begin
342+
execute 'insert into tri_t2 values(1, 1)';
343+
execute 'update tri_t3 set b = 10 where a = 1;';
344+
return NEW;
345+
end;
346+
$$
347+
language plpgsql;
348+
create trigger trigger_insert_tri_t2 before insert ON tri_t1
349+
for each row execute procedure trigger_insert_tri_t2();
350+
select mvname, datastatus from gp_matview_aux where mvname in ('tri_mv1', 'tri_mv2', 'tri_mv3');
351+
mvname | datastatus
352+
---------+------------
353+
tri_mv1 | u
354+
tri_mv2 | u
355+
tri_mv3 | u
356+
(3 rows)
357+
358+
select * from tri_t1;
359+
a | b
360+
---+---
361+
(0 rows)
362+
363+
select * from tri_t2;
364+
a | b
365+
---+---
366+
(0 rows)
367+
368+
select * from tri_t3;
369+
a | b
370+
---+---
371+
1 | 2
372+
(1 row)
373+
374+
insert into tri_t1 values(1, 2);
375+
select * from tri_t1;
376+
a | b
377+
---+---
378+
1 | 2
379+
(1 row)
380+
381+
-- should also insert data
382+
select * from tri_t2;
383+
a | b
384+
---+---
385+
1 | 1
386+
(1 row)
387+
388+
-- shoud be updated
389+
select * from tri_t3;
390+
a | b
391+
---+----
392+
1 | 10
393+
(1 row)
394+
395+
-- check mv status
396+
select mvname, datastatus from gp_matview_aux where mvname in ('tri_mv1', 'tri_mv2', 'tri_mv3');
397+
mvname | datastatus
398+
---------+------------
399+
tri_mv2 | i
400+
tri_mv3 | e
401+
tri_mv1 | i
402+
(3 rows)
403+
404+
drop trigger trigger_insert_tri_t2 on tri_t1;
405+
drop function trigger_insert_tri_t2;
406+
-- start_ignore
327407
drop schema matview_data_schema cascade;
328-
NOTICE: drop cascades to 3 other objects
408+
NOTICE: drop cascades to 9 other objects
329409
DETAIL: drop cascades to table t2
330410
drop cascades to table t3
331411
drop cascades to materialized view mv3
412+
drop cascades to table tri_t1
413+
drop cascades to table tri_t2
414+
drop cascades to table tri_t3
415+
drop cascades to materialized view tri_mv1
416+
drop cascades to materialized view tri_mv2
417+
drop cascades to materialized view tri_mv3
418+
-- end_ignore
332419
reset enable_answer_query_using_materialized_views;
333420
reset optimizer;

src/test/singlenode_regress/sql/matview_data.sql

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,50 @@ drop materialized view mv2;
114114
drop table t1 cascade;
115115
select mvname, datastatus from gp_matview_aux where mvname in ('mv0','mv1', 'mv2', 'mv3');
116116

117+
--
118+
-- Test triggers only for singlenode mode.
119+
-- All tables are on QD, so triggers could work well, ex
120+
-- modify another table.
121+
create table tri_t1(a int, b int);
122+
create table tri_t2(a int, b int);
123+
create table tri_t3(a int, b int);
124+
create materialized view tri_mv1 as select * from tri_t1;
125+
create materialized view tri_mv2 as select * from tri_t2;
126+
insert into tri_t3 values (1, 2);
127+
create materialized view tri_mv3 as select * from tri_t3;
128+
129+
create function trigger_insert_tri_t2()
130+
returns trigger AS
131+
$$
132+
begin
133+
execute 'insert into tri_t2 values(1, 1)';
134+
execute 'update tri_t3 set b = 10 where a = 1;';
135+
return NEW;
136+
end;
137+
$$
138+
language plpgsql;
139+
140+
create trigger trigger_insert_tri_t2 before insert ON tri_t1
141+
for each row execute procedure trigger_insert_tri_t2();
142+
143+
select mvname, datastatus from gp_matview_aux where mvname in ('tri_mv1', 'tri_mv2', 'tri_mv3');
144+
select * from tri_t1;
145+
select * from tri_t2;
146+
select * from tri_t3;
147+
148+
insert into tri_t1 values(1, 2);
149+
select * from tri_t1;
150+
-- should also insert data
151+
select * from tri_t2;
152+
-- shoud be updated
153+
select * from tri_t3;
154+
-- check mv status
155+
select mvname, datastatus from gp_matview_aux where mvname in ('tri_mv1', 'tri_mv2', 'tri_mv3');
156+
drop trigger trigger_insert_tri_t2 on tri_t1;
157+
drop function trigger_insert_tri_t2;
158+
159+
-- start_ignore
117160
drop schema matview_data_schema cascade;
161+
-- end_ignore
118162
reset enable_answer_query_using_materialized_views;
119163
reset optimizer;

0 commit comments

Comments
 (0)