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

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 (463) hide show
  1. package/README.md +22 -0
  2. package/dist/cli/bin/cli.js +0 -0
  3. package/dist/cli/commands/plan.js +21 -0
  4. package/dist/cli/utils.d.ts +2 -0
  5. package/dist/cli/utils.js +1 -1
  6. package/dist/core/objects/table/table.model.d.ts +4 -2
  7. package/dist/core/objects/table/table.model.js +3 -0
  8. package/dist/core/objects/trigger/changes/trigger.alter.js +23 -0
  9. package/dist/core/objects/trigger/changes/trigger.create.js +2 -1
  10. package/dist/core/objects/trigger/trigger.model.d.ts +1 -0
  11. package/dist/core/objects/trigger/trigger.model.js +3 -0
  12. package/dist/core/plan/apply.js +3 -3
  13. package/dist/core/plan/create.js +34 -15
  14. package/dist/core/plan/sql-format/constants.d.ts +2 -0
  15. package/dist/core/plan/sql-format/constants.js +11 -0
  16. package/dist/core/plan/sql-format/fixtures.d.ts +2 -0
  17. package/dist/core/plan/sql-format/fixtures.js +2449 -0
  18. package/dist/core/plan/sql-format/format-utils.d.ts +37 -0
  19. package/dist/core/plan/sql-format/format-utils.js +274 -0
  20. package/dist/core/plan/sql-format/formatters.d.ts +20 -0
  21. package/dist/core/plan/sql-format/formatters.js +737 -0
  22. package/dist/core/plan/sql-format/index.d.ts +2 -0
  23. package/dist/core/plan/sql-format/index.js +98 -0
  24. package/dist/core/plan/sql-format/keyword-case.d.ts +2 -0
  25. package/dist/core/plan/sql-format/keyword-case.js +868 -0
  26. package/dist/core/plan/sql-format/protect.d.ts +3 -0
  27. package/dist/core/plan/sql-format/protect.js +269 -0
  28. package/dist/core/plan/sql-format/sql-scanner.d.ts +59 -0
  29. package/dist/core/plan/sql-format/sql-scanner.js +202 -0
  30. package/dist/core/plan/sql-format/tokenizer.d.ts +22 -0
  31. package/dist/core/plan/sql-format/tokenizer.js +118 -0
  32. package/dist/core/plan/sql-format/types.d.ts +28 -0
  33. package/dist/core/plan/sql-format/types.js +1 -0
  34. package/dist/core/plan/sql-format/wrap.d.ts +2 -0
  35. package/dist/core/plan/sql-format/wrap.js +165 -0
  36. package/dist/core/plan/sql-format.d.ts +2 -0
  37. package/dist/core/plan/sql-format.js +1 -0
  38. package/dist/core/plan/statements.d.ts +2 -1
  39. package/dist/core/plan/statements.js +6 -2
  40. package/dist/core/postgres-config.d.ts +15 -0
  41. package/dist/core/postgres-config.js +30 -0
  42. package/dist/index.d.ts +2 -0
  43. package/dist/index.js +1 -0
  44. package/package.json +37 -22
  45. package/src/cli/app.ts +28 -0
  46. package/src/cli/bin/cli.ts +9 -0
  47. package/src/cli/commands/apply.ts +101 -0
  48. package/src/cli/commands/plan.ts +195 -0
  49. package/src/cli/commands/sync.ts +185 -0
  50. package/src/cli/formatters/index.ts +5 -0
  51. package/src/cli/formatters/tree/tree-builder.ts +380 -0
  52. package/src/cli/formatters/tree/tree-renderer.ts +372 -0
  53. package/src/cli/formatters/tree/tree.ts +237 -0
  54. package/src/cli/utils/integrations.ts +42 -0
  55. package/src/cli/utils.ts +231 -0
  56. package/src/core/catalog.diff.ts +246 -0
  57. package/src/core/catalog.model.ts +384 -0
  58. package/src/core/change.types.ts +44 -0
  59. package/src/core/context.ts +26 -0
  60. package/src/core/depend.ts +1870 -0
  61. package/src/core/expand-replace-dependencies.ts +380 -0
  62. package/src/core/fingerprint.ts +204 -0
  63. package/src/core/integrations/filter/dsl.ts +204 -0
  64. package/src/core/integrations/filter/extractors.ts +145 -0
  65. package/src/core/integrations/filter/filter.types.ts +3 -0
  66. package/src/core/integrations/integration-dsl.ts +24 -0
  67. package/src/core/integrations/integration.types.ts +7 -0
  68. package/src/core/integrations/serialize/dsl.ts +77 -0
  69. package/src/core/integrations/serialize/serialize.types.ts +3 -0
  70. package/src/core/integrations/supabase.ts +121 -0
  71. package/src/core/objects/aggregate/aggregate.diff.test.ts +215 -0
  72. package/src/core/objects/aggregate/aggregate.diff.ts +278 -0
  73. package/src/core/objects/aggregate/aggregate.model.ts +317 -0
  74. package/src/core/objects/aggregate/changes/aggregate.alter.test.ts +64 -0
  75. package/src/core/objects/aggregate/changes/aggregate.alter.ts +32 -0
  76. package/src/core/objects/aggregate/changes/aggregate.base.ts +20 -0
  77. package/src/core/objects/aggregate/changes/aggregate.comment.test.ts +86 -0
  78. package/src/core/objects/aggregate/changes/aggregate.comment.ts +62 -0
  79. package/src/core/objects/aggregate/changes/aggregate.create.test.ts +101 -0
  80. package/src/core/objects/aggregate/changes/aggregate.create.ts +329 -0
  81. package/src/core/objects/aggregate/changes/aggregate.drop.test.ts +78 -0
  82. package/src/core/objects/aggregate/changes/aggregate.drop.ts +32 -0
  83. package/src/core/objects/aggregate/changes/aggregate.privilege.test.ts +130 -0
  84. package/src/core/objects/aggregate/changes/aggregate.privilege.ts +146 -0
  85. package/src/core/objects/aggregate/changes/aggregate.types.ts +12 -0
  86. package/src/core/objects/base.change.ts +62 -0
  87. package/src/core/objects/base.default-privileges.ts +204 -0
  88. package/src/core/objects/base.diff.ts +20 -0
  89. package/src/core/objects/base.model.ts +82 -0
  90. package/src/core/objects/base.privilege-diff.ts +299 -0
  91. package/src/core/objects/base.privilege.ts +184 -0
  92. package/src/core/objects/collation/changes/collation.alter.test.ts +63 -0
  93. package/src/core/objects/collation/changes/collation.alter.ts +79 -0
  94. package/src/core/objects/collation/changes/collation.base.ts +20 -0
  95. package/src/core/objects/collation/changes/collation.comment.ts +68 -0
  96. package/src/core/objects/collation/changes/collation.create.test.ts +51 -0
  97. package/src/core/objects/collation/changes/collation.create.ts +106 -0
  98. package/src/core/objects/collation/changes/collation.drop.test.ts +28 -0
  99. package/src/core/objects/collation/changes/collation.drop.ts +37 -0
  100. package/src/core/objects/collation/changes/collation.types.ts +10 -0
  101. package/src/core/objects/collation/collation.diff.test.ts +100 -0
  102. package/src/core/objects/collation/collation.diff.ts +126 -0
  103. package/src/core/objects/collation/collation.model.ts +224 -0
  104. package/src/core/objects/domain/changes/domain.alter.test.ts +316 -0
  105. package/src/core/objects/domain/changes/domain.alter.ts +286 -0
  106. package/src/core/objects/domain/changes/domain.base.ts +20 -0
  107. package/src/core/objects/domain/changes/domain.comment.ts +59 -0
  108. package/src/core/objects/domain/changes/domain.create.test.ts +65 -0
  109. package/src/core/objects/domain/changes/domain.create.ts +118 -0
  110. package/src/core/objects/domain/changes/domain.drop.test.ts +30 -0
  111. package/src/core/objects/domain/changes/domain.drop.ts +34 -0
  112. package/src/core/objects/domain/changes/domain.privilege.ts +171 -0
  113. package/src/core/objects/domain/changes/domain.types.ts +12 -0
  114. package/src/core/objects/domain/domain.diff.test.ts +284 -0
  115. package/src/core/objects/domain/domain.diff.ts +358 -0
  116. package/src/core/objects/domain/domain.model.ts +190 -0
  117. package/src/core/objects/event-trigger/changes/event-trigger.alter.test.ts +50 -0
  118. package/src/core/objects/event-trigger/changes/event-trigger.alter.ts +82 -0
  119. package/src/core/objects/event-trigger/changes/event-trigger.base.ts +20 -0
  120. package/src/core/objects/event-trigger/changes/event-trigger.comment.ts +66 -0
  121. package/src/core/objects/event-trigger/changes/event-trigger.create.test.ts +24 -0
  122. package/src/core/objects/event-trigger/changes/event-trigger.create.ts +72 -0
  123. package/src/core/objects/event-trigger/changes/event-trigger.drop.test.ts +22 -0
  124. package/src/core/objects/event-trigger/changes/event-trigger.drop.ts +34 -0
  125. package/src/core/objects/event-trigger/changes/event-trigger.types.ts +10 -0
  126. package/src/core/objects/event-trigger/event-trigger.diff.test.ts +126 -0
  127. package/src/core/objects/event-trigger/event-trigger.diff.ts +126 -0
  128. package/src/core/objects/event-trigger/event-trigger.model.ts +106 -0
  129. package/src/core/objects/extension/changes/extension.alter.test.ts +58 -0
  130. package/src/core/objects/extension/changes/extension.alter.ts +78 -0
  131. package/src/core/objects/extension/changes/extension.base.ts +20 -0
  132. package/src/core/objects/extension/changes/extension.comment.ts +64 -0
  133. package/src/core/objects/extension/changes/extension.create.test.ts +25 -0
  134. package/src/core/objects/extension/changes/extension.create.ts +63 -0
  135. package/src/core/objects/extension/changes/extension.drop.test.ts +23 -0
  136. package/src/core/objects/extension/changes/extension.drop.ts +34 -0
  137. package/src/core/objects/extension/changes/extension.types.ts +10 -0
  138. package/src/core/objects/extension/extension.diff.test.ts +42 -0
  139. package/src/core/objects/extension/extension.diff.ts +90 -0
  140. package/src/core/objects/extension/extension.model.ts +280 -0
  141. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.test.ts +125 -0
  142. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.ts +101 -0
  143. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.ts +20 -0
  144. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.ts +72 -0
  145. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.test.ts +125 -0
  146. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.ts +95 -0
  147. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.test.ts +23 -0
  148. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.ts +36 -0
  149. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.ts +172 -0
  150. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.ts +12 -0
  151. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.test.ts +179 -0
  152. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.ts +341 -0
  153. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.ts +149 -0
  154. package/src/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.ts +10 -0
  155. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.test.ts +309 -0
  156. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.ts +341 -0
  157. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.ts +20 -0
  158. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.ts +72 -0
  159. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.test.ts +201 -0
  160. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.ts +81 -0
  161. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.test.ts +43 -0
  162. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.ts +37 -0
  163. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.ts +181 -0
  164. package/src/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.ts +12 -0
  165. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.test.ts +813 -0
  166. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.ts +406 -0
  167. package/src/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.ts +242 -0
  168. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.test.ts +168 -0
  169. package/src/core/objects/foreign-data-wrapper/server/changes/server.alter.ts +126 -0
  170. package/src/core/objects/foreign-data-wrapper/server/changes/server.base.ts +20 -0
  171. package/src/core/objects/foreign-data-wrapper/server/changes/server.comment.ts +60 -0
  172. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.test.ts +131 -0
  173. package/src/core/objects/foreign-data-wrapper/server/changes/server.create.ts +81 -0
  174. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.test.ts +24 -0
  175. package/src/core/objects/foreign-data-wrapper/server/changes/server.drop.ts +34 -0
  176. package/src/core/objects/foreign-data-wrapper/server/changes/server.privilege.ts +164 -0
  177. package/src/core/objects/foreign-data-wrapper/server/changes/server.types.ts +12 -0
  178. package/src/core/objects/foreign-data-wrapper/server/server.diff.test.ts +167 -0
  179. package/src/core/objects/foreign-data-wrapper/server/server.diff.ts +317 -0
  180. package/src/core/objects/foreign-data-wrapper/server/server.model.ts +133 -0
  181. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.test.ts +82 -0
  182. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.ts +69 -0
  183. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.ts +20 -0
  184. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.test.ts +85 -0
  185. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.ts +66 -0
  186. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.test.ts +53 -0
  187. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.ts +40 -0
  188. package/src/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.ts +8 -0
  189. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.test.ts +77 -0
  190. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.ts +107 -0
  191. package/src/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.ts +96 -0
  192. package/src/core/objects/index/changes/index.alter.test.ts +200 -0
  193. package/src/core/objects/index/changes/index.alter.ts +144 -0
  194. package/src/core/objects/index/changes/index.base.ts +20 -0
  195. package/src/core/objects/index/changes/index.comment.ts +63 -0
  196. package/src/core/objects/index/changes/index.create.test.ts +66 -0
  197. package/src/core/objects/index/changes/index.create.ts +68 -0
  198. package/src/core/objects/index/changes/index.drop.test.ts +44 -0
  199. package/src/core/objects/index/changes/index.drop.ts +34 -0
  200. package/src/core/objects/index/changes/index.types.ts +6 -0
  201. package/src/core/objects/index/changes/utils.ts +16 -0
  202. package/src/core/objects/index/index.diff.test.ts +153 -0
  203. package/src/core/objects/index/index.diff.ts +243 -0
  204. package/src/core/objects/index/index.model.ts +370 -0
  205. package/src/core/objects/language/changes/language.alter.test.ts +33 -0
  206. package/src/core/objects/language/changes/language.alter.ts +53 -0
  207. package/src/core/objects/language/changes/language.base.ts +20 -0
  208. package/src/core/objects/language/changes/language.comment.ts +58 -0
  209. package/src/core/objects/language/changes/language.create.test.ts +27 -0
  210. package/src/core/objects/language/changes/language.create.ts +104 -0
  211. package/src/core/objects/language/changes/language.drop.test.ts +25 -0
  212. package/src/core/objects/language/changes/language.drop.ts +39 -0
  213. package/src/core/objects/language/changes/language.privilege.ts +172 -0
  214. package/src/core/objects/language/changes/language.types.ts +12 -0
  215. package/src/core/objects/language/language.diff.test.ts +53 -0
  216. package/src/core/objects/language/language.diff.ts +176 -0
  217. package/src/core/objects/language/language.model.ts +150 -0
  218. package/src/core/objects/materialized-view/changes/materialized-view.alter.test.ts +123 -0
  219. package/src/core/objects/materialized-view/changes/materialized-view.alter.ts +113 -0
  220. package/src/core/objects/materialized-view/changes/materialized-view.base.ts +20 -0
  221. package/src/core/objects/materialized-view/changes/materialized-view.comment.ts +176 -0
  222. package/src/core/objects/materialized-view/changes/materialized-view.create.test.ts +64 -0
  223. package/src/core/objects/materialized-view/changes/materialized-view.create.ts +93 -0
  224. package/src/core/objects/materialized-view/changes/materialized-view.drop.test.ts +34 -0
  225. package/src/core/objects/materialized-view/changes/materialized-view.drop.ts +60 -0
  226. package/src/core/objects/materialized-view/changes/materialized-view.privilege.ts +212 -0
  227. package/src/core/objects/materialized-view/changes/materialized-view.types.ts +12 -0
  228. package/src/core/objects/materialized-view/materialized-view.diff.test.ts +102 -0
  229. package/src/core/objects/materialized-view/materialized-view.diff.ts +451 -0
  230. package/src/core/objects/materialized-view/materialized-view.model.ts +258 -0
  231. package/src/core/objects/procedure/changes/procedure.alter.test.ts +1005 -0
  232. package/src/core/objects/procedure/changes/procedure.alter.ts +287 -0
  233. package/src/core/objects/procedure/changes/procedure.base.ts +20 -0
  234. package/src/core/objects/procedure/changes/procedure.comment.ts +70 -0
  235. package/src/core/objects/procedure/changes/procedure.create.test.ts +48 -0
  236. package/src/core/objects/procedure/changes/procedure.create.ts +92 -0
  237. package/src/core/objects/procedure/changes/procedure.drop.test.ts +85 -0
  238. package/src/core/objects/procedure/changes/procedure.drop.ts +49 -0
  239. package/src/core/objects/procedure/changes/procedure.privilege.ts +188 -0
  240. package/src/core/objects/procedure/changes/procedure.types.ts +12 -0
  241. package/src/core/objects/procedure/procedure.diff.test.ts +161 -0
  242. package/src/core/objects/procedure/procedure.diff.ts +404 -0
  243. package/src/core/objects/procedure/procedure.model.ts +264 -0
  244. package/src/core/objects/procedure/utils.ts +58 -0
  245. package/src/core/objects/publication/changes/publication.alter.test.ts +223 -0
  246. package/src/core/objects/publication/changes/publication.alter.ts +243 -0
  247. package/src/core/objects/publication/changes/publication.base.ts +20 -0
  248. package/src/core/objects/publication/changes/publication.comment.test.ts +70 -0
  249. package/src/core/objects/publication/changes/publication.comment.ts +64 -0
  250. package/src/core/objects/publication/changes/publication.create.test.ts +87 -0
  251. package/src/core/objects/publication/changes/publication.create.ts +82 -0
  252. package/src/core/objects/publication/changes/publication.drop.test.ts +46 -0
  253. package/src/core/objects/publication/changes/publication.drop.ts +29 -0
  254. package/src/core/objects/publication/changes/publication.types.ts +26 -0
  255. package/src/core/objects/publication/publication.diff.test.ts +292 -0
  256. package/src/core/objects/publication/publication.diff.ts +253 -0
  257. package/src/core/objects/publication/publication.model.ts +206 -0
  258. package/src/core/objects/publication/utils.ts +55 -0
  259. package/src/core/objects/rls-policy/changes/rls-policy.alter.test.ts +250 -0
  260. package/src/core/objects/rls-policy/changes/rls-policy.alter.ts +128 -0
  261. package/src/core/objects/rls-policy/changes/rls-policy.base.ts +20 -0
  262. package/src/core/objects/rls-policy/changes/rls-policy.comment.ts +69 -0
  263. package/src/core/objects/rls-policy/changes/rls-policy.create.test.ts +74 -0
  264. package/src/core/objects/rls-policy/changes/rls-policy.create.ts +100 -0
  265. package/src/core/objects/rls-policy/changes/rls-policy.drop.test.ts +28 -0
  266. package/src/core/objects/rls-policy/changes/rls-policy.drop.ts +39 -0
  267. package/src/core/objects/rls-policy/changes/rls-policy.types.ts +10 -0
  268. package/src/core/objects/rls-policy/rls-policy.diff.test.ts +79 -0
  269. package/src/core/objects/rls-policy/rls-policy.diff.ts +121 -0
  270. package/src/core/objects/rls-policy/rls-policy.model.ts +140 -0
  271. package/src/core/objects/role/changes/role.alter.test.ts +346 -0
  272. package/src/core/objects/role/changes/role.alter.ts +110 -0
  273. package/src/core/objects/role/changes/role.base.ts +24 -0
  274. package/src/core/objects/role/changes/role.comment.ts +55 -0
  275. package/src/core/objects/role/changes/role.create.test.ts +52 -0
  276. package/src/core/objects/role/changes/role.create.ts +102 -0
  277. package/src/core/objects/role/changes/role.drop.test.ts +29 -0
  278. package/src/core/objects/role/changes/role.drop.ts +34 -0
  279. package/src/core/objects/role/changes/role.privilege.ts +376 -0
  280. package/src/core/objects/role/changes/role.types.ts +12 -0
  281. package/src/core/objects/role/role.diff.test.ts +44 -0
  282. package/src/core/objects/role/role.diff.ts +479 -0
  283. package/src/core/objects/role/role.model.ts +344 -0
  284. package/src/core/objects/rule/changes/rule.alter.test.ts +78 -0
  285. package/src/core/objects/rule/changes/rule.alter.ts +72 -0
  286. package/src/core/objects/rule/changes/rule.base.ts +20 -0
  287. package/src/core/objects/rule/changes/rule.comment.test.ts +55 -0
  288. package/src/core/objects/rule/changes/rule.comment.ts +62 -0
  289. package/src/core/objects/rule/changes/rule.create.test.ts +59 -0
  290. package/src/core/objects/rule/changes/rule.create.ts +42 -0
  291. package/src/core/objects/rule/changes/rule.drop.test.ts +38 -0
  292. package/src/core/objects/rule/changes/rule.drop.ts +29 -0
  293. package/src/core/objects/rule/changes/rule.types.ts +12 -0
  294. package/src/core/objects/rule/rule.diff.test.ts +132 -0
  295. package/src/core/objects/rule/rule.diff.ts +79 -0
  296. package/src/core/objects/rule/rule.model.ts +173 -0
  297. package/src/core/objects/schema/changes/schema.alter.test.ts +28 -0
  298. package/src/core/objects/schema/changes/schema.alter.ts +45 -0
  299. package/src/core/objects/schema/changes/schema.base.ts +20 -0
  300. package/src/core/objects/schema/changes/schema.comment.ts +56 -0
  301. package/src/core/objects/schema/changes/schema.create.test.ts +22 -0
  302. package/src/core/objects/schema/changes/schema.create.ts +47 -0
  303. package/src/core/objects/schema/changes/schema.drop.test.ts +20 -0
  304. package/src/core/objects/schema/changes/schema.drop.ts +34 -0
  305. package/src/core/objects/schema/changes/schema.privilege.ts +175 -0
  306. package/src/core/objects/schema/changes/schema.types.ts +12 -0
  307. package/src/core/objects/schema/schema.diff.test.ts +42 -0
  308. package/src/core/objects/schema/schema.diff.ts +209 -0
  309. package/src/core/objects/schema/schema.model.ts +107 -0
  310. package/src/core/objects/sequence/changes/sequence.alter.test.ts +151 -0
  311. package/src/core/objects/sequence/changes/sequence.alter.ts +115 -0
  312. package/src/core/objects/sequence/changes/sequence.base.ts +20 -0
  313. package/src/core/objects/sequence/changes/sequence.comment.ts +60 -0
  314. package/src/core/objects/sequence/changes/sequence.create.test.ts +84 -0
  315. package/src/core/objects/sequence/changes/sequence.create.ts +111 -0
  316. package/src/core/objects/sequence/changes/sequence.drop.test.ts +32 -0
  317. package/src/core/objects/sequence/changes/sequence.drop.ts +37 -0
  318. package/src/core/objects/sequence/changes/sequence.privilege.ts +179 -0
  319. package/src/core/objects/sequence/changes/sequence.types.ts +12 -0
  320. package/src/core/objects/sequence/sequence.diff.test.ts +141 -0
  321. package/src/core/objects/sequence/sequence.diff.ts +359 -0
  322. package/src/core/objects/sequence/sequence.model.ts +185 -0
  323. package/src/core/objects/subscription/changes/subscription.alter.test.ts +124 -0
  324. package/src/core/objects/subscription/changes/subscription.alter.ts +110 -0
  325. package/src/core/objects/subscription/changes/subscription.base.ts +20 -0
  326. package/src/core/objects/subscription/changes/subscription.comment.test.ts +67 -0
  327. package/src/core/objects/subscription/changes/subscription.comment.ts +64 -0
  328. package/src/core/objects/subscription/changes/subscription.create.test.ts +77 -0
  329. package/src/core/objects/subscription/changes/subscription.create.ts +69 -0
  330. package/src/core/objects/subscription/changes/subscription.drop.test.ts +46 -0
  331. package/src/core/objects/subscription/changes/subscription.drop.ts +20 -0
  332. package/src/core/objects/subscription/changes/subscription.types.ts +22 -0
  333. package/src/core/objects/subscription/subscription.diff.test.ts +232 -0
  334. package/src/core/objects/subscription/subscription.diff.ts +241 -0
  335. package/src/core/objects/subscription/subscription.model.ts +190 -0
  336. package/src/core/objects/subscription/utils.ts +156 -0
  337. package/src/core/objects/table/changes/table.alter.test.ts +823 -0
  338. package/src/core/objects/table/changes/table.alter.ts +806 -0
  339. package/src/core/objects/table/changes/table.base.ts +20 -0
  340. package/src/core/objects/table/changes/table.comment.ts +266 -0
  341. package/src/core/objects/table/changes/table.create.test.ts +150 -0
  342. package/src/core/objects/table/changes/table.create.ts +188 -0
  343. package/src/core/objects/table/changes/table.drop.test.ts +34 -0
  344. package/src/core/objects/table/changes/table.drop.ts +45 -0
  345. package/src/core/objects/table/changes/table.privilege.ts +200 -0
  346. package/src/core/objects/table/changes/table.types.ts +12 -0
  347. package/src/core/objects/table/table.diff.test.ts +711 -0
  348. package/src/core/objects/table/table.diff.ts +953 -0
  349. package/src/core/objects/table/table.model.ts +460 -0
  350. package/src/core/objects/trigger/changes/trigger.alter.test.ts +46 -0
  351. package/src/core/objects/trigger/changes/trigger.alter.ts +76 -0
  352. package/src/core/objects/trigger/changes/trigger.base.ts +20 -0
  353. package/src/core/objects/trigger/changes/trigger.comment.ts +64 -0
  354. package/src/core/objects/trigger/changes/trigger.create.test.ts +43 -0
  355. package/src/core/objects/trigger/changes/trigger.create.ts +85 -0
  356. package/src/core/objects/trigger/changes/trigger.drop.test.ts +43 -0
  357. package/src/core/objects/trigger/changes/trigger.drop.ts +39 -0
  358. package/src/core/objects/trigger/changes/trigger.types.ts +10 -0
  359. package/src/core/objects/trigger/trigger.diff.test.ts +83 -0
  360. package/src/core/objects/trigger/trigger.diff.ts +116 -0
  361. package/src/core/objects/trigger/trigger.model.ts +252 -0
  362. package/src/core/objects/type/composite-type/changes/composite-type.alter.test.ts +202 -0
  363. package/src/core/objects/type/composite-type/changes/composite-type.alter.ts +174 -0
  364. package/src/core/objects/type/composite-type/changes/composite-type.base.ts +20 -0
  365. package/src/core/objects/type/composite-type/changes/composite-type.comment.ts +145 -0
  366. package/src/core/objects/type/composite-type/changes/composite-type.create.test.ts +101 -0
  367. package/src/core/objects/type/composite-type/changes/composite-type.create.ts +95 -0
  368. package/src/core/objects/type/composite-type/changes/composite-type.drop.test.ts +33 -0
  369. package/src/core/objects/type/composite-type/changes/composite-type.drop.ts +37 -0
  370. package/src/core/objects/type/composite-type/changes/composite-type.privilege.ts +175 -0
  371. package/src/core/objects/type/composite-type/changes/composite-type.types.ts +12 -0
  372. package/src/core/objects/type/composite-type/composite-type.diff.test.ts +191 -0
  373. package/src/core/objects/type/composite-type/composite-type.diff.ts +372 -0
  374. package/src/core/objects/type/composite-type/composite-type.model.ts +252 -0
  375. package/src/core/objects/type/enum/changes/enum.alter.test.ts +104 -0
  376. package/src/core/objects/type/enum/changes/enum.alter.ts +91 -0
  377. package/src/core/objects/type/enum/changes/enum.base.ts +20 -0
  378. package/src/core/objects/type/enum/changes/enum.comment.ts +64 -0
  379. package/src/core/objects/type/enum/changes/enum.create.test.ts +28 -0
  380. package/src/core/objects/type/enum/changes/enum.create.ts +56 -0
  381. package/src/core/objects/type/enum/changes/enum.drop.test.ts +25 -0
  382. package/src/core/objects/type/enum/changes/enum.drop.ts +34 -0
  383. package/src/core/objects/type/enum/changes/enum.privilege.ts +175 -0
  384. package/src/core/objects/type/enum/changes/enum.types.ts +12 -0
  385. package/src/core/objects/type/enum/enum.diff.test.ts +191 -0
  386. package/src/core/objects/type/enum/enum.diff.ts +396 -0
  387. package/src/core/objects/type/enum/enum.model.ts +194 -0
  388. package/src/core/objects/type/range/changes/range.alter.test.ts +27 -0
  389. package/src/core/objects/type/range/changes/range.alter.ts +51 -0
  390. package/src/core/objects/type/range/changes/range.base.ts +20 -0
  391. package/src/core/objects/type/range/changes/range.comment.ts +64 -0
  392. package/src/core/objects/type/range/changes/range.create.test.ts +51 -0
  393. package/src/core/objects/type/range/changes/range.create.ts +151 -0
  394. package/src/core/objects/type/range/changes/range.drop.test.ts +26 -0
  395. package/src/core/objects/type/range/changes/range.drop.ts +34 -0
  396. package/src/core/objects/type/range/changes/range.privilege.ts +175 -0
  397. package/src/core/objects/type/range/changes/range.types.ts +12 -0
  398. package/src/core/objects/type/range/range.diff.test.ts +70 -0
  399. package/src/core/objects/type/range/range.diff.ts +259 -0
  400. package/src/core/objects/type/range/range.model.ts +187 -0
  401. package/src/core/objects/type/type.types.ts +5 -0
  402. package/src/core/objects/utils.ts +171 -0
  403. package/src/core/objects/view/changes/view.alter.test.ts +110 -0
  404. package/src/core/objects/view/changes/view.alter.ts +112 -0
  405. package/src/core/objects/view/changes/view.base.ts +20 -0
  406. package/src/core/objects/view/changes/view.comment.ts +59 -0
  407. package/src/core/objects/view/changes/view.create.test.ts +65 -0
  408. package/src/core/objects/view/changes/view.create.ts +73 -0
  409. package/src/core/objects/view/changes/view.drop.test.ts +34 -0
  410. package/src/core/objects/view/changes/view.drop.ts +40 -0
  411. package/src/core/objects/view/changes/view.privilege.ts +200 -0
  412. package/src/core/objects/view/changes/view.types.ts +12 -0
  413. package/src/core/objects/view/view.diff.test.ts +91 -0
  414. package/src/core/objects/view/view.diff.ts +365 -0
  415. package/src/core/objects/view/view.model.ts +276 -0
  416. package/src/core/plan/apply.ts +190 -0
  417. package/src/core/plan/create.ts +432 -0
  418. package/src/core/plan/hierarchy.ts +574 -0
  419. package/src/core/plan/index.ts +29 -0
  420. package/src/core/plan/io.ts +20 -0
  421. package/src/core/plan/risk.ts +48 -0
  422. package/src/core/plan/serialize.ts +195 -0
  423. package/src/core/plan/sql-format/constants.ts +13 -0
  424. package/src/core/plan/sql-format/fixtures.ts +2806 -0
  425. package/src/core/plan/sql-format/format-comment-literals.test.ts +96 -0
  426. package/src/core/plan/sql-format/format-functions.test.ts +127 -0
  427. package/src/core/plan/sql-format/format-lowercase-coverage.test.ts +67 -0
  428. package/src/core/plan/sql-format/format-off.test.ts +809 -0
  429. package/src/core/plan/sql-format/format-pretty-lower-leading.test.ts +1056 -0
  430. package/src/core/plan/sql-format/format-pretty-narrow.test.ts +1283 -0
  431. package/src/core/plan/sql-format/format-pretty-preserve.test.ts +1052 -0
  432. package/src/core/plan/sql-format/format-pretty-upper.test.ts +1045 -0
  433. package/src/core/plan/sql-format/format-stress.test.ts +616 -0
  434. package/src/core/plan/sql-format/format-utils.test.ts +91 -0
  435. package/src/core/plan/sql-format/format-utils.ts +391 -0
  436. package/src/core/plan/sql-format/formatters.ts +921 -0
  437. package/src/core/plan/sql-format/index.ts +149 -0
  438. package/src/core/plan/sql-format/keyword-case.test.ts +118 -0
  439. package/src/core/plan/sql-format/keyword-case.ts +1085 -0
  440. package/src/core/plan/sql-format/protect.test.ts +127 -0
  441. package/src/core/plan/sql-format/protect.ts +337 -0
  442. package/src/core/plan/sql-format/sql-scanner.test.ts +240 -0
  443. package/src/core/plan/sql-format/sql-scanner.ts +252 -0
  444. package/src/core/plan/sql-format/tokenizer.test.ts +68 -0
  445. package/src/core/plan/sql-format/tokenizer.ts +152 -0
  446. package/src/core/plan/sql-format/types.ts +31 -0
  447. package/src/core/plan/sql-format/wrap.test.ts +119 -0
  448. package/src/core/plan/sql-format/wrap.ts +196 -0
  449. package/src/core/plan/sql-format.ts +2 -0
  450. package/src/core/plan/statements.ts +22 -0
  451. package/src/core/plan/types.ts +165 -0
  452. package/src/core/postgres-config.ts +169 -0
  453. package/src/core/sort/custom-constraints.ts +161 -0
  454. package/src/core/sort/debug-visualization.ts +239 -0
  455. package/src/core/sort/dependency-filter.ts +224 -0
  456. package/src/core/sort/graph-builder.ts +223 -0
  457. package/src/core/sort/graph-utils.ts +51 -0
  458. package/src/core/sort/logical-sort.ts +590 -0
  459. package/src/core/sort/sort-changes.ts +234 -0
  460. package/src/core/sort/topological-sort.ts +184 -0
  461. package/src/core/sort/types.ts +112 -0
  462. package/src/core/sort/utils.ts +69 -0
  463. package/src/index.ts +14 -0
