@supabase/pg-delta 1.0.0-alpha.3 → 1.0.0-alpha.5

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 (633) 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 +14 -1
  27. package/dist/core/catalog.model.js +103 -1
  28. package/dist/core/catalog.snapshot.d.ts +66 -0
  29. package/dist/core/catalog.snapshot.js +206 -0
  30. package/dist/core/declarative-apply/discover-sql.d.ts +18 -0
  31. package/dist/core/declarative-apply/discover-sql.js +86 -0
  32. package/dist/core/declarative-apply/extract-catalog-providers.d.ts +23 -0
  33. package/dist/core/declarative-apply/extract-catalog-providers.js +159 -0
  34. package/dist/core/declarative-apply/index.d.ts +49 -0
  35. package/dist/core/declarative-apply/index.js +134 -0
  36. package/dist/core/declarative-apply/round-apply.d.ts +100 -0
  37. package/dist/core/declarative-apply/round-apply.js +378 -0
  38. package/dist/core/export/file-mapper.d.ts +71 -0
  39. package/dist/core/export/file-mapper.js +474 -0
  40. package/dist/core/export/grouper.d.ts +13 -0
  41. package/dist/core/export/grouper.js +76 -0
  42. package/dist/core/export/index.d.ts +45 -0
  43. package/dist/core/export/index.js +63 -0
  44. package/dist/core/export/types.d.ts +84 -0
  45. package/dist/core/export/types.js +25 -0
  46. package/dist/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
  47. package/dist/core/integrations/filter/dsl.d.ts +38 -1
  48. package/dist/core/integrations/filter/dsl.js +20 -2
  49. package/dist/core/integrations/filter/extractors.js +42 -0
  50. package/dist/core/integrations/integration-dsl.d.ts +10 -0
  51. package/dist/core/integrations/supabase.d.ts +8 -0
  52. package/dist/core/integrations/supabase.js +9 -0
  53. package/dist/core/objects/aggregate/aggregate.diff.d.ts +2 -8
  54. package/dist/core/objects/aggregate/aggregate.diff.js +16 -70
  55. package/dist/core/objects/aggregate/aggregate.model.d.ts +8 -8
  56. package/dist/core/objects/aggregate/aggregate.model.js +1 -1
  57. package/dist/core/objects/aggregate/changes/aggregate.create.js +1 -1
  58. package/dist/core/objects/aggregate/changes/aggregate.drop.js +1 -1
  59. package/dist/core/objects/base.privilege-diff.d.ts +38 -13
  60. package/dist/core/objects/base.privilege-diff.js +104 -22
  61. package/dist/core/objects/base.privilege.d.ts +1 -0
  62. package/dist/core/objects/base.privilege.js +9 -2
  63. package/dist/core/objects/collation/collation.diff.d.ts +2 -3
  64. package/dist/core/objects/diff-context.d.ts +15 -0
  65. package/dist/core/objects/diff-context.js +1 -0
  66. package/dist/core/objects/domain/changes/domain.create.js +4 -2
  67. package/dist/core/objects/domain/domain.diff.d.ts +2 -8
  68. package/dist/core/objects/domain/domain.diff.js +16 -77
  69. package/dist/core/objects/domain/domain.model.js +1 -1
  70. package/dist/core/objects/event-trigger/event-trigger.diff.d.ts +2 -3
  71. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.d.ts +2 -8
  72. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.js +13 -77
  73. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.js +2 -2
  74. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.d.ts +2 -8
  75. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.js +16 -77
  76. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.js +1 -1
  77. package/dist/core/objects/foreign-data-wrapper/server/server.diff.d.ts +2 -8
  78. package/dist/core/objects/foreign-data-wrapper/server/server.diff.js +13 -77
  79. package/dist/core/objects/language/language.diff.d.ts +2 -5
  80. package/dist/core/objects/language/language.diff.js +7 -39
  81. package/dist/core/objects/materialized-view/materialized-view.diff.d.ts +2 -8
  82. package/dist/core/objects/materialized-view/materialized-view.diff.js +16 -158
  83. package/dist/core/objects/materialized-view/materialized-view.model.d.ts +3 -3
  84. package/dist/core/objects/materialized-view/materialized-view.model.js +1 -1
  85. package/dist/core/objects/procedure/changes/procedure.alter.js +12 -12
  86. package/dist/core/objects/procedure/procedure.diff.d.ts +2 -8
  87. package/dist/core/objects/procedure/procedure.diff.js +16 -77
  88. package/dist/core/objects/procedure/procedure.model.d.ts +9 -9
  89. package/dist/core/objects/procedure/procedure.model.js +1 -1
  90. package/dist/core/objects/publication/changes/publication.alter.d.ts +0 -9
  91. package/dist/core/objects/publication/changes/publication.alter.js +0 -14
  92. package/dist/core/objects/publication/changes/publication.types.d.ts +2 -2
  93. package/dist/core/objects/publication/publication.diff.d.ts +2 -3
  94. package/dist/core/objects/publication/publication.diff.js +8 -13
  95. package/dist/core/objects/rls-policy/changes/rls-policy.alter.js +3 -3
  96. package/dist/core/objects/rls-policy/rls-policy.model.d.ts +2 -2
  97. package/dist/core/objects/role/role.diff.js +22 -1
  98. package/dist/core/objects/role/role.model.d.ts +4 -3
  99. package/dist/core/objects/role/role.model.js +118 -12
  100. package/dist/core/objects/rule/rule.model.d.ts +1 -1
  101. package/dist/core/objects/schema/schema.diff.d.ts +2 -8
  102. package/dist/core/objects/schema/schema.diff.js +16 -77
  103. package/dist/core/objects/schema/schema.model.js +1 -1
  104. package/dist/core/objects/sequence/sequence.diff.d.ts +2 -8
  105. package/dist/core/objects/sequence/sequence.diff.js +16 -79
  106. package/dist/core/objects/sequence/sequence.model.js +1 -1
  107. package/dist/core/objects/subscription/subscription.diff.d.ts +2 -3
  108. package/dist/core/objects/table/changes/table.create.js +3 -0
  109. package/dist/core/objects/table/table.diff.d.ts +2 -8
  110. package/dist/core/objects/table/table.diff.js +26 -157
  111. package/dist/core/objects/table/table.model.d.ts +25 -22
  112. package/dist/core/objects/table/table.model.js +4 -1
  113. package/dist/core/objects/trigger/changes/trigger.alter.js +23 -0
  114. package/dist/core/objects/trigger/changes/trigger.create.js +4 -5
  115. package/dist/core/objects/trigger/trigger.model.d.ts +9 -0
  116. package/dist/core/objects/trigger/trigger.model.js +14 -0
  117. package/dist/core/objects/type/composite-type/composite-type.diff.d.ts +2 -8
  118. package/dist/core/objects/type/composite-type/composite-type.diff.js +16 -77
  119. package/dist/core/objects/type/composite-type/composite-type.model.d.ts +3 -3
  120. package/dist/core/objects/type/composite-type/composite-type.model.js +2 -1
  121. package/dist/core/objects/type/enum/enum.diff.d.ts +2 -8
  122. package/dist/core/objects/type/enum/enum.diff.js +25 -112
  123. package/dist/core/objects/type/enum/enum.model.js +1 -1
  124. package/dist/core/objects/type/range/changes/range.create.js +6 -3
  125. package/dist/core/objects/type/range/range.diff.d.ts +2 -8
  126. package/dist/core/objects/type/range/range.diff.js +16 -77
  127. package/dist/core/objects/type/range/range.model.js +1 -1
  128. package/dist/core/objects/view/view.diff.d.ts +2 -8
  129. package/dist/core/objects/view/view.diff.js +16 -158
  130. package/dist/core/objects/view/view.model.d.ts +18 -4
  131. package/dist/core/objects/view/view.model.js +3 -13
  132. package/dist/core/plan/apply.js +11 -28
  133. package/dist/core/plan/create.d.ts +19 -6
  134. package/dist/core/plan/create.js +134 -155
  135. package/dist/core/plan/serialize.js +16 -4
  136. package/dist/core/plan/sql-format/constants.d.ts +2 -0
  137. package/dist/core/plan/sql-format/constants.js +11 -0
  138. package/dist/core/plan/sql-format/fixtures.d.ts +2 -0
  139. package/dist/core/plan/sql-format/fixtures.js +2447 -0
  140. package/dist/core/plan/sql-format/format-utils.d.ts +37 -0
  141. package/dist/core/plan/sql-format/format-utils.js +274 -0
  142. package/dist/core/plan/sql-format/formatters.d.ts +20 -0
  143. package/dist/core/plan/sql-format/formatters.js +737 -0
  144. package/dist/core/plan/sql-format/index.d.ts +2 -0
  145. package/dist/core/plan/sql-format/index.js +98 -0
  146. package/dist/core/plan/sql-format/keyword-case.d.ts +2 -0
  147. package/dist/core/plan/sql-format/keyword-case.js +893 -0
  148. package/dist/core/plan/sql-format/protect.d.ts +3 -0
  149. package/dist/core/plan/sql-format/protect.js +269 -0
  150. package/dist/core/plan/sql-format/sql-scanner.d.ts +59 -0
  151. package/dist/core/plan/sql-format/sql-scanner.js +202 -0
  152. package/dist/core/plan/sql-format/tokenizer.d.ts +22 -0
  153. package/dist/core/plan/sql-format/tokenizer.js +118 -0
  154. package/dist/core/plan/sql-format/types.d.ts +28 -0
  155. package/dist/core/plan/sql-format/types.js +1 -0
  156. package/dist/core/plan/sql-format/wrap.d.ts +2 -0
  157. package/dist/core/plan/sql-format/wrap.js +165 -0
  158. package/dist/core/plan/sql-format.d.ts +2 -0
  159. package/dist/core/plan/sql-format.js +1 -0
  160. package/dist/core/plan/ssl-config.d.ts +32 -0
  161. package/dist/core/plan/ssl-config.js +115 -0
  162. package/dist/core/plan/statements.d.ts +2 -1
  163. package/dist/core/plan/statements.js +6 -2
  164. package/dist/core/plan/types.d.ts +6 -0
  165. package/dist/core/postgres-config.d.ts +29 -0
  166. package/dist/core/postgres-config.js +83 -2
  167. package/dist/core/sort/graph-builder.js +10 -0
  168. package/dist/core/sort/logical-sort.js +31 -23
  169. package/dist/core/test-utils/assert-valid-sql.d.ts +10 -0
  170. package/dist/core/test-utils/assert-valid-sql.js +19 -0
  171. package/dist/index.d.ts +8 -0
  172. package/dist/index.js +7 -1
  173. package/package.json +54 -22
  174. package/src/cli/app.ts +52 -0
  175. package/src/cli/bin/cli.ts +15 -0
  176. package/src/cli/commands/apply.ts +101 -0
  177. package/src/cli/commands/catalog-export.ts +78 -0
  178. package/src/cli/commands/declarative-apply.diagnostics.test.ts +77 -0
  179. package/src/cli/commands/declarative-apply.ts +380 -0
  180. package/src/cli/commands/declarative-export.ts +330 -0
  181. package/src/cli/commands/plan.ts +216 -0
  182. package/src/cli/commands/sync.ts +185 -0
  183. package/src/cli/exit-code.test.ts +19 -0
  184. package/src/cli/exit-code.ts +7 -0
  185. package/src/cli/formatters/index.ts +5 -0
  186. package/src/cli/formatters/tree/tree-builder.ts +380 -0
  187. package/src/cli/formatters/tree/tree-renderer.ts +372 -0
  188. package/src/cli/formatters/tree/tree.ts +238 -0
  189. package/src/cli/utils/apply-display.test.ts +348 -0
  190. package/src/cli/utils/apply-display.ts +238 -0
  191. package/src/cli/utils/export-display.test.ts +103 -0
  192. package/src/cli/utils/export-display.ts +275 -0
  193. package/src/cli/utils/integrations.test.ts +44 -0
  194. package/src/cli/utils/integrations.ts +42 -0
  195. package/src/cli/utils/resolve-input.test.ts +38 -0
  196. package/src/cli/utils/resolve-input.ts +17 -0
  197. package/src/cli/utils.ts +231 -0
  198. package/src/core/catalog-export/index.ts +20 -0
  199. package/src/core/catalog.diff.ts +247 -0
  200. package/src/core/catalog.model.test.ts +122 -0
  201. package/src/core/catalog.model.ts +510 -0
  202. package/src/core/catalog.snapshot.test.ts +464 -0
  203. package/src/core/catalog.snapshot.ts +289 -0
  204. package/src/core/change.types.ts +44 -0
  205. package/src/core/context.ts +26 -0
  206. package/src/core/declarative-apply/discover-sql.test.ts +103 -0
  207. package/src/core/declarative-apply/discover-sql.ts +107 -0
  208. package/src/core/declarative-apply/extract-catalog-providers.ts +220 -0
  209. package/src/core/declarative-apply/index.test.ts +67 -0
  210. package/src/core/declarative-apply/index.ts +205 -0
  211. package/src/core/declarative-apply/round-apply.test.ts +504 -0
  212. package/src/core/declarative-apply/round-apply.ts +562 -0
  213. package/src/core/depend.ts +1870 -0
  214. package/src/core/expand-replace-dependencies.test.ts +70 -0
  215. package/src/core/expand-replace-dependencies.ts +380 -0
  216. package/src/core/export/file-mapper.test.ts +816 -0
  217. package/src/core/export/file-mapper.ts +574 -0
  218. package/src/core/export/grouper.ts +108 -0
  219. package/src/core/export/index.ts +129 -0
  220. package/src/core/export/types.ts +104 -0
  221. package/src/core/fingerprint.ts +204 -0
  222. package/src/core/fixtures/empty-catalogs/postgres-15-16-baseline.json +287 -0
  223. package/src/core/integrations/filter/dsl.test.ts +211 -0
  224. package/src/core/integrations/filter/dsl.ts +266 -0
  225. package/src/core/integrations/filter/extractors.test.ts +244 -0
  226. package/src/core/integrations/filter/extractors.ts +187 -0
  227. package/src/core/integrations/filter/filter.types.ts +3 -0
  228. package/src/core/integrations/integration-dsl.ts +34 -0
  229. package/src/core/integrations/integration.types.ts +7 -0
  230. package/src/core/integrations/serialize/dsl.test.ts +91 -0
  231. package/src/core/integrations/serialize/dsl.ts +77 -0
  232. package/src/core/integrations/serialize/serialize.types.ts +3 -0
  233. package/src/core/integrations/supabase.ts +130 -0
  234. package/src/core/objects/aggregate/aggregate.diff.test.ts +215 -0
  235. package/src/core/objects/aggregate/aggregate.diff.ts +222 -0
  236. package/src/core/objects/aggregate/aggregate.model.ts +317 -0
  237. package/src/core/objects/aggregate/changes/aggregate.alter.test.ts +66 -0
  238. package/src/core/objects/aggregate/changes/aggregate.alter.ts +32 -0
  239. package/src/core/objects/aggregate/changes/aggregate.base.ts +20 -0
  240. package/src/core/objects/aggregate/changes/aggregate.comment.test.ts +89 -0
  241. package/src/core/objects/aggregate/changes/aggregate.comment.ts +62 -0
  242. package/src/core/objects/aggregate/changes/aggregate.create.test.ts +104 -0
  243. package/src/core/objects/aggregate/changes/aggregate.create.ts +329 -0
  244. package/src/core/objects/aggregate/changes/aggregate.drop.test.ts +82 -0
  245. package/src/core/objects/aggregate/changes/aggregate.drop.ts +32 -0
  246. package/src/core/objects/aggregate/changes/aggregate.privilege.test.ts +136 -0
  247. package/src/core/objects/aggregate/changes/aggregate.privilege.ts +146 -0
  248. package/src/core/objects/aggregate/changes/aggregate.types.ts +12 -0
  249. package/src/core/objects/base.change.ts +62 -0
  250. package/src/core/objects/base.default-privileges.ts +204 -0
  251. package/src/core/objects/base.diff.ts +20 -0
  252. package/src/core/objects/base.model.ts +82 -0
  253. package/src/core/objects/base.privilege-diff.ts +447 -0
  254. package/src/core/objects/base.privilege.ts +191 -0
  255. package/src/core/objects/collation/changes/collation.alter.test.ts +68 -0
  256. package/src/core/objects/collation/changes/collation.alter.ts +79 -0
  257. package/src/core/objects/collation/changes/collation.base.ts +20 -0
  258. package/src/core/objects/collation/changes/collation.comment.ts +68 -0
  259. package/src/core/objects/collation/changes/collation.create.test.ts +56 -0
  260. package/src/core/objects/collation/changes/collation.create.ts +106 -0
  261. package/src/core/objects/collation/changes/collation.drop.test.ts +31 -0
  262. package/src/core/objects/collation/changes/collation.drop.ts +37 -0
  263. package/src/core/objects/collation/changes/collation.types.ts +10 -0
  264. package/src/core/objects/collation/collation.diff.test.ts +97 -0
  265. package/src/core/objects/collation/collation.diff.ts +127 -0
  266. package/src/core/objects/collation/collation.model.ts +224 -0
  267. package/src/core/objects/diff-context.ts +16 -0
  268. package/src/core/objects/domain/changes/domain.alter.test.ts +335 -0
  269. package/src/core/objects/domain/changes/domain.alter.ts +286 -0
  270. package/src/core/objects/domain/changes/domain.base.ts +20 -0
  271. package/src/core/objects/domain/changes/domain.comment.ts +59 -0
  272. package/src/core/objects/domain/changes/domain.create.test.ts +95 -0
  273. package/src/core/objects/domain/changes/domain.create.ts +124 -0
  274. package/src/core/objects/domain/changes/domain.drop.test.ts +33 -0
  275. package/src/core/objects/domain/changes/domain.drop.ts +34 -0
  276. package/src/core/objects/domain/changes/domain.privilege.ts +171 -0
  277. package/src/core/objects/domain/changes/domain.types.ts +12 -0
  278. package/src/core/objects/domain/domain.diff.test.ts +284 -0
  279. package/src/core/objects/domain/domain.diff.ts +295 -0
  280. package/src/core/objects/domain/domain.model.ts +190 -0
  281. package/src/core/objects/event-trigger/changes/event-trigger.alter.test.ts +57 -0
  282. package/src/core/objects/event-trigger/changes/event-trigger.alter.ts +82 -0
  283. package/src/core/objects/event-trigger/changes/event-trigger.base.ts +20 -0
  284. package/src/core/objects/event-trigger/changes/event-trigger.comment.ts +66 -0
  285. package/src/core/objects/event-trigger/changes/event-trigger.create.test.ts +27 -0
  286. package/src/core/objects/event-trigger/changes/event-trigger.create.ts +72 -0
  287. package/src/core/objects/event-trigger/changes/event-trigger.drop.test.ts +25 -0
  288. package/src/core/objects/event-trigger/changes/event-trigger.drop.ts +34 -0
  289. package/src/core/objects/event-trigger/changes/event-trigger.types.ts +10 -0
  290. package/src/core/objects/event-trigger/event-trigger.diff.test.ts +131 -0
  291. package/src/core/objects/event-trigger/event-trigger.diff.ts +127 -0
  292. package/src/core/objects/event-trigger/event-trigger.model.ts +106 -0
  293. package/src/core/objects/extension/changes/extension.alter.test.ts +63 -0
  294. package/src/core/objects/extension/changes/extension.alter.ts +78 -0
  295. package/src/core/objects/extension/changes/extension.base.ts +20 -0
  296. package/src/core/objects/extension/changes/extension.comment.ts +64 -0
  297. package/src/core/objects/extension/changes/extension.create.test.ts +28 -0
  298. package/src/core/objects/extension/changes/extension.create.ts +63 -0
  299. package/src/core/objects/extension/changes/extension.drop.test.ts +26 -0
  300. package/src/core/objects/extension/changes/extension.drop.ts +34 -0
  301. package/src/core/objects/extension/changes/extension.types.ts +10 -0
  302. package/src/core/objects/extension/extension.diff.test.ts +42 -0
  303. package/src/core/objects/extension/extension.diff.ts +90 -0
  304. package/src/core/objects/extension/extension.model.test.ts +98 -0
  305. package/src/core/objects/extension/extension.model.ts +280 -0
  306. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.test.ts +136 -0
  307. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.ts +101 -0
  308. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.ts +20 -0
  309. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.ts +72 -0
  310. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.test.ts +160 -0
  311. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.ts +95 -0
  312. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.test.ts +26 -0
  313. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.ts +36 -0
  314. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.ts +172 -0
  315. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.ts +12 -0
  316. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.test.ts +286 -0
  317. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts +271 -0
  318. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.ts +149 -0
  319. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.ts +10 -0
  320. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts +340 -0
  321. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.ts +341 -0
  322. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.ts +20 -0
  323. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.ts +72 -0
  324. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.test.ts +210 -0
  325. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.ts +81 -0
  326. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.test.ts +46 -0
  327. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.ts +37 -0
  328. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.ts +181 -0
  329. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +12 -0
  330. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.test.ts +813 -0
  331. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +343 -0
  332. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +242 -0
  333. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.test.ts +183 -0
  334. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.ts +126 -0
  335. package/src/core/objects/foreign-data-wrapper/server/changes/server.base.ts +20 -0
  336. package/src/core/objects/foreign-data-wrapper/server/changes/server.comment.ts +60 -0
  337. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.test.ts +144 -0
  338. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.ts +81 -0
  339. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.test.ts +27 -0
  340. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.ts +34 -0
  341. package/src/core/objects/foreign-data-wrapper/server/changes/server.privilege.ts +164 -0
  342. package/src/core/objects/foreign-data-wrapper/server/changes/server.types.ts +12 -0
  343. package/src/core/objects/foreign-data-wrapper/server/server.diff.test.ts +262 -0
  344. package/src/core/objects/foreign-data-wrapper/server/server.diff.ts +247 -0
  345. package/src/core/objects/foreign-data-wrapper/server/server.model.ts +133 -0
  346. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.test.ts +91 -0
  347. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.ts +69 -0
  348. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.ts +20 -0
  349. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.test.ts +96 -0
  350. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.ts +66 -0
  351. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.test.ts +60 -0
  352. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.ts +40 -0
  353. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.ts +8 -0
  354. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.test.ts +77 -0
  355. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.ts +107 -0
  356. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.ts +96 -0
  357. package/src/core/objects/index/changes/index.alter.test.ts +209 -0
  358. package/src/core/objects/index/changes/index.alter.ts +144 -0
  359. package/src/core/objects/index/changes/index.base.ts +20 -0
  360. package/src/core/objects/index/changes/index.comment.ts +63 -0
  361. package/src/core/objects/index/changes/index.create.test.ts +69 -0
  362. package/src/core/objects/index/changes/index.create.ts +68 -0
  363. package/src/core/objects/index/changes/index.drop.test.ts +47 -0
  364. package/src/core/objects/index/changes/index.drop.ts +34 -0
  365. package/src/core/objects/index/changes/index.types.ts +6 -0
  366. package/src/core/objects/index/changes/utils.ts +16 -0
  367. package/src/core/objects/index/index.diff.test.ts +153 -0
  368. package/src/core/objects/index/index.diff.ts +243 -0
  369. package/src/core/objects/index/index.model.ts +370 -0
  370. package/src/core/objects/language/changes/language.alter.test.ts +36 -0
  371. package/src/core/objects/language/changes/language.alter.ts +53 -0
  372. package/src/core/objects/language/changes/language.base.ts +20 -0
  373. package/src/core/objects/language/changes/language.comment.ts +58 -0
  374. package/src/core/objects/language/changes/language.create.test.ts +30 -0
  375. package/src/core/objects/language/changes/language.create.ts +104 -0
  376. package/src/core/objects/language/changes/language.drop.test.ts +28 -0
  377. package/src/core/objects/language/changes/language.drop.ts +39 -0
  378. package/src/core/objects/language/changes/language.privilege.ts +172 -0
  379. package/src/core/objects/language/changes/language.types.ts +12 -0
  380. package/src/core/objects/language/language.diff.test.ts +135 -0
  381. package/src/core/objects/language/language.diff.ts +144 -0
  382. package/src/core/objects/language/language.model.ts +150 -0
  383. package/src/core/objects/materialized-view/changes/materialized-view.alter.test.ts +130 -0
  384. package/src/core/objects/materialized-view/changes/materialized-view.alter.ts +113 -0
  385. package/src/core/objects/materialized-view/changes/materialized-view.base.ts +20 -0
  386. package/src/core/objects/materialized-view/changes/materialized-view.comment.ts +176 -0
  387. package/src/core/objects/materialized-view/changes/materialized-view.create.test.ts +69 -0
  388. package/src/core/objects/materialized-view/changes/materialized-view.create.ts +93 -0
  389. package/src/core/objects/materialized-view/changes/materialized-view.drop.test.ts +37 -0
  390. package/src/core/objects/materialized-view/changes/materialized-view.drop.ts +60 -0
  391. package/src/core/objects/materialized-view/changes/materialized-view.privilege.ts +212 -0
  392. package/src/core/objects/materialized-view/changes/materialized-view.types.ts +12 -0
  393. package/src/core/objects/materialized-view/materialized-view.diff.test.ts +264 -0
  394. package/src/core/objects/materialized-view/materialized-view.diff.ts +301 -0
  395. package/src/core/objects/materialized-view/materialized-view.model.ts +258 -0
  396. package/src/core/objects/procedure/changes/procedure.alter.test.ts +1077 -0
  397. package/src/core/objects/procedure/changes/procedure.alter.ts +290 -0
  398. package/src/core/objects/procedure/changes/procedure.base.ts +20 -0
  399. package/src/core/objects/procedure/changes/procedure.comment.ts +70 -0
  400. package/src/core/objects/procedure/changes/procedure.create.test.ts +51 -0
  401. package/src/core/objects/procedure/changes/procedure.create.ts +92 -0
  402. package/src/core/objects/procedure/changes/procedure.drop.test.ts +90 -0
  403. package/src/core/objects/procedure/changes/procedure.drop.ts +49 -0
  404. package/src/core/objects/procedure/changes/procedure.privilege.ts +188 -0
  405. package/src/core/objects/procedure/changes/procedure.types.ts +12 -0
  406. package/src/core/objects/procedure/procedure.diff.test.ts +161 -0
  407. package/src/core/objects/procedure/procedure.diff.ts +341 -0
  408. package/src/core/objects/procedure/procedure.model.ts +264 -0
  409. package/src/core/objects/procedure/utils.ts +58 -0
  410. package/src/core/objects/publication/changes/publication.alter.test.ts +217 -0
  411. package/src/core/objects/publication/changes/publication.alter.ts +225 -0
  412. package/src/core/objects/publication/changes/publication.base.ts +20 -0
  413. package/src/core/objects/publication/changes/publication.comment.test.ts +73 -0
  414. package/src/core/objects/publication/changes/publication.comment.ts +64 -0
  415. package/src/core/objects/publication/changes/publication.create.test.ts +90 -0
  416. package/src/core/objects/publication/changes/publication.create.ts +82 -0
  417. package/src/core/objects/publication/changes/publication.drop.test.ts +48 -0
  418. package/src/core/objects/publication/changes/publication.drop.ts +29 -0
  419. package/src/core/objects/publication/changes/publication.types.ts +24 -0
  420. package/src/core/objects/publication/publication.diff.test.ts +297 -0
  421. package/src/core/objects/publication/publication.diff.ts +247 -0
  422. package/src/core/objects/publication/publication.model.ts +206 -0
  423. package/src/core/objects/publication/utils.ts +55 -0
  424. package/src/core/objects/rls-policy/changes/rls-policy.alter.test.ts +267 -0
  425. package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +128 -0
  426. package/src/core/objects/rls-policy/changes/rls-policy.base.ts +20 -0
  427. package/src/core/objects/rls-policy/changes/rls-policy.comment.ts +69 -0
  428. package/src/core/objects/rls-policy/changes/rls-policy.create.test.ts +81 -0
  429. package/src/core/objects/rls-policy/changes/rls-policy.create.ts +100 -0
  430. package/src/core/objects/rls-policy/changes/rls-policy.drop.test.ts +31 -0
  431. package/src/core/objects/rls-policy/changes/rls-policy.drop.ts +39 -0
  432. package/src/core/objects/rls-policy/changes/rls-policy.types.ts +10 -0
  433. package/src/core/objects/rls-policy/rls-policy.diff.test.ts +79 -0
  434. package/src/core/objects/rls-policy/rls-policy.diff.ts +121 -0
  435. package/src/core/objects/rls-policy/rls-policy.model.ts +140 -0
  436. package/src/core/objects/role/changes/role.alter.test.ts +362 -0
  437. package/src/core/objects/role/changes/role.alter.ts +110 -0
  438. package/src/core/objects/role/changes/role.base.ts +24 -0
  439. package/src/core/objects/role/changes/role.comment.ts +55 -0
  440. package/src/core/objects/role/changes/role.create.test.ts +56 -0
  441. package/src/core/objects/role/changes/role.create.ts +102 -0
  442. package/src/core/objects/role/changes/role.drop.test.ts +32 -0
  443. package/src/core/objects/role/changes/role.drop.ts +34 -0
  444. package/src/core/objects/role/changes/role.privilege.ts +376 -0
  445. package/src/core/objects/role/changes/role.types.ts +12 -0
  446. package/src/core/objects/role/role.diff.test.ts +279 -0
  447. package/src/core/objects/role/role.diff.ts +499 -0
  448. package/src/core/objects/role/role.model.ts +452 -0
  449. package/src/core/objects/rule/changes/rule.alter.test.ts +82 -0
  450. package/src/core/objects/rule/changes/rule.alter.ts +72 -0
  451. package/src/core/objects/rule/changes/rule.base.ts +20 -0
  452. package/src/core/objects/rule/changes/rule.comment.test.ts +58 -0
  453. package/src/core/objects/rule/changes/rule.comment.ts +62 -0
  454. package/src/core/objects/rule/changes/rule.create.test.ts +63 -0
  455. package/src/core/objects/rule/changes/rule.create.ts +42 -0
  456. package/src/core/objects/rule/changes/rule.drop.test.ts +40 -0
  457. package/src/core/objects/rule/changes/rule.drop.ts +29 -0
  458. package/src/core/objects/rule/changes/rule.types.ts +12 -0
  459. package/src/core/objects/rule/rule.diff.test.ts +132 -0
  460. package/src/core/objects/rule/rule.diff.ts +79 -0
  461. package/src/core/objects/rule/rule.model.ts +173 -0
  462. package/src/core/objects/schema/changes/schema.alter.test.ts +31 -0
  463. package/src/core/objects/schema/changes/schema.alter.ts +45 -0
  464. package/src/core/objects/schema/changes/schema.base.ts +20 -0
  465. package/src/core/objects/schema/changes/schema.comment.ts +56 -0
  466. package/src/core/objects/schema/changes/schema.create.test.ts +25 -0
  467. package/src/core/objects/schema/changes/schema.create.ts +47 -0
  468. package/src/core/objects/schema/changes/schema.drop.test.ts +23 -0
  469. package/src/core/objects/schema/changes/schema.drop.ts +34 -0
  470. package/src/core/objects/schema/changes/schema.privilege.ts +175 -0
  471. package/src/core/objects/schema/changes/schema.types.ts +12 -0
  472. package/src/core/objects/schema/schema.diff.test.ts +42 -0
  473. package/src/core/objects/schema/schema.diff.ts +146 -0
  474. package/src/core/objects/schema/schema.model.ts +107 -0
  475. package/src/core/objects/sequence/changes/sequence.alter.test.ts +157 -0
  476. package/src/core/objects/sequence/changes/sequence.alter.ts +115 -0
  477. package/src/core/objects/sequence/changes/sequence.base.ts +20 -0
  478. package/src/core/objects/sequence/changes/sequence.comment.ts +60 -0
  479. package/src/core/objects/sequence/changes/sequence.create.test.ts +89 -0
  480. package/src/core/objects/sequence/changes/sequence.create.ts +111 -0
  481. package/src/core/objects/sequence/changes/sequence.drop.test.ts +35 -0
  482. package/src/core/objects/sequence/changes/sequence.drop.ts +37 -0
  483. package/src/core/objects/sequence/changes/sequence.privilege.ts +179 -0
  484. package/src/core/objects/sequence/changes/sequence.types.ts +12 -0
  485. package/src/core/objects/sequence/sequence.diff.test.ts +255 -0
  486. package/src/core/objects/sequence/sequence.diff.ts +294 -0
  487. package/src/core/objects/sequence/sequence.model.ts +185 -0
  488. package/src/core/objects/subscription/changes/subscription.alter.test.ts +134 -0
  489. package/src/core/objects/subscription/changes/subscription.alter.ts +110 -0
  490. package/src/core/objects/subscription/changes/subscription.base.ts +20 -0
  491. package/src/core/objects/subscription/changes/subscription.comment.test.ts +70 -0
  492. package/src/core/objects/subscription/changes/subscription.comment.ts +64 -0
  493. package/src/core/objects/subscription/changes/subscription.create.test.ts +80 -0
  494. package/src/core/objects/subscription/changes/subscription.create.ts +69 -0
  495. package/src/core/objects/subscription/changes/subscription.drop.test.ts +48 -0
  496. package/src/core/objects/subscription/changes/subscription.drop.ts +20 -0
  497. package/src/core/objects/subscription/changes/subscription.types.ts +22 -0
  498. package/src/core/objects/subscription/subscription.diff.test.ts +237 -0
  499. package/src/core/objects/subscription/subscription.diff.ts +242 -0
  500. package/src/core/objects/subscription/subscription.model.ts +190 -0
  501. package/src/core/objects/subscription/utils.ts +156 -0
  502. package/src/core/objects/table/changes/table.alter.test.ts +846 -0
  503. package/src/core/objects/table/changes/table.alter.ts +806 -0
  504. package/src/core/objects/table/changes/table.base.ts +20 -0
  505. package/src/core/objects/table/changes/table.comment.ts +266 -0
  506. package/src/core/objects/table/changes/table.create.test.ts +188 -0
  507. package/src/core/objects/table/changes/table.create.ts +192 -0
  508. package/src/core/objects/table/changes/table.drop.test.ts +36 -0
  509. package/src/core/objects/table/changes/table.drop.ts +45 -0
  510. package/src/core/objects/table/changes/table.privilege.ts +200 -0
  511. package/src/core/objects/table/changes/table.types.ts +12 -0
  512. package/src/core/objects/table/table.diff.test.ts +868 -0
  513. package/src/core/objects/table/table.diff.ts +817 -0
  514. package/src/core/objects/table/table.model.ts +460 -0
  515. package/src/core/objects/trigger/changes/trigger.alter.test.ts +50 -0
  516. package/src/core/objects/trigger/changes/trigger.alter.ts +76 -0
  517. package/src/core/objects/trigger/changes/trigger.base.ts +20 -0
  518. package/src/core/objects/trigger/changes/trigger.comment.ts +64 -0
  519. package/src/core/objects/trigger/changes/trigger.create.test.ts +47 -0
  520. package/src/core/objects/trigger/changes/trigger.create.ts +88 -0
  521. package/src/core/objects/trigger/changes/trigger.drop.test.ts +47 -0
  522. package/src/core/objects/trigger/changes/trigger.drop.ts +39 -0
  523. package/src/core/objects/trigger/changes/trigger.types.ts +10 -0
  524. package/src/core/objects/trigger/trigger.diff.test.ts +84 -0
  525. package/src/core/objects/trigger/trigger.diff.ts +116 -0
  526. package/src/core/objects/trigger/trigger.model.ts +264 -0
  527. package/src/core/objects/type/composite-type/changes/composite-type.alter.test.ts +208 -0
  528. package/src/core/objects/type/composite-type/changes/composite-type.alter.ts +174 -0
  529. package/src/core/objects/type/composite-type/changes/composite-type.base.ts +20 -0
  530. package/src/core/objects/type/composite-type/changes/composite-type.comment.ts +145 -0
  531. package/src/core/objects/type/composite-type/changes/composite-type.create.test.ts +106 -0
  532. package/src/core/objects/type/composite-type/changes/composite-type.create.ts +95 -0
  533. package/src/core/objects/type/composite-type/changes/composite-type.drop.test.ts +36 -0
  534. package/src/core/objects/type/composite-type/changes/composite-type.drop.ts +37 -0
  535. package/src/core/objects/type/composite-type/changes/composite-type.privilege.ts +175 -0
  536. package/src/core/objects/type/composite-type/changes/composite-type.types.ts +12 -0
  537. package/src/core/objects/type/composite-type/composite-type.diff.test.ts +269 -0
  538. package/src/core/objects/type/composite-type/composite-type.diff.ts +310 -0
  539. package/src/core/objects/type/composite-type/composite-type.model.ts +253 -0
  540. package/src/core/objects/type/enum/changes/enum.alter.test.ts +113 -0
  541. package/src/core/objects/type/enum/changes/enum.alter.ts +91 -0
  542. package/src/core/objects/type/enum/changes/enum.base.ts +20 -0
  543. package/src/core/objects/type/enum/changes/enum.comment.ts +64 -0
  544. package/src/core/objects/type/enum/changes/enum.create.test.ts +31 -0
  545. package/src/core/objects/type/enum/changes/enum.create.ts +56 -0
  546. package/src/core/objects/type/enum/changes/enum.drop.test.ts +28 -0
  547. package/src/core/objects/type/enum/changes/enum.drop.ts +34 -0
  548. package/src/core/objects/type/enum/changes/enum.privilege.ts +175 -0
  549. package/src/core/objects/type/enum/changes/enum.types.ts +12 -0
  550. package/src/core/objects/type/enum/enum.diff.test.ts +372 -0
  551. package/src/core/objects/type/enum/enum.diff.ts +308 -0
  552. package/src/core/objects/type/enum/enum.model.ts +194 -0
  553. package/src/core/objects/type/range/changes/range.alter.test.ts +29 -0
  554. package/src/core/objects/type/range/changes/range.alter.ts +51 -0
  555. package/src/core/objects/type/range/changes/range.base.ts +20 -0
  556. package/src/core/objects/type/range/changes/range.comment.ts +64 -0
  557. package/src/core/objects/type/range/changes/range.create.test.ts +54 -0
  558. package/src/core/objects/type/range/changes/range.create.ts +155 -0
  559. package/src/core/objects/type/range/changes/range.drop.test.ts +28 -0
  560. package/src/core/objects/type/range/changes/range.drop.ts +34 -0
  561. package/src/core/objects/type/range/changes/range.privilege.ts +175 -0
  562. package/src/core/objects/type/range/changes/range.types.ts +12 -0
  563. package/src/core/objects/type/range/range.diff.test.ts +147 -0
  564. package/src/core/objects/type/range/range.diff.ts +197 -0
  565. package/src/core/objects/type/range/range.model.ts +187 -0
  566. package/src/core/objects/type/type.types.ts +5 -0
  567. package/src/core/objects/utils.ts +171 -0
  568. package/src/core/objects/view/changes/view.alter.test.ts +115 -0
  569. package/src/core/objects/view/changes/view.alter.ts +112 -0
  570. package/src/core/objects/view/changes/view.base.ts +20 -0
  571. package/src/core/objects/view/changes/view.comment.ts +59 -0
  572. package/src/core/objects/view/changes/view.create.test.ts +70 -0
  573. package/src/core/objects/view/changes/view.create.ts +73 -0
  574. package/src/core/objects/view/changes/view.drop.test.ts +37 -0
  575. package/src/core/objects/view/changes/view.drop.ts +40 -0
  576. package/src/core/objects/view/changes/view.privilege.ts +200 -0
  577. package/src/core/objects/view/changes/view.types.ts +12 -0
  578. package/src/core/objects/view/view.diff.test.ts +173 -0
  579. package/src/core/objects/view/view.diff.ts +215 -0
  580. package/src/core/objects/view/view.model.ts +262 -0
  581. package/src/core/plan/apply.ts +172 -0
  582. package/src/core/plan/create.ts +368 -0
  583. package/src/core/plan/hierarchy.ts +574 -0
  584. package/src/core/plan/index.ts +29 -0
  585. package/src/core/plan/io.ts +20 -0
  586. package/src/core/plan/risk.ts +48 -0
  587. package/src/core/plan/serialize.test.ts +317 -0
  588. package/src/core/plan/serialize.ts +209 -0
  589. package/src/core/plan/sql-format/constants.ts +13 -0
  590. package/src/core/plan/sql-format/fixtures.ts +2803 -0
  591. package/src/core/plan/sql-format/format-comment-literals.test.ts +96 -0
  592. package/src/core/plan/sql-format/format-functions.test.ts +127 -0
  593. package/src/core/plan/sql-format/format-lowercase-coverage.test.ts +119 -0
  594. package/src/core/plan/sql-format/format-off.test.ts +806 -0
  595. package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +1061 -0
  596. package/src/core/plan/sql-format/format-pretty-narrow.test.ts +1279 -0
  597. package/src/core/plan/sql-format/format-pretty-preserve.test.ts +1057 -0
  598. package/src/core/plan/sql-format/format-pretty-upper.test.ts +1048 -0
  599. package/src/core/plan/sql-format/format-stress.test.ts +616 -0
  600. package/src/core/plan/sql-format/format-utils.test.ts +91 -0
  601. package/src/core/plan/sql-format/format-utils.ts +391 -0
  602. package/src/core/plan/sql-format/formatters.ts +921 -0
  603. package/src/core/plan/sql-format/index.ts +149 -0
  604. package/src/core/plan/sql-format/keyword-case.test.ts +118 -0
  605. package/src/core/plan/sql-format/keyword-case.ts +1120 -0
  606. package/src/core/plan/sql-format/protect.test.ts +127 -0
  607. package/src/core/plan/sql-format/protect.ts +337 -0
  608. package/src/core/plan/sql-format/sql-scanner.test.ts +240 -0
  609. package/src/core/plan/sql-format/sql-scanner.ts +252 -0
  610. package/src/core/plan/sql-format/tokenizer.test.ts +68 -0
  611. package/src/core/plan/sql-format/tokenizer.ts +152 -0
  612. package/src/core/plan/sql-format/types.ts +31 -0
  613. package/src/core/plan/sql-format/wrap.test.ts +119 -0
  614. package/src/core/plan/sql-format/wrap.ts +196 -0
  615. package/src/core/plan/sql-format.ts +2 -0
  616. package/src/core/plan/ssl-config.ts +172 -0
  617. package/src/core/plan/statements.ts +22 -0
  618. package/src/core/plan/types.ts +171 -0
  619. package/src/core/postgres-config.ts +238 -0
  620. package/src/core/sort/custom-constraints.ts +161 -0
  621. package/src/core/sort/debug-visualization.ts +239 -0
  622. package/src/core/sort/dependency-filter.ts +224 -0
  623. package/src/core/sort/graph-builder.ts +235 -0
  624. package/src/core/sort/graph-utils.ts +51 -0
  625. package/src/core/sort/logical-sort.test.ts +371 -0
  626. package/src/core/sort/logical-sort.ts +597 -0
  627. package/src/core/sort/sort-changes.ts +234 -0
  628. package/src/core/sort/topological-sort.test.ts +275 -0
  629. package/src/core/sort/topological-sort.ts +184 -0
  630. package/src/core/sort/types.ts +112 -0
  631. package/src/core/sort/utils.ts +69 -0
  632. package/src/core/test-utils/assert-valid-sql.ts +20 -0
  633. package/src/index.ts +38 -0
