@antelopejs/postgres 0.2.2 → 0.2.3

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 (280) hide show
  1. package/README.md +6 -5
  2. package/dist/config.d.ts +1 -0
  3. package/dist/config.js +7 -3
  4. package/dist/config.js.map +1 -1
  5. package/dist/connect-failure.d.ts +1 -0
  6. package/dist/connect-failure.js +39 -0
  7. package/dist/connect-failure.js.map +1 -0
  8. package/dist/connection.d.ts +2 -1
  9. package/dist/connection.js +19 -2
  10. package/dist/connection.js.map +1 -1
  11. package/dist/implementations/catalog/index.js +3 -6
  12. package/dist/implementations/catalog/index.js.map +1 -1
  13. package/dist/implementations/database/coerce.js +20 -20
  14. package/dist/implementations/database/coerce.js.map +1 -1
  15. package/dist/implementations/database/context.d.ts +1 -0
  16. package/dist/implementations/database/context.js +4 -0
  17. package/dist/implementations/database/context.js.map +1 -1
  18. package/dist/implementations/database/convergence.d.ts +22 -0
  19. package/dist/implementations/database/convergence.js +183 -0
  20. package/dist/implementations/database/convergence.js.map +1 -0
  21. package/dist/implementations/database/cursors.js +3 -0
  22. package/dist/implementations/database/cursors.js.map +1 -1
  23. package/dist/implementations/database/ddl.d.ts +5 -26
  24. package/dist/implementations/database/ddl.js +15 -191
  25. package/dist/implementations/database/ddl.js.map +1 -1
  26. package/dist/implementations/database/external-column-profile.js +6 -1
  27. package/dist/implementations/database/external-column-profile.js.map +1 -1
  28. package/dist/implementations/database/external-discovery.js +5 -5
  29. package/dist/implementations/database/external-discovery.js.map +1 -1
  30. package/dist/implementations/database/external-measures.js.map +1 -1
  31. package/dist/implementations/database/external-payload.d.ts +2 -2
  32. package/dist/implementations/database/external-payload.js +23 -13
  33. package/dist/implementations/database/external-payload.js.map +1 -1
  34. package/dist/implementations/database/external-schema.d.ts +2 -2
  35. package/dist/implementations/database/external-schema.js +3 -3
  36. package/dist/implementations/database/external-schema.js.map +1 -1
  37. package/dist/implementations/database/external-types.js +23 -16
  38. package/dist/implementations/database/external-types.js.map +1 -1
  39. package/dist/implementations/database/external-writes.d.ts +7 -1
  40. package/dist/implementations/database/external-writes.js +22 -21
  41. package/dist/implementations/database/external-writes.js.map +1 -1
  42. package/dist/implementations/database/feed-pipeline.js +3 -2
  43. package/dist/implementations/database/feed-pipeline.js.map +1 -1
  44. package/dist/implementations/database/feeds.d.ts +1 -1
  45. package/dist/implementations/database/feeds.js +36 -45
  46. package/dist/implementations/database/feeds.js.map +1 -1
  47. package/dist/implementations/database/fields.d.ts +9 -13
  48. package/dist/implementations/database/fields.js +25 -21
  49. package/dist/implementations/database/fields.js.map +1 -1
  50. package/dist/implementations/database/guards.d.ts +5 -0
  51. package/dist/implementations/database/guards.js +23 -0
  52. package/dist/implementations/database/guards.js.map +1 -0
  53. package/dist/implementations/database/introspect.d.ts +1 -1
  54. package/dist/implementations/database/listener.js +9 -3
  55. package/dist/implementations/database/listener.js.map +1 -1
  56. package/dist/implementations/database/migrate.d.ts +2 -2
  57. package/dist/implementations/database/migrate.js +10 -10
  58. package/dist/implementations/database/migrate.js.map +1 -1
  59. package/dist/implementations/database/payload.d.ts +3 -3
  60. package/dist/implementations/database/payload.js +4 -4
  61. package/dist/implementations/database/pipeline.d.ts +6 -2
  62. package/dist/implementations/database/pipeline.js +4 -1
  63. package/dist/implementations/database/pipeline.js.map +1 -1
  64. package/dist/implementations/database/query.js +12 -7
  65. package/dist/implementations/database/query.js.map +1 -1
  66. package/dist/implementations/database/reaper.js +6 -4
  67. package/dist/implementations/database/reaper.js.map +1 -1
  68. package/dist/implementations/database/relation.d.ts +2 -12
  69. package/dist/implementations/database/relation.js +5 -141
  70. package/dist/implementations/database/relation.js.map +1 -1
  71. package/dist/implementations/database/render.d.ts +11 -0
  72. package/dist/implementations/database/render.js +147 -0
  73. package/dist/implementations/database/render.js.map +1 -0
  74. package/dist/implementations/database/result.d.ts +2 -2
  75. package/dist/implementations/database/result.js +18 -19
  76. package/dist/implementations/database/result.js.map +1 -1
  77. package/dist/implementations/database/row-source.d.ts +10 -10
  78. package/dist/implementations/database/row-source.js +22 -19
  79. package/dist/implementations/database/row-source.js.map +1 -1
  80. package/dist/implementations/database/schema.d.ts +2 -2
  81. package/dist/implementations/database/schema.js +19 -19
  82. package/dist/implementations/database/schema.js.map +1 -1
  83. package/dist/implementations/database/selection.js +13 -7
  84. package/dist/implementations/database/selection.js.map +1 -1
  85. package/dist/implementations/database/sql.d.ts +7 -3
  86. package/dist/implementations/database/sql.js.map +1 -1
  87. package/dist/implementations/database/stage.js +3 -2
  88. package/dist/implementations/database/stage.js.map +1 -1
  89. package/dist/implementations/database/stages-aggregate.js +7 -5
  90. package/dist/implementations/database/stages-aggregate.js.map +1 -1
  91. package/dist/implementations/database/stages-array.js.map +1 -1
  92. package/dist/implementations/database/stages-core.js +2 -1
  93. package/dist/implementations/database/stages-core.js.map +1 -1
  94. package/dist/implementations/database/stages-date.js +2 -1
  95. package/dist/implementations/database/stages-date.js.map +1 -1
  96. package/dist/implementations/database/stages-group.js +11 -6
  97. package/dist/implementations/database/stages-group.js.map +1 -1
  98. package/dist/implementations/database/stages-join.js +13 -11
  99. package/dist/implementations/database/stages-join.js.map +1 -1
  100. package/dist/implementations/database/stages-numeric.js.map +1 -1
  101. package/dist/implementations/database/stages-object.js +1 -1
  102. package/dist/implementations/database/stages-object.js.map +1 -1
  103. package/dist/implementations/database/stages-projection.js +9 -8
  104. package/dist/implementations/database/stages-projection.js.map +1 -1
  105. package/dist/implementations/database/stages-rows.js +10 -8
  106. package/dist/implementations/database/stages-rows.js.map +1 -1
  107. package/dist/implementations/database/stages-selection.js +6 -4
  108. package/dist/implementations/database/stages-selection.js.map +1 -1
  109. package/dist/implementations/database/stages-string.js +7 -6
  110. package/dist/implementations/database/stages-string.js.map +1 -1
  111. package/dist/implementations/database/subquery.d.ts +1 -1
  112. package/dist/implementations/database/subquery.js +7 -5
  113. package/dist/implementations/database/subquery.js.map +1 -1
  114. package/dist/implementations/database/types.d.ts +5 -5
  115. package/dist/implementations/database/types.js +11 -11
  116. package/dist/implementations/database/types.js.map +1 -1
  117. package/dist/implementations/database/utils.js +2 -1
  118. package/dist/implementations/database/utils.js.map +1 -1
  119. package/dist/implementations/database/value.d.ts +1 -1
  120. package/dist/implementations/database/value.js +34 -33
  121. package/dist/implementations/database/value.js.map +1 -1
  122. package/dist/implementations/database/writes-atomic.js +6 -5
  123. package/dist/implementations/database/writes-atomic.js.map +1 -1
  124. package/dist/implementations/database/writes-identity.js +18 -19
  125. package/dist/implementations/database/writes-identity.js.map +1 -1
  126. package/dist/implementations/database/writes-insert.js +16 -22
  127. package/dist/implementations/database/writes-insert.js.map +1 -1
  128. package/dist/implementations/database/writes-shared.d.ts +1 -1
  129. package/dist/implementations/database/writes-shared.js +11 -7
  130. package/dist/implementations/database/writes-shared.js.map +1 -1
  131. package/dist/implementations/database/writes.d.ts +22 -1
  132. package/dist/implementations/database/writes.js +6 -3
  133. package/dist/implementations/database/writes.js.map +1 -1
  134. package/dist/test/catalog-owned.test.js +2 -0
  135. package/dist/test/catalog-owned.test.js.map +1 -1
  136. package/dist/test/contention.test.js.map +1 -1
  137. package/dist/test/duplicate-key.test.js +13 -10
  138. package/dist/test/duplicate-key.test.js.map +1 -1
  139. package/dist/test/indexes.test.js +7 -7
  140. package/dist/test/indexes.test.js.map +1 -1
  141. package/dist/test/unit/coerce.spec.js +7 -7
  142. package/dist/test/unit/coerce.spec.js.map +1 -1
  143. package/dist/test/unit/config.spec.js +3 -1
  144. package/dist/test/unit/config.spec.js.map +1 -1
  145. package/dist/test/unit/connect-failure.spec.d.ts +1 -0
  146. package/dist/test/unit/connect-failure.spec.js +50 -0
  147. package/dist/test/unit/connect-failure.spec.js.map +1 -0
  148. package/dist/test/unit/connection.spec.js +16 -18
  149. package/dist/test/unit/connection.spec.js.map +1 -1
  150. package/dist/test/unit/convergence.spec.d.ts +1 -0
  151. package/dist/test/unit/convergence.spec.js +347 -0
  152. package/dist/test/unit/convergence.spec.js.map +1 -0
  153. package/dist/test/unit/cursors-fixture.d.ts +79 -0
  154. package/dist/test/unit/cursors-fixture.js +245 -0
  155. package/dist/test/unit/cursors-fixture.js.map +1 -0
  156. package/dist/test/unit/cursors.spec.js +138 -718
  157. package/dist/test/unit/cursors.spec.js.map +1 -1
  158. package/dist/test/unit/cursors.teardown.spec.d.ts +1 -0
  159. package/dist/test/unit/cursors.teardown.spec.js +322 -0
  160. package/dist/test/unit/cursors.teardown.spec.js.map +1 -0
  161. package/dist/test/unit/cursors.window.spec.d.ts +1 -0
  162. package/dist/test/unit/cursors.window.spec.js +78 -0
  163. package/dist/test/unit/cursors.window.spec.js.map +1 -0
  164. package/dist/test/unit/ddl-fixture.d.ts +5 -0
  165. package/dist/test/unit/ddl-fixture.js +19 -0
  166. package/dist/test/unit/ddl-fixture.js.map +1 -0
  167. package/dist/test/unit/ddl.spec.js +39 -380
  168. package/dist/test/unit/ddl.spec.js.map +1 -1
  169. package/dist/test/unit/expression-array-fixture.d.ts +17 -0
  170. package/dist/test/unit/expression-array-fixture.js +63 -0
  171. package/dist/test/unit/expression-array-fixture.js.map +1 -0
  172. package/dist/test/unit/expression-array-walk.spec.d.ts +1 -0
  173. package/dist/test/unit/expression-array-walk.spec.js +235 -0
  174. package/dist/test/unit/expression-array-walk.spec.js.map +1 -0
  175. package/dist/test/unit/expression-array.spec.js +48 -322
  176. package/dist/test/unit/expression-array.spec.js.map +1 -1
  177. package/dist/test/unit/expression-date.spec.js +4 -3
  178. package/dist/test/unit/expression-date.spec.js.map +1 -1
  179. package/dist/test/unit/expression-fixture.d.ts +15 -0
  180. package/dist/test/unit/expression-fixture.js +40 -0
  181. package/dist/test/unit/expression-fixture.js.map +1 -0
  182. package/dist/test/unit/expression-numeric.spec.js +10 -8
  183. package/dist/test/unit/expression-numeric.spec.js.map +1 -1
  184. package/dist/test/unit/expression-object.spec.js +3 -4
  185. package/dist/test/unit/expression-object.spec.js.map +1 -1
  186. package/dist/test/unit/expression-predicate.spec.d.ts +1 -0
  187. package/dist/test/unit/expression-predicate.spec.js +231 -0
  188. package/dist/test/unit/expression-predicate.spec.js.map +1 -0
  189. package/dist/test/unit/expression-stages.spec.js +0 -5
  190. package/dist/test/unit/expression-stages.spec.js.map +1 -1
  191. package/dist/test/unit/expression-string.spec.js +2 -5
  192. package/dist/test/unit/expression-string.spec.js.map +1 -1
  193. package/dist/test/unit/expression.spec.js +44 -292
  194. package/dist/test/unit/expression.spec.js.map +1 -1
  195. package/dist/test/unit/external-comparisons.spec.js +5 -5
  196. package/dist/test/unit/external-comparisons.spec.js.map +1 -1
  197. package/dist/test/unit/external-types.spec.js +2 -3
  198. package/dist/test/unit/external-types.spec.js.map +1 -1
  199. package/dist/test/unit/feeds.spec.js +40 -23
  200. package/dist/test/unit/feeds.spec.js.map +1 -1
  201. package/dist/test/unit/fields.spec.js +15 -9
  202. package/dist/test/unit/fields.spec.js.map +1 -1
  203. package/dist/test/unit/invalid-fixture.d.ts +3 -0
  204. package/dist/test/unit/invalid-fixture.js +11 -0
  205. package/dist/test/unit/invalid-fixture.js.map +1 -0
  206. package/dist/test/unit/payload.spec.js.map +1 -1
  207. package/dist/test/unit/pipeline-aggregate.spec.js +14 -14
  208. package/dist/test/unit/pipeline-aggregate.spec.js.map +1 -1
  209. package/dist/test/unit/pipeline-fixture.d.ts +25 -6
  210. package/dist/test/unit/pipeline-fixture.js +21 -11
  211. package/dist/test/unit/pipeline-fixture.js.map +1 -1
  212. package/dist/test/unit/pipeline-group-fixture.d.ts +2 -0
  213. package/dist/test/unit/pipeline-group-fixture.js +6 -0
  214. package/dist/test/unit/pipeline-group-fixture.js.map +1 -0
  215. package/dist/test/unit/pipeline-group.spec.js +15 -248
  216. package/dist/test/unit/pipeline-group.spec.js.map +1 -1
  217. package/dist/test/unit/pipeline-lookup.spec.js +13 -10
  218. package/dist/test/unit/pipeline-lookup.spec.js.map +1 -1
  219. package/dist/test/unit/pipeline-projection.spec.js +12 -13
  220. package/dist/test/unit/pipeline-projection.spec.js.map +1 -1
  221. package/dist/test/unit/pipeline-rows.spec.js +21 -18
  222. package/dist/test/unit/pipeline-rows.spec.js.map +1 -1
  223. package/dist/test/unit/pipeline-selection.spec.js +6 -4
  224. package/dist/test/unit/pipeline-selection.spec.js.map +1 -1
  225. package/dist/test/unit/pipeline-stages.spec.js +23 -35
  226. package/dist/test/unit/pipeline-stages.spec.js.map +1 -1
  227. package/dist/test/unit/pipeline-substream.spec.d.ts +1 -0
  228. package/dist/test/unit/pipeline-substream.spec.js +246 -0
  229. package/dist/test/unit/pipeline-substream.spec.js.map +1 -0
  230. package/dist/test/unit/pipeline.spec.js +1 -1
  231. package/dist/test/unit/query.spec.js +6 -2
  232. package/dist/test/unit/query.spec.js.map +1 -1
  233. package/dist/test/unit/reaper.spec.js +4 -3
  234. package/dist/test/unit/reaper.spec.js.map +1 -1
  235. package/dist/test/unit/relation.spec.js +37 -36
  236. package/dist/test/unit/relation.spec.js.map +1 -1
  237. package/dist/test/unit/result.spec.js +13 -11
  238. package/dist/test/unit/result.spec.js.map +1 -1
  239. package/dist/test/unit/row-source.spec.js +1 -1
  240. package/dist/test/unit/row-source.spec.js.map +1 -1
  241. package/dist/test/unit/schema.spec.js +5 -2
  242. package/dist/test/unit/schema.spec.js.map +1 -1
  243. package/dist/test/unit/selection.spec.js +7 -3
  244. package/dist/test/unit/selection.spec.js.map +1 -1
  245. package/dist/test/unit/types.spec.js +6 -6
  246. package/dist/test/unit/types.spec.js.map +1 -1
  247. package/dist/test/unit/writes-atomic.spec.js +2 -2
  248. package/dist/test/unit/writes-atomic.spec.js.map +1 -1
  249. package/dist/test/unit/writes-insert.spec.js +5 -4
  250. package/dist/test/unit/writes-insert.spec.js.map +1 -1
  251. package/dist/test/unit/writes-replace.spec.js +6 -6
  252. package/dist/test/unit/writes-replace.spec.js.map +1 -1
  253. package/dist/test/unit/writes-target.spec.js +3 -3
  254. package/dist/test/unit/writes-target.spec.js.map +1 -1
  255. package/dist/test/unit/writes-update-fixture.d.ts +9 -0
  256. package/dist/test/unit/writes-update-fixture.js +20 -0
  257. package/dist/test/unit/writes-update-fixture.js.map +1 -0
  258. package/dist/test/unit/writes-update-mapper.spec.d.ts +1 -0
  259. package/dist/test/unit/writes-update-mapper.spec.js +123 -0
  260. package/dist/test/unit/writes-update-mapper.spec.js.map +1 -0
  261. package/dist/test/unit/writes-update.spec.js +42 -171
  262. package/dist/test/unit/writes-update.spec.js.map +1 -1
  263. package/dist/test-external/catalog.test.js +11 -1
  264. package/dist/test-external/catalog.test.js.map +1 -1
  265. package/dist/test-external/native.test.js +8 -6
  266. package/dist/test-external/native.test.js.map +1 -1
  267. package/dist/test-external/reads.test.js +20 -22
  268. package/dist/test-external/reads.test.js.map +1 -1
  269. package/dist/test-external/refusals.test.js +45 -24
  270. package/dist/test-external/refusals.test.js.map +1 -1
  271. package/dist/test-external/registration.test.js +4 -2
  272. package/dist/test-external/registration.test.js.map +1 -1
  273. package/dist/test-external/sales.d.ts +9 -2
  274. package/dist/test-external/sales.js.map +1 -1
  275. package/dist/test-external/unreachable.test.d.ts +1 -0
  276. package/dist/test-external/unreachable.test.js +83 -0
  277. package/dist/test-external/unreachable.test.js.map +1 -0
  278. package/dist/test-external/writes.test.js +71 -37
  279. package/dist/test-external/writes.test.js.map +1 -1
  280. package/package.json +19 -6
