@supabase/pg-delta 1.0.0-alpha.1 → 1.0.0-alpha.10

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 (664) hide show
  1. package/README.md +41 -2
  2. package/dist/cli/app.js +26 -3
  3. package/dist/cli/bin/cli.js +5 -0
  4. package/dist/cli/commands/catalog-export.d.ts +5 -0
  5. package/dist/cli/commands/catalog-export.js +64 -0
  6. package/dist/cli/commands/declarative-apply.d.ts +6 -0
  7. package/dist/cli/commands/declarative-apply.js +288 -0
  8. package/dist/cli/commands/declarative-export.d.ts +5 -0
  9. package/dist/cli/commands/declarative-export.js +245 -0
  10. package/dist/cli/commands/plan.js +40 -6
  11. package/dist/cli/exit-code.d.ts +2 -0
  12. package/dist/cli/exit-code.js +7 -0
  13. package/dist/cli/formatters/tree/tree.js +3 -2
  14. package/dist/cli/utils/apply-display.d.ts +52 -0
  15. package/dist/cli/utils/apply-display.js +183 -0
  16. package/dist/cli/utils/export-display.d.ts +43 -0
  17. package/dist/cli/utils/export-display.js +202 -0
  18. package/dist/cli/utils/resolve-input.d.ts +7 -0
  19. package/dist/cli/utils/resolve-input.js +13 -0
  20. package/dist/cli/utils.d.ts +2 -0
  21. package/dist/cli/utils.js +1 -1
  22. package/dist/core/catalog-export/index.d.ts +11 -0
  23. package/dist/core/catalog-export/index.js +10 -0
  24. package/dist/core/catalog.diff.d.ts +1 -0
  25. package/dist/core/catalog.diff.js +64 -48
  26. package/dist/core/catalog.model.d.ts +16 -3
  27. package/dist/core/catalog.model.js +132 -30
  28. package/dist/core/catalog.snapshot.d.ts +66 -0
  29. package/dist/core/catalog.snapshot.js +206 -0
  30. package/dist/core/context.d.ts +3 -3
  31. package/dist/core/context.js +7 -10
  32. package/dist/core/declarative-apply/discover-sql.d.ts +18 -0
  33. package/dist/core/declarative-apply/discover-sql.js +86 -0
  34. package/dist/core/declarative-apply/extract-catalog-providers.d.ts +23 -0
  35. package/dist/core/declarative-apply/extract-catalog-providers.js +159 -0
  36. package/dist/core/declarative-apply/index.d.ts +49 -0
  37. package/dist/core/declarative-apply/index.js +134 -0
  38. package/dist/core/declarative-apply/round-apply.d.ts +100 -0
  39. package/dist/core/declarative-apply/round-apply.js +378 -0
  40. package/dist/core/depend.d.ts +2 -2
  41. package/dist/core/depend.js +8 -7
  42. package/dist/core/export/file-mapper.d.ts +71 -0
  43. package/dist/core/export/file-mapper.js +474 -0
  44. package/dist/core/export/grouper.d.ts +13 -0
  45. package/dist/core/export/grouper.js +76 -0
  46. package/dist/core/export/index.d.ts +45 -0
  47. package/dist/core/export/index.js +63 -0
  48. package/dist/core/export/types.d.ts +84 -0
  49. package/dist/core/export/types.js +25 -0
  50. package/dist/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
  51. package/dist/core/integrations/filter/dsl.d.ts +38 -1
  52. package/dist/core/integrations/filter/dsl.js +20 -2
  53. package/dist/core/integrations/filter/extractors.js +42 -0
  54. package/dist/core/integrations/integration-dsl.d.ts +10 -0
  55. package/dist/core/integrations/supabase.d.ts +8 -0
  56. package/dist/core/integrations/supabase.js +11 -0
  57. package/dist/core/objects/aggregate/aggregate.diff.d.ts +2 -8
  58. package/dist/core/objects/aggregate/aggregate.diff.js +16 -70
  59. package/dist/core/objects/aggregate/aggregate.model.d.ts +10 -10
  60. package/dist/core/objects/aggregate/aggregate.model.js +8 -10
  61. package/dist/core/objects/aggregate/changes/aggregate.create.js +1 -1
  62. package/dist/core/objects/aggregate/changes/aggregate.drop.js +1 -1
  63. package/dist/core/objects/base.privilege-diff.d.ts +38 -13
  64. package/dist/core/objects/base.privilege-diff.js +104 -22
  65. package/dist/core/objects/base.privilege.d.ts +1 -0
  66. package/dist/core/objects/base.privilege.js +9 -2
  67. package/dist/core/objects/collation/collation.diff.d.ts +2 -3
  68. package/dist/core/objects/collation/collation.model.d.ts +2 -2
  69. package/dist/core/objects/collation/collation.model.js +29 -28
  70. package/dist/core/objects/diff-context.d.ts +15 -0
  71. package/dist/core/objects/diff-context.js +1 -0
  72. package/dist/core/objects/domain/changes/domain.create.js +4 -2
  73. package/dist/core/objects/domain/domain.diff.d.ts +2 -8
  74. package/dist/core/objects/domain/domain.diff.js +16 -77
  75. package/dist/core/objects/domain/domain.model.d.ts +2 -2
  76. package/dist/core/objects/domain/domain.model.js +9 -11
  77. package/dist/core/objects/event-trigger/event-trigger.diff.d.ts +2 -3
  78. package/dist/core/objects/event-trigger/event-trigger.model.d.ts +2 -2
  79. package/dist/core/objects/event-trigger/event-trigger.model.js +7 -9
  80. package/dist/core/objects/extension/extension.model.d.ts +2 -2
  81. package/dist/core/objects/extension/extension.model.js +8 -10
  82. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.d.ts +2 -8
  83. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.js +13 -77
  84. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.d.ts +2 -2
  85. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.js +22 -24
  86. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.d.ts +2 -8
  87. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.js +16 -77
  88. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.d.ts +2 -2
  89. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.js +21 -23
  90. package/dist/core/objects/foreign-data-wrapper/server/server.diff.d.ts +2 -8
  91. package/dist/core/objects/foreign-data-wrapper/server/server.diff.js +13 -77
  92. package/dist/core/objects/foreign-data-wrapper/server/server.model.d.ts +2 -2
  93. package/dist/core/objects/foreign-data-wrapper/server/server.model.js +20 -22
  94. package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.d.ts +2 -2
  95. package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.js +20 -22
  96. package/dist/core/objects/index/index.model.d.ts +4 -4
  97. package/dist/core/objects/index/index.model.js +9 -11
  98. package/dist/core/objects/language/language.diff.d.ts +2 -5
  99. package/dist/core/objects/language/language.diff.js +7 -39
  100. package/dist/core/objects/language/language.model.js +5 -7
  101. package/dist/core/objects/materialized-view/materialized-view.diff.d.ts +2 -8
  102. package/dist/core/objects/materialized-view/materialized-view.diff.js +16 -158
  103. package/dist/core/objects/materialized-view/materialized-view.model.d.ts +5 -5
  104. package/dist/core/objects/materialized-view/materialized-view.model.js +9 -11
  105. package/dist/core/objects/procedure/changes/procedure.alter.js +12 -12
  106. package/dist/core/objects/procedure/procedure.diff.d.ts +2 -8
  107. package/dist/core/objects/procedure/procedure.diff.js +16 -77
  108. package/dist/core/objects/procedure/procedure.model.d.ts +11 -11
  109. package/dist/core/objects/procedure/procedure.model.js +9 -11
  110. package/dist/core/objects/publication/changes/publication.alter.d.ts +0 -9
  111. package/dist/core/objects/publication/changes/publication.alter.js +0 -14
  112. package/dist/core/objects/publication/changes/publication.types.d.ts +2 -2
  113. package/dist/core/objects/publication/publication.diff.d.ts +2 -3
  114. package/dist/core/objects/publication/publication.diff.js +8 -13
  115. package/dist/core/objects/publication/publication.model.d.ts +2 -2
  116. package/dist/core/objects/publication/publication.model.js +7 -9
  117. package/dist/core/objects/rls-policy/changes/rls-policy.alter.js +3 -3
  118. package/dist/core/objects/rls-policy/rls-policy.model.d.ts +4 -4
  119. package/dist/core/objects/rls-policy/rls-policy.model.js +8 -10
  120. package/dist/core/objects/role/role.diff.js +22 -1
  121. package/dist/core/objects/role/role.model.d.ts +6 -5
  122. package/dist/core/objects/role/role.model.js +146 -40
  123. package/dist/core/objects/rule/rule.model.d.ts +3 -3
  124. package/dist/core/objects/rule/rule.model.js +7 -9
  125. package/dist/core/objects/schema/schema.diff.d.ts +2 -8
  126. package/dist/core/objects/schema/schema.diff.js +16 -77
  127. package/dist/core/objects/schema/schema.model.d.ts +2 -2
  128. package/dist/core/objects/schema/schema.model.js +9 -11
  129. package/dist/core/objects/sequence/sequence.diff.d.ts +2 -8
  130. package/dist/core/objects/sequence/sequence.diff.js +16 -79
  131. package/dist/core/objects/sequence/sequence.model.d.ts +2 -2
  132. package/dist/core/objects/sequence/sequence.model.js +9 -11
  133. package/dist/core/objects/subscription/subscription.diff.d.ts +2 -3
  134. package/dist/core/objects/subscription/subscription.model.d.ts +2 -2
  135. package/dist/core/objects/subscription/subscription.model.js +25 -20
  136. package/dist/core/objects/table/changes/table.create.js +3 -0
  137. package/dist/core/objects/table/table.diff.d.ts +2 -8
  138. package/dist/core/objects/table/table.diff.js +26 -157
  139. package/dist/core/objects/table/table.model.d.ts +27 -24
  140. package/dist/core/objects/table/table.model.js +12 -11
  141. package/dist/core/objects/trigger/changes/trigger.alter.js +23 -0
  142. package/dist/core/objects/trigger/changes/trigger.create.js +4 -5
  143. package/dist/core/objects/trigger/trigger.model.d.ts +11 -2
  144. package/dist/core/objects/trigger/trigger.model.js +22 -10
  145. package/dist/core/objects/type/composite-type/composite-type.diff.d.ts +2 -8
  146. package/dist/core/objects/type/composite-type/composite-type.diff.js +16 -77
  147. package/dist/core/objects/type/composite-type/composite-type.model.d.ts +5 -5
  148. package/dist/core/objects/type/composite-type/composite-type.model.js +10 -11
  149. package/dist/core/objects/type/enum/enum.diff.d.ts +2 -8
  150. package/dist/core/objects/type/enum/enum.diff.js +25 -112
  151. package/dist/core/objects/type/enum/enum.model.d.ts +2 -2
  152. package/dist/core/objects/type/enum/enum.model.js +23 -25
  153. package/dist/core/objects/type/range/changes/range.create.js +6 -3
  154. package/dist/core/objects/type/range/range.diff.d.ts +2 -8
  155. package/dist/core/objects/type/range/range.diff.js +16 -77
  156. package/dist/core/objects/type/range/range.model.d.ts +2 -2
  157. package/dist/core/objects/type/range/range.model.js +8 -10
  158. package/dist/core/objects/view/view.diff.d.ts +2 -8
  159. package/dist/core/objects/view/view.diff.js +16 -158
  160. package/dist/core/objects/view/view.model.d.ts +20 -6
  161. package/dist/core/objects/view/view.model.js +11 -23
  162. package/dist/core/plan/apply.d.ts +2 -2
  163. package/dist/core/plan/apply.js +33 -16
  164. package/dist/core/plan/create.d.ts +20 -7
  165. package/dist/core/plan/create.js +153 -112
  166. package/dist/core/plan/serialize.js +16 -4
  167. package/dist/core/plan/sql-format/constants.d.ts +2 -0
  168. package/dist/core/plan/sql-format/constants.js +11 -0
  169. package/dist/core/plan/sql-format/fixtures.d.ts +2 -0
  170. package/dist/core/plan/sql-format/fixtures.js +2447 -0
  171. package/dist/core/plan/sql-format/format-utils.d.ts +37 -0
  172. package/dist/core/plan/sql-format/format-utils.js +274 -0
  173. package/dist/core/plan/sql-format/formatters.d.ts +20 -0
  174. package/dist/core/plan/sql-format/formatters.js +737 -0
  175. package/dist/core/plan/sql-format/index.d.ts +2 -0
  176. package/dist/core/plan/sql-format/index.js +98 -0
  177. package/dist/core/plan/sql-format/keyword-case.d.ts +2 -0
  178. package/dist/core/plan/sql-format/keyword-case.js +893 -0
  179. package/dist/core/plan/sql-format/protect.d.ts +3 -0
  180. package/dist/core/plan/sql-format/protect.js +269 -0
  181. package/dist/core/plan/sql-format/sql-scanner.d.ts +59 -0
  182. package/dist/core/plan/sql-format/sql-scanner.js +202 -0
  183. package/dist/core/plan/sql-format/tokenizer.d.ts +22 -0
  184. package/dist/core/plan/sql-format/tokenizer.js +118 -0
  185. package/dist/core/plan/sql-format/types.d.ts +28 -0
  186. package/dist/core/plan/sql-format/types.js +1 -0
  187. package/dist/core/plan/sql-format/wrap.d.ts +2 -0
  188. package/dist/core/plan/sql-format/wrap.js +165 -0
  189. package/dist/core/plan/sql-format.d.ts +2 -0
  190. package/dist/core/plan/sql-format.js +1 -0
  191. package/dist/core/plan/ssl-config.d.ts +32 -0
  192. package/dist/core/plan/ssl-config.js +115 -0
  193. package/dist/core/plan/statements.d.ts +2 -1
  194. package/dist/core/plan/statements.js +6 -2
  195. package/dist/core/plan/types.d.ts +6 -0
  196. package/dist/core/postgres-config.d.ts +47 -3
  197. package/dist/core/postgres-config.js +225 -39
  198. package/dist/core/sort/graph-builder.js +10 -0
  199. package/dist/core/sort/logical-sort.js +31 -23
  200. package/dist/core/test-utils/assert-valid-sql.d.ts +10 -0
  201. package/dist/core/test-utils/assert-valid-sql.js +19 -0
  202. package/dist/index.d.ts +9 -0
  203. package/dist/index.js +9 -1
  204. package/package.json +56 -22
  205. package/src/cli/app.ts +52 -0
  206. package/src/cli/bin/cli.ts +15 -0
  207. package/src/cli/commands/apply.ts +101 -0
  208. package/src/cli/commands/catalog-export.ts +78 -0
  209. package/src/cli/commands/declarative-apply.diagnostics.test.ts +77 -0
  210. package/src/cli/commands/declarative-apply.ts +380 -0
  211. package/src/cli/commands/declarative-export.ts +330 -0
  212. package/src/cli/commands/plan.ts +216 -0
  213. package/src/cli/commands/sync.ts +185 -0
  214. package/src/cli/exit-code.test.ts +19 -0
  215. package/src/cli/exit-code.ts +7 -0
  216. package/src/cli/formatters/index.ts +5 -0
  217. package/src/cli/formatters/tree/tree-builder.ts +380 -0
  218. package/src/cli/formatters/tree/tree-renderer.ts +372 -0
  219. package/src/cli/formatters/tree/tree.ts +238 -0
  220. package/src/cli/utils/apply-display.test.ts +348 -0
  221. package/src/cli/utils/apply-display.ts +238 -0
  222. package/src/cli/utils/export-display.test.ts +103 -0
  223. package/src/cli/utils/export-display.ts +275 -0
  224. package/src/cli/utils/integrations.test.ts +44 -0
  225. package/src/cli/utils/integrations.ts +42 -0
  226. package/src/cli/utils/resolve-input.test.ts +38 -0
  227. package/src/cli/utils/resolve-input.ts +17 -0
  228. package/src/cli/utils.ts +231 -0
  229. package/src/core/catalog-export/index.ts +20 -0
  230. package/src/core/catalog.diff.ts +247 -0
  231. package/src/core/catalog.model.test.ts +122 -0
  232. package/src/core/catalog.model.ts +510 -0
  233. package/src/core/catalog.snapshot.test.ts +477 -0
  234. package/src/core/catalog.snapshot.ts +289 -0
  235. package/src/core/change.types.ts +44 -0
  236. package/src/core/context.ts +26 -0
  237. package/src/core/declarative-apply/discover-sql.test.ts +103 -0
  238. package/src/core/declarative-apply/discover-sql.ts +107 -0
  239. package/src/core/declarative-apply/extract-catalog-providers.ts +220 -0
  240. package/src/core/declarative-apply/index.test.ts +67 -0
  241. package/src/core/declarative-apply/index.ts +205 -0
  242. package/src/core/declarative-apply/round-apply.test.ts +504 -0
  243. package/src/core/declarative-apply/round-apply.ts +562 -0
  244. package/src/core/depend.ts +1870 -0
  245. package/src/core/expand-replace-dependencies.test.ts +70 -0
  246. package/src/core/expand-replace-dependencies.ts +380 -0
  247. package/src/core/export/file-mapper.test.ts +816 -0
  248. package/src/core/export/file-mapper.ts +574 -0
  249. package/src/core/export/grouper.ts +108 -0
  250. package/src/core/export/index.ts +129 -0
  251. package/src/core/export/types.ts +104 -0
  252. package/src/core/fingerprint.ts +204 -0
  253. package/src/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
  254. package/src/core/integrations/filter/dsl.test.ts +211 -0
  255. package/src/core/integrations/filter/dsl.ts +266 -0
  256. package/src/core/integrations/filter/extractors.test.ts +244 -0
  257. package/src/core/integrations/filter/extractors.ts +187 -0
  258. package/src/core/integrations/filter/filter.types.ts +3 -0
  259. package/src/core/integrations/integration-dsl.ts +34 -0
  260. package/src/core/integrations/integration.types.ts +7 -0
  261. package/src/core/integrations/serialize/dsl.test.ts +91 -0
  262. package/src/core/integrations/serialize/dsl.ts +77 -0
  263. package/src/core/integrations/serialize/serialize.types.ts +3 -0
  264. package/src/core/integrations/supabase.ts +130 -0
  265. package/src/core/objects/aggregate/aggregate.diff.test.ts +215 -0
  266. package/src/core/objects/aggregate/aggregate.diff.ts +222 -0
  267. package/src/core/objects/aggregate/aggregate.model.ts +317 -0
  268. package/src/core/objects/aggregate/changes/aggregate.alter.test.ts +66 -0
  269. package/src/core/objects/aggregate/changes/aggregate.alter.ts +32 -0
  270. package/src/core/objects/aggregate/changes/aggregate.base.ts +20 -0
  271. package/src/core/objects/aggregate/changes/aggregate.comment.test.ts +89 -0
  272. package/src/core/objects/aggregate/changes/aggregate.comment.ts +62 -0
  273. package/src/core/objects/aggregate/changes/aggregate.create.test.ts +104 -0
  274. package/src/core/objects/aggregate/changes/aggregate.create.ts +329 -0
  275. package/src/core/objects/aggregate/changes/aggregate.drop.test.ts +82 -0
  276. package/src/core/objects/aggregate/changes/aggregate.drop.ts +32 -0
  277. package/src/core/objects/aggregate/changes/aggregate.privilege.test.ts +136 -0
  278. package/src/core/objects/aggregate/changes/aggregate.privilege.ts +146 -0
  279. package/src/core/objects/aggregate/changes/aggregate.types.ts +12 -0
  280. package/src/core/objects/base.change.ts +62 -0
  281. package/src/core/objects/base.default-privileges.ts +204 -0
  282. package/src/core/objects/base.diff.ts +20 -0
  283. package/src/core/objects/base.model.ts +82 -0
  284. package/src/core/objects/base.privilege-diff.ts +447 -0
  285. package/src/core/objects/base.privilege.ts +191 -0
  286. package/src/core/objects/collation/changes/collation.alter.test.ts +68 -0
  287. package/src/core/objects/collation/changes/collation.alter.ts +79 -0
  288. package/src/core/objects/collation/changes/collation.base.ts +20 -0
  289. package/src/core/objects/collation/changes/collation.comment.ts +68 -0
  290. package/src/core/objects/collation/changes/collation.create.test.ts +56 -0
  291. package/src/core/objects/collation/changes/collation.create.ts +106 -0
  292. package/src/core/objects/collation/changes/collation.drop.test.ts +31 -0
  293. package/src/core/objects/collation/changes/collation.drop.ts +37 -0
  294. package/src/core/objects/collation/changes/collation.types.ts +10 -0
  295. package/src/core/objects/collation/collation.diff.test.ts +97 -0
  296. package/src/core/objects/collation/collation.diff.ts +127 -0
  297. package/src/core/objects/collation/collation.model.ts +224 -0
  298. package/src/core/objects/diff-context.ts +16 -0
  299. package/src/core/objects/domain/changes/domain.alter.test.ts +335 -0
  300. package/src/core/objects/domain/changes/domain.alter.ts +286 -0
  301. package/src/core/objects/domain/changes/domain.base.ts +20 -0
  302. package/src/core/objects/domain/changes/domain.comment.ts +59 -0
  303. package/src/core/objects/domain/changes/domain.create.test.ts +95 -0
  304. package/src/core/objects/domain/changes/domain.create.ts +124 -0
  305. package/src/core/objects/domain/changes/domain.drop.test.ts +33 -0
  306. package/src/core/objects/domain/changes/domain.drop.ts +34 -0
  307. package/src/core/objects/domain/changes/domain.privilege.ts +171 -0
  308. package/src/core/objects/domain/changes/domain.types.ts +12 -0
  309. package/src/core/objects/domain/domain.diff.test.ts +284 -0
  310. package/src/core/objects/domain/domain.diff.ts +295 -0
  311. package/src/core/objects/domain/domain.model.ts +190 -0
  312. package/src/core/objects/event-trigger/changes/event-trigger.alter.test.ts +57 -0
  313. package/src/core/objects/event-trigger/changes/event-trigger.alter.ts +82 -0
  314. package/src/core/objects/event-trigger/changes/event-trigger.base.ts +20 -0
  315. package/src/core/objects/event-trigger/changes/event-trigger.comment.ts +66 -0
  316. package/src/core/objects/event-trigger/changes/event-trigger.create.test.ts +27 -0
  317. package/src/core/objects/event-trigger/changes/event-trigger.create.ts +72 -0
  318. package/src/core/objects/event-trigger/changes/event-trigger.drop.test.ts +25 -0
  319. package/src/core/objects/event-trigger/changes/event-trigger.drop.ts +34 -0
  320. package/src/core/objects/event-trigger/changes/event-trigger.types.ts +10 -0
  321. package/src/core/objects/event-trigger/event-trigger.diff.test.ts +131 -0
  322. package/src/core/objects/event-trigger/event-trigger.diff.ts +127 -0
  323. package/src/core/objects/event-trigger/event-trigger.model.ts +106 -0
  324. package/src/core/objects/extension/changes/extension.alter.test.ts +63 -0
  325. package/src/core/objects/extension/changes/extension.alter.ts +78 -0
  326. package/src/core/objects/extension/changes/extension.base.ts +20 -0
  327. package/src/core/objects/extension/changes/extension.comment.ts +64 -0
  328. package/src/core/objects/extension/changes/extension.create.test.ts +28 -0
  329. package/src/core/objects/extension/changes/extension.create.ts +63 -0
  330. package/src/core/objects/extension/changes/extension.drop.test.ts +26 -0
  331. package/src/core/objects/extension/changes/extension.drop.ts +34 -0
  332. package/src/core/objects/extension/changes/extension.types.ts +10 -0
  333. package/src/core/objects/extension/extension.diff.test.ts +42 -0
  334. package/src/core/objects/extension/extension.diff.ts +90 -0
  335. package/src/core/objects/extension/extension.model.test.ts +98 -0
  336. package/src/core/objects/extension/extension.model.ts +280 -0
  337. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.test.ts +136 -0
  338. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.ts +101 -0
  339. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.ts +20 -0
  340. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.ts +72 -0
  341. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.test.ts +160 -0
  342. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.ts +95 -0
  343. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.test.ts +26 -0
  344. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.ts +36 -0
  345. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.ts +172 -0
  346. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.ts +12 -0
  347. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.test.ts +286 -0
  348. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts +271 -0
  349. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.ts +149 -0
  350. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.ts +10 -0
  351. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts +340 -0
  352. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.ts +341 -0
  353. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.ts +20 -0
  354. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.ts +72 -0
  355. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.test.ts +210 -0
  356. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.ts +81 -0
  357. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.test.ts +46 -0
  358. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.ts +37 -0
  359. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.ts +181 -0
  360. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +12 -0
  361. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.test.ts +813 -0
  362. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +343 -0
  363. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +242 -0
  364. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.test.ts +183 -0
  365. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.ts +126 -0
  366. package/src/core/objects/foreign-data-wrapper/server/changes/server.base.ts +20 -0
  367. package/src/core/objects/foreign-data-wrapper/server/changes/server.comment.ts +60 -0
  368. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.test.ts +144 -0
  369. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.ts +81 -0
  370. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.test.ts +27 -0
  371. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.ts +34 -0
  372. package/src/core/objects/foreign-data-wrapper/server/changes/server.privilege.ts +164 -0
  373. package/src/core/objects/foreign-data-wrapper/server/changes/server.types.ts +12 -0
  374. package/src/core/objects/foreign-data-wrapper/server/server.diff.test.ts +262 -0
  375. package/src/core/objects/foreign-data-wrapper/server/server.diff.ts +247 -0
  376. package/src/core/objects/foreign-data-wrapper/server/server.model.ts +133 -0
  377. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.test.ts +91 -0
  378. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.ts +69 -0
  379. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.ts +20 -0
  380. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.test.ts +96 -0
  381. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.ts +66 -0
  382. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.test.ts +60 -0
  383. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.ts +40 -0
  384. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.ts +8 -0
  385. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.test.ts +77 -0
  386. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.ts +107 -0
  387. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.ts +96 -0
  388. package/src/core/objects/index/changes/index.alter.test.ts +209 -0
  389. package/src/core/objects/index/changes/index.alter.ts +144 -0
  390. package/src/core/objects/index/changes/index.base.ts +20 -0
  391. package/src/core/objects/index/changes/index.comment.ts +63 -0
  392. package/src/core/objects/index/changes/index.create.test.ts +69 -0
  393. package/src/core/objects/index/changes/index.create.ts +68 -0
  394. package/src/core/objects/index/changes/index.drop.test.ts +47 -0
  395. package/src/core/objects/index/changes/index.drop.ts +34 -0
  396. package/src/core/objects/index/changes/index.types.ts +6 -0
  397. package/src/core/objects/index/changes/utils.ts +16 -0
  398. package/src/core/objects/index/index.diff.test.ts +153 -0
  399. package/src/core/objects/index/index.diff.ts +243 -0
  400. package/src/core/objects/index/index.model.ts +370 -0
  401. package/src/core/objects/language/changes/language.alter.test.ts +36 -0
  402. package/src/core/objects/language/changes/language.alter.ts +53 -0
  403. package/src/core/objects/language/changes/language.base.ts +20 -0
  404. package/src/core/objects/language/changes/language.comment.ts +58 -0
  405. package/src/core/objects/language/changes/language.create.test.ts +30 -0
  406. package/src/core/objects/language/changes/language.create.ts +104 -0
  407. package/src/core/objects/language/changes/language.drop.test.ts +28 -0
  408. package/src/core/objects/language/changes/language.drop.ts +39 -0
  409. package/src/core/objects/language/changes/language.privilege.ts +172 -0
  410. package/src/core/objects/language/changes/language.types.ts +12 -0
  411. package/src/core/objects/language/language.diff.test.ts +135 -0
  412. package/src/core/objects/language/language.diff.ts +144 -0
  413. package/src/core/objects/language/language.model.ts +150 -0
  414. package/src/core/objects/materialized-view/changes/materialized-view.alter.test.ts +130 -0
  415. package/src/core/objects/materialized-view/changes/materialized-view.alter.ts +113 -0
  416. package/src/core/objects/materialized-view/changes/materialized-view.base.ts +20 -0
  417. package/src/core/objects/materialized-view/changes/materialized-view.comment.ts +176 -0
  418. package/src/core/objects/materialized-view/changes/materialized-view.create.test.ts +69 -0
  419. package/src/core/objects/materialized-view/changes/materialized-view.create.ts +93 -0
  420. package/src/core/objects/materialized-view/changes/materialized-view.drop.test.ts +37 -0
  421. package/src/core/objects/materialized-view/changes/materialized-view.drop.ts +60 -0
  422. package/src/core/objects/materialized-view/changes/materialized-view.privilege.ts +212 -0
  423. package/src/core/objects/materialized-view/changes/materialized-view.types.ts +12 -0
  424. package/src/core/objects/materialized-view/materialized-view.diff.test.ts +264 -0
  425. package/src/core/objects/materialized-view/materialized-view.diff.ts +301 -0
  426. package/src/core/objects/materialized-view/materialized-view.model.ts +258 -0
  427. package/src/core/objects/procedure/changes/procedure.alter.test.ts +1077 -0
  428. package/src/core/objects/procedure/changes/procedure.alter.ts +290 -0
  429. package/src/core/objects/procedure/changes/procedure.base.ts +20 -0
  430. package/src/core/objects/procedure/changes/procedure.comment.ts +70 -0
  431. package/src/core/objects/procedure/changes/procedure.create.test.ts +51 -0
  432. package/src/core/objects/procedure/changes/procedure.create.ts +92 -0
  433. package/src/core/objects/procedure/changes/procedure.drop.test.ts +90 -0
  434. package/src/core/objects/procedure/changes/procedure.drop.ts +49 -0
  435. package/src/core/objects/procedure/changes/procedure.privilege.ts +188 -0
  436. package/src/core/objects/procedure/changes/procedure.types.ts +12 -0
  437. package/src/core/objects/procedure/procedure.diff.test.ts +161 -0
  438. package/src/core/objects/procedure/procedure.diff.ts +341 -0
  439. package/src/core/objects/procedure/procedure.model.ts +264 -0
  440. package/src/core/objects/procedure/utils.ts +58 -0
  441. package/src/core/objects/publication/changes/publication.alter.test.ts +217 -0
  442. package/src/core/objects/publication/changes/publication.alter.ts +225 -0
  443. package/src/core/objects/publication/changes/publication.base.ts +20 -0
  444. package/src/core/objects/publication/changes/publication.comment.test.ts +73 -0
  445. package/src/core/objects/publication/changes/publication.comment.ts +64 -0
  446. package/src/core/objects/publication/changes/publication.create.test.ts +90 -0
  447. package/src/core/objects/publication/changes/publication.create.ts +82 -0
  448. package/src/core/objects/publication/changes/publication.drop.test.ts +48 -0
  449. package/src/core/objects/publication/changes/publication.drop.ts +29 -0
  450. package/src/core/objects/publication/changes/publication.types.ts +24 -0
  451. package/src/core/objects/publication/publication.diff.test.ts +297 -0
  452. package/src/core/objects/publication/publication.diff.ts +247 -0
  453. package/src/core/objects/publication/publication.model.ts +206 -0
  454. package/src/core/objects/publication/utils.ts +55 -0
  455. package/src/core/objects/rls-policy/changes/rls-policy.alter.test.ts +267 -0
  456. package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +128 -0
  457. package/src/core/objects/rls-policy/changes/rls-policy.base.ts +20 -0
  458. package/src/core/objects/rls-policy/changes/rls-policy.comment.ts +69 -0
  459. package/src/core/objects/rls-policy/changes/rls-policy.create.test.ts +81 -0
  460. package/src/core/objects/rls-policy/changes/rls-policy.create.ts +100 -0
  461. package/src/core/objects/rls-policy/changes/rls-policy.drop.test.ts +31 -0
  462. package/src/core/objects/rls-policy/changes/rls-policy.drop.ts +39 -0
  463. package/src/core/objects/rls-policy/changes/rls-policy.types.ts +10 -0
  464. package/src/core/objects/rls-policy/rls-policy.diff.test.ts +79 -0
  465. package/src/core/objects/rls-policy/rls-policy.diff.ts +121 -0
  466. package/src/core/objects/rls-policy/rls-policy.model.ts +140 -0
  467. package/src/core/objects/role/changes/role.alter.test.ts +362 -0
  468. package/src/core/objects/role/changes/role.alter.ts +110 -0
  469. package/src/core/objects/role/changes/role.base.ts +24 -0
  470. package/src/core/objects/role/changes/role.comment.ts +55 -0
  471. package/src/core/objects/role/changes/role.create.test.ts +56 -0
  472. package/src/core/objects/role/changes/role.create.ts +102 -0
  473. package/src/core/objects/role/changes/role.drop.test.ts +32 -0
  474. package/src/core/objects/role/changes/role.drop.ts +34 -0
  475. package/src/core/objects/role/changes/role.privilege.ts +376 -0
  476. package/src/core/objects/role/changes/role.types.ts +12 -0
  477. package/src/core/objects/role/role.diff.test.ts +279 -0
  478. package/src/core/objects/role/role.diff.ts +499 -0
  479. package/src/core/objects/role/role.model.ts +452 -0
  480. package/src/core/objects/rule/changes/rule.alter.test.ts +82 -0
  481. package/src/core/objects/rule/changes/rule.alter.ts +72 -0
  482. package/src/core/objects/rule/changes/rule.base.ts +20 -0
  483. package/src/core/objects/rule/changes/rule.comment.test.ts +58 -0
  484. package/src/core/objects/rule/changes/rule.comment.ts +62 -0
  485. package/src/core/objects/rule/changes/rule.create.test.ts +63 -0
  486. package/src/core/objects/rule/changes/rule.create.ts +42 -0
  487. package/src/core/objects/rule/changes/rule.drop.test.ts +40 -0
  488. package/src/core/objects/rule/changes/rule.drop.ts +29 -0
  489. package/src/core/objects/rule/changes/rule.types.ts +12 -0
  490. package/src/core/objects/rule/rule.diff.test.ts +132 -0
  491. package/src/core/objects/rule/rule.diff.ts +79 -0
  492. package/src/core/objects/rule/rule.model.ts +173 -0
  493. package/src/core/objects/schema/changes/schema.alter.test.ts +31 -0
  494. package/src/core/objects/schema/changes/schema.alter.ts +45 -0
  495. package/src/core/objects/schema/changes/schema.base.ts +20 -0
  496. package/src/core/objects/schema/changes/schema.comment.ts +56 -0
  497. package/src/core/objects/schema/changes/schema.create.test.ts +25 -0
  498. package/src/core/objects/schema/changes/schema.create.ts +47 -0
  499. package/src/core/objects/schema/changes/schema.drop.test.ts +23 -0
  500. package/src/core/objects/schema/changes/schema.drop.ts +34 -0
  501. package/src/core/objects/schema/changes/schema.privilege.ts +175 -0
  502. package/src/core/objects/schema/changes/schema.types.ts +12 -0
  503. package/src/core/objects/schema/schema.diff.test.ts +42 -0
  504. package/src/core/objects/schema/schema.diff.ts +146 -0
  505. package/src/core/objects/schema/schema.model.ts +107 -0
  506. package/src/core/objects/sequence/changes/sequence.alter.test.ts +157 -0
  507. package/src/core/objects/sequence/changes/sequence.alter.ts +115 -0
  508. package/src/core/objects/sequence/changes/sequence.base.ts +20 -0
  509. package/src/core/objects/sequence/changes/sequence.comment.ts +60 -0
  510. package/src/core/objects/sequence/changes/sequence.create.test.ts +89 -0
  511. package/src/core/objects/sequence/changes/sequence.create.ts +111 -0
  512. package/src/core/objects/sequence/changes/sequence.drop.test.ts +35 -0
  513. package/src/core/objects/sequence/changes/sequence.drop.ts +37 -0
  514. package/src/core/objects/sequence/changes/sequence.privilege.ts +179 -0
  515. package/src/core/objects/sequence/changes/sequence.types.ts +12 -0
  516. package/src/core/objects/sequence/sequence.diff.test.ts +255 -0
  517. package/src/core/objects/sequence/sequence.diff.ts +294 -0
  518. package/src/core/objects/sequence/sequence.model.ts +185 -0
  519. package/src/core/objects/subscription/changes/subscription.alter.test.ts +134 -0
  520. package/src/core/objects/subscription/changes/subscription.alter.ts +110 -0
  521. package/src/core/objects/subscription/changes/subscription.base.ts +20 -0
  522. package/src/core/objects/subscription/changes/subscription.comment.test.ts +70 -0
  523. package/src/core/objects/subscription/changes/subscription.comment.ts +64 -0
  524. package/src/core/objects/subscription/changes/subscription.create.test.ts +80 -0
  525. package/src/core/objects/subscription/changes/subscription.create.ts +69 -0
  526. package/src/core/objects/subscription/changes/subscription.drop.test.ts +48 -0
  527. package/src/core/objects/subscription/changes/subscription.drop.ts +20 -0
  528. package/src/core/objects/subscription/changes/subscription.types.ts +22 -0
  529. package/src/core/objects/subscription/subscription.diff.test.ts +237 -0
  530. package/src/core/objects/subscription/subscription.diff.ts +242 -0
  531. package/src/core/objects/subscription/subscription.model.ts +190 -0
  532. package/src/core/objects/subscription/utils.ts +156 -0
  533. package/src/core/objects/table/changes/table.alter.test.ts +846 -0
  534. package/src/core/objects/table/changes/table.alter.ts +806 -0
  535. package/src/core/objects/table/changes/table.base.ts +20 -0
  536. package/src/core/objects/table/changes/table.comment.ts +266 -0
  537. package/src/core/objects/table/changes/table.create.test.ts +188 -0
  538. package/src/core/objects/table/changes/table.create.ts +192 -0
  539. package/src/core/objects/table/changes/table.drop.test.ts +36 -0
  540. package/src/core/objects/table/changes/table.drop.ts +45 -0
  541. package/src/core/objects/table/changes/table.privilege.ts +200 -0
  542. package/src/core/objects/table/changes/table.types.ts +12 -0
  543. package/src/core/objects/table/table.diff.test.ts +868 -0
  544. package/src/core/objects/table/table.diff.ts +817 -0
  545. package/src/core/objects/table/table.model.ts +460 -0
  546. package/src/core/objects/trigger/changes/trigger.alter.test.ts +50 -0
  547. package/src/core/objects/trigger/changes/trigger.alter.ts +76 -0
  548. package/src/core/objects/trigger/changes/trigger.base.ts +20 -0
  549. package/src/core/objects/trigger/changes/trigger.comment.ts +64 -0
  550. package/src/core/objects/trigger/changes/trigger.create.test.ts +47 -0
  551. package/src/core/objects/trigger/changes/trigger.create.ts +88 -0
  552. package/src/core/objects/trigger/changes/trigger.drop.test.ts +47 -0
  553. package/src/core/objects/trigger/changes/trigger.drop.ts +39 -0
  554. package/src/core/objects/trigger/changes/trigger.types.ts +10 -0
  555. package/src/core/objects/trigger/trigger.diff.test.ts +84 -0
  556. package/src/core/objects/trigger/trigger.diff.ts +116 -0
  557. package/src/core/objects/trigger/trigger.model.ts +264 -0
  558. package/src/core/objects/type/composite-type/changes/composite-type.alter.test.ts +208 -0
  559. package/src/core/objects/type/composite-type/changes/composite-type.alter.ts +174 -0
  560. package/src/core/objects/type/composite-type/changes/composite-type.base.ts +20 -0
  561. package/src/core/objects/type/composite-type/changes/composite-type.comment.ts +145 -0
  562. package/src/core/objects/type/composite-type/changes/composite-type.create.test.ts +106 -0
  563. package/src/core/objects/type/composite-type/changes/composite-type.create.ts +95 -0
  564. package/src/core/objects/type/composite-type/changes/composite-type.drop.test.ts +36 -0
  565. package/src/core/objects/type/composite-type/changes/composite-type.drop.ts +37 -0
  566. package/src/core/objects/type/composite-type/changes/composite-type.privilege.ts +175 -0
  567. package/src/core/objects/type/composite-type/changes/composite-type.types.ts +12 -0
  568. package/src/core/objects/type/composite-type/composite-type.diff.test.ts +269 -0
  569. package/src/core/objects/type/composite-type/composite-type.diff.ts +310 -0
  570. package/src/core/objects/type/composite-type/composite-type.model.ts +253 -0
  571. package/src/core/objects/type/enum/changes/enum.alter.test.ts +113 -0
  572. package/src/core/objects/type/enum/changes/enum.alter.ts +91 -0
  573. package/src/core/objects/type/enum/changes/enum.base.ts +20 -0
  574. package/src/core/objects/type/enum/changes/enum.comment.ts +64 -0
  575. package/src/core/objects/type/enum/changes/enum.create.test.ts +31 -0
  576. package/src/core/objects/type/enum/changes/enum.create.ts +56 -0
  577. package/src/core/objects/type/enum/changes/enum.drop.test.ts +28 -0
  578. package/src/core/objects/type/enum/changes/enum.drop.ts +34 -0
  579. package/src/core/objects/type/enum/changes/enum.privilege.ts +175 -0
  580. package/src/core/objects/type/enum/changes/enum.types.ts +12 -0
  581. package/src/core/objects/type/enum/enum.diff.test.ts +372 -0
  582. package/src/core/objects/type/enum/enum.diff.ts +308 -0
  583. package/src/core/objects/type/enum/enum.model.ts +194 -0
  584. package/src/core/objects/type/range/changes/range.alter.test.ts +29 -0
  585. package/src/core/objects/type/range/changes/range.alter.ts +51 -0
  586. package/src/core/objects/type/range/changes/range.base.ts +20 -0
  587. package/src/core/objects/type/range/changes/range.comment.ts +64 -0
  588. package/src/core/objects/type/range/changes/range.create.test.ts +54 -0
  589. package/src/core/objects/type/range/changes/range.create.ts +155 -0
  590. package/src/core/objects/type/range/changes/range.drop.test.ts +28 -0
  591. package/src/core/objects/type/range/changes/range.drop.ts +34 -0
  592. package/src/core/objects/type/range/changes/range.privilege.ts +175 -0
  593. package/src/core/objects/type/range/changes/range.types.ts +12 -0
  594. package/src/core/objects/type/range/range.diff.test.ts +147 -0
  595. package/src/core/objects/type/range/range.diff.ts +197 -0
  596. package/src/core/objects/type/range/range.model.ts +187 -0
  597. package/src/core/objects/type/type.types.ts +5 -0
  598. package/src/core/objects/utils.ts +171 -0
  599. package/src/core/objects/view/changes/view.alter.test.ts +115 -0
  600. package/src/core/objects/view/changes/view.alter.ts +112 -0
  601. package/src/core/objects/view/changes/view.base.ts +20 -0
  602. package/src/core/objects/view/changes/view.comment.ts +59 -0
  603. package/src/core/objects/view/changes/view.create.test.ts +70 -0
  604. package/src/core/objects/view/changes/view.create.ts +73 -0
  605. package/src/core/objects/view/changes/view.drop.test.ts +37 -0
  606. package/src/core/objects/view/changes/view.drop.ts +40 -0
  607. package/src/core/objects/view/changes/view.privilege.ts +200 -0
  608. package/src/core/objects/view/changes/view.types.ts +12 -0
  609. package/src/core/objects/view/view.diff.test.ts +173 -0
  610. package/src/core/objects/view/view.diff.ts +215 -0
  611. package/src/core/objects/view/view.model.ts +262 -0
  612. package/src/core/plan/apply.ts +172 -0
  613. package/src/core/plan/create.ts +384 -0
  614. package/src/core/plan/hierarchy.ts +574 -0
  615. package/src/core/plan/index.ts +29 -0
  616. package/src/core/plan/io.ts +20 -0
  617. package/src/core/plan/risk.ts +48 -0
  618. package/src/core/plan/serialize.test.ts +317 -0
  619. package/src/core/plan/serialize.ts +209 -0
  620. package/src/core/plan/sql-format/constants.ts +13 -0
  621. package/src/core/plan/sql-format/fixtures.ts +2803 -0
  622. package/src/core/plan/sql-format/format-comment-literals.test.ts +96 -0
  623. package/src/core/plan/sql-format/format-functions.test.ts +127 -0
  624. package/src/core/plan/sql-format/format-lowercase-coverage.test.ts +119 -0
  625. package/src/core/plan/sql-format/format-off.test.ts +806 -0
  626. package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +1061 -0
  627. package/src/core/plan/sql-format/format-pretty-narrow.test.ts +1279 -0
  628. package/src/core/plan/sql-format/format-pretty-preserve.test.ts +1057 -0
  629. package/src/core/plan/sql-format/format-pretty-upper.test.ts +1048 -0
  630. package/src/core/plan/sql-format/format-stress.test.ts +616 -0
  631. package/src/core/plan/sql-format/format-utils.test.ts +91 -0
  632. package/src/core/plan/sql-format/format-utils.ts +391 -0
  633. package/src/core/plan/sql-format/formatters.ts +921 -0
  634. package/src/core/plan/sql-format/index.ts +149 -0
  635. package/src/core/plan/sql-format/keyword-case.test.ts +118 -0
  636. package/src/core/plan/sql-format/keyword-case.ts +1120 -0
  637. package/src/core/plan/sql-format/protect.test.ts +127 -0
  638. package/src/core/plan/sql-format/protect.ts +337 -0
  639. package/src/core/plan/sql-format/sql-scanner.test.ts +240 -0
  640. package/src/core/plan/sql-format/sql-scanner.ts +252 -0
  641. package/src/core/plan/sql-format/tokenizer.test.ts +68 -0
  642. package/src/core/plan/sql-format/tokenizer.ts +152 -0
  643. package/src/core/plan/sql-format/types.ts +31 -0
  644. package/src/core/plan/sql-format/wrap.test.ts +119 -0
  645. package/src/core/plan/sql-format/wrap.ts +196 -0
  646. package/src/core/plan/sql-format.ts +2 -0
  647. package/src/core/plan/ssl-config.ts +172 -0
  648. package/src/core/plan/statements.ts +22 -0
  649. package/src/core/plan/types.ts +171 -0
  650. package/src/core/postgres-config.ts +293 -0
  651. package/src/core/sort/custom-constraints.ts +161 -0
  652. package/src/core/sort/debug-visualization.ts +239 -0
  653. package/src/core/sort/dependency-filter.ts +224 -0
  654. package/src/core/sort/graph-builder.ts +235 -0
  655. package/src/core/sort/graph-utils.ts +51 -0
  656. package/src/core/sort/logical-sort.test.ts +371 -0
  657. package/src/core/sort/logical-sort.ts +597 -0
  658. package/src/core/sort/sort-changes.ts +234 -0
  659. package/src/core/sort/topological-sort.test.ts +275 -0
  660. package/src/core/sort/topological-sort.ts +184 -0
  661. package/src/core/sort/types.ts +112 -0
  662. package/src/core/sort/utils.ts +69 -0
  663. package/src/core/test-utils/assert-valid-sql.ts +20 -0
  664. package/src/index.ts +41 -0
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Declarative schema apply – orchestrator.
3
+ *
4
+ * Accepts pre-read SQL content (file path + sql string per file), uses pg-topo
5
+ * for static dependency analysis and topological ordering, then applies
6
+ * statements to a target database using iterative rounds to handle any
7
+ * remaining dependency gaps. File discovery and reading are done by the caller
8
+ * (e.g. CLI) so I/O errors can be handled there.
9
+ */
10
+ import { analyzeAndSort } from "@supabase/pg-topo";
11
+ import { createManagedPool } from "../postgres-config.js";
12
+ import { extractCatalogProviders } from "./extract-catalog-providers.js";
13
+ import { roundApply, } from "./round-apply.js";
14
+ // ---------------------------------------------------------------------------
15
+ // Helpers
16
+ // ---------------------------------------------------------------------------
17
+ /**
18
+ * Convert pg-topo StatementNodes into StatementEntries for the apply engine.
19
+ */
20
+ function toStatementEntries(nodes) {
21
+ return nodes.map((node) => ({
22
+ id: `${node.id.filePath}:${node.id.statementIndex}`,
23
+ sql: node.sql,
24
+ statementClass: node.statementClass,
25
+ }));
26
+ }
27
+ function remapStatementId(statementId, filePathMap) {
28
+ if (!statementId)
29
+ return undefined;
30
+ return {
31
+ ...statementId,
32
+ filePath: filePathMap.get(statementId.filePath) ?? statementId.filePath,
33
+ };
34
+ }
35
+ // ---------------------------------------------------------------------------
36
+ // Main entry point
37
+ // ---------------------------------------------------------------------------
38
+ /**
39
+ * Apply a declarative SQL schema to a target database.
40
+ *
41
+ * 1. Call pg-topo analyzeAndSort on the provided SQL strings
42
+ * 2. Remap synthetic statement IDs to caller-provided file paths
43
+ * 3. Apply statements round-by-round to the target database
44
+ * 4. Optionally validate function bodies in a final pass
45
+ */
46
+ export async function applyDeclarativeSchema(options) {
47
+ const { content, targetUrl, pool: providedPool, maxRounds = 100, validateFunctionBodies = true, disableCheckFunctionBodies = true, onRoundComplete, } = options;
48
+ if (content.length === 0) {
49
+ return {
50
+ apply: {
51
+ status: "success",
52
+ totalRounds: 0,
53
+ totalApplied: 0,
54
+ totalSkipped: 0,
55
+ rounds: [],
56
+ },
57
+ diagnostics: [],
58
+ totalStatements: 0,
59
+ };
60
+ }
61
+ let pool;
62
+ let closePool;
63
+ if (providedPool != null) {
64
+ pool = providedPool;
65
+ }
66
+ else if (targetUrl != null) {
67
+ const managed = await createManagedPool(targetUrl, { label: "target" });
68
+ pool = managed.pool;
69
+ closePool = managed.close;
70
+ }
71
+ else {
72
+ throw new Error("Either targetUrl or pool must be provided");
73
+ }
74
+ try {
75
+ const externalProviders = await extractCatalogProviders(pool);
76
+ // Step 1: pg-topo analyze and sort (no file I/O; uses synthetic <input:i> paths)
77
+ const sqlContents = content.map((entry) => entry.sql);
78
+ const analyzeResult = await analyzeAndSort(sqlContents, {
79
+ externalProviders,
80
+ });
81
+ const { ordered, diagnostics } = analyzeResult;
82
+ // Step 2: Remap <input:i> to real file paths
83
+ const filePathMap = new Map();
84
+ for (let i = 0; i < content.length; i += 1) {
85
+ filePathMap.set(`<input:${i}>`, content[i].filePath);
86
+ }
87
+ const remappedOrdered = ordered.map((node) => ({
88
+ ...node,
89
+ id: {
90
+ ...node.id,
91
+ filePath: filePathMap.get(node.id.filePath) ?? node.id.filePath,
92
+ },
93
+ }));
94
+ const remappedDiagnostics = diagnostics.map((d) => ({
95
+ ...d,
96
+ statementId: remapStatementId(d.statementId, filePathMap),
97
+ }));
98
+ if (ordered.length === 0) {
99
+ return {
100
+ apply: {
101
+ status: "success",
102
+ totalRounds: 0,
103
+ totalApplied: 0,
104
+ totalSkipped: 0,
105
+ rounds: [],
106
+ },
107
+ diagnostics: remappedDiagnostics,
108
+ totalStatements: 0,
109
+ };
110
+ }
111
+ // Step 3: Convert to statement entries and apply
112
+ const statements = toStatementEntries(remappedOrdered);
113
+ const applyResult = await roundApply({
114
+ pool,
115
+ statements,
116
+ maxRounds,
117
+ disableCheckFunctionBodies,
118
+ finalValidation: validateFunctionBodies,
119
+ onRoundComplete,
120
+ });
121
+ return {
122
+ apply: applyResult,
123
+ diagnostics: remappedDiagnostics,
124
+ totalStatements: remappedOrdered.length,
125
+ };
126
+ }
127
+ finally {
128
+ if (closePool) {
129
+ await closePool();
130
+ }
131
+ }
132
+ }
133
+ // Re-export file discovery for programmatic callers (e.g. Supabase CLI edge-runtime templates)
134
+ export { loadDeclarativeSchema } from "./discover-sql.js";
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Round-based declarative schema apply engine.
3
+ *
4
+ * Applies SQL statements to a database using iterative rounds:
5
+ * 1. Try each pending statement
6
+ * 2. On dependency errors, defer to next round
7
+ * 3. Repeat until all applied or no progress (stuck)
8
+ * 4. Optional final validation pass for function bodies
9
+ */
10
+ import type { Pool } from "pg";
11
+ export interface StatementEntry {
12
+ /** Unique identifier for the statement (e.g. "file:index") */
13
+ id: string;
14
+ /** The SQL to execute */
15
+ sql: string;
16
+ /** Optional statement classification (e.g. CREATE_FUNCTION) */
17
+ statementClass?: string;
18
+ }
19
+ export interface StatementError {
20
+ /** Statement that failed */
21
+ statement: StatementEntry;
22
+ /** PostgreSQL error code (SQLSTATE) */
23
+ code: string;
24
+ /** Human-readable error message */
25
+ message: string;
26
+ /** Whether this was classified as a dependency error */
27
+ isDependencyError: boolean;
28
+ /** 1-based character offset in the statement SQL where the error occurred */
29
+ position?: number;
30
+ /** PostgreSQL error detail (e.g. token invalid) */
31
+ detail?: string;
32
+ /** PostgreSQL hint */
33
+ hint?: string;
34
+ }
35
+ export interface RoundResult {
36
+ /** Round number (1-based) */
37
+ round: number;
38
+ /** Number of statements successfully applied this round */
39
+ applied: number;
40
+ /** Number of statements deferred to next round */
41
+ deferred: number;
42
+ /** Number of statements that failed with non-dependency errors */
43
+ failed: number;
44
+ /** Errors encountered this round */
45
+ errors: StatementError[];
46
+ }
47
+ export interface ApplyResult {
48
+ /** Overall status */
49
+ status: "success" | "stuck" | "error";
50
+ /** Total number of rounds executed */
51
+ totalRounds: number;
52
+ /** Total number of statements successfully applied */
53
+ totalApplied: number;
54
+ /** Total number of statements skipped (environment/capability errors) */
55
+ totalSkipped: number;
56
+ /** Statements that could not be applied (stuck) */
57
+ stuckStatements?: StatementError[];
58
+ /** Non-dependency errors that caused hard failures */
59
+ errors?: StatementError[];
60
+ /** Errors from the final function body validation pass */
61
+ validationErrors?: StatementError[];
62
+ /** Per-round results */
63
+ rounds: RoundResult[];
64
+ }
65
+ interface RoundApplyOptions {
66
+ /** Target database pool */
67
+ pool: Pool;
68
+ /** Ordered SQL statements to apply */
69
+ statements: StatementEntry[];
70
+ /** Max rounds before giving up (default: 100) */
71
+ maxRounds?: number;
72
+ /** Disable function body checks during application (default: true) */
73
+ disableCheckFunctionBodies?: boolean;
74
+ /** Run final validation with check_function_bodies=on (default: true) */
75
+ finalValidation?: boolean;
76
+ /** Progress callback fired after each round */
77
+ onRoundComplete?: (round: RoundResult) => void;
78
+ }
79
+ /**
80
+ * Apply SQL statements to a database using iterative rounds.
81
+ *
82
+ * Algorithm:
83
+ * 1. Optionally set check_function_bodies = off
84
+ * 2. For each round, iterate over pending statements:
85
+ * - On success: mark as applied
86
+ * - On dependency error: defer to next round
87
+ * - On environment error: skip permanently with warning
88
+ * - On other error: mark as failed
89
+ * 3. If a round makes no progress (0 applied), stop (stuck)
90
+ * 4. If finalValidation is true, re-run CREATE FUNCTION/PROCEDURE
91
+ * with check_function_bodies = on
92
+ */
93
+ export declare function roundApply(options: RoundApplyOptions): Promise<ApplyResult>;
94
+ /**
95
+ * Rewrite a CREATE FUNCTION/PROCEDURE statement to use OR REPLACE for
96
+ * idempotent re-execution during validation. Handles leading line-comments,
97
+ * block comments (pg-topo annotations), and avoids double-adding OR REPLACE.
98
+ */
99
+ export declare function rewriteAsOrReplace(sql: string): string;
100
+ export {};
@@ -0,0 +1,378 @@
1
+ /**
2
+ * Round-based declarative schema apply engine.
3
+ *
4
+ * Applies SQL statements to a database using iterative rounds:
5
+ * 1. Try each pending statement
6
+ * 2. On dependency errors, defer to next round
7
+ * 3. Repeat until all applied or no progress (stuck)
8
+ * 4. Optional final validation pass for function bodies
9
+ */
10
+ import debug from "debug";
11
+ const debugApply = debug("pg-delta:declarative-apply");
12
+ // ---------------------------------------------------------------------------
13
+ // Dependency error classification
14
+ // ---------------------------------------------------------------------------
15
+ /**
16
+ * SQLSTATE codes that indicate a missing dependency (object not yet created).
17
+ * Mirrors pg-topo's isDependencyErrorCode.
18
+ */
19
+ const DEPENDENCY_ERROR_CODES = new Set([
20
+ "42P01", // undefined_table
21
+ "42703", // undefined_column
22
+ "42704", // undefined_object
23
+ "42883", // undefined_function
24
+ "3F000", // invalid_schema_name
25
+ ]);
26
+ /**
27
+ * Detect errors caused by environment/capability limitations rather than
28
+ * schema bugs. These statements are skipped permanently (not retried).
29
+ *
30
+ * Strategy: SQLSTATE codes are the primary gate (fast, stable). For codes
31
+ * reused across unrelated error conditions (e.g. 42710 = "duplicate object"
32
+ * covers both roles and extensions), the error message is used as a secondary
33
+ * disambiguator. Messages are lowercased before matching to handle
34
+ * case-sensitivity differences across PG versions.
35
+ */
36
+ function isEnvironmentCapabilityError(code, message, statementClass) {
37
+ // Feature not supported
38
+ if (code === "0A000")
39
+ return true;
40
+ // Extension not available
41
+ if (code === "58P01" &&
42
+ message.includes("extension") &&
43
+ (message.includes("control file") || message.includes("is not available"))) {
44
+ return true;
45
+ }
46
+ // Subscription / logical replication not available
47
+ if (statementClass === "CREATE_SUBSCRIPTION" &&
48
+ (code === "58P01" ||
49
+ message.includes("walreceiver") ||
50
+ message.includes("logical replication"))) {
51
+ return true;
52
+ }
53
+ // Event trigger requires superuser
54
+ if (statementClass === "CREATE_EVENT_TRIGGER" &&
55
+ (code === "42501" || message.includes("must be superuser"))) {
56
+ return true;
57
+ }
58
+ // Language does not exist (e.g. plv8)
59
+ if ((statementClass === "CREATE_FUNCTION" ||
60
+ statementClass === "CREATE_PROCEDURE") &&
61
+ message.includes("language") &&
62
+ message.includes("does not exist")) {
63
+ return true;
64
+ }
65
+ // Role already exists
66
+ if (statementClass === "CREATE_ROLE" &&
67
+ (code === "42710" || code === "23505") &&
68
+ message.includes("role") &&
69
+ (message.includes("already exists") ||
70
+ message.includes("duplicate key") ||
71
+ message.includes("pg_authid_rolname_index"))) {
72
+ return true;
73
+ }
74
+ // Extension already exists
75
+ if (statementClass === "CREATE_EXTENSION" &&
76
+ code === "42710" &&
77
+ message.includes("extension") &&
78
+ message.includes("already exists")) {
79
+ return true;
80
+ }
81
+ // Sequence ownership constraint
82
+ if (code === "55000" &&
83
+ message.includes("sequence must have same owner as table it is linked to")) {
84
+ return true;
85
+ }
86
+ // Publication replica identity
87
+ if (code === "55000" &&
88
+ message.includes("does not have a replica identity") &&
89
+ message.includes("publishes updates")) {
90
+ return true;
91
+ }
92
+ return false;
93
+ }
94
+ function isDependencyError(code) {
95
+ return code !== undefined && DEPENDENCY_ERROR_CODES.has(code);
96
+ }
97
+ function parsePgPosition(pos) {
98
+ if (pos === undefined)
99
+ return undefined;
100
+ if (typeof pos === "number" && Number.isInteger(pos) && pos > 0)
101
+ return pos;
102
+ if (typeof pos === "string") {
103
+ const n = Number.parseInt(pos, 10);
104
+ if (Number.isInteger(n) && n > 0)
105
+ return n;
106
+ }
107
+ return undefined;
108
+ }
109
+ // ---------------------------------------------------------------------------
110
+ // Core round-based apply
111
+ // ---------------------------------------------------------------------------
112
+ /**
113
+ * Apply SQL statements to a database using iterative rounds.
114
+ *
115
+ * Algorithm:
116
+ * 1. Optionally set check_function_bodies = off
117
+ * 2. For each round, iterate over pending statements:
118
+ * - On success: mark as applied
119
+ * - On dependency error: defer to next round
120
+ * - On environment error: skip permanently with warning
121
+ * - On other error: mark as failed
122
+ * 3. If a round makes no progress (0 applied), stop (stuck)
123
+ * 4. If finalValidation is true, re-run CREATE FUNCTION/PROCEDURE
124
+ * with check_function_bodies = on
125
+ */
126
+ export async function roundApply(options) {
127
+ const { pool, statements, maxRounds = 100, disableCheckFunctionBodies = true, finalValidation = true, onRoundComplete, } = options;
128
+ const rounds = [];
129
+ const allErrors = [];
130
+ let totalApplied = 0;
131
+ let totalSkipped = 0;
132
+ // Track which statements still need to be applied
133
+ let pending = [...statements];
134
+ // Track statements that failed with non-dependency errors
135
+ const hardFailed = [];
136
+ // Track skipped (environment) statements
137
+ const skipped = [];
138
+ // Track applied function/procedure statements for final validation
139
+ const appliedFunctions = [];
140
+ const client = await pool.connect();
141
+ try {
142
+ // Disable function body checks to avoid false failures from
143
+ // functions referencing not-yet-created objects
144
+ if (disableCheckFunctionBodies) {
145
+ await client.query("SET check_function_bodies = off");
146
+ }
147
+ for (let round = 1; round <= maxRounds && pending.length > 0; round++) {
148
+ debugApply("round %d: %d pending", round, pending.length);
149
+ const roundErrors = [];
150
+ const deferred = [];
151
+ let appliedThisRound = 0;
152
+ let failedThisRound = 0;
153
+ for (const stmt of pending) {
154
+ try {
155
+ await client.query(stmt.sql);
156
+ appliedThisRound++;
157
+ totalApplied++;
158
+ // Track functions for final validation
159
+ if (stmt.statementClass === "CREATE_FUNCTION" ||
160
+ stmt.statementClass === "CREATE_PROCEDURE") {
161
+ appliedFunctions.push(stmt);
162
+ }
163
+ }
164
+ catch (err) {
165
+ const pgErr = err;
166
+ const code = pgErr.code ?? "";
167
+ const message = (pgErr.message ?? "").toLowerCase();
168
+ // Check if this is an environment/capability limitation
169
+ if (isEnvironmentCapabilityError(code, message, stmt.statementClass)) {
170
+ debugApply("skipped %s: %s", stmt.id, pgErr.message ?? code ?? "environment/capability");
171
+ skipped.push(stmt);
172
+ totalSkipped++;
173
+ continue;
174
+ }
175
+ // Check if this is a dependency error (retryable)
176
+ if (isDependencyError(code)) {
177
+ debugApply("deferred %s: %s - %s", stmt.id, code, pgErr.message ?? "Unknown error");
178
+ if (pgErr.detail)
179
+ debugApply(" detail: %s", pgErr.detail);
180
+ if (pgErr.hint)
181
+ debugApply(" hint: %s", pgErr.hint);
182
+ deferred.push(stmt);
183
+ roundErrors.push({
184
+ statement: stmt,
185
+ code,
186
+ message: pgErr.message ?? "Unknown error",
187
+ isDependencyError: true,
188
+ position: parsePgPosition(pgErr.position),
189
+ detail: pgErr.detail,
190
+ hint: pgErr.hint,
191
+ });
192
+ continue;
193
+ }
194
+ // Hard failure - non-dependency, non-environment error
195
+ failedThisRound++;
196
+ debugApply("failed %s: %s - %s", stmt.id, code, pgErr.message ?? "Unknown error");
197
+ if (pgErr.detail)
198
+ debugApply(" detail: %s", pgErr.detail);
199
+ if (pgErr.hint)
200
+ debugApply(" hint: %s", pgErr.hint);
201
+ const stmtError = {
202
+ statement: stmt,
203
+ code,
204
+ message: pgErr.message ?? "Unknown error",
205
+ isDependencyError: false,
206
+ position: parsePgPosition(pgErr.position),
207
+ detail: pgErr.detail,
208
+ hint: pgErr.hint,
209
+ };
210
+ roundErrors.push(stmtError);
211
+ hardFailed.push(stmtError);
212
+ allErrors.push(stmtError);
213
+ }
214
+ }
215
+ if (debugApply.enabled && deferred.length > 0) {
216
+ debugApply("Round %d complete: %d applied, %d deferred, %d failed", round, appliedThisRound, deferred.length, failedThisRound);
217
+ for (const e of roundErrors.filter((er) => er.isDependencyError)) {
218
+ debugApply(" deferred %s: %s - %s", e.statement.id, e.code, e.message);
219
+ if (e.detail)
220
+ debugApply(" detail: %s", e.detail);
221
+ if (e.hint)
222
+ debugApply(" hint: %s", e.hint);
223
+ }
224
+ }
225
+ const roundResult = {
226
+ round,
227
+ applied: appliedThisRound,
228
+ deferred: deferred.length,
229
+ failed: failedThisRound,
230
+ errors: roundErrors,
231
+ };
232
+ rounds.push(roundResult);
233
+ onRoundComplete?.(roundResult);
234
+ // No progress this round - we're stuck
235
+ if (appliedThisRound === 0 && deferred.length > 0) {
236
+ // Collect the latest error for each stuck statement
237
+ const stuckStatements = deferred.map((stmt) => {
238
+ const lastError = roundErrors.find((e) => e.statement.id === stmt.id);
239
+ return (lastError ?? {
240
+ statement: stmt,
241
+ code: "UNKNOWN",
242
+ message: "Deferred without a recorded error",
243
+ isDependencyError: true,
244
+ });
245
+ });
246
+ return {
247
+ status: "stuck",
248
+ totalRounds: round,
249
+ totalApplied,
250
+ totalSkipped,
251
+ stuckStatements,
252
+ errors: hardFailed.length > 0 ? hardFailed : undefined,
253
+ rounds,
254
+ };
255
+ }
256
+ pending = deferred;
257
+ }
258
+ // If we exhausted maxRounds but still have pending, report stuck
259
+ if (pending.length > 0) {
260
+ return {
261
+ status: "stuck",
262
+ totalRounds: maxRounds,
263
+ totalApplied,
264
+ totalSkipped,
265
+ stuckStatements: pending.map((stmt) => ({
266
+ statement: stmt,
267
+ code: "MAX_ROUNDS",
268
+ message: `Exceeded maximum rounds (${maxRounds})`,
269
+ isDependencyError: true,
270
+ })),
271
+ errors: hardFailed.length > 0 ? hardFailed : undefined,
272
+ rounds,
273
+ };
274
+ }
275
+ // Final validation pass: re-run functions with check_function_bodies = on
276
+ let validationErrors;
277
+ if (finalValidation && appliedFunctions.length > 0) {
278
+ validationErrors = await validateFunctionBodies(client, appliedFunctions);
279
+ }
280
+ return {
281
+ status: hardFailed.length > 0
282
+ ? "error"
283
+ : validationErrors && validationErrors.length > 0
284
+ ? "error"
285
+ : "success",
286
+ totalRounds: rounds.length,
287
+ totalApplied,
288
+ totalSkipped,
289
+ errors: hardFailed.length > 0 ? hardFailed : undefined,
290
+ validationErrors: validationErrors && validationErrors.length > 0
291
+ ? validationErrors
292
+ : undefined,
293
+ rounds,
294
+ };
295
+ }
296
+ finally {
297
+ if (disableCheckFunctionBodies) {
298
+ try {
299
+ // Restore check_function_bodies for the connection being returned to the pool.
300
+ // validateFunctionBodies uses SET LOCAL inside a rolled-back transaction so it
301
+ // never changes the session-level value, but the SET at the start of rounds still
302
+ // needs to be undone here.
303
+ await client.query("SET check_function_bodies = on");
304
+ }
305
+ catch {
306
+ // Best-effort restore; connection is being released anyway
307
+ }
308
+ }
309
+ client.release();
310
+ }
311
+ }
312
+ /**
313
+ * Rewrite a CREATE FUNCTION/PROCEDURE statement to use OR REPLACE for
314
+ * idempotent re-execution during validation. Handles leading line-comments,
315
+ * block comments (pg-topo annotations), and avoids double-adding OR REPLACE.
316
+ */
317
+ export function rewriteAsOrReplace(sql) {
318
+ return sql.replace(/^((?:(?:\s*--[^\n]*\n)|(?:\s*\/\*[\s\S]*?\*\/\s*))*\s*CREATE\s+)(?!OR\s+REPLACE\b)(FUNCTION|PROCEDURE)/i, "$1OR REPLACE $2");
319
+ }
320
+ /**
321
+ * Re-run CREATE FUNCTION/PROCEDURE statements with check_function_bodies = on
322
+ * using CREATE OR REPLACE to validate function bodies after all objects exist.
323
+ *
324
+ * Runs entirely inside a transaction that is always rolled back, so:
325
+ * - SET LOCAL search_path and check_function_bodies are transaction-scoped and
326
+ * never leak to the caller's session.
327
+ * - The CREATE OR REPLACE changes are undone, leaving the DB exactly as it was
328
+ * after the main apply rounds.
329
+ * - SAVEPOINTs around each statement prevent an aborted-transaction error from
330
+ * blocking validation of the remaining functions.
331
+ */
332
+ async function validateFunctionBodies(client, functions) {
333
+ const errors = [];
334
+ await client.query("BEGIN");
335
+ try {
336
+ // Auto-detect all user schemas so unqualified names in function bodies
337
+ // resolve correctly, regardless of the session's default search_path.
338
+ const { rows } = await client.query(`
339
+ SELECT string_agg(quote_ident(nspname), ', ' ORDER BY nspname) AS schemas
340
+ FROM pg_namespace
341
+ WHERE nspname NOT LIKE 'pg_%'
342
+ AND nspname <> 'information_schema'
343
+ `);
344
+ const detectedSchemas = rows[0]?.schemas;
345
+ if (detectedSchemas) {
346
+ debugApply("validation search_path: %s, pg_catalog", detectedSchemas);
347
+ await client.query(`SET LOCAL search_path = ${detectedSchemas}, pg_catalog`);
348
+ }
349
+ await client.query("SET LOCAL check_function_bodies = on");
350
+ for (const stmt of functions) {
351
+ const replaceSql = rewriteAsOrReplace(stmt.sql);
352
+ await client.query("SAVEPOINT validate_fn");
353
+ try {
354
+ await client.query(replaceSql);
355
+ await client.query("RELEASE SAVEPOINT validate_fn");
356
+ }
357
+ catch (err) {
358
+ await client.query("ROLLBACK TO SAVEPOINT validate_fn");
359
+ const pgErr = err;
360
+ errors.push({
361
+ statement: stmt,
362
+ code: pgErr.code ?? "",
363
+ message: pgErr.message ?? "Unknown validation error",
364
+ isDependencyError: false,
365
+ position: parsePgPosition(pgErr.position),
366
+ detail: pgErr.detail,
367
+ hint: pgErr.hint,
368
+ });
369
+ }
370
+ }
371
+ }
372
+ finally {
373
+ // Always roll back: undoes all CREATE OR REPLACE changes and reverts the
374
+ // SET LOCAL search_path / check_function_bodies so nothing leaks.
375
+ await client.query("ROLLBACK");
376
+ }
377
+ return errors;
378
+ }
@@ -1,4 +1,4 @@
1
- import type { Sql } from "postgres";
1
+ import type { Pool } from "pg";
2
2
  /**
3
3
  * Dependency type as defined in PostgreSQL's pg_depend.deptype.
4
4
  * n: normal
@@ -27,5 +27,5 @@ export interface PgDepend {
27
27
  * @param params - Object containing arrays of OIDs for filtering (user_oids, user_namespace_oids, etc.)
28
28
  * @returns Array of dependency objects with class names.
29
29
  */
