@supabase/pg-delta 1.0.0-alpha.22 → 1.0.0-alpha.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/catalog.model.js +1 -0
- package/dist/core/integrations/filter/flatten.js +13 -0
- package/dist/core/objects/aggregate/aggregate.diff.js +16 -0
- package/dist/core/objects/aggregate/aggregate.model.d.ts +10 -0
- package/dist/core/objects/aggregate/aggregate.model.js +19 -1
- package/dist/core/objects/aggregate/changes/aggregate.base.d.ts +1 -1
- package/dist/core/objects/aggregate/changes/aggregate.security-label.d.ts +28 -0
- package/dist/core/objects/aggregate/changes/aggregate.security-label.js +64 -0
- package/dist/core/objects/aggregate/changes/aggregate.types.d.ts +2 -1
- package/dist/core/objects/base.model.d.ts +8 -0
- package/dist/core/objects/base.model.js +2 -0
- package/dist/core/objects/domain/changes/domain.base.d.ts +1 -1
- package/dist/core/objects/domain/changes/domain.security-label.d.ts +28 -0
- package/dist/core/objects/domain/changes/domain.security-label.js +61 -0
- package/dist/core/objects/domain/changes/domain.types.d.ts +2 -1
- package/dist/core/objects/domain/domain.diff.js +16 -0
- package/dist/core/objects/domain/domain.model.d.ts +10 -0
- package/dist/core/objects/domain/domain.model.js +19 -1
- package/dist/core/objects/event-trigger/changes/event-trigger.base.d.ts +1 -1
- package/dist/core/objects/event-trigger/changes/event-trigger.security-label.d.ts +28 -0
- package/dist/core/objects/event-trigger/changes/event-trigger.security-label.js +61 -0
- package/dist/core/objects/event-trigger/changes/event-trigger.types.d.ts +2 -1
- package/dist/core/objects/event-trigger/event-trigger.diff.js +16 -0
- package/dist/core/objects/event-trigger/event-trigger.model.d.ts +10 -0
- package/dist/core/objects/event-trigger/event-trigger.model.js +19 -1
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.d.ts +1 -1
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.security-label.d.ts +28 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.security-label.js +61 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.d.ts +2 -1
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.js +16 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.d.ts +22 -0
- package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.js +20 -1
- package/dist/core/objects/materialized-view/changes/materialized-view.base.d.ts +1 -1
- package/dist/core/objects/materialized-view/changes/materialized-view.security-label.d.ts +28 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.security-label.js +61 -0
- package/dist/core/objects/materialized-view/changes/materialized-view.types.d.ts +2 -1
- package/dist/core/objects/materialized-view/materialized-view.diff.js +18 -0
- package/dist/core/objects/materialized-view/materialized-view.model.d.ts +22 -0
- package/dist/core/objects/materialized-view/materialized-view.model.js +20 -1
- package/dist/core/objects/procedure/changes/procedure.base.d.ts +1 -1
- package/dist/core/objects/procedure/changes/procedure.security-label.d.ts +28 -0
- package/dist/core/objects/procedure/changes/procedure.security-label.js +69 -0
- package/dist/core/objects/procedure/changes/procedure.types.d.ts +2 -1
- package/dist/core/objects/procedure/procedure.diff.js +16 -0
- package/dist/core/objects/procedure/procedure.model.d.ts +10 -0
- package/dist/core/objects/procedure/procedure.model.js +19 -1
- package/dist/core/objects/publication/changes/publication.base.d.ts +1 -1
- package/dist/core/objects/publication/changes/publication.security-label.d.ts +28 -0
- package/dist/core/objects/publication/changes/publication.security-label.js +61 -0
- package/dist/core/objects/publication/changes/publication.types.d.ts +2 -1
- package/dist/core/objects/publication/publication.diff.js +16 -0
- package/dist/core/objects/publication/publication.model.d.ts +14 -0
- package/dist/core/objects/publication/publication.model.js +20 -1
- package/dist/core/objects/role/changes/role.base.d.ts +1 -1
- package/dist/core/objects/role/changes/role.security-label.d.ts +28 -0
- package/dist/core/objects/role/changes/role.security-label.js +61 -0
- package/dist/core/objects/role/changes/role.types.d.ts +2 -1
- package/dist/core/objects/role/role.diff.js +16 -0
- package/dist/core/objects/role/role.model.d.ts +10 -0
- package/dist/core/objects/role/role.model.js +29 -0
- package/dist/core/objects/schema/changes/schema.base.d.ts +1 -1
- package/dist/core/objects/schema/changes/schema.security-label.d.ts +28 -0
- package/dist/core/objects/schema/changes/schema.security-label.js +61 -0
- package/dist/core/objects/schema/changes/schema.types.d.ts +2 -1
- package/dist/core/objects/schema/schema.diff.js +24 -1
- package/dist/core/objects/schema/schema.model.d.ts +10 -0
- package/dist/core/objects/schema/schema.model.js +18 -1
- package/dist/core/objects/security-label.types.d.ts +20 -0
- package/dist/core/objects/security-label.types.js +46 -0
- package/dist/core/objects/sequence/changes/sequence.base.d.ts +1 -1
- package/dist/core/objects/sequence/changes/sequence.security-label.d.ts +28 -0
- package/dist/core/objects/sequence/changes/sequence.security-label.js +61 -0
- package/dist/core/objects/sequence/changes/sequence.types.d.ts +2 -1
- package/dist/core/objects/sequence/sequence.diff.js +16 -0
- package/dist/core/objects/sequence/sequence.model.d.ts +10 -0
- package/dist/core/objects/sequence/sequence.model.js +19 -1
- package/dist/core/objects/subscription/changes/subscription.base.d.ts +1 -1
- package/dist/core/objects/subscription/changes/subscription.security-label.d.ts +28 -0
- package/dist/core/objects/subscription/changes/subscription.security-label.js +61 -0
- package/dist/core/objects/subscription/changes/subscription.types.d.ts +2 -1
- package/dist/core/objects/subscription/subscription.diff.js +16 -0
- package/dist/core/objects/subscription/subscription.model.d.ts +10 -0
- package/dist/core/objects/subscription/subscription.model.js +19 -1
- package/dist/core/objects/table/changes/table.base.d.ts +1 -1
- package/dist/core/objects/table/changes/table.security-label.d.ts +63 -0
- package/dist/core/objects/table/changes/table.security-label.js +134 -0
- package/dist/core/objects/table/changes/table.types.d.ts +2 -1
- package/dist/core/objects/table/table.diff.js +49 -0
- package/dist/core/objects/table/table.model.d.ts +30 -0
- package/dist/core/objects/table/table.model.js +34 -2
- package/dist/core/objects/type/composite-type/changes/composite-type.base.d.ts +1 -1
- package/dist/core/objects/type/composite-type/changes/composite-type.security-label.d.ts +28 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.security-label.js +61 -0
- package/dist/core/objects/type/composite-type/changes/composite-type.types.d.ts +2 -1
- package/dist/core/objects/type/composite-type/composite-type.diff.js +16 -0
- package/dist/core/objects/type/composite-type/composite-type.model.d.ts +22 -0
- package/dist/core/objects/type/composite-type/composite-type.model.js +22 -2
- package/dist/core/objects/type/enum/changes/enum.base.d.ts +1 -1
- package/dist/core/objects/type/enum/changes/enum.security-label.d.ts +28 -0
- package/dist/core/objects/type/enum/changes/enum.security-label.js +61 -0
- package/dist/core/objects/type/enum/changes/enum.types.d.ts +2 -1
- package/dist/core/objects/type/enum/enum.diff.js +16 -0
- package/dist/core/objects/type/enum/enum.model.d.ts +10 -0
- package/dist/core/objects/type/enum/enum.model.js +20 -1
- package/dist/core/objects/type/range/changes/range.base.d.ts +1 -1
- package/dist/core/objects/type/range/changes/range.security-label.d.ts +28 -0
- package/dist/core/objects/type/range/changes/range.security-label.js +61 -0
- package/dist/core/objects/type/range/changes/range.types.d.ts +2 -1
- package/dist/core/objects/type/range/range.diff.js +16 -0
- package/dist/core/objects/type/range/range.model.d.ts +10 -0
- package/dist/core/objects/type/range/range.model.js +19 -1
- package/dist/core/objects/utils.d.ts +1 -0
- package/dist/core/objects/utils.js +3 -0
- package/dist/core/objects/view/changes/view.base.d.ts +1 -1
- package/dist/core/objects/view/changes/view.security-label.d.ts +28 -0
- package/dist/core/objects/view/changes/view.security-label.js +61 -0
- package/dist/core/objects/view/changes/view.types.d.ts +2 -1
- package/dist/core/objects/view/view.diff.js +13 -0
- package/dist/core/objects/view/view.model.d.ts +26 -0
- package/dist/core/objects/view/view.model.js +20 -1
- package/dist/core/plan/sql-format/fixtures.js +1 -0
- package/dist/core/post-diff-normalization.d.ts +7 -0
- package/dist/core/post-diff-normalization.js +33 -4
- package/dist/core/sort/cycle-breakers.js +139 -17
- package/package.json +1 -1
- package/src/core/catalog.model.ts +1 -0
- package/src/core/integrations/filter/dsl.test.ts +27 -0
- package/src/core/integrations/filter/flatten.ts +16 -0
- package/src/core/objects/aggregate/aggregate.diff.ts +33 -0
- package/src/core/objects/aggregate/aggregate.model.ts +22 -1
- package/src/core/objects/aggregate/changes/aggregate.base.ts +5 -1
- package/src/core/objects/aggregate/changes/aggregate.security-label.ts +99 -0
- package/src/core/objects/aggregate/changes/aggregate.types.ts +3 -1
- package/src/core/objects/base.model.ts +2 -0
- package/src/core/objects/domain/changes/domain.base.ts +5 -1
- package/src/core/objects/domain/changes/domain.security-label.test.ts +56 -0
- package/src/core/objects/domain/changes/domain.security-label.ts +77 -0
- package/src/core/objects/domain/changes/domain.types.ts +3 -1
- package/src/core/objects/domain/domain.diff.ts +33 -0
- package/src/core/objects/domain/domain.model.ts +22 -1
- package/src/core/objects/event-trigger/changes/event-trigger.base.ts +1 -1
- package/src/core/objects/event-trigger/changes/event-trigger.security-label.ts +95 -0
- package/src/core/objects/event-trigger/changes/event-trigger.types.ts +3 -1
- package/src/core/objects/event-trigger/event-trigger.diff.ts +33 -0
- package/src/core/objects/event-trigger/event-trigger.model.ts +22 -1
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.ts +5 -1
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.security-label.ts +95 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +3 -1
- package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +33 -0
- package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +24 -1
- package/src/core/objects/materialized-view/changes/materialized-view.base.ts +5 -1
- package/src/core/objects/materialized-view/changes/materialized-view.security-label.test.ts +63 -0
- package/src/core/objects/materialized-view/changes/materialized-view.security-label.ts +95 -0
- package/src/core/objects/materialized-view/changes/materialized-view.types.ts +3 -1
- package/src/core/objects/materialized-view/materialized-view.diff.ts +37 -0
- package/src/core/objects/materialized-view/materialized-view.model.ts +25 -4
- package/src/core/objects/procedure/changes/procedure.base.ts +5 -1
- package/src/core/objects/procedure/changes/procedure.security-label.ts +105 -0
- package/src/core/objects/procedure/changes/procedure.types.ts +3 -1
- package/src/core/objects/procedure/procedure.diff.ts +33 -0
- package/src/core/objects/procedure/procedure.model.ts +23 -2
- package/src/core/objects/publication/changes/publication.base.ts +1 -1
- package/src/core/objects/publication/changes/publication.security-label.ts +95 -0
- package/src/core/objects/publication/changes/publication.types.ts +3 -1
- package/src/core/objects/publication/publication.diff.ts +33 -0
- package/src/core/objects/publication/publication.model.ts +24 -1
- package/src/core/objects/role/changes/role.base.ts +2 -1
- package/src/core/objects/role/changes/role.security-label.ts +77 -0
- package/src/core/objects/role/changes/role.types.ts +3 -1
- package/src/core/objects/role/role.diff.ts +33 -0
- package/src/core/objects/role/role.model.ts +32 -0
- package/src/core/objects/schema/changes/schema.alter.test.ts +1 -0
- package/src/core/objects/schema/changes/schema.base.ts +5 -1
- package/src/core/objects/schema/changes/schema.create.test.ts +1 -0
- package/src/core/objects/schema/changes/schema.drop.test.ts +1 -0
- package/src/core/objects/schema/changes/schema.security-label.test.ts +76 -0
- package/src/core/objects/schema/changes/schema.security-label.ts +77 -0
- package/src/core/objects/schema/changes/schema.types.ts +3 -1
- package/src/core/objects/schema/schema.diff.test.ts +1 -0
- package/src/core/objects/schema/schema.diff.ts +43 -1
- package/src/core/objects/schema/schema.model.ts +21 -1
- package/src/core/objects/security-label.types.test.ts +106 -0
- package/src/core/objects/security-label.types.ts +61 -0
- package/src/core/objects/sequence/changes/sequence.base.ts +5 -1
- package/src/core/objects/sequence/changes/sequence.security-label.test.ts +58 -0
- package/src/core/objects/sequence/changes/sequence.security-label.ts +92 -0
- package/src/core/objects/sequence/changes/sequence.types.ts +3 -1
- package/src/core/objects/sequence/sequence.diff.ts +33 -0
- package/src/core/objects/sequence/sequence.model.ts +22 -1
- package/src/core/objects/subscription/changes/subscription.base.ts +1 -1
- package/src/core/objects/subscription/changes/subscription.security-label.ts +95 -0
- package/src/core/objects/subscription/changes/subscription.types.ts +3 -1
- package/src/core/objects/subscription/subscription.diff.ts +33 -0
- package/src/core/objects/subscription/subscription.model.ts +22 -1
- package/src/core/objects/table/changes/table.base.ts +5 -1
- package/src/core/objects/table/changes/table.security-label.test.ts +140 -0
- package/src/core/objects/table/changes/table.security-label.ts +183 -0
- package/src/core/objects/table/changes/table.types.ts +3 -1
- package/src/core/objects/table/table.diff.ts +87 -0
- package/src/core/objects/table/table.model.ts +42 -2
- package/src/core/objects/type/composite-type/changes/composite-type.base.ts +5 -1
- package/src/core/objects/type/composite-type/changes/composite-type.security-label.ts +95 -0
- package/src/core/objects/type/composite-type/changes/composite-type.types.ts +3 -1
- package/src/core/objects/type/composite-type/composite-type.diff.ts +33 -0
- package/src/core/objects/type/composite-type/composite-type.model.ts +26 -2
- package/src/core/objects/type/enum/changes/enum.base.ts +5 -1
- package/src/core/objects/type/enum/changes/enum.security-label.ts +77 -0
- package/src/core/objects/type/enum/changes/enum.types.ts +3 -1
- package/src/core/objects/type/enum/enum.diff.ts +33 -0
- package/src/core/objects/type/enum/enum.model.ts +25 -1
- package/src/core/objects/type/range/changes/range.base.ts +5 -1
- package/src/core/objects/type/range/changes/range.security-label.ts +77 -0
- package/src/core/objects/type/range/changes/range.types.ts +3 -1
- package/src/core/objects/type/range/range.diff.ts +33 -0
- package/src/core/objects/type/range/range.model.ts +22 -1
- package/src/core/objects/utils.ts +3 -0
- package/src/core/objects/view/changes/view.base.ts +5 -1
- package/src/core/objects/view/changes/view.security-label.test.ts +64 -0
- package/src/core/objects/view/changes/view.security-label.ts +77 -0
- package/src/core/objects/view/changes/view.types.ts +3 -1
- package/src/core/objects/view/view.diff.ts +31 -0
- package/src/core/objects/view/view.model.ts +25 -2
- package/src/core/plan/sql-format/fixtures.ts +1 -0
- package/src/core/post-diff-normalization.test.ts +123 -0
- package/src/core/post-diff-normalization.ts +40 -4
- package/src/core/sort/cycle-breakers.test.ts +236 -2
- package/src/core/sort/cycle-breakers.ts +184 -24
- package/src/core/sort/sort-changes.test.ts +317 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { quoteLiteral } from "../../base.change.js";
|
|
2
|
+
import { stableId } from "../../utils.js";
|
|
3
|
+
import { CreateEventTriggerChange, DropEventTriggerChange, } from "./event-trigger.base.js";
|
|
4
|
+
export class CreateSecurityLabelOnEventTrigger extends CreateEventTriggerChange {
|
|
5
|
+
eventTrigger;
|
|
6
|
+
securityLabel;
|
|
7
|
+
scope = "security_label";
|
|
8
|
+
constructor(props) {
|
|
9
|
+
super();
|
|
10
|
+
this.eventTrigger = props.eventTrigger;
|
|
11
|
+
this.securityLabel = props.securityLabel;
|
|
12
|
+
}
|
|
13
|
+
get creates() {
|
|
14
|
+
return [
|
|
15
|
+
stableId.securityLabel(this.eventTrigger.stableId, this.securityLabel.provider),
|
|
16
|
+
];
|
|
17
|
+
}
|
|
18
|
+
get requires() {
|
|
19
|
+
return [this.eventTrigger.stableId];
|
|
20
|
+
}
|
|
21
|
+
serialize() {
|
|
22
|
+
return [
|
|
23
|
+
"SECURITY LABEL FOR",
|
|
24
|
+
this.securityLabel.provider,
|
|
25
|
+
"ON EVENT TRIGGER",
|
|
26
|
+
this.eventTrigger.name,
|
|
27
|
+
"IS",
|
|
28
|
+
quoteLiteral(this.securityLabel.label),
|
|
29
|
+
].join(" ");
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export class DropSecurityLabelOnEventTrigger extends DropEventTriggerChange {
|
|
33
|
+
eventTrigger;
|
|
34
|
+
securityLabel;
|
|
35
|
+
scope = "security_label";
|
|
36
|
+
constructor(props) {
|
|
37
|
+
super();
|
|
38
|
+
this.eventTrigger = props.eventTrigger;
|
|
39
|
+
this.securityLabel = props.securityLabel;
|
|
40
|
+
}
|
|
41
|
+
get drops() {
|
|
42
|
+
return [
|
|
43
|
+
stableId.securityLabel(this.eventTrigger.stableId, this.securityLabel.provider),
|
|
44
|
+
];
|
|
45
|
+
}
|
|
46
|
+
get requires() {
|
|
47
|
+
return [
|
|
48
|
+
stableId.securityLabel(this.eventTrigger.stableId, this.securityLabel.provider),
|
|
49
|
+
this.eventTrigger.stableId,
|
|
50
|
+
];
|
|
51
|
+
}
|
|
52
|
+
serialize() {
|
|
53
|
+
return [
|
|
54
|
+
"SECURITY LABEL FOR",
|
|
55
|
+
this.securityLabel.provider,
|
|
56
|
+
"ON EVENT TRIGGER",
|
|
57
|
+
this.eventTrigger.name,
|
|
58
|
+
"IS NULL",
|
|
59
|
+
].join(" ");
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -2,5 +2,6 @@ import type { AlterEventTrigger } from "./event-trigger.alter.ts";
|
|
|
2
2
|
import type { CommentEventTrigger } from "./event-trigger.comment.ts";
|
|
3
3
|
import type { CreateEventTrigger } from "./event-trigger.create.ts";
|
|
4
4
|
import type { DropEventTrigger } from "./event-trigger.drop.ts";
|
|
5
|
+
import type { SecurityLabelEventTrigger } from "./event-trigger.security-label.ts";
|
|
5
6
|
/** Union of all event-trigger-related change variants (`objectType: "event_trigger"`). @category Change Types */
|
|
6
|
-
export type EventTriggerChange = AlterEventTrigger | CommentEventTrigger | CreateEventTrigger | DropEventTrigger;
|
|
7
|
+
export type EventTriggerChange = AlterEventTrigger | CommentEventTrigger | CreateEventTrigger | DropEventTrigger | SecurityLabelEventTrigger;
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { diffObjects } from "../base.diff.js";
|
|
2
|
+
import { diffSecurityLabels } from "../security-label.types.js";
|
|
2
3
|
import { deepEqual, hasNonAlterableChanges } from "../utils.js";
|
|
3
4
|
import { AlterEventTriggerChangeOwner, AlterEventTriggerSetEnabled, } from "./changes/event-trigger.alter.js";
|
|
4
5
|
import { CreateCommentOnEventTrigger, DropCommentOnEventTrigger, } from "./changes/event-trigger.comment.js";
|
|
5
6
|
import { CreateEventTrigger } from "./changes/event-trigger.create.js";
|
|
6
7
|
import { DropEventTrigger } from "./changes/event-trigger.drop.js";
|
|
8
|
+
import { CreateSecurityLabelOnEventTrigger, DropSecurityLabelOnEventTrigger, } from "./changes/event-trigger.security-label.js";
|
|
7
9
|
/**
|
|
8
10
|
* Diff two sets of event triggers from main and branch catalogs.
|
|
9
11
|
*
|
|
@@ -29,6 +31,12 @@ export function diffEventTriggers(ctx, main, branch) {
|
|
|
29
31
|
if (eventTrigger.comment !== null) {
|
|
30
32
|
changes.push(new CreateCommentOnEventTrigger({ eventTrigger }));
|
|
31
33
|
}
|
|
34
|
+
for (const label of eventTrigger.security_labels) {
|
|
35
|
+
changes.push(new CreateSecurityLabelOnEventTrigger({
|
|
36
|
+
eventTrigger,
|
|
37
|
+
securityLabel: label,
|
|
38
|
+
}));
|
|
39
|
+
}
|
|
32
40
|
}
|
|
33
41
|
for (const eventTriggerId of dropped) {
|
|
34
42
|
changes.push(new DropEventTrigger({ eventTrigger: main[eventTriggerId] }));
|
|
@@ -76,6 +84,14 @@ export function diffEventTriggers(ctx, main, branch) {
|
|
|
76
84
|
}));
|
|
77
85
|
}
|
|
78
86
|
}
|
|
87
|
+
// SECURITY LABELS
|
|
88
|
+
changes.push(...diffSecurityLabels(mainEventTrigger.security_labels, branchEventTrigger.security_labels, (securityLabel) => new CreateSecurityLabelOnEventTrigger({
|
|
89
|
+
eventTrigger: branchEventTrigger,
|
|
90
|
+
securityLabel,
|
|
91
|
+
}), (securityLabel) => new DropSecurityLabelOnEventTrigger({
|
|
92
|
+
eventTrigger: mainEventTrigger,
|
|
93
|
+
securityLabel,
|
|
94
|
+
})));
|
|
79
95
|
}
|
|
80
96
|
return changes;
|
|
81
97
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Pool } from "pg";
|
|
2
2
|
import z from "zod";
|
|
3
3
|
import { BasePgModel } from "../base.model.ts";
|
|
4
|
+
import { type SecurityLabelProps } from "../security-label.types.ts";
|
|
4
5
|
declare const eventTriggerPropsSchema: z.ZodObject<{
|
|
5
6
|
name: z.ZodString;
|
|
6
7
|
event: z.ZodString;
|
|
@@ -15,6 +16,10 @@ declare const eventTriggerPropsSchema: z.ZodObject<{
|
|
|
15
16
|
tags: z.ZodNullable<z.ZodArray<z.ZodString>>;
|
|
16
17
|
owner: z.ZodString;
|
|
17
18
|
comment: z.ZodNullable<z.ZodString>;
|
|
19
|
+
security_labels: z.ZodOptional<z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
20
|
+
provider: z.ZodString;
|
|
21
|
+
label: z.ZodString;
|
|
22
|
+
}, z.z.core.$strip>>>>;
|
|
18
23
|
}, z.z.core.$strip>;
|
|
19
24
|
export type EventTriggerProps = z.infer<typeof eventTriggerPropsSchema>;
|
|
20
25
|
export declare class EventTrigger extends BasePgModel {
|
|
@@ -26,6 +31,7 @@ export declare class EventTrigger extends BasePgModel {
|
|
|
26
31
|
readonly tags: EventTriggerProps["tags"];
|
|
27
32
|
readonly owner: EventTriggerProps["owner"];
|
|
28
33
|
readonly comment: EventTriggerProps["comment"];
|
|
34
|
+
readonly security_labels: SecurityLabelProps[];
|
|
29
35
|
constructor(props: EventTriggerProps);
|
|
30
36
|
get stableId(): `eventTrigger:${string}`;
|
|
31
37
|
get identityFields(): {
|
|
@@ -39,6 +45,10 @@ export declare class EventTrigger extends BasePgModel {
|
|
|
39
45
|
tags: string[] | null;
|
|
40
46
|
owner: string;
|
|
41
47
|
comment: string | null;
|
|
48
|
+
security_labels: {
|
|
49
|
+
provider: string;
|
|
50
|
+
label: string;
|
|
51
|
+
}[];
|
|
42
52
|
};
|
|
43
53
|
}
|
|
44
54
|
export declare function extractEventTriggers(pool: Pool): Promise<EventTrigger[]>;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { sql } from "@ts-safeql/sql-tag";
|
|
2
2
|
import z from "zod";
|
|
3
3
|
import { BasePgModel } from "../base.model.js";
|
|
4
|
+
import { securityLabelPropsSchema, } from "../security-label.types.js";
|
|
4
5
|
const EventTriggerEnabledSchema = z.enum([
|
|
5
6
|
"O", // ORIGIN - trigger fires in origin mode
|
|
6
7
|
"D", // DISABLED - trigger does not fire
|
|
@@ -16,6 +17,7 @@ const eventTriggerPropsSchema = z.object({
|
|
|
16
17
|
tags: z.array(z.string()).nullable(),
|
|
17
18
|
owner: z.string(),
|
|
18
19
|
comment: z.string().nullable(),
|
|
20
|
+
security_labels: z.array(securityLabelPropsSchema).default([]).optional(),
|
|
19
21
|
});
|
|
20
22
|
export class EventTrigger extends BasePgModel {
|
|
21
23
|
name;
|
|
@@ -26,6 +28,7 @@ export class EventTrigger extends BasePgModel {
|
|
|
26
28
|
tags;
|
|
27
29
|
owner;
|
|
28
30
|
comment;
|
|
31
|
+
security_labels;
|
|
29
32
|
constructor(props) {
|
|
30
33
|
super();
|
|
31
34
|
// Identity fields
|
|
@@ -38,6 +41,7 @@ export class EventTrigger extends BasePgModel {
|
|
|
38
41
|
this.tags = props.tags;
|
|
39
42
|
this.owner = props.owner;
|
|
40
43
|
this.comment = props.comment;
|
|
44
|
+
this.security_labels = props.security_labels ?? [];
|
|
41
45
|
}
|
|
42
46
|
get stableId() {
|
|
43
47
|
return `eventTrigger:${this.name}`;
|
|
@@ -56,6 +60,7 @@ export class EventTrigger extends BasePgModel {
|
|
|
56
60
|
tags: this.tags,
|
|
57
61
|
owner: this.owner,
|
|
58
62
|
comment: this.comment,
|
|
63
|
+
security_labels: this.security_labels,
|
|
59
64
|
};
|
|
60
65
|
}
|
|
61
66
|
}
|
|
@@ -75,7 +80,20 @@ select
|
|
|
75
80
|
et.evtenabled as enabled,
|
|
76
81
|
et.evttags as tags,
|
|
77
82
|
et.evtowner::regrole::text as owner,
|
|
78
|
-
obj_description(et.oid, 'pg_event_trigger') as comment
|
|
83
|
+
obj_description(et.oid, 'pg_event_trigger') as comment,
|
|
84
|
+
coalesce(
|
|
85
|
+
(
|
|
86
|
+
select json_agg(
|
|
87
|
+
json_build_object('provider', sl.provider, 'label', sl.label)
|
|
88
|
+
order by sl.provider
|
|
89
|
+
)
|
|
90
|
+
from pg_catalog.pg_seclabel sl
|
|
91
|
+
where sl.objoid = et.oid
|
|
92
|
+
and sl.classoid = 'pg_event_trigger'::regclass
|
|
93
|
+
and sl.objsubid = 0
|
|
94
|
+
),
|
|
95
|
+
'[]'::json
|
|
96
|
+
) as security_labels
|
|
79
97
|
from pg_catalog.pg_event_trigger et
|
|
80
98
|
join pg_catalog.pg_proc p on p.oid = et.evtfoid
|
|
81
99
|
left join extension_oids e on e.objid = et.oid
|
package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { BaseChange } from "../../../base.change.ts";
|
|
|
2
2
|
import type { ForeignTable } from "../foreign-table.model.ts";
|
|
3
3
|
declare abstract class BaseForeignTableChange extends BaseChange {
|
|
4
4
|
abstract readonly foreignTable: ForeignTable;
|
|
5
|
-
abstract readonly scope: "object" | "comment" | "privilege";
|
|
5
|
+
abstract readonly scope: "object" | "comment" | "privilege" | "security_label";
|
|
6
6
|
readonly objectType: "foreign_table";
|
|
7
7
|
}
|
|
8
8
|
export declare abstract class CreateForeignTableChange extends BaseForeignTableChange {
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { SecurityLabelProps } from "../../../security-label.types.ts";
|
|
2
|
+
import type { ForeignTable } from "../foreign-table.model.ts";
|
|
3
|
+
import { CreateForeignTableChange, DropForeignTableChange } from "./foreign-table.base.ts";
|
|
4
|
+
export type SecurityLabelForeignTable = CreateSecurityLabelOnForeignTable | DropSecurityLabelOnForeignTable;
|
|
5
|
+
export declare class CreateSecurityLabelOnForeignTable extends CreateForeignTableChange {
|
|
6
|
+
readonly foreignTable: ForeignTable;
|
|
7
|
+
readonly securityLabel: SecurityLabelProps;
|
|
8
|
+
readonly scope: "security_label";
|
|
9
|
+
constructor(props: {
|
|
10
|
+
foreignTable: ForeignTable;
|
|
11
|
+
securityLabel: SecurityLabelProps;
|
|
12
|
+
});
|
|
13
|
+
get creates(): `securityLabel:${string}::provider:${string}`[];
|
|
14
|
+
get requires(): `foreignTable:${string}`[];
|
|
15
|
+
serialize(): string;
|
|
16
|
+
}
|
|
17
|
+
export declare class DropSecurityLabelOnForeignTable extends DropForeignTableChange {
|
|
18
|
+
readonly foreignTable: ForeignTable;
|
|
19
|
+
readonly securityLabel: SecurityLabelProps;
|
|
20
|
+
readonly scope: "security_label";
|
|
21
|
+
constructor(props: {
|
|
22
|
+
foreignTable: ForeignTable;
|
|
23
|
+
securityLabel: SecurityLabelProps;
|
|
24
|
+
});
|
|
25
|
+
get drops(): `securityLabel:${string}::provider:${string}`[];
|
|
26
|
+
get requires(): (`securityLabel:${string}::provider:${string}` | `foreignTable:${string}`)[];
|
|
27
|
+
serialize(): string;
|
|
28
|
+
}
|
package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.security-label.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { quoteLiteral } from "../../../base.change.js";
|
|
2
|
+
import { stableId } from "../../../utils.js";
|
|
3
|
+
import { CreateForeignTableChange, DropForeignTableChange, } from "./foreign-table.base.js";
|
|
4
|
+
export class CreateSecurityLabelOnForeignTable extends CreateForeignTableChange {
|
|
5
|
+
foreignTable;
|
|
6
|
+
securityLabel;
|
|
7
|
+
scope = "security_label";
|
|
8
|
+
constructor(props) {
|
|
9
|
+
super();
|
|
10
|
+
this.foreignTable = props.foreignTable;
|
|
11
|
+
this.securityLabel = props.securityLabel;
|
|
12
|
+
}
|
|
13
|
+
get creates() {
|
|
14
|
+
return [
|
|
15
|
+
stableId.securityLabel(this.foreignTable.stableId, this.securityLabel.provider),
|
|
16
|
+
];
|
|
17
|
+
}
|
|
18
|
+
get requires() {
|
|
19
|
+
return [this.foreignTable.stableId];
|
|
20
|
+
}
|
|
21
|
+
serialize() {
|
|
22
|
+
return [
|
|
23
|
+
"SECURITY LABEL FOR",
|
|
24
|
+
this.securityLabel.provider,
|
|
25
|
+
"ON FOREIGN TABLE",
|
|
26
|
+
`${this.foreignTable.schema}.${this.foreignTable.name}`,
|
|
27
|
+
"IS",
|
|
28
|
+
quoteLiteral(this.securityLabel.label),
|
|
29
|
+
].join(" ");
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export class DropSecurityLabelOnForeignTable extends DropForeignTableChange {
|
|
33
|
+
foreignTable;
|
|
34
|
+
securityLabel;
|
|
35
|
+
scope = "security_label";
|
|
36
|
+
constructor(props) {
|
|
37
|
+
super();
|
|
38
|
+
this.foreignTable = props.foreignTable;
|
|
39
|
+
this.securityLabel = props.securityLabel;
|
|
40
|
+
}
|
|
41
|
+
get drops() {
|
|
42
|
+
return [
|
|
43
|
+
stableId.securityLabel(this.foreignTable.stableId, this.securityLabel.provider),
|
|
44
|
+
];
|
|
45
|
+
}
|
|
46
|
+
get requires() {
|
|
47
|
+
return [
|
|
48
|
+
stableId.securityLabel(this.foreignTable.stableId, this.securityLabel.provider),
|
|
49
|
+
this.foreignTable.stableId,
|
|
50
|
+
];
|
|
51
|
+
}
|
|
52
|
+
serialize() {
|
|
53
|
+
return [
|
|
54
|
+
"SECURITY LABEL FOR",
|
|
55
|
+
this.securityLabel.provider,
|
|
56
|
+
"ON FOREIGN TABLE",
|
|
57
|
+
`${this.foreignTable.schema}.${this.foreignTable.name}`,
|
|
58
|
+
"IS NULL",
|
|
59
|
+
].join(" ");
|
|
60
|
+
}
|
|
61
|
+
}
|
package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.d.ts
CHANGED
|
@@ -3,5 +3,6 @@ import type { CommentForeignTable } from "./foreign-table.comment.ts";
|
|
|
3
3
|
import type { CreateForeignTable } from "./foreign-table.create.ts";
|
|
4
4
|
import type { DropForeignTable } from "./foreign-table.drop.ts";
|
|
5
5
|
import type { ForeignTablePrivilege } from "./foreign-table.privilege.ts";
|
|
6
|
+
import type { SecurityLabelForeignTable } from "./foreign-table.security-label.ts";
|
|
6
7
|
/** Union of all foreign-table-related change variants (`objectType: "foreign_table"`). @category Change Types */
|
|
7
|
-
export type ForeignTableChange = AlterForeignTable | CommentForeignTable | CreateForeignTable | DropForeignTable | ForeignTablePrivilege;
|
|
8
|
+
export type ForeignTableChange = AlterForeignTable | CommentForeignTable | CreateForeignTable | DropForeignTable | ForeignTablePrivilege | SecurityLabelForeignTable;
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { diffObjects } from "../../base.diff.js";
|
|
2
2
|
import { diffPrivileges, emitObjectPrivilegeChanges, filterPublicBuiltInDefaults, } from "../../base.privilege-diff.js";
|
|
3
|
+
import { diffSecurityLabels } from "../../security-label.types.js";
|
|
3
4
|
import { AlterForeignTableAddColumn, AlterForeignTableAlterColumnDropDefault, AlterForeignTableAlterColumnDropNotNull, AlterForeignTableAlterColumnSetDefault, AlterForeignTableAlterColumnSetNotNull, AlterForeignTableAlterColumnType, AlterForeignTableChangeOwner, AlterForeignTableDropColumn, AlterForeignTableSetOptions, } from "./changes/foreign-table.alter.js";
|
|
4
5
|
import { CreateCommentOnForeignTable, DropCommentOnForeignTable, } from "./changes/foreign-table.comment.js";
|
|
5
6
|
import { CreateForeignTable } from "./changes/foreign-table.create.js";
|
|
6
7
|
import { DropForeignTable } from "./changes/foreign-table.drop.js";
|
|
7
8
|
import { GrantForeignTablePrivileges, RevokeForeignTablePrivileges, RevokeGrantOptionForeignTablePrivileges, } from "./changes/foreign-table.privilege.js";
|
|
9
|
+
import { CreateSecurityLabelOnForeignTable, DropSecurityLabelOnForeignTable, } from "./changes/foreign-table.security-label.js";
|
|
8
10
|
/**
|
|
9
11
|
* Diff two sets of foreign tables from main and branch catalogs.
|
|
10
12
|
*
|
|
@@ -30,6 +32,12 @@ export function diffForeignTables(ctx, main, branch) {
|
|
|
30
32
|
if (createdTable.comment !== null) {
|
|
31
33
|
changes.push(new CreateCommentOnForeignTable({ foreignTable: createdTable }));
|
|
32
34
|
}
|
|
35
|
+
for (const label of createdTable.security_labels) {
|
|
36
|
+
changes.push(new CreateSecurityLabelOnForeignTable({
|
|
37
|
+
foreignTable: createdTable,
|
|
38
|
+
securityLabel: label,
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
33
41
|
// PRIVILEGES: For created objects, compare against default privileges state
|
|
34
42
|
const effectiveDefaults = ctx.defaultPrivilegeState.getEffectiveDefaults(ctx.currentUser, "foreign_table", createdTable.schema ?? "");
|
|
35
43
|
const creatorFilteredDefaults = createdTable.owner !== ctx.currentUser
|
|
@@ -148,6 +156,14 @@ export function diffForeignTables(ctx, main, branch) {
|
|
|
148
156
|
changes.push(new CreateCommentOnForeignTable({ foreignTable: branchTable }));
|
|
149
157
|
}
|
|
150
158
|
}
|
|
159
|
+
// SECURITY LABELS
|
|
160
|
+
changes.push(...diffSecurityLabels(mainTable.security_labels, branchTable.security_labels, (securityLabel) => new CreateSecurityLabelOnForeignTable({
|
|
161
|
+
foreignTable: branchTable,
|
|
162
|
+
securityLabel,
|
|
163
|
+
}), (securityLabel) => new DropSecurityLabelOnForeignTable({
|
|
164
|
+
foreignTable: mainTable,
|
|
165
|
+
securityLabel,
|
|
166
|
+
})));
|
|
151
167
|
// PRIVILEGES
|
|
152
168
|
const mainPrivilegesFiltered = filterPublicBuiltInDefaults("foreign_table", mainTable.privileges);
|
|
153
169
|
const branchPrivilegesFiltered = filterPublicBuiltInDefaults("foreign_table", branchTable.privileges);
|
|
@@ -2,6 +2,7 @@ import type { Pool } from "pg";
|
|
|
2
2
|
import z from "zod";
|
|
3
3
|
import { BasePgModel, type TableLikeObject } from "../../base.model.ts";
|
|
4
4
|
import { type PrivilegeProps } from "../../base.privilege-diff.ts";
|
|
5
|
+
import { type SecurityLabelProps } from "../../security-label.types.ts";
|
|
5
6
|
/**
|
|
6
7
|
* All properties exposed by CREATE FOREIGN TABLE statement are included in diff output.
|
|
7
8
|
* https://www.postgresql.org/docs/17/sql-createforeigntable.html
|
|
@@ -36,6 +37,10 @@ declare const foreignTablePropsSchema: z.ZodObject<{
|
|
|
36
37
|
collation: z.ZodNullable<z.ZodString>;
|
|
37
38
|
default: z.ZodNullable<z.ZodString>;
|
|
38
39
|
comment: z.ZodNullable<z.ZodString>;
|
|
40
|
+
security_labels: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
41
|
+
provider: z.ZodString;
|
|
42
|
+
label: z.ZodString;
|
|
43
|
+
}, z.z.core.$strip>>>;
|
|
39
44
|
}, z.z.core.$strip>>;
|
|
40
45
|
privileges: z.ZodArray<z.ZodObject<{
|
|
41
46
|
grantee: z.ZodString;
|
|
@@ -43,6 +48,10 @@ declare const foreignTablePropsSchema: z.ZodObject<{
|
|
|
43
48
|
grantable: z.ZodBoolean;
|
|
44
49
|
columns: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString>>>;
|
|
45
50
|
}, z.z.core.$strip>>;
|
|
51
|
+
security_labels: z.ZodOptional<z.ZodDefault<z.ZodArray<z.ZodObject<{
|
|
52
|
+
provider: z.ZodString;
|
|
53
|
+
label: z.ZodString;
|
|
54
|
+
}, z.z.core.$strip>>>>;
|
|
46
55
|
}, z.z.core.$strip>;
|
|
47
56
|
type ForeignTablePrivilegeProps = PrivilegeProps;
|
|
48
57
|
export type ForeignTableProps = z.infer<typeof foreignTablePropsSchema>;
|
|
@@ -55,6 +64,7 @@ export declare class ForeignTable extends BasePgModel implements TableLikeObject
|
|
|
55
64
|
readonly comment: ForeignTableProps["comment"];
|
|
56
65
|
readonly columns: ForeignTableProps["columns"];
|
|
57
66
|
readonly privileges: ForeignTablePrivilegeProps[];
|
|
67
|
+
readonly security_labels: SecurityLabelProps[];
|
|
58
68
|
constructor(props: ForeignTableProps);
|
|
59
69
|
get stableId(): `foreignTable:${string}`;
|
|
60
70
|
get identityFields(): {
|
|
@@ -83,6 +93,10 @@ export declare class ForeignTable extends BasePgModel implements TableLikeObject
|
|
|
83
93
|
collation: string | null;
|
|
84
94
|
default: string | null;
|
|
85
95
|
comment: string | null;
|
|
96
|
+
security_labels?: {
|
|
97
|
+
provider: string;
|
|
98
|
+
label: string;
|
|
99
|
+
}[] | undefined;
|
|
86
100
|
}[];
|
|
87
101
|
privileges: {
|
|
88
102
|
grantee: string;
|
|
@@ -90,6 +104,10 @@ export declare class ForeignTable extends BasePgModel implements TableLikeObject
|
|
|
90
104
|
grantable: boolean;
|
|
91
105
|
columns?: string[] | null | undefined;
|
|
92
106
|
}[];
|
|
107
|
+
security_labels: {
|
|
108
|
+
provider: string;
|
|
109
|
+
label: string;
|
|
110
|
+
}[];
|
|
93
111
|
};
|
|
94
112
|
stableSnapshot(): {
|
|
95
113
|
identity: {
|
|
@@ -100,6 +118,10 @@ export declare class ForeignTable extends BasePgModel implements TableLikeObject
|
|
|
100
118
|
columns: {
|
|
101
119
|
[x: string]: unknown;
|
|
102
120
|
}[];
|
|
121
|
+
security_labels: {
|
|
122
|
+
provider: string;
|
|
123
|
+
label: string;
|
|
124
|
+
}[];
|
|
103
125
|
owner: string;
|
|
104
126
|
server: string;
|
|
105
127
|
options: string[] | null;
|
|
@@ -2,6 +2,7 @@ import { sql } from "@ts-safeql/sql-tag";
|
|
|
2
2
|
import z from "zod";
|
|
3
3
|
import { BasePgModel, columnPropsSchema, } from "../../base.model.js";
|
|
4
4
|
import { privilegePropsSchema, } from "../../base.privilege-diff.js";
|
|
5
|
+
import { normalizeSecurityLabels, securityLabelPropsSchema, } from "../../security-label.types.js";
|
|
5
6
|
/**
|
|
6
7
|
* All properties exposed by CREATE FOREIGN TABLE statement are included in diff output.
|
|
7
8
|
* https://www.postgresql.org/docs/17/sql-createforeigntable.html
|
|
@@ -21,6 +22,7 @@ const foreignTablePropsSchema = z.object({
|
|
|
21
22
|
comment: z.string().nullable(),
|
|
22
23
|
columns: z.array(columnPropsSchema),
|
|
23
24
|
privileges: z.array(privilegePropsSchema),
|
|
25
|
+
security_labels: z.array(securityLabelPropsSchema).default([]).optional(),
|
|
24
26
|
});
|
|
25
27
|
export class ForeignTable extends BasePgModel {
|
|
26
28
|
schema;
|
|
@@ -31,6 +33,7 @@ export class ForeignTable extends BasePgModel {
|
|
|
31
33
|
comment;
|
|
32
34
|
columns;
|
|
33
35
|
privileges;
|
|
36
|
+
security_labels;
|
|
34
37
|
constructor(props) {
|
|
35
38
|
super();
|
|
36
39
|
// Identity fields
|
|
@@ -43,6 +46,7 @@ export class ForeignTable extends BasePgModel {
|
|
|
43
46
|
this.comment = props.comment;
|
|
44
47
|
this.columns = props.columns;
|
|
45
48
|
this.privileges = props.privileges;
|
|
49
|
+
this.security_labels = props.security_labels ?? [];
|
|
46
50
|
}
|
|
47
51
|
get stableId() {
|
|
48
52
|
return `foreignTable:${this.schema}.${this.name}`;
|
|
@@ -61,6 +65,7 @@ export class ForeignTable extends BasePgModel {
|
|
|
61
65
|
comment: this.comment,
|
|
62
66
|
columns: this.columns,
|
|
63
67
|
privileges: this.privileges,
|
|
68
|
+
security_labels: this.security_labels,
|
|
64
69
|
};
|
|
65
70
|
}
|
|
66
71
|
stableSnapshot() {
|
|
@@ -79,6 +84,7 @@ export class ForeignTable extends BasePgModel {
|
|
|
79
84
|
data: {
|
|
80
85
|
...this.dataFields,
|
|
81
86
|
columns: normalizeColumns(),
|
|
87
|
+
security_labels: normalizeSecurityLabels(this.security_labels),
|
|
82
88
|
},
|
|
83
89
|
};
|
|
84
90
|
}
|
|
@@ -181,7 +187,20 @@ export async function extractForeignTables(pool) {
|
|
|
181
187
|
join lateral aclexplode(src.acl) as x(grantor, grantee, privilege_type, is_grantable) on true
|
|
182
188
|
group by x.grantee, x.privilege_type
|
|
183
189
|
) as grp
|
|
184
|
-
), '[]') as privileges
|
|
190
|
+
), '[]') as privileges,
|
|
191
|
+
coalesce(
|
|
192
|
+
(
|
|
193
|
+
select json_agg(
|
|
194
|
+
json_build_object('provider', sl.provider, 'label', sl.label)
|
|
195
|
+
order by sl.provider
|
|
196
|
+
)
|
|
197
|
+
from pg_catalog.pg_seclabel sl
|
|
198
|
+
where sl.objoid = ft.oid
|
|
199
|
+
and sl.classoid = 'pg_class'::regclass
|
|
200
|
+
and sl.objsubid = 0
|
|
201
|
+
),
|
|
202
|
+
'[]'::json
|
|
203
|
+
) as security_labels
|
|
185
204
|
from
|
|
186
205
|
foreign_tables ft
|
|
187
206
|
left join pg_attribute a on a.attrelid = ft.oid and a.attnum > 0 and not a.attisdropped
|
|
@@ -2,7 +2,7 @@ import { BaseChange } from "../../base.change.ts";
|
|
|
2
2
|
import type { MaterializedView } from "../materialized-view.model.ts";
|
|
3
3
|
declare abstract class BaseMaterializedViewChange extends BaseChange {
|
|
4
4
|
abstract readonly materializedView: MaterializedView;
|
|
5
|
-
abstract readonly scope: "object" | "comment" | "privilege";
|
|
5
|
+
abstract readonly scope: "object" | "comment" | "privilege" | "security_label";
|
|
6
6
|
readonly objectType: "materialized_view";
|
|
7
7
|
}
|
|
8
8
|
export declare abstract class CreateMaterializedViewChange extends BaseMaterializedViewChange {
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { SecurityLabelProps } from "../../security-label.types.ts";
|
|
2
|
+
import type { MaterializedView } from "../materialized-view.model.ts";
|
|
3
|
+
import { CreateMaterializedViewChange, DropMaterializedViewChange } from "./materialized-view.base.ts";
|
|
4
|
+
export type SecurityLabelMaterializedView = CreateSecurityLabelOnMaterializedView | DropSecurityLabelOnMaterializedView;
|
|
5
|
+
export declare class CreateSecurityLabelOnMaterializedView extends CreateMaterializedViewChange {
|
|
6
|
+
readonly materializedView: MaterializedView;
|
|
7
|
+
readonly securityLabel: SecurityLabelProps;
|
|
8
|
+
readonly scope: "security_label";
|
|
9
|
+
constructor(props: {
|
|
10
|
+
materializedView: MaterializedView;
|
|
11
|
+
securityLabel: SecurityLabelProps;
|
|
12
|
+
});
|
|
13
|
+
get creates(): `securityLabel:${string}::provider:${string}`[];
|
|
14
|
+
get requires(): `materializedView:${string}`[];
|
|
15
|
+
serialize(): string;
|
|
16
|
+
}
|
|
17
|
+
export declare class DropSecurityLabelOnMaterializedView extends DropMaterializedViewChange {
|
|
18
|
+
readonly materializedView: MaterializedView;
|
|
19
|
+
readonly securityLabel: SecurityLabelProps;
|
|
20
|
+
readonly scope: "security_label";
|
|
21
|
+
constructor(props: {
|
|
22
|
+
materializedView: MaterializedView;
|
|
23
|
+
securityLabel: SecurityLabelProps;
|
|
24
|
+
});
|
|
25
|
+
get drops(): `securityLabel:${string}::provider:${string}`[];
|
|
26
|
+
get requires(): (`securityLabel:${string}::provider:${string}` | `materializedView:${string}`)[];
|
|
27
|
+
serialize(): string;
|
|
28
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { quoteLiteral } from "../../base.change.js";
|
|
2
|
+
import { stableId } from "../../utils.js";
|
|
3
|
+
import { CreateMaterializedViewChange, DropMaterializedViewChange, } from "./materialized-view.base.js";
|
|
4
|
+
export class CreateSecurityLabelOnMaterializedView extends CreateMaterializedViewChange {
|
|
5
|
+
materializedView;
|
|
6
|
+
securityLabel;
|
|
7
|
+
scope = "security_label";
|
|
8
|
+
constructor(props) {
|
|
9
|
+
super();
|
|
10
|
+
this.materializedView = props.materializedView;
|
|
11
|
+
this.securityLabel = props.securityLabel;
|
|
12
|
+
}
|
|
13
|
+
get creates() {
|
|
14
|
+
return [
|
|
15
|
+
stableId.securityLabel(this.materializedView.stableId, this.securityLabel.provider),
|
|
16
|
+
];
|
|
17
|
+
}
|
|
18
|
+
get requires() {
|
|
19
|
+
return [this.materializedView.stableId];
|
|
20
|
+
}
|
|
21
|
+
serialize() {
|
|
22
|
+
return [
|
|
23
|
+
"SECURITY LABEL FOR",
|
|
24
|
+
this.securityLabel.provider,
|
|
25
|
+
"ON MATERIALIZED VIEW",
|
|
26
|
+
`${this.materializedView.schema}.${this.materializedView.name}`,
|
|
27
|
+
"IS",
|
|
28
|
+
quoteLiteral(this.securityLabel.label),
|
|
29
|
+
].join(" ");
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export class DropSecurityLabelOnMaterializedView extends DropMaterializedViewChange {
|
|
33
|
+
materializedView;
|
|
34
|
+
securityLabel;
|
|
35
|
+
scope = "security_label";
|
|
36
|
+
constructor(props) {
|
|
37
|
+
super();
|
|
38
|
+
this.materializedView = props.materializedView;
|
|
39
|
+
this.securityLabel = props.securityLabel;
|
|
40
|
+
}
|
|
41
|
+
get drops() {
|
|
42
|
+
return [
|
|
43
|
+
stableId.securityLabel(this.materializedView.stableId, this.securityLabel.provider),
|
|
44
|
+
];
|
|
45
|
+
}
|
|
46
|
+
get requires() {
|
|
47
|
+
return [
|
|
48
|
+
stableId.securityLabel(this.materializedView.stableId, this.securityLabel.provider),
|
|
49
|
+
this.materializedView.stableId,
|
|
50
|
+
];
|
|
51
|
+
}
|
|
52
|
+
serialize() {
|
|
53
|
+
return [
|
|
54
|
+
"SECURITY LABEL FOR",
|
|
55
|
+
this.securityLabel.provider,
|
|
56
|
+
"ON MATERIALIZED VIEW",
|
|
57
|
+
`${this.materializedView.schema}.${this.materializedView.name}`,
|
|
58
|
+
"IS NULL",
|
|
59
|
+
].join(" ");
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -3,5 +3,6 @@ import type { CommentMaterializedView } from "./materialized-view.comment.ts";
|
|
|
3
3
|
import type { CreateMaterializedView } from "./materialized-view.create.ts";
|
|
4
4
|
import type { DropMaterializedView } from "./materialized-view.drop.ts";
|
|
5
5
|
import type { MaterializedViewPrivilege } from "./materialized-view.privilege.ts";
|
|
6
|
+
import type { SecurityLabelMaterializedView } from "./materialized-view.security-label.ts";
|
|
6
7
|
/** Union of all materialized-view-related change variants (`objectType: "materialized_view"`). @category Change Types */
|
|
7
|
-
export type MaterializedViewChange = AlterMaterializedView | CommentMaterializedView | CreateMaterializedView | DropMaterializedView | MaterializedViewPrivilege;
|
|
8
|
+
export type MaterializedViewChange = AlterMaterializedView | CommentMaterializedView | CreateMaterializedView | DropMaterializedView | MaterializedViewPrivilege | SecurityLabelMaterializedView;
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { diffObjects } from "../base.diff.js";
|
|
2
2
|
import { diffPrivileges, emitColumnPrivilegeChanges, } from "../base.privilege-diff.js";
|
|
3
|
+
import { diffSecurityLabels } from "../security-label.types.js";
|
|
3
4
|
import { deepEqual, hasNonAlterableChanges } from "../utils.js";
|
|
4
5
|
import { AlterMaterializedViewChangeOwner, AlterMaterializedViewSetStorageParams, } from "./changes/materialized-view.alter.js";
|
|
5
6
|
import { CreateCommentOnMaterializedView, CreateCommentOnMaterializedViewColumn, DropCommentOnMaterializedView, DropCommentOnMaterializedViewColumn, } from "./changes/materialized-view.comment.js";
|
|
6
7
|
import { CreateMaterializedView } from "./changes/materialized-view.create.js";
|
|
7
8
|
import { DropMaterializedView } from "./changes/materialized-view.drop.js";
|
|
8
9
|
import { GrantMaterializedViewPrivileges, RevokeGrantOptionMaterializedViewPrivileges, RevokeMaterializedViewPrivileges, } from "./changes/materialized-view.privilege.js";
|
|
10
|
+
import { CreateSecurityLabelOnMaterializedView, DropSecurityLabelOnMaterializedView, } from "./changes/materialized-view.security-label.js";
|
|
9
11
|
/**
|
|
10
12
|
* Diff two sets of materialized views from main and branch catalogs.
|
|
11
13
|
*
|
|
@@ -48,6 +50,14 @@ export function diffMaterializedViews(ctx, main, branch) {
|
|
|
48
50
|
}));
|
|
49
51
|
}
|
|
50
52
|
}
|
|
53
|
+
// Security labels on the matview itself (columns of matviews are not
|
|
54
|
+
// supported targets of SECURITY LABEL, so we only label the relation).
|
|
55
|
+
for (const label of mv.security_labels) {
|
|
56
|
+
changes.push(new CreateSecurityLabelOnMaterializedView({
|
|
57
|
+
materializedView: mv,
|
|
58
|
+
securityLabel: label,
|
|
59
|
+
}));
|
|
60
|
+
}
|
|
51
61
|
// PRIVILEGES: For created objects, compare against default privileges state
|
|
52
62
|
// The migration script will run ALTER DEFAULT PRIVILEGES before CREATE (via constraint spec),
|
|
53
63
|
// so objects are created with the default privileges state in effect.
|
|
@@ -156,6 +166,14 @@ export function diffMaterializedViews(ctx, main, branch) {
|
|
|
156
166
|
}));
|
|
157
167
|
}
|
|
158
168
|
}
|
|
169
|
+
// SECURITY LABELS
|
|
170
|
+
changes.push(...diffSecurityLabels(mainMaterializedView.security_labels, branchMaterializedView.security_labels, (securityLabel) => new CreateSecurityLabelOnMaterializedView({
|
|
171
|
+
materializedView: branchMaterializedView,
|
|
172
|
+
securityLabel,
|
|
173
|
+
}), (securityLabel) => new DropSecurityLabelOnMaterializedView({
|
|
174
|
+
materializedView: mainMaterializedView,
|
|
175
|
+
securityLabel,
|
|
176
|
+
})));
|
|
159
177
|
// COMMENT changes on columns
|
|
160
178
|
const mainCols = new Map(mainMaterializedView.columns.map((c) => [c.name, c]));
|
|
161
179
|
const branchCols = new Map(branchMaterializedView.columns.map((c) => [c.name, c]));
|