okmodel 0.2.1 → 0.3.0
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/README.md +710 -36
- package/dist/contracts/catalog/enum.d.ts +31 -4
- package/dist/contracts/catalog/extension.d.ts +61 -0
- package/dist/contracts/catalog/privilege.d.ts +64 -0
- package/dist/contracts/catalog/routine.d.ts +56 -0
- package/dist/contracts/catalog/types.d.ts +164 -10
- package/dist/contracts/catalog/view.d.ts +73 -0
- package/dist/dialects/pg/column.d.ts +3 -1
- package/dist/dialects/pg/ddl.d.ts +65 -1
- package/dist/dialects/pg/enum.d.ts +10 -8
- package/dist/dialects/pg/ext/citext.d.ts +14 -0
- package/dist/dialects/pg/ext/citext.js +11 -0
- package/dist/dialects/pg/ext/index.d.ts +52 -0
- package/dist/dialects/pg/ext/index.js +6 -0
- package/dist/dialects/pg/ext/pg-trgm.d.ts +53 -0
- package/dist/dialects/pg/ext/pg-trgm.js +42 -0
- package/dist/dialects/pg/fn/index.d.ts +107 -0
- package/dist/dialects/pg/fn/index.js +175 -0
- package/dist/dialects/pg/fn/touch.d.ts +14 -0
- package/dist/dialects/pg/index.js +104 -19
- package/dist/dialects/pg/introspect.d.ts +10 -1
- package/dist/dialects/pg/operators.d.ts +8 -1
- package/dist/dialects/pg/role/check.d.ts +45 -0
- package/dist/dialects/pg/role/index.d.ts +50 -0
- package/dist/dialects/pg/role/sql.d.ts +44 -0
- package/dist/dialects/pg/table.d.ts +7 -0
- package/dist/dialects/pg/tenancy.d.ts +9 -0
- package/dist/dialects/pg/view/client.d.ts +30 -0
- package/dist/dialects/pg/view/depend.d.ts +35 -0
- package/dist/dialects/pg/view/index.d.ts +114 -0
- package/dist/dialects/pg/view/index.js +289 -0
- package/dist/dialects/pg/view/scratch.d.ts +21 -0
- package/dist/dialects/pg/where.d.ts +2 -2
- package/dist/runtime/pg/bun.js +3 -3
- package/dist/runtime/pg/pg.js +3 -3
- package/dist/runtime/pg/pglite.js +3 -3
- package/dist/runtime/pg/postgresjs.js +3 -3
- package/dist/runtime/tenancy/index.js +6 -3
- package/dist/runtime/traits/index.d.ts +7 -2
- package/dist/runtime/traits/index.js +149 -12
- package/dist/runtime/validate/index.js +4 -4
- package/dist/shared/{ytg3xf9p.js → 01yr20s5.js} +3 -3
- package/dist/shared/{cstgkzdx.js → 0jc3ffzf.js} +1 -1
- package/dist/shared/{xkz8g6by.js → 1g0drakv.js} +2 -2
- package/dist/shared/{eaxwrgby.js → 1tfdfvhh.js} +4 -3
- package/dist/shared/2ssqrv66.js +1576 -0
- package/dist/shared/{10tjenmd.js → 3ekj9x92.js} +1 -1
- package/dist/shared/49ypnfwt.js +1122 -0
- package/dist/shared/{sacqha1y.js → 4m9fn52z.js} +2 -2
- package/dist/shared/5nmdenb6.js +1229 -0
- package/dist/shared/{qa5dsc7z.js → 6bazvqwm.js} +3 -3
- package/dist/shared/{x9v1qgeb.js → 6w5j844a.js} +1 -1
- package/dist/shared/{0qkxbm1f.js → 75xkjv0t.js} +1 -1
- package/dist/shared/7fvtrkwr.js +84 -0
- package/dist/shared/94ez8kzh.js +19 -0
- package/dist/shared/{1dp5knt7.js → 999ade2q.js} +2 -2
- package/dist/shared/{3a5ne750.js → 9m80mkac.js} +2 -2
- package/dist/shared/9x25fxhc.js +150 -0
- package/dist/shared/{4b9da9d7.js → axhk06q1.js} +19 -1
- package/dist/shared/{38crxbgn.js → bqha5cg6.js} +3 -3
- package/dist/shared/{zd93g3rq.js → bryqk9k9.js} +1 -1
- package/dist/shared/{n47rd821.js → c8aghh05.js} +1 -1
- package/dist/shared/{dd4f8mnx.js → c9z5g0fm.js} +4 -2
- package/dist/shared/{eqmtn1bj.js → dbjej1tw.js} +71 -14
- package/dist/shared/{ps43134h.js → dyj86cmj.js} +4 -4
- package/dist/shared/{sfh4pk75.js → fptpmvxp.js} +3 -3
- package/dist/shared/{97g2jnrw.js → fs0ex00p.js} +3 -3
- package/dist/shared/{rtnaqre0.js → g4f5kcx9.js} +2 -2
- package/dist/shared/{yw5c610b.js → gjthds9j.js} +2 -2
- package/dist/shared/hcmdtwgh.js +102 -0
- package/dist/shared/{qxa0yb9j.js → jkc6ws1p.js} +2 -54
- package/dist/shared/{mxmcdsh5.js → k34e0xf2.js} +9 -9
- package/dist/shared/{py3nh7jy.js → kgnc8grt.js} +2 -2
- package/dist/shared/{g9f0zqce.js → m78s7898.js} +1 -1
- package/dist/shared/meck53jv.js +99 -0
- package/dist/shared/{v18jva5b.js → mt5wswjz.js} +1 -1
- package/dist/shared/{g1b5zzj9.js → n0dgs0pb.js} +1 -1
- package/dist/shared/{zt8y0wzb.js → n7mcc1gk.js} +1 -1
- package/dist/shared/ne02ng5c.js +68 -0
- package/dist/shared/{e7a268fy.js → p24x2334.js} +1 -1
- package/dist/shared/qbxzvwwc.js +88 -0
- package/dist/shared/{a1gdp7j9.js → qybh48nd.js} +1 -1
- package/dist/shared/{d04j53v8.js → scwxrpx2.js} +5 -4
- package/dist/shared/{d2whjz4k.js → t616ynfn.js} +530 -24
- package/dist/shared/th14ygv2.js +69 -0
- package/dist/shared/{xatfg0gn.js → tmbdywx0.js} +4 -19
- package/dist/shared/{ge03bfca.js → ty3v3hfk.js} +2 -2
- package/dist/shared/wekze34d.js +246 -0
- package/dist/shared/{7mht49yd.js → x6wysh83.js} +59 -18
- package/dist/shared/{4jzzghr6.js → xva8v7qk.js} +8 -8
- package/dist/shared/{ecdzej21.js → xw1d69vd.js} +7 -7
- package/dist/shared/y005b761.js +112 -0
- package/dist/shared/{mrq77sgw.js → ydaz1sv3.js} +1 -1
- package/dist/tooling/cli.js +32 -8
- package/dist/tooling/migrate/apply.d.ts +16 -0
- package/dist/tooling/migrate/commands.d.ts +2 -1
- package/dist/tooling/migrate/config.d.ts +8 -0
- package/dist/tooling/migrate/doctor.d.ts +25 -0
- package/dist/tooling/migrate/drift.d.ts +19 -0
- package/dist/tooling/migrate/ext.d.ts +17 -0
- package/dist/tooling/migrate/extensions.d.ts +51 -0
- package/dist/tooling/migrate/managed.d.ts +17 -0
- package/dist/tooling/migrate/plan.d.ts +14 -1
- package/dist/tooling/migrate/project.d.ts +25 -1
- package/dist/tooling/migrate/type-name.d.ts +19 -0
- package/package.json +22 -2
- package/dist/shared/5z4q2zda.js +0 -2073
- /package/dist/shared/{9k6vetvf.js → rrstp3kb.js} +0 -0
|
@@ -1,8 +1,24 @@
|
|
|
1
|
+
import {
|
|
2
|
+
functionObject,
|
|
3
|
+
triggerObject
|
|
4
|
+
} from "./9x25fxhc.js";
|
|
5
|
+
import {
|
|
6
|
+
viewObject,
|
|
7
|
+
materializedViewObject,
|
|
8
|
+
materializedViewIndex
|
|
9
|
+
} from "./y005b761.js";
|
|
10
|
+
import {
|
|
11
|
+
extensionObject
|
|
12
|
+
} from "./th14ygv2.js";
|
|
1
13
|
import {
|
|
2
14
|
dependencyOrder,
|
|
3
|
-
catalog
|
|
4
|
-
|
|
5
|
-
|
|
15
|
+
catalog
|
|
16
|
+
} from "./jkc6ws1p.js";
|
|
17
|
+
import {
|
|
18
|
+
enumType,
|
|
19
|
+
domainType,
|
|
20
|
+
isDomain
|
|
21
|
+
} from "./qbxzvwwc.js";
|
|
6
22
|
import {
|
|
7
23
|
canonicalJson,
|
|
8
24
|
staticNamespace2,
|
|
@@ -18,7 +34,9 @@ import {
|
|
|
18
34
|
index3,
|
|
19
35
|
constraint2,
|
|
20
36
|
sequence2,
|
|
21
|
-
|
|
37
|
+
normaliseEdges,
|
|
38
|
+
compareText,
|
|
39
|
+
assertProvenance
|
|
22
40
|
} from "./t4tbsy9h.js";
|
|
23
41
|
import {
|
|
24
42
|
OWNERS2,
|
|
@@ -27,7 +45,8 @@ import {
|
|
|
27
45
|
CATALOG_VERSION2
|
|
28
46
|
} from "./4e4c6vq2.js";
|
|
29
47
|
import {
|
|
30
|
-
sha2562
|
|
48
|
+
sha2562,
|
|
49
|
+
assertIdentifier2
|
|
31
50
|
} from "./nfzc5z0w.js";
|
|
32
51
|
import {
|
|
33
52
|
catalogError2
|
|
@@ -89,6 +108,60 @@ function isIdentPart(char) {
|
|
|
89
108
|
return isIdentStart(char) || char >= "0" && char <= "9";
|
|
90
109
|
}
|
|
91
110
|
|
|
111
|
+
// src/contracts/catalog/privilege.ts
|
|
112
|
+
function roleObject(input) {
|
|
113
|
+
assertIdentifier2(input.name, "role");
|
|
114
|
+
assertProvenance(input.provenance);
|
|
115
|
+
return {
|
|
116
|
+
kind: "role",
|
|
117
|
+
identity: { kind: "role", name: input.name },
|
|
118
|
+
owner: input.owner ?? "managed",
|
|
119
|
+
definition: {
|
|
120
|
+
login: input.login === true,
|
|
121
|
+
inherit: input.inherit !== false
|
|
122
|
+
},
|
|
123
|
+
dependencies: normaliseEdges(input.dependencies ?? []),
|
|
124
|
+
provenance: input.provenance
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
function grantObject(input) {
|
|
128
|
+
assertIdentifier2(input.role, "role");
|
|
129
|
+
assertProvenance(input.provenance);
|
|
130
|
+
return {
|
|
131
|
+
kind: "grant",
|
|
132
|
+
identity: {
|
|
133
|
+
kind: "grant",
|
|
134
|
+
role: input.role,
|
|
135
|
+
object: input.object,
|
|
136
|
+
privilege: input.privilege
|
|
137
|
+
},
|
|
138
|
+
owner: input.owner ?? "managed",
|
|
139
|
+
definition: {},
|
|
140
|
+
dependencies: normaliseEdges(input.dependencies ?? []),
|
|
141
|
+
provenance: input.provenance
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
function defaultPrivilegeObject(input) {
|
|
145
|
+
assertIdentifier2(input.forRole, "role");
|
|
146
|
+
assertIdentifier2(input.grantee, "role");
|
|
147
|
+
assertProvenance(input.provenance);
|
|
148
|
+
return {
|
|
149
|
+
kind: "defaultPrivilege",
|
|
150
|
+
identity: {
|
|
151
|
+
kind: "defaultPrivilege",
|
|
152
|
+
forRole: input.forRole,
|
|
153
|
+
namespace: input.namespace,
|
|
154
|
+
objectKind: input.objectKind,
|
|
155
|
+
grantee: input.grantee,
|
|
156
|
+
privilege: input.privilege
|
|
157
|
+
},
|
|
158
|
+
owner: input.owner ?? "managed",
|
|
159
|
+
definition: {},
|
|
160
|
+
dependencies: normaliseEdges(input.dependencies ?? []),
|
|
161
|
+
provenance: input.provenance
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
|
|
92
165
|
// src/contracts/catalog/document.ts
|
|
93
166
|
function creationOrder2(source) {
|
|
94
167
|
return dependencyOrder(source.objects);
|
|
@@ -219,10 +292,60 @@ function rewriteRenamed(object, change, fromKey, toIdentity) {
|
|
|
219
292
|
return rewriteSequence(object, dependencies);
|
|
220
293
|
case "type":
|
|
221
294
|
return rewriteType(object, dependencies);
|
|
295
|
+
case "extension":
|
|
296
|
+
return retargeted(object, dependencies);
|
|
297
|
+
case "function": {
|
|
298
|
+
const local = object.dependencies.some((edge) => edge.target.kind === "column" && sameRef2(edge.target.parent, change.parent));
|
|
299
|
+
return functionObject({
|
|
300
|
+
namespace: object.identity.namespace,
|
|
301
|
+
name: object.identity.name,
|
|
302
|
+
arguments: object.definition.arguments,
|
|
303
|
+
returns: object.definition.returns,
|
|
304
|
+
language: object.definition.language,
|
|
305
|
+
volatility: object.definition.volatility,
|
|
306
|
+
security: object.definition.security,
|
|
307
|
+
body: rewriteExpr(object.definition.body, change, local),
|
|
308
|
+
owner: object.owner,
|
|
309
|
+
provenance: object.provenance,
|
|
310
|
+
dependencies,
|
|
311
|
+
...object.definition.searchPath !== undefined ? { searchPath: object.definition.searchPath } : {},
|
|
312
|
+
...object.definition.atomic === true ? { atomic: true } : {}
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
case "view":
|
|
316
|
+
case "materializedView": {
|
|
317
|
+
const local = object.dependencies.some((edge) => edge.target.kind === "column" && sameRef2(edge.target.parent, change.parent));
|
|
318
|
+
return rewriteView(object, dependencies, rewriteExpr(object.definition.query, change, local));
|
|
319
|
+
}
|
|
320
|
+
case "role":
|
|
321
|
+
case "grant":
|
|
322
|
+
case "defaultPrivilege":
|
|
323
|
+
return retargeted(object, dependencies);
|
|
324
|
+
case "trigger": {
|
|
325
|
+
const local = sameRef2(object.identity.parent, change.parent);
|
|
326
|
+
return triggerObject({
|
|
327
|
+
parent: object.identity.parent,
|
|
328
|
+
name: object.identity.name,
|
|
329
|
+
timing: object.definition.timing,
|
|
330
|
+
events: object.definition.events,
|
|
331
|
+
level: object.definition.level,
|
|
332
|
+
calls: object.definition.calls,
|
|
333
|
+
owner: object.owner,
|
|
334
|
+
provenance: object.provenance,
|
|
335
|
+
dependencies,
|
|
336
|
+
...object.definition.updateOf !== undefined ? {
|
|
337
|
+
updateOf: local ? renameList(object.definition.updateOf, change.from, change.to) : object.definition.updateOf
|
|
338
|
+
} : {},
|
|
339
|
+
...object.definition.when !== undefined ? { when: rewriteExpr(object.definition.when, change, local) } : {}
|
|
340
|
+
});
|
|
341
|
+
}
|
|
222
342
|
default:
|
|
223
343
|
return assertNever(object);
|
|
224
344
|
}
|
|
225
345
|
}
|
|
346
|
+
function retargeted(object, dependencies) {
|
|
347
|
+
return { ...object, dependencies: dependencies.map((target) => ({ target })) };
|
|
348
|
+
}
|
|
226
349
|
function rewriteTable(object, change, dependencies) {
|
|
227
350
|
const partition = object.definition.partition;
|
|
228
351
|
const renamed = partition !== undefined && object.identity.name === change.parent.name && sameNamespace2(object.identity.namespace, change.parent.namespace);
|
|
@@ -266,17 +389,39 @@ function rewriteColumn(object, change, dependencies) {
|
|
|
266
389
|
function rewriteIndex(object, change, dependencies) {
|
|
267
390
|
const local = sameRef2(object.identity.parent, change.parent);
|
|
268
391
|
const definition = object.definition;
|
|
392
|
+
return indexAgain(object, object.identity.parent, dependencies, {
|
|
393
|
+
columns: local ? renameList(definition.columns, change.from, change.to) : [...definition.columns],
|
|
394
|
+
...definition.predicate !== undefined ? { predicate: rewriteExpr(definition.predicate, change, local) } : {},
|
|
395
|
+
...definition.expression !== undefined ? { expression: rewriteExpr(definition.expression, change, local) } : {}
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
function indexAgain(object, parent, dependencies, patch) {
|
|
399
|
+
const onView = dependencies.some((edge) => edge.kind === "view" || edge.kind === "materializedView");
|
|
400
|
+
if (onView) {
|
|
401
|
+
return materializedViewIndex({
|
|
402
|
+
parent,
|
|
403
|
+
name: object.identity.name,
|
|
404
|
+
nameKey: object.definition.nameKey,
|
|
405
|
+
columns: patch.columns,
|
|
406
|
+
unique: object.definition.unique,
|
|
407
|
+
owner: object.owner,
|
|
408
|
+
provenance: object.provenance,
|
|
409
|
+
dependencies,
|
|
410
|
+
...patch.predicate !== undefined ? { predicate: patch.predicate } : {},
|
|
411
|
+
...patch.expression !== undefined ? { expression: patch.expression } : {}
|
|
412
|
+
});
|
|
413
|
+
}
|
|
269
414
|
return index3({
|
|
270
|
-
parent
|
|
415
|
+
parent,
|
|
271
416
|
name: object.identity.name,
|
|
272
|
-
nameKey: definition.nameKey,
|
|
273
|
-
columns:
|
|
274
|
-
unique: definition.unique,
|
|
417
|
+
nameKey: object.definition.nameKey,
|
|
418
|
+
columns: patch.columns,
|
|
419
|
+
unique: object.definition.unique,
|
|
275
420
|
owner: object.owner,
|
|
276
421
|
provenance: object.provenance,
|
|
277
422
|
dependencies,
|
|
278
|
-
...
|
|
279
|
-
...
|
|
423
|
+
...patch.predicate !== undefined ? { predicate: patch.predicate } : {},
|
|
424
|
+
...patch.expression !== undefined ? { expression: patch.expression } : {}
|
|
280
425
|
});
|
|
281
426
|
}
|
|
282
427
|
function rewriteConstraint(object, change, dependencies) {
|
|
@@ -305,6 +450,24 @@ function rewriteConstraint(object, change, dependencies) {
|
|
|
305
450
|
...referenced !== undefined ? { references: referenced } : {}
|
|
306
451
|
});
|
|
307
452
|
}
|
|
453
|
+
function rewriteView(object, dependencies, query) {
|
|
454
|
+
const input = {
|
|
455
|
+
namespace: object.identity.namespace,
|
|
456
|
+
name: object.identity.name,
|
|
457
|
+
columns: object.definition.columns,
|
|
458
|
+
query,
|
|
459
|
+
owner: object.owner,
|
|
460
|
+
provenance: object.provenance,
|
|
461
|
+
dependencies
|
|
462
|
+
};
|
|
463
|
+
if (object.kind === "materializedView") {
|
|
464
|
+
return materializedViewObject({
|
|
465
|
+
...input,
|
|
466
|
+
...object.definition.refresh !== undefined ? { refresh: object.definition.refresh } : {}
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
return viewObject(input);
|
|
470
|
+
}
|
|
308
471
|
function rewriteExpr(text, change, active) {
|
|
309
472
|
if (!active)
|
|
310
473
|
return text;
|
|
@@ -344,15 +507,8 @@ function rewriteTableName(object, change, fromKey, toIdentity) {
|
|
|
344
507
|
});
|
|
345
508
|
}
|
|
346
509
|
if (object.kind === "index") {
|
|
347
|
-
return
|
|
348
|
-
parent,
|
|
349
|
-
name: object.identity.name,
|
|
350
|
-
nameKey: object.definition.nameKey,
|
|
510
|
+
return indexAgain(object, parent, dependencies, {
|
|
351
511
|
columns: [...object.definition.columns],
|
|
352
|
-
unique: object.definition.unique,
|
|
353
|
-
owner: object.owner,
|
|
354
|
-
provenance: object.provenance,
|
|
355
|
-
dependencies,
|
|
356
512
|
...object.definition.predicate !== undefined ? {
|
|
357
513
|
predicate: rewriteExpr(object.definition.predicate, { from: change.from, to: change.to }, local)
|
|
358
514
|
} : {},
|
|
@@ -390,6 +546,59 @@ function rewriteTableName(object, change, fromKey, toIdentity) {
|
|
|
390
546
|
return rewriteSequence(object, dependencies);
|
|
391
547
|
if (object.kind === "type")
|
|
392
548
|
return rewriteType(object, dependencies);
|
|
549
|
+
if (object.kind === "extension") {
|
|
550
|
+
return { ...object, dependencies: dependencies.map((target) => ({ target })) };
|
|
551
|
+
}
|
|
552
|
+
if (object.kind === "function") {
|
|
553
|
+
const local = object.dependencies.some((edge) => edge.target.kind === "table" && edge.target.name === change.from && sameNamespace2(edge.target.namespace, change.namespace));
|
|
554
|
+
return functionObject({
|
|
555
|
+
namespace: object.identity.namespace,
|
|
556
|
+
name: object.identity.name,
|
|
557
|
+
arguments: object.definition.arguments,
|
|
558
|
+
returns: object.definition.returns,
|
|
559
|
+
language: object.definition.language,
|
|
560
|
+
volatility: object.definition.volatility,
|
|
561
|
+
security: object.definition.security,
|
|
562
|
+
body: rewriteExpr(object.definition.body, { from: change.from, to: change.to }, local),
|
|
563
|
+
owner: object.owner,
|
|
564
|
+
provenance: object.provenance,
|
|
565
|
+
dependencies,
|
|
566
|
+
...object.definition.searchPath !== undefined ? { searchPath: object.definition.searchPath } : {},
|
|
567
|
+
...object.definition.atomic === true ? { atomic: true } : {}
|
|
568
|
+
});
|
|
569
|
+
}
|
|
570
|
+
if (object.kind === "view" || object.kind === "materializedView") {
|
|
571
|
+
const local = object.dependencies.some((edge) => {
|
|
572
|
+
if (edge.target.kind === "table") {
|
|
573
|
+
return edge.target.name === change.from && sameNamespace2(edge.target.namespace, change.namespace);
|
|
574
|
+
}
|
|
575
|
+
if (edge.target.kind === "column") {
|
|
576
|
+
return edge.target.parent.name === change.from && sameNamespace2(edge.target.parent.namespace, change.namespace);
|
|
577
|
+
}
|
|
578
|
+
return false;
|
|
579
|
+
});
|
|
580
|
+
return rewriteView(object, dependencies, rewriteExpr(object.definition.query, { from: change.from, to: change.to }, local));
|
|
581
|
+
}
|
|
582
|
+
if (object.kind === "role" || object.kind === "grant" || object.kind === "defaultPrivilege") {
|
|
583
|
+
return retargeted(object, dependencies);
|
|
584
|
+
}
|
|
585
|
+
if (object.kind === "trigger") {
|
|
586
|
+
const parent = movedParent(object.identity.parent, change);
|
|
587
|
+
const local = parent.name !== object.identity.parent.name;
|
|
588
|
+
return triggerObject({
|
|
589
|
+
parent,
|
|
590
|
+
name: object.identity.name,
|
|
591
|
+
timing: object.definition.timing,
|
|
592
|
+
events: object.definition.events,
|
|
593
|
+
level: object.definition.level,
|
|
594
|
+
calls: object.definition.calls,
|
|
595
|
+
owner: object.owner,
|
|
596
|
+
provenance: object.provenance,
|
|
597
|
+
dependencies,
|
|
598
|
+
...object.definition.updateOf !== undefined ? { updateOf: object.definition.updateOf } : {},
|
|
599
|
+
...object.definition.when !== undefined ? { when: rewriteExpr(object.definition.when, { from: change.from, to: change.to }, local) } : {}
|
|
600
|
+
});
|
|
601
|
+
}
|
|
393
602
|
return assertNever(object);
|
|
394
603
|
}
|
|
395
604
|
function movedParent(parent, change) {
|
|
@@ -399,6 +608,17 @@ function movedParent(parent, change) {
|
|
|
399
608
|
return parent;
|
|
400
609
|
}
|
|
401
610
|
function rewriteType(object, dependencies) {
|
|
611
|
+
if (isDomain(object.definition)) {
|
|
612
|
+
return domainType({
|
|
613
|
+
namespace: object.identity.namespace,
|
|
614
|
+
name: object.identity.name,
|
|
615
|
+
base: object.definition.base,
|
|
616
|
+
check: object.definition.check,
|
|
617
|
+
owner: object.owner,
|
|
618
|
+
provenance: object.provenance,
|
|
619
|
+
dependencies
|
|
620
|
+
});
|
|
621
|
+
}
|
|
402
622
|
return enumType({
|
|
403
623
|
namespace: object.identity.namespace,
|
|
404
624
|
name: object.identity.name,
|
|
@@ -513,7 +733,68 @@ function definitionToJson(object) {
|
|
|
513
733
|
start: object.definition.start
|
|
514
734
|
};
|
|
515
735
|
case "type":
|
|
516
|
-
return { labels: object.definition.labels };
|
|
736
|
+
return isDomain(object.definition) ? { base: object.definition.base, check: object.definition.check } : { labels: object.definition.labels };
|
|
737
|
+
case "extension": {
|
|
738
|
+
const definition = object.definition;
|
|
739
|
+
return {
|
|
740
|
+
relocatable: definition.relocatable,
|
|
741
|
+
schema: definition.schema,
|
|
742
|
+
...definition.version !== undefined ? { version: definition.version } : {}
|
|
743
|
+
};
|
|
744
|
+
}
|
|
745
|
+
case "function": {
|
|
746
|
+
const definition = object.definition;
|
|
747
|
+
return {
|
|
748
|
+
arguments: definition.arguments.map((argument) => ({
|
|
749
|
+
name: argument.name,
|
|
750
|
+
type: argument.type
|
|
751
|
+
})),
|
|
752
|
+
body: definition.body,
|
|
753
|
+
language: definition.language,
|
|
754
|
+
returns: definition.returns,
|
|
755
|
+
security: definition.security,
|
|
756
|
+
volatility: definition.volatility,
|
|
757
|
+
...definition.atomic === true ? { atomic: true } : {},
|
|
758
|
+
...definition.searchPath !== undefined ? { searchPath: definition.searchPath } : {}
|
|
759
|
+
};
|
|
760
|
+
}
|
|
761
|
+
case "trigger": {
|
|
762
|
+
const definition = object.definition;
|
|
763
|
+
return {
|
|
764
|
+
calls: {
|
|
765
|
+
argTypes: [...definition.calls.argTypes],
|
|
766
|
+
name: definition.calls.name,
|
|
767
|
+
namespace: namespaceToJson(definition.calls.namespace)
|
|
768
|
+
},
|
|
769
|
+
events: [...definition.events],
|
|
770
|
+
level: definition.level,
|
|
771
|
+
timing: definition.timing,
|
|
772
|
+
...definition.updateOf !== undefined ? { updateOf: [...definition.updateOf] } : {},
|
|
773
|
+
...definition.when !== undefined ? { when: definition.when } : {}
|
|
774
|
+
};
|
|
775
|
+
}
|
|
776
|
+
case "view":
|
|
777
|
+
return {
|
|
778
|
+
columns: object.definition.columns.map((column) => ({
|
|
779
|
+
dataType: column.dataType,
|
|
780
|
+
name: column.name
|
|
781
|
+
})),
|
|
782
|
+
query: object.definition.query
|
|
783
|
+
};
|
|
784
|
+
case "materializedView":
|
|
785
|
+
return {
|
|
786
|
+
columns: object.definition.columns.map((column) => ({
|
|
787
|
+
dataType: column.dataType,
|
|
788
|
+
name: column.name
|
|
789
|
+
})),
|
|
790
|
+
query: object.definition.query,
|
|
791
|
+
...object.definition.refresh !== undefined ? { refresh: object.definition.refresh } : {}
|
|
792
|
+
};
|
|
793
|
+
case "role":
|
|
794
|
+
return { inherit: object.definition.inherit, login: object.definition.login };
|
|
795
|
+
case "grant":
|
|
796
|
+
case "defaultPrivilege":
|
|
797
|
+
return {};
|
|
517
798
|
default:
|
|
518
799
|
return assertNever(object);
|
|
519
800
|
}
|
|
@@ -546,6 +827,21 @@ function parseObject(value) {
|
|
|
546
827
|
return parseSequence(identity, definition, owner, provenance, dependencies);
|
|
547
828
|
case "type":
|
|
548
829
|
return parseType(identity, definition, owner, provenance, dependencies);
|
|
830
|
+
case "extension":
|
|
831
|
+
return parseExtension(identity, definition, owner, provenance, dependencies);
|
|
832
|
+
case "function":
|
|
833
|
+
return parseFunction(identity, definition, owner, provenance, dependencies);
|
|
834
|
+
case "trigger":
|
|
835
|
+
return parseTrigger(identity, definition, owner, provenance, dependencies);
|
|
836
|
+
case "view":
|
|
837
|
+
case "materializedView":
|
|
838
|
+
return parseView(kind, identity, definition, owner, provenance, dependencies);
|
|
839
|
+
case "role":
|
|
840
|
+
return parseRole(identity, definition, owner, provenance, dependencies);
|
|
841
|
+
case "grant":
|
|
842
|
+
return parseGrant(identity, definition, owner, provenance, dependencies);
|
|
843
|
+
case "defaultPrivilege":
|
|
844
|
+
return parseDefaultPrivilege(identity, definition, owner, provenance, dependencies);
|
|
549
845
|
default:
|
|
550
846
|
return assertNeverKind(kind);
|
|
551
847
|
}
|
|
@@ -668,6 +964,18 @@ function parseType(identity, definition, owner, provenance, dependencies) {
|
|
|
668
964
|
if (identity.kind !== "type") {
|
|
669
965
|
catalogError2("OKM1020", `Type object identity is ${identity.kind}, not a type.`);
|
|
670
966
|
}
|
|
967
|
+
if ("base" in definition || "check" in definition) {
|
|
968
|
+
rejectUnknown(definition, ["base", "check"], "type definition");
|
|
969
|
+
return domainType({
|
|
970
|
+
namespace: identity.namespace,
|
|
971
|
+
name: identity.name,
|
|
972
|
+
base: requireString(definition.base, "domain base"),
|
|
973
|
+
check: requireString(definition.check, "domain check"),
|
|
974
|
+
owner,
|
|
975
|
+
provenance,
|
|
976
|
+
dependencies
|
|
977
|
+
});
|
|
978
|
+
}
|
|
671
979
|
rejectUnknown(definition, ["labels"], "type definition");
|
|
672
980
|
return enumType({
|
|
673
981
|
namespace: identity.namespace,
|
|
@@ -678,6 +986,160 @@ function parseType(identity, definition, owner, provenance, dependencies) {
|
|
|
678
986
|
dependencies
|
|
679
987
|
});
|
|
680
988
|
}
|
|
989
|
+
function parseFunction(identity, definition, owner, provenance, dependencies) {
|
|
990
|
+
if (identity.kind !== "function") {
|
|
991
|
+
catalogError2("OKM1020", `Function object identity is ${identity.kind}, not a function.`);
|
|
992
|
+
}
|
|
993
|
+
rejectUnknown(definition, ["arguments", "atomic", "body", "language", "returns", "searchPath", "security", "volatility"], "function definition");
|
|
994
|
+
const language = requireString(definition.language, "function language");
|
|
995
|
+
if (language !== "sql" && language !== "plpgsql") {
|
|
996
|
+
catalogError2("OKM1020", `Function ${identity.name} language must be sql or plpgsql.`);
|
|
997
|
+
}
|
|
998
|
+
const volatility = parseVolatility(definition.volatility);
|
|
999
|
+
const security = parseSecurity(definition.security);
|
|
1000
|
+
return functionObject({
|
|
1001
|
+
namespace: identity.namespace,
|
|
1002
|
+
name: identity.name,
|
|
1003
|
+
arguments: parseArguments(definition.arguments),
|
|
1004
|
+
returns: requireString(definition.returns, "function returns"),
|
|
1005
|
+
language,
|
|
1006
|
+
body: requireString(definition.body, "function body"),
|
|
1007
|
+
owner,
|
|
1008
|
+
provenance,
|
|
1009
|
+
dependencies,
|
|
1010
|
+
...volatility !== undefined ? { volatility } : {},
|
|
1011
|
+
...security !== undefined ? { security } : {},
|
|
1012
|
+
...definition.atomic === true ? { atomic: true } : {},
|
|
1013
|
+
...definition.searchPath !== undefined ? { searchPath: requireString(definition.searchPath, "search path") } : {}
|
|
1014
|
+
});
|
|
1015
|
+
}
|
|
1016
|
+
function parseArguments(value) {
|
|
1017
|
+
if (value === undefined)
|
|
1018
|
+
return [];
|
|
1019
|
+
if (!Array.isArray(value))
|
|
1020
|
+
catalogError2("OKM1020", "Function arguments must be an array.");
|
|
1021
|
+
return value.map((item) => {
|
|
1022
|
+
const record = requireRecord(item, "function argument");
|
|
1023
|
+
rejectUnknown(record, ["name", "type"], "function argument");
|
|
1024
|
+
return {
|
|
1025
|
+
name: requireString(record.name, "argument name"),
|
|
1026
|
+
type: requireString(record.type, "argument type")
|
|
1027
|
+
};
|
|
1028
|
+
});
|
|
1029
|
+
}
|
|
1030
|
+
function parseVolatility(value) {
|
|
1031
|
+
if (value === undefined)
|
|
1032
|
+
return;
|
|
1033
|
+
const text = requireString(value, "volatility");
|
|
1034
|
+
if (text !== "volatile" && text !== "stable" && text !== "immutable") {
|
|
1035
|
+
catalogError2("OKM1020", `Volatility ${text} is not supported.`);
|
|
1036
|
+
}
|
|
1037
|
+
return text;
|
|
1038
|
+
}
|
|
1039
|
+
function parseSecurity(value) {
|
|
1040
|
+
if (value === undefined)
|
|
1041
|
+
return;
|
|
1042
|
+
const text = requireString(value, "security");
|
|
1043
|
+
if (text !== "invoker" && text !== "definer") {
|
|
1044
|
+
catalogError2("OKM1020", `Security ${text} is not supported.`);
|
|
1045
|
+
}
|
|
1046
|
+
return text;
|
|
1047
|
+
}
|
|
1048
|
+
function parseTrigger(identity, definition, owner, provenance, dependencies) {
|
|
1049
|
+
if (identity.kind !== "trigger") {
|
|
1050
|
+
catalogError2("OKM1020", `Trigger object identity is ${identity.kind}, not a trigger.`);
|
|
1051
|
+
}
|
|
1052
|
+
rejectUnknown(definition, ["calls", "events", "level", "timing", "updateOf", "when"], "trigger definition");
|
|
1053
|
+
const timing = requireString(definition.timing, "trigger timing");
|
|
1054
|
+
if (timing !== "before" && timing !== "after" && timing !== "instead") {
|
|
1055
|
+
catalogError2("OKM1020", `Trigger timing ${timing} is not supported.`);
|
|
1056
|
+
}
|
|
1057
|
+
const level = requireString(definition.level, "trigger level");
|
|
1058
|
+
if (level !== "row" && level !== "statement") {
|
|
1059
|
+
catalogError2("OKM1020", `Trigger level ${level} is not supported.`);
|
|
1060
|
+
}
|
|
1061
|
+
const calls = requireRecord(definition.calls, "trigger call");
|
|
1062
|
+
rejectUnknown(calls, ["argTypes", "name", "namespace"], "trigger call");
|
|
1063
|
+
return triggerObject({
|
|
1064
|
+
parent: identity.parent,
|
|
1065
|
+
name: identity.name,
|
|
1066
|
+
timing,
|
|
1067
|
+
events: requireStrings(definition.events, "trigger events").map(parseEvent),
|
|
1068
|
+
level,
|
|
1069
|
+
calls: {
|
|
1070
|
+
namespace: parseNamespace(calls.namespace),
|
|
1071
|
+
name: requireString(calls.name, "trigger function"),
|
|
1072
|
+
argTypes: requireStrings(calls.argTypes, "trigger argument types")
|
|
1073
|
+
},
|
|
1074
|
+
owner,
|
|
1075
|
+
provenance,
|
|
1076
|
+
dependencies,
|
|
1077
|
+
...definition.updateOf !== undefined ? { updateOf: requireStrings(definition.updateOf, "update of") } : {},
|
|
1078
|
+
...definition.when !== undefined ? { when: requireString(definition.when, "when") } : {}
|
|
1079
|
+
});
|
|
1080
|
+
}
|
|
1081
|
+
function parseView(kind, identity, definition, owner, provenance, dependencies) {
|
|
1082
|
+
if (identity.kind !== kind) {
|
|
1083
|
+
catalogError2("OKM1020", `View object identity is ${identity.kind}, not a ${kind}.`);
|
|
1084
|
+
}
|
|
1085
|
+
const fields = kind === "view" ? ["columns", "query"] : ["columns", "query", "refresh"];
|
|
1086
|
+
rejectUnknown(definition, fields, "view definition");
|
|
1087
|
+
const columns = parseViewColumns(definition.columns);
|
|
1088
|
+
const query = requireString(definition.query, "view query");
|
|
1089
|
+
const refresh = definition.refresh;
|
|
1090
|
+
if (refresh !== undefined && refresh !== "concurrently") {
|
|
1091
|
+
catalogError2("OKM1020", `Materialized view ${identity.name} refresh is not supported.`);
|
|
1092
|
+
}
|
|
1093
|
+
const input = {
|
|
1094
|
+
namespace: identity.namespace,
|
|
1095
|
+
name: identity.name,
|
|
1096
|
+
columns,
|
|
1097
|
+
query,
|
|
1098
|
+
owner,
|
|
1099
|
+
provenance,
|
|
1100
|
+
dependencies
|
|
1101
|
+
};
|
|
1102
|
+
if (kind === "materializedView") {
|
|
1103
|
+
return materializedViewObject({
|
|
1104
|
+
...input,
|
|
1105
|
+
...refresh === "concurrently" ? { refresh: "concurrently" } : {}
|
|
1106
|
+
});
|
|
1107
|
+
}
|
|
1108
|
+
return viewObject(input);
|
|
1109
|
+
}
|
|
1110
|
+
function parseViewColumns(value) {
|
|
1111
|
+
if (!Array.isArray(value))
|
|
1112
|
+
catalogError2("OKM1020", "View columns must be a list.");
|
|
1113
|
+
return value.map((item) => {
|
|
1114
|
+
const record = requireRecord(item, "view column");
|
|
1115
|
+
rejectUnknown(record, ["dataType", "name"], "view column");
|
|
1116
|
+
return {
|
|
1117
|
+
name: requireString(record.name, "view column"),
|
|
1118
|
+
dataType: requireString(record.dataType, "view column type")
|
|
1119
|
+
};
|
|
1120
|
+
});
|
|
1121
|
+
}
|
|
1122
|
+
function parseEvent(value) {
|
|
1123
|
+
if (value !== "insert" && value !== "update" && value !== "delete" && value !== "truncate") {
|
|
1124
|
+
catalogError2("OKM1020", `Trigger event ${value} is not supported.`);
|
|
1125
|
+
}
|
|
1126
|
+
return value;
|
|
1127
|
+
}
|
|
1128
|
+
function parseExtension(identity, definition, owner, provenance, dependencies) {
|
|
1129
|
+
if (identity.kind !== "extension") {
|
|
1130
|
+
catalogError2("OKM1020", `Extension object identity is ${identity.kind}, not an extension.`);
|
|
1131
|
+
}
|
|
1132
|
+
rejectUnknown(definition, ["relocatable", "schema", "version"], "extension definition");
|
|
1133
|
+
return extensionObject({
|
|
1134
|
+
name: identity.name,
|
|
1135
|
+
schema: requireString(definition.schema, "extension schema"),
|
|
1136
|
+
relocatable: requireBoolean(definition.relocatable, "relocatable"),
|
|
1137
|
+
...definition.version !== undefined ? { version: requireString(definition.version, "extension version") } : {},
|
|
1138
|
+
owner,
|
|
1139
|
+
provenance,
|
|
1140
|
+
dependencies
|
|
1141
|
+
});
|
|
1142
|
+
}
|
|
681
1143
|
function parseIdentity(value) {
|
|
682
1144
|
const record = requireRecord(value, "identity");
|
|
683
1145
|
const kind = requireString(record.kind, "identity kind");
|
|
@@ -763,8 +1225,8 @@ function parseGrantObject(value) {
|
|
|
763
1225
|
const record = requireRecord(value, "grant object");
|
|
764
1226
|
rejectUnknown(record, ["kind", "name", "namespace"], "grant object");
|
|
765
1227
|
const kind = requireString(record.kind, "grant object kind");
|
|
766
|
-
if (kind !== "table" && kind !== "sequence" && kind !== "namespace") {
|
|
767
|
-
catalogError2("OKM1020", `Grant object kind ${kind} must be table, sequence, or namespace.`);
|
|
1228
|
+
if (kind !== "table" && kind !== "view" && kind !== "materializedView" && kind !== "sequence" && kind !== "function" && kind !== "namespace") {
|
|
1229
|
+
catalogError2("OKM1020", `Grant object kind ${kind} must be table, view, materializedView, sequence, function, or namespace.`);
|
|
768
1230
|
}
|
|
769
1231
|
return {
|
|
770
1232
|
kind,
|
|
@@ -772,6 +1234,50 @@ function parseGrantObject(value) {
|
|
|
772
1234
|
namespace: parseNamespace(record.namespace)
|
|
773
1235
|
};
|
|
774
1236
|
}
|
|
1237
|
+
function parseRole(identity, definition, owner, provenance, dependencies) {
|
|
1238
|
+
if (identity.kind !== "role") {
|
|
1239
|
+
catalogError2("OKM1020", `Role object identity is ${identity.kind}, not a role.`);
|
|
1240
|
+
}
|
|
1241
|
+
rejectUnknown(definition, ["inherit", "login"], "role definition");
|
|
1242
|
+
return roleObject({
|
|
1243
|
+
name: identity.name,
|
|
1244
|
+
login: requireBoolean(definition.login, "login"),
|
|
1245
|
+
inherit: requireBoolean(definition.inherit, "inherit"),
|
|
1246
|
+
owner,
|
|
1247
|
+
provenance,
|
|
1248
|
+
dependencies
|
|
1249
|
+
});
|
|
1250
|
+
}
|
|
1251
|
+
function parseGrant(identity, definition, owner, provenance, dependencies) {
|
|
1252
|
+
if (identity.kind !== "grant") {
|
|
1253
|
+
catalogError2("OKM1020", `Grant object identity is ${identity.kind}, not a grant.`);
|
|
1254
|
+
}
|
|
1255
|
+
rejectUnknown(definition, [], "grant definition");
|
|
1256
|
+
return grantObject({
|
|
1257
|
+
role: identity.role,
|
|
1258
|
+
object: identity.object,
|
|
1259
|
+
privilege: identity.privilege,
|
|
1260
|
+
owner,
|
|
1261
|
+
provenance,
|
|
1262
|
+
dependencies
|
|
1263
|
+
});
|
|
1264
|
+
}
|
|
1265
|
+
function parseDefaultPrivilege(identity, definition, owner, provenance, dependencies) {
|
|
1266
|
+
if (identity.kind !== "defaultPrivilege") {
|
|
1267
|
+
catalogError2("OKM1020", `Default privilege object identity is ${identity.kind}, not a default privilege.`);
|
|
1268
|
+
}
|
|
1269
|
+
rejectUnknown(definition, [], "default privilege definition");
|
|
1270
|
+
return defaultPrivilegeObject({
|
|
1271
|
+
forRole: identity.forRole,
|
|
1272
|
+
namespace: identity.namespace,
|
|
1273
|
+
objectKind: identity.objectKind,
|
|
1274
|
+
grantee: identity.grantee,
|
|
1275
|
+
privilege: identity.privilege,
|
|
1276
|
+
owner,
|
|
1277
|
+
provenance,
|
|
1278
|
+
dependencies
|
|
1279
|
+
});
|
|
1280
|
+
}
|
|
775
1281
|
function parsePartition(value) {
|
|
776
1282
|
const record = requireRecord(value, "partition");
|
|
777
1283
|
rejectUnknown(record, ["columns", "method"], "partition");
|
|
@@ -845,7 +1351,7 @@ function parseDependencies(value) {
|
|
|
845
1351
|
});
|
|
846
1352
|
}
|
|
847
1353
|
function isBuiltKind(kind) {
|
|
848
|
-
return BUILT_KINDS2.includes(kind);
|
|
1354
|
+
return kind === "extension" || kind === "function" || kind === "trigger" || kind === "view" || kind === "materializedView" || kind === "role" || kind === "grant" || kind === "defaultPrivilege" || BUILT_KINDS2.includes(kind);
|
|
849
1355
|
}
|
|
850
1356
|
function isOwner(value) {
|
|
851
1357
|
return OWNERS2.includes(value);
|
|
@@ -891,4 +1397,4 @@ function assertNeverKind(value) {
|
|
|
891
1397
|
return catalogError2("OKM1020", `Unexpected kind ${JSON.stringify(value)}.`);
|
|
892
1398
|
}
|
|
893
1399
|
|
|
894
|
-
export { creationOrder2, renameColumn2, renameTable2, serializeCatalog2, catalogHash2, loadTrustedCatalog2, parseCatalog2 };
|
|
1400
|
+
export { roleObject, grantObject, defaultPrivilegeObject, creationOrder2, renameColumn2, renameTable2, serializeCatalog2, catalogHash2, loadTrustedCatalog2, parseCatalog2 };
|