@rocicorp/zero 0.17.2025022800 → 0.17.2025030600

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 (252) hide show
  1. package/out/{chunk-5BT5TJFM.js → chunk-XXZWDMNW.js} +4025 -531
  2. package/out/chunk-XXZWDMNW.js.map +7 -0
  3. package/out/react.js +19 -11
  4. package/out/react.js.map +2 -2
  5. package/out/shared/src/set-utils.d.ts +1 -1
  6. package/out/shared/src/set-utils.js +1 -1
  7. package/out/solid.js +9 -5
  8. package/out/solid.js.map +2 -2
  9. package/out/zero-cache/src/auth/read-authorizer.d.ts.map +1 -1
  10. package/out/zero-cache/src/auth/read-authorizer.js +0 -1
  11. package/out/zero-cache/src/auth/read-authorizer.js.map +1 -1
  12. package/out/zero-cache/src/config/zero-config.d.ts +46 -13
  13. package/out/zero-cache/src/config/zero-config.d.ts.map +1 -1
  14. package/out/zero-cache/src/config/zero-config.js +76 -32
  15. package/out/zero-cache/src/config/zero-config.js.map +1 -1
  16. package/out/zero-cache/src/db/migration-lite.d.ts.map +1 -1
  17. package/out/zero-cache/src/db/migration-lite.js +12 -6
  18. package/out/zero-cache/src/db/migration-lite.js.map +1 -1
  19. package/out/zero-cache/src/db/migration.d.ts +1 -1
  20. package/out/zero-cache/src/db/migration.d.ts.map +1 -1
  21. package/out/zero-cache/src/db/migration.js +16 -5
  22. package/out/zero-cache/src/db/migration.js.map +1 -1
  23. package/out/zero-cache/src/db/pg-to-lite.d.ts +4 -0
  24. package/out/zero-cache/src/db/pg-to-lite.d.ts.map +1 -1
  25. package/out/zero-cache/src/db/pg-to-lite.js +14 -4
  26. package/out/zero-cache/src/db/pg-to-lite.js.map +1 -1
  27. package/out/zero-cache/src/scripts/deploy-permissions.js +35 -20
  28. package/out/zero-cache/src/scripts/deploy-permissions.js.map +1 -1
  29. package/out/zero-cache/src/scripts/permissions.d.ts +17 -0
  30. package/out/zero-cache/src/scripts/permissions.d.ts.map +1 -1
  31. package/out/zero-cache/src/scripts/permissions.js +3 -1
  32. package/out/zero-cache/src/scripts/permissions.js.map +1 -1
  33. package/out/zero-cache/src/server/change-streamer.d.ts.map +1 -1
  34. package/out/zero-cache/src/server/change-streamer.js +11 -10
  35. package/out/zero-cache/src/server/change-streamer.js.map +1 -1
  36. package/out/zero-cache/src/server/main.d.ts.map +1 -1
  37. package/out/zero-cache/src/server/main.js +11 -4
  38. package/out/zero-cache/src/server/main.js.map +1 -1
  39. package/out/zero-cache/src/server/multi/config.d.ts +23 -9
  40. package/out/zero-cache/src/server/multi/config.d.ts.map +1 -1
  41. package/out/zero-cache/src/server/multi/config.js +2 -4
  42. package/out/zero-cache/src/server/multi/config.js.map +1 -1
  43. package/out/zero-cache/src/server/multi/run-worker.d.ts.map +1 -1
  44. package/out/zero-cache/src/server/multi/run-worker.js +1 -3
  45. package/out/zero-cache/src/server/multi/run-worker.js.map +1 -1
  46. package/out/zero-cache/src/server/replicator.js +1 -1
  47. package/out/zero-cache/src/server/replicator.js.map +1 -1
  48. package/out/zero-cache/src/server/syncer.d.ts.map +1 -1
  49. package/out/zero-cache/src/server/syncer.js +14 -12
  50. package/out/zero-cache/src/server/syncer.js.map +1 -1
  51. package/out/zero-cache/src/services/change-source/custom/change-source.d.ts +5 -5
  52. package/out/zero-cache/src/services/change-source/custom/change-source.d.ts.map +1 -1
  53. package/out/zero-cache/src/services/change-source/custom/change-source.js +21 -19
  54. package/out/zero-cache/src/services/change-source/custom/change-source.js.map +1 -1
  55. package/out/zero-cache/src/services/change-source/custom/sync-schema.d.ts +2 -2
  56. package/out/zero-cache/src/services/change-source/custom/sync-schema.d.ts.map +1 -1
  57. package/out/zero-cache/src/services/change-source/custom/sync-schema.js +2 -2
  58. package/out/zero-cache/src/services/change-source/custom/sync-schema.js.map +1 -1
  59. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts +5 -5
  60. package/out/zero-cache/src/services/change-source/pg/change-source.d.ts.map +1 -1
  61. package/out/zero-cache/src/services/change-source/pg/change-source.js +41 -34
  62. package/out/zero-cache/src/services/change-source/pg/change-source.js.map +1 -1
  63. package/out/zero-cache/src/services/change-source/pg/decommission.d.ts +4 -0
  64. package/out/zero-cache/src/services/change-source/pg/decommission.d.ts.map +1 -0
  65. package/out/zero-cache/src/services/change-source/pg/decommission.js +21 -0
  66. package/out/zero-cache/src/services/change-source/pg/decommission.js.map +1 -0
  67. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts +4 -3
  68. package/out/zero-cache/src/services/change-source/pg/initial-sync.d.ts.map +1 -1
  69. package/out/zero-cache/src/services/change-source/pg/initial-sync.js +45 -25
  70. package/out/zero-cache/src/services/change-source/pg/initial-sync.js.map +1 -1
  71. package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts +3 -2
  72. package/out/zero-cache/src/services/change-source/pg/schema/ddl.d.ts.map +1 -1
  73. package/out/zero-cache/src/services/change-source/pg/schema/ddl.js +35 -16
  74. package/out/zero-cache/src/services/change-source/pg/schema/ddl.js.map +1 -1
  75. package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts +4 -3
  76. package/out/zero-cache/src/services/change-source/pg/schema/init.d.ts.map +1 -1
  77. package/out/zero-cache/src/services/change-source/pg/schema/init.js +53 -13
  78. package/out/zero-cache/src/services/change-source/pg/schema/init.js.map +1 -1
  79. package/out/zero-cache/src/services/change-source/pg/schema/published.d.ts +2 -2
  80. package/out/zero-cache/src/services/change-source/pg/schema/published.d.ts.map +1 -1
  81. package/out/zero-cache/src/services/change-source/pg/schema/published.js.map +1 -1
  82. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts +10 -12
  83. package/out/zero-cache/src/services/change-source/pg/schema/shard.d.ts.map +1 -1
  84. package/out/zero-cache/src/services/change-source/pg/schema/shard.js +52 -53
  85. package/out/zero-cache/src/services/change-source/pg/schema/shard.js.map +1 -1
  86. package/out/zero-cache/src/services/change-source/pg/sync-schema.d.ts +2 -2
  87. package/out/zero-cache/src/services/change-source/pg/sync-schema.d.ts.map +1 -1
  88. package/out/zero-cache/src/services/change-source/pg/sync-schema.js +11 -2
  89. package/out/zero-cache/src/services/change-source/pg/sync-schema.js.map +1 -1
  90. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts +3 -2
  91. package/out/zero-cache/src/services/change-streamer/change-streamer-service.d.ts.map +1 -1
  92. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js +11 -11
  93. package/out/zero-cache/src/services/change-streamer/change-streamer-service.js.map +1 -1
  94. package/out/zero-cache/src/services/change-streamer/schema/init.d.ts +3 -2
  95. package/out/zero-cache/src/services/change-streamer/schema/init.d.ts.map +1 -1
  96. package/out/zero-cache/src/services/change-streamer/schema/init.js +25 -14
  97. package/out/zero-cache/src/services/change-streamer/schema/init.js.map +1 -1
  98. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts +6 -5
  99. package/out/zero-cache/src/services/change-streamer/schema/tables.d.ts.map +1 -1
  100. package/out/zero-cache/src/services/change-streamer/schema/tables.js +28 -26
  101. package/out/zero-cache/src/services/change-streamer/schema/tables.js.map +1 -1
  102. package/out/zero-cache/src/services/change-streamer/storer.d.ts +4 -2
  103. package/out/zero-cache/src/services/change-streamer/storer.d.ts.map +1 -1
  104. package/out/zero-cache/src/services/change-streamer/storer.js +19 -9
  105. package/out/zero-cache/src/services/change-streamer/storer.js.map +1 -1
  106. package/out/zero-cache/src/services/litestream/commands.d.ts +1 -1
  107. package/out/zero-cache/src/services/litestream/commands.d.ts.map +1 -1
  108. package/out/zero-cache/src/services/litestream/commands.js +3 -3
  109. package/out/zero-cache/src/services/litestream/commands.js.map +1 -1
  110. package/out/zero-cache/src/services/mutagen/mutagen.d.ts +3 -2
  111. package/out/zero-cache/src/services/mutagen/mutagen.d.ts.map +1 -1
  112. package/out/zero-cache/src/services/mutagen/mutagen.js +14 -16
  113. package/out/zero-cache/src/services/mutagen/mutagen.js.map +1 -1
  114. package/out/zero-cache/src/services/replicator/schema/replication-state.d.ts +14 -5
  115. package/out/zero-cache/src/services/replicator/schema/replication-state.d.ts.map +1 -1
  116. package/out/zero-cache/src/services/replicator/schema/replication-state.js +29 -1
  117. package/out/zero-cache/src/services/replicator/schema/replication-state.js.map +1 -1
  118. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts +3 -2
  119. package/out/zero-cache/src/services/view-syncer/client-handler.d.ts.map +1 -1
  120. package/out/zero-cache/src/services/view-syncer/client-handler.js +5 -3
  121. package/out/zero-cache/src/services/view-syncer/client-handler.js.map +1 -1
  122. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts +3 -1
  123. package/out/zero-cache/src/services/view-syncer/cvr-store.d.ts.map +1 -1
  124. package/out/zero-cache/src/services/view-syncer/cvr-store.js +21 -11
  125. package/out/zero-cache/src/services/view-syncer/cvr-store.js.map +1 -1
  126. package/out/zero-cache/src/services/view-syncer/cvr.d.ts +5 -3
  127. package/out/zero-cache/src/services/view-syncer/cvr.d.ts.map +1 -1
  128. package/out/zero-cache/src/services/view-syncer/cvr.js +100 -66
  129. package/out/zero-cache/src/services/view-syncer/cvr.js.map +1 -1
  130. package/out/zero-cache/src/services/view-syncer/database-storage.d.ts +2 -0
  131. package/out/zero-cache/src/services/view-syncer/database-storage.d.ts.map +1 -1
  132. package/out/zero-cache/src/services/view-syncer/database-storage.js +8 -3
  133. package/out/zero-cache/src/services/view-syncer/database-storage.js.map +1 -1
  134. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts +2 -1
  135. package/out/zero-cache/src/services/view-syncer/pipeline-driver.d.ts.map +1 -1
  136. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js +1 -1
  137. package/out/zero-cache/src/services/view-syncer/pipeline-driver.js.map +1 -1
  138. package/out/zero-cache/src/services/view-syncer/row-record-cache.d.ts +3 -2
  139. package/out/zero-cache/src/services/view-syncer/row-record-cache.d.ts.map +1 -1
  140. package/out/zero-cache/src/services/view-syncer/row-record-cache.js +5 -3
  141. package/out/zero-cache/src/services/view-syncer/row-record-cache.js.map +1 -1
  142. package/out/zero-cache/src/services/view-syncer/schema/cvr.d.ts +3 -5
  143. package/out/zero-cache/src/services/view-syncer/schema/cvr.d.ts.map +1 -1
  144. package/out/zero-cache/src/services/view-syncer/schema/cvr.js +38 -40
  145. package/out/zero-cache/src/services/view-syncer/schema/cvr.js.map +1 -1
  146. package/out/zero-cache/src/services/view-syncer/schema/init.d.ts +2 -1
  147. package/out/zero-cache/src/services/view-syncer/schema/init.d.ts.map +1 -1
  148. package/out/zero-cache/src/services/view-syncer/schema/init.js +7 -6
  149. package/out/zero-cache/src/services/view-syncer/schema/init.js.map +1 -1
  150. package/out/zero-cache/src/services/view-syncer/schema/types.d.ts +26 -18
  151. package/out/zero-cache/src/services/view-syncer/schema/types.d.ts.map +1 -1
  152. package/out/zero-cache/src/services/view-syncer/schema/types.js +12 -9
  153. package/out/zero-cache/src/services/view-syncer/schema/types.js.map +1 -1
  154. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts +2 -1
  155. package/out/zero-cache/src/services/view-syncer/snapshotter.d.ts.map +1 -1
  156. package/out/zero-cache/src/services/view-syncer/snapshotter.js +1 -1
  157. package/out/zero-cache/src/services/view-syncer/snapshotter.js.map +1 -1
  158. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts +18 -1
  159. package/out/zero-cache/src/services/view-syncer/view-syncer.d.ts.map +1 -1
  160. package/out/zero-cache/src/services/view-syncer/view-syncer.js +194 -43
  161. package/out/zero-cache/src/services/view-syncer/view-syncer.js.map +1 -1
  162. package/out/zero-cache/src/types/lite.d.ts +2 -2
  163. package/out/zero-cache/src/types/lite.d.ts.map +1 -1
  164. package/out/zero-cache/src/types/lite.js +9 -4
  165. package/out/zero-cache/src/types/lite.js.map +1 -1
  166. package/out/zero-cache/src/types/pg.d.ts +7 -3
  167. package/out/zero-cache/src/types/pg.d.ts.map +1 -1
  168. package/out/zero-cache/src/types/pg.js +11 -5
  169. package/out/zero-cache/src/types/pg.js.map +1 -1
  170. package/out/zero-cache/src/types/shards.d.ts +33 -0
  171. package/out/zero-cache/src/types/shards.d.ts.map +1 -0
  172. package/out/zero-cache/src/types/shards.js +44 -0
  173. package/out/zero-cache/src/types/shards.js.map +1 -0
  174. package/out/zero-cache/src/workers/connection.d.ts.map +1 -1
  175. package/out/zero-cache/src/workers/connection.js +39 -20
  176. package/out/zero-cache/src/workers/connection.js.map +1 -1
  177. package/out/zero-cache/src/workers/replicator.d.ts +2 -1
  178. package/out/zero-cache/src/workers/replicator.d.ts.map +1 -1
  179. package/out/zero-cache/src/workers/replicator.js +42 -17
  180. package/out/zero-cache/src/workers/replicator.js.map +1 -1
  181. package/out/zero-cache/src/workers/syncer-ws-message-handler.d.ts +4 -4
  182. package/out/zero-cache/src/workers/syncer-ws-message-handler.d.ts.map +1 -1
  183. package/out/zero-cache/src/workers/syncer-ws-message-handler.js +5 -2
  184. package/out/zero-cache/src/workers/syncer-ws-message-handler.js.map +1 -1
  185. package/out/zero-client/src/client/custom.d.ts +2 -11
  186. package/out/zero-client/src/client/custom.d.ts.map +1 -1
  187. package/out/zero-client/src/client/zero.d.ts.map +1 -1
  188. package/out/zero-client/src/mod.d.ts +1 -0
  189. package/out/zero-client/src/mod.d.ts.map +1 -1
  190. package/out/zero-pg/src/custom.d.ts +1 -2
  191. package/out/zero-pg/src/custom.d.ts.map +1 -1
  192. package/out/zero-pg/src/custom.js.map +1 -1
  193. package/out/zero-pg/src/mod.d.ts +2 -2
  194. package/out/zero-pg/src/mod.d.ts.map +1 -1
  195. package/out/zero-pg/src/query.d.ts +3 -4
  196. package/out/zero-pg/src/query.d.ts.map +1 -1
  197. package/out/zero-pg/src/query.js +5 -7
  198. package/out/zero-pg/src/query.js.map +1 -1
  199. package/out/zero-pg/src/web.d.ts +1 -1
  200. package/out/zero-pg/src/web.d.ts.map +1 -1
  201. package/out/zero-pg/src/web.js.map +1 -1
  202. package/out/zero-protocol/src/close-connection.d.ts +16 -0
  203. package/out/zero-protocol/src/close-connection.d.ts.map +1 -0
  204. package/out/zero-protocol/src/close-connection.js +17 -0
  205. package/out/zero-protocol/src/close-connection.js.map +1 -0
  206. package/out/zero-protocol/src/up.d.ts +1 -1
  207. package/out/zero-protocol/src/up.d.ts.map +1 -1
  208. package/out/zero-protocol/src/up.js +2 -1
  209. package/out/zero-protocol/src/up.js.map +1 -1
  210. package/out/zero-react/src/use-query.d.ts +11 -2
  211. package/out/zero-react/src/use-query.d.ts.map +1 -1
  212. package/out/zero-solid/src/use-query.d.ts +4 -1
  213. package/out/zero-solid/src/use-query.d.ts.map +1 -1
  214. package/out/zero.js +1 -2
  215. package/out/zql/src/ivm/exists.d.ts.map +1 -1
  216. package/out/zql/src/ivm/exists.js +134 -138
  217. package/out/zql/src/ivm/exists.js.map +1 -1
  218. package/out/zql/src/mutate/custom.d.ts +36 -1
  219. package/out/zql/src/mutate/custom.d.ts.map +1 -1
  220. package/out/zql/src/mutate/custom.js.map +1 -1
  221. package/out/zql/src/query/query-impl.d.ts +8 -8
  222. package/out/zql/src/query/query-impl.d.ts.map +1 -1
  223. package/out/zql/src/query/query-impl.js +29 -25
  224. package/out/zql/src/query/query-impl.js.map +1 -1
  225. package/out/zql/src/query/query-internal.d.ts +2 -2
  226. package/out/zql/src/query/query-internal.d.ts.map +1 -1
  227. package/out/zql/src/query/query.d.ts +10 -2
  228. package/out/zql/src/query/query.d.ts.map +1 -1
  229. package/out/zql/src/query/query.js +1 -1
  230. package/out/zql/src/query/query.js.map +1 -1
  231. package/out/zql/src/query/static-query.d.ts +1 -1
  232. package/out/zql/src/query/static-query.d.ts.map +1 -1
  233. package/out/zql/src/query/static-query.js +2 -2
  234. package/out/zql/src/query/static-query.js.map +1 -1
  235. package/out/zqlite/src/db.d.ts +3 -1
  236. package/out/zqlite/src/db.d.ts.map +1 -1
  237. package/out/zqlite/src/db.js +47 -0
  238. package/out/zqlite/src/db.js.map +1 -1
  239. package/package.json +3 -3
  240. package/out/chunk-5BT5TJFM.js.map +0 -7
  241. package/out/chunk-P3NUVEQJ.js +0 -3578
  242. package/out/chunk-P3NUVEQJ.js.map +0 -7
  243. package/out/pg.js +0 -593
  244. package/out/pg.js.map +0 -7
  245. package/out/zero-cache/src/services/change-source/pg/shard-config.d.ts +0 -19
  246. package/out/zero-cache/src/services/change-source/pg/shard-config.d.ts.map +0 -1
  247. package/out/zero-cache/src/services/change-source/pg/shard-config.js +0 -2
  248. package/out/zero-cache/src/services/change-source/pg/shard-config.js.map +0 -1
  249. package/out/zero-pg/src/db.d.ts +0 -27
  250. package/out/zero-pg/src/db.d.ts.map +0 -1
  251. package/out/zero-pg/src/db.js +0 -2
  252. package/out/zero-pg/src/db.js.map +0 -1
