@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.
Files changed (220) hide show
  1. package/dist/core/catalog.model.js +1 -0
  2. package/dist/core/integrations/filter/flatten.js +13 -0
  3. package/dist/core/objects/aggregate/aggregate.diff.js +16 -0
  4. package/dist/core/objects/aggregate/aggregate.model.d.ts +10 -0
  5. package/dist/core/objects/aggregate/aggregate.model.js +19 -1
  6. package/dist/core/objects/aggregate/changes/aggregate.base.d.ts +1 -1
  7. package/dist/core/objects/aggregate/changes/aggregate.security-label.d.ts +28 -0
  8. package/dist/core/objects/aggregate/changes/aggregate.security-label.js +64 -0
  9. package/dist/core/objects/aggregate/changes/aggregate.types.d.ts +2 -1
  10. package/dist/core/objects/base.model.d.ts +8 -0
  11. package/dist/core/objects/base.model.js +2 -0
  12. package/dist/core/objects/domain/changes/domain.base.d.ts +1 -1
  13. package/dist/core/objects/domain/changes/domain.security-label.d.ts +28 -0
  14. package/dist/core/objects/domain/changes/domain.security-label.js +61 -0
  15. package/dist/core/objects/domain/changes/domain.types.d.ts +2 -1
  16. package/dist/core/objects/domain/domain.diff.js +16 -0
  17. package/dist/core/objects/domain/domain.model.d.ts +10 -0
  18. package/dist/core/objects/domain/domain.model.js +19 -1
  19. package/dist/core/objects/event-trigger/changes/event-trigger.base.d.ts +1 -1
  20. package/dist/core/objects/event-trigger/changes/event-trigger.security-label.d.ts +28 -0
  21. package/dist/core/objects/event-trigger/changes/event-trigger.security-label.js +61 -0
  22. package/dist/core/objects/event-trigger/changes/event-trigger.types.d.ts +2 -1
  23. package/dist/core/objects/event-trigger/event-trigger.diff.js +16 -0
  24. package/dist/core/objects/event-trigger/event-trigger.model.d.ts +10 -0
  25. package/dist/core/objects/event-trigger/event-trigger.model.js +19 -1
  26. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.d.ts +1 -1
  27. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.security-label.d.ts +28 -0
  28. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.security-label.js +61 -0
  29. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.d.ts +2 -1
  30. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.js +16 -0
  31. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.d.ts +22 -0
  32. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.js +20 -1
  33. package/dist/core/objects/materialized-view/changes/materialized-view.base.d.ts +1 -1
  34. package/dist/core/objects/materialized-view/changes/materialized-view.security-label.d.ts +28 -0
  35. package/dist/core/objects/materialized-view/changes/materialized-view.security-label.js +61 -0
  36. package/dist/core/objects/materialized-view/changes/materialized-view.types.d.ts +2 -1
  37. package/dist/core/objects/materialized-view/materialized-view.diff.js +18 -0
  38. package/dist/core/objects/materialized-view/materialized-view.model.d.ts +22 -0
  39. package/dist/core/objects/materialized-view/materialized-view.model.js +20 -1
  40. package/dist/core/objects/procedure/changes/procedure.base.d.ts +1 -1
  41. package/dist/core/objects/procedure/changes/procedure.security-label.d.ts +28 -0
  42. package/dist/core/objects/procedure/changes/procedure.security-label.js +69 -0
  43. package/dist/core/objects/procedure/changes/procedure.types.d.ts +2 -1
  44. package/dist/core/objects/procedure/procedure.diff.js +16 -0
  45. package/dist/core/objects/procedure/procedure.model.d.ts +10 -0
  46. package/dist/core/objects/procedure/procedure.model.js +19 -1
  47. package/dist/core/objects/publication/changes/publication.base.d.ts +1 -1
  48. package/dist/core/objects/publication/changes/publication.security-label.d.ts +28 -0
  49. package/dist/core/objects/publication/changes/publication.security-label.js +61 -0
  50. package/dist/core/objects/publication/changes/publication.types.d.ts +2 -1
  51. package/dist/core/objects/publication/publication.diff.js +16 -0
  52. package/dist/core/objects/publication/publication.model.d.ts +14 -0
  53. package/dist/core/objects/publication/publication.model.js +20 -1
  54. package/dist/core/objects/role/changes/role.base.d.ts +1 -1
  55. package/dist/core/objects/role/changes/role.security-label.d.ts +28 -0
  56. package/dist/core/objects/role/changes/role.security-label.js +61 -0
  57. package/dist/core/objects/role/changes/role.types.d.ts +2 -1
  58. package/dist/core/objects/role/role.diff.js +16 -0
  59. package/dist/core/objects/role/role.model.d.ts +10 -0
  60. package/dist/core/objects/role/role.model.js +29 -0
  61. package/dist/core/objects/schema/changes/schema.base.d.ts +1 -1
  62. package/dist/core/objects/schema/changes/schema.security-label.d.ts +28 -0
  63. package/dist/core/objects/schema/changes/schema.security-label.js +61 -0
  64. package/dist/core/objects/schema/changes/schema.types.d.ts +2 -1
  65. package/dist/core/objects/schema/schema.diff.js +24 -1
  66. package/dist/core/objects/schema/schema.model.d.ts +10 -0
  67. package/dist/core/objects/schema/schema.model.js +18 -1
  68. package/dist/core/objects/security-label.types.d.ts +20 -0
  69. package/dist/core/objects/security-label.types.js +46 -0
  70. package/dist/core/objects/sequence/changes/sequence.base.d.ts +1 -1
  71. package/dist/core/objects/sequence/changes/sequence.security-label.d.ts +28 -0
  72. package/dist/core/objects/sequence/changes/sequence.security-label.js +61 -0
  73. package/dist/core/objects/sequence/changes/sequence.types.d.ts +2 -1
  74. package/dist/core/objects/sequence/sequence.diff.js +16 -0
  75. package/dist/core/objects/sequence/sequence.model.d.ts +10 -0
  76. package/dist/core/objects/sequence/sequence.model.js +19 -1
  77. package/dist/core/objects/subscription/changes/subscription.base.d.ts +1 -1
  78. package/dist/core/objects/subscription/changes/subscription.security-label.d.ts +28 -0
  79. package/dist/core/objects/subscription/changes/subscription.security-label.js +61 -0
  80. package/dist/core/objects/subscription/changes/subscription.types.d.ts +2 -1
  81. package/dist/core/objects/subscription/subscription.diff.js +16 -0
  82. package/dist/core/objects/subscription/subscription.model.d.ts +10 -0
  83. package/dist/core/objects/subscription/subscription.model.js +19 -1
  84. package/dist/core/objects/table/changes/table.base.d.ts +1 -1
  85. package/dist/core/objects/table/changes/table.security-label.d.ts +63 -0
  86. package/dist/core/objects/table/changes/table.security-label.js +134 -0
  87. package/dist/core/objects/table/changes/table.types.d.ts +2 -1
  88. package/dist/core/objects/table/table.diff.js +49 -0
  89. package/dist/core/objects/table/table.model.d.ts +30 -0
  90. package/dist/core/objects/table/table.model.js +34 -2
  91. package/dist/core/objects/type/composite-type/changes/composite-type.base.d.ts +1 -1
  92. package/dist/core/objects/type/composite-type/changes/composite-type.security-label.d.ts +28 -0
  93. package/dist/core/objects/type/composite-type/changes/composite-type.security-label.js +61 -0
  94. package/dist/core/objects/type/composite-type/changes/composite-type.types.d.ts +2 -1
  95. package/dist/core/objects/type/composite-type/composite-type.diff.js +16 -0
  96. package/dist/core/objects/type/composite-type/composite-type.model.d.ts +22 -0
  97. package/dist/core/objects/type/composite-type/composite-type.model.js +22 -2
  98. package/dist/core/objects/type/enum/changes/enum.base.d.ts +1 -1
  99. package/dist/core/objects/type/enum/changes/enum.security-label.d.ts +28 -0
  100. package/dist/core/objects/type/enum/changes/enum.security-label.js +61 -0
  101. package/dist/core/objects/type/enum/changes/enum.types.d.ts +2 -1
  102. package/dist/core/objects/type/enum/enum.diff.js +16 -0
  103. package/dist/core/objects/type/enum/enum.model.d.ts +10 -0
  104. package/dist/core/objects/type/enum/enum.model.js +20 -1
  105. package/dist/core/objects/type/range/changes/range.base.d.ts +1 -1
  106. package/dist/core/objects/type/range/changes/range.security-label.d.ts +28 -0
  107. package/dist/core/objects/type/range/changes/range.security-label.js +61 -0
  108. package/dist/core/objects/type/range/changes/range.types.d.ts +2 -1
  109. package/dist/core/objects/type/range/range.diff.js +16 -0
  110. package/dist/core/objects/type/range/range.model.d.ts +10 -0
  111. package/dist/core/objects/type/range/range.model.js +19 -1
  112. package/dist/core/objects/utils.d.ts +1 -0
  113. package/dist/core/objects/utils.js +3 -0
  114. package/dist/core/objects/view/changes/view.base.d.ts +1 -1
  115. package/dist/core/objects/view/changes/view.security-label.d.ts +28 -0
  116. package/dist/core/objects/view/changes/view.security-label.js +61 -0
  117. package/dist/core/objects/view/changes/view.types.d.ts +2 -1
  118. package/dist/core/objects/view/view.diff.js +13 -0
  119. package/dist/core/objects/view/view.model.d.ts +26 -0
  120. package/dist/core/objects/view/view.model.js +20 -1
  121. package/dist/core/plan/sql-format/fixtures.js +1 -0
  122. package/package.json +1 -1
  123. package/src/core/catalog.model.ts +1 -0
  124. package/src/core/integrations/filter/dsl.test.ts +27 -0
  125. package/src/core/integrations/filter/flatten.ts +16 -0
  126. package/src/core/objects/aggregate/aggregate.diff.ts +33 -0
  127. package/src/core/objects/aggregate/aggregate.model.ts +22 -1
  128. package/src/core/objects/aggregate/changes/aggregate.base.ts +5 -1
  129. package/src/core/objects/aggregate/changes/aggregate.security-label.ts +99 -0
  130. package/src/core/objects/aggregate/changes/aggregate.types.ts +3 -1
  131. package/src/core/objects/base.model.ts +2 -0
  132. package/src/core/objects/domain/changes/domain.base.ts +5 -1
  133. package/src/core/objects/domain/changes/domain.security-label.test.ts +56 -0
  134. package/src/core/objects/domain/changes/domain.security-label.ts +77 -0
  135. package/src/core/objects/domain/changes/domain.types.ts +3 -1
  136. package/src/core/objects/domain/domain.diff.ts +33 -0
  137. package/src/core/objects/domain/domain.model.ts +22 -1
  138. package/src/core/objects/event-trigger/changes/event-trigger.base.ts +1 -1
  139. package/src/core/objects/event-trigger/changes/event-trigger.security-label.ts +95 -0
  140. package/src/core/objects/event-trigger/changes/event-trigger.types.ts +3 -1
  141. package/src/core/objects/event-trigger/event-trigger.diff.ts +33 -0
  142. package/src/core/objects/event-trigger/event-trigger.model.ts +22 -1
  143. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.ts +5 -1
  144. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.security-label.ts +95 -0
  145. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +3 -1
  146. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +33 -0
  147. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +24 -1
  148. package/src/core/objects/materialized-view/changes/materialized-view.base.ts +5 -1
  149. package/src/core/objects/materialized-view/changes/materialized-view.security-label.test.ts +63 -0
  150. package/src/core/objects/materialized-view/changes/materialized-view.security-label.ts +95 -0
  151. package/src/core/objects/materialized-view/changes/materialized-view.types.ts +3 -1
  152. package/src/core/objects/materialized-view/materialized-view.diff.ts +37 -0
  153. package/src/core/objects/materialized-view/materialized-view.model.ts +25 -4
  154. package/src/core/objects/procedure/changes/procedure.base.ts +5 -1
  155. package/src/core/objects/procedure/changes/procedure.security-label.ts +105 -0
  156. package/src/core/objects/procedure/changes/procedure.types.ts +3 -1
  157. package/src/core/objects/procedure/procedure.diff.ts +33 -0
  158. package/src/core/objects/procedure/procedure.model.ts +23 -2
  159. package/src/core/objects/publication/changes/publication.base.ts +1 -1
  160. package/src/core/objects/publication/changes/publication.security-label.ts +95 -0
  161. package/src/core/objects/publication/changes/publication.types.ts +3 -1
  162. package/src/core/objects/publication/publication.diff.ts +33 -0
  163. package/src/core/objects/publication/publication.model.ts +24 -1
  164. package/src/core/objects/role/changes/role.base.ts +2 -1
  165. package/src/core/objects/role/changes/role.security-label.ts +77 -0
  166. package/src/core/objects/role/changes/role.types.ts +3 -1
  167. package/src/core/objects/role/role.diff.ts +33 -0
  168. package/src/core/objects/role/role.model.ts +32 -0
  169. package/src/core/objects/schema/changes/schema.alter.test.ts +1 -0
  170. package/src/core/objects/schema/changes/schema.base.ts +5 -1
  171. package/src/core/objects/schema/changes/schema.create.test.ts +1 -0
  172. package/src/core/objects/schema/changes/schema.drop.test.ts +1 -0
  173. package/src/core/objects/schema/changes/schema.security-label.test.ts +76 -0
  174. package/src/core/objects/schema/changes/schema.security-label.ts +77 -0
  175. package/src/core/objects/schema/changes/schema.types.ts +3 -1
  176. package/src/core/objects/schema/schema.diff.test.ts +1 -0
  177. package/src/core/objects/schema/schema.diff.ts +43 -1
  178. package/src/core/objects/schema/schema.model.ts +21 -1
  179. package/src/core/objects/security-label.types.test.ts +106 -0
  180. package/src/core/objects/security-label.types.ts +61 -0
  181. package/src/core/objects/sequence/changes/sequence.base.ts +5 -1
  182. package/src/core/objects/sequence/changes/sequence.security-label.test.ts +58 -0
  183. package/src/core/objects/sequence/changes/sequence.security-label.ts +92 -0
  184. package/src/core/objects/sequence/changes/sequence.types.ts +3 -1
  185. package/src/core/objects/sequence/sequence.diff.ts +33 -0
  186. package/src/core/objects/sequence/sequence.model.ts +22 -1
  187. package/src/core/objects/subscription/changes/subscription.base.ts +1 -1
  188. package/src/core/objects/subscription/changes/subscription.security-label.ts +95 -0
  189. package/src/core/objects/subscription/changes/subscription.types.ts +3 -1
  190. package/src/core/objects/subscription/subscription.diff.ts +33 -0
  191. package/src/core/objects/subscription/subscription.model.ts +22 -1
  192. package/src/core/objects/table/changes/table.base.ts +5 -1
  193. package/src/core/objects/table/changes/table.security-label.test.ts +140 -0
  194. package/src/core/objects/table/changes/table.security-label.ts +183 -0
  195. package/src/core/objects/table/changes/table.types.ts +3 -1
  196. package/src/core/objects/table/table.diff.ts +87 -0
  197. package/src/core/objects/table/table.model.ts +42 -2
  198. package/src/core/objects/type/composite-type/changes/composite-type.base.ts +5 -1
  199. package/src/core/objects/type/composite-type/changes/composite-type.security-label.ts +95 -0
  200. package/src/core/objects/type/composite-type/changes/composite-type.types.ts +3 -1
  201. package/src/core/objects/type/composite-type/composite-type.diff.ts +33 -0
  202. package/src/core/objects/type/composite-type/composite-type.model.ts +26 -2
  203. package/src/core/objects/type/enum/changes/enum.base.ts +5 -1
  204. package/src/core/objects/type/enum/changes/enum.security-label.ts +77 -0
  205. package/src/core/objects/type/enum/changes/enum.types.ts +3 -1
  206. package/src/core/objects/type/enum/enum.diff.ts +33 -0
  207. package/src/core/objects/type/enum/enum.model.ts +25 -1
  208. package/src/core/objects/type/range/changes/range.base.ts +5 -1
  209. package/src/core/objects/type/range/changes/range.security-label.ts +77 -0
  210. package/src/core/objects/type/range/changes/range.types.ts +3 -1
  211. package/src/core/objects/type/range/range.diff.ts +33 -0
  212. package/src/core/objects/type/range/range.model.ts +22 -1
  213. package/src/core/objects/utils.ts +3 -0
  214. package/src/core/objects/view/changes/view.base.ts +5 -1
  215. package/src/core/objects/view/changes/view.security-label.test.ts +64 -0
  216. package/src/core/objects/view/changes/view.security-label.ts +77 -0
  217. package/src/core/objects/view/changes/view.types.ts +3 -1
  218. package/src/core/objects/view/view.diff.ts +31 -0
  219. package/src/core/objects/view/view.model.ts +25 -2
  220. package/src/core/plan/sql-format/fixtures.ts +1 -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
@@ -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
+ }
@@ -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
+ }
@@ -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]));