@supabase/pg-delta 1.0.0-alpha.22 → 1.0.0-alpha.23
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/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
|
@@ -6,6 +6,10 @@ import {
|
|
|
6
6
|
type PrivilegeProps,
|
|
7
7
|
privilegePropsSchema,
|
|
8
8
|
} from "../base.privilege-diff.ts";
|
|
9
|
+
import {
|
|
10
|
+
type SecurityLabelProps,
|
|
11
|
+
securityLabelPropsSchema,
|
|
12
|
+
} from "../security-label.types.ts";
|
|
9
13
|
|
|
10
14
|
const domainConstraintPropsSchema = z.object({
|
|
11
15
|
name: z.string(),
|
|
@@ -31,6 +35,7 @@ const domainPropsSchema = z.object({
|
|
|
31
35
|
comment: z.string().nullable(),
|
|
32
36
|
constraints: z.array(domainConstraintPropsSchema),
|
|
33
37
|
privileges: z.array(privilegePropsSchema),
|
|
38
|
+
security_labels: z.array(securityLabelPropsSchema).default([]).optional(),
|
|
34
39
|
});
|
|
35
40
|
|
|
36
41
|
export type DomainConstraintProps = z.infer<typeof domainConstraintPropsSchema>;
|
|
@@ -58,6 +63,7 @@ export class Domain extends BasePgModel {
|
|
|
58
63
|
public readonly comment: DomainProps["comment"];
|
|
59
64
|
public readonly constraints: DomainConstraintProps[];
|
|
60
65
|
public readonly privileges: DomainPrivilegeProps[];
|
|
66
|
+
public readonly security_labels: SecurityLabelProps[];
|
|
61
67
|
|
|
62
68
|
constructor(props: DomainProps) {
|
|
63
69
|
super();
|
|
@@ -80,6 +86,7 @@ export class Domain extends BasePgModel {
|
|
|
80
86
|
this.comment = props.comment;
|
|
81
87
|
this.constraints = props.constraints;
|
|
82
88
|
this.privileges = props.privileges;
|
|
89
|
+
this.security_labels = props.security_labels ?? [];
|
|
83
90
|
}
|
|
84
91
|
|
|
85
92
|
get stableId(): `domain:${string}` {
|
|
@@ -107,6 +114,7 @@ export class Domain extends BasePgModel {
|
|
|
107
114
|
comment: this.comment,
|
|
108
115
|
constraints: this.constraints,
|
|
109
116
|
privileges: this.privileges,
|
|
117
|
+
security_labels: this.security_labels,
|
|
110
118
|
};
|
|
111
119
|
}
|
|
112
120
|
}
|
|
@@ -170,7 +178,20 @@ export async function extractDomains(pool: Pool): Promise<Domain[]> {
|
|
|
170
178
|
)
|
|
171
179
|
from lateral aclexplode(COALESCE(t.typacl, acldefault('T', t.typowner))) as x(grantor, grantee, privilege_type, is_grantable)
|
|
172
180
|
), '[]'
|
|
173
|
-
) as privileges
|
|
181
|
+
) as privileges,
|
|
182
|
+
coalesce(
|
|
183
|
+
(
|
|
184
|
+
select json_agg(
|
|
185
|
+
json_build_object('provider', sl.provider, 'label', sl.label)
|
|
186
|
+
order by sl.provider
|
|
187
|
+
)
|
|
188
|
+
from pg_catalog.pg_seclabel sl
|
|
189
|
+
where sl.objoid = t.oid
|
|
190
|
+
and sl.classoid = 'pg_type'::regclass
|
|
191
|
+
and sl.objsubid = 0
|
|
192
|
+
),
|
|
193
|
+
'[]'::json
|
|
194
|
+
) as security_labels
|
|
174
195
|
from
|
|
175
196
|
pg_catalog.pg_type t
|
|
176
197
|
inner join pg_catalog.pg_type bt on bt.oid = t.typbasetype
|
|
@@ -3,7 +3,7 @@ import type { EventTrigger } from "../event-trigger.model.ts";
|
|
|
3
3
|
|
|
4
4
|
abstract class BaseEventTriggerChange extends BaseChange {
|
|
5
5
|
abstract readonly eventTrigger: EventTrigger;
|
|
6
|
-
abstract readonly scope: "object" | "comment";
|
|
6
|
+
abstract readonly scope: "object" | "comment" | "security_label";
|
|
7
7
|
readonly objectType = "event_trigger" as const;
|
|
8
8
|
}
|
|
9
9
|
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { quoteLiteral } from "../../base.change.ts";
|
|
2
|
+
import type { SecurityLabelProps } from "../../security-label.types.ts";
|
|
3
|
+
import { stableId } from "../../utils.ts";
|
|
4
|
+
import type { EventTrigger } from "../event-trigger.model.ts";
|
|
5
|
+
import {
|
|
6
|
+
CreateEventTriggerChange,
|
|
7
|
+
DropEventTriggerChange,
|
|
8
|
+
} from "./event-trigger.base.ts";
|
|
9
|
+
|
|
10
|
+
export type SecurityLabelEventTrigger =
|
|
11
|
+
| CreateSecurityLabelOnEventTrigger
|
|
12
|
+
| DropSecurityLabelOnEventTrigger;
|
|
13
|
+
|
|
14
|
+
export class CreateSecurityLabelOnEventTrigger extends CreateEventTriggerChange {
|
|
15
|
+
public readonly eventTrigger: EventTrigger;
|
|
16
|
+
public readonly securityLabel: SecurityLabelProps;
|
|
17
|
+
public readonly scope = "security_label" as const;
|
|
18
|
+
|
|
19
|
+
constructor(props: {
|
|
20
|
+
eventTrigger: EventTrigger;
|
|
21
|
+
securityLabel: SecurityLabelProps;
|
|
22
|
+
}) {
|
|
23
|
+
super();
|
|
24
|
+
this.eventTrigger = props.eventTrigger;
|
|
25
|
+
this.securityLabel = props.securityLabel;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
get creates() {
|
|
29
|
+
return [
|
|
30
|
+
stableId.securityLabel(
|
|
31
|
+
this.eventTrigger.stableId,
|
|
32
|
+
this.securityLabel.provider,
|
|
33
|
+
),
|
|
34
|
+
];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
get requires() {
|
|
38
|
+
return [this.eventTrigger.stableId];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
serialize(): string {
|
|
42
|
+
return [
|
|
43
|
+
"SECURITY LABEL FOR",
|
|
44
|
+
this.securityLabel.provider,
|
|
45
|
+
"ON EVENT TRIGGER",
|
|
46
|
+
this.eventTrigger.name,
|
|
47
|
+
"IS",
|
|
48
|
+
quoteLiteral(this.securityLabel.label),
|
|
49
|
+
].join(" ");
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export class DropSecurityLabelOnEventTrigger extends DropEventTriggerChange {
|
|
54
|
+
public readonly eventTrigger: EventTrigger;
|
|
55
|
+
public readonly securityLabel: SecurityLabelProps;
|
|
56
|
+
public readonly scope = "security_label" as const;
|
|
57
|
+
|
|
58
|
+
constructor(props: {
|
|
59
|
+
eventTrigger: EventTrigger;
|
|
60
|
+
securityLabel: SecurityLabelProps;
|
|
61
|
+
}) {
|
|
62
|
+
super();
|
|
63
|
+
this.eventTrigger = props.eventTrigger;
|
|
64
|
+
this.securityLabel = props.securityLabel;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
get drops() {
|
|
68
|
+
return [
|
|
69
|
+
stableId.securityLabel(
|
|
70
|
+
this.eventTrigger.stableId,
|
|
71
|
+
this.securityLabel.provider,
|
|
72
|
+
),
|
|
73
|
+
];
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
get requires() {
|
|
77
|
+
return [
|
|
78
|
+
stableId.securityLabel(
|
|
79
|
+
this.eventTrigger.stableId,
|
|
80
|
+
this.securityLabel.provider,
|
|
81
|
+
),
|
|
82
|
+
this.eventTrigger.stableId,
|
|
83
|
+
];
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
serialize(): string {
|
|
87
|
+
return [
|
|
88
|
+
"SECURITY LABEL FOR",
|
|
89
|
+
this.securityLabel.provider,
|
|
90
|
+
"ON EVENT TRIGGER",
|
|
91
|
+
this.eventTrigger.name,
|
|
92
|
+
"IS NULL",
|
|
93
|
+
].join(" ");
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -2,10 +2,12 @@ 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
|
|
|
6
7
|
/** Union of all event-trigger-related change variants (`objectType: "event_trigger"`). @category Change Types */
|
|
7
8
|
export type EventTriggerChange =
|
|
8
9
|
| AlterEventTrigger
|
|
9
10
|
| CommentEventTrigger
|
|
10
11
|
| CreateEventTrigger
|
|
11
|
-
| DropEventTrigger
|
|
12
|
+
| DropEventTrigger
|
|
13
|
+
| SecurityLabelEventTrigger;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { diffObjects } from "../base.diff.ts";
|
|
2
2
|
import type { ObjectDiffContext } from "../diff-context.ts";
|
|
3
|
+
import { diffSecurityLabels } from "../security-label.types.ts";
|
|
3
4
|
import { deepEqual, hasNonAlterableChanges } from "../utils.ts";
|
|
4
5
|
import {
|
|
5
6
|
AlterEventTriggerChangeOwner,
|
|
@@ -11,6 +12,10 @@ import {
|
|
|
11
12
|
} from "./changes/event-trigger.comment.ts";
|
|
12
13
|
import { CreateEventTrigger } from "./changes/event-trigger.create.ts";
|
|
13
14
|
import { DropEventTrigger } from "./changes/event-trigger.drop.ts";
|
|
15
|
+
import {
|
|
16
|
+
CreateSecurityLabelOnEventTrigger,
|
|
17
|
+
DropSecurityLabelOnEventTrigger,
|
|
18
|
+
} from "./changes/event-trigger.security-label.ts";
|
|
14
19
|
import type { EventTriggerChange } from "./changes/event-trigger.types.ts";
|
|
15
20
|
import type { EventTrigger } from "./event-trigger.model.ts";
|
|
16
21
|
|
|
@@ -49,6 +54,14 @@ export function diffEventTriggers(
|
|
|
49
54
|
if (eventTrigger.comment !== null) {
|
|
50
55
|
changes.push(new CreateCommentOnEventTrigger({ eventTrigger }));
|
|
51
56
|
}
|
|
57
|
+
for (const label of eventTrigger.security_labels) {
|
|
58
|
+
changes.push(
|
|
59
|
+
new CreateSecurityLabelOnEventTrigger({
|
|
60
|
+
eventTrigger,
|
|
61
|
+
securityLabel: label,
|
|
62
|
+
}),
|
|
63
|
+
);
|
|
64
|
+
}
|
|
52
65
|
}
|
|
53
66
|
|
|
54
67
|
for (const eventTriggerId of dropped) {
|
|
@@ -121,6 +134,26 @@ export function diffEventTriggers(
|
|
|
121
134
|
);
|
|
122
135
|
}
|
|
123
136
|
}
|
|
137
|
+
|
|
138
|
+
// SECURITY LABELS
|
|
139
|
+
changes.push(
|
|
140
|
+
...diffSecurityLabels<
|
|
141
|
+
CreateSecurityLabelOnEventTrigger | DropSecurityLabelOnEventTrigger
|
|
142
|
+
>(
|
|
143
|
+
mainEventTrigger.security_labels,
|
|
144
|
+
branchEventTrigger.security_labels,
|
|
145
|
+
(securityLabel) =>
|
|
146
|
+
new CreateSecurityLabelOnEventTrigger({
|
|
147
|
+
eventTrigger: branchEventTrigger,
|
|
148
|
+
securityLabel,
|
|
149
|
+
}),
|
|
150
|
+
(securityLabel) =>
|
|
151
|
+
new DropSecurityLabelOnEventTrigger({
|
|
152
|
+
eventTrigger: mainEventTrigger,
|
|
153
|
+
securityLabel,
|
|
154
|
+
}),
|
|
155
|
+
),
|
|
156
|
+
);
|
|
124
157
|
}
|
|
125
158
|
|
|
126
159
|
return changes;
|
|
@@ -2,6 +2,10 @@ import { sql } from "@ts-safeql/sql-tag";
|
|
|
2
2
|
import type { Pool } from "pg";
|
|
3
3
|
import z from "zod";
|
|
4
4
|
import { BasePgModel } from "../base.model.ts";
|
|
5
|
+
import {
|
|
6
|
+
type SecurityLabelProps,
|
|
7
|
+
securityLabelPropsSchema,
|
|
8
|
+
} from "../security-label.types.ts";
|
|
5
9
|
|
|
6
10
|
const EventTriggerEnabledSchema = z.enum([
|
|
7
11
|
"O", // ORIGIN - trigger fires in origin mode
|
|
@@ -19,6 +23,7 @@ const eventTriggerPropsSchema = z.object({
|
|
|
19
23
|
tags: z.array(z.string()).nullable(),
|
|
20
24
|
owner: z.string(),
|
|
21
25
|
comment: z.string().nullable(),
|
|
26
|
+
security_labels: z.array(securityLabelPropsSchema).default([]).optional(),
|
|
22
27
|
});
|
|
23
28
|
|
|
24
29
|
export type EventTriggerProps = z.infer<typeof eventTriggerPropsSchema>;
|
|
@@ -32,6 +37,7 @@ export class EventTrigger extends BasePgModel {
|
|
|
32
37
|
public readonly tags: EventTriggerProps["tags"];
|
|
33
38
|
public readonly owner: EventTriggerProps["owner"];
|
|
34
39
|
public readonly comment: EventTriggerProps["comment"];
|
|
40
|
+
public readonly security_labels: SecurityLabelProps[];
|
|
35
41
|
|
|
36
42
|
constructor(props: EventTriggerProps) {
|
|
37
43
|
super();
|
|
@@ -47,6 +53,7 @@ export class EventTrigger extends BasePgModel {
|
|
|
47
53
|
this.tags = props.tags;
|
|
48
54
|
this.owner = props.owner;
|
|
49
55
|
this.comment = props.comment;
|
|
56
|
+
this.security_labels = props.security_labels ?? [];
|
|
50
57
|
}
|
|
51
58
|
|
|
52
59
|
get stableId(): `eventTrigger:${string}` {
|
|
@@ -68,6 +75,7 @@ export class EventTrigger extends BasePgModel {
|
|
|
68
75
|
tags: this.tags,
|
|
69
76
|
owner: this.owner,
|
|
70
77
|
comment: this.comment,
|
|
78
|
+
security_labels: this.security_labels,
|
|
71
79
|
};
|
|
72
80
|
}
|
|
73
81
|
}
|
|
@@ -90,7 +98,20 @@ select
|
|
|
90
98
|
et.evtenabled as enabled,
|
|
91
99
|
et.evttags as tags,
|
|
92
100
|
et.evtowner::regrole::text as owner,
|
|
93
|
-
obj_description(et.oid, 'pg_event_trigger') as comment
|
|
101
|
+
obj_description(et.oid, 'pg_event_trigger') as comment,
|
|
102
|
+
coalesce(
|
|
103
|
+
(
|
|
104
|
+
select json_agg(
|
|
105
|
+
json_build_object('provider', sl.provider, 'label', sl.label)
|
|
106
|
+
order by sl.provider
|
|
107
|
+
)
|
|
108
|
+
from pg_catalog.pg_seclabel sl
|
|
109
|
+
where sl.objoid = et.oid
|
|
110
|
+
and sl.classoid = 'pg_event_trigger'::regclass
|
|
111
|
+
and sl.objsubid = 0
|
|
112
|
+
),
|
|
113
|
+
'[]'::json
|
|
114
|
+
) as security_labels
|
|
94
115
|
from pg_catalog.pg_event_trigger et
|
|
95
116
|
join pg_catalog.pg_proc p on p.oid = et.evtfoid
|
|
96
117
|
left join extension_oids e on e.objid = et.oid
|
|
@@ -3,7 +3,11 @@ import type { ForeignTable } from "../foreign-table.model.ts";
|
|
|
3
3
|
|
|
4
4
|
abstract class BaseForeignTableChange extends BaseChange {
|
|
5
5
|
abstract readonly foreignTable: ForeignTable;
|
|
6
|
-
abstract readonly scope:
|
|
6
|
+
abstract readonly scope:
|
|
7
|
+
| "object"
|
|
8
|
+
| "comment"
|
|
9
|
+
| "privilege"
|
|
10
|
+
| "security_label";
|
|
7
11
|
readonly objectType: "foreign_table" = "foreign_table";
|
|
8
12
|
}
|
|
9
13
|
|
package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.security-label.ts
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { quoteLiteral } from "../../../base.change.ts";
|
|
2
|
+
import type { SecurityLabelProps } from "../../../security-label.types.ts";
|
|
3
|
+
import { stableId } from "../../../utils.ts";
|
|
4
|
+
import type { ForeignTable } from "../foreign-table.model.ts";
|
|
5
|
+
import {
|
|
6
|
+
CreateForeignTableChange,
|
|
7
|
+
DropForeignTableChange,
|
|
8
|
+
} from "./foreign-table.base.ts";
|
|
9
|
+
|
|
10
|
+
export type SecurityLabelForeignTable =
|
|
11
|
+
| CreateSecurityLabelOnForeignTable
|
|
12
|
+
| DropSecurityLabelOnForeignTable;
|
|
13
|
+
|
|
14
|
+
export class CreateSecurityLabelOnForeignTable extends CreateForeignTableChange {
|
|
15
|
+
public readonly foreignTable: ForeignTable;
|
|
16
|
+
public readonly securityLabel: SecurityLabelProps;
|
|
17
|
+
public readonly scope = "security_label" as const;
|
|
18
|
+
|
|
19
|
+
constructor(props: {
|
|
20
|
+
foreignTable: ForeignTable;
|
|
21
|
+
securityLabel: SecurityLabelProps;
|
|
22
|
+
}) {
|
|
23
|
+
super();
|
|
24
|
+
this.foreignTable = props.foreignTable;
|
|
25
|
+
this.securityLabel = props.securityLabel;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
get creates() {
|
|
29
|
+
return [
|
|
30
|
+
stableId.securityLabel(
|
|
31
|
+
this.foreignTable.stableId,
|
|
32
|
+
this.securityLabel.provider,
|
|
33
|
+
),
|
|
34
|
+
];
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
get requires() {
|
|
38
|
+
return [this.foreignTable.stableId];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
serialize(): string {
|
|
42
|
+
return [
|
|
43
|
+
"SECURITY LABEL FOR",
|
|
44
|
+
this.securityLabel.provider,
|
|
45
|
+
"ON FOREIGN TABLE",
|
|
46
|
+
`${this.foreignTable.schema}.${this.foreignTable.name}`,
|
|
47
|
+
"IS",
|
|
48
|
+
quoteLiteral(this.securityLabel.label),
|
|
49
|
+
].join(" ");
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export class DropSecurityLabelOnForeignTable extends DropForeignTableChange {
|
|
54
|
+
public readonly foreignTable: ForeignTable;
|
|
55
|
+
public readonly securityLabel: SecurityLabelProps;
|
|
56
|
+
public readonly scope = "security_label" as const;
|
|
57
|
+
|
|
58
|
+
constructor(props: {
|
|
59
|
+
foreignTable: ForeignTable;
|
|
60
|
+
securityLabel: SecurityLabelProps;
|
|
61
|
+
}) {
|
|
62
|
+
super();
|
|
63
|
+
this.foreignTable = props.foreignTable;
|
|
64
|
+
this.securityLabel = props.securityLabel;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
get drops() {
|
|
68
|
+
return [
|
|
69
|
+
stableId.securityLabel(
|
|
70
|
+
this.foreignTable.stableId,
|
|
71
|
+
this.securityLabel.provider,
|
|
72
|
+
),
|
|
73
|
+
];
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
get requires() {
|
|
77
|
+
return [
|
|
78
|
+
stableId.securityLabel(
|
|
79
|
+
this.foreignTable.stableId,
|
|
80
|
+
this.securityLabel.provider,
|
|
81
|
+
),
|
|
82
|
+
this.foreignTable.stableId,
|
|
83
|
+
];
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
serialize(): string {
|
|
87
|
+
return [
|
|
88
|
+
"SECURITY LABEL FOR",
|
|
89
|
+
this.securityLabel.provider,
|
|
90
|
+
"ON FOREIGN TABLE",
|
|
91
|
+
`${this.foreignTable.schema}.${this.foreignTable.name}`,
|
|
92
|
+
"IS NULL",
|
|
93
|
+
].join(" ");
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -3,6 +3,7 @@ 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
|
|
|
7
8
|
/** Union of all foreign-table-related change variants (`objectType: "foreign_table"`). @category Change Types */
|
|
8
9
|
export type ForeignTableChange =
|
|
@@ -10,4 +11,5 @@ export type ForeignTableChange =
|
|
|
10
11
|
| CommentForeignTable
|
|
11
12
|
| CreateForeignTable
|
|
12
13
|
| DropForeignTable
|
|
13
|
-
| ForeignTablePrivilege
|
|
14
|
+
| ForeignTablePrivilege
|
|
15
|
+
| SecurityLabelForeignTable;
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
filterPublicBuiltInDefaults,
|
|
6
6
|
} from "../../base.privilege-diff.ts";
|
|
7
7
|
import type { ObjectDiffContext } from "../../diff-context.ts";
|
|
8
|
+
import { diffSecurityLabels } from "../../security-label.types.ts";
|
|
8
9
|
import {
|
|
9
10
|
AlterForeignTableAddColumn,
|
|
10
11
|
AlterForeignTableAlterColumnDropDefault,
|
|
@@ -27,6 +28,10 @@ import {
|
|
|
27
28
|
RevokeForeignTablePrivileges,
|
|
28
29
|
RevokeGrantOptionForeignTablePrivileges,
|
|
29
30
|
} from "./changes/foreign-table.privilege.ts";
|
|
31
|
+
import {
|
|
32
|
+
CreateSecurityLabelOnForeignTable,
|
|
33
|
+
DropSecurityLabelOnForeignTable,
|
|
34
|
+
} from "./changes/foreign-table.security-label.ts";
|
|
30
35
|
import type { ForeignTableChange } from "./changes/foreign-table.types.ts";
|
|
31
36
|
import type { ForeignTable } from "./foreign-table.model.ts";
|
|
32
37
|
|
|
@@ -70,6 +75,14 @@ export function diffForeignTables(
|
|
|
70
75
|
new CreateCommentOnForeignTable({ foreignTable: createdTable }),
|
|
71
76
|
);
|
|
72
77
|
}
|
|
78
|
+
for (const label of createdTable.security_labels) {
|
|
79
|
+
changes.push(
|
|
80
|
+
new CreateSecurityLabelOnForeignTable({
|
|
81
|
+
foreignTable: createdTable,
|
|
82
|
+
securityLabel: label,
|
|
83
|
+
}),
|
|
84
|
+
);
|
|
85
|
+
}
|
|
73
86
|
|
|
74
87
|
// PRIVILEGES: For created objects, compare against default privileges state
|
|
75
88
|
const effectiveDefaults = ctx.defaultPrivilegeState.getEffectiveDefaults(
|
|
@@ -249,6 +262,26 @@ export function diffForeignTables(
|
|
|
249
262
|
}
|
|
250
263
|
}
|
|
251
264
|
|
|
265
|
+
// SECURITY LABELS
|
|
266
|
+
changes.push(
|
|
267
|
+
...diffSecurityLabels<
|
|
268
|
+
CreateSecurityLabelOnForeignTable | DropSecurityLabelOnForeignTable
|
|
269
|
+
>(
|
|
270
|
+
mainTable.security_labels,
|
|
271
|
+
branchTable.security_labels,
|
|
272
|
+
(securityLabel) =>
|
|
273
|
+
new CreateSecurityLabelOnForeignTable({
|
|
274
|
+
foreignTable: branchTable,
|
|
275
|
+
securityLabel,
|
|
276
|
+
}),
|
|
277
|
+
(securityLabel) =>
|
|
278
|
+
new DropSecurityLabelOnForeignTable({
|
|
279
|
+
foreignTable: mainTable,
|
|
280
|
+
securityLabel,
|
|
281
|
+
}),
|
|
282
|
+
),
|
|
283
|
+
);
|
|
284
|
+
|
|
252
285
|
// PRIVILEGES
|
|
253
286
|
const mainPrivilegesFiltered = filterPublicBuiltInDefaults(
|
|
254
287
|
"foreign_table",
|
|
@@ -10,6 +10,11 @@ import {
|
|
|
10
10
|
type PrivilegeProps,
|
|
11
11
|
privilegePropsSchema,
|
|
12
12
|
} from "../../base.privilege-diff.ts";
|
|
13
|
+
import {
|
|
14
|
+
normalizeSecurityLabels,
|
|
15
|
+
type SecurityLabelProps,
|
|
16
|
+
securityLabelPropsSchema,
|
|
17
|
+
} from "../../security-label.types.ts";
|
|
13
18
|
|
|
14
19
|
/**
|
|
15
20
|
* All properties exposed by CREATE FOREIGN TABLE statement are included in diff output.
|
|
@@ -30,6 +35,7 @@ const foreignTablePropsSchema = z.object({
|
|
|
30
35
|
comment: z.string().nullable(),
|
|
31
36
|
columns: z.array(columnPropsSchema),
|
|
32
37
|
privileges: z.array(privilegePropsSchema),
|
|
38
|
+
security_labels: z.array(securityLabelPropsSchema).default([]).optional(),
|
|
33
39
|
});
|
|
34
40
|
|
|
35
41
|
type ForeignTablePrivilegeProps = PrivilegeProps;
|
|
@@ -44,6 +50,7 @@ export class ForeignTable extends BasePgModel implements TableLikeObject {
|
|
|
44
50
|
public readonly comment: ForeignTableProps["comment"];
|
|
45
51
|
public readonly columns: ForeignTableProps["columns"];
|
|
46
52
|
public readonly privileges: ForeignTablePrivilegeProps[];
|
|
53
|
+
public readonly security_labels: SecurityLabelProps[];
|
|
47
54
|
|
|
48
55
|
constructor(props: ForeignTableProps) {
|
|
49
56
|
super();
|
|
@@ -59,6 +66,7 @@ export class ForeignTable extends BasePgModel implements TableLikeObject {
|
|
|
59
66
|
this.comment = props.comment;
|
|
60
67
|
this.columns = props.columns;
|
|
61
68
|
this.privileges = props.privileges;
|
|
69
|
+
this.security_labels = props.security_labels ?? [];
|
|
62
70
|
}
|
|
63
71
|
|
|
64
72
|
get stableId(): `foreignTable:${string}` {
|
|
@@ -80,6 +88,7 @@ export class ForeignTable extends BasePgModel implements TableLikeObject {
|
|
|
80
88
|
comment: this.comment,
|
|
81
89
|
columns: this.columns,
|
|
82
90
|
privileges: this.privileges,
|
|
91
|
+
security_labels: this.security_labels,
|
|
83
92
|
};
|
|
84
93
|
}
|
|
85
94
|
|
|
@@ -104,6 +113,7 @@ export class ForeignTable extends BasePgModel implements TableLikeObject {
|
|
|
104
113
|
data: {
|
|
105
114
|
...this.dataFields,
|
|
106
115
|
columns: normalizeColumns(),
|
|
116
|
+
security_labels: normalizeSecurityLabels(this.security_labels),
|
|
107
117
|
},
|
|
108
118
|
};
|
|
109
119
|
}
|
|
@@ -209,7 +219,20 @@ export async function extractForeignTables(
|
|
|
209
219
|
join lateral aclexplode(src.acl) as x(grantor, grantee, privilege_type, is_grantable) on true
|
|
210
220
|
group by x.grantee, x.privilege_type
|
|
211
221
|
) as grp
|
|
212
|
-
), '[]') as privileges
|
|
222
|
+
), '[]') as privileges,
|
|
223
|
+
coalesce(
|
|
224
|
+
(
|
|
225
|
+
select json_agg(
|
|
226
|
+
json_build_object('provider', sl.provider, 'label', sl.label)
|
|
227
|
+
order by sl.provider
|
|
228
|
+
)
|
|
229
|
+
from pg_catalog.pg_seclabel sl
|
|
230
|
+
where sl.objoid = ft.oid
|
|
231
|
+
and sl.classoid = 'pg_class'::regclass
|
|
232
|
+
and sl.objsubid = 0
|
|
233
|
+
),
|
|
234
|
+
'[]'::json
|
|
235
|
+
) as security_labels
|
|
213
236
|
from
|
|
214
237
|
foreign_tables ft
|
|
215
238
|
left join pg_attribute a on a.attrelid = ft.oid and a.attnum > 0 and not a.attisdropped
|
|
@@ -3,7 +3,11 @@ import type { MaterializedView } from "../materialized-view.model.ts";
|
|
|
3
3
|
|
|
4
4
|
abstract class BaseMaterializedViewChange extends BaseChange {
|
|
5
5
|
abstract readonly materializedView: MaterializedView;
|
|
6
|
-
abstract readonly scope:
|
|
6
|
+
abstract readonly scope:
|
|
7
|
+
| "object"
|
|
8
|
+
| "comment"
|
|
9
|
+
| "privilege"
|
|
10
|
+
| "security_label";
|
|
7
11
|
readonly objectType: "materialized_view" = "materialized_view";
|
|
8
12
|
}
|
|
9
13
|
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { describe, expect, test } from "bun:test";
|
|
2
|
+
import { assertValidSql } from "../../../test-utils/assert-valid-sql.ts";
|
|
3
|
+
import { stableId } from "../../utils.ts";
|
|
4
|
+
import {
|
|
5
|
+
MaterializedView,
|
|
6
|
+
type MaterializedViewProps,
|
|
7
|
+
} from "../materialized-view.model.ts";
|
|
8
|
+
import {
|
|
9
|
+
CreateSecurityLabelOnMaterializedView,
|
|
10
|
+
DropSecurityLabelOnMaterializedView,
|
|
11
|
+
} from "./materialized-view.security-label.ts";
|
|
12
|
+
|
|
13
|
+
const makeMV = (): MaterializedView =>
|
|
14
|
+
new MaterializedView({
|
|
15
|
+
schema: "public",
|
|
16
|
+
name: "mv",
|
|
17
|
+
definition: "SELECT 1",
|
|
18
|
+
row_security: false,
|
|
19
|
+
force_row_security: false,
|
|
20
|
+
has_indexes: false,
|
|
21
|
+
has_rules: false,
|
|
22
|
+
has_triggers: false,
|
|
23
|
+
has_subclasses: false,
|
|
24
|
+
is_populated: true,
|
|
25
|
+
replica_identity: "d",
|
|
26
|
+
is_partition: false,
|
|
27
|
+
options: null,
|
|
28
|
+
partition_bound: null,
|
|
29
|
+
owner: "postgres",
|
|
30
|
+
comment: null,
|
|
31
|
+
columns: [],
|
|
32
|
+
privileges: [],
|
|
33
|
+
} as MaterializedViewProps);
|
|
34
|
+
|
|
35
|
+
describe("materialized-view.security-label", () => {
|
|
36
|
+
test("create serializes", async () => {
|
|
37
|
+
const mv = makeMV();
|
|
38
|
+
const change = new CreateSecurityLabelOnMaterializedView({
|
|
39
|
+
materializedView: mv,
|
|
40
|
+
securityLabel: { provider: "dummy", label: "classified" },
|
|
41
|
+
});
|
|
42
|
+
expect(change.scope).toBe("security_label");
|
|
43
|
+
expect(change.creates).toEqual([
|
|
44
|
+
stableId.securityLabel(mv.stableId, "dummy"),
|
|
45
|
+
]);
|
|
46
|
+
await assertValidSql(change.serialize());
|
|
47
|
+
expect(change.serialize()).toBe(
|
|
48
|
+
"SECURITY LABEL FOR dummy ON MATERIALIZED VIEW public.mv IS 'classified'",
|
|
49
|
+
);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test("drop serializes to IS NULL", async () => {
|
|
53
|
+
const mv = makeMV();
|
|
54
|
+
const change = new DropSecurityLabelOnMaterializedView({
|
|
55
|
+
materializedView: mv,
|
|
56
|
+
securityLabel: { provider: "dummy", label: "x" },
|
|
57
|
+
});
|
|
58
|
+
await assertValidSql(change.serialize());
|
|
59
|
+
expect(change.serialize()).toBe(
|
|
60
|
+
"SECURITY LABEL FOR dummy ON MATERIALIZED VIEW public.mv IS NULL",
|
|
61
|
+
);
|
|
62
|
+
});
|
|
63
|
+
});
|