@proteinjs/db-driver-spanner 1.18.0 → 1.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/dist/generated/index.js +1 -1
  3. package/dist/generated/index.js.map +1 -1
  4. package/dist/generated/test/index.js +1 -1
  5. package/dist/generated/test/index.js.map +1 -1
  6. package/dist/src/SpannerDriver.d.ts +52 -3
  7. package/dist/src/SpannerDriver.d.ts.map +1 -1
  8. package/dist/src/SpannerDriver.js +141 -33
  9. package/dist/src/SpannerDriver.js.map +1 -1
  10. package/dist/src/SpannerSchemaOperations.d.ts +9 -1
  11. package/dist/src/SpannerSchemaOperations.d.ts.map +1 -1
  12. package/dist/src/SpannerSchemaOperations.js +88 -124
  13. package/dist/src/SpannerSchemaOperations.js.map +1 -1
  14. package/dist/test/BatchedDdl.test.d.ts +2 -0
  15. package/dist/test/BatchedDdl.test.d.ts.map +1 -0
  16. package/dist/test/BatchedDdl.test.js +496 -0
  17. package/dist/test/BatchedDdl.test.js.map +1 -0
  18. package/dist/test/DmlRetrySafety.test.d.ts +2 -0
  19. package/dist/test/DmlRetrySafety.test.d.ts.map +1 -0
  20. package/dist/test/DmlRetrySafety.test.js +472 -0
  21. package/dist/test/DmlRetrySafety.test.js.map +1 -0
  22. package/dist/test/RecordIterator.test.d.ts +2 -0
  23. package/dist/test/RecordIterator.test.d.ts.map +1 -0
  24. package/dist/test/RecordIterator.test.js +14 -0
  25. package/dist/test/RecordIterator.test.js.map +1 -0
  26. package/dist/test/RunPendingMigrations.test.d.ts +2 -0
  27. package/dist/test/RunPendingMigrations.test.d.ts.map +1 -0
  28. package/dist/test/RunPendingMigrations.test.js +354 -0
  29. package/dist/test/RunPendingMigrations.test.js.map +1 -0
  30. package/dist/test/SpannerOperationDeadline.test.js +1 -1
  31. package/dist/test/SpannerOperationDeadline.test.js.map +1 -1
  32. package/generated/index.ts +1 -1
  33. package/generated/test/index.ts +1 -1
  34. package/package.json +6 -6
  35. package/src/SpannerDriver.ts +110 -18
  36. package/src/SpannerSchemaOperations.ts +69 -55
  37. package/test/BatchedDdl.test.ts +293 -0
  38. package/test/DmlRetrySafety.test.ts +305 -0
  39. package/test/RecordIterator.test.ts +16 -0
  40. package/test/RunPendingMigrations.test.ts +201 -0
  41. package/test/SpannerOperationDeadline.test.ts +1 -1