@@ -0,0 +1,347 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const chai_1 = require("chai");
4
+ const fields_1 = require("../../implementations/database/fields");
5
+ const ddl_1 = require("../../implementations/database/ddl");
6
+ const convergence_1 = require("../../implementations/database/convergence");
7
+ const ddl_fixture_1 = require("./ddl-fixture");
8
+ const SAFE = "safe";
9
+ const DESTRUCTIVE = "destructive";
10
+ const SCHEMA = "shop";
11
+ const VEHICLES_TARGET = `"shop"."vehicles"`;
12
+ const DECLARED_INDEX_COUNT = 3;
13
+ const dated = {
14
+ fields: { manufactured: "date" },
15
+ indexes: {},
16
+ };
17
+ const everyType = {
18
+ fields: {
19
+ label: "string",
20
+ amount: "number",
21
+ active: "boolean",
22
+ at: "date",
23
+ payload: "object",
24
+ tags: "string[]",
25
+ },
26
+ indexes: {},
27
+ };
28
+ const CATALOG_TYPES = new Map([
29
+ ["text", "text"],
30
+ ["double precision", "double precision"],
31
+ ["boolean", "boolean"],
32
+ ["timestamptz", "timestamp with time zone"],
33
+ ["jsonb", "jsonb"],
34
+ ]);
35
+ const EMPTY = { columns: [], indexes: [] };
36
+ const FULL_COLUMNS = [
37
+ { name: "_id", type: "text" },
38
+ { name: "_instance", type: "text" },
39
+ { name: "car", type: "text" },
40
+ { name: "price", type: "double precision" },
41
+ { name: "tags", type: "jsonb" },
42
+ { name: "_extra", type: "jsonb" },
43
+ ];
44
+ const RETYPED_COLUMNS = FULL_COLUMNS.map((column) => column.name === "price" ? { name: column.name, type: "text" } : column);
45
+ const RETIRED_COLUMNS = [
46
+ ...FULL_COLUMNS,
47
+ { name: "retired", type: "text" },
48
+ ];
49
+ const UNCASTABLE_COLUMNS = FULL_COLUMNS.map((column) => column.name === "price" ? { name: column.name, type: "boolean" } : column);
50
+ const DRIFTED_TAGS_INDEX = {
51
+ name: "vehicles_tags",
52
+ signature: `antelopejs:1:gin:"outdated"`,
53
+ valid: true,
54
+ };
55
+ const PRICE_SIGNATURE = `antelopejs:1:btree:"_instance","price"`;
56
+ const DRIFTED_PRICE_INDEX = {
57
+ name: "vehicles_price",
58
+ signature: `antelopejs:1:btree:"price"`,
59
+ valid: true,
60
+ };
61
+ const DROP_PRICE = `DROP INDEX CONCURRENTLY IF EXISTS "shop"."vehicles_price"`;
62
+ const DROP_PRICE_REPLACEMENT = `DROP INDEX CONCURRENTLY IF EXISTS "shop"."vehicles_price__next"`;
63
+ const CREATE_PRICE = `CREATE INDEX CONCURRENTLY "vehicles_price"`;
64
+ const CREATE_PRICE_REPLACEMENT = `CREATE INDEX CONCURRENTLY "vehicles_price__next"`;
65
+ const RENAME_PRICE_REPLACEMENT = `ALTER INDEX "shop"."vehicles_price__next" RENAME TO "vehicles_price"`;
66
+ function OtherIndexes(plan, name) {
67
+ return SignedIndexes(plan).filter((index) => index.name !== name);
68
+ }
69
+ function StartsAt(statements, prefix) {
70
+ return statements.findIndex((sql) => sql.startsWith(prefix));
71
+ }
72
+ function Existing(columns, indexes = []) {
73
+ return { columns, indexes };
74
+ }
75
+ function SignedIndexes(plan) {
76
+ return plan.indexes.map((index) => ({
77
+ name: index.name,
78
+ signature: index.signature,
79
+ valid: true,
80
+ }));
81
+ }
82
+ function CatalogType(type) {
83
+ const spelling = CATALOG_TYPES.get(type);
84
+ if (spelling === undefined) {
85
+ throw new Error(`No catalog spelling recorded for physical type '${type}'`);
86
+ }
87
+ return spelling;
88
+ }
89
+ function CatalogColumns(plan) {
90
+ return plan.columns.map((column) => ({
91
+ name: column.name,
92
+ type: CatalogType(column.type),
93
+ }));
94
+ }
95
+ const IsIndexDrop = (sql) => sql.startsWith("DROP INDEX");
96
+ const IsColumnChange = (sql) => sql.startsWith("ALTER TABLE");
97
+ function FirstAt(statements, matches) {
98
+ const position = statements.findIndex(matches);
99
+ if (position < 0) {
100
+ throw new Error(`No statement matched: ${statements.join(" | ")}`);
101
+ }
102
+ return position;
103
+ }
104
+ function LastAt(statements, matches) {
105
+ return statements.reduce((found, sql, position) => (matches(sql) ? position : found), FirstAt(statements, matches));
106
+ }
107
+ describe("PlanTable", () => {
108
+ it("creates everything when the table is absent", () => {
109
+ const out = (0, convergence_1.PlanTable)(SCHEMA, ddl_fixture_1.VEHICLES_PLAN, EMPTY, SAFE);
110
+ (0, chai_1.expect)(out.statements).to.have.lengthOf(1);
111
+ (0, chai_1.expect)(out.statements[0]).to.contain("CREATE TABLE IF NOT EXISTS");
112
+ (0, chai_1.expect)(out.indexStatements.filter((sql) => sql.startsWith("CREATE INDEX CONCURRENTLY"))).to.have.lengthOf(DECLARED_INDEX_COUNT);
113
+ (0, chai_1.expect)(out.warnings).to.deep.equal([]);
114
+ });
115
+ it("adds only the missing columns", () => {
116
+ const actual = Existing([
117
+ { name: "_id", type: "text" },
118
+ { name: "_instance", type: "text" },
119
+ { name: "car", type: "text" },
120
+ { name: "_extra", type: "jsonb" },
121
+ ]);
122
+ const out = (0, convergence_1.PlanTable)(SCHEMA, ddl_fixture_1.VEHICLES_PLAN, actual, SAFE);
123
+ const added = out.statements.filter((sql) => sql.includes("ADD COLUMN"));
124
+ (0, chai_1.expect)(added).to.deep.equal([
125
+ `ALTER TABLE ${VEHICLES_TARGET} ADD COLUMN IF NOT EXISTS "price" double precision`,
126
+ `ALTER TABLE ${VEHICLES_TARGET} ADD COLUMN IF NOT EXISTS "tags" jsonb`,
127
+ ]);
128
+ });
129
+ it("moves each added column's field out of the overflow document, in the same transaction", () => {
130
+ const actual = Existing([
131
+ { name: "_id", type: "text" },
132
+ { name: "_instance", type: "text" },
133
+ { name: "car", type: "text" },
134
+ { name: "_extra", type: "jsonb" },
135
+ ]);
136
+ const out = (0, convergence_1.PlanTable)(SCHEMA, ddl_fixture_1.VEHICLES_PLAN, actual, SAFE);
137
+ const filled = out.statements.filter((sql) => sql.startsWith("UPDATE"));
138
+ (0, chai_1.expect)(filled).to.have.lengthOf(2);
139
+ (0, chai_1.expect)(filled[0]).to.contain(`UPDATE ${VEHICLES_TARGET} SET "price" =`);
140
+ (0, chai_1.expect)(filled[0]).to.contain(`"_extra" = "_extra" - 'price'`);
141
+ (0, chai_1.expect)(filled[0]).to.contain(`WHERE "price" IS NULL`);
142
+ const added = out.statements.indexOf(out.statements.filter((sql) => sql.includes(`"price"`))[0]);
143
+ (0, chai_1.expect)(out.statements[added + 1]).to.equal(filled[0]);
144
+ });
145
+ it("reads the stored value as the column's type, so a mistyped one stays put", () => {
146
+ const actual = Existing([
147
+ { name: "_id", type: "text" },
148
+ { name: "_instance", type: "text" },
149
+ { name: "car", type: "text" },
150
+ { name: "tags", type: "jsonb" },
151
+ { name: "_extra", type: "jsonb" },
152
+ ]);
153
+ const out = (0, convergence_1.PlanTable)(SCHEMA, ddl_fixture_1.VEHICLES_PLAN, actual, SAFE);
154
+ const filled = out.statements.filter((sql) => sql.startsWith("UPDATE"));
155
+ (0, chai_1.expect)(filled).to.have.lengthOf(1);
156
+ (0, chai_1.expect)(filled[0]).to.contain("jsonb_typeof");
157
+ (0, chai_1.expect)(filled[0]).to.contain("IS NOT NULL");
158
+ (0, chai_1.expect)(filled[0]).to.contain("'null'::jsonb");
159
+ });
160
+ it("plans no backfill where nothing was added", () => {
161
+ const actual = Existing([
162
+ { name: "_id", type: "text" },
163
+ { name: "_instance", type: "text" },
164
+ { name: "car", type: "text" },
165
+ { name: "price", type: "double precision" },
166
+ { name: "tags", type: "jsonb" },
167
+ { name: "_extra", type: "jsonb" },
168
+ ]);
169
+ const out = (0, convergence_1.PlanTable)(SCHEMA, ddl_fixture_1.VEHICLES_PLAN, actual, SAFE);
170
+ (0, chai_1.expect)(out.statements.filter((sql) => sql.startsWith("UPDATE"))).to.deep.equal([]);
171
+ });
172
+ it("accepts the catalog spelling of a timestamp column", () => {
173
+ const plan = (0, ddl_1.BuildTablePlan)("v", dated, (0, fields_1.ParseTable)(dated, "s.v"));
174
+ const actual = Existing([
175
+ { name: "_id", type: "text" },
176
+ { name: "_instance", type: "text" },
177
+ { name: "manufactured", type: "timestamp with time zone" },
178
+ { name: "_extra", type: "jsonb" },
179
+ ]);
180
+ (0, chai_1.expect)((0, convergence_1.PlanTable)(SCHEMA, plan, actual, SAFE).statements).to.deep.equal([]);
181
+ });
182
+ it("accepts the catalog spelling of every physical type", () => {
183
+ const plan = (0, ddl_1.BuildTablePlan)("v", everyType, (0, fields_1.ParseTable)(everyType, "s.v"));
184
+ const actual = Existing(CatalogColumns(plan));
185
+ (0, chai_1.expect)((0, convergence_1.PlanTable)(SCHEMA, plan, actual, SAFE).statements).to.deep.equal([]);
186
+ });
187
+ });
188
+ describe("PlanTable", () => {
189
+ it("refuses a type change in safe mode, naming the field", () => {
190
+ const actual = Existing(RETYPED_COLUMNS);
191
+ const converge = () => (0, convergence_1.PlanTable)(SCHEMA, ddl_fixture_1.VEHICLES_PLAN, actual, SAFE);
192
+ (0, chai_1.expect)(converge).to.throw(/price/);
193
+ (0, chai_1.expect)(converge).to.throw(/destructive/);
194
+ });
195
+ it("alters a changed type in destructive mode", () => {
196
+ const actual = Existing(RETYPED_COLUMNS);
197
+ const out = (0, convergence_1.PlanTable)(SCHEMA, ddl_fixture_1.VEHICLES_PLAN, actual, DESTRUCTIVE);
198
+ (0, chai_1.expect)(out.statements).to.contain(`ALTER TABLE ${VEHICLES_TARGET} ALTER COLUMN "price" TYPE double precision USING ("price"::text::double precision)`);
199
+ });
200
+ it("routes the destructive cast through text when no direct cast exists", () => {
201
+ const actual = Existing(UNCASTABLE_COLUMNS);
202
+ const out = (0, convergence_1.PlanTable)(SCHEMA, ddl_fixture_1.VEHICLES_PLAN, actual, DESTRUCTIVE);
203
+ (0, chai_1.expect)(out.statements).to.contain(`ALTER TABLE ${VEHICLES_TARGET} ALTER COLUMN "price" TYPE double precision USING ("price"::text::double precision)`);
204
+ });
205
+ it("refuses to add a not-null column with no default to a live table", () => {
206
+ const actual = Existing(FULL_COLUMNS.filter((column) => column.name !== "_id"));
207
+ const converge = () => (0, convergence_1.PlanTable)(SCHEMA, ddl_fixture_1.VEHICLES_PLAN, actual, DESTRUCTIVE);
208
+ (0, chai_1.expect)(converge).to.throw(/_id/);
209
+ (0, chai_1.expect)(converge).to.throw(/not created by this adapter/);
210
+ });
211
+ it("warns about an undeclared column in safe mode and keeps it", () => {
212
+ const actual = Existing(RETIRED_COLUMNS, SignedIndexes(ddl_fixture_1.VEHICLES_PLAN));
213
+ const out = (0, convergence_1.PlanTable)(SCHEMA, ddl_fixture_1.VEHICLES_PLAN, actual, SAFE);
214
+ (0, chai_1.expect)(out.statements).to.deep.equal([]);
215
+ (0, chai_1.expect)(out.warnings[0]).to.match(/retired/);
216
+ });
217
+ it("drops an undeclared column in destructive mode", () => {
218
+ const actual = Existing(RETIRED_COLUMNS, SignedIndexes(ddl_fixture_1.VEHICLES_PLAN));
219
+ const out = (0, convergence_1.PlanTable)(SCHEMA, ddl_fixture_1.VEHICLES_PLAN, actual, DESTRUCTIVE);
220
+ (0, chai_1.expect)(out.statements).to.contain(`ALTER TABLE ${VEHICLES_TARGET} DROP COLUMN "retired"`);
221
+ });
222
+ it("leaves a matching index alone", () => {
223
+ const actual = Existing(FULL_COLUMNS, SignedIndexes(ddl_fixture_1.VEHICLES_PLAN));
224
+ const out = (0, convergence_1.PlanTable)(SCHEMA, ddl_fixture_1.VEHICLES_PLAN, actual, SAFE);
225
+ (0, chai_1.expect)(out.indexStatements).to.deep.equal([]);
226
+ });
227
+ it("builds indexes outside the transaction", () => {
228
+ const actual = Existing(FULL_COLUMNS);
229
+ const out = (0, convergence_1.PlanTable)(SCHEMA, ddl_fixture_1.VEHICLES_PLAN, actual, SAFE);
230
+ (0, chai_1.expect)(out.statements).to.deep.equal([]);
231
+ (0, chai_1.expect)(out.indexStatements).to.have.lengthOf(DECLARED_INDEX_COUNT * 2);
232
+ });
233
+ it("builds a drifted index's replacement before it drops the index", () => {
234
+ const actual = Existing(FULL_COLUMNS, [
235
+ ...OtherIndexes(ddl_fixture_1.VEHICLES_PLAN, "vehicles_price"),
236
+ DRIFTED_PRICE_INDEX,
237
+ ]);
238
+ const out = (0, convergence_1.PlanTable)(SCHEMA, ddl_fixture_1.VEHICLES_PLAN, actual, SAFE);
239
+ (0, chai_1.expect)(out.statements).to.deep.equal([]);
240
+ (0, chai_1.expect)(out.indexStatements).to.deep.equal([
241
+ `${CREATE_PRICE_REPLACEMENT} ON ${VEHICLES_TARGET} USING btree ("_instance", "price")`,
242
+ `COMMENT ON INDEX "shop"."vehicles_price__next" IS '${PRICE_SIGNATURE}'`,
243
+ DROP_PRICE,
244
+ RENAME_PRICE_REPLACEMENT,
245
+ ]);
246
+ });
247
+ it("replaces an index we own but never signed", () => {
248
+ const actual = Existing(FULL_COLUMNS, [
249
+ ...OtherIndexes(ddl_fixture_1.VEHICLES_PLAN, "vehicles_price"),
250
+ { name: "vehicles_price", valid: true },
251
+ ]);
252
+ const out = (0, convergence_1.PlanTable)(SCHEMA, ddl_fixture_1.VEHICLES_PLAN, actual, SAFE);
253
+ (0, chai_1.expect)(StartsAt(out.indexStatements, CREATE_PRICE_REPLACEMENT)).to.equal(0);
254
+ (0, chai_1.expect)(out.indexStatements).to.contain(RENAME_PRICE_REPLACEMENT);
255
+ });
256
+ it("drops and rebuilds an index a failed concurrent build left invalid", () => {
257
+ const actual = Existing(FULL_COLUMNS, [
258
+ ...OtherIndexes(ddl_fixture_1.VEHICLES_PLAN, "vehicles_price"),
259
+ { name: "vehicles_price", signature: PRICE_SIGNATURE, valid: false },
260
+ ]);
261
+ const out = (0, convergence_1.PlanTable)(SCHEMA, ddl_fixture_1.VEHICLES_PLAN, actual, SAFE);
262
+ (0, chai_1.expect)(out.indexStatements[0]).to.equal(DROP_PRICE);
263
+ (0, chai_1.expect)(StartsAt(out.indexStatements, CREATE_PRICE)).to.equal(1);
264
+ });
265
+ it("clears a replacement a failed rebuild left behind", () => {
266
+ const actual = Existing(FULL_COLUMNS, [
267
+ ...SignedIndexes(ddl_fixture_1.VEHICLES_PLAN),
268
+ { name: "vehicles_price__next", valid: false },
269
+ ]);
270
+ const out = (0, convergence_1.PlanTable)(SCHEMA, ddl_fixture_1.VEHICLES_PLAN, actual, SAFE);
271
+ (0, chai_1.expect)(out.indexStatements).to.deep.equal([DROP_PRICE_REPLACEMENT]);
272
+ });
273
+ it("swaps in a ready replacement when a crash left the index missing", () => {
274
+ const actual = Existing(FULL_COLUMNS, [
275
+ ...OtherIndexes(ddl_fixture_1.VEHICLES_PLAN, "vehicles_price"),
276
+ { name: "vehicles_price__next", signature: PRICE_SIGNATURE, valid: true },
277
+ ]);
278
+ const out = (0, convergence_1.PlanTable)(SCHEMA, ddl_fixture_1.VEHICLES_PLAN, actual, SAFE);
279
+ (0, chai_1.expect)(out.indexStatements).to.deep.equal([RENAME_PRICE_REPLACEMENT]);
280
+ });
281
+ });
282
+ describe("PlanTable", () => {
283
+ it("drops an adapter index whose declaration is gone, after every build", () => {
284
+ const actual = Existing(FULL_COLUMNS, [
285
+ {
286
+ name: "vehicles_retired",
287
+ signature: `antelopejs:1:btree:"_instance","retired"`,
288
+ valid: true,
289
+ },
290
+ ]);
291
+ const out = (0, convergence_1.PlanTable)(SCHEMA, ddl_fixture_1.VEHICLES_PLAN, actual, SAFE);
292
+ (0, chai_1.expect)(out.indexStatements.at(-1)).to.equal(`DROP INDEX CONCURRENTLY IF EXISTS "shop"."vehicles_retired"`);
293
+ });
294
+ it("drops the __g twin once an index is no longer crossInstance", () => {
295
+ const shared = (0, ddl_fixture_1.PlanFor)("vehicles", {
296
+ fields: ddl_fixture_1.vehicles.fields,
297
+ indexes: { ...ddl_fixture_1.vehicles.indexes, price: { crossInstance: true } },
298
+ });
299
+ const actual = Existing(FULL_COLUMNS, SignedIndexes(shared));
300
+ const out = (0, convergence_1.PlanTable)(SCHEMA, ddl_fixture_1.VEHICLES_PLAN, actual, SAFE);
301
+ (0, chai_1.expect)(out.indexStatements).to.deep.equal([
302
+ `DROP INDEX CONCURRENTLY IF EXISTS "shop"."vehicles_price__g"`,
303
+ ]);
304
+ });
305
+ it("rebuilds an index whose unique flag was added, then removed", () => {
306
+ const unique = (0, ddl_fixture_1.PlanFor)("vehicles", {
307
+ fields: ddl_fixture_1.vehicles.fields,
308
+ indexes: { ...ddl_fixture_1.vehicles.indexes, price: { unique: true } },
309
+ });
310
+ const added = (0, convergence_1.PlanTable)(SCHEMA, unique, Existing(FULL_COLUMNS, SignedIndexes(ddl_fixture_1.VEHICLES_PLAN)), SAFE);
311
+ (0, chai_1.expect)(added.indexStatements[0]).to.equal(`CREATE UNIQUE INDEX CONCURRENTLY "vehicles_price__next" ON ${VEHICLES_TARGET} USING btree ("_instance", "price")`);
312
+ (0, chai_1.expect)(added.indexStatements).to.contain(RENAME_PRICE_REPLACEMENT);
313
+ const removed = (0, convergence_1.PlanTable)(SCHEMA, ddl_fixture_1.VEHICLES_PLAN, Existing(FULL_COLUMNS, SignedIndexes(unique)), SAFE);
314
+ (0, chai_1.expect)(StartsAt(removed.indexStatements, CREATE_PRICE_REPLACEMENT)).to.equal(0);
315
+ (0, chai_1.expect)(removed.indexStatements).to.contain(RENAME_PRICE_REPLACEMENT);
316
+ });
317
+ it("leaves a hand-made index alone", () => {
318
+ const actual = Existing(FULL_COLUMNS, [
319
+ ...SignedIndexes(ddl_fixture_1.VEHICLES_PLAN),
320
+ { name: "operator_hunch", valid: true },
321
+ { name: "operator_broken", valid: false },
322
+ ]);
323
+ const out = (0, convergence_1.PlanTable)(SCHEMA, ddl_fixture_1.VEHICLES_PLAN, actual, SAFE);
324
+ (0, chai_1.expect)(out.statements).to.deep.equal([]);
325
+ (0, chai_1.expect)(out.indexStatements).to.deep.equal([]);
326
+ });
327
+ it("drops obsolete indexes inside the transaction before a column retype", () => {
328
+ const actual = Existing(RETYPED_COLUMNS, [
329
+ ...OtherIndexes(ddl_fixture_1.VEHICLES_PLAN, "vehicles_tags"),
330
+ DRIFTED_TAGS_INDEX,
331
+ ]);
332
+ const out = (0, convergence_1.PlanTable)(SCHEMA, ddl_fixture_1.VEHICLES_PLAN, actual, DESTRUCTIVE);
333
+ (0, chai_1.expect)(LastAt(out.statements, IsIndexDrop)).to.be.lessThan(FirstAt(out.statements, IsColumnChange));
334
+ (0, chai_1.expect)(out.statements[0]).to.equal(`DROP INDEX IF EXISTS "shop"."vehicles_tags"`);
335
+ (0, chai_1.expect)(out.indexStatements).to.have.lengthOf(2);
336
+ (0, chai_1.expect)(out.indexStatements[0]).to.match(/^CREATE INDEX CONCURRENTLY "vehicles_tags"/);
337
+ });
338
+ it("emits nothing against the state its own creation produces", () => {
339
+ const actual = Existing(CatalogColumns(ddl_fixture_1.VEHICLES_PLAN), SignedIndexes(ddl_fixture_1.VEHICLES_PLAN));
340
+ (0, chai_1.expect)((0, convergence_1.PlanTable)(SCHEMA, ddl_fixture_1.VEHICLES_PLAN, actual, SAFE)).to.deep.equal({
341
+ statements: [],
342
+ indexStatements: [],
343
+ warnings: [],
344
+ });
345
+ });
346
+ });
347
+ //# sourceMappingURL=convergence.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convergence.spec.js","sourceRoot":"","sources":["../../../src/test/unit/convergence.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ import { type PoolClient } from "pg";
2
+ import type { Options } from "../../config";
3
+ import type { ResultRow } from "../../implementations/database/query";
4
+ import { type CursorOpener } from "../../implementations/database/cursors";
5
+ export declare const CURSOR = "\"antelopejs_cursor\"";
6
+ export declare const SQL = "SELECT \"n\" FROM \"t\" WHERE \"n\" > ($1::int)";
7
+ export declare const PARAMS: unknown[];
8
+ export declare const BATCH_SIZE = 3;
9
+ export declare const IDLE_TIMEOUT_MS = 30000;
10
+ export declare const REAPED_AFTER_MS = 1;
11
+ export declare const REAP_WINDOW_MS = 40;
12
+ export declare const REAPER_PROBE_MS = 987654;
13
+ export declare const BEGIN = "BEGIN";
14
+ export declare const ROLLBACK = "ROLLBACK";
15
+ export declare const RELEASE = "RELEASE";
16
+ export declare const CLOSE = "CLOSE \"antelopejs_cursor\"";
17
+ export declare const DECLARE = "DECLARE \"antelopejs_cursor\" NO SCROLL CURSOR FOR SELECT \"n\" FROM \"t\" WHERE \"n\" > ($1::int)";
18
+ export declare const FETCH = "FETCH FORWARD 3 FROM \"antelopejs_cursor\"";
19
+ export declare const FETCH_PREFIX = "FETCH FORWARD";
20
+ export declare const PARAM_MARKER: RegExp;
21
+ export declare const OPTIONS: Options;
22
+ export declare const REAPING: Options;
23
+ export declare const PROBING: Options;
24
+ export declare const NO_VALUES: unknown[];
25
+ export declare const STUB_FAILURE = "the stub client refused this statement";
26
+ export declare const NEVER_ENDED = "the cursor never answered done";
27
+ export declare const NEVER_REJECTED = "the read was expected to reject";
28
+ export declare const NEVER_ARRIVED = "no read arrived while the sweep was running";
29
+ export declare const NEVER_HELD = "the stub never reached the statement it was told to hold";
30
+ export declare const DOUBLE_RELEASE = "this client was already handed back to the pool";
31
+ export declare const DRAIN_LIMIT = 50;
32
+ export declare const SETTLE_TURNS = 8;
33
+ export declare const NOT_OBSERVED = -1;
34
+ export declare const FORGOTTEN_HINT = "no longer remembered";
35
+ export declare const DESCENDING_CURSORS = 4;
36
+ export declare const DECLARE_POSITION = 1;
37
+ export declare const STALE_TIMER = 0;
38
+ export declare const LAST_TIMER = 1;
39
+ export declare const NEXT_TURN_MS = 0;
40
+ export declare const IDLE_TIMEOUT_OPTION = "cursorIdleTimeoutMs";
41
+ export declare const REMEMBERED_ENDINGS = 1024;
42
+ export declare const FIRST_SPEC_REQ_ID = -1;
43
+ export interface Recording {
44
+ statements: string[];
45
+ bound: unknown[][];
46
+ releases: number;
47
+ acquires: number;
48
+ whenReleased?: () => void;
49
+ holdsNextFetch?: boolean;
50
+ resumeFetch?: () => void;
51
+ holdsStatement?: string;
52
+ resumeHeld?: () => void;
53
+ }
54
+ export declare function Recorder(): Recording;
55
+ export declare function StubClient(log: Recording, batches: ResultRow[][], failing?: string): PoolClient;
56
+ export declare function Decode(rows: ResultRow[]): unknown[];
57
+ export declare function Requesting(log: Recording, batches: ResultRow[][], failing?: string): CursorOpener;
58
+ export declare function Rows(...values: number[]): ResultRow[];
59
+ export declare function Reopening(log: Recording, ...values: number[]): CursorOpener;
60
+ export declare let lastReqId: number;
61
+ export declare let claimed: number[];
62
+ export declare function NextReqId(): number;
63
+ export declare function Read(reqId: number, open: CursorOpener, options?: Options): Promise<IteratorResult<unknown, void>>;
64
+ export declare function Drain(reqId: number, open: CursorOpener): Promise<unknown[]>;
65
+ export declare function Rejection(read: Promise<unknown>): Promise<Error>;
66
+ export declare function Delay(ms: number): Promise<void>;
67
+ export declare function Settle(): Promise<void>;
68
+ export declare function WhenHeld(log: Recording): Promise<() => void>;
69
+ export declare function OverflowEndings(): Promise<void>;
70
+ export interface TimerLog {
71
+ armed: NodeJS.Timeout[];
72
+ handlers: (() => void)[];
73
+ cleared: NodeJS.Timeout[];
74
+ }
75
+ export declare function TimerRecorder(): TimerLog;
76
+ export declare function CapturingTimers(log: TimerLog, delayMs: number, body: () => Promise<void>): Promise<void>;
77
+ export declare function Count(log: Recording, statement: string): number;
78
+ export declare let baseline: number;
79
+ export declare function GuardTheRegistry(): void;