@@ -241,6 +241,206 @@ Y_UNIT_TEST(ReturningSerial) {
241
241
}
242
242
}
243
243
244
+ TString ExecuteReturningQuery (TKikimrRunner& kikimr, bool queryService, TString query) {
245
+ if (queryService) {
246
+ auto qdb = kikimr.GetQueryClient ();
247
+ auto qSession = qdb.GetSession ().GetValueSync ().GetSession ();
248
+ auto result = qSession.ExecuteQuery (
249
+ query, NYdb::NQuery::TTxControl::BeginTx ().CommitTx ()).ExtractValueSync ();
250
+ UNIT_ASSERT_VALUES_EQUAL_C (result.GetStatus (), EStatus::SUCCESS, result.GetIssues ().ToString ());
251
+ return FormatResultSetYson (result.GetResultSet (0 ));
252
+ }
253
+
254
+ auto db = kikimr.GetTableClient ();
255
+ auto session = db.CreateSession ().GetValueSync ().GetSession ();
256
+ auto result = session.ExecuteDataQuery (query, TTxControl::BeginTx ().CommitTx ()).ExtractValueSync ();
257
+ UNIT_ASSERT_VALUES_EQUAL_C (result.GetStatus (), EStatus::SUCCESS, result.GetIssues ().ToString ());
258
+ return FormatResultSetYson (result.GetResultSet (0 ));
259
+ }
260
+
261
+ Y_UNIT_TEST_TWIN (ReturningWorks, QueryService) {
262
+ auto kikimr = DefaultKikimrRunner ();
263
+ auto db = kikimr.GetTableClient ();
264
+ auto session = db.CreateSession ().GetValueSync ().GetSession ();
265
+ CreateSampleTablesWithIndex (session, true );
266
+ CompareYson (
267
+ R"( [[[101];[101];["Payload1"]];])" ,
268
+ ExecuteReturningQuery (kikimr, QueryService, R"(
269
+ UPSERT INTO `/Root/SecondaryKeys` (Key, Fk, Value) VALUES (101, 101, "Payload1") RETURNING *;
270
+ )" )
271
+ );
272
+ CompareYson (
273
+ R"(
274
+ [[#;#;["Payload8"]];
275
+ [[1];[1];["Payload1"]];
276
+ [[2];[2];["Payload2"]];
277
+ [[5];[5];["Payload5"]];
278
+ [#;[7];["Payload7"]];
279
+ [[101];[101];["Payload1"]]
280
+ ])" ,
281
+ ExecuteReturningQuery (kikimr, QueryService, " SELECT * FROM `/Root/SecondaryKeys` ORDER BY Key, Fk;" )
282
+ );
283
+ }
284
+
285
+ Y_UNIT_TEST_TWIN (ReturningWorksIndexedUpsert, QueryService) {
286
+ auto kikimr = DefaultKikimrRunner ();
287
+ auto db = kikimr.GetTableClient ();
288
+ auto session = db.CreateSession ().GetValueSync ().GetSession ();
289
+ CreateSampleTablesWithIndex (session, true );
290
+ CompareYson (R"( [
291
+ [[110];[110];["Payload5"]];
292
+ ])" , ExecuteReturningQuery (kikimr, QueryService, R"(
293
+ $v1 = (SELECT Key + 100 as Key, Fk + 100 as Fk, Value FROM `/Root/SecondaryKeys` WHERE Key IS NOT NULL AND Fk IS NOT NULL);
294
+ $v2 = (SELECT Key + 105 as Key, Fk + 105 as Fk, Value FROM `/Root/SecondaryKeys` WHERE Key IS NOT NULL AND Fk IS NOT NULL);
295
+ UPSERT INTO `/Root/SecondaryKeys`
296
+ SELECT * FROM (SELECT * FROM $v1 UNION ALL SELECT * FROM $v2) WHERE Key > 107 RETURNING *;
297
+ )" ));
298
+ CompareYson (
299
+ R"(
300
+ [[#;#;["Payload8"]];
301
+ [[1];[1];["Payload1"]];
302
+ [[2];[2];["Payload2"]];
303
+ [[5];[5];["Payload5"]];
304
+ [#;[7];["Payload7"]];
305
+ [[110];[110];["Payload5"]]
306
+ ])" ,
307
+ ExecuteReturningQuery (kikimr, QueryService, " SELECT * FROM `/Root/SecondaryKeys` ORDER BY Key, Fk;" )
308
+ );
309
+ }
310
+
311
+ Y_UNIT_TEST_TWIN (ReturningWorksIndexedDelete, QueryService) {
312
+ auto kikimr = DefaultKikimrRunner ();
313
+ auto db = kikimr.GetTableClient ();
314
+ auto session = db.CreateSession ().GetValueSync ().GetSession ();
315
+ CreateSampleTablesWithIndex (session, true );
316
+ CompareYson (R"( [
317
+ [[5];[5];["Payload5"]];
318
+ ])" , ExecuteReturningQuery (kikimr, QueryService, R"(
319
+ $v1 = (SELECT Key, Fk, Value FROM `/Root/SecondaryKeys` WHERE Key IS NOT NULL AND Fk IS NOT NULL AND Key >= 1);
320
+ $v2 = (SELECT Key, Fk, Value FROM `/Root/SecondaryKeys` WHERE Key IS NOT NULL AND Fk IS NOT NULL AND Key <= 5);
321
+ DELETE FROM `/Root/SecondaryKeys` ON
322
+ SELECT * FROM (SELECT * FROM $v1 UNION ALL SELECT * FROM $v2) WHERE Key >= 5 RETURNING *;
323
+ )" ));
324
+ CompareYson (
325
+ R"(
326
+ [[#;#;["Payload8"]];
327
+ [[1];[1];["Payload1"]];
328
+ [[2];[2];["Payload2"]];
329
+ [#;[7];["Payload7"]];
330
+ ])" ,
331
+ ExecuteReturningQuery (kikimr, QueryService, " SELECT * FROM `/Root/SecondaryKeys` ORDER BY Key, Fk;" )
332
+ );
333
+ }
334
+
335
+ Y_UNIT_TEST_TWIN (ReturningWorksIndexedDeleteV2, QueryService) {
336
+ auto kikimr = DefaultKikimrRunner ();
337
+ auto db = kikimr.GetTableClient ();
338
+ auto session = db.CreateSession ().GetValueSync ().GetSession ();
339
+ CreateSampleTablesWithIndex (session, true );
340
+ CompareYson (R"( [
341
+ [[1];[1];["Payload1"]];
342
+ ])" , ExecuteReturningQuery (kikimr, QueryService, R"(
343
+ DELETE FROM `/Root/SecondaryKeys` WHERE Key = 1 RETURNING *;
344
+ )" ));
345
+ CompareYson (
346
+ R"(
347
+ [[#;#;["Payload8"]];
348
+ [[2];[2];["Payload2"]];
349
+ [[5];[5];["Payload5"]];
350
+ [#;[7];["Payload7"]];
351
+ ])" ,
352
+ ExecuteReturningQuery (kikimr, QueryService, " SELECT * FROM `/Root/SecondaryKeys` ORDER BY Key, Fk;" )
353
+ );
354
+ }
355
+
356
+
357
+ Y_UNIT_TEST_TWIN (ReturningWorksIndexedInsert, QueryService) {
358
+ auto kikimr = DefaultKikimrRunner ();
359
+ auto db = kikimr.GetTableClient ();
360
+ auto session = db.CreateSession ().GetValueSync ().GetSession ();
361
+ CreateSampleTablesWithIndex (session, true );
362
+
363
+ CompareYson (R"( [
364
+ [[101];[101];["Payload1"]];
365
+ ])" , ExecuteReturningQuery (kikimr, QueryService, R"(
366
+ $v1 = (SELECT Key + 100 as Key, Fk + 100 as Fk, Value FROM `/Root/SecondaryKeys` WHERE Key IS NOT NULL AND Fk IS NOT NULL);
367
+ $v2 = (SELECT Key + 205 as Key, Fk + 205 as Fk, Value FROM `/Root/SecondaryKeys` WHERE Key IS NOT NULL AND Fk IS NOT NULL);
368
+ INSERT INTO `/Root/SecondaryKeys`
369
+ SELECT * FROM (SELECT * FROM $v1 UNION ALL SELECT * FROM $v2 ) WHERE Key < 102 RETURNING *;
370
+ )" ));
371
+
372
+ CompareYson (
373
+ R"(
374
+ [[#;#;["Payload8"]];
375
+ [[1];[1];["Payload1"]];
376
+ [[2];[2];["Payload2"]];
377
+ [[5];[5];["Payload5"]];
378
+ [#;[7];["Payload7"]];
379
+ [[101];[101];["Payload1"]]
380
+ ])" ,
381
+ ExecuteReturningQuery (kikimr, QueryService, " SELECT * FROM `/Root/SecondaryKeys` ORDER BY Key, Fk;" )
382
+ );
383
+ }
384
+
385
+ Y_UNIT_TEST_TWIN (ReturningWorksIndexedReplace, QueryService) {
386
+ auto kikimr = DefaultKikimrRunner ();
387
+ auto db = kikimr.GetTableClient ();
388
+ auto session = db.CreateSession ().GetValueSync ().GetSession ();
389
+ CreateSampleTablesWithIndex (session, true );
390
+
391
+ CompareYson (R"( [
392
+ [[101];[101];["Payload1"]];
393
+ ])" , ExecuteReturningQuery (kikimr, QueryService, R"(
394
+ $v1 = (SELECT Key + 100 as Key, Fk + 100 as Fk, Value FROM `/Root/SecondaryKeys` WHERE Key IS NOT NULL AND Fk IS NOT NULL);
395
+ $v2 = (SELECT Key + 205 as Key, Fk + 205 as Fk, Value FROM `/Root/SecondaryKeys` WHERE Key IS NOT NULL AND Fk IS NOT NULL);
396
+ REPLACE INTO `/Root/SecondaryKeys`
397
+ SELECT * FROM (SELECT * FROM $v1 UNION ALL SELECT * FROM $v2 ) WHERE Key < 102 RETURNING *;
398
+ )" ));
399
+
400
+ CompareYson (
401
+ R"(
402
+ [[#;#;["Payload8"]];
403
+ [[1];[1];["Payload1"]];
404
+ [[2];[2];["Payload2"]];
405
+ [[5];[5];["Payload5"]];
406
+ [#;[7];["Payload7"]];
407
+ [[101];[101];["Payload1"]]
408
+ ])" ,
409
+ ExecuteReturningQuery (kikimr, QueryService, " SELECT * FROM `/Root/SecondaryKeys` ORDER BY Key, Fk;" )
410
+ );
411
+ }
412
+
413
+ Y_UNIT_TEST_TWIN (ReturningWorksIndexedOperationsWithDefault, QueryService) {
414
+ auto kikimr = DefaultKikimrRunner ();
415
+ auto db = kikimr.GetTableClient ();
416
+ auto session = db.CreateSession ().GetValueSync ().GetSession ();
417
+ {
418
+ auto res = session.ExecuteSchemeQuery (R"(
419
+ --!syntax_v1
420
+ CREATE TABLE `/Root/SecondaryKeys` (
421
+ Key Serial,
422
+ Fk Int32,
423
+ Value String,
424
+ PRIMARY KEY (Key),
425
+ INDEX Index GLOBAL ON (Fk)
426
+ );
427
+ )" ).GetValueSync ();
428
+ }
429
+
430
+ CompareYson (R"( [
431
+ [1;[1];["Payload"]];
432
+ ])" , ExecuteReturningQuery (kikimr, QueryService, R"(
433
+ REPLACE INTO `/Root/SecondaryKeys` (Fk, Value) VALUES (1, "Payload") RETURNING Key, Fk, Value;
434
+ )" ));
435
+
436
+ CompareYson (
437
+ R"( [
438
+ [1;[1];["Payload"]];
439
+ ])" ,
440
+ ExecuteReturningQuery (kikimr, QueryService, " SELECT Key, Fk, Value FROM `/Root/SecondaryKeys` ORDER BY Key, Fk;" )
441
+ );
442
+ }
443
+
244
444
Y_UNIT_TEST (ReturningColumnsOrder) {
245
445
auto kikimr = DefaultKikimrRunner ();
246
446
0 commit comments