Skip to content

Commit 4108440

Browse files
peterejianhe-fundeanrasheed
committed
Additional tests for stored generated columns
Some additional tests have been created during the development of virtual generated columns (not included here). This commit adds equivalent tests to the existing test set for stored generated columns. This includes expanded tests related to MERGE, subqueries, whole-row references, permissions, domains, partitioning, and triggers. Author: Peter Eisentraut <peter@eisentraut.org> Co-authored-by: jian he <jian.universality@gmail.com> Co-authored-by: Dean Rasheed <dean.a.rasheed@gmail.com> Discussion: https://www.postgresql.org/message-id/flat/a368248e-69e4-40be-9c07-6c3b5880b0a6@eisentraut.org
1 parent ce1b0f9 commit 4108440

File tree

2 files changed

+179
-20
lines changed

2 files changed

+179
-20
lines changed

src/test/regress/expected/generated_stored.out

+129-11
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,24 @@ SELECT * FROM gtest1 ORDER BY a;
122122
4 | 8
123123
(4 rows)
124124

125+
SELECT gtest1 FROM gtest1 ORDER BY a; -- whole-row reference
126+
gtest1
127+
--------
128+
(1,2)
129+
(2,4)
130+
(3,6)
131+
(4,8)
132+
(4 rows)
133+
134+
SELECT a, (SELECT gtest1.b) FROM gtest1 ORDER BY a; -- sublink
135+
a | b
136+
---+---
137+
1 | 2
138+
2 | 4
139+
3 | 6
140+
4 | 8
141+
(4 rows)
142+
125143
DELETE FROM gtest1 WHERE a >= 3;
126144
UPDATE gtest1 SET b = DEFAULT WHERE a = 1;
127145
UPDATE gtest1 SET b = 11 WHERE a = 1; -- error
@@ -177,7 +195,12 @@ SELECT * FROM gtest1 ORDER BY a;
177195
2 | 4
178196
(2 rows)
179197