@@ -0,0 +1,472 @@
1
+ "use strict";
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
17
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
18
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
19
+ return new (P || (P = Promise))(function (resolve, reject) {
20
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
21
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
22
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
23
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
24
+ });
25
+ };
26
+ var __generator = (this && this.__generator) || function (thisArg, body) {
27
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
28
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
29
+ function verb(n) { return function (v) { return step([n, v]); }; }
30
+ function step(op) {
31
+ if (f) throw new TypeError("Generator is already executing.");
32
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
33
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
34
+ if (y = 0, t) op = [op[0] & 2, t.value];
35
+ switch (op[0]) {
36
+ case 0: case 1: t = op; break;
37
+ case 4: _.label++; return { value: op[1], done: false };
38
+ case 5: _.label++; y = op[1]; op = [0]; continue;
39
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
40
+ default:
41
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
42
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
43
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
44
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
45
+ if (t[2]) _.ops.pop();
46
+ _.trys.pop(); continue;
47
+ }
48
+ op = body.call(thisArg, _);
49
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
50
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
51
+ }
52
+ };
53
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
54
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
55
+ if (ar || !(i in from)) {
56
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
57
+ ar[i] = from[i];
58
+ }
59
+ }
60
+ return to.concat(ar || Array.prototype.slice.call(from));
61
+ };
62
+ Object.defineProperty(exports, "__esModule", { value: true });
63
+ var stream_1 = require("stream");
64
+ var db_1 = require("@proteinjs/db");
65
+ var db_transaction_context_1 = require("@proteinjs/db-transaction-context");
66
+ var db_driver_spanner_1 = require("@proteinjs/db-driver-spanner");
67
+ var test_1 = require("@proteinjs/db/test");
68
+ var reflection_1 = require("@proteinjs/reflection");
69
+ var getDropTestTable_1 = require("./util/getDropTestTable");
70
+ var SpannerEmulatorProvisioner_1 = require("./util/SpannerEmulatorProvisioner");
71
+ require("../generated/test/index");
72
+ var RetryAnchorTestTable = /** @class */ (function (_super) {
73
+ __extends(RetryAnchorTestTable, _super);
74
+ function RetryAnchorTestTable() {
75
+ var _this = _super !== null && _super.apply(this, arguments) || this;
76
+ _this.name = 'db_test_dml_retry_anchor';
77
+ _this.columns = (0, db_1.withRecordColumns)({
78
+ name: new db_1.StringColumn('name'),
79
+ });
80
+ return _this;
81
+ }
82
+ return RetryAnchorTestTable;
83
+ }(db_1.Table));
84
+ var RetryTargetTestTable = /** @class */ (function (_super) {
85
+ __extends(RetryTargetTestTable, _super);
86
+ function RetryTargetTestTable() {
87
+ var _this = _super !== null && _super.apply(this, arguments) || this;
88
+ _this.name = 'db_test_dml_retry_target';
89
+ _this.columns = (0, db_1.withRecordColumns)({
90
+ name: new db_1.StringColumn('name'),
91
+ });
92
+ return _this;
93
+ }
94
+ return RetryTargetTestTable;
95
+ }(db_1.Table));
96
+ var anchorTable = new RetryAnchorTestTable();
97
+ var targetTable = new RetryTargetTestTable();
98
+ // Local tables — not in any reflection source graph, so thread getTable explicitly (the
99
+ // TransactionSafety pattern); other lookups resolve normally.
100
+ var getTable = function (tableName) {
101
+ if (tableName === anchorTable.name) {
102
+ return anchorTable;
103
+ }
104
+ if (tableName === targetTable.name) {
105
+ return targetTable;
106
+ }
107
+ return (0, db_1.tableByName)(tableName);
108
+ };
109
+ var spannerConfig = {
110
+ projectId: 'proteinjs-test',
111
+ instanceName: 'proteinjs-test',
112
+ databaseName: 'test',
113
+ };
114
+ var spannerDriver = new db_driver_spanner_1.SpannerDriver(spannerConfig, getTable);
115
+ var INJECTED_LOSS = 'injected response loss';
116
+ var targetInsertSqlMarker = "INSERT INTO `db_test_dml_retry_target`";
117
+ var isTargetInsertSql = function (sql) { return sql.includes(targetInsertSqlMarker); };
118
+ /** The resolved gRPC stub the gapic layer re-invokes per attempt — the transport seam. */
119
+ var getSpannerStub = function () { return __awaiter(void 0, void 0, void 0, function () {
120
+ var spanner, gapicClient;
121
+ return __generator(this, function (_a) {
122
+ switch (_a.label) {
123
+ case 0:
124
+ spanner = db_driver_spanner_1.SpannerDriver.SPANNER;
125
+ if (!spanner) {
126
+ throw new Error('SpannerDriver.SPANNER not initialized — run an op first');
127
+ }
128
+ gapicClient = spanner.clients_.get('SpannerClient');
129
+ if (!gapicClient) {
130
+ throw new Error('SpannerClient gapic client not created — run a data op first');
131
+ }
132
+ return [4 /*yield*/, gapicClient.spannerStub];
133
+ case 1: return [2 /*return*/, _a.sent()];
134
+ }
135
+ });
136
+ }); };
137
+ var makeLossError = function () {
138
+ var error = new Error(INJECTED_LOSS);
139
+ error.code = 14; // UNAVAILABLE — the shape of a dropped connection / lost response
140
+ return error;
141
+ };
142
+ /** Inject loss on the FIRST matching ExecuteStreamingSql attempt; later attempts pass through. */
143
+ var patchStreamingLoss = function (stub, isTargetSql, mode) {
144
+ var original = stub.executeStreamingSql;
145
+ var attempts = 0;
146
+ stub.executeStreamingSql = function () {
147
+ var args = [];
148
+ for (var _i = 0; _i < arguments.length; _i++) {
149
+ args[_i] = arguments[_i];
150
+ }
151
+ var request = args[0];
152
+ if (typeof (request === null || request === void 0 ? void 0 : request.sql) !== 'string' || !isTargetSql(request.sql)) {
153
+ return original.apply(this, args);
154
+ }
155
+ attempts += 1;
156
+ if (attempts > 1) {
157
+ return original.apply(this, args);
158
+ }
159
+ var wrapper = new stream_1.PassThrough({ objectMode: true });
160
+ var injected = false;
161
+ var inject = function () {
162
+ if (injected) {
163
+ return;
164
+ }
165
+ injected = true;
166
+ wrapper.emit('error', makeLossError());
167
+ };
168
+ if (mode === 'lost-in-flight') {
169
+ wrapper.cancel = function () { return undefined; };
170
+ setImmediate(inject);
171
+ return wrapper;
172
+ }
173
+ var real = original.apply(this, args);
174
+ wrapper.cancel = function () { var _a; return (_a = real.cancel) === null || _a === void 0 ? void 0 : _a.call(real); };
175
+ real.on('data', function () { return undefined; }); // drain — the response is consumed and dropped
176
+ real.on('metadata', function () { return undefined; });
177
+ real.on('error', inject);
178
+ real.on('status', inject);
179
+ real.on('end', inject);
180
+ return wrapper;
181
+ };
182
+ return { attempts: function () { return attempts; }, restore: function () { return (stub.executeStreamingSql = original); } };
183
+ };
184
+ /** Inject loss on the FIRST matching ExecuteBatchDml attempt; later attempts pass through. */
185
+ var patchUnaryLoss = function (stub, isTargetSql, mode) {
186
+ var original = stub.executeBatchDml;
187
+ var attempts = 0;
188
+ stub.executeBatchDml = function () {
189
+ var _a;
190
+ var args = [];
191
+ for (var _i = 0; _i < arguments.length; _i++) {
192
+ args[_i] = arguments[_i];
193
+ }
194
+ var request = args[0];
195
+ var statements = (_a = request === null || request === void 0 ? void 0 : request.statements) !== null && _a !== void 0 ? _a : [];
196
+ if (!statements.some(function (statement) { return typeof (statement === null || statement === void 0 ? void 0 : statement.sql) === 'string' && isTargetSql(statement.sql); })) {
197
+ return original.apply(this, args);
198
+ }
199
+ attempts += 1;
200
+ if (attempts > 1) {
201
+ return original.apply(this, args);
202
+ }
203
+ var callback = args[args.length - 1];
204
+ if (typeof callback !== 'function') {
205
+ throw new Error('expected trailing callback on unary stub call');
206
+ }
207
+ if (mode === 'lost-in-flight') {
208
+ setImmediate(function () { return callback(makeLossError()); });
209
+ return { cancel: function () { return undefined; } };
210
+ }
211
+ var lossyCallback = function () { return callback(makeLossError()); };
212
+ return original.apply(this, __spreadArray(__spreadArray([], args.slice(0, -1), true), [lossyCallback], false));
213
+ };
214
+ return { attempts: function () { return attempts; }, restore: function () { return (stub.executeBatchDml = original); } };
215
+ };
216
+ /** Pass-through counter for DML on the streaming transport — must stay ZERO post-fix. */
217
+ var patchStreamingDmlCounter = function (stub, isTargetSql) {
218
+ var original = stub.executeStreamingSql;
219
+ var attempts = 0;
220
+ stub.executeStreamingSql = function () {
221
+ var _a;
222
+ var args = [];
223
+ for (var _i = 0; _i < arguments.length; _i++) {
224
+ args[_i] = arguments[_i];
225
+ }
226
+ if (typeof ((_a = args[0]) === null || _a === void 0 ? void 0 : _a.sql) === 'string' && isTargetSql(args[0].sql)) {
227
+ attempts += 1;
228
+ }
229
+ return original.apply(this, args);
230
+ };
231
+ return { attempts: function () { return attempts; }, restore: function () { return (stub.executeStreamingSql = original); } };
232
+ };
233
+ describe('DML retry safety (a lost response must never re-execute a statement)', function () {
234
+ var dropTable = (0, getDropTestTable_1.getDropTestTable)(spannerDriver);
235
+ var db = new db_1.Db(spannerDriver, getTable, new db_transaction_context_1.TransactionContext());
236
+ beforeAll(function () { return __awaiter(void 0, void 0, void 0, function () {
237
+ return __generator(this, function (_a) {
238
+ switch (_a.label) {
239
+ case 0:
240
+ (0, test_1.registerTestUser)();
241
+ // HERMETIC two-table world (the TransactionSafety pattern): the delete path's
242
+ // reverse-cascade scan walks getTables(); scope the registry to the local tables.
243
+ reflection_1.SourceRepository.get().objectCache['@proteinjs/db/Table'] = [anchorTable, targetTable];
244
+ return [4 /*yield*/, SpannerEmulatorProvisioner_1.SpannerEmulatorProvisioner.ensureProvisioned(spannerConfig)];
245
+ case 1:
246
+ _a.sent();
247
+ return [4 /*yield*/, spannerDriver.createDbIfNotExists()];
248
+ case 2:
249
+ _a.sent();
250
+ return [4 /*yield*/, spannerDriver.getTableManager().loadTable(anchorTable)];
251
+ case 3:
252
+ _a.sent();
253
+ return [4 /*yield*/, spannerDriver.getTableManager().loadTable(targetTable)];
254
+ case 4:
255
+ _a.sent();
256
+ // Warm the data client so the gapic SpannerClient + resolved stub exist to patch.
257
+ return [4 /*yield*/, db.query(targetTable, { name: 'warmup' })];
258
+ case 5:
259
+ // Warm the data client so the gapic SpannerClient + resolved stub exist to patch.
260
+ _a.sent();
261
+ return [2 /*return*/];
262
+ }
263
+ });
264
+ }); }, 60000);
265
+ afterAll(function () { return __awaiter(void 0, void 0, void 0, function () {
266
+ return __generator(this, function (_a) {
267
+ switch (_a.label) {
268
+ case 0: return [4 /*yield*/, dropTable(targetTable)];
269
+ case 1:
270
+ _a.sent();
271
+ return [4 /*yield*/, dropTable(anchorTable)];
272
+ case 2:
273
+ _a.sent();
274
+ return [4 /*yield*/, SpannerEmulatorProvisioner_1.SpannerEmulatorProvisioner.release()];
275
+ case 3:
276
+ _a.sent();
277
+ delete reflection_1.SourceRepository.get().objectCache['@proteinjs/db/Table'];
278
+ (0, test_1.clearTestUser)();
279
+ return [2 /*return*/];
280
+ }
281
+ });
282
+ }); }, 60000);
283
+ afterEach(function () { return __awaiter(void 0, void 0, void 0, function () {
284
+ var _i, _a, table, leftovers, _b, leftovers_1, row;
285
+ return __generator(this, function (_c) {
286
+ switch (_c.label) {
287
+ case 0:
288
+ _i = 0, _a = [targetTable, anchorTable];
289
+ _c.label = 1;
290
+ case 1:
291
+ if (!(_i < _a.length)) return [3 /*break*/, 7];
292
+ table = _a[_i];
293
+ return [4 /*yield*/, db.query(table, {})];
294
+ case 2:
295
+ leftovers = _c.sent();
296
+ _b = 0, leftovers_1 = leftovers;
297
+ _c.label = 3;
298
+ case 3:
299
+ if (!(_b < leftovers_1.length)) return [3 /*break*/, 6];
300
+ row = leftovers_1[_b];
301
+ return [4 /*yield*/, db.delete(table, { id: row.id })];
302
+ case 4:
303
+ _c.sent();
304
+ _c.label = 5;
305
+ case 5:
306
+ _b++;
307
+ return [3 /*break*/, 3];
308
+ case 6:
309
+ _i++;
310
+ return [3 /*break*/, 1];
311
+ case 7: return [2 /*return*/];
312
+ }
313
+ });
314
+ }); }, 30000);
315
+ test('in-transaction DML, response lost after the emulator applied it: the loss surfaces (no self-collision), one wire execution, nothing commits', function () { return __awaiter(void 0, void 0, void 0, function () {
316
+ var stub, streamingPatch, unaryPatch, outcome, _a, _b;
317
+ return __generator(this, function (_c) {
318
+ switch (_c.label) {
319
+ case 0: return [4 /*yield*/, getSpannerStub()];
320
+ case 1:
321
+ stub = _c.sent();
322
+ streamingPatch = patchStreamingLoss(stub, isTargetInsertSql, 'applied-then-lost');
323
+ unaryPatch = patchUnaryLoss(stub, isTargetInsertSql, 'applied-then-lost');
324
+ _c.label = 2;
325
+ case 2:
326
+ _c.trys.push([2, , 4, 5]);
327
+ return [4 /*yield*/, db
328
+ .runTransaction(function () { return __awaiter(void 0, void 0, void 0, function () {
329
+ return __generator(this, function (_a) {
330
+ switch (_a.label) {
331
+ case 0:
332
+ // Statement 1 establishes the transaction id; statement 2 is the target DML whose
333
+ // response is lost AFTER the emulator applied it. Pre-fix, retry-request transparently
334
+ // replayed it (2 wire attempts; the op only survived because same-txn same-seqno
335
+ // replays happen to be absorbed by backend replay protection — the inline-begin
336
+ // geometry has no such shield). The contract: ONE wire execution, the LOSS surfaces.
337
+ return [4 /*yield*/, db.insert(anchorTable, { name: 'RetryAnchorA' })];
338
+ case 1:
339
+ // Statement 1 establishes the transaction id; statement 2 is the target DML whose
340
+ // response is lost AFTER the emulator applied it. Pre-fix, retry-request transparently
341
+ // replayed it (2 wire attempts; the op only survived because same-txn same-seqno
342
+ // replays happen to be absorbed by backend replay protection — the inline-begin
343
+ // geometry has no such shield). The contract: ONE wire execution, the LOSS surfaces.
344
+ _a.sent();
345
+ return [4 /*yield*/, db.insert(targetTable, { name: 'RetryTargetA' })];
346
+ case 2:
347
+ _a.sent();
348
+ return [2 /*return*/];
349
+ }
350
+ });
351
+ }); })
352
+ .then(function () { return 'resolved'; })
353
+ .catch(function (error) { return error; })];
354
+ case 3:
355
+ outcome = _c.sent();
356
+ return [3 /*break*/, 5];
357
+ case 4:
358
+ streamingPatch.restore();
359
+ unaryPatch.restore();
360
+ return [7 /*endfinally*/];
361
+ case 5:
362
+ // The surfaced failure is the injected loss — NOT a replay self-collision (6 ALREADY_EXISTS).
363
+ expect(outcome).toBeInstanceOf(Error);
364
+ expect(String(outcome.message)).toContain(INJECTED_LOSS);
365
+ expect(outcome.code).not.toBe(6);
366
+ // Exactly one wire execution of the target DML across both transports.
367
+ expect(streamingPatch.attempts() + unaryPatch.attempts()).toBe(1);
368
+ // The failed transaction committed nothing.
369
+ _a = expect;
370
+ return [4 /*yield*/, db.query(targetTable, { name: 'RetryTargetA' })];
371
+ case 6:
372
+ // The failed transaction committed nothing.
373
+ _a.apply(void 0, [_c.sent()]).toHaveLength(0);
374
+ _b = expect;
375
+ return [4 /*yield*/, db.query(anchorTable, { name: 'RetryAnchorA' })];
376
+ case 7:
377
+ _b.apply(void 0, [_c.sent()]).toHaveLength(0);
378
+ return [2 /*return*/];
379
+ }
380
+ });
381
+ }); }, 30000);
382
+ test('standalone DML (inline begin), request lost in flight: the loss surfaces, one wire attempt, no row materializes behind the failure', function () { return __awaiter(void 0, void 0, void 0, function () {
383
+ var stub, streamingPatch, unaryPatch, outcome, _a;
384
+ return __generator(this, function (_b) {
385
+ switch (_b.label) {
386
+ case 0: return [4 /*yield*/, getSpannerStub()];
387
+ case 1:
388
+ stub = _b.sent();
389
+ streamingPatch = patchStreamingLoss(stub, isTargetInsertSql, 'lost-in-flight');
390
+ unaryPatch = patchUnaryLoss(stub, isTargetInsertSql, 'lost-in-flight');
391
+ _b.label = 2;
392
+ case 2:
393
+ _b.trys.push([2, , 4, 5]);
394
+ return [4 /*yield*/, db
395
+ .insert(targetTable, { name: 'RetryTargetB' })
396
+ .then(function () { return 'resolved'; })
397
+ .catch(function (error) { return error; })];
398
+ case 3:
399
+ outcome = _b.sent();
400
+ return [3 /*break*/, 5];
401
+ case 4:
402
+ streamingPatch.restore();
403
+ unaryPatch.restore();
404
+ return [7 /*endfinally*/];
405
+ case 5:
406
+ // The op fails with the injected loss — it is NOT silently healed by a transparent replay
407
+ // (a replay resolves the op and materializes a row behind a "failed" attempt).
408
+ expect(outcome).toBeInstanceOf(Error);
409
+ expect(String(outcome.message)).toContain(INJECTED_LOSS);
410
+ expect(streamingPatch.attempts() + unaryPatch.attempts()).toBe(1);
411
+ _a = expect;
412
+ return [4 /*yield*/, db.query(targetTable, { name: 'RetryTargetB' })];
413
+ case 6:
414
+ _a.apply(void 0, [_b.sent()]).toHaveLength(0);
415
+ return [2 /*return*/];
416
+ }
417
+ });
418
+ }); }, 30000);
419
+ test('happy path: DML rides the unary RPC (streaming carries none), commits exactly once with faithful row counts', function () { return __awaiter(void 0, void 0, void 0, function () {
420
+ var stub, isTargetDmlSql, streamingCounter, inserted, committed, _a, _b;
421
+ return __generator(this, function (_c) {
422
+ switch (_c.label) {
423
+ case 0: return [4 /*yield*/, getSpannerStub()];
424
+ case 1:
425
+ stub = _c.sent();
426
+ isTargetDmlSql = function (sql) {
427
+ return sql.includes('`db_test_dml_retry_target`') && !sql.trim().startsWith('SELECT');
428
+ };
429
+ streamingCounter = patchStreamingDmlCounter(stub, isTargetDmlSql);
430
+ _c.label = 2;
431
+ case 2:
432
+ _c.trys.push([2, , 7, 8]);
433
+ return [4 /*yield*/, db.runTransaction(function () { return __awaiter(void 0, void 0, void 0, function () {
434
+ return __generator(this, function (_a) {
435
+ switch (_a.label) {
436
+ case 0: return [4 /*yield*/, db.insert(anchorTable, { name: 'RetryAnchorC' })];
437
+ case 1:
438
+ _a.sent();
439
+ return [4 /*yield*/, db.insert(targetTable, { name: 'RetryTargetC' })];
440
+ case 2: return [2 /*return*/, _a.sent()];
441
+ }
442
+ });
443
+ }); })];
444
+ case 3:
445
+ inserted = _c.sent();
446
+ return [4 /*yield*/, db.query(targetTable, { name: 'RetryTargetC' })];
447
+ case 4:
448
+ committed = _c.sent();
449
+ expect(committed).toHaveLength(1);
450
+ // Row counts flow faithfully through the unary path.
451
+ _a = expect;
452
+ return [4 /*yield*/, db.update(targetTable, { name: 'RetryTargetC-updated' }, { id: inserted.id })];
453
+ case 5:
454
+ // Row counts flow faithfully through the unary path.
455
+ _a.apply(void 0, [_c.sent()]).toBe(1);
456
+ _b = expect;
457
+ return [4 /*yield*/, db.delete(targetTable, { id: inserted.id })];
458
+ case 6:
459
+ _b.apply(void 0, [_c.sent()]).toBe(1);
460
+ // No DML (insert/update/delete) ever touched the streaming transport, whose retry
461
+ // layers transparently replay lost responses.
462
+ expect(streamingCounter.attempts()).toBe(0);
463
+ return [3 /*break*/, 8];
464
+ case 7:
465
+ streamingCounter.restore();
466
+ return [7 /*endfinally*/];
467
+ case 8: return [2 /*return*/];
468
+ }
469
+ });
470
+ }); }, 30000);
471
+ });
472
+ //# sourceMappingURL=DmlRetrySafety.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DmlRetrySafety.test.js","sourceRoot":"","sources":["../../test/DmlRetrySafety.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iCAAqC;AACrC,oCAAgG;AAChG,4EAAuE;AACvE,kEAA6D;AAC7D,2CAAqE;AACrE,oDAAyD;AACzD,4DAA2D;AAC3D,gFAA+E;AAC/E,mCAAiC;AA+BjC;IAAmC,wCAAkB;IAArD;QAAA,qEAKC;QAJC,UAAI,GAAG,0BAA0B,CAAC;QAClC,aAAO,GAAG,IAAA,sBAAiB,EAAc;YACvC,IAAI,EAAE,IAAI,iBAAY,CAAC,MAAM,CAAC;SAC/B,CAAC,CAAC;;IACL,CAAC;IAAD,2BAAC;AAAD,CAAC,AALD,CAAmC,UAAK,GAKvC;AAED;IAAmC,wCAAkB;IAArD;QAAA,qEAKC;QAJC,UAAI,GAAG,0BAA0B,CAAC;QAClC,aAAO,GAAG,IAAA,sBAAiB,EAAc;YACvC,IAAI,EAAE,IAAI,iBAAY,CAAC,MAAM,CAAC;SAC/B,CAAC,CAAC;;IACL,CAAC;IAAD,2BAAC;AAAD,CAAC,AALD,CAAmC,UAAK,GAKvC;AAED,IAAM,WAAW,GAAuB,IAAI,oBAAoB,EAAE,CAAC;AACnE,IAAM,WAAW,GAAuB,IAAI,oBAAoB,EAAE,CAAC;AACnE,wFAAwF;AACxF,8DAA8D;AAC9D,IAAM,QAAQ,GAAG,UAAC,SAAiB;IACjC,IAAI,SAAS,KAAK,WAAW,CAAC,IAAI,EAAE;QAClC,OAAO,WAAW,CAAC;KACpB;IACD,IAAI,SAAS,KAAK,WAAW,CAAC,IAAI,EAAE;QAClC,OAAO,WAAW,CAAC;KACpB;IACD,OAAO,IAAA,gBAAW,EAAC,SAAS,CAAC,CAAC;AAChC,CAAC,CAAC;AACF,IAAM,aAAa,GAAG;IACpB,SAAS,EAAE,gBAAgB;IAC3B,YAAY,EAAE,gBAAgB;IAC9B,YAAY,EAAE,MAAM;CACrB,CAAC;AACF,IAAM,aAAa,GAAG,IAAI,iCAAa,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;AAEjE,IAAM,aAAa,GAAG,wBAAwB,CAAC;AAC/C,IAAM,qBAAqB,GAAG,wCAA0C,CAAC;AACzE,IAAM,iBAAiB,GAAG,UAAC,GAAW,IAAK,OAAA,GAAG,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAnC,CAAmC,CAAC;AAW/E,0FAA0F;AAC1F,IAAM,cAAc,GAAG;;;;;gBACf,OAAO,GAAI,iCAA8C,CAAC,OAAO,CAAC;gBACxE,IAAI,CAAC,OAAO,EAAE;oBACZ,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;iBAC5E;gBACK,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;gBAC1D,IAAI,CAAC,WAAW,EAAE;oBAChB,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;iBACjF;gBACM,qBAAM,WAAW,CAAC,WAAW,EAAA;oBAApC,sBAAO,SAA6B,EAAC;;;KACtC,CAAC;AAEF,IAAM,aAAa,GAAG;IACpB,IAAM,KAAK,GAAQ,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;IAC5C,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,kEAAkE;IACnF,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,kGAAkG;AAClG,IAAM,kBAAkB,GAAG,UAAC,IAAS,EAAE,WAAqC,EAAE,IAAc;IAC1F,IAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC;IAC1C,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,CAAC,mBAAmB,GAAG;QAAqB,cAAc;aAAd,UAAc,EAAd,qBAAc,EAAd,IAAc;YAAd,yBAAc;;QAC5D,IAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,OAAO,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,GAAG,CAAA,KAAK,QAAQ,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACjE,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;SACnC;QACD,QAAQ,IAAI,CAAC,CAAC;QACd,IAAI,QAAQ,GAAG,CAAC,EAAE;YAChB,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;SACnC;QACD,IAAM,OAAO,GAAQ,IAAI,oBAAW,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAM,MAAM,GAAG;YACb,IAAI,QAAQ,EAAE;gBACZ,OAAO;aACR;YACD,QAAQ,GAAG,IAAI,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;QACzC,CAAC,CAAC;QACF,IAAI,IAAI,KAAK,gBAAgB,EAAE;YAC7B,OAAO,CAAC,MAAM,GAAG,cAAM,OAAA,SAAS,EAAT,CAAS,CAAC;YACjC,YAAY,CAAC,MAAM,CAAC,CAAC;YACrB,OAAO,OAAO,CAAC;SAChB;QACD,IAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACxC,OAAO,CAAC,MAAM,GAAG,sBAAM,OAAA,MAAA,IAAI,CAAC,MAAM,oDAAI,CAAA,EAAA,CAAC;QACvC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,cAAM,OAAA,SAAS,EAAT,CAAS,CAAC,CAAC,CAAC,+CAA+C;QACjF,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,cAAM,OAAA,SAAS,EAAT,CAAS,CAAC,CAAC;QACrC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACzB,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC1B,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACvB,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IACF,OAAO,EAAE,QAAQ,EAAE,cAAM,OAAA,QAAQ,EAAR,CAAQ,EAAE,OAAO,EAAE,cAAM,OAAA,CAAC,IAAI,CAAC,mBAAmB,GAAG,QAAQ,CAAC,EAArC,CAAqC,EAAE,CAAC;AAC5F,CAAC,CAAC;AAEF,8FAA8F;AAC9F,IAAM,cAAc,GAAG,UAAC,IAAS,EAAE,WAAqC,EAAE,IAAc;IACtF,IAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC;IACtC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,CAAC,eAAe,GAAG;;QAAqB,cAAc;aAAd,UAAc,EAAd,qBAAc,EAAd,IAAc;YAAd,yBAAc;;QACxD,IAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACxB,IAAM,UAAU,GAAU,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,UAAU,mCAAI,EAAE,CAAC;QACpD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAC,SAAS,IAAK,OAAA,OAAO,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,GAAG,CAAA,KAAK,QAAQ,IAAI,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,EAAhE,CAAgE,CAAC,EAAE;YACrG,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;SACnC;QACD,QAAQ,IAAI,CAAC,CAAC;QACd,IAAI,QAAQ,GAAG,CAAC,EAAE;YAChB,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;SACnC;QACD,IAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACvC,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;YAClC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;SAClE;QACD,IAAI,IAAI,KAAK,gBAAgB,EAAE;YAC7B,YAAY,CAAC,cAAM,OAAA,QAAQ,CAAC,aAAa,EAAE,CAAC,EAAzB,CAAyB,CAAC,CAAC;YAC9C,OAAO,EAAE,MAAM,EAAE,cAAM,OAAA,SAAS,EAAT,CAAS,EAAE,CAAC;SACpC;QACD,IAAM,aAAa,GAAG,cAAM,OAAA,QAAQ,CAAC,aAAa,EAAE,CAAC,EAAzB,CAAyB,CAAC;QACtD,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,kCAAM,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAE,aAAa,UAAE,CAAC;IACrE,CAAC,CAAC;IACF,OAAO,EAAE,QAAQ,EAAE,cAAM,OAAA,QAAQ,EAAR,CAAQ,EAAE,OAAO,EAAE,cAAM,OAAA,CAAC,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC,EAAjC,CAAiC,EAAE,CAAC;AACxF,CAAC,CAAC;AAEF,yFAAyF;AACzF,IAAM,wBAAwB,GAAG,UAAC,IAAS,EAAE,WAAqC;IAChF,IAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC;IAC1C,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,CAAC,mBAAmB,GAAG;;QAAqB,cAAc;aAAd,UAAc,EAAd,qBAAc,EAAd,IAAc;YAAd,yBAAc;;QAC5D,IAAI,OAAO,CAAA,MAAA,IAAI,CAAC,CAAC,CAAC,0CAAE,GAAG,CAAA,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE;YAChE,QAAQ,IAAI,CAAC,CAAC;SACf;QACD,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC;IACF,OAAO,EAAE,QAAQ,EAAE,cAAM,OAAA,QAAQ,EAAR,CAAQ,EAAE,OAAO,EAAE,cAAM,OAAA,CAAC,IAAI,CAAC,mBAAmB,GAAG,QAAQ,CAAC,EAArC,CAAqC,EAAE,CAAC;AAC5F,CAAC,CAAC;AAEF,QAAQ,CAAC,sEAAsE,EAAE;IAC/E,IAAM,SAAS,GAAG,IAAA,mCAAgB,EAAC,aAAa,CAAC,CAAC;IAClD,IAAM,EAAE,GAAG,IAAI,OAAE,CAAC,aAAa,EAAE,QAAQ,EAAE,IAAI,2CAAkB,EAAE,CAAC,CAAC;IAErE,SAAS,CAAC;;;;oBACR,IAAA,uBAAgB,GAAE,CAAC;oBACnB,8EAA8E;oBAC9E,kFAAkF;oBACjF,6BAAgB,CAAC,GAAG,EAA+D,CAAC,WAAW,CAC9F,qBAAqB,CACtB,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;oBAC/B,qBAAM,uDAA0B,CAAC,iBAAiB,CAAC,aAAa,CAAC,EAAA;;oBAAjE,SAAiE,CAAC;oBAClE,qBAAM,aAAa,CAAC,mBAAmB,EAAE,EAAA;;oBAAzC,SAAyC,CAAC;oBAC1C,qBAAM,aAAa,CAAC,eAAe,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,EAAA;;oBAA5D,SAA4D,CAAC;oBAC7D,qBAAM,aAAa,CAAC,eAAe,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,EAAA;;oBAA5D,SAA4D,CAAC;oBAC7D,kFAAkF;oBAClF,qBAAM,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAA;;oBAD/C,kFAAkF;oBAClF,SAA+C,CAAC;;;;SACjD,EAAE,KAAK,CAAC,CAAC;IAEV,QAAQ,CAAC;;;wBACP,qBAAM,SAAS,CAAC,WAAW,CAAC,EAAA;;oBAA5B,SAA4B,CAAC;oBAC7B,qBAAM,SAAS,CAAC,WAAW,CAAC,EAAA;;oBAA5B,SAA4B,CAAC;oBAC7B,qBAAM,uDAA0B,CAAC,OAAO,EAAE,EAAA;;oBAA1C,SAA0C,CAAC;oBAC3C,OAAQ,6BAAgB,CAAC,GAAG,EAA+D,CAAC,WAAW,CACrG,qBAAqB,CACtB,CAAC;oBACF,IAAA,oBAAa,GAAE,CAAC;;;;SACjB,EAAE,KAAK,CAAC,CAAC;IAEV,SAAS,CAAC;;;;;0BAEsC,EAA1B,MAAC,WAAW,EAAE,WAAW,CAAC;;;yBAA1B,CAAA,cAA0B,CAAA;oBAAnC,KAAK;oBACI,qBAAM,EAAE,CAAC,KAAK,CAAC,KAAmB,EAAE,EAAE,CAAC,EAAA;;oBAAnD,SAAS,GAAG,SAAuC;0BAC9B,EAAT,uBAAS;;;yBAAT,CAAA,uBAAS,CAAA;oBAAhB,GAAG;oBACZ,qBAAM,EAAE,CAAC,MAAM,CAAC,KAAmB,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAS,CAAC,EAAA;;oBAA3D,SAA2D,CAAC;;;oBAD5C,IAAS,CAAA;;;oBAFT,IAA0B,CAAA;;;;;SAM/C,EAAE,KAAK,CAAC,CAAC;IAEV,IAAI,CAAC,6IAA6I,EAAE;;;;wBACrI,qBAAM,cAAc,EAAE,EAAA;;oBAA7B,IAAI,GAAG,SAAsB;oBAC7B,cAAc,GAAG,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,EAAE,mBAAmB,CAAC,CAAC;oBAClF,UAAU,GAAG,cAAc,CAAC,IAAI,EAAE,iBAAiB,EAAE,mBAAmB,CAAC,CAAC;;;;oBAGpE,qBAAM,EAAE;6BACf,cAAc,CAAC;;;;oCACd,kFAAkF;oCAClF,uFAAuF;oCACvF,iFAAiF;oCACjF,gFAAgF;oCAChF,qFAAqF;oCACrF,qBAAM,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAA;;wCALtD,kFAAkF;wCAClF,uFAAuF;wCACvF,iFAAiF;wCACjF,gFAAgF;wCAChF,qFAAqF;wCACrF,SAAsD,CAAC;wCACvD,qBAAM,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAA;;wCAAtD,SAAsD,CAAC;;;;6BACxD,CAAC;6BACD,IAAI,CAAC,cAAM,OAAA,UAAmB,EAAnB,CAAmB,CAAC;6BAC/B,KAAK,CAAC,UAAC,KAAY,IAAK,OAAA,KAAK,EAAL,CAAK,CAAC,EAAA;;oBAXjC,OAAO,GAAG,SAWuB,CAAC;;;oBAElC,cAAc,CAAC,OAAO,EAAE,CAAC;oBACzB,UAAU,CAAC,OAAO,EAAE,CAAC;;;oBAGvB,8FAA8F;oBAC9F,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;oBACtC,MAAM,CAAC,MAAM,CAAE,OAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;oBACpE,MAAM,CAAE,OAAe,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAC1C,uEAAuE;oBACvE,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClE,4CAA4C;oBAC5C,KAAA,MAAM,CAAA;oBAAC,qBAAM,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAA;;oBAD5D,4CAA4C;oBAC5C,kBAAO,SAAqD,EAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;oBAC9E,KAAA,MAAM,CAAA;oBAAC,qBAAM,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAA;;oBAA5D,kBAAO,SAAqD,EAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;;;;SAC/E,EAAE,KAAK,CAAC,CAAC;IAEV,IAAI,CAAC,oIAAoI,EAAE;;;;wBAC5H,qBAAM,cAAc,EAAE,EAAA;;oBAA7B,IAAI,GAAG,SAAsB;oBAC7B,cAAc,GAAG,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;oBAC/E,UAAU,GAAG,cAAc,CAAC,IAAI,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;;;;oBAGjE,qBAAM,EAAE;6BACf,MAAM,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;6BAC7C,IAAI,CAAC,cAAM,OAAA,UAAmB,EAAnB,CAAmB,CAAC;6BAC/B,KAAK,CAAC,UAAC,KAAY,IAAK,OAAA,KAAK,EAAL,CAAK,CAAC,EAAA;;oBAHjC,OAAO,GAAG,SAGuB,CAAC;;;oBAElC,cAAc,CAAC,OAAO,EAAE,CAAC;oBACzB,UAAU,CAAC,OAAO,EAAE,CAAC;;;oBAGvB,0FAA0F;oBAC1F,+EAA+E;oBAC/E,MAAM,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;oBACtC,MAAM,CAAC,MAAM,CAAE,OAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;oBACpE,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,GAAG,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClE,KAAA,MAAM,CAAA;oBAAC,qBAAM,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAA;;oBAA5D,kBAAO,SAAqD,EAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;;;;SAC/E,EAAE,KAAK,CAAC,CAAC;IAEV,IAAI,CAAC,6GAA6G,EAAE;;;;wBACrG,qBAAM,cAAc,EAAE,EAAA;;oBAA7B,IAAI,GAAG,SAAsB;oBAC7B,cAAc,GAAG,UAAC,GAAW;wBACjC,OAAA,GAAG,CAAC,QAAQ,CAAC,4BAA4B,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;oBAA9E,CAA8E,CAAC;oBAC3E,gBAAgB,GAAG,wBAAwB,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;;;;oBAErD,qBAAM,EAAE,CAAC,cAAc,CAAC;;;4CACvC,qBAAM,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAA;;wCAAtD,SAAsD,CAAC;wCAChD,qBAAM,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAA;4CAA7D,sBAAO,SAAsD,EAAC;;;6BAC/D,CAAC,EAAA;;oBAHI,QAAQ,GAAG,SAGf;oBAEgB,qBAAM,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAA;;oBAAjE,SAAS,GAAG,SAAqD;oBACvE,MAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;oBAClC,qDAAqD;oBACrD,KAAA,MAAM,CAAA;oBAAC,qBAAM,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,sBAAsB,EAAE,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,EAAA;;oBAD1F,qDAAqD;oBACrD,kBAAO,SAAmF,EAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBACpG,KAAA,MAAM,CAAA;oBAAC,qBAAM,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,EAAA;;oBAAxD,kBAAO,SAAiD,EAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClE,kFAAkF;oBAClF,8CAA8C;oBAC9C,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;;oBAE5C,gBAAgB,CAAC,OAAO,EAAE,CAAC;;;;;SAE9B,EAAE,KAAK,CAAC,CAAC;AACZ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import '../generated/test/index';
2
+ //# sourceMappingURL=RecordIterator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecordIterator.test.d.ts","sourceRoot":"","sources":["../../test/RecordIterator.test.ts"],"names":[],"mappings":"AAIA,OAAO,yBAAyB,CAAC"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var test_1 = require("@proteinjs/db/test");
4
+ var db_driver_spanner_1 = require("@proteinjs/db-driver-spanner");
5
+ var getDropTestTable_1 = require("./util/getDropTestTable");
6
+ var db_transaction_context_1 = require("@proteinjs/db-transaction-context");
7
+ require("../generated/test/index");
8
+ var spannerDriver = new db_driver_spanner_1.SpannerDriver({
9
+ projectId: 'proteinjs-test',
10
+ instanceName: 'proteinjs-test',
11
+ databaseName: 'test',
12
+ });
13
+ describe('RecordIterator cursor-window tests', (0, test_1.recordIteratorTests)(spannerDriver, new db_transaction_context_1.TransactionContext(), (0, getDropTestTable_1.getDropTestTable)(spannerDriver)));
14
+ //# sourceMappingURL=RecordIterator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecordIterator.test.js","sourceRoot":"","sources":["../../test/RecordIterator.test.ts"],"names":[],"mappings":";;AAAA,2CAAyD;AACzD,kEAA6D;AAC7D,4DAA2D;AAC3D,4EAAuE;AACvE,mCAAiC;AAEjC,IAAM,aAAa,GAAG,IAAI,iCAAa,CAAC;IACtC,SAAS,EAAE,gBAAgB;IAC3B,YAAY,EAAE,gBAAgB;IAC9B,YAAY,EAAE,MAAM;CACrB,CAAC,CAAC;AAEH,QAAQ,CACN,oCAAoC,EACpC,IAAA,0BAAmB,EAAC,aAAa,EAAE,IAAI,2CAAkB,EAAE,EAAE,IAAA,mCAAgB,EAAC,aAAa,CAAC,CAAC,CAC9F,CAAC"}
@@ -0,0 +1,2 @@
1
+ import '../generated/test/index';
2
+ //# sourceMappingURL=RunPendingMigrations.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunPendingMigrations.test.d.ts","sourceRoot":"","sources":["../../test/RunPendingMigrations.test.ts"],"names":[],"mappings":"AAMA,OAAO,yBAAyB,CAAC"}