@supabase/pg-delta 0.0.0 → 1.0.0-alpha.0

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 (567) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +149 -0
  3. package/dist/cli/app.d.ts +1 -0
  4. package/dist/cli/app.js +26 -0
  5. package/dist/cli/bin/cli.d.ts +2 -0
  6. package/dist/cli/bin/cli.js +7 -0
  7. package/dist/cli/commands/apply.d.ts +5 -0
  8. package/dist/cli/commands/apply.js +85 -0
  9. package/dist/cli/commands/plan.d.ts +5 -0
  10. package/dist/cli/commands/plan.js +137 -0
  11. package/dist/cli/commands/sync.d.ts +5 -0
  12. package/dist/cli/commands/sync.js +141 -0
  13. package/dist/cli/formatters/index.d.ts +4 -0
  14. package/dist/cli/formatters/index.js +4 -0
  15. package/dist/cli/formatters/tree/tree-builder.d.ts +10 -0
  16. package/dist/cli/formatters/tree/tree-builder.js +333 -0
  17. package/dist/cli/formatters/tree/tree-renderer.d.ts +45 -0
  18. package/dist/cli/formatters/tree/tree-renderer.js +303 -0
  19. package/dist/cli/formatters/tree/tree.d.ts +8 -0
  20. package/dist/cli/formatters/tree/tree.js +161 -0
  21. package/dist/cli/utils/integrations.d.ts +13 -0
  22. package/dist/cli/utils/integrations.js +35 -0
  23. package/dist/cli/utils.d.ts +64 -0
  24. package/dist/cli/utils.js +160 -0
  25. package/dist/core/catalog.diff.d.ts +5 -0
  26. package/dist/core/catalog.diff.js +147 -0
  27. package/dist/core/catalog.model.d.ts +93 -0
  28. package/dist/core/catalog.model.js +254 -0
  29. package/dist/core/change.types.d.ts +22 -0
  30. package/dist/core/change.types.js +1 -0
  31. package/dist/core/context.d.ts +11 -0
  32. package/dist/core/context.js +12 -0
  33. package/dist/core/depend.d.ts +31 -0
  34. package/dist/core/depend.js +1833 -0
  35. package/dist/core/expand-replace-dependencies.d.ts +14 -0
  36. package/dist/core/expand-replace-dependencies.js +280 -0
  37. package/dist/core/fingerprint.d.ts +23 -0
  38. package/dist/core/fingerprint.js +174 -0
  39. package/dist/core/index.d.ts +15 -0
  40. package/dist/core/index.js +14 -0
  41. package/dist/core/integrations/filter/dsl.d.ts +97 -0
  42. package/dist/core/integrations/filter/dsl.js +107 -0
  43. package/dist/core/integrations/filter/extractors.d.ts +12 -0
  44. package/dist/core/integrations/filter/extractors.js +136 -0
  45. package/dist/core/integrations/integration-dsl.d.ts +22 -0
  46. package/dist/core/integrations/integration-dsl.js +6 -0
  47. package/dist/core/integrations/integration.types.d.ts +5 -0
  48. package/dist/core/integrations/integration.types.js +1 -0
  49. package/dist/core/integrations/serialize/dsl.d.ts +58 -0
  50. package/dist/core/integrations/serialize/dsl.js +42 -0
  51. package/dist/core/main.d.ts +5 -0
  52. package/dist/core/main.js +44 -0
  53. package/dist/core/objects/aggregate/aggregate.diff.d.ts +10 -0
  54. package/dist/core/objects/aggregate/aggregate.diff.js +186 -0
  55. package/dist/core/objects/aggregate/aggregate.model.d.ts +174 -0
  56. package/dist/core/objects/aggregate/aggregate.model.js +297 -0
  57. package/dist/core/objects/aggregate/changes/aggregate.alter.d.ts +19 -0
  58. package/dist/core/objects/aggregate/changes/aggregate.alter.js +25 -0
  59. package/dist/core/objects/aggregate/changes/aggregate.base.d.ts +17 -0
  60. package/dist/core/objects/aggregate/changes/aggregate.base.js +13 -0
  61. package/dist/core/objects/aggregate/changes/aggregate.comment.d.ts +23 -0
  62. package/dist/core/objects/aggregate/changes/aggregate.comment.js +44 -0
  63. package/dist/core/objects/aggregate/changes/aggregate.create.d.ts +19 -0
  64. package/dist/core/objects/aggregate/changes/aggregate.create.js +228 -0
  65. package/dist/core/objects/aggregate/changes/aggregate.drop.d.ts +17 -0
  66. package/dist/core/objects/aggregate/changes/aggregate.drop.js +26 -0
  67. package/dist/core/objects/aggregate/changes/aggregate.privilege.d.ts +62 -0
  68. package/dist/core/objects/aggregate/changes/aggregate.privilege.js +102 -0
  69. package/dist/core/objects/aggregate/changes/aggregate.types.d.ts +6 -0
  70. package/dist/core/objects/aggregate/changes/aggregate.types.js +1 -0
  71. package/dist/core/objects/base.change.d.ts +46 -0
  72. package/dist/core/objects/base.change.js +38 -0
  73. package/dist/core/objects/base.default-privileges.d.ts +29 -0
  74. package/dist/core/objects/base.default-privileges.js +167 -0
  75. package/dist/core/objects/base.diff.d.ts +6 -0
  76. package/dist/core/objects/base.diff.js +12 -0
  77. package/dist/core/objects/base.model.d.ts +74 -0
  78. package/dist/core/objects/base.model.js +47 -0
  79. package/dist/core/objects/base.privilege-diff.d.ts +54 -0
  80. package/dist/core/objects/base.privilege-diff.js +216 -0
  81. package/dist/core/objects/base.privilege.d.ts +27 -0
  82. package/dist/core/objects/base.privilege.js +169 -0
  83. package/dist/core/objects/collation/changes/collation.alter.d.ts +45 -0
  84. package/dist/core/objects/collation/changes/collation.alter.js +52 -0
  85. package/dist/core/objects/collation/changes/collation.base.d.ts +17 -0
  86. package/dist/core/objects/collation/changes/collation.base.js +13 -0
  87. package/dist/core/objects/collation/changes/collation.comment.d.ts +26 -0
  88. package/dist/core/objects/collation/changes/collation.comment.js +50 -0
  89. package/dist/core/objects/collation/changes/collation.create.d.ts +32 -0
  90. package/dist/core/objects/collation/changes/collation.create.js +86 -0
  91. package/dist/core/objects/collation/changes/collation.drop.d.ts +22 -0
  92. package/dist/core/objects/collation/changes/collation.drop.js +31 -0
  93. package/dist/core/objects/collation/changes/collation.types.d.ts +5 -0
  94. package/dist/core/objects/collation/changes/collation.types.js +1 -0
  95. package/dist/core/objects/collation/collation.diff.d.ts +13 -0
  96. package/dist/core/objects/collation/collation.diff.js +85 -0
  97. package/dist/core/objects/collation/collation.model.d.ts +67 -0
  98. package/dist/core/objects/collation/collation.model.js +207 -0
  99. package/dist/core/objects/domain/changes/domain.alter.d.ts +143 -0
  100. package/dist/core/objects/domain/changes/domain.alter.js +191 -0
  101. package/dist/core/objects/domain/changes/domain.base.d.ts +17 -0
  102. package/dist/core/objects/domain/changes/domain.base.js +13 -0
  103. package/dist/core/objects/domain/changes/domain.comment.d.ts +25 -0
  104. package/dist/core/objects/domain/changes/domain.comment.js +47 -0
  105. package/dist/core/objects/domain/changes/domain.create.d.ts +30 -0
  106. package/dist/core/objects/domain/changes/domain.create.js +92 -0
  107. package/dist/core/objects/domain/changes/domain.drop.d.ts +22 -0
  108. package/dist/core/objects/domain/changes/domain.drop.js +28 -0
  109. package/dist/core/objects/domain/changes/domain.privilege.d.ts +97 -0
  110. package/dist/core/objects/domain/changes/domain.privilege.js +127 -0
  111. package/dist/core/objects/domain/changes/domain.types.d.ts +6 -0
  112. package/dist/core/objects/domain/changes/domain.types.js +1 -0
  113. package/dist/core/objects/domain/domain.diff.d.ts +18 -0
  114. package/dist/core/objects/domain/domain.diff.js +244 -0
  115. package/dist/core/objects/domain/domain.model.d.ts +103 -0
  116. package/dist/core/objects/domain/domain.model.js +172 -0
  117. package/dist/core/objects/event-trigger/changes/event-trigger.alter.d.ts +44 -0
  118. package/dist/core/objects/event-trigger/changes/event-trigger.alter.js +51 -0
  119. package/dist/core/objects/event-trigger/changes/event-trigger.base.d.ts +17 -0
  120. package/dist/core/objects/event-trigger/changes/event-trigger.base.js +13 -0
  121. package/dist/core/objects/event-trigger/changes/event-trigger.comment.d.ts +23 -0
  122. package/dist/core/objects/event-trigger/changes/event-trigger.comment.js +46 -0
  123. package/dist/core/objects/event-trigger/changes/event-trigger.create.d.ts +25 -0
  124. package/dist/core/objects/event-trigger/changes/event-trigger.create.js +55 -0
  125. package/dist/core/objects/event-trigger/changes/event-trigger.drop.d.ts +22 -0
  126. package/dist/core/objects/event-trigger/changes/event-trigger.drop.js +28 -0
  127. package/dist/core/objects/event-trigger/changes/event-trigger.types.d.ts +5 -0
  128. package/dist/core/objects/event-trigger/changes/event-trigger.types.js +1 -0
  129. package/dist/core/objects/event-trigger/event-trigger.diff.d.ts +13 -0
  130. package/dist/core/objects/event-trigger/event-trigger.diff.js +81 -0
  131. package/dist/core/objects/event-trigger/event-trigger.model.d.ts +45 -0
  132. package/dist/core/objects/event-trigger/event-trigger.model.js +89 -0
  133. package/dist/core/objects/extension/changes/extension.alter.d.ts +44 -0
  134. package/dist/core/objects/extension/changes/extension.alter.js +51 -0
  135. package/dist/core/objects/extension/changes/extension.base.d.ts +17 -0
  136. package/dist/core/objects/extension/changes/extension.base.js +13 -0
  137. package/dist/core/objects/extension/changes/extension.comment.d.ts +26 -0
  138. package/dist/core/objects/extension/changes/extension.comment.js +46 -0
  139. package/dist/core/objects/extension/changes/extension.create.d.ts +25 -0
  140. package/dist/core/objects/extension/changes/extension.create.js +49 -0
  141. package/dist/core/objects/extension/changes/extension.drop.d.ts +22 -0
  142. package/dist/core/objects/extension/changes/extension.drop.js +28 -0
  143. package/dist/core/objects/extension/changes/extension.types.d.ts +5 -0
  144. package/dist/core/objects/extension/changes/extension.types.js +1 -0
  145. package/dist/core/objects/extension/extension.diff.d.ts +10 -0
  146. package/dist/core/objects/extension/extension.diff.js +65 -0
  147. package/dist/core/objects/extension/extension.model.d.ts +52 -0
  148. package/dist/core/objects/extension/extension.model.js +268 -0
  149. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.d.ts +51 -0
  150. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.alter.js +61 -0
  151. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.d.ts +17 -0
  152. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.base.js +13 -0
  153. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.d.ts +26 -0
  154. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.comment.js +50 -0
  155. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.d.ts +25 -0
  156. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.create.js +78 -0
  157. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.d.ts +22 -0
  158. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.drop.js +28 -0
  159. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.d.ts +97 -0
  160. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.privilege.js +123 -0
  161. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.d.ts +6 -0
  162. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/changes/foreign-data-wrapper.types.js +1 -0
  163. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.d.ts +18 -0
  164. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.diff.js +221 -0
  165. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.d.ts +59 -0
  166. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper/foreign-data-wrapper.model.js +128 -0
  167. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.d.ts +5 -0
  168. package/dist/core/objects/foreign-data-wrapper/foreign-data-wrapper.types.js +1 -0
  169. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.d.ts +163 -0
  170. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.alter.js +248 -0
  171. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.d.ts +17 -0
  172. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.base.js +13 -0
  173. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.d.ts +26 -0
  174. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.comment.js +50 -0
  175. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.d.ts +25 -0
  176. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.create.js +64 -0
  177. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.d.ts +22 -0
  178. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.drop.js +31 -0
  179. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.d.ts +97 -0
  180. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.privilege.js +129 -0
  181. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.d.ts +6 -0
  182. package/dist/core/objects/foreign-data-wrapper/foreign-table/changes/foreign-table.types.js +1 -0
  183. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.d.ts +18 -0
  184. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.diff.js +268 -0
  185. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.d.ts +117 -0
  186. package/dist/core/objects/foreign-data-wrapper/foreign-table/foreign-table.model.js +215 -0
  187. package/dist/core/objects/foreign-data-wrapper/server/changes/server.alter.d.ts +65 -0
  188. package/dist/core/objects/foreign-data-wrapper/server/changes/server.alter.js +84 -0
  189. package/dist/core/objects/foreign-data-wrapper/server/changes/server.base.d.ts +17 -0
  190. package/dist/core/objects/foreign-data-wrapper/server/changes/server.base.js +13 -0
  191. package/dist/core/objects/foreign-data-wrapper/server/changes/server.comment.d.ts +26 -0
  192. package/dist/core/objects/foreign-data-wrapper/server/changes/server.comment.js +43 -0
  193. package/dist/core/objects/foreign-data-wrapper/server/changes/server.create.d.ts +24 -0
  194. package/dist/core/objects/foreign-data-wrapper/server/changes/server.create.js +62 -0
  195. package/dist/core/objects/foreign-data-wrapper/server/changes/server.drop.d.ts +22 -0
  196. package/dist/core/objects/foreign-data-wrapper/server/changes/server.drop.js +28 -0
  197. package/dist/core/objects/foreign-data-wrapper/server/changes/server.privilege.d.ts +97 -0
  198. package/dist/core/objects/foreign-data-wrapper/server/changes/server.privilege.js +123 -0
  199. package/dist/core/objects/foreign-data-wrapper/server/changes/server.types.d.ts +6 -0
  200. package/dist/core/objects/foreign-data-wrapper/server/changes/server.types.js +1 -0
  201. package/dist/core/objects/foreign-data-wrapper/server/server.diff.d.ts +18 -0
  202. package/dist/core/objects/foreign-data-wrapper/server/server.diff.js +209 -0
  203. package/dist/core/objects/foreign-data-wrapper/server/server.model.d.ts +62 -0
  204. package/dist/core/objects/foreign-data-wrapper/server/server.model.js +118 -0
  205. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.d.ts +37 -0
  206. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.alter.js +38 -0
  207. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.d.ts +17 -0
  208. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.base.js +13 -0
  209. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.d.ts +24 -0
  210. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.create.js +52 -0
  211. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.d.ts +23 -0
  212. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.drop.js +34 -0
  213. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.d.ts +4 -0
  214. package/dist/core/objects/foreign-data-wrapper/user-mapping/changes/user-mapping.types.js +1 -0
  215. package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.d.ts +10 -0
  216. package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.diff.js +77 -0
  217. package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.d.ts +36 -0
  218. package/dist/core/objects/foreign-data-wrapper/user-mapping/user-mapping.model.js +85 -0
  219. package/dist/core/objects/index/changes/index.alter.d.ts +76 -0
  220. package/dist/core/objects/index/changes/index.alter.js +94 -0
  221. package/dist/core/objects/index/changes/index.base.d.ts +17 -0
  222. package/dist/core/objects/index/changes/index.base.js +13 -0
  223. package/dist/core/objects/index/changes/index.comment.d.ts +26 -0
  224. package/dist/core/objects/index/changes/index.comment.js +50 -0
  225. package/dist/core/objects/index/changes/index.create.d.ts +30 -0
  226. package/dist/core/objects/index/changes/index.create.js +53 -0
  227. package/dist/core/objects/index/changes/index.drop.d.ts +22 -0
  228. package/dist/core/objects/index/changes/index.drop.js +28 -0
  229. package/dist/core/objects/index/changes/index.types.d.ts +5 -0
  230. package/dist/core/objects/index/changes/index.types.js +1 -0
  231. package/dist/core/objects/index/changes/utils.d.ts +3 -0
  232. package/dist/core/objects/index/changes/utils.js +6 -0
  233. package/dist/core/objects/index/index.diff.d.ts +12 -0
  234. package/dist/core/objects/index/index.diff.js +182 -0
  235. package/dist/core/objects/index/index.model.d.ts +150 -0
  236. package/dist/core/objects/index/index.model.js +340 -0
  237. package/dist/core/objects/language/changes/language.alter.d.ts +32 -0
  238. package/dist/core/objects/language/changes/language.alter.js +30 -0
  239. package/dist/core/objects/language/changes/language.base.d.ts +17 -0
  240. package/dist/core/objects/language/changes/language.base.js +13 -0
  241. package/dist/core/objects/language/changes/language.comment.d.ts +26 -0
  242. package/dist/core/objects/language/changes/language.comment.js +45 -0
  243. package/dist/core/objects/language/changes/language.create.d.ts +25 -0
  244. package/dist/core/objects/language/changes/language.create.js +76 -0
  245. package/dist/core/objects/language/changes/language.drop.d.ts +22 -0
  246. package/dist/core/objects/language/changes/language.drop.js +31 -0
  247. package/dist/core/objects/language/changes/language.privilege.d.ts +97 -0
  248. package/dist/core/objects/language/changes/language.privilege.js +128 -0
  249. package/dist/core/objects/language/changes/language.types.d.ts +6 -0
  250. package/dist/core/objects/language/changes/language.types.js +1 -0
  251. package/dist/core/objects/language/language.diff.d.ts +15 -0
  252. package/dist/core/objects/language/language.diff.js +117 -0
  253. package/dist/core/objects/language/language.model.d.ts +62 -0
  254. package/dist/core/objects/language/language.model.js +128 -0
  255. package/dist/core/objects/materialized-view/changes/materialized-view.alter.d.ts +67 -0
  256. package/dist/core/objects/materialized-view/changes/materialized-view.alter.js +63 -0
  257. package/dist/core/objects/materialized-view/changes/materialized-view.base.d.ts +17 -0
  258. package/dist/core/objects/materialized-view/changes/materialized-view.base.js +13 -0
  259. package/dist/core/objects/materialized-view/changes/materialized-view.comment.d.ts +53 -0
  260. package/dist/core/objects/materialized-view/changes/materialized-view.comment.js +112 -0
  261. package/dist/core/objects/materialized-view/changes/materialized-view.create.d.ts +35 -0
  262. package/dist/core/objects/materialized-view/changes/materialized-view.create.js +71 -0
  263. package/dist/core/objects/materialized-view/changes/materialized-view.drop.d.ts +26 -0
  264. package/dist/core/objects/materialized-view/changes/materialized-view.drop.js +42 -0
  265. package/dist/core/objects/materialized-view/changes/materialized-view.privilege.d.ts +105 -0
  266. package/dist/core/objects/materialized-view/changes/materialized-view.privilege.js +151 -0
  267. package/dist/core/objects/materialized-view/changes/materialized-view.types.d.ts +6 -0
  268. package/dist/core/objects/materialized-view/changes/materialized-view.types.js +1 -0
  269. package/dist/core/objects/materialized-view/materialized-view.diff.d.ts +18 -0
  270. package/dist/core/objects/materialized-view/materialized-view.diff.js +335 -0
  271. package/dist/core/objects/materialized-view/materialized-view.model.d.ts +152 -0
  272. package/dist/core/objects/materialized-view/materialized-view.model.js +228 -0
  273. package/dist/core/objects/procedure/changes/procedure.alter.d.ts +143 -0
  274. package/dist/core/objects/procedure/changes/procedure.alter.js +207 -0
  275. package/dist/core/objects/procedure/changes/procedure.base.d.ts +17 -0
  276. package/dist/core/objects/procedure/changes/procedure.base.js +13 -0
  277. package/dist/core/objects/procedure/changes/procedure.comment.d.ts +26 -0
  278. package/dist/core/objects/procedure/changes/procedure.comment.js +52 -0
  279. package/dist/core/objects/procedure/changes/procedure.create.d.ts +42 -0
  280. package/dist/core/objects/procedure/changes/procedure.create.js +77 -0
  281. package/dist/core/objects/procedure/changes/procedure.drop.d.ts +23 -0
  282. package/dist/core/objects/procedure/changes/procedure.drop.js +37 -0
  283. package/dist/core/objects/procedure/changes/procedure.privilege.d.ts +98 -0
  284. package/dist/core/objects/procedure/changes/procedure.privilege.js +144 -0
  285. package/dist/core/objects/procedure/changes/procedure.types.d.ts +6 -0
  286. package/dist/core/objects/procedure/changes/procedure.types.js +1 -0
  287. package/dist/core/objects/procedure/procedure.diff.d.ts +18 -0
  288. package/dist/core/objects/procedure/procedure.diff.js +282 -0
  289. package/dist/core/objects/procedure/procedure.model.d.ts +132 -0
  290. package/dist/core/objects/procedure/procedure.model.js +244 -0
  291. package/dist/core/objects/procedure/utils.d.ts +14 -0
  292. package/dist/core/objects/procedure/utils.js +55 -0
  293. package/dist/core/objects/publication/changes/publication.alter.d.ts +88 -0
  294. package/dist/core/objects/publication/changes/publication.alter.js +176 -0
  295. package/dist/core/objects/publication/changes/publication.base.d.ts +17 -0
  296. package/dist/core/objects/publication/changes/publication.base.js +13 -0
  297. package/dist/core/objects/publication/changes/publication.comment.d.ts +23 -0
  298. package/dist/core/objects/publication/changes/publication.comment.js +46 -0
  299. package/dist/core/objects/publication/changes/publication.create.d.ts +17 -0
  300. package/dist/core/objects/publication/changes/publication.create.js +61 -0
  301. package/dist/core/objects/publication/changes/publication.drop.d.ts +17 -0
  302. package/dist/core/objects/publication/changes/publication.drop.js +23 -0
  303. package/dist/core/objects/publication/changes/publication.types.d.ts +5 -0
  304. package/dist/core/objects/publication/changes/publication.types.js +1 -0
  305. package/dist/core/objects/publication/publication.diff.d.ts +5 -0
  306. package/dist/core/objects/publication/publication.diff.js +161 -0
  307. package/dist/core/objects/publication/publication.model.d.ts +96 -0
  308. package/dist/core/objects/publication/publication.model.js +186 -0
  309. package/dist/core/objects/publication/utils.d.ts +5 -0
  310. package/dist/core/objects/publication/utils.js +45 -0
  311. package/dist/core/objects/rls-policy/changes/rls-policy.alter.d.ts +62 -0
  312. package/dist/core/objects/rls-policy/changes/rls-policy.alter.js +90 -0
  313. package/dist/core/objects/rls-policy/changes/rls-policy.base.d.ts +17 -0
  314. package/dist/core/objects/rls-policy/changes/rls-policy.base.js +13 -0
  315. package/dist/core/objects/rls-policy/changes/rls-policy.comment.d.ts +23 -0
  316. package/dist/core/objects/rls-policy/changes/rls-policy.comment.js +51 -0
  317. package/dist/core/objects/rls-policy/changes/rls-policy.create.d.ts +27 -0
  318. package/dist/core/objects/rls-policy/changes/rls-policy.create.js +79 -0
  319. package/dist/core/objects/rls-policy/changes/rls-policy.drop.d.ts +22 -0
  320. package/dist/core/objects/rls-policy/changes/rls-policy.drop.js +33 -0
  321. package/dist/core/objects/rls-policy/changes/rls-policy.types.d.ts +5 -0
  322. package/dist/core/objects/rls-policy/changes/rls-policy.types.js +1 -0
  323. package/dist/core/objects/rls-policy/rls-policy.diff.d.ts +10 -0
  324. package/dist/core/objects/rls-policy/rls-policy.diff.js +80 -0
  325. package/dist/core/objects/rls-policy/rls-policy.model.d.ts +52 -0
  326. package/dist/core/objects/rls-policy/rls-policy.model.js +127 -0
  327. package/dist/core/objects/role/changes/role.alter.d.ts +78 -0
  328. package/dist/core/objects/role/changes/role.alter.js +55 -0
  329. package/dist/core/objects/role/changes/role.base.d.ts +17 -0
  330. package/dist/core/objects/role/changes/role.base.js +13 -0
  331. package/dist/core/objects/role/changes/role.comment.d.ts +23 -0
  332. package/dist/core/objects/role/changes/role.comment.js +42 -0
  333. package/dist/core/objects/role/changes/role.create.d.ts +38 -0
  334. package/dist/core/objects/role/changes/role.create.js +83 -0
  335. package/dist/core/objects/role/changes/role.drop.d.ts +22 -0
  336. package/dist/core/objects/role/changes/role.drop.js +28 -0
  337. package/dist/core/objects/role/changes/role.privilege.d.ts +148 -0
  338. package/dist/core/objects/role/changes/role.privilege.js +283 -0
  339. package/dist/core/objects/role/changes/role.types.d.ts +6 -0
  340. package/dist/core/objects/role/changes/role.types.js +1 -0
  341. package/dist/core/objects/role/role.diff.d.ts +13 -0
  342. package/dist/core/objects/role/role.diff.js +386 -0
  343. package/dist/core/objects/role/role.model.d.ts +89 -0
  344. package/dist/core/objects/role/role.model.js +312 -0
  345. package/dist/core/objects/rule/changes/rule.alter.d.ts +22 -0
  346. package/dist/core/objects/rule/changes/rule.alter.js +58 -0
  347. package/dist/core/objects/rule/changes/rule.base.d.ts +17 -0
  348. package/dist/core/objects/rule/changes/rule.base.js +13 -0
  349. package/dist/core/objects/rule/changes/rule.comment.d.ts +22 -0
  350. package/dist/core/objects/rule/changes/rule.comment.js +51 -0
  351. package/dist/core/objects/rule/changes/rule.create.d.ts +14 -0
  352. package/dist/core/objects/rule/changes/rule.create.js +28 -0
  353. package/dist/core/objects/rule/changes/rule.drop.d.ts +12 -0
  354. package/dist/core/objects/rule/changes/rule.drop.js +23 -0
  355. package/dist/core/objects/rule/changes/rule.types.d.ts +5 -0
  356. package/dist/core/objects/rule/changes/rule.types.js +1 -0
  357. package/dist/core/objects/rule/rule.diff.d.ts +3 -0
  358. package/dist/core/objects/rule/rule.diff.js +53 -0
  359. package/dist/core/objects/rule/rule.model.d.ts +72 -0
  360. package/dist/core/objects/rule/rule.model.js +156 -0
  361. package/dist/core/objects/schema/changes/schema.alter.d.ts +32 -0
  362. package/dist/core/objects/schema/changes/schema.alter.js +25 -0
  363. package/dist/core/objects/schema/changes/schema.base.d.ts +17 -0
  364. package/dist/core/objects/schema/changes/schema.base.js +13 -0
  365. package/dist/core/objects/schema/changes/schema.comment.d.ts +23 -0
  366. package/dist/core/objects/schema/changes/schema.comment.js +43 -0
  367. package/dist/core/objects/schema/changes/schema.create.d.ts +27 -0
  368. package/dist/core/objects/schema/changes/schema.create.js +38 -0
  369. package/dist/core/objects/schema/changes/schema.drop.d.ts +22 -0
  370. package/dist/core/objects/schema/changes/schema.drop.js +28 -0
  371. package/dist/core/objects/schema/changes/schema.privilege.d.ts +97 -0
  372. package/dist/core/objects/schema/changes/schema.privilege.js +131 -0
  373. package/dist/core/objects/schema/changes/schema.types.d.ts +6 -0
  374. package/dist/core/objects/schema/changes/schema.types.js +1 -0
  375. package/dist/core/objects/schema/schema.diff.d.ts +18 -0
  376. package/dist/core/objects/schema/schema.diff.js +142 -0
  377. package/dist/core/objects/schema/schema.model.d.ts +47 -0
  378. package/dist/core/objects/schema/schema.model.js +91 -0
  379. package/dist/core/objects/sequence/changes/sequence.alter.d.ts +59 -0
  380. package/dist/core/objects/sequence/changes/sequence.alter.js +75 -0
  381. package/dist/core/objects/sequence/changes/sequence.base.d.ts +17 -0
  382. package/dist/core/objects/sequence/changes/sequence.base.js +13 -0
  383. package/dist/core/objects/sequence/changes/sequence.comment.d.ts +23 -0
  384. package/dist/core/objects/sequence/changes/sequence.comment.js +47 -0
  385. package/dist/core/objects/sequence/changes/sequence.create.d.ts +25 -0
  386. package/dist/core/objects/sequence/changes/sequence.create.js +78 -0
  387. package/dist/core/objects/sequence/changes/sequence.drop.d.ts +22 -0
  388. package/dist/core/objects/sequence/changes/sequence.drop.js +31 -0
  389. package/dist/core/objects/sequence/changes/sequence.privilege.d.ts +101 -0
  390. package/dist/core/objects/sequence/changes/sequence.privilege.js +135 -0
  391. package/dist/core/objects/sequence/changes/sequence.types.d.ts +6 -0
  392. package/dist/core/objects/sequence/changes/sequence.types.js +1 -0
  393. package/dist/core/objects/sequence/sequence.diff.d.ts +20 -0
  394. package/dist/core/objects/sequence/sequence.diff.js +258 -0
  395. package/dist/core/objects/sequence/sequence.model.d.ts +76 -0
  396. package/dist/core/objects/sequence/sequence.model.js +169 -0
  397. package/dist/core/objects/subscription/changes/subscription.alter.d.ts +56 -0
  398. package/dist/core/objects/subscription/changes/subscription.alter.js +82 -0
  399. package/dist/core/objects/subscription/changes/subscription.base.d.ts +17 -0
  400. package/dist/core/objects/subscription/changes/subscription.base.js +13 -0
  401. package/dist/core/objects/subscription/changes/subscription.comment.d.ts +23 -0
  402. package/dist/core/objects/subscription/changes/subscription.comment.js +46 -0
  403. package/dist/core/objects/subscription/changes/subscription.create.d.ts +12 -0
  404. package/dist/core/objects/subscription/changes/subscription.create.js +52 -0
  405. package/dist/core/objects/subscription/changes/subscription.drop.d.ts +11 -0
  406. package/dist/core/objects/subscription/changes/subscription.drop.js +15 -0
  407. package/dist/core/objects/subscription/changes/subscription.types.d.ts +5 -0
  408. package/dist/core/objects/subscription/changes/subscription.types.js +1 -0
  409. package/dist/core/objects/subscription/subscription.diff.d.ts +5 -0
  410. package/dist/core/objects/subscription/subscription.diff.js +167 -0
  411. package/dist/core/objects/subscription/subscription.model.d.ts +80 -0
  412. package/dist/core/objects/subscription/subscription.model.js +166 -0
  413. package/dist/core/objects/subscription/utils.d.ts +37 -0
  414. package/dist/core/objects/subscription/utils.js +112 -0
  415. package/dist/core/objects/table/changes/table.alter.d.ts +357 -0
  416. package/dist/core/objects/table/changes/table.alter.js +607 -0
  417. package/dist/core/objects/table/changes/table.base.d.ts +17 -0
  418. package/dist/core/objects/table/changes/table.base.js +13 -0
  419. package/dist/core/objects/table/changes/table.comment.d.ts +106 -0
  420. package/dist/core/objects/table/changes/table.comment.js +175 -0
  421. package/dist/core/objects/table/changes/table.create.d.ts +33 -0
  422. package/dist/core/objects/table/changes/table.create.js +145 -0
  423. package/dist/core/objects/table/changes/table.drop.d.ts +22 -0
  424. package/dist/core/objects/table/changes/table.drop.js +35 -0
  425. package/dist/core/objects/table/changes/table.privilege.d.ts +107 -0
  426. package/dist/core/objects/table/changes/table.privilege.js +150 -0
  427. package/dist/core/objects/table/changes/table.types.d.ts +6 -0
  428. package/dist/core/objects/table/changes/table.types.js +1 -0
  429. package/dist/core/objects/table/table.diff.d.ts +18 -0
  430. package/dist/core/objects/table/table.diff.js +668 -0
  431. package/dist/core/objects/table/table.model.d.ts +341 -0
  432. package/dist/core/objects/table/table.model.js +426 -0
  433. package/dist/core/objects/trigger/changes/trigger.alter.d.ts +29 -0
  434. package/dist/core/objects/trigger/changes/trigger.alter.js +27 -0
  435. package/dist/core/objects/trigger/changes/trigger.base.d.ts +17 -0
  436. package/dist/core/objects/trigger/changes/trigger.base.js +13 -0
  437. package/dist/core/objects/trigger/changes/trigger.comment.d.ts +23 -0
  438. package/dist/core/objects/trigger/changes/trigger.comment.js +51 -0
  439. package/dist/core/objects/trigger/changes/trigger.create.d.ts +41 -0
  440. package/dist/core/objects/trigger/changes/trigger.create.js +61 -0
  441. package/dist/core/objects/trigger/changes/trigger.drop.d.ts +22 -0
  442. package/dist/core/objects/trigger/changes/trigger.drop.js +33 -0
  443. package/dist/core/objects/trigger/changes/trigger.types.d.ts +5 -0
  444. package/dist/core/objects/trigger/changes/trigger.types.js +1 -0
  445. package/dist/core/objects/trigger/trigger.diff.d.ts +11 -0
  446. package/dist/core/objects/trigger/trigger.diff.js +84 -0
  447. package/dist/core/objects/trigger/trigger.model.d.ts +92 -0
  448. package/dist/core/objects/trigger/trigger.model.js +235 -0
  449. package/dist/core/objects/type/composite-type/changes/composite-type.alter.d.ts +81 -0
  450. package/dist/core/objects/type/composite-type/changes/composite-type.alter.js +123 -0
  451. package/dist/core/objects/type/composite-type/changes/composite-type.base.d.ts +17 -0
  452. package/dist/core/objects/type/composite-type/changes/composite-type.base.js +13 -0
  453. package/dist/core/objects/type/composite-type/changes/composite-type.comment.d.ts +53 -0
  454. package/dist/core/objects/type/composite-type/changes/composite-type.comment.js +108 -0
  455. package/dist/core/objects/type/composite-type/changes/composite-type.create.d.ts +23 -0
  456. package/dist/core/objects/type/composite-type/changes/composite-type.create.js +72 -0
  457. package/dist/core/objects/type/composite-type/changes/composite-type.drop.d.ts +22 -0
  458. package/dist/core/objects/type/composite-type/changes/composite-type.drop.js +31 -0
  459. package/dist/core/objects/type/composite-type/changes/composite-type.privilege.d.ts +97 -0
  460. package/dist/core/objects/type/composite-type/changes/composite-type.privilege.js +131 -0
  461. package/dist/core/objects/type/composite-type/changes/composite-type.types.d.ts +6 -0
  462. package/dist/core/objects/type/composite-type/changes/composite-type.types.js +1 -0
  463. package/dist/core/objects/type/composite-type/composite-type.diff.d.ts +18 -0
  464. package/dist/core/objects/type/composite-type/composite-type.diff.js +250 -0
  465. package/dist/core/objects/type/composite-type/composite-type.model.d.ts +148 -0
  466. package/dist/core/objects/type/composite-type/composite-type.model.js +223 -0
  467. package/dist/core/objects/type/enum/changes/enum.alter.d.ts +52 -0
  468. package/dist/core/objects/type/enum/changes/enum.alter.js +60 -0
  469. package/dist/core/objects/type/enum/changes/enum.base.d.ts +17 -0
  470. package/dist/core/objects/type/enum/changes/enum.base.js +13 -0
  471. package/dist/core/objects/type/enum/changes/enum.comment.d.ts +26 -0
  472. package/dist/core/objects/type/enum/changes/enum.comment.js +47 -0
  473. package/dist/core/objects/type/enum/changes/enum.create.d.ts +22 -0
  474. package/dist/core/objects/type/enum/changes/enum.create.js +43 -0
  475. package/dist/core/objects/type/enum/changes/enum.drop.d.ts +22 -0
  476. package/dist/core/objects/type/enum/changes/enum.drop.js +28 -0
  477. package/dist/core/objects/type/enum/changes/enum.privilege.d.ts +97 -0
  478. package/dist/core/objects/type/enum/changes/enum.privilege.js +131 -0
  479. package/dist/core/objects/type/enum/changes/enum.types.d.ts +6 -0
  480. package/dist/core/objects/type/enum/changes/enum.types.js +1 -0
  481. package/dist/core/objects/type/enum/enum.diff.d.ts +18 -0
  482. package/dist/core/objects/type/enum/enum.diff.js +268 -0
  483. package/dist/core/objects/type/enum/enum.model.d.ts +66 -0
  484. package/dist/core/objects/type/enum/enum.model.js +154 -0
  485. package/dist/core/objects/type/range/changes/range.alter.d.ts +33 -0
  486. package/dist/core/objects/type/range/changes/range.alter.js +30 -0
  487. package/dist/core/objects/type/range/changes/range.base.d.ts +17 -0
  488. package/dist/core/objects/type/range/changes/range.base.js +13 -0
  489. package/dist/core/objects/type/range/changes/range.comment.d.ts +26 -0
  490. package/dist/core/objects/type/range/changes/range.comment.js +47 -0
  491. package/dist/core/objects/type/range/changes/range.create.d.ts +31 -0
  492. package/dist/core/objects/type/range/changes/range.create.js +113 -0
  493. package/dist/core/objects/type/range/changes/range.drop.d.ts +22 -0
  494. package/dist/core/objects/type/range/changes/range.drop.js +28 -0
  495. package/dist/core/objects/type/range/changes/range.privilege.d.ts +97 -0
  496. package/dist/core/objects/type/range/changes/range.privilege.js +131 -0
  497. package/dist/core/objects/type/range/changes/range.types.d.ts +6 -0
  498. package/dist/core/objects/type/range/changes/range.types.js +1 -0
  499. package/dist/core/objects/type/range/range.diff.d.ts +18 -0
  500. package/dist/core/objects/type/range/range.diff.js +172 -0
  501. package/dist/core/objects/type/range/range.model.d.ts +81 -0
  502. package/dist/core/objects/type/range/range.model.js +165 -0
  503. package/dist/core/objects/type/type.types.d.ts +4 -0
  504. package/dist/core/objects/type/type.types.js +1 -0
  505. package/dist/core/objects/utils.d.ts +57 -0
  506. package/dist/core/objects/utils.js +137 -0
  507. package/dist/core/objects/view/changes/view.alter.d.ts +62 -0
  508. package/dist/core/objects/view/changes/view.alter.js +75 -0
  509. package/dist/core/objects/view/changes/view.base.d.ts +17 -0
  510. package/dist/core/objects/view/changes/view.base.js +13 -0
  511. package/dist/core/objects/view/changes/view.comment.d.ts +23 -0
  512. package/dist/core/objects/view/changes/view.comment.js +46 -0
  513. package/dist/core/objects/view/changes/view.create.d.ts +27 -0
  514. package/dist/core/objects/view/changes/view.create.js +57 -0
  515. package/dist/core/objects/view/changes/view.drop.d.ts +17 -0
  516. package/dist/core/objects/view/changes/view.drop.js +30 -0
  517. package/dist/core/objects/view/changes/view.privilege.d.ts +107 -0
  518. package/dist/core/objects/view/changes/view.privilege.js +150 -0
  519. package/dist/core/objects/view/changes/view.types.d.ts +6 -0
  520. package/dist/core/objects/view/changes/view.types.js +1 -0
  521. package/dist/core/objects/view/view.diff.d.ts +18 -0
  522. package/dist/core/objects/view/view.diff.js +270 -0
  523. package/dist/core/objects/view/view.model.d.ts +152 -0
  524. package/dist/core/objects/view/view.model.js +250 -0
  525. package/dist/core/plan/apply.d.ts +33 -0
  526. package/dist/core/plan/apply.js +112 -0
  527. package/dist/core/plan/create.d.ts +22 -0
  528. package/dist/core/plan/create.js +228 -0
  529. package/dist/core/plan/hierarchy.d.ts +19 -0
  530. package/dist/core/plan/hierarchy.js +488 -0
  531. package/dist/core/plan/index.d.ts +19 -0
  532. package/dist/core/plan/index.js +21 -0
  533. package/dist/core/plan/io.d.ts +12 -0
  534. package/dist/core/plan/io.js +17 -0
  535. package/dist/core/plan/risk.d.ts +10 -0
  536. package/dist/core/plan/risk.js +38 -0
  537. package/dist/core/plan/serialize.d.ts +26 -0
  538. package/dist/core/plan/serialize.js +176 -0
  539. package/dist/core/plan/statements.d.ts +8 -0
  540. package/dist/core/plan/statements.js +13 -0
  541. package/dist/core/plan/types.d.ts +153 -0
  542. package/dist/core/plan/types.js +32 -0
  543. package/dist/core/postgres-config.d.ts +8 -0
  544. package/dist/core/postgres-config.js +46 -0
  545. package/dist/core/sort/custom-constraints.d.ts +9 -0
  546. package/dist/core/sort/custom-constraints.js +133 -0
  547. package/dist/core/sort/debug-visualization.d.ts +8 -0
  548. package/dist/core/sort/debug-visualization.js +145 -0
  549. package/dist/core/sort/dependency-filter.d.ts +19 -0
  550. package/dist/core/sort/dependency-filter.js +152 -0
  551. package/dist/core/sort/graph-builder.d.ts +37 -0
  552. package/dist/core/sort/graph-builder.js +172 -0
  553. package/dist/core/sort/graph-utils.d.ts +14 -0
  554. package/dist/core/sort/graph-utils.js +41 -0
  555. package/dist/core/sort/logical-sort.d.ts +26 -0
  556. package/dist/core/sort/logical-sort.js +532 -0
  557. package/dist/core/sort/sort-changes.d.ts +28 -0
  558. package/dist/core/sort/sort-changes.js +147 -0
  559. package/dist/core/sort/topological-sort.d.ts +20 -0
  560. package/dist/core/sort/topological-sort.js +138 -0
  561. package/dist/core/sort/types.d.ts +102 -0
  562. package/dist/core/sort/types.js +1 -0
  563. package/dist/core/sort/utils.d.ts +23 -0
  564. package/dist/core/sort/utils.js +51 -0
  565. package/dist/index.d.ts +1 -0
  566. package/dist/index.js +1 -0
  567. package/package.json +58 -12