@@ -1,5 +1,6 @@
1
1
  import { literal as lit } from 'pg-format';
2
2
  import * as v from "../../../../../../shared/src/valita.js";
3
+ import { upstreamSchema } from "../../../../types/shards.js";
3
4
  import { id } from "../../../../types/sql.js";
4
5
  import { indexDefinitionsQuery, publishedSchema, publishedTableQuery, } from "./published.js";
5
6
  // Sent in the 'version' tag of "ddlStart" and "ddlUpdate" event messages.
@@ -96,9 +97,10 @@ export const ddlUpdateEventSchema = ddlEventSchema.extend({
96
97
  event: v.union(tableEvent, indexEvent, dropEvent, publicationEvent),
97
98
  });
98
99
  export const replicationEventSchema = v.union(ddlStartEventSchema, ddlUpdateEventSchema);
99
- // Creates a function that appends `_SHARD_ID` to the input.
100
- export function append(shardID) {
101
- return (name) => id(name + '_' + shardID);
100
+ // Creates a function that appends `_{shard-num}` to the input and
101
+ // quotes the result to be a valid identifier.
102
+ function append(shardNum) {
103
+ return (name) => id(name + '_' + String(shardNum));
102
104
  }
103
105
  /**
104
106
  * Event trigger functions contain the core logic that are invoked by triggers.
@@ -117,8 +119,9 @@ export function append(shardID) {
117
119
  * Instead, we opt for the simplicity and isolation of having each shard
118
120
  * completely own (and maintain) the entirety of its trigger/function stack.
119
121
  */
120
- function createEventFunctionStatements(appID, shardID, publications) {
121
- const schema = append(shardID)(appID); // e.g. "{APP_ID}_{SHARD_ID}"
122
+ function createEventFunctionStatements(shard) {
123
+ const { appID, shardNum, publications } = shard;
124
+ const schema = id(upstreamSchema(shard)); // e.g. "{APP_ID}_{SHARD_ID}"
122
125
  return `
123
126
  CREATE SCHEMA IF NOT EXISTS ${schema};
124
127
 
@@ -136,7 +139,7 @@ $$ LANGUAGE plpgsql;
136
139
  CREATE OR REPLACE FUNCTION ${schema}.notice_ignore(object_id TEXT)
137
140
  RETURNS void AS $$
138
141
  BEGIN
139
- RAISE NOTICE 'zero(%) ignoring %', ${lit(shardID)}, object_id;
142
+ RAISE NOTICE 'zero(%) ignoring %', ${lit(shardNum)}, object_id;
140
143
  END
141
144
  $$ LANGUAGE plpgsql;
142
145
 
@@ -172,7 +175,7 @@ BEGIN
172
175
  'context', ${schema}.get_trigger_context()
173
176
  ) INTO message;
174
177
 
175
- PERFORM pg_logical_emit_message(true, ${lit('zero/' + shardID)}, message);
178
+ PERFORM pg_logical_emit_message(true, ${lit(`${appID}/${shardNum}`)}, message);
176
179
  END
177
180
  $$ LANGUAGE plpgsql;
178
181
 
@@ -270,7 +273,7 @@ BEGIN
270
273
  'context', ${schema}.get_trigger_context()
271
274
  ) INTO message;
272
275
 
273
- PERFORM pg_logical_emit_message(true, ${lit('zero/' + shardID)}, message);
276
+ PERFORM pg_logical_emit_message(true, ${lit(`${appID}/${shardNum}`)}, message);
274
277
  END
275
278
  $$ LANGUAGE plpgsql;
276
279
  `;
@@ -284,17 +287,19 @@ export const TAGS = [
284
287
  'DROP INDEX',
285
288
  'ALTER PUBLICATION',
286
289
  ];
287
- export function createEventTriggerStatements(appID, shardID, publications) {
290
+ export function createEventTriggerStatements(shard) {
288
291
  // Unlike functions, which are namespaced in shard-specific schemas,
289
- // EVENT TRIGGER names are in the global namespace and instead have the shardID appended.
290
- const sharded = append(shardID);
291
- const schema = sharded(appID);
292
+ // EVENT TRIGGER names are in the global namespace and thus must include
293
+ // the appID and shardNum.
294
+ const { appID, shardNum } = shard;
295
+ const sharded = append(shardNum);
296
+ const schema = id(upstreamSchema(shard));
292
297
  const triggers = [
293
- createEventFunctionStatements(appID, shardID, publications),
298
+ dropEventTriggerStatements(shard.appID, shard.shardNum),
299
+ createEventFunctionStatements(shard),
294
300
  ];
295
301
  // A single ddl_command_start trigger covering all relevant tags.
296
302
  triggers.push(`
297
- DROP EVENT TRIGGER IF EXISTS ${sharded(`${appID}_ddl_start`)};
298
303
  CREATE EVENT TRIGGER ${sharded(`${appID}_ddl_start`)}
299
304
  ON ddl_command_start
300
305
  WHEN TAG IN (${lit(TAGS)})
@@ -311,8 +316,6 @@ BEGIN
311
316
  END
312
317
  $$ LANGUAGE plpgsql;
313
318
 
314
-
315
- DROP EVENT TRIGGER IF EXISTS ${sharded(`${appID}_${tagID}`)};
316
319
  CREATE EVENT TRIGGER ${sharded(`${appID}_${tagID}`)}
317
320
  ON ddl_command_end
318
321
  WHEN TAG IN (${lit(tag)})
@@ -321,4 +324,20 @@ CREATE EVENT TRIGGER ${sharded(`${appID}_${tagID}`)}
321
324
  }
322
325
  return triggers.join('');
323
326
  }
327
+ // Exported for testing.
328
+ export function dropEventTriggerStatements(appID, shardID) {
329
+ const stmts = [];
330
+ // A single ddl_command_start trigger covering all relevant tags.
331
+ stmts.push(`
332
+ DROP EVENT TRIGGER IF EXISTS ${id(`${appID}_ddl_start_${shardID}`)};
333
+ `);
334
+ // A per-tag ddl_command_end trigger that dispatches to ${schema}.emit_ddl_end(tag)
335
+ for (const tag of TAGS) {
336
+ const tagID = tag.toLowerCase().replace(' ', '_');
337
+ stmts.push(`
338
+ DROP EVENT TRIGGER IF EXISTS ${id(`${appID}_${tagID}_${shardID}`)};
339
+ `);
340
+ }
341
+ return stmts.join('');
342
+ }
324
343
  //# sourceMappingURL=ddl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ddl.js","sourceRoot":"","sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/ddl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,IAAI,GAAG,EAAC,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,CAAC,MAAM,wCAAwC,CAAC;AAC5D,OAAO,EAAC,EAAE,EAAC,MAAM,0BAA0B,CAAC;AAC5C,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAExB,0EAA0E;AAC1E,sEAAsE;AACtE,gFAAgF;AAChF,EAAE;AACF,+EAA+E;AAC/E,0EAA0E;AAC1E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAElC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,EAAC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CACxD,CAAC,CAAC;AAEH,2EAA2E;AAC3E,yCAAyC;AACzC,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC,MAAM,CAAC;IAChD,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC;IACpC,MAAM,EAAE,eAAe;CACxB,CAAC,CAAC;AAEH,2EAA2E;AAC3E,+EAA+E;AAC/E,4EAA4E;AAC5E,2EAA2E;AAC3E,6EAA6E;AAC7E,+EAA+E;AAC/E,yDAAyD;AACzD,MAAM,CAAC,MAAM,mBAAmB,GAAG,cAAc,CAAC,MAAM,CAAC;IACvD,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;CAC5B,CAAC,CAAC;AAIH;;;;;;;;;;GAUG;AACH,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IACjE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAC,CAAC;CACxD,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1B,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;IAC9B,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,EAAC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAC,CAAC;CACxD,CAAC,CAAC;AAEH;;;;;;;;GAQG;AACH,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;IACzB,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;CAC/D,CAAC,CAAC;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC;CACpC,CAAC,CAAC;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,cAAc,CAAC,MAAM,CAAC;IACxD,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IAC5B,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,CAAC;CACpE,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAC3C,mBAAmB,EACnB,oBAAoB,CACrB,CAAC;AAIF,4DAA4D;AAC5D,MAAM,UAAU,MAAM,CAAC,OAAe;IACpC,OAAO,CAAC,IAAY,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,GAAG,GAAG,GAAG,OAAO,CAAC,CAAC;AACpD,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,SAAS,6BAA6B,CACpC,KAAa,EACb,OAAe,EACf,YAAsB;IAEtB,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,6BAA6B;IACpE,OAAO;8BACqB,MAAM;;6BAEP,MAAM;;;;;;;;;;;6BAWN,MAAM;;;uCAGI,GAAG,CAAC,OAAO,CAAC;;;;;6BAKtB,MAAM;;;;;;IAM/B,mBAAmB,CAAC,YAAY,CAAC;IACjC,qBAAqB,CAAC,YAAY,CAAC;;;;;;;;;6BASV,MAAM;;;;;;WAMxB,MAAM;;;;iBAIA,gBAAgB;;iBAEhB,MAAM;;;0CAGmB,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;;;;;6BAKnC,MAAM;;;;;;;;;;;;0BAYT,GAAG,CAAC,YAAY,CAAC;;;;;;;;;;;;;;;;;;;;;gBAqB3B,MAAM;;;;;;;;;;;;;;gBAcN,MAAM;;;;;;;;;;gBAUN,MAAM;;;;;;;;;;gBAUN,MAAM;;;;;;;;;;cAUR,MAAM;;;;;;WAMT,MAAM;;;;iBAIA,gBAAgB;;;iBAGhB,MAAM;;;0CAGmB,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;;;CAG/D,CAAC;AACF,CAAC;AAED,wBAAwB;AACxB,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,cAAc;IACd,aAAa;IACb,cAAc;IACd,YAAY;IACZ,YAAY;IACZ,mBAAmB;CACX,CAAC;AAEX,MAAM,UAAU,4BAA4B,CAC1C,KAAa,EACb,OAAe,EACf,YAAsB;IAEtB,oEAAoE;IACpE,yFAAyF;IACzF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAE9B,MAAM,QAAQ,GAAG;QACf,6BAA6B,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC;KAC5D,CAAC;IAEF,iEAAiE;IACjE,QAAQ,CAAC,IAAI,CAAC;+BACe,OAAO,CAAC,GAAG,KAAK,YAAY,CAAC;uBACrC,OAAO,CAAC,GAAG,KAAK,YAAY,CAAC;;iBAEnC,GAAG,CAAC,IAAI,CAAC;sBACJ,MAAM;CAC3B,CAAC,CAAC;IAED,mFAAmF;IACnF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAClD,QAAQ,CAAC,IAAI,CAAC;6BACW,MAAM,SAAS,KAAK;;;YAGrC,MAAM,iBAAiB,GAAG,CAAC,GAAG,CAAC;;;;;+BAKZ,OAAO,CAAC,GAAG,KAAK,IAAI,KAAK,EAAE,CAAC;uBACpC,OAAO,CAAC,GAAG,KAAK,IAAI,KAAK,EAAE,CAAC;;iBAElC,GAAG,CAAC,GAAG,CAAC;sBACH,MAAM,SAAS,KAAK;CACzC,CAAC,CAAC;IACD,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC3B,CAAC"}
1
+ {"version":3,"file":"ddl.js","sourceRoot":"","sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/ddl.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,14 @@
1
1
  import type { LogContext } from '@rocicorp/logger';
2
2
  import type { PostgresDB } from '../../../../types/pg.ts';
3
- import type { ShardConfig } from '../shard-config.ts';
3
+ import { type ShardConfig } from '../../../../types/shards.ts';
4
4
  /**
5
5
  * Initializes a shard for initial sync.
6
6
  * This will drop any existing shard setup.
7
7
  */
8
- export declare function initShardSchema(lc: LogContext, db: PostgresDB, appID: string, shardConfig: ShardConfig): Promise<void>;
8
+ export declare function initShardSchema(lc: LogContext, db: PostgresDB, shard: ShardConfig): Promise<void>;
9
9
  /**
10
10
  * Updates the schema for an existing shard.
11
11
  */
12
- export declare function updateShardSchema(lc: LogContext, db: PostgresDB, appID: string, shardConfig: ShardConfig): Promise<void>;
12
+ export declare function updateShardSchema(lc: LogContext, db: PostgresDB, shard: ShardConfig, replicaVersion: string): Promise<void>;
13
+ export declare function decommissionLegacyShard(lc: LogContext, db: PostgresDB, shard: ShardConfig): Promise<void>;
13
14
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAOjD,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,yBAAyB,CAAC;AAExD,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,oBAAoB,CAAC;AAOpD;;;GAGG;AACH,wBAAsB,eAAe,CACnC,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,IAAI,CAAC,CAYf"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAQjD,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAiB,KAAK,WAAW,EAAC,MAAM,6BAA6B,CAAC;AAK7E;;;GAGG;AACH,wBAAsB,eAAe,CACnC,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,IAAI,CAAC,CAGf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,WAAW,EAClB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC,CAaf;AA6DD,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,WAAW,iBAYnB"}
@@ -1,28 +1,34 @@
1
+ import { assert } from "../../../../../../shared/src/asserts.js";
1
2
  import { getVersionHistory, runSchemaMigrations, } from "../../../../db/migration.js";
3
+ import { upstreamSchema } from "../../../../types/shards.js";
2
4
  import { AutoResetSignal } from "../../../change-streamer/schema/tables.js";
3
- import { dropShard, setupTablesAndReplication, unescapedSchema, } from "./shard.js";
5
+ import { decommissionShard } from "../decommission.js";
6
+ import { dropShard, setupTablesAndReplication } from "./shard.js";
4
7
  /**
5
8
  * Initializes a shard for initial sync.
6
9
  * This will drop any existing shard setup.
7
10
  */
8
- export async function initShardSchema(lc, db, appID, shardConfig) {
9
- await db.unsafe(dropShard(appID, shardConfig.id));
10
- return runShardMigrations(lc, db, appID, shardConfig);
11
+ export async function initShardSchema(lc, db, shard) {
12
+ await db.unsafe(dropShard(shard.appID, shard.shardNum));
13
+ return runShardMigrations(lc, db, shard);
11
14
  }
12
15
  /**
13
16
  * Updates the schema for an existing shard.
14
17
  */
15
- export async function updateShardSchema(lc, db, appID, shardConfig) {
16
- const { id } = shardConfig;
17
- const { schemaVersion } = await getVersionHistory(db, unescapedSchema(appID, id));
18
- if (schemaVersion === 0) {
19
- throw new AutoResetSignal(`upstream shard ${appID}_${id} is not initialized`);
18
+ export async function updateShardSchema(lc, db, shard, replicaVersion) {
19
+ const { appID, shardNum } = shard;
20
+ const versionHistory = await getVersionHistory(db, upstreamSchema(shard));
21
+ if (versionHistory === null) {
22
+ throw new AutoResetSignal(`upstream shard ${appID}_${shardNum} is not initialized`);
20
23
  }
21
- return runShardMigrations(lc, db, appID, shardConfig);
24
+ await runShardMigrations(lc, db, shard, replicaVersion);
25
+ // The decommission check is run in updateShardSchema so that it happens
26
+ // after initial sync, and not when the shard schema is initially set up.
27
+ await decommissionLegacyShard(lc, db, shard);
22
28
  }
23
- async function runShardMigrations(lc, db, appID, shard) {
29
+ async function runShardMigrations(lc, db, shard, replicaVersion) {
24
30
  const setupMigration = {
25
- migrateSchema: (lc, tx) => setupTablesAndReplication(lc, tx, appID, shard),
31
+ migrateSchema: (lc, tx) => setupTablesAndReplication(lc, tx, shard),
26
32
  minSafeVersion: 1,
27
33
  };
28
34
  const schemaVersionMigrationMap = {
@@ -32,7 +38,41 @@ async function runShardMigrations(lc, db, appID, shard) {
32
38
  },
33
39
  minSafeVersion: 3,
34
40
  },
41
+ // v5 changes the upstream schema organization from "zero_{SHARD_ID}" to
42
+ // the "{APP_ID}_0". An incremental migration indicates that the previous
43
+ // SHARD_ID was "0" and the new APP_ID is "zero" (i.e. the default values
44
+ // for those options). In this case, the upstream format is identical, and
45
+ // no migration is necessary. However, the version is bumped to v5 to
46
+ // indicate that it was created with the {APP_ID} configuration and should
47
+ // not be decommissioned as a legacy shard.
48
+ 5: {},
49
+ 6: {
50
+ migrateSchema: async (lc, tx) => {
51
+ assert(replicaVersion, `replicaVersion is always passed for incremental migrations`);
52
+ await Promise.all([
53
+ tx `
54
+ ALTER TABLE ${tx(upstreamSchema(shard))}."shardConfig"
55
+ ADD "replicaVersion" TEXT`,
56
+ tx `
57
+ UPDATE ${tx(upstreamSchema(shard))}."shardConfig"
58
+ SET ${tx({ replicaVersion })}`,
59
+ ]);
60
+ lc.info?.(`Recorded replicaVersion ${replicaVersion} in upstream shardConfig`);
61
+ },
62
+ },
35
63
  };
36
- await runSchemaMigrations(lc, `upstream-shard-${shard.id}`, unescapedSchema(appID, shard.id), db, setupMigration, schemaVersionMigrationMap);
64
+ await runSchemaMigrations(lc, `upstream-shard-${shard.appID}`, upstreamSchema(shard), db, setupMigration, schemaVersionMigrationMap);
65
+ }
66
+ export async function decommissionLegacyShard(lc, db, shard) {
67
+ if (shard.appID !== 'zero') {
68
+ // When migration from non-default shard ids, e.g. "zero_prod" => "prod_0",
69
+ // clean up the old "zero_prod" shard if it is pre-v5. Note that the v5
70
+ // check is important to guard against cleaning up a **new** "zero_0" app
71
+ // that coexists with the current App (with app-id === "0").
72
+ const versionHistory = await getVersionHistory(db, `zero_${shard.appID}`);
73
+ if (versionHistory !== null && versionHistory.schemaVersion < 5) {
74
+ await decommissionShard(lc, db, 'zero', shard.appID);
75
+ }
76
+ }
37
77
  }
38
78
  //# sourceMappingURL=init.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/init.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,mBAAmB,GAGpB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAC,eAAe,EAAC,MAAM,2CAA2C,CAAC;AAE1E,OAAO,EACL,SAAS,EACT,yBAAyB,EACzB,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,EAAc,EACd,EAAc,EACd,KAAa,EACb,WAAwB;IAExB,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;IAClD,OAAO,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,EAAc,EACd,EAAc,EACd,KAAa,EACb,WAAwB;IAExB,MAAM,EAAC,EAAE,EAAC,GAAG,WAAW,CAAC;IACzB,MAAM,EAAC,aAAa,EAAC,GAAG,MAAM,iBAAiB,CAC7C,EAAE,EACF,eAAe,CAAC,KAAK,EAAE,EAAE,CAAC,CAC3B,CAAC;IACF,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,eAAe,CACvB,kBAAkB,KAAK,IAAI,EAAE,qBAAqB,CACnD,CAAC;IACJ,CAAC;IACD,OAAO,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;AACxD,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,EAAc,EACd,EAAc,EACd,KAAa,EACb,KAAkB;IAElB,MAAM,cAAc,GAAc;QAChC,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,yBAAyB,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC;QAC1E,cAAc,EAAE,CAAC;KAClB,CAAC;IAEF,MAAM,yBAAyB,GAA4B;QACzD,CAAC,EAAE;YACD,aAAa,EAAE,GAAG,EAAE;gBAClB,MAAM,IAAI,eAAe,CAAC,mCAAmC,CAAC,CAAC;YACjE,CAAC;YACD,cAAc,EAAE,CAAC;SAClB;KACF,CAAC;IAEF,MAAM,mBAAmB,CACvB,EAAE,EACF,kBAAkB,KAAK,CAAC,EAAE,EAAE,EAC5B,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,EAChC,EAAE,EACF,cAAc,EACd,yBAAyB,CAC1B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/init.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,MAAM,yCAAyC,CAAC;AAC/D,OAAO,EACL,iBAAiB,EACjB,mBAAmB,GAGpB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAC,cAAc,EAAmB,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAC,eAAe,EAAC,MAAM,2CAA2C,CAAC;AAC1E,OAAO,EAAC,iBAAiB,EAAC,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAC,SAAS,EAAE,yBAAyB,EAAC,MAAM,YAAY,CAAC;AAEhE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,EAAc,EACd,EAAc,EACd,KAAkB;IAElB,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IACxD,OAAO,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,EAAc,EACd,EAAc,EACd,KAAkB,EAClB,cAAsB;IAEtB,MAAM,EAAC,KAAK,EAAE,QAAQ,EAAC,GAAG,KAAK,CAAC;IAChC,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,EAAE,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;IAC1E,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;QAC5B,MAAM,IAAI,eAAe,CACvB,kBAAkB,KAAK,IAAI,QAAQ,qBAAqB,CACzD,CAAC;IACJ,CAAC;IACD,MAAM,kBAAkB,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;IAExD,wEAAwE;IACxE,yEAAyE;IACzE,MAAM,uBAAuB,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,EAAc,EACd,EAAc,EACd,KAAkB,EAClB,cAAuB;IAEvB,MAAM,cAAc,GAAc;QAChC,aAAa,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,yBAAyB,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC;QACnE,cAAc,EAAE,CAAC;KAClB,CAAC;IAEF,MAAM,yBAAyB,GAA4B;QACzD,CAAC,EAAE;YACD,aAAa,EAAE,GAAG,EAAE;gBAClB,MAAM,IAAI,eAAe,CAAC,mCAAmC,CAAC,CAAC;YACjE,CAAC;YACD,cAAc,EAAE,CAAC;SAClB;QAED,wEAAwE;QACxE,yEAAyE;QACzE,yEAAyE;QACzE,0EAA0E;QAC1E,qEAAqE;QACrE,0EAA0E;QAC1E,2CAA2C;QAC3C,CAAC,EAAE,EAAE;QAEL,CAAC,EAAE;YACD,aAAa,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;gBAC9B,MAAM,CACJ,cAAc,EACd,4DAA4D,CAC7D,CAAC;gBACF,MAAM,OAAO,CAAC,GAAG,CAAC;oBAChB,EAAE,CAAA;wBACY,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;sCACX;oBAC5B,EAAE,CAAA;mBACO,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;kBAC1B,EAAE,CAAC,EAAC,cAAc,EAAC,CAAC,EAAE;iBAC/B,CAAC,CAAC;gBACH,EAAE,CAAC,IAAI,EAAE,CACP,2BAA2B,cAAc,0BAA0B,CACpE,CAAC;YACJ,CAAC;SACF;KACF,CAAC;IAEF,MAAM,mBAAmB,CACvB,EAAE,EACF,kBAAkB,KAAK,CAAC,KAAK,EAAE,EAC/B,cAAc,CAAC,KAAK,CAAC,EACrB,EAAE,EACF,cAAc,EACd,yBAAyB,CAC1B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,EAAc,EACd,EAAc,EACd,KAAkB;IAElB,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;QAC3B,2EAA2E;QAC3E,uEAAuE;QACvE,yEAAyE;QACzE,4DAA4D;QAC5D,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,EAAE,EAAE,QAAQ,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1E,IAAI,cAAc,KAAK,IAAI,IAAI,cAAc,CAAC,aAAa,GAAG,CAAC,EAAE,CAAC;YAChE,MAAM,iBAAiB,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import type postgres from 'postgres';
2
2
  import * as v from '../../../../../../shared/src/valita.ts';
3
- export declare function publishedTableQuery(publications: string[]): string;
4
- export declare function indexDefinitionsQuery(publications: string[]): string;
3
+ export declare function publishedTableQuery(publications: readonly string[]): string;
4
+ export declare function indexDefinitionsQuery(publications: readonly string[]): string;
5
5
  export declare const publishedSchema: v.ObjectType<Omit<{
6
6
  tables: v.ArrayType<v.ObjectType<Omit<Omit<{
7
7
  name: v.Type<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"published.d.ts","sourceRoot":"","sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/published.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AAErC,OAAO,KAAK,CAAC,MAAM,wCAAwC,CAAC;AAG5D,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,UA6EzD;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,UAyE3D;AAKD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAE3B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAY9D,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAEzB,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,QAAQ,CAAC,GAAG,EACjB,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,eAAe,CAAC,CAiD1B"}
1
+ {"version":3,"file":"published.d.ts","sourceRoot":"","sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/published.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AAErC,OAAO,KAAK,CAAC,MAAM,wCAAwC,CAAC;AAG5D,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,UA6ElE;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,UAyEpE;AAKD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAE3B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAY9D,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAEzB,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,QAAQ,CAAC,GAAG,EACjB,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,eAAe,CAAC,CAiD1B"}
@@ -1 +1 @@
1
- {"version":3,"file":"published.js","sourceRoot":"","sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/published.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"published.js","sourceRoot":"","sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/published.ts"],"names":[],"mappings":"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"}
@@ -1,20 +1,18 @@
1
1
  import type { LogContext } from '@rocicorp/logger';
2
2
  import * as v from '../../../../../../shared/src/valita.ts';
3
3
  import type { PostgresDB, PostgresTransaction } from '../../../../types/pg.ts';
4
- import type { ShardConfig } from '../shard-config.ts';
4
+ import type { AppID, ShardConfig, ShardID } from '../../../../types/shards.ts';
5
5
  import { type PublicationInfo, type PublishedSchema } from './published.ts';
6
- export declare function append(shardID: string): (name: string) => string;
7
- export declare function schemaFor(appID: string, shardID: string): string;
8
- export declare function unescapedSchema(appID: string, shardID: string): string;
9
- export declare function internalPublicationPrefix(appID: string): string;
10
- export declare function globalSetup(appID: string): string;
11
- export declare function ensureGlobalTables(db: PostgresDB, appID: string): Promise<void>;
6
+ export declare function internalPublicationPrefix({ appID }: AppID): string;
7
+ export declare function ensureGlobalTables(db: PostgresDB, appID: AppID): Promise<void>;
12
8
  export declare function getClientsTableDefinition(schema: string): string;
13
- export declare function shardSetup(appID: string, shardID: string, publications: string[]): string;
14
- export declare function dropShard(appID: string, shardID: string): string;
9
+ export declare const SHARD_CONFIG_TABLE = "shardConfig";
10
+ export declare function shardSetup(shardConfig: ShardConfig, metadataPublication: string): string;
11
+ export declare function dropShard(appID: string, shardID: string | number): string;
15
12
  declare const internalShardConfigSchema: v.ObjectType<{
16
13
  publications: v.ArrayType<v.Type<string>>;
17
14
  ddlDetection: v.Type<boolean>;
15
+ replicaVersion: v.Type<string | null>;
18
16
  initialSchema: v.Type<{
19
17
  tables: {
20
18
  primaryKey?: string[] | undefined;
@@ -47,13 +45,13 @@ declare const internalShardConfigSchema: v.ObjectType<{
47
45
  } | null>;
48
46
  }, undefined>;
49
47
  export type InternalShardConfig = v.Infer<typeof internalShardConfigSchema>;
50
- export declare function setInitialSchema(db: PostgresDB, appID: string, shardID: string, { tables, indexes }: PublishedSchema): Promise<void>;
51
- export declare function getInternalShardConfig(db: PostgresDB, appID: string, shardID: string): Promise<InternalShardConfig>;
48
+ export declare function setInitialSchema(db: PostgresDB, shard: ShardID, replicaVersion: string, { tables, indexes }: PublishedSchema): Promise<void>;
49
+ export declare function getInternalShardConfig(db: PostgresDB, shard: ShardID): Promise<InternalShardConfig>;
52
50
  /**
53
51
  * Sets up and returns all publications (including internal ones) for
54
52
  * the given shard.
55
53
  */
56
- export declare function setupTablesAndReplication(lc: LogContext, tx: PostgresTransaction, appID: string, { id, publications }: ShardConfig): Promise<void>;
54
+ export declare function setupTablesAndReplication(lc: LogContext, tx: PostgresTransaction, requested: ShardConfig): Promise<void>;
57
55
  export declare function validatePublications(lc: LogContext, published: PublicationInfo): void;
58
56
  type ReplicaIdentities = {
59
57
  apply(lc: LogContext, db: PostgresDB): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"shard.d.ts","sourceRoot":"","sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/shard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAIjD,OAAO,KAAK,CAAC,MAAM,wCAAwC,CAAC;AAE5D,OAAO,KAAK,EAAC,UAAU,EAAE,mBAAmB,EAAC,MAAM,yBAAyB,CAAC;AAE7E,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,oBAAoB,CAAC;AAEpD,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AAIxB,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,UACtB,MAAM,YACrB;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,UAEvD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,UAE7D;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,UAEtD;AAYD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA6CjD;AAED,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,iBAErE;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,UAQvD;AAED,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EAAE,GACrB,MAAM,CAmCR;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAYhE;AAED,QAAA,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAI7B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAkB5E,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,EAAC,MAAM,EAAE,OAAO,EAAC,EAAE,eAAe,iBAKnC;AAED,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,mBAAmB,CAAC,CAO9B;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,mBAAmB,EACvB,KAAK,EAAE,MAAM,EACb,EAAC,EAAE,EAAE,YAAY,EAAC,EAAE,WAAW,iBAgEhC;AAED,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,UAAU,EACd,SAAS,EAAE,eAAe,QAkB3B;AAED,KAAK,iBAAiB,GAAG;IACvB,KAAK,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD,CAAC;AAEF,wBAAgB,4CAA4C,CAC1D,IAAI,EAAE,eAAe,GACpB,iBAAiB,GAAG,SAAS,CA+C/B"}
1
+ {"version":3,"file":"shard.d.ts","sourceRoot":"","sources":["../../../../../../../../zero-cache/src/services/change-source/pg/schema/shard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AAIjD,OAAO,KAAK,CAAC,MAAM,wCAAwC,CAAC;AAE5D,OAAO,KAAK,EAAC,UAAU,EAAE,mBAAmB,EAAC,MAAM,yBAAyB,CAAC;AAC7E,OAAO,KAAK,EAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAC,MAAM,6BAA6B,CAAC;AAI7E,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AAGxB,wBAAgB,yBAAyB,CAAC,EAAC,KAAK,EAAC,EAAE,KAAK,UAEvD;AAyDD,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,iBAEpE;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,UAQvD;AAED,eAAO,MAAM,kBAAkB,gBAAgB,CAAC;AAEhD,wBAAgB,UAAU,CACxB,WAAW,EAAE,WAAW,EACxB,mBAAmB,EAAE,MAAM,GAC1B,MAAM,CAkCR;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAYzE;AAED,QAAA,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAK7B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAc5E,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,OAAO,EACd,cAAc,EAAE,MAAM,EACtB,EAAC,MAAM,EAAE,OAAO,EAAC,EAAE,eAAe,iBAQnC;AAED,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,OAAO,GACb,OAAO,CAAC,mBAAmB,CAAC,CAO9B;AAED;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,mBAAmB,EACvB,SAAS,EAAE,WAAW,iBA0EvB;AAED,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,UAAU,EACd,SAAS,EAAE,eAAe,QAkB3B;AAED,KAAK,iBAAiB,GAAG;IACvB,KAAK,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD,CAAC;AAEF,wBAAgB,4CAA4C,CAC1D,IAAI,EAAE,eAAe,GACpB,iBAAiB,GAAG,SAAS,CA+C/B"}
@@ -4,21 +4,12 @@ import postgres from 'postgres';
4
4
  import { assert } from "../../../../../../shared/src/asserts.js";
5
5
  import * as v from "../../../../../../shared/src/valita.js";
6
6
  import { Default } from "../../../../db/postgres-replica-identity-enum.js";
7
+ import { appSchema, upstreamSchema } from "../../../../types/shards.js";
7
8
  import { id } from "../../../../types/sql.js";
8
9
  import { createEventTriggerStatements } from "./ddl.js";
9
10
  import { getPublicationInfo, publishedSchema, } from "./published.js";
10
- import { ALLOWED_APP_ID_CHARACTERS, validate } from "./validation.js";
11
- // Creates a function that appends `_SHARD_ID` to the input.
12
- export function append(shardID) {
13
- return (name) => id(name + '_' + shardID);
14
- }
15
- export function schemaFor(appID, shardID) {
16
- return append(shardID)(appID);
17
- }
18
- export function unescapedSchema(appID, shardID) {
19
- return `${appID}_${shardID}`;
20
- }
21
- export function internalPublicationPrefix(appID) {
11
+ import { validate } from "./validation.js";
12
+ export function internalPublicationPrefix({ appID }) {
22
13
  return `_${appID}_`;
23
14
  }
24
15
  function defaultPublicationName(appID, shardID) {
@@ -28,14 +19,12 @@ function metadataPublicationName(appID, shardID) {
28
19
  return `_${appID}_metadata_${shardID}`;
29
20
  }
30
21
  // The GLOBAL_SETUP must be idempotent as it can be run multiple times for different shards.
31
- // Exported for testing.
32
- export function globalSetup(appID) {
33
- // Sanity check; should already be validated upstream.
34
- assert(ALLOWED_APP_ID_CHARACTERS.test(appID), `Invalid App ID ${appID}`);
22
+ function globalSetup(appID) {
23
+ const app = id(appSchema(appID));
35
24
  return `
36
- CREATE SCHEMA IF NOT EXISTS ${appID};
25
+ CREATE SCHEMA IF NOT EXISTS ${app};
37
26
 
38
- CREATE TABLE IF NOT EXISTS ${appID}."schemaVersions" (
27
+ CREATE TABLE IF NOT EXISTS ${app}."schemaVersions" (
39
28
  "minSupportedVersion" INT4,
40
29
  "maxSupportedVersion" INT4,
41
30
 
@@ -45,10 +34,10 @@ export function globalSetup(appID) {
45
34
  "lock" BOOL PRIMARY KEY DEFAULT true CHECK (lock)
46
35
  );
47
36
 
48
- INSERT INTO ${appID}."schemaVersions" ("lock", "minSupportedVersion", "maxSupportedVersion")
37
+ INSERT INTO ${app}."schemaVersions" ("lock", "minSupportedVersion", "maxSupportedVersion")
49
38
  VALUES (true, 1, 1) ON CONFLICT DO NOTHING;
50
39
 
51
- CREATE TABLE IF NOT EXISTS ${appID}.permissions (
40
+ CREATE TABLE IF NOT EXISTS ${app}.permissions (
52
41
  "permissions" JSONB,
53
42
  "hash" TEXT,
54
43
 
@@ -58,7 +47,7 @@ export function globalSetup(appID) {
58
47
  "lock" BOOL PRIMARY KEY DEFAULT true CHECK (lock)
59
48
  );
60
49
 
61
- CREATE OR REPLACE FUNCTION ${appID}.set_permissions_hash()
50
+ CREATE OR REPLACE FUNCTION ${app}.set_permissions_hash()
62
51
  RETURNS TRIGGER AS $$
63
52
  BEGIN
64
53
  NEW.hash = md5(NEW.permissions::text);
@@ -67,11 +56,11 @@ export function globalSetup(appID) {
67
56
  $$ LANGUAGE plpgsql;
68
57
 
69
58
  CREATE OR REPLACE TRIGGER on_set_permissions
70
- BEFORE INSERT OR UPDATE ON ${appID}.permissions
59
+ BEFORE INSERT OR UPDATE ON ${app}.permissions
71
60
  FOR EACH ROW
72
- EXECUTE FUNCTION ${appID}.set_permissions_hash();
61
+ EXECUTE FUNCTION ${app}.set_permissions_hash();
73
62
 
74
- INSERT INTO ${appID}.permissions (permissions) VALUES (NULL) ON CONFLICT DO NOTHING;
63
+ INSERT INTO ${app}.permissions (permissions) VALUES (NULL) ON CONFLICT DO NOTHING;
75
64
  `;
76
65
  }
77
66
  export async function ensureGlobalTables(db, appID) {
@@ -86,40 +75,42 @@ export function getClientsTableDefinition(schema) {
86
75
  PRIMARY KEY("clientGroupID", "clientID")
87
76
  );`;
88
77
  }
89
- export function shardSetup(appID, shardID, publications) {
90
- assert(ALLOWED_APP_ID_CHARACTERS.test(appID), `Invalid App ID ${appID}`);
91
- const schema = schemaFor(appID, shardID);
92
- const metadataPublication = metadataPublicationName(appID, shardID);
93
- publications.push(metadataPublication);
94
- publications.sort();
78
+ export const SHARD_CONFIG_TABLE = 'shardConfig';
79
+ export function shardSetup(shardConfig, metadataPublication) {
80
+ const app = id(appSchema(shardConfig));
81
+ const shard = id(upstreamSchema(shardConfig));
82
+ const pubs = [...shardConfig.publications].sort();
83
+ assert(pubs.includes(metadataPublication));
95
84
  return `
96
- CREATE SCHEMA IF NOT EXISTS ${schema};
85
+ CREATE SCHEMA IF NOT EXISTS ${shard};
97
86
 
98
- ${getClientsTableDefinition(schema)}
87
+ ${getClientsTableDefinition(shard)}
99
88
 
100
89
  CREATE PUBLICATION ${id(metadataPublication)}
101
- FOR TABLE ${appID}."schemaVersions", ${appID}."permissions", TABLE ${schema}."clients";
90
+ FOR TABLE ${app}."schemaVersions", ${app}."permissions", TABLE ${shard}."clients";
102
91
 
103
- CREATE TABLE ${schema}."shardConfig" (
92
+ CREATE TABLE ${shard}."${SHARD_CONFIG_TABLE}" (
104
93
  "publications" TEXT[] NOT NULL,
105
94
  "ddlDetection" BOOL NOT NULL,
95
+ "replicaVersion" TEXT,
106
96
  "initialSchema" JSON,
107
97
 
108
98
  -- Ensure that there is only a single row in the table.
109
99
  "lock" BOOL PRIMARY KEY DEFAULT true CHECK (lock)
110
100
  );
111
101
 
112
- INSERT INTO ${schema}."shardConfig"
113
- ("lock", "publications", "ddlDetection", "initialSchema")
102
+ INSERT INTO ${shard}."${SHARD_CONFIG_TABLE}"
103
+ ("lock", "publications", "ddlDetection", "replicaVersion", "initialSchema")
114
104
  VALUES (true,
115
- ARRAY[${literal(publications)}],
105
+ ARRAY[${literal(pubs)}],
116
106
  false, -- set in SAVEPOINT with triggerSetup() statements
117
- null -- set in initial-sync at consistent_point LSN.
107
+ null, -- set in initial-sync at consistent_point LSN.
108
+ null -- set in initial-sync at consistent_ponit LSN.
118
109
  );
119
110
  `;
120
111
  }
121
112
  export function dropShard(appID, shardID) {
122
- const schema = schemaFor(appID, shardID);
113
+ const schema = `${appID}_${shardID}`;
123
114
  const metadataPublication = metadataPublicationName(appID, shardID);
124
115
  const defaultPublication = defaultPublicationName(appID, shardID);
125
116
  // DROP SCHEMA ... CASCADE does not drop dependent PUBLICATIONS,
@@ -127,32 +118,36 @@ export function dropShard(appID, shardID) {
127
118
  return `
128
119
  DROP PUBLICATION IF EXISTS ${id(defaultPublication)};
129
120
  DROP PUBLICATION IF EXISTS ${id(metadataPublication)};
130
- DROP SCHEMA IF EXISTS ${schema} CASCADE;
121
+ DROP SCHEMA IF EXISTS ${id(schema)} CASCADE;
131
122
  `;
132
123
  }
133
124
  const internalShardConfigSchema = v.object({
134
125
  publications: v.array(v.string()),
135
126
  ddlDetection: v.boolean(),
127
+ replicaVersion: v.string().nullable(),
136
128
  initialSchema: publishedSchema.nullable(),
137
129
  });
138
130
  // triggerSetup is run separately in a sub-transaction (i.e. SAVEPOINT) so
139
131
  // that a failure (e.g. due to lack of superuser permissions) can be handled
140
132
  // by continuing in a degraded mode (ddlDetection = false).
141
- function triggerSetup(appID, shardID, publications) {
142
- const schema = schemaFor(appID, shardID);
143
- return (createEventTriggerStatements(appID, shardID, publications) +
133
+ function triggerSetup(shard) {
134
+ const schema = id(upstreamSchema(shard));
135
+ return (createEventTriggerStatements(shard) +
144
136
  `UPDATE ${schema}."shardConfig" SET "ddlDetection" = true;`);
145
137
  }
146
138
  // Called in initial-sync to store the exact schema that was initially synced.
147
- export async function setInitialSchema(db, appID, shardID, { tables, indexes }) {
148
- const schema = unescapedSchema(appID, shardID);
139
+ export async function setInitialSchema(db, shard, replicaVersion, { tables, indexes }) {
140
+ const schema = upstreamSchema(shard);
149
141
  const synced = { tables, indexes };
150
- await db `UPDATE ${db(schema)}."shardConfig" SET "initialSchema" = ${synced}`;
142
+ await db `
143
+ UPDATE ${db(schema)}."shardConfig"
144
+ SET "replicaVersion" = ${replicaVersion},
145
+ "initialSchema" = ${synced}`;
151
146
  }
152
- export async function getInternalShardConfig(db, appID, shardID) {
147
+ export async function getInternalShardConfig(db, shard) {
153
148
  const result = await db `
154
- SELECT "publications", "ddlDetection", "initialSchema"
155
- FROM ${db(unescapedSchema(appID, shardID))}."shardConfig";
149
+ SELECT "publications", "ddlDetection", "replicaVersion", "initialSchema"
150
+ FROM ${db(upstreamSchema(shard))}."shardConfig";
156
151
  `;
157
152
  assert(result.length === 1);
158
153
  return v.parse(result[0], internalShardConfigSchema, 'passthrough');
@@ -161,7 +156,8 @@ export async function getInternalShardConfig(db, appID, shardID) {
161
156
  * Sets up and returns all publications (including internal ones) for
162
157
  * the given shard.
163
158
  */
164
- export async function setupTablesAndReplication(lc, tx, appID, { id, publications }) {
159
+ export async function setupTablesAndReplication(lc, tx, requested) {
160
+ const { publications } = requested;
165
161
  // Validate requested publications.
166
162
  for (const pub of publications) {
167
163
  if (pub.startsWith('_')) {
@@ -180,7 +176,7 @@ export async function setupTablesAndReplication(lc, tx, appID, { id, publication
180
176
  allPublications.push(...publications);
181
177
  }
182
178
  else {
183
- const defaultPublication = defaultPublicationName(appID, id);
179
+ const defaultPublication = defaultPublicationName(requested.appID, requested.shardNum);
184
180
  // Note: For re-syncing, this publication is dropped in dropShard(), so an existence
185
181
  // check is unnecessary.
186
182
  await tx `
@@ -189,12 +185,15 @@ export async function setupTablesAndReplication(lc, tx, appID, { id, publication
189
185
  WITH (publish_via_partition_root = true)`;
190
186
  allPublications.push(defaultPublication);
191
187
  }
188
+ const metadataPublication = metadataPublicationName(requested.appID, requested.shardNum);
189
+ allPublications.push(metadataPublication);
190
+ const shard = { ...requested, publications: allPublications };
192
191
  // Setup the global tables and shard tables / publications.
193
- await tx.unsafe(globalSetup(appID) + shardSetup(appID, id, allPublications));
192
+ await tx.unsafe(globalSetup(shard) + shardSetup(shard, metadataPublication));
194
193
  const pubs = await getPublicationInfo(tx, allPublications);
195
194
  await replicaIdentitiesForTablesWithoutPrimaryKeys(pubs)?.apply(lc, tx);
196
195
  try {
197
- await tx.savepoint(sub => sub.unsafe(triggerSetup(appID, id, allPublications)));
196
+ await tx.savepoint(sub => sub.unsafe(triggerSetup(shard)));
198
197
  }
199
198
  catch (e) {
200
199
  if (!(e instanceof postgres.PostgresError &&