180-
UPDATE gtest1 SET a = 3 WHERE b = 4;
198+
UPDATE gtest1 SET a = 3 WHERE b = 4 RETURNING old.*, new.*;
199+
a | b | a | b
200+
---+---+---+---
201+
2 | 4 | 3 | 6
202+
(1 row)
203+
181204
SELECT * FROM gtest1 ORDER BY a;
182205
a | b
183206
---+---
@@ -203,14 +226,42 @@ CREATE TABLE gtestm (
203226
INSERT INTO gtestm VALUES (1, 5, 100);
204227
MERGE INTO gtestm t USING (VALUES (1, 10), (2, 20)) v(id, f1) ON t.id = v.id
205228
WHEN MATCHED THEN UPDATE SET f1 = v.f1
206-
WHEN NOT MATCHED THEN INSERT VALUES (v.id, v.f1, 200);
229+
WHEN NOT MATCHED THEN INSERT VALUES (v.id, v.f1, 200)
230+
RETURNING merge_action(), old.*, new.*;
231+
merge_action | id | f1 | f2 | f3 | f4 | id | f1 | f2 | f3 | f4
232+
--------------+----+----+-----+----+-----+----+----+-----+----+-----
233+
UPDATE | 1 | 5 | 100 | 10 | 200 | 1 | 10 | 100 | 20 | 200
234+
INSERT | | | | | | 2 | 20 | 200 | 40 | 400
235+
(2 rows)
236+
207237
SELECT * FROM gtestm ORDER BY id;
208238
id | f1 | f2 | f3 | f4
209239
----+----+-----+----+-----
210240
1 | 10 | 100 | 20 | 200
211241
2 | 20 | 200 | 40 | 400
212242
(2 rows)
213243

244+
DROP TABLE gtestm;
245+
CREATE TABLE gtestm (
246+
a int PRIMARY KEY,
247+
b int GENERATED ALWAYS AS (a * 2) STORED
248+
);
249+
INSERT INTO gtestm (a) SELECT g FROM generate_series(1, 10) g;
250+
MERGE INTO gtestm t USING gtestm AS s ON 2 * t.a = s.b WHEN MATCHED THEN DELETE RETURNING *;
251+
a | b | a | b
252+
----+----+----+----
253+
1 | 2 | 1 | 2
254+
2 | 4 | 2 | 4
255+
3 | 6 | 3 | 6
256+
4 | 8 | 4 | 8
257+
5 | 10 | 5 | 10
258+
6 | 12 | 6 | 12
259+
7 | 14 | 7 | 14
260+
8 | 16 | 8 | 16
261+
9 | 18 | 9 | 18
262+
10 | 20 | 10 | 20
263+
(10 rows)
264+
214265
DROP TABLE gtestm;
215266
-- views
216267
CREATE VIEW gtest1v AS SELECT * FROM gtest1;
@@ -319,6 +370,21 @@ Not-null constraints:
319370
"gtest1_a_not_null" NOT NULL "a" (inherited)
320371
Inherits: gtest1
321372

373+
INSERT INTO gtestx (a, x) VALUES (11, 22);
374+
SELECT * FROM gtest1;
375+
a | b
376+
----+-----
377+
3 | 6
378+
4 | 8
379+
11 | 242
380+
(3 rows)
381+
382+
SELECT * FROM gtestx;
383+
a | b | x
384+
----+-----+----
385+
11 | 242 | 22
386+
(1 row)
387+
322388
CREATE TABLE gtestxx_1 (a int NOT NULL, b int);
323389
ALTER TABLE gtestxx_1 INHERIT gtest1; -- error
324390
ERROR: column "b" in child table must be a generated column
@@ -541,7 +607,7 @@ CREATE FUNCTION gf1(a int) RETURNS int AS $$ SELECT a * 3 $$ IMMUTABLE LANGUAGE
541607
REVOKE ALL ON FUNCTION gf1(int) FROM PUBLIC;
542608
CREATE TABLE gtest12 (a int PRIMARY KEY, b int, c int GENERATED ALWAYS AS (gf1(b)) STORED);
543609
INSERT INTO gtest12 VALUES (1, 10), (2, 20);
544-
GRANT SELECT (a, c) ON gtest12 TO regress_user11;
610+
GRANT SELECT (a, c), INSERT ON gtest12 TO regress_user11;
545611
SET ROLE regress_user11;
546612
SELECT a, b FROM gtest11; -- not allowed
547613
ERROR: permission denied for table gtest11
@@ -554,7 +620,9 @@ SELECT a, c FROM gtest11; -- allowed
554620

555621
SELECT gf1(10); -- not allowed
556622
ERROR: permission denied for function gf1
557-
SELECT a, c FROM gtest12; -- allowed
623+
INSERT INTO gtest12 VALUES (3, 30), (4, 40); -- currently not allowed because of function permissions, should arguably be allowed
624+
ERROR: permission denied for function gf1
625+
SELECT a, c FROM gtest12; -- allowed (does not actually invoke the function)
558626
a | c
559627
---+----
560628
1 | 30
@@ -589,6 +657,13 @@ INSERT INTO gtest20b (a) VALUES (30);
589657
ALTER TABLE gtest20b ADD CONSTRAINT chk CHECK (b < 50) NOT VALID;
590658
ALTER TABLE gtest20b VALIDATE CONSTRAINT chk; -- fails on existing row
591659
ERROR: check constraint "chk" of relation "gtest20b" is violated by some row
660+
-- check with whole-row reference
661+
CREATE TABLE gtest20c (a int, b int GENERATED ALWAYS AS (a * 2) STORED);
662+
ALTER TABLE gtest20c ADD CONSTRAINT whole_row_check CHECK (gtest20c IS NOT NULL);
663+
INSERT INTO gtest20c VALUES (1); -- ok
664+
INSERT INTO gtest20c VALUES (NULL); -- fails
665+
ERROR: new row for relation "gtest20c" violates check constraint "whole_row_check"
666+
DETAIL: Failing row contains (null, null).
592667
-- not-null constraints
593668
CREATE TABLE gtest21a (a int PRIMARY KEY, b int GENERATED ALWAYS AS (nullif(a, 0)) STORED NOT NULL);
594669
INSERT INTO gtest21a (a) VALUES (1); -- ok
@@ -758,6 +833,11 @@ CREATE TABLE gtest24 (a int PRIMARY KEY, b gtestdomain1 GENERATED ALWAYS AS (a *
758833
INSERT INTO gtest24 (a) VALUES (4); -- ok
759834
INSERT INTO gtest24 (a) VALUES (6); -- error
760835
ERROR: value for domain gtestdomain1 violates check constraint "gtestdomain1_check"
836+
CREATE TYPE gtestdomain1range AS range (subtype = gtestdomain1);
837+
CREATE TABLE gtest24r (a int PRIMARY KEY, b gtestdomain1range GENERATED ALWAYS AS (gtestdomain1range(a, a + 5)) STORED);
838+
INSERT INTO gtest24r (a) VALUES (4); -- ok
839+
INSERT INTO gtest24r (a) VALUES (6); -- error
840+
ERROR: value for domain gtestdomain1 violates check constraint "gtestdomain1_check"
761841
-- typed tables (currently not supported)
762842
CREATE TYPE gtest_type AS (f1 integer, f2 text, f3 bigint);
763843
CREATE TABLE gtest28 OF gtest_type (f1 WITH OPTIONS GENERATED ALWAYS AS (f2 *2) STORED);
@@ -841,6 +921,24 @@ SELECT tableoid::regclass, * FROM gtest_parent ORDER BY 1, 2, 3;
841921
gtest_child2 | 08-15-2016 | 3 | 66
842922
(3 rows)
843923

924+
SELECT tableoid::regclass, * FROM gtest_child ORDER BY 1, 2, 3;
925+
tableoid | f1 | f2 | f3
926+
-------------+------------+----+----
927+
gtest_child | 07-15-2016 | 1 | 2
928+
gtest_child | 07-15-2016 | 2 | 4
929+
(2 rows)
930+
931+
SELECT tableoid::regclass, * FROM gtest_child2 ORDER BY 1, 2, 3;
932+
tableoid | f1 | f2 | f3
933+
--------------+------------+----+----
934+
gtest_child2 | 08-15-2016 | 3 | 66
935+
(1 row)
936+
937+
SELECT tableoid::regclass, * FROM gtest_child3 ORDER BY 1, 2, 3;
938+
tableoid | f1 | f2 | f3
939+
----------+----+----+----
940+
(0 rows)
941+
844942
UPDATE gtest_parent SET f1 = f1 + 60 WHERE f2 = 1;
845943
SELECT tableoid::regclass, * FROM gtest_parent ORDER BY 1, 2, 3;
846944
tableoid | f1 | f2 | f3
@@ -1184,6 +1282,18 @@ Inherits: gtest30
11841282

11851283
ALTER TABLE gtest30_1 ALTER COLUMN b DROP EXPRESSION; -- error
11861284
ERROR: cannot drop generation expression from inherited column
1285+
-- composite type dependencies
1286+
CREATE TABLE gtest31_1 (a int, b text GENERATED ALWAYS AS ('hello') STORED, c text);
1287+
CREATE TABLE gtest31_2 (x int, y gtest31_1);
1288+
ALTER TABLE gtest31_1 ALTER COLUMN b TYPE varchar; -- fails
1289+
ERROR: cannot alter table "gtest31_1" because column "gtest31_2.y" uses its row type
1290+
DROP TABLE gtest31_1, gtest31_2;
1291+
-- Check it for a partitioned table, too
1292+
CREATE TABLE gtest31_1 (a int, b text GENERATED ALWAYS AS ('hello') STORED, c text) PARTITION BY LIST (a);
1293+
CREATE TABLE gtest31_2 (x int, y gtest31_1);
1294+
ALTER TABLE gtest31_1 ALTER COLUMN b TYPE varchar; -- fails
1295+
ERROR: cannot alter table "gtest31_1" because column "gtest31_2.y" uses its row type
1296+
DROP TABLE gtest31_1, gtest31_2;
11871297
-- triggers
11881298
CREATE TABLE gtest26 (
11891299
a int PRIMARY KEY,
@@ -1294,7 +1404,7 @@ UPDATE gtest26 SET a = 1 WHERE a = 0;
12941404
NOTICE: OK
12951405
DROP TRIGGER gtest11 ON gtest26;
12961406
TRUNCATE gtest26;
1297-
-- check that modifications of stored generated columns in triggers do
1407+
-- check that modifications of generated columns in triggers do
12981408
-- not get propagated
12991409
CREATE FUNCTION gtest_trigger_func4() RETURNS trigger
13001410
LANGUAGE plpgsql
@@ -1305,20 +1415,28 @@ BEGIN
13051415
RETURN NEW;
13061416
END;
13071417
$$;
1308-
CREATE TRIGGER gtest12_01 BEFORE UPDATE ON gtest26
1418+
CREATE TRIGGER gtest12_01 BEFORE INSERT OR UPDATE ON gtest26
13091419
FOR EACH ROW
13101420
EXECUTE PROCEDURE gtest_trigger_func();
1311-
CREATE TRIGGER gtest12_02 BEFORE UPDATE ON gtest26
1421+
CREATE TRIGGER gtest12_02 BEFORE INSERT OR UPDATE ON gtest26
13121422
FOR EACH ROW
13131423
EXECUTE PROCEDURE gtest_trigger_func4();
1314-
CREATE TRIGGER gtest12_03 BEFORE UPDATE ON gtest26
1424+
CREATE TRIGGER gtest12_03 BEFORE INSERT OR UPDATE ON gtest26
13151425
FOR EACH ROW
13161426
EXECUTE PROCEDURE gtest_trigger_func();
13171427
INSERT INTO gtest26 (a) VALUES (1);
1318-
UPDATE gtest26 SET a = 11 WHERE a = 1;
1319-
INFO: gtest12_01: BEFORE: old = (1,2)
1428+
INFO: gtest12_01: BEFORE: new = (1,)
1429+
INFO: gtest12_03: BEFORE: new = (10,300)
1430+
SELECT * FROM gtest26 ORDER BY a;
1431+
a | b
1432+
----+----
1433+
10 | 20
1434+
(1 row)
1435+
1436+
UPDATE gtest26 SET a = 11 WHERE a = 10;
1437+
INFO: gtest12_01: BEFORE: old = (10,20)
13201438
INFO: gtest12_01: BEFORE: new = (11,)
1321-
INFO: gtest12_03: BEFORE: old = (1,2)
1439+
INFO: gtest12_03: BEFORE: old = (10,20)
13221440
INFO: gtest12_03: BEFORE: new = (10,)
13231441
SELECT * FROM gtest26 ORDER BY a;
13241442
a | b

src/test/regress/sql/generated_stored.sql

+50-9
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ INSERT INTO gtest1 VALUES (3, 33), (4, DEFAULT); -- error
5656
INSERT INTO gtest1 VALUES (3, DEFAULT), (4, DEFAULT); -- ok
5757

5858
SELECT * FROM gtest1 ORDER BY a;
59+
SELECT gtest1 FROM gtest1 ORDER BY a; -- whole-row reference
60+
SELECT a, (SELECT gtest1.b) FROM gtest1 ORDER BY a; -- sublink
5961
DELETE FROM gtest1 WHERE a >= 3;
6062

6163
UPDATE gtest1 SET b = DEFAULT WHERE a = 1;
@@ -79,7 +81,7 @@ DROP TABLE gtestx;
7981

8082
-- test UPDATE/DELETE quals
8183
SELECT * FROM gtest1 ORDER BY a;
82-
UPDATE gtest1 SET a = 3 WHERE b = 4;
84+
UPDATE gtest1 SET a = 3 WHERE b = 4 RETURNING old.*, new.*;
8385
SELECT * FROM gtest1 ORDER BY a;
8486
DELETE FROM gtest1 WHERE b = 2;
8587
SELECT * FROM gtest1 ORDER BY a;
@@ -95,10 +97,19 @@ CREATE TABLE gtestm (
9597
INSERT INTO gtestm VALUES (1, 5, 100);
9698
MERGE INTO gtestm t USING (VALUES (1, 10), (2, 20)) v(id, f1) ON t.id = v.id
9799
WHEN MATCHED THEN UPDATE SET f1 = v.f1
98-
WHEN NOT MATCHED THEN INSERT VALUES (v.id, v.f1, 200);
100+
WHEN NOT MATCHED THEN INSERT VALUES (v.id, v.f1, 200)
101+
RETURNING merge_action(), old.*, new.*;
99102
SELECT * FROM gtestm ORDER BY id;
100103
DROP TABLE gtestm;
101104

105+
CREATE TABLE gtestm (
106+
a int PRIMARY KEY,
107+
b int GENERATED ALWAYS AS (a * 2) STORED
108+
);
109+
INSERT INTO gtestm (a) SELECT g FROM generate_series(1, 10) g;
110+
MERGE INTO gtestm t USING gtestm AS s ON 2 * t.a = s.b WHEN MATCHED THEN DELETE RETURNING *;
111+
DROP TABLE gtestm;
112+
102113
-- views
103114
CREATE VIEW gtest1v AS SELECT * FROM gtest1;
104115
SELECT * FROM gtest1v;
@@ -140,6 +151,9 @@ CREATE TABLE gtestx (x int, b int DEFAULT 10) INHERITS (gtest1); -- error
140151
CREATE TABLE gtestx (x int, b int GENERATED ALWAYS AS IDENTITY) INHERITS (gtest1); -- error
141152
CREATE TABLE gtestx (x int, b int GENERATED ALWAYS AS (a * 22) STORED) INHERITS (gtest1); -- ok, overrides parent
142153
\d+ gtestx
154+
INSERT INTO gtestx (a, x) VALUES (11, 22);
155+
SELECT * FROM gtest1;
156+
SELECT * FROM gtestx;
143157

144158
CREATE TABLE gtestxx_1 (a int NOT NULL, b int);
145159
ALTER TABLE gtestxx_1 INHERIT gtest1; -- error
@@ -274,13 +288,14 @@ REVOKE ALL ON FUNCTION gf1(int) FROM PUBLIC;
274288

275289
CREATE TABLE gtest12 (a int PRIMARY KEY, b int, c int GENERATED ALWAYS AS (gf1(b)) STORED);
276290
INSERT INTO gtest12 VALUES (1, 10), (2, 20);
277-
GRANT SELECT (a, c) ON gtest12 TO regress_user11;
291+
GRANT SELECT (a, c), INSERT ON gtest12 TO regress_user11;
278292

279293
SET ROLE regress_user11;
280294
SELECT a, b FROM gtest11; -- not allowed
281295
SELECT a, c FROM gtest11; -- allowed
282296
SELECT gf1(10); -- not allowed
283-
SELECT a, c FROM gtest12; -- allowed
297+
INSERT INTO gtest12 VALUES (3, 30), (4, 40); -- currently not allowed because of function permissions, should arguably be allowed
298+
SELECT a, c FROM gtest12; -- allowed (does not actually invoke the function)
284299
RESET ROLE;
285300

286301
DROP FUNCTION gf1(int); -- fail
@@ -307,6 +322,12 @@ INSERT INTO gtest20b (a) VALUES (30);
307322
ALTER TABLE gtest20b ADD CONSTRAINT chk CHECK (b < 50) NOT VALID;
308323
ALTER TABLE gtest20b VALIDATE CONSTRAINT chk; -- fails on existing row
309324

325+
-- check with whole-row reference
326+
CREATE TABLE gtest20c (a int, b int GENERATED ALWAYS AS (a * 2) STORED);
327+
ALTER TABLE gtest20c ADD CONSTRAINT whole_row_check CHECK (gtest20c IS NOT NULL);
328+
INSERT INTO gtest20c VALUES (1); -- ok
329+
INSERT INTO gtest20c VALUES (NULL); -- fails
330+
310331
-- not-null constraints
311332
CREATE TABLE gtest21a (a int PRIMARY KEY, b int GENERATED ALWAYS AS (nullif(a, 0)) STORED NOT NULL);
312333
INSERT INTO gtest21a (a) VALUES (1); -- ok
@@ -386,6 +407,10 @@ CREATE DOMAIN gtestdomain1 AS int CHECK (VALUE < 10);
386407
CREATE TABLE gtest24 (a int PRIMARY KEY, b gtestdomain1 GENERATED ALWAYS AS (a * 2) STORED);
387408
INSERT INTO gtest24 (a) VALUES (4); -- ok
388409
INSERT INTO gtest24 (a) VALUES (6); -- error
410+
CREATE TYPE gtestdomain1range AS range (subtype = gtestdomain1);
411+
CREATE TABLE gtest24r (a int PRIMARY KEY, b gtestdomain1range GENERATED ALWAYS AS (gtestdomain1range(a, a + 5)) STORED);
412+
INSERT INTO gtest24r (a) VALUES (4); -- ok
413+
INSERT INTO gtest24r (a) VALUES (6); -- error
389414

390415
-- typed tables (currently not supported)
391416
CREATE TYPE gtest_type AS (f1 integer, f2 text, f3 bigint);
@@ -431,6 +456,9 @@ INSERT INTO gtest_parent (f1, f2) VALUES ('2016-07-15', 1);
431456
INSERT INTO gtest_parent (f1, f2) VALUES ('2016-07-15', 2);
432457
INSERT INTO gtest_parent (f1, f2) VALUES ('2016-08-15', 3);
433458
SELECT tableoid::regclass, * FROM gtest_parent ORDER BY 1, 2, 3;
459+
SELECT tableoid::regclass, * FROM gtest_child ORDER BY 1, 2, 3;
460+
SELECT tableoid::regclass, * FROM gtest_child2 ORDER BY 1, 2, 3;
461+
SELECT tableoid::regclass, * FROM gtest_child3 ORDER BY 1, 2, 3;
434462
UPDATE gtest_parent SET f1 = f1 + 60 WHERE f2 = 1;
435463
SELECT tableoid::regclass, * FROM gtest_parent ORDER BY 1, 2, 3;
436464

@@ -545,6 +573,18 @@ ALTER TABLE ONLY gtest30 ALTER COLUMN b DROP EXPRESSION; -- error
545573
\d gtest30_1
546574
ALTER TABLE gtest30_1 ALTER COLUMN b DROP EXPRESSION; -- error
547575

576+
-- composite type dependencies
577+
CREATE TABLE gtest31_1 (a int, b text GENERATED ALWAYS AS ('hello') STORED, c text);
578+
CREATE TABLE gtest31_2 (x int, y gtest31_1);
579+
ALTER TABLE gtest31_1 ALTER COLUMN b TYPE varchar; -- fails
580+
DROP TABLE gtest31_1, gtest31_2;
581+
582+
-- Check it for a partitioned table, too
583+
CREATE TABLE gtest31_1 (a int, b text GENERATED ALWAYS AS ('hello') STORED, c text) PARTITION BY LIST (a);
584+
CREATE TABLE gtest31_2 (x int, y gtest31_1);
585+
ALTER TABLE gtest31_1 ALTER COLUMN b TYPE varchar; -- fails
586+
DROP TABLE gtest31_1, gtest31_2;
587+
548588
-- triggers
549589
CREATE TABLE gtest26 (
550590
a int PRIMARY KEY,
@@ -630,7 +670,7 @@ UPDATE gtest26 SET a = 1 WHERE a = 0;
630670
DROP TRIGGER gtest11 ON gtest26;
631671
TRUNCATE gtest26;
632672

633-
-- check that modifications of stored generated columns in triggers do
673+
-- check that modifications of generated columns in triggers do
634674
-- not get propagated
635675
CREATE FUNCTION gtest_trigger_func4() RETURNS trigger
636676
LANGUAGE plpgsql
@@ -642,20 +682,21 @@ BEGIN
642682
END;
643683
$$;
644684

645-
CREATE TRIGGER gtest12_01 BEFORE UPDATE ON gtest26
685+
CREATE TRIGGER gtest12_01 BEFORE INSERT OR UPDATE ON gtest26
646686
FOR EACH ROW
647687
EXECUTE PROCEDURE gtest_trigger_func();
648688

649-
CREATE TRIGGER gtest12_02 BEFORE UPDATE ON gtest26
689+
CREATE TRIGGER gtest12_02 BEFORE INSERT OR UPDATE ON gtest26
650690
FOR EACH ROW
651691
EXECUTE PROCEDURE gtest_trigger_func4();
652692

653-
CREATE TRIGGER gtest12_03 BEFORE UPDATE ON gtest26
693+
CREATE TRIGGER gtest12_03 BEFORE INSERT OR UPDATE ON gtest26
654694
FOR EACH ROW
655695
EXECUTE PROCEDURE gtest_trigger_func();
656696

657697
INSERT INTO gtest26 (a) VALUES (1);
658-
UPDATE gtest26 SET a = 11 WHERE a = 1;
698+
SELECT * FROM gtest26 ORDER BY a;
699+
UPDATE gtest26 SET a = 11 WHERE a = 10;
659700
SELECT * FROM gtest26 ORDER BY a;
660701

661702
-- LIKE INCLUDING GENERATED and dropped column handling

0 commit comments

Comments
 (0)