@@ -0,0 +1,309 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import {
3
+ ForeignTable,
4
+ type ForeignTableProps,
5
+ } from "../foreign-table.model.ts";
6
+ import {
7
+ AlterForeignTableAddColumn,
8
+ AlterForeignTableAlterColumnDropDefault,
9
+ AlterForeignTableAlterColumnDropNotNull,
10
+ AlterForeignTableAlterColumnSetDefault,
11
+ AlterForeignTableAlterColumnSetNotNull,
12
+ AlterForeignTableAlterColumnType,
13
+ AlterForeignTableChangeOwner,
14
+ AlterForeignTableDropColumn,
15
+ AlterForeignTableSetOptions,
16
+ } from "./foreign-table.alter.ts";
17
+
18
+ describe.concurrent("foreign-table", () => {
19
+ describe("alter", () => {
20
+ const baseTableProps: ForeignTableProps = {
21
+ schema: "public",
22
+ name: "test_table",
23
+ owner: "test",
24
+ server: "test_server",
25
+ options: null,
26
+ comment: null,
27
+ columns: [
28
+ {
29
+ name: "id",
30
+ position: 1,
31
+ data_type: "integer",
32
+ data_type_str: "integer",
33
+ is_custom_type: false,
34
+ custom_type_type: null,
35
+ custom_type_category: null,
36
+ custom_type_schema: null,
37
+ custom_type_name: null,
38
+ not_null: false,
39
+ is_identity: false,
40
+ is_identity_always: false,
41
+ is_generated: false,
42
+ collation: null,
43
+ default: null,
44
+ comment: null,
45
+ },
46
+ ],
47
+ privileges: [],
48
+ };
49
+
50
+ test("change owner", () => {
51
+ const foreignTable = new ForeignTable(baseTableProps);
52
+ const change = new AlterForeignTableChangeOwner({
53
+ foreignTable,
54
+ owner: "new_owner",
55
+ });
56
+
57
+ expect(change.serialize()).toBe(
58
+ "ALTER FOREIGN TABLE public.test_table OWNER TO new_owner",
59
+ );
60
+ });
61
+
62
+ test("add column", () => {
63
+ const foreignTable = new ForeignTable(baseTableProps);
64
+ const change = new AlterForeignTableAddColumn({
65
+ foreignTable,
66
+ column: {
67
+ name: "name",
68
+ position: 2,
69
+ data_type: "text",
70
+ data_type_str: "text",
71
+ is_custom_type: false,
72
+ custom_type_type: null,
73
+ custom_type_category: null,
74
+ custom_type_schema: null,
75
+ custom_type_name: null,
76
+ not_null: false,
77
+ is_identity: false,
78
+ is_identity_always: false,
79
+ is_generated: false,
80
+ collation: null,
81
+ default: null,
82
+ comment: null,
83
+ },
84
+ });
85
+
86
+ expect(change.serialize()).toBe(
87
+ "ALTER FOREIGN TABLE public.test_table ADD COLUMN name text",
88
+ );
89
+ });
90
+
91
+ test("add column with NOT NULL", () => {
92
+ const foreignTable = new ForeignTable(baseTableProps);
93
+ const change = new AlterForeignTableAddColumn({
94
+ foreignTable,
95
+ column: {
96
+ name: "name",
97
+ position: 2,
98
+ data_type: "text",
99
+ data_type_str: "text",
100
+ is_custom_type: false,
101
+ custom_type_type: null,
102
+ custom_type_category: null,
103
+ custom_type_schema: null,
104
+ custom_type_name: null,
105
+ not_null: true,
106
+ is_identity: false,
107
+ is_identity_always: false,
108
+ is_generated: false,
109
+ collation: null,
110
+ default: null,
111
+ comment: null,
112
+ },
113
+ });
114
+
115
+ expect(change.serialize()).toBe(
116
+ "ALTER FOREIGN TABLE public.test_table ADD COLUMN name text NOT NULL",
117
+ );
118
+ });
119
+
120
+ test("add column with DEFAULT", () => {
121
+ const foreignTable = new ForeignTable(baseTableProps);
122
+ const change = new AlterForeignTableAddColumn({
123
+ foreignTable,
124
+ column: {
125
+ name: "name",
126
+ position: 2,
127
+ data_type: "text",
128
+ data_type_str: "text",
129
+ is_custom_type: false,
130
+ custom_type_type: null,
131
+ custom_type_category: null,
132
+ custom_type_schema: null,
133
+ custom_type_name: null,
134
+ not_null: false,
135
+ is_identity: false,
136
+ is_identity_always: false,
137
+ is_generated: false,
138
+ collation: null,
139
+ default: "'default_value'",
140
+ comment: null,
141
+ },
142
+ });
143
+
144
+ expect(change.serialize()).toBe(
145
+ "ALTER FOREIGN TABLE public.test_table ADD COLUMN name text DEFAULT 'default_value'",
146
+ );
147
+ });
148
+
149
+ test("add column with NOT NULL and DEFAULT", () => {
150
+ const foreignTable = new ForeignTable(baseTableProps);
151
+ const change = new AlterForeignTableAddColumn({
152
+ foreignTable,
153
+ column: {
154
+ name: "name",
155
+ position: 2,
156
+ data_type: "text",
157
+ data_type_str: "text",
158
+ is_custom_type: false,
159
+ custom_type_type: null,
160
+ custom_type_category: null,
161
+ custom_type_schema: null,
162
+ custom_type_name: null,
163
+ not_null: true,
164
+ is_identity: false,
165
+ is_identity_always: false,
166
+ is_generated: false,
167
+ collation: null,
168
+ default: "'default_value'",
169
+ comment: null,
170
+ },
171
+ });
172
+
173
+ expect(change.serialize()).toBe(
174
+ "ALTER FOREIGN TABLE public.test_table ADD COLUMN name text NOT NULL DEFAULT 'default_value'",
175
+ );
176
+ });
177
+
178
+ test("drop column", () => {
179
+ const foreignTable = new ForeignTable(baseTableProps);
180
+ const change = new AlterForeignTableDropColumn({
181
+ foreignTable,
182
+ columnName: "id",
183
+ });
184
+
185
+ expect(change.serialize()).toBe(
186
+ "ALTER FOREIGN TABLE public.test_table DROP COLUMN id",
187
+ );
188
+ });
189
+
190
+ test("alter column type", () => {
191
+ const foreignTable = new ForeignTable(baseTableProps);
192
+ const change = new AlterForeignTableAlterColumnType({
193
+ foreignTable,
194
+ columnName: "id",
195
+ dataType: "bigint",
196
+ });
197
+
198
+ expect(change.serialize()).toBe(
199
+ "ALTER FOREIGN TABLE public.test_table ALTER COLUMN id TYPE bigint",
200
+ );
201
+ });
202
+
203
+ test("alter column set default", () => {
204
+ const foreignTable = new ForeignTable(baseTableProps);
205
+ const change = new AlterForeignTableAlterColumnSetDefault({
206
+ foreignTable,
207
+ columnName: "id",
208
+ defaultValue: "0",
209
+ });
210
+
211
+ expect(change.serialize()).toBe(
212
+ "ALTER FOREIGN TABLE public.test_table ALTER COLUMN id SET DEFAULT 0",
213
+ );
214
+ });
215
+
216
+ test("alter column drop default", () => {
217
+ const foreignTable = new ForeignTable(baseTableProps);
218
+ const change = new AlterForeignTableAlterColumnDropDefault({
219
+ foreignTable,
220
+ columnName: "id",
221
+ });
222
+
223
+ expect(change.serialize()).toBe(
224
+ "ALTER FOREIGN TABLE public.test_table ALTER COLUMN id DROP DEFAULT",
225
+ );
226
+ });
227
+
228
+ test("alter column set not null", () => {
229
+ const foreignTable = new ForeignTable(baseTableProps);
230
+ const change = new AlterForeignTableAlterColumnSetNotNull({
231
+ foreignTable,
232
+ columnName: "id",
233
+ });
234
+
235
+ expect(change.serialize()).toBe(
236
+ "ALTER FOREIGN TABLE public.test_table ALTER COLUMN id SET NOT NULL",
237
+ );
238
+ });
239
+
240
+ test("alter column drop not null", () => {
241
+ const foreignTable = new ForeignTable(baseTableProps);
242
+ const change = new AlterForeignTableAlterColumnDropNotNull({
243
+ foreignTable,
244
+ columnName: "id",
245
+ });
246
+
247
+ expect(change.serialize()).toBe(
248
+ "ALTER FOREIGN TABLE public.test_table ALTER COLUMN id DROP NOT NULL",
249
+ );
250
+ });
251
+
252
+ test("set options ADD", () => {
253
+ const foreignTable = new ForeignTable(baseTableProps);
254
+ const change = new AlterForeignTableSetOptions({
255
+ foreignTable,
256
+ options: [
257
+ { action: "ADD", option: "schema_name", value: "remote_schema" },
258
+ { action: "ADD", option: "table_name", value: "remote_table" },
259
+ ],
260
+ });
261
+
262
+ expect(change.serialize()).toBe(
263
+ "ALTER FOREIGN TABLE public.test_table OPTIONS (ADD schema_name 'remote_schema', ADD table_name 'remote_table')",
264
+ );
265
+ });
266
+
267
+ test("set options SET", () => {
268
+ const foreignTable = new ForeignTable(baseTableProps);
269
+ const change = new AlterForeignTableSetOptions({
270
+ foreignTable,
271
+ options: [
272
+ { action: "SET", option: "schema_name", value: "new_schema" },
273
+ ],
274
+ });
275
+
276
+ expect(change.serialize()).toBe(
277
+ "ALTER FOREIGN TABLE public.test_table OPTIONS (SET schema_name 'new_schema')",
278
+ );
279
+ });
280
+
281
+ test("set options DROP", () => {
282
+ const foreignTable = new ForeignTable(baseTableProps);
283
+ const change = new AlterForeignTableSetOptions({
284
+ foreignTable,
285
+ options: [{ action: "DROP", option: "schema_name" }],
286
+ });
287
+
288
+ expect(change.serialize()).toBe(
289
+ "ALTER FOREIGN TABLE public.test_table OPTIONS (DROP schema_name)",
290
+ );
291
+ });
292
+
293
+ test("set options mixed ADD/SET/DROP", () => {
294
+ const foreignTable = new ForeignTable(baseTableProps);
295
+ const change = new AlterForeignTableSetOptions({
296
+ foreignTable,
297
+ options: [
298
+ { action: "ADD", option: "new_option", value: "new_value" },
299
+ { action: "SET", option: "existing_option", value: "updated_value" },
300
+ { action: "DROP", option: "old_option" },
301
+ ],
302
+ });
303
+
304
+ expect(change.serialize()).toBe(
305
+ "ALTER FOREIGN TABLE public.test_table OPTIONS (ADD new_option 'new_value', SET existing_option 'updated_value', DROP old_option)",
306
+ );
307
+ });
308
+ });
309
+ });
@@ -0,0 +1,341 @@
1
+ import { quoteLiteral } from "../../../base.change.ts";
2
+ import type { ColumnProps } from "../../../base.model.ts";
3
+ import { stableId } from "../../../utils.ts";
4
+ import type { ForeignTable } from "../foreign-table.model.ts";
5
+ import { AlterForeignTableChange } from "./foreign-table.base.ts";
6
+
7
+ /**
8
+ * Alter a foreign table.
9
+ *
10
+ * @see https://www.postgresql.org/docs/17/sql-alterforeigntable.html
11
+ *
12
+ * Synopsis
13
+ * ```sql
14
+ * ALTER FOREIGN TABLE [ IF EXISTS ] [ ONLY ] name [ * ]
15
+ * action [, ... ]
16
+ * where action is one of:
17
+ * ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ OPTIONS ( option 'value' [, ... ] ) ] [ COLLATE collation ] [ column_constraint [ ... ] ]
18
+ * DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ]
19
+ * ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ]
20
+ * ALTER [ COLUMN ] column_name SET DEFAULT expression
21
+ * ALTER [ COLUMN ] column_name DROP DEFAULT
22
+ * ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL
23
+ * ALTER [ COLUMN ] column_name OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ] )
24
+ * OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
25
+ * OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ] )
26
+ * ```
27
+ */
28
+
29
+ export type AlterForeignTable =
30
+ | AlterForeignTableChangeOwner
31
+ | AlterForeignTableAddColumn
32
+ | AlterForeignTableDropColumn
33
+ | AlterForeignTableAlterColumnType
34
+ | AlterForeignTableAlterColumnSetDefault
35
+ | AlterForeignTableAlterColumnDropDefault
36
+ | AlterForeignTableAlterColumnSetNotNull
37
+ | AlterForeignTableAlterColumnDropNotNull
38
+ | AlterForeignTableSetOptions;
39
+
40
+ /**
41
+ * ALTER FOREIGN TABLE ... OWNER TO ...
42
+ */
43
+ export class AlterForeignTableChangeOwner extends AlterForeignTableChange {
44
+ public readonly foreignTable: ForeignTable;
45
+ public readonly owner: string;
46
+ public readonly scope = "object" as const;
47
+
48
+ constructor(props: { foreignTable: ForeignTable; owner: string }) {
49
+ super();
50
+ this.foreignTable = props.foreignTable;
51
+ this.owner = props.owner;
52
+ }
53
+
54
+ get requires() {
55
+ return [this.foreignTable.stableId, stableId.role(this.owner)];
56
+ }
57
+
58
+ serialize(): string {
59
+ return [
60
+ "ALTER FOREIGN TABLE",
61
+ `${this.foreignTable.schema}.${this.foreignTable.name}`,
62
+ "OWNER TO",
63
+ this.owner,
64
+ ].join(" ");
65
+ }
66
+ }
67
+
68
+ /**
69
+ * ALTER FOREIGN TABLE ... ADD COLUMN ...
70
+ */
71
+ export class AlterForeignTableAddColumn extends AlterForeignTableChange {
72
+ public readonly foreignTable: ForeignTable;
73
+ public readonly column: ColumnProps;
74
+ public readonly scope = "object" as const;
75
+
76
+ constructor(props: { foreignTable: ForeignTable; column: ColumnProps }) {
77
+ super();
78
+ this.foreignTable = props.foreignTable;
79
+ this.column = props.column;
80
+ }
81
+
82
+ get requires() {
83
+ return [this.foreignTable.stableId];
84
+ }
85
+
86
+ serialize(): string {
87
+ const parts = [
88
+ "ALTER FOREIGN TABLE",
89
+ `${this.foreignTable.schema}.${this.foreignTable.name}`,
90
+ "ADD COLUMN",
91
+ this.column.name,
92
+ this.column.data_type_str,
93
+ ];
94
+
95
+ if (this.column.not_null) {
96
+ parts.push("NOT NULL");
97
+ }
98
+
99
+ if (this.column.default) {
100
+ parts.push("DEFAULT", this.column.default);
101
+ }
102
+
103
+ return parts.join(" ");
104
+ }
105
+ }
106
+
107
+ /**
108
+ * ALTER FOREIGN TABLE ... DROP COLUMN ...
109
+ */
110
+ export class AlterForeignTableDropColumn extends AlterForeignTableChange {
111
+ public readonly foreignTable: ForeignTable;
112
+ public readonly columnName: string;
113
+ public readonly scope = "object" as const;
114
+
115
+ constructor(props: { foreignTable: ForeignTable; columnName: string }) {
116
+ super();
117
+ this.foreignTable = props.foreignTable;
118
+ this.columnName = props.columnName;
119
+ }
120
+
121
+ get requires() {
122
+ return [this.foreignTable.stableId];
123
+ }
124
+
125
+ serialize(): string {
126
+ return [
127
+ "ALTER FOREIGN TABLE",
128
+ `${this.foreignTable.schema}.${this.foreignTable.name}`,
129
+ "DROP COLUMN",
130
+ this.columnName,
131
+ ].join(" ");
132
+ }
133
+ }
134
+
135
+ /**
136
+ * ALTER FOREIGN TABLE ... ALTER COLUMN ... TYPE ...
137
+ */
138
+ export class AlterForeignTableAlterColumnType extends AlterForeignTableChange {
139
+ public readonly foreignTable: ForeignTable;
140
+ public readonly columnName: string;
141
+ public readonly dataType: string;
142
+ public readonly scope = "object" as const;
143
+
144
+ constructor(props: {
145
+ foreignTable: ForeignTable;
146
+ columnName: string;
147
+ dataType: string;
148
+ }) {
149
+ super();
150
+ this.foreignTable = props.foreignTable;
151
+ this.columnName = props.columnName;
152
+ this.dataType = props.dataType;
153
+ }
154
+
155
+ get requires() {
156
+ return [this.foreignTable.stableId];
157
+ }
158
+
159
+ serialize(): string {
160
+ return [
161
+ "ALTER FOREIGN TABLE",
162
+ `${this.foreignTable.schema}.${this.foreignTable.name}`,
163
+ "ALTER COLUMN",
164
+ this.columnName,
165
+ "TYPE",
166
+ this.dataType,
167
+ ].join(" ");
168
+ }
169
+ }
170
+
171
+ /**
172
+ * ALTER FOREIGN TABLE ... ALTER COLUMN ... SET DEFAULT ...
173
+ */
174
+ export class AlterForeignTableAlterColumnSetDefault extends AlterForeignTableChange {
175
+ public readonly foreignTable: ForeignTable;
176
+ public readonly columnName: string;
177
+ public readonly defaultValue: string;
178
+ public readonly scope = "object" as const;
179
+
180
+ constructor(props: {
181
+ foreignTable: ForeignTable;
182
+ columnName: string;
183
+ defaultValue: string;
184
+ }) {
185
+ super();
186
+ this.foreignTable = props.foreignTable;
187
+ this.columnName = props.columnName;
188
+ this.defaultValue = props.defaultValue;
189
+ }
190
+
191
+ get requires() {
192
+ return [this.foreignTable.stableId];
193
+ }
194
+
195
+ serialize(): string {
196
+ return [
197
+ "ALTER FOREIGN TABLE",
198
+ `${this.foreignTable.schema}.${this.foreignTable.name}`,
199
+ "ALTER COLUMN",
200
+ this.columnName,
201
+ "SET DEFAULT",
202
+ this.defaultValue,
203
+ ].join(" ");
204
+ }
205
+ }
206
+
207
+ /**
208
+ * ALTER FOREIGN TABLE ... ALTER COLUMN ... DROP DEFAULT
209
+ */
210
+ export class AlterForeignTableAlterColumnDropDefault extends AlterForeignTableChange {
211
+ public readonly foreignTable: ForeignTable;
212
+ public readonly columnName: string;
213
+ public readonly scope = "object" as const;
214
+
215
+ constructor(props: { foreignTable: ForeignTable; columnName: string }) {
216
+ super();
217
+ this.foreignTable = props.foreignTable;
218
+ this.columnName = props.columnName;
219
+ }
220
+
221
+ get requires() {
222
+ return [this.foreignTable.stableId];
223
+ }
224
+
225
+ serialize(): string {
226
+ return [
227
+ "ALTER FOREIGN TABLE",
228
+ `${this.foreignTable.schema}.${this.foreignTable.name}`,
229
+ "ALTER COLUMN",
230
+ this.columnName,
231
+ "DROP DEFAULT",
232
+ ].join(" ");
233
+ }
234
+ }
235
+
236
+ /**
237
+ * ALTER FOREIGN TABLE ... ALTER COLUMN ... SET NOT NULL
238
+ */
239
+ export class AlterForeignTableAlterColumnSetNotNull extends AlterForeignTableChange {
240
+ public readonly foreignTable: ForeignTable;
241
+ public readonly columnName: string;
242
+ public readonly scope = "object" as const;
243
+
244
+ constructor(props: { foreignTable: ForeignTable; columnName: string }) {
245
+ super();
246
+ this.foreignTable = props.foreignTable;
247
+ this.columnName = props.columnName;
248
+ }
249
+
250
+ get requires() {
251
+ return [this.foreignTable.stableId];
252
+ }
253
+
254
+ serialize(): string {
255
+ return [
256
+ "ALTER FOREIGN TABLE",
257
+ `${this.foreignTable.schema}.${this.foreignTable.name}`,
258
+ "ALTER COLUMN",
259
+ this.columnName,
260
+ "SET NOT NULL",
261
+ ].join(" ");
262
+ }
263
+ }
264
+
265
+ /**
266
+ * ALTER FOREIGN TABLE ... ALTER COLUMN ... DROP NOT NULL
267
+ */
268
+ export class AlterForeignTableAlterColumnDropNotNull extends AlterForeignTableChange {
269
+ public readonly foreignTable: ForeignTable;
270
+ public readonly columnName: string;
271
+ public readonly scope = "object" as const;
272
+
273
+ constructor(props: { foreignTable: ForeignTable; columnName: string }) {
274
+ super();
275
+ this.foreignTable = props.foreignTable;
276
+ this.columnName = props.columnName;
277
+ }
278
+
279
+ get requires() {
280
+ return [this.foreignTable.stableId];
281
+ }
282
+
283
+ serialize(): string {
284
+ return [
285
+ "ALTER FOREIGN TABLE",
286
+ `${this.foreignTable.schema}.${this.foreignTable.name}`,
287
+ "ALTER COLUMN",
288
+ this.columnName,
289
+ "DROP NOT NULL",
290
+ ].join(" ");
291
+ }
292
+ }
293
+
294
+ /**
295
+ * ALTER FOREIGN TABLE ... OPTIONS ( ADD | SET | DROP ... )
296
+ */
297
+ export class AlterForeignTableSetOptions extends AlterForeignTableChange {
298
+ public readonly foreignTable: ForeignTable;
299
+ public readonly options: Array<{
300
+ action: "ADD" | "SET" | "DROP";
301
+ option: string;
302
+ value?: string;
303
+ }>;
304
+ public readonly scope = "object" as const;
305
+
306
+ constructor(props: {
307
+ foreignTable: ForeignTable;
308
+ options: Array<{
309
+ action: "ADD" | "SET" | "DROP";
310
+ option: string;
311
+ value?: string;
312
+ }>;
313
+ }) {
314
+ super();
315
+ this.foreignTable = props.foreignTable;
316
+ this.options = props.options;
317
+ }
318
+
319
+ get requires() {
320
+ return [this.foreignTable.stableId];
321
+ }
322
+
323
+ serialize(): string {
324
+ const optionParts: string[] = [];
325
+ for (const opt of this.options) {
326
+ if (opt.action === "DROP") {
327
+ optionParts.push(`DROP ${opt.option}`);
328
+ } else {
329
+ const value = opt.value !== undefined ? quoteLiteral(opt.value) : "''";
330
+ optionParts.push(`${opt.action} ${opt.option} ${value}`);
331
+ }
332
+ }
333
+
334
+ return [
335
+ "ALTER FOREIGN TABLE",
336
+ `${this.foreignTable.schema}.${this.foreignTable.name}`,
337
+ "OPTIONS",
338
+ `(${optionParts.join(", ")})`,
339
+ ].join(" ");
340
+ }
341
+ }
@@ -0,0 +1,20 @@
1
+ import { BaseChange } from "../../../base.change.ts";
2
+ import type { ForeignTable } from "../foreign-table.model.ts";
3
+
4
+ abstract class BaseForeignTableChange extends BaseChange {
5
+ abstract readonly foreignTable: ForeignTable;
6
+ abstract readonly scope: "object" | "comment" | "privilege";
7
+ readonly objectType: "foreign_table" = "foreign_table";
8
+ }
9
+
10
+ export abstract class CreateForeignTableChange extends BaseForeignTableChange {
11
+ readonly operation = "create" as const;
12
+ }
13
+
14
+ export abstract class AlterForeignTableChange extends BaseForeignTableChange {
15
+ readonly operation = "alter" as const;
16
+ }
17
+
18
+ export abstract class DropForeignTableChange extends BaseForeignTableChange {
19
+ readonly operation = "drop" as const;
20
+ }