@intentius/chant-lexicon-sql 0.124.31 → 0.124.33

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 (322) hide show
  1. package/dist/change-set.js +250 -0
  2. package/dist/clickhouse/access.js +722 -0
  3. package/dist/clickhouse/apply/apply.js +243 -0
  4. package/dist/clickhouse/apply/mutations.js +66 -0
  5. package/dist/clickhouse/apply/statements.js +545 -0
  6. package/dist/clickhouse/catalog-types.js +7 -0
  7. package/dist/clickhouse/container.js +152 -0
  8. package/dist/clickhouse/engine-syntax.js +159 -0
  9. package/dist/clickhouse/entities.js +593 -0
  10. package/dist/clickhouse/expressions.js +107 -0
  11. package/dist/clickhouse/http.js +55 -0
  12. package/dist/clickhouse/import/generator.js +192 -0
  13. package/dist/clickhouse/import/inlined.js +207 -0
  14. package/dist/clickhouse/import/ir.js +160 -0
  15. package/dist/clickhouse/import/live-export.js +131 -0
  16. package/dist/clickhouse/import/parser.js +17 -0
  17. package/dist/clickhouse/live/bind.js +116 -0
  18. package/dist/clickhouse/live/catalog.js +223 -0
  19. package/dist/clickhouse/live/describe-resources.js +91 -0
  20. package/dist/clickhouse/live/undeclarable.js +59 -0
  21. package/dist/clickhouse/overlays/codecs.js +57 -0
  22. package/dist/clickhouse/overlays/engines.js +101 -0
  23. package/dist/clickhouse/overlays/kinds.js +1 -0
  24. package/dist/clickhouse/overlays/projections.js +26 -0
  25. package/dist/clickhouse/overlays/skip-indexes.js +40 -0
  26. package/dist/clickhouse/overlays/ttl.js +34 -0
  27. package/dist/clickhouse/overlays/types.js +59 -0
  28. package/dist/clickhouse/ownership.js +83 -0
  29. package/dist/clickhouse/parser.js +674 -0
  30. package/dist/clickhouse/plan/commands.js +159 -0
  31. package/dist/clickhouse/plan/deep.js +345 -0
  32. package/dist/clickhouse/plan/diff.js +312 -0
  33. package/dist/clickhouse/plan/disruption.js +73 -0
  34. package/dist/clickhouse/plan/normalize.js +545 -0
  35. package/dist/clickhouse/plan/rebuild-handoff.js +57 -0
  36. package/dist/clickhouse/plan/report.js +26 -0
  37. package/dist/clickhouse/plan/rules.js +72 -0
  38. package/dist/clickhouse/plan/schema.js +67 -0
  39. package/dist/clickhouse/plan/server-format.js +35 -0
  40. package/dist/clickhouse/rebuild/backfill.js +265 -0
  41. package/dist/clickhouse/rebuild/engines.js +146 -0
  42. package/dist/clickhouse/rebuild/observe.js +260 -0
  43. package/dist/clickhouse/rebuild/op.js +152 -0
  44. package/dist/clickhouse/rebuild/partitions.js +65 -0
  45. package/dist/clickhouse/rebuild/receipts.js +120 -0
  46. package/dist/clickhouse/rebuild/replicas.js +121 -0
  47. package/dist/clickhouse/rebuild/shards.js +76 -0
  48. package/dist/clickhouse/rebuild/steps.js +383 -0
  49. package/dist/clickhouse/rebuild/verify.js +279 -0
  50. package/dist/clickhouse/row-types.js +151 -0
  51. package/dist/clickhouse/testing/fake-server.js +47 -0
  52. package/dist/clickhouse/testing/roundtrip-schema.js +25 -0
  53. package/dist/clickhouse/testing/writable-server.js +123 -0
  54. package/dist/clickhouse/tokens.js +23 -0
  55. package/dist/clickhouse/topology.js +463 -0
  56. package/dist/clickhouse/type-syntax.js +73 -0
  57. package/dist/clickhouse.js +25 -0
  58. package/dist/codegen/classifier-page.js +93 -0
  59. package/dist/codegen/clickhouse-module.js +249 -0
  60. package/dist/codegen/coverage-page.js +70 -0
  61. package/dist/codegen/docs-cli.js +3 -0
  62. package/dist/codegen/docs.js +222 -0
  63. package/dist/codegen/generate-cli.js +13 -0
  64. package/dist/codegen/generate.js +97 -0
  65. package/dist/codegen/package.js +28 -0
  66. package/dist/codegen/postgres-classifier-page.js +95 -0
  67. package/dist/codegen/postgres-module.js +418 -0
  68. package/dist/codegen/registry.js +52 -0
  69. package/dist/composites/audit-log-table.js +35 -0
  70. package/dist/composites/catalog.js +524 -0
  71. package/dist/composites/cdc-mirror.js +32 -0
  72. package/dist/composites/clickhouse.js +6 -0
  73. package/dist/composites/events-table.js +26 -0
  74. package/dist/composites/index.js +8 -0
  75. package/dist/composites/join-table.js +25 -0
  76. package/dist/composites/postgres.js +6 -0
  77. package/dist/composites/refreshed-view.js +24 -0
  78. package/dist/composites/replacing-table.js +28 -0
  79. package/dist/composites/rollup-view.js +29 -0
  80. package/dist/composites/sharded-table.js +27 -0
  81. package/dist/composites/soft-delete-table.js +34 -0
  82. package/dist/composites/tenant-table.js +26 -0
  83. package/dist/composites/typed.js +8 -0
  84. package/dist/config.js +206 -0
  85. package/dist/core/apply.js +93 -0
  86. package/dist/core/classifier.js +115 -0
  87. package/dist/core/container.js +69 -0
  88. package/dist/core/cursor.js +261 -0
  89. package/dist/core/diff.js +48 -0
  90. package/dist/core/entity.js +58 -0
  91. package/dist/core/find-templates.js +118 -0
  92. package/dist/core/foreign-tables.js +27 -0
  93. package/dist/core/handoff.js +32 -0
  94. package/dist/core/index.js +64 -0
  95. package/dist/core/interpolation.js +191 -0
  96. package/dist/core/normalize.js +43 -0
  97. package/dist/core/ownership.js +119 -0
  98. package/dist/core/receipts.js +22 -0
  99. package/dist/core/references.js +61 -0
  100. package/dist/core/statements.js +42 -0
  101. package/dist/core/template.js +79 -0
  102. package/dist/core/testing/http-stub.js +21 -0
  103. package/dist/core/tokens.js +202 -0
  104. package/dist/core/typed.js +40 -0
  105. package/dist/core/undeclarable.js +46 -0
  106. package/dist/coverage.js +161 -0
  107. package/dist/detect.js +32 -0
  108. package/dist/dialects.js +18 -0
  109. package/dist/files/build-root.js +72 -0
  110. package/dist/files/clickhouse.js +138 -0
  111. package/dist/files/common.js +58 -0
  112. package/dist/files/postgres.js +389 -0
  113. package/dist/generated/clickhouse-types.js +5 -0
  114. package/dist/generated/clickhouse.js +4361 -0
  115. package/dist/generated/postgres-types.js +227 -0
  116. package/dist/generated/postgres.js +3667 -0
  117. package/dist/import-generator.js +14 -0
  118. package/dist/import-parser.js +71 -0
  119. package/dist/index.js +24 -0
  120. package/dist/init-templates.js +290 -0
  121. package/dist/integrity.json +2 -2
  122. package/dist/lint/audit-catalog.js +31 -0
  123. package/dist/lint/audit-lineage.js +22 -0
  124. package/dist/lint/post-synth/audit-entries.js +34 -0
  125. package/dist/lint/post-synth/clickhouse-helpers.js +79 -0
  126. package/dist/lint/post-synth/clickhouse-type-check.js +162 -0
  127. package/dist/lint/post-synth/index.js +112 -0
  128. package/dist/lint/post-synth/postgres-audit-entries.js +35 -0
  129. package/dist/lint/post-synth/postgres-helpers.js +65 -0
  130. package/dist/lint/post-synth/postgres-names.js +507 -0
  131. package/dist/lint/post-synth/sql-helpers.js +23 -0
  132. package/dist/lint/post-synth/sql101.js +59 -0
  133. package/dist/lint/post-synth/sql102.js +34 -0
  134. package/dist/lint/post-synth/sqlch101.js +34 -0
  135. package/dist/lint/post-synth/sqlch102.js +23 -0
  136. package/dist/lint/post-synth/sqlch103.js +45 -0
  137. package/dist/lint/post-synth/sqlch104.js +41 -0
  138. package/dist/lint/post-synth/sqlch105.js +36 -0
  139. package/dist/lint/post-synth/sqlch106.js +27 -0
  140. package/dist/lint/post-synth/sqlch107.js +39 -0
  141. package/dist/lint/post-synth/sqlch108.js +28 -0
  142. package/dist/lint/post-synth/sqlch109.js +21 -0
  143. package/dist/lint/post-synth/sqlch110.js +31 -0
  144. package/dist/lint/post-synth/sqlch111.js +41 -0
  145. package/dist/lint/post-synth/sqlch112.js +28 -0
  146. package/dist/lint/post-synth/sqlch113.js +19 -0
  147. package/dist/lint/post-synth/sqlch114.js +26 -0
  148. package/dist/lint/post-synth/sqlch115.js +30 -0
  149. package/dist/lint/post-synth/sqlch116.js +22 -0
  150. package/dist/lint/post-synth/sqlch117.js +26 -0
  151. package/dist/lint/post-synth/sqlch118.js +27 -0
  152. package/dist/lint/post-synth/sqlch119.js +32 -0
  153. package/dist/lint/post-synth/sqlch120.js +20 -0
  154. package/dist/lint/post-synth/sqlch121.js +11 -0
  155. package/dist/lint/post-synth/sqlch122.js +11 -0
  156. package/dist/lint/post-synth/sqlch123.js +10 -0
  157. package/dist/lint/post-synth/sqlch124.js +21 -0
  158. package/dist/lint/post-synth/sqlch125.js +55 -0
  159. package/dist/lint/post-synth/sqlch126.js +62 -0
  160. package/dist/lint/post-synth/sqlch127.js +132 -0
  161. package/dist/lint/post-synth/sqlpg101.js +25 -0
  162. package/dist/lint/post-synth/sqlpg102.js +35 -0
  163. package/dist/lint/post-synth/sqlpg103.js +23 -0
  164. package/dist/lint/post-synth/sqlpg104.js +23 -0
  165. package/dist/lint/post-synth/sqlpg105.js +22 -0
  166. package/dist/lint/post-synth/sqlpg106.js +22 -0
  167. package/dist/lint/post-synth/sqlpg107.js +22 -0
  168. package/dist/lint/post-synth/sqlpg108.js +28 -0
  169. package/dist/lint/post-synth/sqlpg109.js +39 -0
  170. package/dist/lint/post-synth/sqlpg110.js +38 -0
  171. package/dist/lint/post-synth/sqlpg111.js +23 -0
  172. package/dist/lint/post-synth/sqlpg112.js +25 -0
  173. package/dist/lint/post-synth/sqlpg113.js +29 -0
  174. package/dist/lint/post-synth/sqlpg114.js +39 -0
  175. package/dist/lint/post-synth/sqlpg115.js +48 -0
  176. package/dist/lint/post-synth/sqlpg116.js +26 -0
  177. package/dist/lint/post-synth/sqlpg117.js +24 -0
  178. package/dist/lint/post-synth/sqlpg118.js +22 -0
  179. package/dist/lint/post-synth/sqlpg119.js +41 -0
  180. package/dist/lint/post-synth/sqlpg120.js +83 -0
  181. package/dist/lint/post-synth/sqlpg121.js +33 -0
  182. package/dist/lint/post-synth/sqlpg122.js +27 -0
  183. package/dist/lint/post-synth/sqlpg123.js +69 -0
  184. package/dist/lint/post-synth/sqlpg124.js +50 -0
  185. package/dist/lint/post-synth/sqlpg125.js +41 -0
  186. package/dist/lint/post-synth/sqlpg126.js +38 -0
  187. package/dist/lint/rules/index.js +12 -0
  188. package/dist/lint/rules/postgres-templates.js +27 -0
  189. package/dist/lint/rules/sqlch001.js +79 -0
  190. package/dist/lint/rules/sqlch002.js +124 -0
  191. package/dist/lint/rules/sqlch003.js +69 -0
  192. package/dist/lint/rules/sqlch004.js +83 -0
  193. package/dist/lint/rules/sqlpg001.js +68 -0
  194. package/dist/lint/rules/sqlpg002.js +69 -0
  195. package/dist/lint/rules/sqlpg003.js +58 -0
  196. package/dist/lint/rules/sqlpg004.js +77 -0
  197. package/dist/lint/rules/sqlpg005.js +86 -0
  198. package/dist/lint/rules/templates.js +25 -0
  199. package/dist/lint/rules/typed-names.js +132 -0
  200. package/dist/live-dialect.js +32 -0
  201. package/dist/lsp/catalog.js +44 -0
  202. package/dist/lsp/completions.js +136 -0
  203. package/dist/lsp/hover.js +115 -0
  204. package/dist/lsp/postgres-catalog.js +176 -0
  205. package/dist/lsp/postgres-template.js +171 -0
  206. package/dist/lsp/postgres.js +266 -0
  207. package/dist/lsp/refs.js +60 -0
  208. package/dist/lsp/registry.d.ts.map +1 -1
  209. package/dist/lsp/registry.js +19 -0
  210. package/dist/lsp/template.js +143 -0
  211. package/dist/manifest.json +1 -1
  212. package/dist/mcp/index.d.ts.map +1 -1
  213. package/dist/mcp/index.js +293 -0
  214. package/dist/mcp/postgres.js +117 -0
  215. package/dist/migration-statements.js +243 -0
  216. package/dist/op/activities/clickhouse-apply.js +83 -0
  217. package/dist/op/activities/clickhouse-emulator.js +53 -0
  218. package/dist/op/activities/clickhouse-rebuild.js +119 -0
  219. package/dist/op/activities/index.js +26 -0
  220. package/dist/op/activities/postgres-apply.js +126 -0
  221. package/dist/op/activities/postgres-emulator.js +70 -0
  222. package/dist/op/activities/postgres-migration.js +156 -0
  223. package/dist/op/activities/sql-exec.js +57 -0
  224. package/dist/op/activity-contracts.js +103 -0
  225. package/dist/package-cli.js +14 -0
  226. package/dist/plugin.js +259 -0
  227. package/dist/postgres/access/acl.js +344 -0
  228. package/dist/postgres/access/changes.js +30 -0
  229. package/dist/postgres/access/import.js +61 -0
  230. package/dist/postgres/access/live.js +96 -0
  231. package/dist/postgres/apply/apply.js +557 -0
  232. package/dist/postgres/apply/statements.js +882 -0
  233. package/dist/postgres/catalog-types.js +18 -0
  234. package/dist/postgres/container.js +58 -0
  235. package/dist/postgres/entities.js +1390 -0
  236. package/dist/postgres/entity-types.js +28 -0
  237. package/dist/postgres/import/generator.js +283 -0
  238. package/dist/postgres/import/ir.js +53 -0
  239. package/dist/postgres/import/live-export.js +83 -0
  240. package/dist/postgres/keywords.js +32 -0
  241. package/dist/postgres/live/bind.js +130 -0
  242. package/dist/postgres/live/catalog-kinds.js +301 -0
  243. package/dist/postgres/live/catalog.js +644 -0
  244. package/dist/postgres/live/client.js +151 -0
  245. package/dist/postgres/live/describe-resources.js +135 -0
  246. package/dist/postgres/live/undeclarable.js +111 -0
  247. package/dist/postgres/migrate/backfill.js +170 -0
  248. package/dist/postgres/migrate/batches.js +122 -0
  249. package/dist/postgres/migrate/carry.js +518 -0
  250. package/dist/postgres/migrate/handoff.js +59 -0
  251. package/dist/postgres/migrate/names.js +61 -0
  252. package/dist/postgres/migrate/observe.js +360 -0
  253. package/dist/postgres/migrate/op.js +178 -0
  254. package/dist/postgres/migrate/receipts.js +117 -0
  255. package/dist/postgres/migrate/replication.js +106 -0
  256. package/dist/postgres/migrate/steps.js +514 -0
  257. package/dist/postgres/overlays/columns.js +31 -0
  258. package/dist/postgres/overlays/constraints.js +52 -0
  259. package/dist/postgres/overlays/extension-objects.js +88 -0
  260. package/dist/postgres/overlays/indexes.js +25 -0
  261. package/dist/postgres/overlays/kinds.js +2 -0
  262. package/dist/postgres/overlays/partitioning.js +23 -0
  263. package/dist/postgres/overlays/relations.js +25 -0
  264. package/dist/postgres/overlays/storage.js +65 -0
  265. package/dist/postgres/overlays/type-ddl.js +36 -0
  266. package/dist/postgres/overlays/types.js +74 -0
  267. package/dist/postgres/parser.js +1824 -0
  268. package/dist/postgres/plan/commands.js +137 -0
  269. package/dist/postgres/plan/deep.js +324 -0
  270. package/dist/postgres/plan/diff.js +499 -0
  271. package/dist/postgres/plan/disruption.js +64 -0
  272. package/dist/postgres/plan/normalize.js +889 -0
  273. package/dist/postgres/plan/report.js +21 -0
  274. package/dist/postgres/plan/rules.js +115 -0
  275. package/dist/postgres/plan/schema.js +105 -0
  276. package/dist/postgres/plan/server-normalize.js +166 -0
  277. package/dist/postgres/providers/aurora.js +44 -0
  278. package/dist/postgres/providers/azure.js +53 -0
  279. package/dist/postgres/providers/cloud-sql.js +41 -0
  280. package/dist/postgres/providers/index.js +73 -0
  281. package/dist/postgres/providers/neon.js +44 -0
  282. package/dist/postgres/providers/rds.js +47 -0
  283. package/dist/postgres/providers/supabase.js +45 -0
  284. package/dist/postgres/providers/types.js +21 -0
  285. package/dist/postgres/row-types.js +107 -0
  286. package/dist/postgres/testing/fake-client.js +34 -0
  287. package/dist/postgres/testing/migration.js +48 -0
  288. package/dist/postgres/testing/roundtrip-schema.js +64 -0
  289. package/dist/postgres/testing/server.js +47 -0
  290. package/dist/postgres/testing/writable-server.js +160 -0
  291. package/dist/postgres/tokens.js +41 -0
  292. package/dist/postgres.js +15 -0
  293. package/dist/read/clickhouse.js +82 -0
  294. package/dist/read/objects.js +44 -0
  295. package/dist/read/postgres.js +104 -0
  296. package/dist/read.js +52 -0
  297. package/dist/receipts.js +207 -0
  298. package/dist/serializer.js +172 -0
  299. package/dist/skill-defs.js +93 -0
  300. package/dist/spec/catalog.js +191 -0
  301. package/dist/spec/fetch.d.ts.map +1 -1
  302. package/dist/spec/fetch.js +90 -0
  303. package/dist/spec/pin.js +42 -0
  304. package/dist/spec/postgres-catalog.js +171 -0
  305. package/dist/spec/postgres-fetch.js +91 -0
  306. package/dist/spec/postgres-pin.js +82 -0
  307. package/dist/sql-files.js +206 -0
  308. package/dist/sql-types-command.js +97 -0
  309. package/dist/sql-types.js +323 -0
  310. package/dist/token-source.js +156 -0
  311. package/dist/validate-cli.js +5 -0
  312. package/dist/validate.js +151 -0
  313. package/dist/workspace-outputs.js +191 -0
  314. package/package.json +7 -7
  315. package/src/codegen/package.ts +2 -2
  316. package/src/lint/rules/typescript-7.test.ts +2 -1
  317. package/src/lsp/catalog.ts +2 -2
  318. package/src/lsp/postgres-catalog.ts +2 -2
  319. package/src/lsp/registry.ts +2 -1
  320. package/src/mcp/index.ts +4 -2
  321. package/src/spec/fetch.ts +2 -2
  322. package/src/spec/postgres-fetch.ts +2 -2
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Import's access (#3681): the privileges on the imported objects, and the
3
+ * default privileges of the role that reads, as `grant` declarations. Each
4
+ * is the GRANT, REVOKE or ALTER DEFAULT PRIVILEGES that takes what Postgres
5
+ * gives a new object (EXECUTE to PUBLIC on a routine, nothing on the rest) to
6
+ * what the server holds, one per object and grantee, so the import plans as
7
+ * no change.
8
+ */
9
+ import { POSTGRES_ENTITY_TYPES } from "../entity-types.js";
10
+ import { quoteIdent } from "../keywords.js";
11
+ import { builtinEntries, diffAccess, entryKey, targetKey } from "./acl.js";
12
+ import { readLiveAccess } from "./live.js";
13
+ /** The access targets of imported objects, named as the catalog read names them. */
14
+ function targetsOf(objects) {
15
+ const out = [];
16
+ for (const o of objects) {
17
+ const name = `${o.schema ? `${quoteIdent(o.schema)}.` : ""}${quoteIdent(o.name)}`;
18
+ if (o.type === POSTGRES_ENTITY_TYPES.schema)
19
+ out.push({ kind: "schema", name: quoteIdent(o.name) });
20
+ else if (o.type === POSTGRES_ENTITY_TYPES.table || o.type === POSTGRES_ENTITY_TYPES.view || o.type === POSTGRES_ENTITY_TYPES.materializedView)
21
+ out.push({ kind: "table", name });
22
+ else if (o.type === POSTGRES_ENTITY_TYPES.sequence)
23
+ out.push({ kind: "sequence", name });
24
+ else if (o.type === POSTGRES_ENTITY_TYPES.function || o.type === POSTGRES_ENTITY_TYPES.procedure) {
25
+ out.push({ kind: o.type === POSTGRES_ENTITY_TYPES.function ? "function" : "procedure", name: `${name}${o.signature ?? ""}` });
26
+ }
27
+ }
28
+ return out;
29
+ }
30
+ const word = (s) => s.replace(/[^A-Za-z0-9]+/g, "_").replace(/^_|_$/g, "");
31
+ export async function importedAccess(client, objects, schemas) {
32
+ const targets = targetsOf(objects);
33
+ const live = await readLiveAccess(client, targets, schemas ? { schemas } : {});
34
+ // What a new object is given: the starting point each declaration takes to the server's.
35
+ const baseline = new Map();
36
+ for (const t of targets) {
37
+ for (const b of builtinEntries(t.kind))
38
+ baseline.set(entryKey(t, b.grantee), { target: t, grantee: b.grantee, privileges: new Map([[b.privilege, false]]) });
39
+ }
40
+ for (const e of live.state.values()) {
41
+ if (e.target.kind !== "default" || e.target.schema !== undefined)
42
+ continue;
43
+ for (const b of builtinEntries(e.target.objects)) {
44
+ const k = entryKey(e.target, b.grantee);
45
+ if (!baseline.has(k))
46
+ baseline.set(k, { target: e.target, grantee: b.grantee, privileges: new Map([[b.privilege, false]]) });
47
+ }
48
+ }
49
+ // Only global default rows that exist on the server are compared from Postgres's own defaults.
50
+ const globalRows = new Set([...live.state.values()].filter((e) => e.target.kind === "default").map((e) => targetKey(e.target)));
51
+ const from = new Map([...baseline].filter(([, e]) => e.target.kind !== "default" || globalRows.has(targetKey(e.target))));
52
+ return diffAccess(from, live.state).flatMap((c) => c.sql.map((sql, i) => {
53
+ const defaults = c.target.kind === "default";
54
+ const on = defaults ? `default_${c.target.schema ?? "all"}_${c.target.objects}` : c.target.name.replace(/\(.*$/, "").split(".").pop();
55
+ return {
56
+ type: defaults ? POSTGRES_ENTITY_TYPES.defaultPrivileges : POSTGRES_ENTITY_TYPES.grant,
57
+ name: word(`${/^REVOKE|^ALTER DEFAULT PRIVILEGES.* REVOKE /.test(sql) ? "revoke" : "grant"}_${on}${c.target.column ? `_${c.target.column}` : ""}_${c.grantee}${i > 0 ? `_${i}` : ""}`),
58
+ ddl: sql,
59
+ };
60
+ }));
61
+ }
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Reading access from a live server (#3681): each target's access control
3
+ * list, exploded into one entry per grantee (`aclexplode`, with
4
+ * `acldefault` where the list is NULL, which means Postgres's own defaults),
5
+ * the owner's own privileges left out; every column's list of a relation
6
+ * read; and the default privileges (`pg_default_acl`) of the role that runs
7
+ * the read and of the roles the declarations name with `FOR ROLE`, globally
8
+ * and in the schemas in scope.
9
+ */
10
+ import { addEntry, APPLYING_ROLE, builtinEntries, targetKey } from "./acl.js";
11
+ const OBJTYPE = { r: "tables", S: "sequences", f: "functions", T: "types", n: "schemas" };
12
+ const GRANTEE = "CASE WHEN a.grantee = 0 THEN 'public' ELSE pg_catalog.pg_get_userbyid(a.grantee) END";
13
+ /** The access the server holds on `targets`, and the default privileges in scope. */
14
+ export async function readLiveAccess(client, targets, scope = {}) {
15
+ const state = new Map();
16
+ const present = new Set();
17
+ const [me] = await client.query("SELECT current_user AS self");
18
+ const self = String(me?.self ?? "");
19
+ const entry = (t, r) => addEntry(state, t, String(r.grantee), String(r.privilege).toLowerCase(), r.grantable === true);
20
+ const names = (kinds) => [...new Set(targets.filter((t) => kinds.includes(t.kind)).map((t) => t.name))];
21
+ const schemas = names(["schema"]);
22
+ if (schemas.length > 0) {
23
+ const rows = await client.query(`SELECT x AS target, ${GRANTEE} AS grantee, a.privilege_type AS privilege, a.is_grantable AS grantable
24
+ FROM pg_catalog.unnest($1::text[]) x JOIN pg_catalog.pg_namespace n ON n.oid = pg_catalog.to_regnamespace(x)
25
+ LEFT JOIN LATERAL pg_catalog.aclexplode(COALESCE(n.nspacl, pg_catalog.acldefault('n'::"char", n.nspowner))) a ON a.grantee <> n.nspowner`, [schemas]);
26
+ for (const r of rows) {
27
+ const t = { kind: "schema", name: String(r.target) };
28
+ present.add(targetKey(t));
29
+ if (r.privilege !== null)
30
+ entry(t, r);
31
+ }
32
+ }
33
+ const relations = names(["table", "sequence", "column"]);
34
+ if (relations.length > 0) {
35
+ const rows = await client.query(`SELECT x AS target, c.relkind AS kind, ${GRANTEE} AS grantee, a.privilege_type AS privilege, a.is_grantable AS grantable
36
+ FROM pg_catalog.unnest($1::text[]) x JOIN pg_catalog.pg_class c ON c.oid = pg_catalog.to_regclass(x)
37
+ LEFT JOIN LATERAL pg_catalog.aclexplode(COALESCE(c.relacl, pg_catalog.acldefault((CASE WHEN c.relkind = 'S' THEN 's' ELSE 'r' END)::"char", c.relowner))) a ON a.grantee <> c.relowner`, [relations]);
38
+ for (const r of rows) {
39
+ const t = { kind: r.kind === "S" ? "sequence" : "table", name: String(r.target) };
40
+ present.add(targetKey(t));
41
+ if (r.privilege !== null)
42
+ entry(t, r);
43
+ }
44
+ const columns = await client.query(`SELECT x AS target, att.attname AS column, ${GRANTEE} AS grantee, a.privilege_type AS privilege, a.is_grantable AS grantable
45
+ FROM pg_catalog.unnest($1::text[]) x JOIN pg_catalog.pg_class c ON c.oid = pg_catalog.to_regclass(x)
46
+ JOIN pg_catalog.pg_attribute att ON att.attrelid = c.oid AND att.attnum > 0 AND NOT att.attisdropped AND att.attacl IS NOT NULL
47
+ CROSS JOIN LATERAL pg_catalog.aclexplode(att.attacl) a
48
+ WHERE a.grantee <> c.relowner`, [relations]);
49
+ for (const r of columns)
50
+ entry({ kind: "column", name: String(r.target), column: String(r.column) }, r);
51
+ }
52
+ const routines = names(["function", "procedure"]);
53
+ if (routines.length > 0) {
54
+ const rows = await client.query(`SELECT x AS target, p.prokind AS kind, ${GRANTEE} AS grantee, a.privilege_type AS privilege, a.is_grantable AS grantable
55
+ FROM pg_catalog.unnest($1::text[]) x JOIN pg_catalog.pg_proc p ON p.oid = pg_catalog.to_regprocedure(x)
56
+ LEFT JOIN LATERAL pg_catalog.aclexplode(COALESCE(p.proacl, pg_catalog.acldefault('f'::"char", p.proowner))) a ON a.grantee <> p.proowner`, [routines]);
57
+ for (const r of rows) {
58
+ const t = { kind: r.kind === "p" ? "procedure" : "function", name: String(r.target) };
59
+ present.add(targetKey(t));
60
+ if (r.privilege !== null)
61
+ entry(t, r);
62
+ }
63
+ }
64
+ // Default privileges: the reading role's (written as the role that applies) and the FOR ROLE ones.
65
+ const roles = [self, ...(scope.forRoles ?? [])];
66
+ const defaults = await client.query(`SELECT pg_catalog.pg_get_userbyid(d.defaclrole) AS role, n.nspname AS schema, d.defaclobjtype AS objtype,
67
+ ${GRANTEE} AS grantee, a.privilege_type AS privilege, a.is_grantable AS grantable
68
+ FROM pg_catalog.pg_default_acl d LEFT JOIN pg_catalog.pg_namespace n ON n.oid = d.defaclnamespace
69
+ LEFT JOIN LATERAL pg_catalog.aclexplode(d.defaclacl) a ON a.grantee <> d.defaclrole
70
+ WHERE pg_catalog.pg_get_userbyid(d.defaclrole) = ANY($1::text[])
71
+ AND (d.defaclnamespace = 0${scope.schemas ? " OR n.nspname = ANY($2::text[])" : ""})`, scope.schemas ? [roles, [...scope.schemas]] : [roles]);
72
+ const globalRows = new Set();
73
+ const globalDefaults = new Set();
74
+ for (const r of defaults) {
75
+ const objects = OBJTYPE[String(r.objtype)];
76
+ if (!objects)
77
+ continue;
78
+ const role = String(r.role) === self ? APPLYING_ROLE : String(r.role);
79
+ const t = { kind: "default", name: "", role, ...(r.schema !== null && r.schema !== undefined ? { schema: String(r.schema) } : {}), objects };
80
+ if (t.schema === undefined) {
81
+ globalRows.add(targetKey(t));
82
+ if (role === APPLYING_ROLE)
83
+ globalDefaults.add(objects);
84
+ }
85
+ if (r.privilege !== null)
86
+ entry(t, r);
87
+ }
88
+ // A global default the declarations decide with no row on the server is Postgres's own.
89
+ for (const t of scope.declaredDefaults ?? []) {
90
+ if (t.kind !== "default" || t.schema !== undefined || globalRows.has(targetKey(t)))
91
+ continue;
92
+ for (const b of builtinEntries(t.objects))
93
+ addEntry(state, t, b.grantee, b.privilege, false);
94
+ }
95
+ return { state, present, globalDefaults, self };
96
+ }