@intentius/chant-lexicon-sql 0.124.46 → 0.124.48
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/change-set.d.ts +1 -1
- package/dist/change-set.d.ts.map +1 -1
- package/dist/change-set.js +2 -1
- package/dist/clickhouse/apply/statements.d.ts +9 -0
- package/dist/clickhouse/apply/statements.d.ts.map +1 -1
- package/dist/clickhouse/apply/statements.js +24 -0
- package/dist/clickhouse/import/live-export.d.ts +7 -3
- package/dist/clickhouse/import/live-export.d.ts.map +1 -1
- package/dist/clickhouse/import/live-export.js +21 -5
- package/dist/clickhouse/live/named-collections.d.ts +27 -0
- package/dist/clickhouse/live/named-collections.d.ts.map +1 -0
- package/dist/clickhouse/live/named-collections.js +53 -0
- package/dist/clickhouse/live/undeclarable.d.ts +15 -3
- package/dist/clickhouse/live/undeclarable.d.ts.map +1 -1
- package/dist/clickhouse/live/undeclarable.js +18 -4
- package/dist/clickhouse/named-collections.d.ts +83 -0
- package/dist/clickhouse/named-collections.d.ts.map +1 -0
- package/dist/clickhouse/named-collections.js +203 -0
- package/dist/clickhouse/parser.d.ts.map +1 -1
- package/dist/clickhouse/parser.js +1 -1
- package/dist/clickhouse/plan/commands.d.ts +2 -1
- package/dist/clickhouse/plan/commands.d.ts.map +1 -1
- package/dist/clickhouse/plan/commands.js +17 -2
- package/dist/clickhouse/plan/diff.d.ts +15 -0
- package/dist/clickhouse/plan/diff.d.ts.map +1 -1
- package/dist/clickhouse/plan/diff.js +43 -1
- package/dist/clickhouse/plan/disruption.d.ts.map +1 -1
- package/dist/clickhouse/plan/disruption.js +5 -0
- package/dist/clickhouse/plan/rebuild-handoff.d.ts.map +1 -1
- package/dist/clickhouse/plan/rebuild-handoff.js +4 -0
- package/dist/clickhouse/plan/report.d.ts.map +1 -1
- package/dist/clickhouse/plan/report.js +6 -1
- package/dist/clickhouse/plan/rules.d.ts +5 -1
- package/dist/clickhouse/plan/rules.d.ts.map +1 -1
- package/dist/clickhouse/plan/rules.js +7 -3
- package/dist/clickhouse/plan/stream.d.ts +40 -0
- package/dist/clickhouse/plan/stream.d.ts.map +1 -0
- package/dist/clickhouse/plan/stream.js +107 -0
- package/dist/clickhouse/rebuild/observe.d.ts +3 -1
- package/dist/clickhouse/rebuild/observe.d.ts.map +1 -1
- package/dist/clickhouse/rebuild/observe.js +14 -1
- package/dist/clickhouse/review-catalog.d.ts +213 -0
- package/dist/clickhouse/review-catalog.d.ts.map +1 -0
- package/dist/clickhouse/review-catalog.js +330 -0
- package/dist/codegen/classifier-page.d.ts.map +1 -1
- package/dist/codegen/classifier-page.js +21 -4
- package/dist/codegen/clickhouse-module.d.ts.map +1 -1
- package/dist/codegen/clickhouse-module.js +3 -0
- package/dist/codegen/coverage-page.d.ts.map +1 -1
- package/dist/codegen/coverage-page.js +5 -3
- package/dist/codegen/docs.js +1 -1
- package/dist/codegen/postgres-classifier-page.js +1 -1
- package/dist/codegen/registry.d.ts.map +1 -1
- package/dist/codegen/registry.js +5 -0
- package/dist/composites/catalog.d.ts.map +1 -1
- package/dist/composites/catalog.js +100 -0
- package/dist/composites/clickhouse.d.ts +2 -0
- package/dist/composites/clickhouse.d.ts.map +1 -1
- package/dist/composites/clickhouse.js +2 -0
- package/dist/composites/otel-tables.d.ts +100 -0
- package/dist/composites/otel-tables.d.ts.map +1 -0
- package/dist/composites/otel-tables.js +282 -0
- package/dist/composites/stream-ingest.d.ts +63 -0
- package/dist/composites/stream-ingest.d.ts.map +1 -0
- package/dist/composites/stream-ingest.js +39 -0
- package/dist/coverage/clickhouse.json +1 -1
- package/dist/coverage/postgres.json +7 -7
- package/dist/coverage.d.ts +16 -6
- package/dist/coverage.d.ts.map +1 -1
- package/dist/coverage.js +10 -5
- package/dist/drizzle-command.d.ts +17 -0
- package/dist/drizzle-command.d.ts.map +1 -0
- package/dist/drizzle-command.js +91 -0
- package/dist/drizzle.d.ts +70 -0
- package/dist/drizzle.d.ts.map +1 -0
- package/dist/drizzle.js +684 -0
- package/dist/files/clickhouse.d.ts.map +1 -1
- package/dist/files/clickhouse.js +8 -1
- package/dist/files/common.d.ts +13 -0
- package/dist/files/common.d.ts.map +1 -1
- package/dist/files/common.js +5 -0
- package/dist/files/postgres.js +12 -2
- package/dist/generated/clickhouse.d.ts +2 -0
- package/dist/generated/clickhouse.d.ts.map +1 -1
- package/dist/generated/clickhouse.js +2 -0
- package/dist/import-parser.d.ts +21 -1
- package/dist/import-parser.d.ts.map +1 -1
- package/dist/import-parser.js +79 -5
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/integrity.json +6 -5
- package/dist/lint/post-synth/audit-entries.d.ts.map +1 -1
- package/dist/lint/post-synth/audit-entries.js +1 -0
- package/dist/lint/post-synth/index.d.ts.map +1 -1
- package/dist/lint/post-synth/index.js +2 -0
- package/dist/lint/post-synth/sqlch128.d.ts +18 -0
- package/dist/lint/post-synth/sqlch128.d.ts.map +1 -0
- package/dist/lint/post-synth/sqlch128.js +222 -0
- package/dist/lint/rules/postgres-templates.js +2 -2
- package/dist/lsp/postgres-template.d.ts.map +1 -1
- package/dist/lsp/postgres-template.js +11 -0
- package/dist/manifest.json +1 -1
- package/dist/mcp/postgres.js +1 -1
- package/dist/meta.json +25 -0
- package/dist/migrate/from-postgres/detect.d.ts +4 -0
- package/dist/migrate/from-postgres/detect.d.ts.map +1 -0
- package/dist/migrate/from-postgres/detect.js +7 -0
- package/dist/migrate/from-postgres/emit.d.ts +26 -0
- package/dist/migrate/from-postgres/emit.d.ts.map +1 -0
- package/dist/migrate/from-postgres/emit.js +86 -0
- package/dist/migrate/from-postgres/index.d.ts +51 -0
- package/dist/migrate/from-postgres/index.d.ts.map +1 -0
- package/dist/migrate/from-postgres/index.js +115 -0
- package/dist/migrate/from-postgres/translate.d.ts +73 -0
- package/dist/migrate/from-postgres/translate.d.ts.map +1 -0
- package/dist/migrate/from-postgres/translate.js +261 -0
- package/dist/migrate/from-postgres/types.d.ts +51 -0
- package/dist/migrate/from-postgres/types.d.ts.map +1 -0
- package/dist/migrate/from-postgres/types.js +211 -0
- package/dist/migration-replay.d.ts +73 -0
- package/dist/migration-replay.d.ts.map +1 -0
- package/dist/migration-replay.js +294 -0
- package/dist/okf/index.md +6 -0
- package/dist/okf/rules/SQLCH128.md +11 -0
- package/dist/okf/types/PostgresForeignDataWrapper.md +9 -0
- package/dist/okf/types/PostgresForeignServer.md +9 -0
- package/dist/okf/types/PostgresOperator.md +9 -0
- package/dist/okf/types/PostgresPublication.md +9 -0
- package/dist/okf/types/PostgresStatistics.md +9 -0
- package/dist/op/activities/postgres-migration.d.ts.map +1 -1
- package/dist/op/activities/postgres-migration.js +4 -0
- package/dist/op/activity-contracts.d.ts +20 -0
- package/dist/op/activity-contracts.d.ts.map +1 -1
- package/dist/op/activity-contracts.js +2 -0
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +36 -2
- package/dist/postgres/apply/apply.js +8 -1
- package/dist/postgres/apply/statements.d.ts.map +1 -1
- package/dist/postgres/apply/statements.js +87 -2
- package/dist/postgres/constraint-names.d.ts +30 -0
- package/dist/postgres/constraint-names.d.ts.map +1 -0
- package/dist/postgres/constraint-names.js +72 -0
- package/dist/postgres/entities.d.ts +110 -1
- package/dist/postgres/entities.d.ts.map +1 -1
- package/dist/postgres/entities.js +146 -0
- package/dist/postgres/entity-types.d.ts +5 -0
- package/dist/postgres/entity-types.d.ts.map +1 -1
- package/dist/postgres/entity-types.js +5 -0
- package/dist/postgres/import/generator.d.ts.map +1 -1
- package/dist/postgres/import/generator.js +50 -2
- package/dist/postgres/import/live-export.d.ts.map +1 -1
- package/dist/postgres/import/live-export.js +2 -0
- package/dist/postgres/live/catalog-kinds.d.ts +14 -0
- package/dist/postgres/live/catalog-kinds.d.ts.map +1 -1
- package/dist/postgres/live/catalog-kinds.js +206 -0
- package/dist/postgres/live/catalog.d.ts +2 -0
- package/dist/postgres/live/catalog.d.ts.map +1 -1
- package/dist/postgres/live/catalog.js +3 -1
- package/dist/postgres/live/describe-resources.d.ts.map +1 -1
- package/dist/postgres/live/describe-resources.js +10 -2
- package/dist/postgres/migrate/backfill.d.ts +2 -0
- package/dist/postgres/migrate/backfill.d.ts.map +1 -1
- package/dist/postgres/migrate/backfill.js +7 -1
- package/dist/postgres/migrate/carry.d.ts +45 -1
- package/dist/postgres/migrate/carry.d.ts.map +1 -1
- package/dist/postgres/migrate/carry.js +72 -8
- package/dist/postgres/migrate/observe.d.ts +28 -4
- package/dist/postgres/migrate/observe.d.ts.map +1 -1
- package/dist/postgres/migrate/observe.js +41 -12
- package/dist/postgres/migrate/op.d.ts +26 -1
- package/dist/postgres/migrate/op.d.ts.map +1 -1
- package/dist/postgres/migrate/op.js +3 -1
- package/dist/postgres/migrate/steps.d.ts +35 -2
- package/dist/postgres/migrate/steps.d.ts.map +1 -1
- package/dist/postgres/migrate/steps.js +158 -12
- package/dist/postgres/parser.d.ts +72 -1
- package/dist/postgres/parser.d.ts.map +1 -1
- package/dist/postgres/parser.js +194 -2
- package/dist/postgres/plan/deep.d.ts.map +1 -1
- package/dist/postgres/plan/deep.js +29 -1
- package/dist/postgres/plan/diff.d.ts.map +1 -1
- package/dist/postgres/plan/diff.js +39 -1
- package/dist/postgres/plan/normalize.d.ts +17 -2
- package/dist/postgres/plan/normalize.d.ts.map +1 -1
- package/dist/postgres/plan/normalize.js +109 -1
- package/dist/postgres/plan/rules.d.ts +1 -0
- package/dist/postgres/plan/rules.d.ts.map +1 -1
- package/dist/postgres/plan/rules.js +3 -2
- package/dist/postgres/plan/schema.js +1 -1
- package/dist/postgres/secret-options.d.ts +10 -0
- package/dist/postgres/secret-options.d.ts.map +1 -0
- package/dist/postgres/secret-options.js +9 -0
- package/dist/postgres/testing/roundtrip-schema.d.ts +3 -2
- package/dist/postgres/testing/roundtrip-schema.d.ts.map +1 -1
- package/dist/postgres/testing/roundtrip-schema.js +13 -1
- package/dist/postgres.d.ts +1 -1
- package/dist/postgres.d.ts.map +1 -1
- package/dist/postgres.js +1 -1
- package/dist/rules/audit-entries.ts +1 -0
- package/dist/rules/postgres-templates.ts +2 -2
- package/dist/rules/sqlch128.ts +230 -0
- package/dist/serializer.d.ts +5 -0
- package/dist/serializer.d.ts.map +1 -1
- package/dist/serializer.js +13 -2
- package/dist/sql-types-command.d.ts +13 -0
- package/dist/sql-types-command.d.ts.map +1 -1
- package/dist/sql-types-command.js +31 -16
- package/dist/sql-types.d.ts +22 -0
- package/dist/sql-types.d.ts.map +1 -1
- package/dist/sql-types.js +10 -6
- package/dist/sqlserver/lexer.d.ts +37 -0
- package/dist/sqlserver/lexer.d.ts.map +1 -0
- package/dist/sqlserver/lexer.js +254 -0
- package/dist/sqlserver/parse.d.ts +185 -0
- package/dist/sqlserver/parse.d.ts.map +1 -0
- package/dist/sqlserver/parse.js +767 -0
- package/dist/sqlserver/translate.d.ts +34 -0
- package/dist/sqlserver/translate.d.ts.map +1 -0
- package/dist/sqlserver/translate.js +495 -0
- package/dist/sqlserver/types.d.ts +44 -0
- package/dist/sqlserver/types.d.ts.map +1 -0
- package/dist/sqlserver/types.js +133 -0
- package/dist/sqlserver/validate.d.ts +31 -0
- package/dist/sqlserver/validate.d.ts.map +1 -0
- package/dist/sqlserver/validate.js +67 -0
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +5 -0
- package/package.json +2 -2
- package/src/change-set.ts +2 -1
- package/src/clickhouse/apply/statements.ts +25 -0
- package/src/clickhouse/import/live-export.ts +20 -5
- package/src/clickhouse/live/named-collections.e2e.test.ts +88 -0
- package/src/clickhouse/live/named-collections.ts +61 -0
- package/src/clickhouse/live/undeclarable.e2e.test.ts +5 -3
- package/src/clickhouse/live/undeclarable.ts +20 -4
- package/src/clickhouse/named-collections.test.ts +187 -0
- package/src/clickhouse/named-collections.ts +224 -0
- package/src/clickhouse/parser.ts +2 -1
- package/src/clickhouse/plan/commands.ts +17 -2
- package/src/clickhouse/plan/diff.ts +57 -1
- package/src/clickhouse/plan/disruption.ts +5 -0
- package/src/clickhouse/plan/rebuild-handoff.ts +3 -0
- package/src/clickhouse/plan/report.ts +6 -1
- package/src/clickhouse/plan/rules.ts +14 -4
- package/src/clickhouse/plan/stream-s3queue.e2e.test.ts +148 -0
- package/src/clickhouse/plan/stream.test.ts +237 -0
- package/src/clickhouse/plan/stream.ts +111 -0
- package/src/clickhouse/rebuild/observe.ts +15 -1
- package/src/clickhouse/review-catalog.test.ts +181 -0
- package/src/clickhouse/review-catalog.ts +489 -0
- package/src/codegen/classifier-page.ts +21 -4
- package/src/codegen/clickhouse-module.ts +3 -0
- package/src/codegen/coverage-page.ts +5 -3
- package/src/codegen/docs.ts +1 -1
- package/src/codegen/postgres-classifier-page.ts +1 -1
- package/src/codegen/registry.ts +5 -0
- package/src/composites/catalog.test.ts +6 -1
- package/src/composites/catalog.ts +100 -0
- package/src/composites/clickhouse.ts +2 -0
- package/src/composites/composites.test.ts +1 -1
- package/src/composites/otel-tables.test.ts +118 -0
- package/src/composites/otel-tables.ts +339 -0
- package/src/composites/stream-ingest.test.ts +114 -0
- package/src/composites/stream-ingest.ts +82 -0
- package/src/core/undeclarable.test.ts +6 -5
- package/src/coverage/clickhouse.json +1 -1
- package/src/coverage/postgres.json +7 -7
- package/src/coverage.test.ts +27 -2
- package/src/coverage.ts +18 -7
- package/src/drizzle-command.ts +94 -0
- package/src/drizzle-kit.e2e.test.ts +89 -0
- package/src/drizzle-types.e2e.test.ts +67 -0
- package/src/drizzle.test.ts +358 -0
- package/src/drizzle.ts +737 -0
- package/src/files/clickhouse.ts +8 -1
- package/src/files/common.ts +14 -1
- package/src/files/postgres.ts +12 -2
- package/src/generated/clickhouse.ts +3 -0
- package/src/generated/lexicon-sql.json +25 -0
- package/src/import-parser.sqlserver.test.ts +92 -0
- package/src/import-parser.ts +79 -5
- package/src/index.ts +1 -1
- package/src/lint/post-synth/audit-entries.ts +1 -0
- package/src/lint/post-synth/index.ts +2 -0
- package/src/lint/post-synth/sqlch128.test.ts +107 -0
- package/src/lint/post-synth/sqlch128.ts +230 -0
- package/src/lint/rules/postgres-templates.ts +2 -2
- package/src/lsp/postgres-template.ts +11 -0
- package/src/mcp/postgres.ts +1 -1
- package/src/migrate/from-postgres/cli.test.ts +165 -0
- package/src/migrate/from-postgres/detect.ts +7 -0
- package/src/migrate/from-postgres/emit.ts +96 -0
- package/src/migrate/from-postgres/example.test.ts +205 -0
- package/src/migrate/from-postgres/index.ts +122 -0
- package/src/migrate/from-postgres/translate.test.ts +242 -0
- package/src/migrate/from-postgres/translate.ts +359 -0
- package/src/migrate/from-postgres/types.test.ts +116 -0
- package/src/migrate/from-postgres/types.ts +236 -0
- package/src/migrate/from-postgres/validate.e2e.test.ts +44 -0
- package/src/migrate/from-postgres/workspace.e2e.test.ts +114 -0
- package/src/migration-replay.e2e.test.ts +155 -0
- package/src/migration-replay.test.ts +173 -0
- package/src/migration-replay.ts +289 -0
- package/src/op/__snapshots__/watch-pipeline.test.ts.snap +2 -2
- package/src/op/activities/postgres-migration.ts +4 -0
- package/src/op/activity-contracts.ts +2 -0
- package/src/plugin.ts +37 -2
- package/src/postgres/apply/apply.ts +9 -1
- package/src/postgres/apply/statements.ts +74 -1
- package/src/postgres/constraint-names.ts +71 -0
- package/src/postgres/database-kinds.test.ts +384 -0
- package/src/postgres/entities.ts +266 -1
- package/src/postgres/entity-types.ts +5 -0
- package/src/postgres/import/generator.ts +42 -2
- package/src/postgres/import/live-export.ts +1 -0
- package/src/postgres/live/catalog-kinds.ts +223 -0
- package/src/postgres/live/catalog.ts +6 -1
- package/src/postgres/live/database-kinds.e2e.test.ts +164 -0
- package/src/postgres/live/describe-resources.ts +11 -2
- package/src/postgres/live/undeclarable.e2e.test.ts +13 -6
- package/src/postgres/migrate/backfill.ts +13 -1
- package/src/postgres/migrate/carry.ts +103 -8
- package/src/postgres/migrate/followups.e2e.test.ts +218 -0
- package/src/postgres/migrate/followups.test.ts +199 -0
- package/src/postgres/migrate/kinds.e2e.test.ts +5 -5
- package/src/postgres/migrate/observe.ts +53 -14
- package/src/postgres/migrate/op.ts +28 -1
- package/src/postgres/migrate/partition.e2e.test.ts +129 -0
- package/src/postgres/migrate/partition.test.ts +206 -0
- package/src/postgres/migrate/steps.ts +157 -12
- package/src/postgres/parser.ts +234 -2
- package/src/postgres/plan/deep.ts +28 -1
- package/src/postgres/plan/diff.ts +36 -1
- package/src/postgres/plan/normalize.ts +122 -1
- package/src/postgres/plan/rules.ts +10 -3
- package/src/postgres/plan/schema.ts +1 -1
- package/src/postgres/secret-options.ts +10 -0
- package/src/postgres/testing/roundtrip-schema.ts +13 -1
- package/src/postgres.ts +16 -0
- package/src/serializer.ts +13 -2
- package/src/skills/chant-sql-postgres-migration.md +3 -3
- package/src/skills/chant-sql-postgres.md +6 -1
- package/src/skills/chant-sql.md +2 -1
- package/src/sql-types-command.ts +38 -16
- package/src/sql-types.ts +11 -6
- package/src/sqlserver/fixture.test.ts +186 -0
- package/src/sqlserver/import-cli.test.ts +61 -0
- package/src/sqlserver/lexer.ts +260 -0
- package/src/sqlserver/parse.ts +865 -0
- package/src/sqlserver/translate.test.ts +396 -0
- package/src/sqlserver/translate.ts +558 -0
- package/src/sqlserver/types.test.ts +102 -0
- package/src/sqlserver/types.ts +154 -0
- package/src/sqlserver/validate.e2e.test.ts +32 -0
- package/src/sqlserver/validate.test.ts +49 -0
- package/src/sqlserver/validate.ts +76 -0
- package/src/validate.ts +5 -0
- package/src/workspace-kinds.test.ts +11 -0
- package/workspace-kinds.json +100 -2
|
@@ -66,6 +66,7 @@ export { SqlLiteral, SqlTemplateError } from "../core/template.js";
|
|
|
66
66
|
export { quoteIdent } from "./keywords.js";
|
|
67
67
|
export { POSTGRES_ENTITY_TYPES } from "./entity-types.js";
|
|
68
68
|
import { POSTGRES_ENTITY_TYPES } from "./entity-types.js";
|
|
69
|
+
import { isSecretOption } from "./secret-options.js";
|
|
69
70
|
/**
|
|
70
71
|
* A string as a quoted Postgres string literal: `'` doubled, a backslash left
|
|
71
72
|
* as written (standard_conforming_strings is on). An interpolated plain string
|
|
@@ -193,6 +194,11 @@ export const STATEMENTS_OF = {
|
|
|
193
194
|
aggregate: ["aggregate"],
|
|
194
195
|
trigger: ["trigger"],
|
|
195
196
|
eventTrigger: ["eventTrigger"],
|
|
197
|
+
operator: ["operator"],
|
|
198
|
+
statistics: ["statistics"],
|
|
199
|
+
foreignDataWrapper: ["foreignDataWrapper"],
|
|
200
|
+
foreignServer: ["foreignServer"],
|
|
201
|
+
publication: ["publication"],
|
|
196
202
|
collation: ["collation"],
|
|
197
203
|
cast: ["cast"],
|
|
198
204
|
policy: ["policy"],
|
|
@@ -215,6 +221,11 @@ const TAG_OF = {
|
|
|
215
221
|
aggregate: "aggregate",
|
|
216
222
|
trigger: "trigger",
|
|
217
223
|
eventTrigger: "eventTrigger",
|
|
224
|
+
operator: "operator",
|
|
225
|
+
statistics: "statistics",
|
|
226
|
+
foreignDataWrapper: "foreignDataWrapper",
|
|
227
|
+
foreignServer: "foreignServer",
|
|
228
|
+
publication: "publication",
|
|
218
229
|
collation: "collation",
|
|
219
230
|
cast: "cast",
|
|
220
231
|
policy: "policy",
|
|
@@ -240,6 +251,11 @@ export const STATEMENT_NAMES = {
|
|
|
240
251
|
aggregate: "CREATE AGGREGATE",
|
|
241
252
|
trigger: "CREATE TRIGGER",
|
|
242
253
|
eventTrigger: "CREATE EVENT TRIGGER",
|
|
254
|
+
operator: "CREATE OPERATOR",
|
|
255
|
+
statistics: "CREATE STATISTICS",
|
|
256
|
+
foreignDataWrapper: "CREATE FOREIGN DATA WRAPPER",
|
|
257
|
+
foreignServer: "CREATE SERVER",
|
|
258
|
+
publication: "CREATE PUBLICATION",
|
|
243
259
|
collation: "CREATE COLLATION",
|
|
244
260
|
cast: "CREATE CAST",
|
|
245
261
|
policy: "CREATE POLICY",
|
|
@@ -273,6 +289,22 @@ function definitionValues(ctx, elems, path) {
|
|
|
273
289
|
out[e.name] = e.value ? req(text(ctx, e.value, path)) : "true";
|
|
274
290
|
return out;
|
|
275
291
|
}
|
|
292
|
+
/** A database-wide object's name (a wrapper, a server, a publication): one piece, or an interpolated object's name. */
|
|
293
|
+
function databaseObjectName(ctx, n) {
|
|
294
|
+
feed(ctx, n.span, "name");
|
|
295
|
+
return n.pieces[0] || identValue(req(text(ctx, n.span)));
|
|
296
|
+
}
|
|
297
|
+
/** An `OPTIONS (...)` list's values by option name, each a string constant's value. */
|
|
298
|
+
function genericOptionValues(tag, ctx, options) {
|
|
299
|
+
const out = {};
|
|
300
|
+
for (const o of options) {
|
|
301
|
+
if (isSecretOption(o.name)) {
|
|
302
|
+
throw new SqlTemplateError(tag, `the option ${o.name} holds a credential, which the environment supplies (a user mapping, or its secret store); a declaration never carries one`, 0, 0);
|
|
303
|
+
}
|
|
304
|
+
out[o.name] = req(stringValue(text(ctx, o.value, "options")));
|
|
305
|
+
}
|
|
306
|
+
return out;
|
|
307
|
+
}
|
|
276
308
|
/** A qualified name's schema and name. An interpolated schema names the schema; an interpolated object gives both. */
|
|
277
309
|
function qualified(ctx, n) {
|
|
278
310
|
const pieces = [];
|
|
@@ -906,6 +938,83 @@ function build(tag, strings, rawValues) {
|
|
|
906
938
|
}, []);
|
|
907
939
|
return make(POSTGRES_ENTITY_TYPES.eventTrigger, { name }, props);
|
|
908
940
|
}
|
|
941
|
+
case "operator": {
|
|
942
|
+
const q = qualified(ctx, node.name);
|
|
943
|
+
const comment = applyComments(tag, ctx, comments, q, ["OPERATOR"]);
|
|
944
|
+
const opt = definitionValues(ctx, node.options, "options");
|
|
945
|
+
const { leftarg, rightarg, procedure, ...rest } = opt;
|
|
946
|
+
const props = stripUnset({ ...q, leftArg: leftarg, rightArg: rightarg, options: { ...rest, function: opt.function ?? procedure }, comment, ddl, source });
|
|
947
|
+
// The symbol is unquoted wherever the operator is named: `app.===`.
|
|
948
|
+
return make(POSTGRES_ENTITY_TYPES.operator, q, props, undefined, q.schema ? `${quoteIdent(q.schema)}.${q.name}` : q.name);
|
|
949
|
+
}
|
|
950
|
+
case "statistics": {
|
|
951
|
+
const q = qualified(ctx, node.name);
|
|
952
|
+
const comment = applyComments(tag, ctx, comments, q, ["STATISTICS"]);
|
|
953
|
+
const props = strip({
|
|
954
|
+
...q,
|
|
955
|
+
ifNotExists: node.ifNotExists || undefined,
|
|
956
|
+
kinds: node.kinds.length > 0 ? node.kinds : undefined,
|
|
957
|
+
targets: node.targets.map((t) => req(text(ctx, t, "targets"))),
|
|
958
|
+
table: target(ctx, node.table),
|
|
959
|
+
tableName: sqlNameOf(qualified(ctx, node.table)),
|
|
960
|
+
comment,
|
|
961
|
+
ddl,
|
|
962
|
+
source,
|
|
963
|
+
}, ["targets"]);
|
|
964
|
+
return make(POSTGRES_ENTITY_TYPES.statistics, q, props);
|
|
965
|
+
}
|
|
966
|
+
case "foreignDataWrapper": {
|
|
967
|
+
const name = databaseObjectName(ctx, node.name);
|
|
968
|
+
const comment = applyComments(tag, ctx, comments, { name }, ["FOREIGN DATA WRAPPER"]);
|
|
969
|
+
const props = strip({
|
|
970
|
+
name,
|
|
971
|
+
handler: node.handler ? target(ctx, node.handler) : undefined,
|
|
972
|
+
handlerName: node.handler ? targetName(ctx, node.handler) : undefined,
|
|
973
|
+
noHandler: node.handler === null ? true : undefined,
|
|
974
|
+
validator: node.validator ? target(ctx, node.validator) : undefined,
|
|
975
|
+
validatorName: node.validator ? targetName(ctx, node.validator) : undefined,
|
|
976
|
+
noValidator: node.validator === null ? true : undefined,
|
|
977
|
+
options: genericOptionValues(tag, ctx, node.options),
|
|
978
|
+
comment,
|
|
979
|
+
ddl,
|
|
980
|
+
source,
|
|
981
|
+
}, ["options"]);
|
|
982
|
+
return make(POSTGRES_ENTITY_TYPES.foreignDataWrapper, { name }, props);
|
|
983
|
+
}
|
|
984
|
+
case "foreignServer": {
|
|
985
|
+
const name = databaseObjectName(ctx, node.name);
|
|
986
|
+
const comment = applyComments(tag, ctx, comments, { name }, ["SERVER"]);
|
|
987
|
+
const props = strip({
|
|
988
|
+
name,
|
|
989
|
+
ifNotExists: node.ifNotExists || undefined,
|
|
990
|
+
serverType: node.type ? stringValue(text(ctx, node.type, "serverType")) : undefined,
|
|
991
|
+
version: node.version ? stringValue(text(ctx, node.version, "version")) : undefined,
|
|
992
|
+
wrapper: target(ctx, node.wrapper),
|
|
993
|
+
wrapperName: targetName(ctx, node.wrapper),
|
|
994
|
+
options: genericOptionValues(tag, ctx, node.options),
|
|
995
|
+
comment,
|
|
996
|
+
ddl,
|
|
997
|
+
source,
|
|
998
|
+
}, ["options"]);
|
|
999
|
+
return make(POSTGRES_ENTITY_TYPES.foreignServer, { name }, props);
|
|
1000
|
+
}
|
|
1001
|
+
case "publication": {
|
|
1002
|
+
const name = databaseObjectName(ctx, node.name);
|
|
1003
|
+
const comment = applyComments(tag, ctx, comments, { name }, ["PUBLICATION"]);
|
|
1004
|
+
const tables = node.items.flatMap((i) => i.kind !== "table"
|
|
1005
|
+
? []
|
|
1006
|
+
: [
|
|
1007
|
+
stripUnset({
|
|
1008
|
+
table: target(ctx, i.table),
|
|
1009
|
+
tableName: sqlNameOf(qualified(ctx, i.table)),
|
|
1010
|
+
columns: i.columns?.map((c) => columnName(ctx, { name: c.name, span: c.span })),
|
|
1011
|
+
where: text(ctx, i.where, "tables"),
|
|
1012
|
+
}),
|
|
1013
|
+
]);
|
|
1014
|
+
const schemas = node.items.flatMap((i) => (i.kind === "schema" ? [qualified(ctx, i.schema).name] : []));
|
|
1015
|
+
const props = strip({ name, allTables: node.allTables || undefined, tables, schemas, options: definitionValues(ctx, node.options, "options"), comment, ddl, source }, ["tables", "schemas", "options"]);
|
|
1016
|
+
return make(POSTGRES_ENTITY_TYPES.publication, { name }, props);
|
|
1017
|
+
}
|
|
909
1018
|
case "domain": {
|
|
910
1019
|
const q = qualified(ctx, node.name);
|
|
911
1020
|
const checks = node.checks.map((c) => stripUnset({ name: c.name, expr: req(text(ctx, c.expr, "checks")), notValid: c.notValid }));
|
|
@@ -1362,6 +1471,43 @@ export function cast(strings, ...values) {
|
|
|
1362
1471
|
export function eventTrigger(strings, ...values) {
|
|
1363
1472
|
return build("eventTrigger", strings, values);
|
|
1364
1473
|
}
|
|
1474
|
+
/**
|
|
1475
|
+
* `` operator`CREATE OPERATOR app.=== (FUNCTION = ${fn}, LEFTARG = int, RIGHTARG = int)` ``:
|
|
1476
|
+
* one operator, identified by its name and operand types, as a function is by
|
|
1477
|
+
* its name and parameter types.
|
|
1478
|
+
*/
|
|
1479
|
+
export function operator(strings, ...values) {
|
|
1480
|
+
return build("operator", strings, values);
|
|
1481
|
+
}
|
|
1482
|
+
/**
|
|
1483
|
+
* `` statistics`CREATE STATISTICS name (ndistinct, dependencies) ON a, b FROM ${table}` ``:
|
|
1484
|
+
* extended statistics on columns or expressions of one table.
|
|
1485
|
+
*/
|
|
1486
|
+
export function statistics(strings, ...values) {
|
|
1487
|
+
return build("statistics", strings, values);
|
|
1488
|
+
}
|
|
1489
|
+
/**
|
|
1490
|
+
* `` foreignDataWrapper`CREATE FOREIGN DATA WRAPPER name HANDLER ${fn} OPTIONS (...)` ``:
|
|
1491
|
+
* one foreign data wrapper, the database's (no schema). Creating one takes a superuser.
|
|
1492
|
+
*/
|
|
1493
|
+
export function foreignDataWrapper(strings, ...values) {
|
|
1494
|
+
return build("foreignDataWrapper", strings, values);
|
|
1495
|
+
}
|
|
1496
|
+
/**
|
|
1497
|
+
* `` foreignServer`CREATE SERVER name FOREIGN DATA WRAPPER ${fdw} OPTIONS (host 'db.internal')` ``:
|
|
1498
|
+
* one foreign server, the database's. Its user mappings carry credentials and are
|
|
1499
|
+
* not declared; an option that holds a secret is the environment's to supply.
|
|
1500
|
+
*/
|
|
1501
|
+
export function foreignServer(strings, ...values) {
|
|
1502
|
+
return build("foreignServer", strings, values);
|
|
1503
|
+
}
|
|
1504
|
+
/**
|
|
1505
|
+
* `` publication`CREATE PUBLICATION name FOR TABLE ${t} WITH (publish = 'insert')` ``:
|
|
1506
|
+
* one logical-replication publication, the database's.
|
|
1507
|
+
*/
|
|
1508
|
+
export function publication(strings, ...values) {
|
|
1509
|
+
return build("publication", strings, values);
|
|
1510
|
+
}
|
|
1365
1511
|
/** `` trigger`CREATE [OR REPLACE] [CONSTRAINT] TRIGGER name ... ON ${table} ... EXECUTE FUNCTION ${fn}()` ``: one trigger on its table. */
|
|
1366
1512
|
export function trigger(strings, ...values) {
|
|
1367
1513
|
return build("trigger", strings, values);
|
|
@@ -17,6 +17,11 @@ export declare const POSTGRES_ENTITY_TYPES: {
|
|
|
17
17
|
readonly collation: "Postgres::Collation";
|
|
18
18
|
readonly cast: "Postgres::Cast";
|
|
19
19
|
readonly eventTrigger: "Postgres::EventTrigger";
|
|
20
|
+
readonly operator: "Postgres::Operator";
|
|
21
|
+
readonly statistics: "Postgres::Statistics";
|
|
22
|
+
readonly foreignDataWrapper: "Postgres::ForeignDataWrapper";
|
|
23
|
+
readonly foreignServer: "Postgres::ForeignServer";
|
|
24
|
+
readonly publication: "Postgres::Publication";
|
|
20
25
|
readonly extension: "Postgres::Extension";
|
|
21
26
|
readonly function: "Postgres::Function";
|
|
22
27
|
readonly procedure: "Postgres::Procedure";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity-types.d.ts","sourceRoot":"","sources":["../../src/postgres/entity-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,qBAAqB
|
|
1
|
+
{"version":3,"file":"entity-types.d.ts","sourceRoot":"","sources":["../../src/postgres/entity-types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BxB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,OAAO,qBAAqB,CAAC,CAAC"}
|
|
@@ -17,6 +17,11 @@ export const POSTGRES_ENTITY_TYPES = {
|
|
|
17
17
|
collation: "Postgres::Collation",
|
|
18
18
|
cast: "Postgres::Cast",
|
|
19
19
|
eventTrigger: "Postgres::EventTrigger",
|
|
20
|
+
operator: "Postgres::Operator",
|
|
21
|
+
statistics: "Postgres::Statistics",
|
|
22
|
+
foreignDataWrapper: "Postgres::ForeignDataWrapper",
|
|
23
|
+
foreignServer: "Postgres::ForeignServer",
|
|
24
|
+
publication: "Postgres::Publication",
|
|
20
25
|
extension: "Postgres::Extension",
|
|
21
26
|
function: "Postgres::Function",
|
|
22
27
|
procedure: "Postgres::Procedure",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../src/postgres/import/generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAC5F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAKjE,kGAAkG;AAClG,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AACD,KAAK,IAAI,GAAG,cAAc,CAAC;AAE3B,uHAAuH;AACvH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../src/postgres/import/generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAC5F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAKjE,kGAAkG;AAClG,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AACD,KAAK,IAAI,GAAG,cAAc,CAAC;AAE3B,uHAAuH;AACvH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAiDD,wEAAwE;AACxE,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAO,CAAC;AA8JrE,0DAA0D;AAC1D,eAAO,MAAM,QAAQ,GAAI,MAAM,YAAY,KAAG,MAA0F,CAAC;AAEzI;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,EAAE,OAAO,GAAE,SAAS,IAAI,EAAU,GAAG;IAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;CAAE,CA6BhJ;AAaD,qBAAa,iBAAkB,YAAW,mBAAmB;IAG/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IAFpC,QAAQ,CAAC,UAAU,QAAQ;gBAEE,MAAM,CAAC,EAAE,MAAM,YAAA;IAE5C,QAAQ,CAAC,EAAE,EAAE,UAAU,GAAG,aAAa,EAAE;CAqB1C"}
|
|
@@ -40,6 +40,11 @@ const TAG = {
|
|
|
40
40
|
[POSTGRES_ENTITY_TYPES.collation]: "collation",
|
|
41
41
|
[POSTGRES_ENTITY_TYPES.cast]: "cast",
|
|
42
42
|
[POSTGRES_ENTITY_TYPES.eventTrigger]: "eventTrigger",
|
|
43
|
+
[POSTGRES_ENTITY_TYPES.operator]: "operator",
|
|
44
|
+
[POSTGRES_ENTITY_TYPES.statistics]: "statistics",
|
|
45
|
+
[POSTGRES_ENTITY_TYPES.foreignDataWrapper]: "foreignDataWrapper",
|
|
46
|
+
[POSTGRES_ENTITY_TYPES.foreignServer]: "foreignServer",
|
|
47
|
+
[POSTGRES_ENTITY_TYPES.publication]: "publication",
|
|
43
48
|
[POSTGRES_ENTITY_TYPES.extension]: "extension",
|
|
44
49
|
[POSTGRES_ENTITY_TYPES.function]: "func",
|
|
45
50
|
[POSTGRES_ENTITY_TYPES.procedure]: "procedure",
|
|
@@ -60,6 +65,10 @@ const UNREFERENCED = new Set([
|
|
|
60
65
|
POSTGRES_ENTITY_TYPES.extension,
|
|
61
66
|
POSTGRES_ENTITY_TYPES.cast,
|
|
62
67
|
POSTGRES_ENTITY_TYPES.eventTrigger,
|
|
68
|
+
POSTGRES_ENTITY_TYPES.operator,
|
|
69
|
+
POSTGRES_ENTITY_TYPES.statistics,
|
|
70
|
+
POSTGRES_ENTITY_TYPES.foreignServer,
|
|
71
|
+
POSTGRES_ENTITY_TYPES.publication,
|
|
63
72
|
]);
|
|
64
73
|
/** The tag each entity type is declared with (`table`, `func`, ...). */
|
|
65
74
|
export const POSTGRES_TAG_OF = TAG;
|
|
@@ -115,6 +124,14 @@ function bareSpots(tokens) {
|
|
|
115
124
|
}
|
|
116
125
|
if (node.statement === "eventTrigger")
|
|
117
126
|
name(node.function);
|
|
127
|
+
if (node.statement === "foreignServer")
|
|
128
|
+
name(node.wrapper);
|
|
129
|
+
if (node.statement === "foreignDataWrapper") {
|
|
130
|
+
name(node.handler ?? undefined);
|
|
131
|
+
name(node.validator ?? undefined);
|
|
132
|
+
}
|
|
133
|
+
if (node.statement === "statistics")
|
|
134
|
+
name(node.table);
|
|
118
135
|
if (node.statement === "index" || node.statement === "policy")
|
|
119
136
|
name(node.table);
|
|
120
137
|
if (node.statement === "trigger") {
|
|
@@ -127,6 +144,31 @@ function bareSpots(tokens) {
|
|
|
127
144
|
}
|
|
128
145
|
return out;
|
|
129
146
|
}
|
|
147
|
+
/** The tokens that name a schema in a publication's `TABLES IN SCHEMA a, b`, past the first, which follows the word SCHEMA. */
|
|
148
|
+
function schemaSpots(tokens) {
|
|
149
|
+
const out = new Set();
|
|
150
|
+
let nodes;
|
|
151
|
+
try {
|
|
152
|
+
nodes = parseStatements(tokens);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return out;
|
|
156
|
+
}
|
|
157
|
+
for (const node of nodes) {
|
|
158
|
+
if (node.statement !== "publication")
|
|
159
|
+
continue;
|
|
160
|
+
for (const i of node.items) {
|
|
161
|
+
if (i.kind !== "schema")
|
|
162
|
+
continue;
|
|
163
|
+
for (let k = i.schema.span.from; k < i.schema.span.to; k++)
|
|
164
|
+
if (!isTrivia(tokens[k])) {
|
|
165
|
+
out.add(k);
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return out;
|
|
171
|
+
}
|
|
130
172
|
function templateBody(item, byQualified, schemaExport) {
|
|
131
173
|
const tokens = tokenizeText(item.ddl, 0);
|
|
132
174
|
const sig = [];
|
|
@@ -135,6 +177,7 @@ function templateBody(item, byQualified, schemaExport) {
|
|
|
135
177
|
sig.push(i);
|
|
136
178
|
});
|
|
137
179
|
const spots = bareSpots(tokens);
|
|
180
|
+
const schemaAt = item.type === POSTGRES_ENTITY_TYPES.publication ? schemaSpots(tokens) : new Set();
|
|
138
181
|
const replace = new Map();
|
|
139
182
|
const isSelf = (target) => target === item || (target.exportName === item.exportName && target.type === item.type);
|
|
140
183
|
for (let k = 0; k < sig.length; k++) {
|
|
@@ -157,10 +200,15 @@ function templateBody(item, byQualified, schemaExport) {
|
|
|
157
200
|
}
|
|
158
201
|
const dot = tokens[sig[k + 1] ?? -1];
|
|
159
202
|
const b = tokens[sig[k + 2] ?? -1];
|
|
203
|
+
// An operator's own `schema.symbol`: the schema is the schema's export, though the symbol is no name.
|
|
204
|
+
if (item.type === POSTGRES_ENTITY_TYPES.operator && isName(a) && dot?.kind === "punct" && dot.text === "." && b?.kind === "op" && identValue(a) === item.schema && schemaExport.has(item.schema)) {
|
|
205
|
+
replace.set(sig[k], { to: sig[k] + 1, ref: schemaExport.get(item.schema) });
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
160
208
|
if (!isName(a) || dot?.kind !== "punct" || dot.text !== "." || !isName(b)) {
|
|
161
209
|
// An extension's `WITH SCHEMA app`, a grant's `ON SCHEMA app`, default privileges' `IN SCHEMA app`.
|
|
162
|
-
const bySchemaWord = item.type === POSTGRES_ENTITY_TYPES.extension || item.type === POSTGRES_ENTITY_TYPES.grant || item.type === POSTGRES_ENTITY_TYPES.defaultPrivileges;
|
|
163
|
-
if (bySchemaWord && isName(a) && prev?.kind === "ident" && prev.text.toUpperCase() === "SCHEMA") {
|
|
210
|
+
const bySchemaWord = item.type === POSTGRES_ENTITY_TYPES.extension || item.type === POSTGRES_ENTITY_TYPES.grant || item.type === POSTGRES_ENTITY_TYPES.defaultPrivileges || schemaAt.size > 0;
|
|
211
|
+
if (bySchemaWord && isName(a) && ((prev?.kind === "ident" && prev.text.toUpperCase() === "SCHEMA") || schemaAt.has(sig[k]))) {
|
|
164
212
|
const s = schemaExport.get(identValue(a));
|
|
165
213
|
if (s)
|
|
166
214
|
replace.set(sig[k], { to: sig[k] + 1, ref: s });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live-export.d.ts","sourceRoot":"","sources":["../../../src/postgres/import/live-export.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACnF,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAS9D,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC;IACrE,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8HAA8H;IAC9H,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"live-export.d.ts","sourceRoot":"","sources":["../../../src/postgres/import/live-export.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACnF,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAS9D,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC;IACrE,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8HAA8H;IAC9H,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAsB,eAAe,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA0CvF"}
|
|
@@ -77,6 +77,8 @@ export async function exportResources(options) {
|
|
|
77
77
|
warnings.push(`${o.schema ? `${o.schema}.` : ""}${o.name} is kept by ${o.foreign}; left out, since declaring it would have chant change what that tool owns`);
|
|
78
78
|
continue;
|
|
79
79
|
}
|
|
80
|
+
for (const w of o.warnings ?? [])
|
|
81
|
+
warnings.push(`${o.schema ? `${o.schema}.` : ""}${o.name}: ${w}`);
|
|
80
82
|
objects.push({ type: o.type, ...(o.schema ? { schema: o.schema } : {}), name: o.name, ddl: o.statement });
|
|
81
83
|
}
|
|
82
84
|
return objectsToIR([...objects, ...access], warnings);
|
|
@@ -25,4 +25,18 @@ export declare function readTypeKinds(client: PostgresClient, scope: SchemaScope
|
|
|
25
25
|
export declare function readCollations(client: PostgresClient, scope: SchemaScope): Promise<LivePgObject[]>;
|
|
26
26
|
/** Aggregates, casts and event triggers: read after the functions they call. */
|
|
27
27
|
export declare function readRoutineKinds(client: PostgresClient, scope: SchemaScope): Promise<LivePgObject[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Operators: the ones a schema defines, not the server's own (oids below the
|
|
30
|
+
* first normal object id) or an extension's. Identified by name and operand
|
|
31
|
+
* types, `NONE` for a missing side (`DROP OPERATOR`'s spelling).
|
|
32
|
+
*/
|
|
33
|
+
export declare function readOperators(client: PostgresClient, scope: SchemaScope): Promise<LivePgObject[]>;
|
|
34
|
+
/**
|
|
35
|
+
* The kinds of object #3911 adds that belong to the database or hang off a
|
|
36
|
+
* table: extended statistics (printed by the server), foreign data wrappers
|
|
37
|
+
* and servers, and publications, each assembled from its catalog rows. A
|
|
38
|
+
* wrapper, server or publication is the database's, so the schema scope does
|
|
39
|
+
* not narrow it. A credential in an option is left out and said so.
|
|
40
|
+
*/
|
|
41
|
+
export declare function readDatabaseKinds(client: PostgresClient, scope: SchemaScope): Promise<LivePgObject[]>;
|
|
28
42
|
//# sourceMappingURL=catalog-kinds.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog-kinds.d.ts","sourceRoot":"","sources":["../../../src/postgres/live/catalog-kinds.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAA+B,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"catalog-kinds.d.ts","sourceRoot":"","sources":["../../../src/postgres/live/catalog-kinds.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAA+B,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AA2C7F,4GAA4G;AAC5G,wBAAsB,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA0EvG;AAED,kFAAkF;AAClF,wBAAsB,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAuCxG;AAID,gFAAgF;AAChF,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA8H1G;AAMD;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAwCvG;AAkBD;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA0E3G"}
|
|
@@ -21,6 +21,7 @@ import { notExtensionOwned, scopeSql } from "./catalog.js";
|
|
|
21
21
|
import { POSTGRES_ENTITY_TYPES } from "../entity-types.js";
|
|
22
22
|
import { quoteIdent } from "../keywords.js";
|
|
23
23
|
import { stripMarker } from "../../core/ownership.js";
|
|
24
|
+
import { isSecretOption } from "../secret-options.js";
|
|
24
25
|
const C = 'COLLATE "C"';
|
|
25
26
|
const str = (v) => (v === null || v === undefined ? undefined : String(v));
|
|
26
27
|
const literal = (s) => `'${s.replace(/'/g, "''")}'`;
|
|
@@ -299,3 +300,208 @@ export async function readRoutineKinds(client, scope) {
|
|
|
299
300
|
}
|
|
300
301
|
return out;
|
|
301
302
|
}
|
|
303
|
+
/** An operator named by another's COMMUTATOR or NEGATOR, as `OPERATOR(schema.symbol)`. */
|
|
304
|
+
const operatorRef = (column) => `(SELECT 'OPERATOR(' || pg_catalog.quote_ident(rn.nspname) || '.' || r.oprname || ')' FROM pg_catalog.pg_operator r JOIN pg_catalog.pg_namespace rn ON rn.oid = r.oprnamespace WHERE r.oid = ${column})`;
|
|
305
|
+
/**
|
|
306
|
+
* Operators: the ones a schema defines, not the server's own (oids below the
|
|
307
|
+
* first normal object id) or an extension's. Identified by name and operand
|
|
308
|
+
* types, `NONE` for a missing side (`DROP OPERATOR`'s spelling).
|
|
309
|
+
*/
|
|
310
|
+
export async function readOperators(client, scope) {
|
|
311
|
+
const s = scopeSql("n.nspname", scope);
|
|
312
|
+
const rows = await client.query(`SELECT o.oid::text AS oid, n.nspname AS schema, o.oprname AS name,
|
|
313
|
+
CASE WHEN o.oprleft <> 0 THEN pg_catalog.format_type(o.oprleft, NULL) END AS leftarg,
|
|
314
|
+
CASE WHEN o.oprright <> 0 THEN pg_catalog.format_type(o.oprright, NULL) END AS rightarg,
|
|
315
|
+
${proc("o.oprcode::pg_catalog.regproc")} AS func, ${operatorRef("o.oprcom")} AS commutator, ${operatorRef("o.oprnegate")} AS negator,
|
|
316
|
+
${proc("o.oprrest::pg_catalog.regproc")} AS restrict, ${proc("o.oprjoin::pg_catalog.regproc")} AS join_func,
|
|
317
|
+
o.oprcanhash AS hashes, o.oprcanmerge AS merges,
|
|
318
|
+
pg_catalog.obj_description(o.oid, 'pg_operator') AS comment, ${dependentsOf("pg_operator", "o.oid")} AS dependents
|
|
319
|
+
FROM pg_catalog.pg_operator o JOIN pg_catalog.pg_namespace n ON n.oid = o.oprnamespace
|
|
320
|
+
WHERE ${s.sql} AND o.oid >= 16384 AND ${notExtensionOwned("pg_operator", "o.oid")}
|
|
321
|
+
ORDER BY n.nspname ${C}, o.oprname ${C}, pg_catalog.format_type(o.oprleft, NULL) ${C} NULLS FIRST, pg_catalog.format_type(o.oprright, NULL) ${C} NULLS FIRST`, s.params);
|
|
322
|
+
return rows.map((r) => {
|
|
323
|
+
const left = str(r.leftarg);
|
|
324
|
+
const right = str(r.rightarg);
|
|
325
|
+
const signature = `(${left ?? "NONE"},${right ?? "NONE"})`;
|
|
326
|
+
const name = `${quoteIdent(String(r.schema))}.${r.name}`;
|
|
327
|
+
const opts = [`FUNCTION = ${r.func}`];
|
|
328
|
+
if (left)
|
|
329
|
+
opts.push(`LEFTARG = ${left}`);
|
|
330
|
+
if (right)
|
|
331
|
+
opts.push(`RIGHTARG = ${right}`);
|
|
332
|
+
if (str(r.commutator))
|
|
333
|
+
opts.push(`COMMUTATOR = ${r.commutator}`);
|
|
334
|
+
if (str(r.negator))
|
|
335
|
+
opts.push(`NEGATOR = ${r.negator}`);
|
|
336
|
+
if (str(r.restrict))
|
|
337
|
+
opts.push(`RESTRICT = ${r.restrict}`);
|
|
338
|
+
if (str(r.join_func))
|
|
339
|
+
opts.push(`JOIN = ${r.join_func}`);
|
|
340
|
+
if (r.hashes === true)
|
|
341
|
+
opts.push("HASHES");
|
|
342
|
+
if (r.merges === true)
|
|
343
|
+
opts.push("MERGES");
|
|
344
|
+
return {
|
|
345
|
+
type: POSTGRES_ENTITY_TYPES.operator,
|
|
346
|
+
schema: String(r.schema),
|
|
347
|
+
name: String(r.name),
|
|
348
|
+
oid: String(r.oid),
|
|
349
|
+
signature,
|
|
350
|
+
...withComment(r),
|
|
351
|
+
...dependents(r),
|
|
352
|
+
statement: [`CREATE OPERATOR ${name} (${opts.join(", ")})`, ...commentOn(`OPERATOR ${name}${signature}`, r.comment)].join(";\n"),
|
|
353
|
+
};
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
/** An `OPTIONS (...)` clause from a catalog `text[]` of `name=value`, and the names left out because they hold a credential. */
|
|
357
|
+
function optionsOf(raw) {
|
|
358
|
+
const kept = [];
|
|
359
|
+
const omitted = [];
|
|
360
|
+
for (const entry of raw ?? []) {
|
|
361
|
+
const at = entry.indexOf("=");
|
|
362
|
+
const name = at < 0 ? entry : entry.slice(0, at);
|
|
363
|
+
if (isSecretOption(name))
|
|
364
|
+
omitted.push(name);
|
|
365
|
+
else
|
|
366
|
+
kept.push(`${quoteIdent(name)} ${literal(at < 0 ? "" : entry.slice(at + 1))}`);
|
|
367
|
+
}
|
|
368
|
+
return { clause: kept.length > 0 ? ` OPTIONS (${kept.join(", ")})` : "", omitted };
|
|
369
|
+
}
|
|
370
|
+
const omittedWarning = (omitted) => omitted.length > 0 ? { warnings: [`the option${omitted.length === 1 ? "" : "s"} ${omitted.join(", ")} hold${omitted.length === 1 ? "s" : ""} a credential and ${omitted.length === 1 ? "is" : "are"} left out; the environment supplies it`] } : {};
|
|
371
|
+
/**
|
|
372
|
+
* The kinds of object #3911 adds that belong to the database or hang off a
|
|
373
|
+
* table: extended statistics (printed by the server), foreign data wrappers
|
|
374
|
+
* and servers, and publications, each assembled from its catalog rows. A
|
|
375
|
+
* wrapper, server or publication is the database's, so the schema scope does
|
|
376
|
+
* not narrow it. A credential in an option is left out and said so.
|
|
377
|
+
*/
|
|
378
|
+
export async function readDatabaseKinds(client, scope) {
|
|
379
|
+
const out = [...(await readOperators(client, scope))];
|
|
380
|
+
const s = scopeSql("n.nspname", scope);
|
|
381
|
+
const stats = await client.query(`SELECT e.oid::text AS oid, n.nspname AS schema, e.stxname AS name, pg_catalog.pg_get_statisticsobjdef(e.oid) AS def,
|
|
382
|
+
pg_catalog.obj_description(e.oid, 'pg_statistic_ext') AS comment
|
|
383
|
+
FROM pg_catalog.pg_statistic_ext e JOIN pg_catalog.pg_namespace n ON n.oid = e.stxnamespace
|
|
384
|
+
WHERE ${s.sql} AND ${notExtensionOwned("pg_statistic_ext", "e.oid")}
|
|
385
|
+
ORDER BY n.nspname ${C}, e.stxname ${C}`, s.params);
|
|
386
|
+
for (const r of stats) {
|
|
387
|
+
const q = qname(String(r.schema), String(r.name));
|
|
388
|
+
out.push({
|
|
389
|
+
type: POSTGRES_ENTITY_TYPES.statistics,
|
|
390
|
+
schema: String(r.schema),
|
|
391
|
+
name: String(r.name),
|
|
392
|
+
oid: String(r.oid),
|
|
393
|
+
...withComment(r),
|
|
394
|
+
statement: [String(r.def), ...commentOn(`STATISTICS ${q}`, r.comment)].join(";\n"),
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
const wrappers = await client.query(`SELECT w.oid::text AS oid, w.fdwname AS name, ${proc("w.fdwhandler::pg_catalog.regproc")} AS handler, ${proc("w.fdwvalidator::pg_catalog.regproc")} AS validator,
|
|
398
|
+
w.fdwoptions AS options, pg_catalog.obj_description(w.oid, 'pg_foreign_data_wrapper') AS comment, ${dependentsOf("pg_foreign_data_wrapper", "w.oid")} AS dependents
|
|
399
|
+
FROM pg_catalog.pg_foreign_data_wrapper w
|
|
400
|
+
WHERE ${notExtensionOwned("pg_foreign_data_wrapper", "w.oid")}
|
|
401
|
+
ORDER BY w.fdwname ${C}`);
|
|
402
|
+
for (const r of wrappers) {
|
|
403
|
+
const name = quoteIdent(String(r.name));
|
|
404
|
+
const { clause, omitted } = optionsOf(r.options);
|
|
405
|
+
out.push({
|
|
406
|
+
type: POSTGRES_ENTITY_TYPES.foreignDataWrapper,
|
|
407
|
+
name: String(r.name),
|
|
408
|
+
oid: String(r.oid),
|
|
409
|
+
...withComment(r),
|
|
410
|
+
...dependents(r),
|
|
411
|
+
...omittedWarning(omitted),
|
|
412
|
+
statement: [
|
|
413
|
+
`CREATE FOREIGN DATA WRAPPER ${name}${str(r.handler) ? ` HANDLER ${r.handler}` : ""}${str(r.validator) ? ` VALIDATOR ${r.validator}` : ""}${clause}`,
|
|
414
|
+
...commentOn(`FOREIGN DATA WRAPPER ${name}`, r.comment),
|
|
415
|
+
].join(";\n"),
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
const servers = await client.query(`SELECT v.oid::text AS oid, v.srvname AS name, v.srvtype AS type, v.srvversion AS version, w.fdwname AS wrapper, v.srvoptions AS options,
|
|
419
|
+
pg_catalog.obj_description(v.oid, 'pg_foreign_server') AS comment, ${dependentsOf("pg_foreign_server", "v.oid")} AS dependents
|
|
420
|
+
FROM pg_catalog.pg_foreign_server v JOIN pg_catalog.pg_foreign_data_wrapper w ON w.oid = v.srvfdw
|
|
421
|
+
WHERE ${notExtensionOwned("pg_foreign_server", "v.oid")}
|
|
422
|
+
ORDER BY v.srvname ${C}`);
|
|
423
|
+
for (const r of servers) {
|
|
424
|
+
const name = quoteIdent(String(r.name));
|
|
425
|
+
const { clause, omitted } = optionsOf(r.options);
|
|
426
|
+
out.push({
|
|
427
|
+
type: POSTGRES_ENTITY_TYPES.foreignServer,
|
|
428
|
+
name: String(r.name),
|
|
429
|
+
oid: String(r.oid),
|
|
430
|
+
...withComment(r),
|
|
431
|
+
...dependents(r),
|
|
432
|
+
...omittedWarning(omitted),
|
|
433
|
+
statement: [
|
|
434
|
+
`CREATE SERVER ${name}${str(r.type) ? ` TYPE ${literal(String(r.type))}` : ""}${str(r.version) ? ` VERSION ${literal(String(r.version))}` : ""} FOREIGN DATA WRAPPER ${quoteIdent(String(r.wrapper))}${clause}`,
|
|
435
|
+
...commentOn(`SERVER ${name}`, r.comment),
|
|
436
|
+
].join(";\n"),
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
out.push(...(await readPublications(client)));
|
|
440
|
+
return out;
|
|
441
|
+
}
|
|
442
|
+
/** Publications. Column lists, row filters and schema members are 15's; they are read where the catalog has them. */
|
|
443
|
+
async function readPublications(client) {
|
|
444
|
+
const has = async (catalog, column) => {
|
|
445
|
+
const rows = await client.query(column
|
|
446
|
+
? `SELECT 1 AS x FROM pg_catalog.pg_attribute WHERE attrelid = to_regclass('pg_catalog.${catalog}') AND attname = '${column}' AND NOT attisdropped`
|
|
447
|
+
: `SELECT 1 AS x WHERE to_regclass('pg_catalog.${catalog}') IS NOT NULL`);
|
|
448
|
+
return rows.length > 0;
|
|
449
|
+
};
|
|
450
|
+
const columnLists = await has("pg_publication_rel", "prattrs");
|
|
451
|
+
const schemaMembers = await has("pg_publication_namespace");
|
|
452
|
+
const pubs = await client.query(`SELECT p.oid::text AS oid, p.pubname AS name, p.puballtables AS alltables, p.pubinsert, p.pubupdate, p.pubdelete, p.pubtruncate,
|
|
453
|
+
pg_catalog.to_jsonb(p) AS def, pg_catalog.obj_description(p.oid, 'pg_publication') AS comment
|
|
454
|
+
FROM pg_catalog.pg_publication p
|
|
455
|
+
WHERE ${notExtensionOwned("pg_publication", "p.oid")}
|
|
456
|
+
ORDER BY p.pubname ${C}`);
|
|
457
|
+
const out = [];
|
|
458
|
+
for (const r of pubs) {
|
|
459
|
+
const name = quoteIdent(String(r.name));
|
|
460
|
+
const d = (typeof r.def === "string" ? JSON.parse(r.def) : r.def);
|
|
461
|
+
const tables = r.alltables
|
|
462
|
+
? []
|
|
463
|
+
: await client.query(`SELECT n.nspname AS schema, c.relname AS name,
|
|
464
|
+
${columnLists ? "ARRAY(SELECT pg_catalog.quote_ident(a.attname) FROM pg_catalog.pg_attribute a WHERE a.attrelid = r.prrelid AND a.attnum = ANY(r.prattrs::pg_catalog.int2[]) ORDER BY a.attnum)" : "NULL::text[]"} AS columns,
|
|
465
|
+
${columnLists ? "pg_catalog.pg_get_expr(r.prqual, r.prrelid)" : "NULL::text"} AS filter
|
|
466
|
+
FROM pg_catalog.pg_publication_rel r JOIN pg_catalog.pg_class c ON c.oid = r.prrelid JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
|
|
467
|
+
WHERE r.prpubid = $1::oid ORDER BY n.nspname ${C}, c.relname ${C}`, [String(r.oid)]);
|
|
468
|
+
const schemas = schemaMembers && !r.alltables
|
|
469
|
+
? await client.query(`SELECT n.nspname AS name FROM pg_catalog.pg_publication_namespace pn JOIN pg_catalog.pg_namespace n ON n.oid = pn.pnnspid WHERE pn.pnpubid = $1::oid ORDER BY n.nspname ${C}`, [String(r.oid)])
|
|
470
|
+
: [];
|
|
471
|
+
const members = [
|
|
472
|
+
...tables.map((t) => {
|
|
473
|
+
const columns = t.columns ?? [];
|
|
474
|
+
return `${qname(String(t.schema), String(t.name))}${columns.length > 0 ? ` (${columns.join(", ")})` : ""}${str(t.filter) ? ` WHERE (${t.filter})` : ""}`;
|
|
475
|
+
}),
|
|
476
|
+
];
|
|
477
|
+
const clauses = [];
|
|
478
|
+
if (r.alltables)
|
|
479
|
+
clauses.push("FOR ALL TABLES");
|
|
480
|
+
else if (members.length > 0 || schemas.length > 0) {
|
|
481
|
+
const parts = [];
|
|
482
|
+
if (members.length > 0)
|
|
483
|
+
parts.push(`TABLE ${members.join(", ")}`);
|
|
484
|
+
if (schemas.length > 0)
|
|
485
|
+
parts.push(`TABLES IN SCHEMA ${schemas.map((x) => quoteIdent(String(x.name))).join(", ")}`);
|
|
486
|
+
clauses.push(`FOR ${parts.join(", ")}`);
|
|
487
|
+
}
|
|
488
|
+
const publish = [r.pubinsert && "insert", r.pubupdate && "update", r.pubdelete && "delete", r.pubtruncate && "truncate"].filter(Boolean);
|
|
489
|
+
const options = [];
|
|
490
|
+
if (publish.length !== 4)
|
|
491
|
+
options.push(`publish = ${literal(publish.join(", "))}`);
|
|
492
|
+
if (d.pubviaroot === true)
|
|
493
|
+
options.push("publish_via_partition_root = true");
|
|
494
|
+
if (d.pubgencols !== undefined && d.pubgencols !== "n")
|
|
495
|
+
options.push("publish_generated_columns = stored");
|
|
496
|
+
if (options.length > 0)
|
|
497
|
+
clauses.push(`WITH (${options.join(", ")})`);
|
|
498
|
+
out.push({
|
|
499
|
+
type: POSTGRES_ENTITY_TYPES.publication,
|
|
500
|
+
name: String(r.name),
|
|
501
|
+
oid: String(r.oid),
|
|
502
|
+
...withComment(r),
|
|
503
|
+
statement: [`CREATE PUBLICATION ${name}${clauses.length > 0 ? ` ${clauses.join(" ")}` : ""}`, ...commentOn(`PUBLICATION ${name}`, r.comment)].join(";\n"),
|
|
504
|
+
});
|
|
505
|
+
}
|
|
506
|
+
return out;
|
|
507
|
+
}
|
|
@@ -74,6 +74,8 @@ export interface LivePgObject {
|
|
|
74
74
|
dependents?: string[];
|
|
75
75
|
/** Why no declaration can hold this object; it is read so import can say it left it out. */
|
|
76
76
|
unsupported?: string;
|
|
77
|
+
/** What was left out of an object that is otherwise read (an option that holds a credential), for import to say. */
|
|
78
|
+
warnings?: string[];
|
|
77
79
|
}
|
|
78
80
|
/** What {@link readLiveSchema} reads. */
|
|
79
81
|
export interface SchemaScope {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../src/postgres/live/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAKjF,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG3D,iEAAiE;AACjE,eAAO,MAAM,cAAc,UAAmD,CAAC;AAE/E,gHAAgH;AAChH,OAAO,EAAE,cAAc,EAAE,CAAC;AAE1B,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,kBAAkB,CAAC;IACzB,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,GAAG,EAAE,MAAM,CAAC;IACZ,uFAAuF;IACvF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB,+FAA+F;IAC/F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uIAAuI;IACvI,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iIAAiI;IACjI,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,4FAA4F;IAC5F,WAAW,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../src/postgres/live/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAKjF,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG3D,iEAAiE;AACjE,eAAO,MAAM,cAAc,UAAmD,CAAC;AAE/E,gHAAgH;AAChH,OAAO,EAAE,cAAc,EAAE,CAAC;AAE1B,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,kBAAkB,CAAC;IACzB,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,iDAAiD;IACjD,GAAG,EAAE,MAAM,CAAC;IACZ,uFAAuF;IACvF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB,+FAA+F;IAC/F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uIAAuI;IACvI,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iIAAiI;IACjI,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,4FAA4F;IAC5F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oHAAoH;IACpH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,yCAAyC;AACzC,MAAM,WAAW,WAAW;IAC1B,gHAAgH;IAChH,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B;;;;;OAKG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,2GAA2G;IAC3G,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3B;AAqBD,4EAA4E;AAC5E,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,EAAE,CAAA;CAAE,CAM/F;AAED,yGAAyG;AACzG,eAAO,MAAM,iBAAiB,GAAI,SAAS,MAAM,EAAE,KAAK,MAAM,KAAG,MAC4F,CAAC;AAa9J,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB;AAQD,yFAAyF;AACzF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW,GAAG,OAAO,CAAC,CAKtH;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,EAAE,CAa9E;AAcD;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,KAAK,GAAE,WAAgB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAkgB7G;AAED,+HAA+H;AAC/H,eAAO,MAAM,OAAO,GAAI,MAAM,MAAM,EAAE,QAAQ,MAAM,GAAG,SAAS,EAAE,MAAM,MAAM,EAAE,YAAY,MAAM,KAAG,MAA6D,CAAC;AAEnK;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,EAAE,QAAQ,EAAE,gBAAgB,GAAG,SAAS,GAAG,YAAY,EAAE,CAW1H"}
|
|
@@ -50,7 +50,7 @@ import { hasChantTrailerKey, RECEIPTS_TRAILER_KEY, stripMarker } from "../../cor
|
|
|
50
50
|
import { MIGRATION_TRAILER_KEY } from "../migrate/names.js";
|
|
51
51
|
import { isProviderOwned, providerData } from "../providers/index.js";
|
|
52
52
|
import { FOREIGN_TABLES } from "../../core/foreign-tables.js";
|
|
53
|
-
import { readCollations, readRoutineKinds, readTypeKinds } from "./catalog-kinds.js";
|
|
53
|
+
import { readCollations, readDatabaseKinds, readRoutineKinds, readTypeKinds } from "./catalog-kinds.js";
|
|
54
54
|
/** The server's own schemas, never part of a declared schema. */
|
|
55
55
|
export const SYSTEM_SCHEMAS = ["pg_catalog", "information_schema", "pg_toast"];
|
|
56
56
|
/** Tables another tool keeps its migration history in, by name, with the tool; both dialects share the list. */
|
|
@@ -535,6 +535,8 @@ export async function readLiveSchema(client, scope = {}) {
|
|
|
535
535
|
}
|
|
536
536
|
// Aggregates, casts and event triggers, after the functions they call (#3911).
|
|
537
537
|
out.push(...(await readRoutineKinds(client, scope)));
|
|
538
|
+
// Extended statistics, foreign data wrappers and servers, and publications (#3911).
|
|
539
|
+
out.push(...(await readDatabaseKinds(client, scope)));
|
|
538
540
|
// Triggers: the ones written by hand, not a foreign key's or a partition's clone of its parent's.
|
|
539
541
|
{
|
|
540
542
|
const rows = await client.query(`SELECT t.oid::text AS oid, n.nspname AS schema, c.relname AS table_name, t.tgname AS name, pg_catalog.pg_get_triggerdef(t.oid, true) AS def,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"describe-resources.d.ts","sourceRoot":"","sources":["../../../src/postgres/live/describe-resources.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAGL,KAAK,uBAAuB,EAG7B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAoD,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"describe-resources.d.ts","sourceRoot":"","sources":["../../../src/postgres/live/describe-resources.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAGL,KAAK,uBAAuB,EAG7B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAoD,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,QAAQ,CAAC;AAoBjH;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,EAAE,aAAa,EAAE,MAAM,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAkBtK;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG;IAAE,MAAM,EAAE,kBAAkB,GAAG,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAQxI;AAED,+HAA+H;AAC/H,wBAAgB,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,GAAG,MAAM,EAAE,GAAG,SAAS,CAWhJ;AAqDD,wBAAsB,iBAAiB,CACrC,OAAO,EAAE;IACP,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC;IAC9E,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GAAG,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,GACnC,OAAO,CAAC,uBAAuB,CAAC,CAMlC"}
|