@@ -0,0 +1,182 @@
1
+ import { diffObjects } from "../base.diff.js";
2
+ import { deepEqual, hasNonAlterableChanges } from "../utils.js";
3
+ import { AlterIndexSetStatistics, AlterIndexSetStorageParams, AlterIndexSetTablespace, } from "./changes/index.alter.js";
4
+ import { CreateCommentOnIndex, DropCommentOnIndex, } from "./changes/index.comment.js";
5
+ import { CreateIndex } from "./changes/index.create.js";
6
+ import { DropIndex } from "./changes/index.drop.js";
7
+ /**
8
+ * Diff two sets of indexes from main and branch catalogs.
9
+ *
10
+ * @param main - The indexes in the main catalog.
11
+ * @param branch - The indexes in the branch catalog.
12
+ * @param branchIndexableObjects - Table-like objects (tables, materialized views) in branch.
13
+ * @returns A list of changes to apply to main to make it match branch.
14
+ */
15
+ export function diffIndexes(main, branch, branchIndexableObjects) {
16
+ const { created, dropped, altered } = diffObjects(main, branch);
17
+ const changes = [];
18
+ for (const indexId of created) {
19
+ const index = branch[indexId];
20
+ // Skip constraint-owned or primary indexes; they are created by constraint DDL
21
+ if (index.is_owned_by_constraint || index.is_primary) {
22
+ continue;
23
+ }
24
+ // Skip index partitions - they are automatically created when the parent partitioned index is created
25
+ if (index.is_index_partition) {
26
+ continue;
27
+ }
28
+ changes.push(new CreateIndex({
29
+ index,
30
+ indexableObject: branchIndexableObjects[index.tableStableId],
31
+ }));
32
+ if (index.comment !== null) {
33
+ changes.push(new CreateCommentOnIndex({ index }));
34
+ }
35
+ }
36
+ for (const indexId of dropped) {
37
+ const index = main[indexId];
38
+ // Constraint-owned or primary indexes are handled by constraint/table drops
39
+ if (index.is_owned_by_constraint ||
40
+ index.is_primary ||
41
+ !branchIndexableObjects[index.tableStableId]) {
42
+ continue;
43
+ }
44
+ // Skip index partitions - they are automatically dropped when the parent partitioned index is dropped
45
+ if (index.is_index_partition) {
46
+ continue;
47
+ }
48
+ changes.push(new DropIndex({ index: main[indexId] }));
49
+ }
50
+ for (const indexId of altered) {
51
+ const mainIndex = main[indexId];
52
+ const branchIndex = branch[indexId];
53
+ // Constraint-owned or primary indexes are handled by constraint/table DDL
54
+ if (mainIndex.is_owned_by_constraint || mainIndex.is_primary) {
55
+ continue;
56
+ }
57
+ if (branchIndex.is_owned_by_constraint || branchIndex.is_primary) {
58
+ continue;
59
+ }
60
+ // Skip index partitions - they are automatically updated when the parent partitioned index is updated
61
+ if (mainIndex.is_index_partition || branchIndex.is_index_partition) {
62
+ continue;
63
+ }
64
+ // Check if non-alterable properties have changed
65
+ // These require dropping and recreating the index
66
+ // Note: key_columns is excluded because it contains attribute numbers that can differ
67
+ // between databases even when indexes are logically identical. The definition field
68
+ // already captures the logical structure using column names, so we compare by definition instead.
69
+ const NON_ALTERABLE_FIELDS = [
70
+ "index_type",
71
+ "is_unique",
72
+ "is_primary",
73
+ "is_exclusion",
74
+ "nulls_not_distinct",
75
+ "immediate",
76
+ "is_clustered",
77
+ "is_replica_identity",
78
+ "column_collations",
79
+ "operator_classes",
80
+ "column_options",
81
+ "index_expressions",
82
+ "partial_predicate",
83
+ "definition", // Compare by definition instead of key_columns
84
+ ];
85
+ const nonAlterablePropsChanged = hasNonAlterableChanges(mainIndex, branchIndex, NON_ALTERABLE_FIELDS, {
86
+ column_collations: deepEqual,
87
+ operator_classes: deepEqual,
88
+ column_options: deepEqual,
89
+ definition: (a, b) => {
90
+ // Normalize definitions by removing "USING btree" (default) for comparison
91
+ const normalize = (def) => def.replace(/\s+USING\s+btree/gi, "");
92
+ return normalize(a) === normalize(b);
93
+ },
94
+ });
95
+ if (nonAlterablePropsChanged) {
96
+ // Replace the entire index (drop + create)
97
+ changes.push(new DropIndex({ index: mainIndex }), new CreateIndex({
98
+ index: branchIndex,
99
+ indexableObject: branchIndexableObjects[branchIndex.tableStableId],
100
+ }));
101
+ }
102
+ else {
103
+ // Only alterable properties changed - check each one
104
+ // STORAGE PARAMS
105
+ if (JSON.stringify(mainIndex.storage_params) !==
106
+ JSON.stringify(branchIndex.storage_params)) {
107
+ const parseOptions = (options) => {
108
+ const map = new Map();
109
+ for (const opt of options) {
110
+ const eqIndex = opt.indexOf("=");
111
+ const key = opt.slice(0, eqIndex);
112
+ const value = opt.slice(eqIndex + 1);
113
+ map.set(key, value);
114
+ }
115
+ return map;
116
+ };
117
+ const mainMap = parseOptions(mainIndex.storage_params);
118
+ const branchMap = parseOptions(branchIndex.storage_params);
119
+ const keysToReset = [];
120
+ for (const key of mainMap.keys()) {
121
+ if (!branchMap.has(key)) {
122
+ keysToReset.push(key);
123
+ }
124
+ }
125
+ const paramsToSet = [];
126
+ for (const [key, newValue] of branchMap.entries()) {
127
+ const oldValue = mainMap.get(key);
128
+ const changed = oldValue !== newValue;
129
+ if (changed) {
130
+ paramsToSet.push(`${key}=${newValue}`);
131
+ }
132
+ }
133
+ changes.push(new AlterIndexSetStorageParams({
134
+ index: mainIndex,
135
+ paramsToSet,
136
+ keysToReset,
137
+ }));
138
+ }
139
+ // STATISTICS TARGET
140
+ if (JSON.stringify(mainIndex.statistics_target) !==
141
+ JSON.stringify(branchIndex.statistics_target)) {
142
+ const columnTargets = [];
143
+ const mainTargets = mainIndex.statistics_target;
144
+ const branchTargets = branchIndex.statistics_target;
145
+ const length = Math.max(mainTargets.length, branchTargets.length);
146
+ for (let i = 0; i < length; i++) {
147
+ const oldVal = mainTargets[i];
148
+ const newVal = branchTargets[i];
149
+ if (oldVal !== newVal && newVal !== undefined) {
150
+ columnTargets.push({ columnNumber: i + 1, statistics: newVal });
151
+ }
152
+ }
153
+ if (columnTargets.length > 0) {
154
+ changes.push(new AlterIndexSetStatistics({ index: mainIndex, columnTargets }));
155
+ }
156
+ }
157
+ // TABLESPACE
158
+ if (mainIndex.tablespace !== branchIndex.tablespace) {
159
+ const nextTablespace = branchIndex.tablespace;
160
+ if (nextTablespace !== null) {
161
+ changes.push(new AlterIndexSetTablespace({
162
+ index: mainIndex,
163
+ tablespace: nextTablespace,
164
+ }));
165
+ }
166
+ }
167
+ // COMMENT
168
+ if (mainIndex.comment !== branchIndex.comment) {
169
+ if (branchIndex.comment === null) {
170
+ changes.push(new DropCommentOnIndex({ index: mainIndex }));
171
+ }
172
+ else {
173
+ changes.push(new CreateCommentOnIndex({ index: branchIndex }));
174
+ }
175
+ }
176
+ // Note: Index renaming would also use ALTER INDEX ... RENAME TO ...
177
+ // But since our Index model uses 'name' as the identity field,
178
+ // a name change would be handled as drop + create by diffObjects()
179
+ }
180
+ }
181
+ return changes;
182
+ }
@@ -0,0 +1,150 @@
1
+ import type { Sql } from "postgres";
2
+ import z from "zod";
3
+ import { BasePgModel } from "../base.model.ts";
4
+ declare const indexPropsSchema: z.ZodObject<{
5
+ schema: z.ZodString;
6
+ table_name: z.ZodString;
7
+ name: z.ZodString;
8
+ storage_params: z.ZodArray<z.ZodString>;
9
+ statistics_target: z.ZodArray<z.ZodNumber>;
10
+ index_type: z.ZodString;
11
+ tablespace: z.ZodNullable<z.ZodString>;
12
+ is_unique: z.ZodBoolean;
13
+ is_primary: z.ZodBoolean;
14
+ is_exclusion: z.ZodBoolean;
15
+ nulls_not_distinct: z.ZodBoolean;
16
+ immediate: z.ZodBoolean;
17
+ is_clustered: z.ZodBoolean;
18
+ is_replica_identity: z.ZodBoolean;
19
+ key_columns: z.ZodArray<z.ZodNumber>;
20
+ column_collations: z.ZodArray<z.ZodString>;
21
+ operator_classes: z.ZodArray<z.ZodString>;
22
+ column_options: z.ZodArray<z.ZodNumber>;
23
+ index_expressions: z.ZodNullable<z.ZodString>;
24
+ partial_predicate: z.ZodNullable<z.ZodString>;
25
+ is_owned_by_constraint: z.ZodBoolean;
26
+ table_relkind: z.ZodEnum<{
27
+ r: "r";
28
+ m: "m";
29
+ p: "p";
30
+ }>;
31
+ is_partitioned_index: z.ZodBoolean;
32
+ is_index_partition: z.ZodBoolean;
33
+ parent_index_name: z.ZodNullable<z.ZodString>;
34
+ definition: z.ZodString;
35
+ comment: z.ZodNullable<z.ZodString>;
36
+ owner: z.ZodString;
37
+ }, z.z.core.$strip>;
38
+ /**
39
+ * All properties exposed by CREATE INDEX statement are included in diff output.
40
+ * https://www.postgresql.org/docs/current/sql-createindex.html
41
+ *
42
+ * ALTER INDEX statement can only be generated for a subset of properties:
43
+ * - name, storage param, statistics, tablespace, attach partition
44
+ * https://www.postgresql.org/docs/current/sql-alterindex.html
45
+ *
46
+ * Unsupported alter properties include
47
+ * - depends on extension (all extension dependencies are excluded)
48
+ *
49
+ * Other properties require dropping and creating a new index.
50
+ */
51
+ export type IndexProps = z.infer<typeof indexPropsSchema>;
52
+ export declare class Index extends BasePgModel {
53
+ readonly schema: IndexProps["schema"];
54
+ readonly table_name: IndexProps["table_name"];
55
+ readonly name: IndexProps["name"];
56
+ readonly storage_params: IndexProps["storage_params"];
57
+ readonly statistics_target: IndexProps["statistics_target"];
58
+ readonly index_type: IndexProps["index_type"];
59
+ readonly tablespace: IndexProps["tablespace"];
60
+ readonly is_unique: IndexProps["is_unique"];
61
+ readonly is_primary: IndexProps["is_primary"];
62
+ readonly is_exclusion: IndexProps["is_exclusion"];
63
+ readonly nulls_not_distinct: IndexProps["nulls_not_distinct"];
64
+ readonly immediate: IndexProps["immediate"];
65
+ readonly is_clustered: IndexProps["is_clustered"];
66
+ readonly is_replica_identity: IndexProps["is_replica_identity"];
67
+ readonly key_columns: IndexProps["key_columns"];
68
+ readonly column_collations: IndexProps["column_collations"];
69
+ readonly operator_classes: IndexProps["operator_classes"];
70
+ readonly column_options: IndexProps["column_options"];
71
+ readonly index_expressions: IndexProps["index_expressions"];
72
+ readonly partial_predicate: IndexProps["partial_predicate"];
73
+ readonly table_relkind: IndexProps["table_relkind"];
74
+ readonly is_owned_by_constraint: IndexProps["is_owned_by_constraint"];
75
+ readonly is_partitioned_index: IndexProps["is_partitioned_index"];
76
+ readonly is_index_partition: IndexProps["is_index_partition"];
77
+ readonly parent_index_name: IndexProps["parent_index_name"];
78
+ readonly definition: IndexProps["definition"];
79
+ readonly comment: IndexProps["comment"];
80
+ readonly owner: IndexProps["owner"];
81
+ constructor(props: IndexProps);
82
+ get stableId(): `index:${string}`;
83
+ get tableStableId(): `table:${string}` | `materializedView:${string}`;
84
+ get identityFields(): {
85
+ schema: string;
86
+ table_name: string;
87
+ name: string;
88
+ };
89
+ get dataFields(): {
90
+ storage_params: string[];
91
+ statistics_target: number[];
92
+ index_type: string;
93
+ tablespace: string | null;
94
+ is_unique: boolean;
95
+ is_primary: boolean;
96
+ is_exclusion: boolean;
97
+ nulls_not_distinct: boolean;
98
+ immediate: boolean;
99
+ is_clustered: boolean;
100
+ is_replica_identity: boolean;
101
+ column_collations: string[];
102
+ operator_classes: string[];
103
+ column_options: number[];
104
+ index_expressions: string | null;
105
+ partial_predicate: string | null;
106
+ table_relkind: "r" | "m" | "p";
107
+ is_owned_by_constraint: boolean;
108
+ is_partitioned_index: boolean;
109
+ is_index_partition: boolean;
110
+ parent_index_name: string | null;
111
+ definition: string;
112
+ comment: string | null;
113
+ owner: string;
114
+ };
115
+ stableSnapshot(): {
116
+ identity: {
117
+ schema: string;
118
+ table_name: string;
119
+ name: string;
120
+ };
121
+ data: {
122
+ statistics_target: unknown;
123
+ column_options: unknown;
124
+ column_collations: unknown;
125
+ operator_classes: unknown;
126
+ storage_params: string[];
127
+ index_type: string;
128
+ tablespace: string | null;
129
+ is_unique: boolean;
130
+ is_primary: boolean;
131
+ is_exclusion: boolean;
132
+ nulls_not_distinct: boolean;
133
+ immediate: boolean;
134
+ is_clustered: boolean;
135
+ is_replica_identity: boolean;
136
+ index_expressions: string | null;
137
+ partial_predicate: string | null;
138
+ table_relkind: "r" | "m" | "p";
139
+ is_owned_by_constraint: boolean;
140
+ is_partitioned_index: boolean;
141
+ is_index_partition: boolean;
142
+ parent_index_name: string | null;
143
+ definition: string;
144
+ comment: string | null;
145
+ owner: string;
146
+ };
147
+ };
148
+ }
149
+ export declare function extractIndexes(sql: Sql): Promise<Index[]>;
150
+ export {};
@@ -0,0 +1,340 @@
1
+ import z from "zod";
2
+ import { BasePgModel } from "../base.model.js";
3
+ const TableRelkindSchema = z.enum([
4
+ "r", // table (regular relation)
5
+ "m", // materialized view
6
+ "p", // partitioned table
7
+ ]);
8
+ const indexPropsSchema = z.object({
9
+ schema: z.string(),
10
+ table_name: z.string(),
11
+ name: z.string(),
12
+ storage_params: z.array(z.string()),
13
+ statistics_target: z.array(z.number()),
14
+ index_type: z.string(),
15
+ tablespace: z.string().nullable(),
16
+ is_unique: z.boolean(),
17
+ is_primary: z.boolean(),
18
+ is_exclusion: z.boolean(),
19
+ nulls_not_distinct: z.boolean(),
20
+ immediate: z.boolean(),
21
+ is_clustered: z.boolean(),
22
+ is_replica_identity: z.boolean(),
23
+ key_columns: z.array(z.number()),
24
+ column_collations: z.array(z.string()),
25
+ operator_classes: z.array(z.string()),
26
+ column_options: z.array(z.number()),
27
+ index_expressions: z.string().nullable(),
28
+ partial_predicate: z.string().nullable(),
29
+ is_owned_by_constraint: z.boolean(),
30
+ table_relkind: TableRelkindSchema, // 'r' for table, 'm' for materialized view
31
+ is_partitioned_index: z.boolean(),
32
+ is_index_partition: z.boolean(),
33
+ parent_index_name: z.string().nullable(),
34
+ definition: z.string(),
35
+ comment: z.string().nullable(),
36
+ owner: z.string(),
37
+ });
38
+ export class Index extends BasePgModel {
39
+ schema;
40
+ table_name;
41
+ name;
42
+ storage_params;
43
+ statistics_target;
44
+ index_type;
45
+ tablespace;
46
+ is_unique;
47
+ is_primary;
48
+ is_exclusion;
49
+ nulls_not_distinct;
50
+ immediate;
51
+ is_clustered;
52
+ is_replica_identity;
53
+ key_columns;
54
+ column_collations;
55
+ operator_classes;
56
+ column_options;
57
+ index_expressions;
58
+ partial_predicate;
59
+ table_relkind;
60
+ is_owned_by_constraint;
61
+ is_partitioned_index;
62
+ is_index_partition;
63
+ parent_index_name;
64
+ definition;
65
+ comment;
66
+ owner;
67
+ constructor(props) {
68
+ super();
69
+ // Identity fields
70
+ this.schema = props.schema;
71
+ this.table_name = props.table_name;
72
+ this.name = props.name;
73
+ // Data fields
74
+ this.storage_params = props.storage_params;
75
+ this.statistics_target = props.statistics_target;
76
+ this.index_type = props.index_type;
77
+ this.tablespace = props.tablespace;
78
+ this.is_unique = props.is_unique;
79
+ this.is_primary = props.is_primary;
80
+ this.is_exclusion = props.is_exclusion;
81
+ this.nulls_not_distinct = props.nulls_not_distinct;
82
+ this.immediate = props.immediate;
83
+ this.is_clustered = props.is_clustered;
84
+ this.is_replica_identity = props.is_replica_identity;
85
+ this.key_columns = props.key_columns;
86
+ this.column_collations = props.column_collations;
87
+ this.operator_classes = props.operator_classes;
88
+ this.column_options = props.column_options;
89
+ this.index_expressions = props.index_expressions;
90
+ this.partial_predicate = props.partial_predicate;
91
+ this.table_relkind = props.table_relkind;
92
+ this.is_owned_by_constraint = props.is_owned_by_constraint;
93
+ this.is_partitioned_index = props.is_partitioned_index;
94
+ this.is_index_partition = props.is_index_partition;
95
+ this.parent_index_name = props.parent_index_name;
96
+ this.definition = props.definition;
97
+ this.comment = props.comment;
98
+ this.owner = props.owner;
99
+ }
100
+ get stableId() {
101
+ return `index:${this.schema}.${this.table_name}.${this.name}`;
102
+ }
103
+ get tableStableId() {
104
+ // Materialized views use a different stableId prefix
105
+ if (this.table_relkind === "m") {
106
+ return `materializedView:${this.schema}.${this.table_name}`;
107
+ }
108
+ return `table:${this.schema}.${this.table_name}`;
109
+ }
110
+ get identityFields() {
111
+ return {
112
+ schema: this.schema,
113
+ table_name: this.table_name,
114
+ name: this.name,
115
+ };
116
+ }
117
+ get dataFields() {
118
+ return {
119
+ storage_params: this.storage_params,
120
+ statistics_target: this.statistics_target,
121
+ index_type: this.index_type,
122
+ tablespace: this.tablespace,
123
+ is_unique: this.is_unique,
124
+ is_primary: this.is_primary,
125
+ is_exclusion: this.is_exclusion,
126
+ nulls_not_distinct: this.nulls_not_distinct,
127
+ immediate: this.immediate,
128
+ is_clustered: this.is_clustered,
129
+ is_replica_identity: this.is_replica_identity,
130
+ // key_columns excluded: contains attribute numbers that can differ between databases
131
+ // even when indexes are logically identical. The definition field already captures
132
+ // the logical structure using column names, so we compare by definition instead.
133
+ column_collations: this.column_collations,
134
+ operator_classes: this.operator_classes,
135
+ column_options: this.column_options,
136
+ index_expressions: this.index_expressions,
137
+ partial_predicate: this.partial_predicate,
138
+ table_relkind: this.table_relkind,
139
+ is_owned_by_constraint: this.is_owned_by_constraint,
140
+ is_partitioned_index: this.is_partitioned_index,
141
+ is_index_partition: this.is_index_partition,
142
+ parent_index_name: this.parent_index_name,
143
+ definition: this.definition,
144
+ comment: this.comment,
145
+ owner: this.owner,
146
+ };
147
+ }
148
+ stableSnapshot() {
149
+ const normalizeArray = (arr) => {
150
+ if (!Array.isArray(arr))
151
+ return arr;
152
+ return [...arr].map((v) => normalizeValue(v));
153
+ };
154
+ const normalizeValue = (v) => {
155
+ if (Array.isArray(v))
156
+ return normalizeArray(v);
157
+ if (v && typeof v === "object") {
158
+ return Object.fromEntries(Object.entries(v).map(([k, val]) => [
159
+ k,
160
+ normalizeValue(val),
161
+ ]));
162
+ }
163
+ return v;
164
+ };
165
+ return {
166
+ identity: this.identityFields,
167
+ data: {
168
+ ...this.dataFields,
169
+ statistics_target: normalizeArray(this.statistics_target),
170
+ column_options: normalizeArray(this.column_options),
171
+ column_collations: normalizeArray(this.column_collations),
172
+ operator_classes: normalizeArray(this.operator_classes),
173
+ },
174
+ };
175
+ }
176
+ }
177
+ export async function extractIndexes(sql) {
178
+ return sql.begin(async (sql) => {
179
+ await sql `set search_path = ''`;
180
+ const indexRows = await sql `
181
+ with extension_oids as (
182
+ select objid
183
+ from pg_depend d
184
+ where d.refclassid = 'pg_extension'::regclass
185
+ and d.classid = 'pg_class'::regclass
186
+ ),
187
+ -- align every per-column array by ordinality (1..indnatts)
188
+ -- this is used to ensure that key_columns, column_collations, operator_classes, and column_options are aligned
189
+ idx_cols as (
190
+ select
191
+ i.indexrelid,
192
+ i.indrelid,
193
+ k.ord,
194
+ k.attnum,
195
+ -- collation: only for key cols; 0 for none/default
196
+ case when k.ord <= i.indnkeyatts then coalesce(coll.oid, 0) else 0 end as coll_oid,
197
+ -- opclass: one per column
198
+ coalesce(cls.oid, 0) as cls_oid,
199
+ -- options: only for key cols; 0 for include cols
200
+ case when k.ord <= i.indnkeyatts then coalesce(opt.val, 0) else 0 end::int2 as indopt
201
+ from pg_index i
202
+ join lateral unnest(i.indkey) with ordinality as k(attnum, ord) on true
203
+ left join lateral unnest(i.indcollation) with ordinality as coll(oid, ordc) on ordc = k.ord
204
+ left join lateral unnest(i.indclass) with ordinality as cls(oid, ordo) on ordo = k.ord
205
+ left join lateral unnest(i.indoption) with ordinality as opt(val, ordi) on ordi = k.ord
206
+ )
207
+ select
208
+ c.relnamespace::regnamespace::text as schema,
209
+ quote_ident(tc.relname) as table_name,
210
+ tc.relkind as table_relkind,
211
+ quote_ident(c.relname) as name,
212
+ coalesce(c.reloptions, array[]::text[]) as storage_params,
213
+ am.amname as index_type,
214
+ quote_ident(ts.spcname) as tablespace,
215
+ i.indisunique as is_unique,
216
+ i.indisprimary as is_primary,
217
+ i.indisexclusion as is_exclusion,
218
+ i.indnullsnotdistinct as nulls_not_distinct,
219
+ i.indimmediate as immediate,
220
+ i.indisclustered as is_clustered,
221
+ i.indisreplident as is_replica_identity,
222
+ i.indkey as key_columns,
223
+
224
+ -- NEW: partitioned-index / index-partition tagging
225
+ (c.relkind = 'I') as is_partitioned_index,
226
+ (parent_idx.oid is not null) as is_index_partition,
227
+ case
228
+ when parent_idx.oid is not null then
229
+ quote_ident(parent_idx_ns.nspname) || '.' || quote_ident(parent_idx.relname)
230
+ end as parent_index_name,
231
+
232
+ -- Foreign keys don’t create/own an index; their conindid points to the referenced PK/UNIQUE index.
233
+ -- Mark as is_owned_by_constraint only when the owning constraint is PK/UNIQUE/EXCLUSION.
234
+ exists (
235
+ select 1
236
+ from pg_depend d
237
+ join pg_constraint pc on pc.oid = d.refobjid
238
+ where d.classid = 'pg_class'::regclass
239
+ and d.objid = i.indexrelid
240
+ and d.refclassid = 'pg_constraint'::regclass
241
+ and d.deptype = 'i'
242
+ and pc.contype in ('p','u','x')
243
+ ) as is_owned_by_constraint,
244
+
245
+ -- per-column arrays from one pass over idx_cols
246
+ coalesce(agg.column_collations, array[]::text[]) as column_collations,
247
+ coalesce(agg.operator_classes, array[]::text[]) as operator_classes,
248
+ coalesce(agg.column_options, array[]::int2[]) as column_options,
249
+
250
+ -- always an array (possibly empty), ordered by index attnum
251
+ coalesce(st.statistics_target, array[]::int4[]) as statistics_target,
252
+
253
+ pg_get_expr(i.indexprs, i.indrelid) as index_expressions,
254
+ pg_get_expr(i.indpred, i.indrelid) as partial_predicate,
255
+ pg_get_indexdef(i.indexrelid, 0, true) as definition,
256
+ obj_description(c.oid, 'pg_class') as comment,
257
+ c.relowner::regrole::text as owner
258
+
259
+ from pg_index i
260
+ join pg_class c on c.oid = i.indexrelid
261
+ join pg_class tc on tc.oid = i.indrelid
262
+ join pg_am am on am.oid = c.relam
263
+ left join pg_tablespace ts on ts.oid = c.reltablespace
264
+ left join extension_oids e on c.oid = e.objid
265
+ left join extension_oids e_table on tc.oid = e_table.objid
266
+
267
+ -- NEW: detect whether this index is an attached partition of a partitioned index
268
+ left join pg_inherits inh_idx
269
+ on inh_idx.inhrelid = c.oid
270
+ left join pg_class parent_idx
271
+ on parent_idx.oid = inh_idx.inhparent
272
+ left join pg_namespace parent_idx_ns
273
+ on parent_idx_ns.oid = parent_idx.relnamespace
274
+
275
+ -- single lateral aggregate keeps order by ic2.ord
276
+ left join lateral (
277
+ select
278
+ array_agg(
279
+ case
280
+ when ic2.coll_oid = 0 then null
281
+ when col.collname = 'default'
282
+ and col.collnamespace = 'pg_catalog'::regnamespace then null
283
+ else quote_ident(ns_coll.nspname) || '.' || quote_ident(col.collname)
284
+ end
285
+ order by ic2.ord
286
+ ) as column_collations,
287
+
288
+ -- 'default' when the AM's default opclass applies to the column's base type
289
+ array_agg(
290
+ case
291
+ when oc.oid is null then 'default'
292
+ when ic2.attnum = 0 then oc.opcnamespace::regnamespace::text || '.' || quote_ident(oc.opcname) -- expression key: no column type
293
+ -- in the case where the opclass is the default for the column's base type
294
+ when oc.opcdefault and (
295
+ (case when t.typtype = 'd' then t.typbasetype else a.atttypid end) = oc.opcintype
296
+ or exists (
297
+ select 1
298
+ from pg_catalog.pg_cast pc
299
+ where pc.castsource = (case when t.typtype = 'd' then t.typbasetype else a.atttypid end)
300
+ and pc.casttarget = oc.opcintype
301
+ and pc.castcontext = 'i' -- implicit
302
+ )
303
+ )
304
+ then 'default'
305
+ else oc.opcnamespace::regnamespace::text || '.' || quote_ident(oc.opcname)
306
+ end
307
+ order by ic2.ord
308
+ ) as operator_classes,
309
+
310
+ array_agg(coalesce(ic2.indopt, 0)::int2 order by ic2.ord) as column_options
311
+
312
+ from idx_cols ic2
313
+ left join pg_collation col on col.oid = ic2.coll_oid
314
+ left join pg_namespace ns_coll on ns_coll.oid = col.collnamespace
315
+ left join pg_opclass oc on oc.oid = ic2.cls_oid
316
+ -- base type for the underlying column (domain -> base); NULL for expressions
317
+ left join pg_attribute a on a.attrelid = ic2.indrelid and a.attnum = ic2.attnum
318
+ left join pg_type t on t.oid = a.atttypid
319
+ where ic2.indexrelid = i.indexrelid
320
+ ) as agg on true
321
+
322
+ left join lateral (
323
+ select array_agg(coalesce(a2.attstattarget, -1) order by a2.attnum) as statistics_target
324
+ from pg_attribute a2
325
+ where a2.attrelid = i.indexrelid
326
+ and a2.attnum > 0
327
+ ) as st on true
328
+
329
+ where not c.relnamespace::regnamespace::text like any(array['pg\\_%', 'information\\_schema'])
330
+ and i.indislive is true
331
+ and e.objid is null
332
+ and e_table.objid is null
333
+
334
+ order by 1, 2;
335
+ `;
336
+ // Validate and parse each row using the Zod schema
337
+ const validatedRows = indexRows.map((row) => indexPropsSchema.parse(row));
338
+ return validatedRows.map((row) => new Index(row));
339
+ });
340
+ }