@intentius/chant-lexicon-sql 0.124.45 → 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.
Files changed (360) hide show
  1. package/dist/change-set.d.ts +1 -1
  2. package/dist/change-set.d.ts.map +1 -1
  3. package/dist/change-set.js +2 -1
  4. package/dist/clickhouse/apply/statements.d.ts +9 -0
  5. package/dist/clickhouse/apply/statements.d.ts.map +1 -1
  6. package/dist/clickhouse/apply/statements.js +24 -0
  7. package/dist/clickhouse/import/live-export.d.ts +7 -3
  8. package/dist/clickhouse/import/live-export.d.ts.map +1 -1
  9. package/dist/clickhouse/import/live-export.js +21 -5
  10. package/dist/clickhouse/live/named-collections.d.ts +27 -0
  11. package/dist/clickhouse/live/named-collections.d.ts.map +1 -0
  12. package/dist/clickhouse/live/named-collections.js +53 -0
  13. package/dist/clickhouse/live/undeclarable.d.ts +15 -3
  14. package/dist/clickhouse/live/undeclarable.d.ts.map +1 -1
  15. package/dist/clickhouse/live/undeclarable.js +18 -4
  16. package/dist/clickhouse/named-collections.d.ts +83 -0
  17. package/dist/clickhouse/named-collections.d.ts.map +1 -0
  18. package/dist/clickhouse/named-collections.js +203 -0
  19. package/dist/clickhouse/parser.d.ts.map +1 -1
  20. package/dist/clickhouse/parser.js +1 -1
  21. package/dist/clickhouse/plan/commands.d.ts +2 -1
  22. package/dist/clickhouse/plan/commands.d.ts.map +1 -1
  23. package/dist/clickhouse/plan/commands.js +17 -2
  24. package/dist/clickhouse/plan/diff.d.ts +15 -0
  25. package/dist/clickhouse/plan/diff.d.ts.map +1 -1
  26. package/dist/clickhouse/plan/diff.js +43 -1
  27. package/dist/clickhouse/plan/disruption.d.ts.map +1 -1
  28. package/dist/clickhouse/plan/disruption.js +5 -0
  29. package/dist/clickhouse/plan/rebuild-handoff.d.ts.map +1 -1
  30. package/dist/clickhouse/plan/rebuild-handoff.js +4 -0
  31. package/dist/clickhouse/plan/report.d.ts.map +1 -1
  32. package/dist/clickhouse/plan/report.js +6 -1
  33. package/dist/clickhouse/plan/rules.d.ts +5 -1
  34. package/dist/clickhouse/plan/rules.d.ts.map +1 -1
  35. package/dist/clickhouse/plan/rules.js +7 -3
  36. package/dist/clickhouse/plan/stream.d.ts +40 -0
  37. package/dist/clickhouse/plan/stream.d.ts.map +1 -0
  38. package/dist/clickhouse/plan/stream.js +107 -0
  39. package/dist/clickhouse/rebuild/observe.d.ts +3 -1
  40. package/dist/clickhouse/rebuild/observe.d.ts.map +1 -1
  41. package/dist/clickhouse/rebuild/observe.js +14 -1
  42. package/dist/clickhouse/review-catalog.d.ts +213 -0
  43. package/dist/clickhouse/review-catalog.d.ts.map +1 -0
  44. package/dist/clickhouse/review-catalog.js +330 -0
  45. package/dist/codegen/classifier-page.d.ts.map +1 -1
  46. package/dist/codegen/classifier-page.js +21 -4
  47. package/dist/codegen/clickhouse-module.d.ts.map +1 -1
  48. package/dist/codegen/clickhouse-module.js +3 -0
  49. package/dist/codegen/coverage-page.d.ts.map +1 -1
  50. package/dist/codegen/coverage-page.js +5 -3
  51. package/dist/codegen/docs.js +1 -1
  52. package/dist/codegen/postgres-classifier-page.js +1 -1
  53. package/dist/codegen/registry.d.ts.map +1 -1
  54. package/dist/codegen/registry.js +5 -0
  55. package/dist/composites/catalog.d.ts.map +1 -1
  56. package/dist/composites/catalog.js +100 -0
  57. package/dist/composites/clickhouse.d.ts +2 -0
  58. package/dist/composites/clickhouse.d.ts.map +1 -1
  59. package/dist/composites/clickhouse.js +2 -0
  60. package/dist/composites/otel-tables.d.ts +100 -0
  61. package/dist/composites/otel-tables.d.ts.map +1 -0
  62. package/dist/composites/otel-tables.js +282 -0
  63. package/dist/composites/stream-ingest.d.ts +63 -0
  64. package/dist/composites/stream-ingest.d.ts.map +1 -0
  65. package/dist/composites/stream-ingest.js +39 -0
  66. package/dist/coverage/clickhouse.json +1 -1
  67. package/dist/coverage/postgres.json +7 -7
  68. package/dist/coverage.d.ts +16 -6
  69. package/dist/coverage.d.ts.map +1 -1
  70. package/dist/coverage.js +10 -5
  71. package/dist/drizzle-command.d.ts +17 -0
  72. package/dist/drizzle-command.d.ts.map +1 -0
  73. package/dist/drizzle-command.js +91 -0
  74. package/dist/drizzle.d.ts +70 -0
  75. package/dist/drizzle.d.ts.map +1 -0
  76. package/dist/drizzle.js +684 -0
  77. package/dist/files/clickhouse.d.ts.map +1 -1
  78. package/dist/files/clickhouse.js +8 -1
  79. package/dist/files/common.d.ts +13 -0
  80. package/dist/files/common.d.ts.map +1 -1
  81. package/dist/files/common.js +5 -0
  82. package/dist/files/postgres.js +12 -2
  83. package/dist/generated/clickhouse.d.ts +2 -0
  84. package/dist/generated/clickhouse.d.ts.map +1 -1
  85. package/dist/generated/clickhouse.js +2 -0
  86. package/dist/import-parser.d.ts +21 -1
  87. package/dist/import-parser.d.ts.map +1 -1
  88. package/dist/import-parser.js +79 -5
  89. package/dist/index.d.ts +1 -1
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +1 -1
  92. package/dist/integrity.json +6 -5
  93. package/dist/lint/post-synth/audit-entries.d.ts.map +1 -1
  94. package/dist/lint/post-synth/audit-entries.js +1 -0
  95. package/dist/lint/post-synth/index.d.ts.map +1 -1
  96. package/dist/lint/post-synth/index.js +2 -0
  97. package/dist/lint/post-synth/sqlch128.d.ts +18 -0
  98. package/dist/lint/post-synth/sqlch128.d.ts.map +1 -0
  99. package/dist/lint/post-synth/sqlch128.js +222 -0
  100. package/dist/lint/rules/postgres-templates.js +2 -2
  101. package/dist/lsp/postgres-template.d.ts.map +1 -1
  102. package/dist/lsp/postgres-template.js +11 -0
  103. package/dist/manifest.json +1 -1
  104. package/dist/mcp/postgres.js +1 -1
  105. package/dist/meta.json +25 -0
  106. package/dist/migrate/from-postgres/detect.d.ts +4 -0
  107. package/dist/migrate/from-postgres/detect.d.ts.map +1 -0
  108. package/dist/migrate/from-postgres/detect.js +7 -0
  109. package/dist/migrate/from-postgres/emit.d.ts +26 -0
  110. package/dist/migrate/from-postgres/emit.d.ts.map +1 -0
  111. package/dist/migrate/from-postgres/emit.js +86 -0
  112. package/dist/migrate/from-postgres/index.d.ts +51 -0
  113. package/dist/migrate/from-postgres/index.d.ts.map +1 -0
  114. package/dist/migrate/from-postgres/index.js +115 -0
  115. package/dist/migrate/from-postgres/translate.d.ts +73 -0
  116. package/dist/migrate/from-postgres/translate.d.ts.map +1 -0
  117. package/dist/migrate/from-postgres/translate.js +261 -0
  118. package/dist/migrate/from-postgres/types.d.ts +51 -0
  119. package/dist/migrate/from-postgres/types.d.ts.map +1 -0
  120. package/dist/migrate/from-postgres/types.js +211 -0
  121. package/dist/migration-replay.d.ts +73 -0
  122. package/dist/migration-replay.d.ts.map +1 -0
  123. package/dist/migration-replay.js +294 -0
  124. package/dist/okf/index.md +6 -0
  125. package/dist/okf/rules/SQLCH128.md +11 -0
  126. package/dist/okf/types/PostgresForeignDataWrapper.md +9 -0
  127. package/dist/okf/types/PostgresForeignServer.md +9 -0
  128. package/dist/okf/types/PostgresOperator.md +9 -0
  129. package/dist/okf/types/PostgresPublication.md +9 -0
  130. package/dist/okf/types/PostgresStatistics.md +9 -0
  131. package/dist/op/activities/postgres-migration.d.ts.map +1 -1
  132. package/dist/op/activities/postgres-migration.js +4 -0
  133. package/dist/op/activity-contracts.d.ts +20 -0
  134. package/dist/op/activity-contracts.d.ts.map +1 -1
  135. package/dist/op/activity-contracts.js +2 -0
  136. package/dist/plugin.d.ts.map +1 -1
  137. package/dist/plugin.js +36 -2
  138. package/dist/postgres/apply/apply.js +8 -1
  139. package/dist/postgres/apply/statements.d.ts.map +1 -1
  140. package/dist/postgres/apply/statements.js +87 -2
  141. package/dist/postgres/constraint-names.d.ts +30 -0
  142. package/dist/postgres/constraint-names.d.ts.map +1 -0
  143. package/dist/postgres/constraint-names.js +72 -0
  144. package/dist/postgres/entities.d.ts +110 -1
  145. package/dist/postgres/entities.d.ts.map +1 -1
  146. package/dist/postgres/entities.js +146 -0
  147. package/dist/postgres/entity-types.d.ts +5 -0
  148. package/dist/postgres/entity-types.d.ts.map +1 -1
  149. package/dist/postgres/entity-types.js +5 -0
  150. package/dist/postgres/import/generator.d.ts.map +1 -1
  151. package/dist/postgres/import/generator.js +50 -2
  152. package/dist/postgres/import/live-export.d.ts.map +1 -1
  153. package/dist/postgres/import/live-export.js +2 -0
  154. package/dist/postgres/live/catalog-kinds.d.ts +14 -0
  155. package/dist/postgres/live/catalog-kinds.d.ts.map +1 -1
  156. package/dist/postgres/live/catalog-kinds.js +206 -0
  157. package/dist/postgres/live/catalog.d.ts +2 -0
  158. package/dist/postgres/live/catalog.d.ts.map +1 -1
  159. package/dist/postgres/live/catalog.js +3 -1
  160. package/dist/postgres/live/describe-resources.d.ts.map +1 -1
  161. package/dist/postgres/live/describe-resources.js +10 -2
  162. package/dist/postgres/migrate/backfill.d.ts +2 -0
  163. package/dist/postgres/migrate/backfill.d.ts.map +1 -1
  164. package/dist/postgres/migrate/backfill.js +7 -1
  165. package/dist/postgres/migrate/carry.d.ts +45 -1
  166. package/dist/postgres/migrate/carry.d.ts.map +1 -1
  167. package/dist/postgres/migrate/carry.js +72 -8
  168. package/dist/postgres/migrate/observe.d.ts +28 -4
  169. package/dist/postgres/migrate/observe.d.ts.map +1 -1
  170. package/dist/postgres/migrate/observe.js +41 -12
  171. package/dist/postgres/migrate/op.d.ts +26 -1
  172. package/dist/postgres/migrate/op.d.ts.map +1 -1
  173. package/dist/postgres/migrate/op.js +3 -1
  174. package/dist/postgres/migrate/steps.d.ts +35 -2
  175. package/dist/postgres/migrate/steps.d.ts.map +1 -1
  176. package/dist/postgres/migrate/steps.js +158 -12
  177. package/dist/postgres/parser.d.ts +72 -1
  178. package/dist/postgres/parser.d.ts.map +1 -1
  179. package/dist/postgres/parser.js +194 -2
  180. package/dist/postgres/plan/deep.d.ts.map +1 -1
  181. package/dist/postgres/plan/deep.js +29 -1
  182. package/dist/postgres/plan/diff.d.ts.map +1 -1
  183. package/dist/postgres/plan/diff.js +39 -1
  184. package/dist/postgres/plan/normalize.d.ts +17 -2
  185. package/dist/postgres/plan/normalize.d.ts.map +1 -1
  186. package/dist/postgres/plan/normalize.js +109 -1
  187. package/dist/postgres/plan/rules.d.ts +1 -0
  188. package/dist/postgres/plan/rules.d.ts.map +1 -1
  189. package/dist/postgres/plan/rules.js +3 -2
  190. package/dist/postgres/plan/schema.js +1 -1
  191. package/dist/postgres/secret-options.d.ts +10 -0
  192. package/dist/postgres/secret-options.d.ts.map +1 -0
  193. package/dist/postgres/secret-options.js +9 -0
  194. package/dist/postgres/testing/roundtrip-schema.d.ts +3 -2
  195. package/dist/postgres/testing/roundtrip-schema.d.ts.map +1 -1
  196. package/dist/postgres/testing/roundtrip-schema.js +13 -1
  197. package/dist/postgres.d.ts +1 -1
  198. package/dist/postgres.d.ts.map +1 -1
  199. package/dist/postgres.js +1 -1
  200. package/dist/rules/audit-entries.ts +1 -0
  201. package/dist/rules/postgres-templates.ts +2 -2
  202. package/dist/rules/sqlch128.ts +230 -0
  203. package/dist/serializer.d.ts +5 -0
  204. package/dist/serializer.d.ts.map +1 -1
  205. package/dist/serializer.js +13 -2
  206. package/dist/sql-types-command.d.ts +13 -0
  207. package/dist/sql-types-command.d.ts.map +1 -1
  208. package/dist/sql-types-command.js +31 -16
  209. package/dist/sql-types.d.ts +22 -0
  210. package/dist/sql-types.d.ts.map +1 -1
  211. package/dist/sql-types.js +10 -6
  212. package/dist/sqlserver/lexer.d.ts +37 -0
  213. package/dist/sqlserver/lexer.d.ts.map +1 -0
  214. package/dist/sqlserver/lexer.js +254 -0
  215. package/dist/sqlserver/parse.d.ts +185 -0
  216. package/dist/sqlserver/parse.d.ts.map +1 -0
  217. package/dist/sqlserver/parse.js +767 -0
  218. package/dist/sqlserver/translate.d.ts +34 -0
  219. package/dist/sqlserver/translate.d.ts.map +1 -0
  220. package/dist/sqlserver/translate.js +495 -0
  221. package/dist/sqlserver/types.d.ts +44 -0
  222. package/dist/sqlserver/types.d.ts.map +1 -0
  223. package/dist/sqlserver/types.js +133 -0
  224. package/dist/sqlserver/validate.d.ts +31 -0
  225. package/dist/sqlserver/validate.d.ts.map +1 -0
  226. package/dist/sqlserver/validate.js +67 -0
  227. package/dist/validate.d.ts.map +1 -1
  228. package/dist/validate.js +5 -0
  229. package/package.json +2 -2
  230. package/src/change-set.ts +2 -1
  231. package/src/clickhouse/apply/statements.ts +25 -0
  232. package/src/clickhouse/import/live-export.ts +20 -5
  233. package/src/clickhouse/live/named-collections.e2e.test.ts +88 -0
  234. package/src/clickhouse/live/named-collections.ts +61 -0
  235. package/src/clickhouse/live/undeclarable.e2e.test.ts +5 -3
  236. package/src/clickhouse/live/undeclarable.ts +20 -4
  237. package/src/clickhouse/named-collections.test.ts +187 -0
  238. package/src/clickhouse/named-collections.ts +224 -0
  239. package/src/clickhouse/parser.ts +2 -1
  240. package/src/clickhouse/plan/commands.ts +17 -2
  241. package/src/clickhouse/plan/diff.ts +57 -1
  242. package/src/clickhouse/plan/disruption.ts +5 -0
  243. package/src/clickhouse/plan/rebuild-handoff.ts +3 -0
  244. package/src/clickhouse/plan/report.ts +6 -1
  245. package/src/clickhouse/plan/rules.ts +14 -4
  246. package/src/clickhouse/plan/stream-s3queue.e2e.test.ts +148 -0
  247. package/src/clickhouse/plan/stream.test.ts +237 -0
  248. package/src/clickhouse/plan/stream.ts +111 -0
  249. package/src/clickhouse/rebuild/observe.ts +15 -1
  250. package/src/clickhouse/review-catalog.test.ts +181 -0
  251. package/src/clickhouse/review-catalog.ts +489 -0
  252. package/src/codegen/classifier-page.ts +21 -4
  253. package/src/codegen/clickhouse-module.ts +3 -0
  254. package/src/codegen/coverage-page.ts +5 -3
  255. package/src/codegen/docs.ts +1 -1
  256. package/src/codegen/postgres-classifier-page.ts +1 -1
  257. package/src/codegen/registry.ts +5 -0
  258. package/src/composites/catalog.test.ts +6 -1
  259. package/src/composites/catalog.ts +100 -0
  260. package/src/composites/clickhouse.ts +2 -0
  261. package/src/composites/composites.test.ts +1 -1
  262. package/src/composites/otel-tables.test.ts +118 -0
  263. package/src/composites/otel-tables.ts +339 -0
  264. package/src/composites/stream-ingest.test.ts +114 -0
  265. package/src/composites/stream-ingest.ts +82 -0
  266. package/src/core/undeclarable.test.ts +6 -5
  267. package/src/coverage/clickhouse.json +1 -1
  268. package/src/coverage/postgres.json +7 -7
  269. package/src/coverage.test.ts +27 -2
  270. package/src/coverage.ts +18 -7
  271. package/src/drizzle-command.ts +94 -0
  272. package/src/drizzle-kit.e2e.test.ts +89 -0
  273. package/src/drizzle-types.e2e.test.ts +67 -0
  274. package/src/drizzle.test.ts +358 -0
  275. package/src/drizzle.ts +737 -0
  276. package/src/files/clickhouse.ts +8 -1
  277. package/src/files/common.ts +14 -1
  278. package/src/files/postgres.ts +12 -2
  279. package/src/generated/clickhouse.ts +3 -0
  280. package/src/generated/lexicon-sql.json +25 -0
  281. package/src/import-parser.sqlserver.test.ts +92 -0
  282. package/src/import-parser.ts +79 -5
  283. package/src/index.ts +1 -1
  284. package/src/lint/post-synth/audit-entries.ts +1 -0
  285. package/src/lint/post-synth/index.ts +2 -0
  286. package/src/lint/post-synth/sqlch128.test.ts +107 -0
  287. package/src/lint/post-synth/sqlch128.ts +230 -0
  288. package/src/lint/rules/postgres-templates.ts +2 -2
  289. package/src/lsp/postgres-template.ts +11 -0
  290. package/src/mcp/postgres.ts +1 -1
  291. package/src/migrate/from-postgres/cli.test.ts +165 -0
  292. package/src/migrate/from-postgres/detect.ts +7 -0
  293. package/src/migrate/from-postgres/emit.ts +96 -0
  294. package/src/migrate/from-postgres/example.test.ts +205 -0
  295. package/src/migrate/from-postgres/index.ts +122 -0
  296. package/src/migrate/from-postgres/translate.test.ts +242 -0
  297. package/src/migrate/from-postgres/translate.ts +359 -0
  298. package/src/migrate/from-postgres/types.test.ts +116 -0
  299. package/src/migrate/from-postgres/types.ts +236 -0
  300. package/src/migrate/from-postgres/validate.e2e.test.ts +44 -0
  301. package/src/migrate/from-postgres/workspace.e2e.test.ts +114 -0
  302. package/src/migration-replay.e2e.test.ts +155 -0
  303. package/src/migration-replay.test.ts +173 -0
  304. package/src/migration-replay.ts +289 -0
  305. package/src/op/__snapshots__/watch-pipeline.test.ts.snap +2 -2
  306. package/src/op/activities/postgres-migration.ts +4 -0
  307. package/src/op/activity-contracts.ts +2 -0
  308. package/src/plugin.ts +37 -2
  309. package/src/postgres/apply/apply.ts +9 -1
  310. package/src/postgres/apply/statements.ts +74 -1
  311. package/src/postgres/constraint-names.ts +71 -0
  312. package/src/postgres/database-kinds.test.ts +384 -0
  313. package/src/postgres/entities.ts +266 -1
  314. package/src/postgres/entity-types.ts +5 -0
  315. package/src/postgres/import/generator.ts +42 -2
  316. package/src/postgres/import/live-export.ts +1 -0
  317. package/src/postgres/live/catalog-kinds.ts +223 -0
  318. package/src/postgres/live/catalog.ts +6 -1
  319. package/src/postgres/live/database-kinds.e2e.test.ts +164 -0
  320. package/src/postgres/live/describe-resources.ts +11 -2
  321. package/src/postgres/live/undeclarable.e2e.test.ts +13 -6
  322. package/src/postgres/migrate/backfill.ts +13 -1
  323. package/src/postgres/migrate/carry.ts +103 -8
  324. package/src/postgres/migrate/followups.e2e.test.ts +218 -0
  325. package/src/postgres/migrate/followups.test.ts +199 -0
  326. package/src/postgres/migrate/kinds.e2e.test.ts +5 -5
  327. package/src/postgres/migrate/observe.ts +53 -14
  328. package/src/postgres/migrate/op.ts +28 -1
  329. package/src/postgres/migrate/partition.e2e.test.ts +129 -0
  330. package/src/postgres/migrate/partition.test.ts +206 -0
  331. package/src/postgres/migrate/steps.ts +157 -12
  332. package/src/postgres/parser.ts +234 -2
  333. package/src/postgres/plan/deep.ts +28 -1
  334. package/src/postgres/plan/diff.ts +36 -1
  335. package/src/postgres/plan/normalize.ts +122 -1
  336. package/src/postgres/plan/rules.ts +10 -3
  337. package/src/postgres/plan/schema.ts +1 -1
  338. package/src/postgres/secret-options.ts +10 -0
  339. package/src/postgres/testing/roundtrip-schema.ts +13 -1
  340. package/src/postgres.ts +16 -0
  341. package/src/serializer.ts +13 -2
  342. package/src/skills/chant-sql-postgres-migration.md +3 -3
  343. package/src/skills/chant-sql-postgres.md +6 -1
  344. package/src/skills/chant-sql.md +2 -1
  345. package/src/sql-types-command.ts +38 -16
  346. package/src/sql-types.ts +11 -6
  347. package/src/sqlserver/fixture.test.ts +186 -0
  348. package/src/sqlserver/import-cli.test.ts +61 -0
  349. package/src/sqlserver/lexer.ts +260 -0
  350. package/src/sqlserver/parse.ts +865 -0
  351. package/src/sqlserver/translate.test.ts +396 -0
  352. package/src/sqlserver/translate.ts +558 -0
  353. package/src/sqlserver/types.test.ts +102 -0
  354. package/src/sqlserver/types.ts +154 -0
  355. package/src/sqlserver/validate.e2e.test.ts +32 -0
  356. package/src/sqlserver/validate.test.ts +49 -0
  357. package/src/sqlserver/validate.ts +76 -0
  358. package/src/validate.ts +5 -0
  359. package/src/workspace-kinds.test.ts +11 -0
  360. 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;;;;;;;;;;;;;;;;;;;;;;;CAuBxB,CAAC;AAEX,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,qBAAqB,CAAC,CAAC,MAAM,OAAO,qBAAqB,CAAC,CAAC"}
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;AAwCD,wEAAwE;AACxE,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAO,CAAC;AA+HrE,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"}
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,CAyCvF"}
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;AA0C7F,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"}
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;CACtB;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,CA+f7G;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"}
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;AAYjH;;;;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,CAiBtK;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"}
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"}