30
- export declare function extractDepends(sql: Sql): Promise<PgDepend[]>;
30
+ export declare function extractDepends(pool: Pool): Promise<PgDepend[]>;
31
31
  export {};
@@ -1,3 +1,4 @@
1
+ import { sql } from "@ts-safeql/sql-tag";
1
2
  /**
2
3
  * Extract dependencies for privileges and memberships so that GRANT/REVOKE
3
4
  * operations are properly ordered with respect to their target objects/roles.
@@ -13,8 +14,8 @@
13
14
  * - membership:<role>-><member> -> role:<role>
14
15
  * - membership:<role>-><member> -> role:<member>
15
16
  */
16
- async function extractPrivilegeAndMembershipDepends(sql) {
17
- const rows = await sql `
17
+ async function extractPrivilegeAndMembershipDepends(pool) {
18
+ const { rows } = await pool.query(sql `
18
19
  with
19
20
  -- OBJECT PRIVILEGES (relations)
20
21
  extension_rel_oids as (
@@ -468,7 +469,7 @@ where dependent_stable_id <> referenced_stable_id
468
469
  and NOT (
469
470
  COALESCE(dep_schema, '') LIKE ANY (ARRAY['pg\\_%','information\\_schema'])
470
471
  )
471
- `;
472
+ `);
472
473
  return rows;
473
474
  }
