@@ -241,6 +241,206 @@ Y_UNIT_TEST(ReturningSerial) {
241241 }
242242}
243243
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+
244444Y_UNIT_TEST (ReturningColumnsOrder) {
245445 auto kikimr = DefaultKikimrRunner ();
246446
0 commit comments