@@ -0,0 +1,817 @@
1
+ import { diffObjects } from "../base.diff.ts";
2
+ import {
3
+ diffPrivileges,
4
+ emitColumnPrivilegeChanges,
5
+ } from "../base.privilege-diff.ts";
6
+ import type { ObjectDiffContext } from "../diff-context.ts";
7
+ import { deepEqual } from "../utils.ts";
8
+ import {
9
+ AlterTableAddColumn,
10
+ AlterTableAddConstraint,
11
+ AlterTableAlterColumnDropDefault,
12
+ AlterTableAlterColumnDropNotNull,
13
+ AlterTableAlterColumnSetDefault,
14
+ AlterTableAlterColumnSetNotNull,
15
+ AlterTableAlterColumnType,
16
+ AlterTableAttachPartition,
17
+ AlterTableChangeOwner,
18
+ AlterTableDetachPartition,
19
+ AlterTableDisableRowLevelSecurity,
20
+ AlterTableDropColumn,
21
+ AlterTableDropConstraint,
22
+ AlterTableEnableRowLevelSecurity,
23
+ AlterTableForceRowLevelSecurity,
24
+ AlterTableNoForceRowLevelSecurity,
25
+ AlterTableResetStorageParams,
26
+ AlterTableSetLogged,
27
+ AlterTableSetReplicaIdentity,
28
+ AlterTableSetStorageParams,
29
+ AlterTableSetUnlogged,
30
+ AlterTableValidateConstraint,
31
+ } from "./changes/table.alter.ts";
32
+ import {
33
+ CreateCommentOnColumn,
34
+ CreateCommentOnConstraint,
35
+ CreateCommentOnTable,
36
+ DropCommentOnColumn,
37
+ DropCommentOnConstraint,
38
+ DropCommentOnTable,
39
+ } from "./changes/table.comment.ts";
40
+ import { CreateTable } from "./changes/table.create.ts";
41
+ import { DropTable } from "./changes/table.drop.ts";
42
+ import {
43
+ GrantTablePrivileges,
44
+ RevokeGrantOptionTablePrivileges,
45
+ RevokeTablePrivileges,
46
+ } from "./changes/table.privilege.ts";
47
+ import type { TableChange } from "./changes/table.types.ts";
48
+ import { Table } from "./table.model.ts";
49
+
50
+ function createAlterConstraintChange(mainTable: Table, branchTable: Table) {
51
+ const changes: TableChange[] = [];
52
+
53
+ // Note: Table renaming would also use ALTER TABLE ... RENAME TO ...
54
+ // But since our Table model uses 'name' as the identity field,
55
+ // a name change would be handled as drop + create by diffObjects()
56
+
57
+ // TABLE CONSTRAINTS
58
+ const mainByName = new Map(
59
+ (mainTable.constraints ?? []).map((c) => [c.name, c]),
60
+ );
61
+ const branchByName = new Map(
62
+ (branchTable.constraints ?? []).map((c) => [c.name, c]),
63
+ );
64
+
65
+ // Created constraints
66
+ for (const [name, c] of branchByName) {
67
+ // Skip constraint clones on partitions - they are automatically created when the parent constraint is created
68
+ if (c.is_partition_clone) {
69
+ continue;
70
+ }
71
+
72
+ if (!mainByName.has(name)) {
73
+ changes.push(
74
+ new AlterTableAddConstraint({
75
+ table: branchTable,
76
+ constraint: c,
77
+ }),
78
+ );
79
+ if (!c.validated) {
80
+ changes.push(
81
+ new AlterTableValidateConstraint({
82
+ table: branchTable,
83
+ constraint: c,
84
+ }),
85
+ );
86
+ }
87
+ // Add comment for newly created constraint
88
+ if (c.comment !== null) {
89
+ changes.push(
90
+ new CreateCommentOnConstraint({
91
+ table: branchTable,
92
+ constraint: c,
93
+ }),
94
+ );
95
+ }
96
+ }
97
+ }
98
+
99
+ // Dropped constraints
100
+ for (const [name, c] of mainByName) {
101
+ // Skip constraint clones on partitions - they are automatically dropped when the parent constraint is dropped
102
+ if (c.is_partition_clone) {
103
+ continue;
104
+ }
105
+
106
+ if (!branchByName.has(name)) {
107
+ changes.push(
108
+ new AlterTableDropConstraint({ table: mainTable, constraint: c }),
109
+ );
110
+ }
111
+ }
112
+
113
+ // Altered constraints -> drop + add
114
+ for (const [name, mainC] of mainByName) {
115
+ const branchC = branchByName.get(name);
116
+ if (!branchC) continue;
117
+
118
+ // Skip constraint clones on partitions - they are automatically updated when the parent constraint is updated
119
+ if (mainC.is_partition_clone || branchC.is_partition_clone) {
120
+ continue;
121
+ }
122
+
123
+ const changed =
124
+ mainC.constraint_type !== branchC.constraint_type ||
125
+ mainC.deferrable !== branchC.deferrable ||
126
+ mainC.initially_deferred !== branchC.initially_deferred ||
127
+ mainC.validated !== branchC.validated ||
128
+ mainC.is_local !== branchC.is_local ||
129
+ mainC.no_inherit !== branchC.no_inherit ||
130
+ JSON.stringify(mainC.key_columns) !==
131
+ JSON.stringify(branchC.key_columns) ||
132
+ JSON.stringify(mainC.foreign_key_columns) !==
133
+ JSON.stringify(branchC.foreign_key_columns) ||
134
+ mainC.foreign_key_table !== branchC.foreign_key_table ||
135
+ mainC.foreign_key_schema !== branchC.foreign_key_schema ||
136
+ mainC.on_update !== branchC.on_update ||
137
+ mainC.on_delete !== branchC.on_delete ||
138
+ mainC.match_type !== branchC.match_type ||
139
+ mainC.check_expression !== branchC.check_expression;
140
+ if (changed) {
141
+ changes.push(
142
+ new AlterTableDropConstraint({
143
+ table: mainTable,
144
+ constraint: mainC,
145
+ }),
146
+ );
147
+ changes.push(
148
+ new AlterTableAddConstraint({
149
+ table: branchTable,
150
+ constraint: branchC,
151
+ }),
152
+ );
153
+ if (!branchC.validated) {
154
+ changes.push(
155
+ new AlterTableValidateConstraint({
156
+ table: branchTable,
157
+ constraint: branchC,
158
+ }),
159
+ );
160
+ }
161
+ // Ensure constraint comment is applied after re-creation
162
+ if (branchC.comment !== null) {
163
+ changes.push(
164
+ new CreateCommentOnConstraint({
165
+ table: branchTable,
166
+ constraint: branchC,
167
+ }),
168
+ );
169
+ }
170
+ } else {
171
+ // Comment-only change on constraint
172
+ if (mainC.comment !== branchC.comment) {
173
+ if (branchC.comment === null) {
174
+ changes.push(
175
+ new DropCommentOnConstraint({
176
+ table: mainTable,
177
+ constraint: mainC,
178
+ }),
179
+ );
180
+ } else {
181
+ changes.push(
182
+ new CreateCommentOnConstraint({
183
+ table: branchTable,
184
+ constraint: branchC,
185
+ }),
186
+ );
187
+ }
188
+ }
189
+ }
190
+ }
191
+
192
+ return changes;
193
+ }
194
+
195
+ /**
196
+ * Diff two sets of tables from main and branch catalogs.
197
+ *
198
+ * @param ctx - Context containing version, currentUser, and defaultPrivilegeState
199
+ * @param main - The tables in the main catalog.
200
+ * @param branch - The tables in the branch catalog.
201
+ * @returns A list of changes to apply to main to make it match branch.
202
+ */
203
+ export function diffTables(
204
+ ctx: Pick<
205
+ ObjectDiffContext,
206
+ "version" | "currentUser" | "defaultPrivilegeState"
207
+ >,
208
+ main: Record<string, Table>,
209
+ branch: Record<string, Table>,
210
+ ): TableChange[] {
211
+ const { created, dropped, altered } = diffObjects(main, branch);
212
+
213
+ const changes: TableChange[] = [];
214
+
215
+ for (const tableId of created) {
216
+ changes.push(new CreateTable({ table: branch[tableId] }));
217
+ const branchTable = branch[tableId];
218
+
219
+ // OWNER: If the table should be owned by someone other than the current user,
220
+ // emit ALTER TABLE ... OWNER TO after creation
221
+ if (branchTable.owner !== ctx.currentUser) {
222
+ changes.push(
223
+ new AlterTableChangeOwner({
224
+ table: branchTable,
225
+ owner: branchTable.owner,
226
+ }),
227
+ );
228
+ }
229
+
230
+ // ROW LEVEL SECURITY: If RLS should be enabled, emit ALTER TABLE ... ENABLE ROW LEVEL SECURITY
231
+ if (branchTable.row_security) {
232
+ changes.push(
233
+ new AlterTableEnableRowLevelSecurity({ table: branchTable }),
234
+ );
235
+ }
236
+
237
+ // FORCE ROW LEVEL SECURITY: If force RLS should be enabled, emit ALTER TABLE ... FORCE ROW LEVEL SECURITY
238
+ if (branchTable.force_row_security) {
239
+ changes.push(new AlterTableForceRowLevelSecurity({ table: branchTable }));
240
+ }
241
+
242
+ // REPLICA IDENTITY: If non-default, emit ALTER TABLE ... REPLICA IDENTITY
243
+ if (branchTable.replica_identity !== "d") {
244
+ // Skip 'i' (USING INDEX) — handled by index changes
245
+ if (branchTable.replica_identity !== "i") {
246
+ changes.push(
247
+ new AlterTableSetReplicaIdentity({
248
+ table: branchTable,
249
+ mode: branchTable.replica_identity,
250
+ }),
251
+ );
252
+ }
253
+ }
254
+
255
+ changes.push(
256
+ ...createAlterConstraintChange(
257
+ // Create a dummy table with no constraints do diff constraints against
258
+ new Table({
259
+ ...branchTable,
260
+ constraints: [],
261
+ }),
262
+ branchTable,
263
+ ),
264
+ );
265
+
266
+ // Table comment on creation
267
+ if (branchTable.comment !== null && branchTable.comment !== undefined) {
268
+ changes.push(new CreateCommentOnTable({ table: branchTable }));
269
+ }
270
+
271
+ // Column comments on creation
272
+ for (const col of branchTable.columns) {
273
+ if (col.comment !== null && col.comment !== undefined) {
274
+ changes.push(
275
+ new CreateCommentOnColumn({ table: branchTable, column: col }),
276
+ );
277
+ }
278
+ }
279
+
280
+ // PRIVILEGES: For created objects, compare against default privileges state
281
+ // The migration script will run ALTER DEFAULT PRIVILEGES before CREATE (via constraint spec),
282
+ // so objects are created with the default privileges state in effect.
283
+ // We compare default privileges against desired privileges to generate REVOKE/GRANT statements
284
+ // needed to reach the final desired state.
285
+ const effectiveDefaults = ctx.defaultPrivilegeState.getEffectiveDefaults(
286
+ ctx.currentUser,
287
+ "table",
288
+ branchTable.schema ?? "",
289
+ );
290
+ const creatorFilteredDefaults =
291
+ branchTable.owner !== ctx.currentUser
292
+ ? effectiveDefaults.filter((p) => p.grantee !== ctx.currentUser)
293
+ : effectiveDefaults;
294
+ const desiredPrivileges = branchTable.privileges;
295
+ // Filter out owner privileges - owner always has ALL privileges implicitly
296
+ // and shouldn't be compared. Use the table owner as the reference.
297
+ const privilegeResults = diffPrivileges(
298
+ creatorFilteredDefaults,
299
+ desiredPrivileges,
300
+ branchTable.owner,
301
+ );
302
+
303
+ changes.push(
304
+ ...(emitColumnPrivilegeChanges(
305
+ privilegeResults,
306
+ branchTable,
307
+ branchTable,
308
+ "table",
309
+ {
310
+ Grant: GrantTablePrivileges,
311
+ Revoke: RevokeTablePrivileges,
312
+ RevokeGrantOption: RevokeGrantOptionTablePrivileges,
313
+ },
314
+ effectiveDefaults,
315
+ ctx.version,
316
+ ) as TableChange[]),
317
+ );
318
+ }
319
+
320
+ for (const tableId of dropped) {
321
+ changes.push(new DropTable({ table: main[tableId] }));
322
+ }
323
+
324
+ for (const tableId of altered) {
325
+ const mainTable = main[tableId];
326
+ const branchTable = branch[tableId];
327
+
328
+ // Dangerous operations (drop+create) are not performed by this tool.
329
+ // Only emit safe ALTER statements below.
330
+ // Only alterable properties changed - check each one
331
+
332
+ // PERSISTENCE (LOGGED/UNLOGGED)
333
+ if (mainTable.persistence !== branchTable.persistence) {
334
+ if (branchTable.persistence === "u" && mainTable.persistence === "p") {
335
+ changes.push(new AlterTableSetUnlogged({ table: mainTable }));
336
+ } else if (
337
+ branchTable.persistence === "p" &&
338
+ mainTable.persistence === "u"
339
+ ) {
340
+ changes.push(new AlterTableSetLogged({ table: mainTable }));
341
+ }
342
+ }
343
+
344
+ // ROW LEVEL SECURITY
345
+ if (mainTable.row_security !== branchTable.row_security) {
346
+ if (branchTable.row_security) {
347
+ changes.push(
348
+ new AlterTableEnableRowLevelSecurity({ table: mainTable }),
349
+ );
350
+ } else {
351
+ changes.push(
352
+ new AlterTableDisableRowLevelSecurity({ table: mainTable }),
353
+ );
354
+ }
355
+ }
356
+
357
+ // FORCE ROW LEVEL SECURITY
358
+ if (mainTable.force_row_security !== branchTable.force_row_security) {
359
+ if (branchTable.force_row_security) {
360
+ changes.push(new AlterTableForceRowLevelSecurity({ table: mainTable }));
361
+ } else {
362
+ changes.push(
363
+ new AlterTableNoForceRowLevelSecurity({ table: mainTable }),
364
+ );
365
+ }
366
+ }
367
+
368
+ // STORAGE PARAMS (WITH (...))
369
+ if (!deepEqual(mainTable.options, branchTable.options)) {
370
+ const mainOpts = mainTable.options ?? [];
371
+ const branchOpts = branchTable.options ?? [];
372
+
373
+ // Always set branch options when provided
374
+ if (branchOpts.length > 0) {
375
+ changes.push(
376
+ new AlterTableSetStorageParams({
377
+ table: mainTable,
378
+ options: branchOpts,
379
+ }),
380
+ );
381
+ }
382
+
383
+ // Reset any params that are present in main but absent in branch
384
+ if (mainOpts.length > 0) {
385
+ const mainNames = new Set(mainOpts.map((opt) => opt.split("=")[0]));
386
+ const branchNames = new Set(branchOpts.map((opt) => opt.split("=")[0]));
387
+ const removed: string[] = [];
388
+ for (const name of mainNames) {
389
+ if (!branchNames.has(name)) removed.push(name);
390
+ }
391
+ if (removed.length > 0) {
392
+ changes.push(
393
+ new AlterTableResetStorageParams({
394
+ table: mainTable,
395
+ params: removed,
396
+ }),
397
+ );
398
+ }
399
+ }
400
+ }
401
+
402
+ // REPLICA IDENTITY
403
+ if (mainTable.replica_identity !== branchTable.replica_identity) {
404
+ // Skip when target is 'i' (USING INDEX) — handled by index changes
405
+ if (branchTable.replica_identity !== "i") {
406
+ changes.push(
407
+ new AlterTableSetReplicaIdentity({
408
+ table: mainTable,
409
+ mode: branchTable.replica_identity,
410
+ }),
411
+ );
412
+ }
413
+ }
414
+
415
+ // OWNER
416
+ if (mainTable.owner !== branchTable.owner) {
417
+ changes.push(
418
+ new AlterTableChangeOwner({
419
+ table: mainTable,
420
+ owner: branchTable.owner,
421
+ }),
422
+ );
423
+ }
424
+
425
+ // TABLE COMMENT (create/drop when comment changes)
426
+ if (mainTable.comment !== branchTable.comment) {
427
+ if (branchTable.comment === null) {
428
+ changes.push(new DropCommentOnTable({ table: mainTable }));
429
+ } else {
430
+ changes.push(new CreateCommentOnTable({ table: branchTable }));
431
+ }
432
+ }
433
+
434
+ // PARTITION ATTACH/DETACH
435
+ const mainIsPartition = Boolean(
436
+ mainTable.parent_schema && mainTable.parent_name,
437
+ );
438
+ const branchIsPartition = Boolean(
439
+ branchTable.parent_schema && branchTable.parent_name,
440
+ );
441
+
442
+ // Helper to resolve parent table from catalogs
443
+ const resolveParent = (
444
+ catalog: Record<string, Table>,
445
+ schema: string,
446
+ name: string,
447
+ ): Table | undefined => catalog[`table:${schema}.${name}`];
448
+
449
+ if (!mainIsPartition && branchIsPartition) {
450
+ const table = resolveParent(
451
+ branch,
452
+ branchTable.parent_schema as string,
453
+ branchTable.parent_name as string,
454
+ );
455
+ if (table) {
456
+ changes.push(
457
+ new AlterTableAttachPartition({ table, partition: branchTable }),
458
+ );
459
+ }
460
+ } else if (mainIsPartition && !branchIsPartition) {
461
+ const table = resolveParent(
462
+ main,
463
+ mainTable.parent_schema as string,
464
+ mainTable.parent_name as string,
465
+ );
466
+ if (table) {
467
+ changes.push(
468
+ new AlterTableDetachPartition({ table, partition: mainTable }),
469
+ );
470
+ }
471
+ } else if (mainIsPartition && branchIsPartition) {
472
+ const parentChanged =
473
+ mainTable.parent_schema !== branchTable.parent_schema ||
474
+ mainTable.parent_name !== branchTable.parent_name;
475
+ const boundChanged =
476
+ mainTable.partition_bound !== branchTable.partition_bound;
477
+ if (parentChanged || boundChanged) {
478
+ const oldParent = resolveParent(
479
+ main,
480
+ mainTable.parent_schema as string,
481
+ mainTable.parent_name as string,
482
+ );
483
+ if (oldParent) {
484
+ changes.push(
485
+ new AlterTableDetachPartition({
486
+ table: oldParent,
487
+ partition: mainTable,
488
+ }),
489
+ );
490
+ }
491
+ const newParent = resolveParent(
492
+ branch,
493
+ branchTable.parent_schema as string,
494
+ branchTable.parent_name as string,
495
+ );
496
+ if (newParent) {
497
+ changes.push(
498
+ new AlterTableAttachPartition({
499
+ table: newParent,
500
+ partition: branchTable,
501
+ }),
502
+ );
503
+ }
504
+ }
505
+ }
506
+
507
+ changes.push(...createAlterConstraintChange(mainTable, branchTable));
508
+
509
+ // COLUMNS
510
+ const mainCols = new Map(mainTable.columns.map((c) => [c.name, c]));
511
+ const branchCols = new Map(branchTable.columns.map((c) => [c.name, c]));
512
+
513
+ // Helper to get parent tables if this is a partition
514
+ // PostgreSQL automatically propagates column changes from parent to partitions,
515
+ // so we should skip changes on partitions when the parent has the same change
516
+ const getParentTables = (): {
517
+ parentMain: Table | null;
518
+ parentBranch: Table | null;
519
+ } => {
520
+ if (
521
+ !branchIsPartition ||
522
+ !branchTable.parent_schema ||
523
+ !branchTable.parent_name
524
+ ) {
525
+ return { parentMain: null, parentBranch: null };
526
+ }
527
+
528
+ const parentBranch = resolveParent(
529
+ branch,
530
+ branchTable.parent_schema,
531
+ branchTable.parent_name,
532
+ );
533
+ const parentMain = resolveParent(
534
+ main,
535
+ branchTable.parent_schema,
536
+ branchTable.parent_name,
537
+ );
538
+
539
+ return {
540
+ parentMain: parentMain ?? null,
541
+ parentBranch: parentBranch ?? null,
542
+ };
543
+ };
544
+
545
+ // Helper to check if parent has the same column property change
546
+ const parentHasSameColumnPropertyChange = (
547
+ columnName: string,
548
+ property: "type" | "default" | "not_null",
549
+ ): boolean => {
550
+ const { parentMain, parentBranch } = getParentTables();
551
+ if (!parentMain || !parentBranch) {
552
+ return false;
553
+ }
554
+
555
+ const parentMainCol = parentMain.columns.find(
556
+ (c) => c.name === columnName,
557
+ );
558
+ const parentBranchCol = parentBranch.columns.find(
559
+ (c) => c.name === columnName,
560
+ );
561
+ const branchCol = branchCols.get(columnName);
562
+ const mainCol = mainCols.get(columnName);
563
+
564
+ if (!parentMainCol || !parentBranchCol || !branchCol || !mainCol) {
565
+ return false;
566
+ }
567
+
568
+ switch (property) {
569
+ case "type": {
570
+ const parentTypeChanged =
571
+ parentMainCol.data_type_str !== parentBranchCol.data_type_str ||
572
+ parentMainCol.collation !== parentBranchCol.collation;
573
+ const partitionTypeChanged =
574
+ mainCol.data_type_str !== branchCol.data_type_str ||
575
+ mainCol.collation !== branchCol.collation;
576
+ return (
577
+ parentTypeChanged &&
578
+ partitionTypeChanged &&
579
+ parentBranchCol.data_type_str === branchCol.data_type_str &&
580
+ parentBranchCol.collation === branchCol.collation
581
+ );
582
+ }
583
+ case "default": {
584
+ const parentDefaultChanged =
585
+ parentMainCol.default !== parentBranchCol.default;
586
+ const partitionDefaultChanged = mainCol.default !== branchCol.default;
587
+ return (
588
+ parentDefaultChanged &&
589
+ partitionDefaultChanged &&
590
+ parentBranchCol.default === branchCol.default
591
+ );
592
+ }
593
+ case "not_null": {
594
+ const parentNotNullChanged =
595
+ parentMainCol.not_null !== parentBranchCol.not_null;
596
+ const partitionNotNullChanged =
597
+ mainCol.not_null !== branchCol.not_null;
598
+ return (
599
+ parentNotNullChanged &&
600
+ partitionNotNullChanged &&
601
+ parentBranchCol.not_null === branchCol.not_null
602
+ );
603
+ }
604
+ }
605
+ };
606
+
607
+ // Helper to check if parent has the same column add/drop
608
+ const shouldSkipColumnAddDropOnPartition = (
609
+ columnName: string,
610
+ changeType: "add" | "drop",
611
+ ): boolean => {
612
+ const { parentMain, parentBranch } = getParentTables();
613
+ if (!parentMain || !parentBranch) {
614
+ return false;
615
+ }
616
+
617
+ const parentMainHasCol = parentMain.columns.some(
618
+ (c) => c.name === columnName,
619
+ );
620
+ const parentBranchHasCol = parentBranch.columns.some(
621
+ (c) => c.name === columnName,
622
+ );
623
+
624
+ if (changeType === "add") {
625
+ // Check if parent also has this column added and final states match
626
+ if (!parentMainHasCol && parentBranchHasCol) {
627
+ const parentBranchCol = parentBranch.columns.find(
628
+ (c) => c.name === columnName,
629
+ );
630
+ const branchCol = branchCols.get(columnName);
631
+ return (
632
+ parentBranchCol !== undefined &&
633
+ branchCol !== undefined &&
634
+ parentBranchCol.data_type_str === branchCol.data_type_str &&
635
+ parentBranchCol.collation === branchCol.collation &&
636
+ parentBranchCol.default === branchCol.default &&
637
+ parentBranchCol.not_null === branchCol.not_null
638
+ );
639
+ }
640
+ } else {
641
+ // changeType === "drop"
642
+ // If parent is dropping the column, skip on partition
643
+ return parentMainHasCol && !parentBranchHasCol;
644
+ }
645
+
646
+ return false;
647
+ };
648
+
649
+ // Added columns
650
+ for (const [name, col] of branchCols) {
651
+ if (!mainCols.has(name)) {
652
+ // Skip if this is a partition and parent has the same column added
653
+ if (shouldSkipColumnAddDropOnPartition(name, "add")) {
654
+ continue;
655
+ }
656
+ changes.push(
657
+ new AlterTableAddColumn({ table: branchTable, column: col }),
658
+ );
659
+ if (col.comment !== null && col.comment !== undefined) {
660
+ changes.push(
661
+ new CreateCommentOnColumn({ table: branchTable, column: col }),
662
+ );
663
+ }
664
+ }
665
+ }
666
+
667
+ // Dropped columns
668
+ for (const [name, col] of mainCols) {
669
+ if (!branchCols.has(name)) {
670
+ // Skip if this is a partition and parent has the same column dropped
671
+ if (shouldSkipColumnAddDropOnPartition(name, "drop")) {
672
+ continue;
673
+ }
674
+ changes.push(
675
+ new AlterTableDropColumn({ table: mainTable, column: col }),
676
+ );
677
+ }
678
+ }
679
+
680
+ // Altered columns
681
+ for (const [name, mainCol] of mainCols) {
682
+ const branchCol = branchCols.get(name);
683
+ if (!branchCol) continue;
684
+
685
+ // TYPE or COLLATION change
686
+ if (
687
+ mainCol.data_type_str !== branchCol.data_type_str ||
688
+ mainCol.collation !== branchCol.collation
689
+ ) {
690
+ // Skip if parent has the same type/collation change
691
+ if (!parentHasSameColumnPropertyChange(name, "type")) {
692
+ changes.push(
693
+ new AlterTableAlterColumnType({
694
+ table: branchTable,
695
+ column: branchCol,
696
+ }),
697
+ );
698
+ }
699
+ }
700
+
701
+ // DEFAULT change
702
+ if (mainCol.default !== branchCol.default) {
703
+ // Skip if parent has the same default change
704
+ if (!parentHasSameColumnPropertyChange(name, "default")) {
705
+ if (branchCol.default === null) {
706
+ // Drop default value
707
+ changes.push(
708
+ new AlterTableAlterColumnDropDefault({
709
+ table: branchTable,
710
+ column: branchCol,
711
+ }),
712
+ );
713
+ } else {
714
+ // Set new default value
715
+ const isGeneratedColumn = branchCol.is_generated;
716
+ const isPostgresLowerThan17 = ctx.version < 170000;
717
+
718
+ if (isGeneratedColumn && isPostgresLowerThan17) {
719
+ // For generated columns in < PostgreSQL 17, we need to drop and recreate
720
+ // instead of using SET EXPRESSION AS for computed columns
721
+ // cf: https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5d06e99a3
722
+ // cf: https://www.postgresql.org/docs/release/17.0/
723
+ // > Allow ALTER TABLE to change a column's generation expression
724
+ changes.push(
725
+ new AlterTableDropColumn({
726
+ table: mainTable,
727
+ column: mainCol,
728
+ }),
729
+ );
730
+ changes.push(
731
+ new AlterTableAddColumn({
732
+ table: branchTable,
733
+ column: branchCol,
734
+ }),
735
+ );
736
+ } else {
737
+ // Use standard SET DEFAULT or SET EXPRESSION AS for newer PostgreSQL versions
738
+ changes.push(
739
+ new AlterTableAlterColumnSetDefault({
740
+ table: branchTable,
741
+ column: branchCol,
742
+ }),
743
+ );
744
+ }
745
+ }
746
+ }
747
+ }
748
+
749
+ // NOT NULL change
750
+ if (mainCol.not_null !== branchCol.not_null) {
751
+ // Skip if parent has the same NOT NULL change
752
+ if (!parentHasSameColumnPropertyChange(name, "not_null")) {
753
+ if (branchCol.not_null) {
754
+ changes.push(
755
+ new AlterTableAlterColumnSetNotNull({
756
+ table: branchTable,
757
+ column: branchCol,
758
+ }),
759
+ );
760
+ } else {
761
+ changes.push(
762
+ new AlterTableAlterColumnDropNotNull({
763
+ table: branchTable,
764
+ column: branchCol,
765
+ }),
766
+ );
767
+ }
768
+ }
769
+ }
770
+
771
+ // COMMENT change on column
772
+ // Note: Comments are NOT automatically propagated from parent to partitions,
773
+ // so we should NOT skip comment changes even if parent has the same change
774
+ if (mainCol.comment !== branchCol.comment) {
775
+ if (branchCol.comment === null) {
776
+ changes.push(
777
+ new DropCommentOnColumn({ table: mainTable, column: mainCol }),
778
+ );
779
+ } else {
780
+ changes.push(
781
+ new CreateCommentOnColumn({
782
+ table: branchTable,
783
+ column: branchCol,
784
+ }),
785
+ );
786
+ }
787
+ }
788
+ }
789
+
790
+ // PRIVILEGES (unified object and column privileges)
791
+ // Filter out owner privileges - owner always has ALL privileges implicitly
792
+ // and shouldn't be compared. Use branch owner as the reference.
793
+ const privilegeResults = diffPrivileges(
794
+ mainTable.privileges,
795
+ branchTable.privileges,
796
+ branchTable.owner,
797
+ );
798
+
799
+ changes.push(
800
+ ...(emitColumnPrivilegeChanges(
801
+ privilegeResults,
802
+ branchTable,
803
+ mainTable,
804
+ "table",
805
+ {
806
+ Grant: GrantTablePrivileges,
807
+ Revoke: RevokeTablePrivileges,
808
+ RevokeGrantOption: RevokeGrantOptionTablePrivileges,
809
+ },
810
+ mainTable.privileges,
811
+ ctx.version,
812
+ ) as TableChange[]),
813
+ );
814
+ }
815
+
816
+ return changes;
817
+ }