474
475
  /**
@@ -477,8 +478,8 @@ where dependent_stable_id <> referenced_stable_id
477
478
  * @param params - Object containing arrays of OIDs for filtering (user_oids, user_namespace_oids, etc.)
478
479
  * @returns Array of dependency objects with class names.
479
480
  */
480
- export async function extractDepends(sql) {
481
- const dependsRows = await sql `
481
+ export async function extractDepends(pool) {
482
+ const { rows: dependsRows } = await pool.query(sql `
482
483
  WITH ids AS (
483
484
  -- only the objects that actually show up in dependencies (both sides)
484
485
  SELECT DISTINCT classid, objid, objsubid FROM pg_depend WHERE deptype IN ('n','a')
@@ -1823,9 +1824,9 @@ export async function extractDepends(sql) {
1823
1824
  COALESCE(dep_schema, '') LIKE ANY (ARRAY['pg\\_%','information\\_schema'])
1824
1825
  )
1825
1826
  ORDER BY dependent_stable_id, referenced_stable_id;
1826
- `;
1827
+ `);
1827
1828
  // Extract privilege and membership dependencies
1828
- const privilegeDepends = await extractPrivilegeAndMembershipDepends(sql);
1829
+ const privilegeDepends = await extractPrivilegeAndMembershipDepends(pool);
1829
1830
  // Combine all dependency sources and remove duplicates
1830
1831
  const allDepends = new Set([...dependsRows, ...privilegeDepends]);
1831
1832
  return Array.from(allDepends).sort((a, b) => a.dependent_stable_id.localeCompare(b.dependent_stable_id) ||