Skip to content

Commit b05c4ac

Browse files
committed
Disable RETURNING for BATCH operations
1 parent 472de7f commit b05c4ac

File tree

3 files changed

+40
-4
lines changed

3 files changed

+40
-4
lines changed

yql/essentials/sql/v1/sql_query.cpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3506,13 +3506,19 @@ TNodePtr TSqlQuery::Build(const TRule_delete_stmt& stmt) {
35063506
TSourcePtr source = BuildTableSource(Ctx.Pos(), table);
35073507

35083508
TNodePtr options = nullptr;
3509+
const bool isBatch = stmt.HasBlock1();
3510+
35093511
if (stmt.HasBlock6()) {
3512+
if (isBatch) {
3513+
Ctx.Error(GetPos(stmt.GetToken2()))
3514+
<< "BATCH DELETE is unsupported with RETURNING";
3515+
return nullptr;
3516+
}
3517+
35103518
options = ReturningList(stmt.GetBlock6().GetRule_returning_columns_list1());
35113519
options = options->Y(options);
35123520
}
35133521

3514-
const bool isBatch = stmt.HasBlock1();
3515-
35163522
if (stmt.HasBlock5()) {
35173523
switch (stmt.GetBlock5().Alt_case()) {
35183524
case TRule_delete_stmt_TBlock5::kAlt1: {
@@ -3569,14 +3575,20 @@ TNodePtr TSqlQuery::Build(const TRule_update_stmt& stmt) {
35693575
return nullptr;
35703576
}
35713577

3578+
const bool isBatch = stmt.HasBlock1();
35723579
TNodePtr options = nullptr;
3580+
35733581
if (stmt.HasBlock5()) {
3582+
if (isBatch) {
3583+
Ctx.Error(GetPos(stmt.GetToken2()))
3584+
<< "BATCH UPDATE is unsupported with RETURNING";
3585+
return nullptr;
3586+
}
3587+
35743588
options = ReturningList(stmt.GetBlock5().GetRule_returning_columns_list1());
35753589
options = options->Y(options);
35763590
}
35773591

3578-
const bool isBatch = stmt.HasBlock1();
3579-
35803592
switch (stmt.GetBlock4().Alt_case()) {
35813593
case TRule_update_stmt_TBlock4::kAlt1: {
35823594
const auto& alt = stmt.GetBlock4().GetAlt1();

yql/essentials/sql/v1/sql_ut.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1257,6 +1257,12 @@ Y_UNIT_TEST_SUITE(SqlParsingOnly) {
12571257
UNIT_ASSERT_VALUES_EQUAL(1, elementStat["Write"]);
12581258
}
12591259

1260+
Y_UNIT_TEST(DeleteFromTableBatchReturning) {
1261+
NYql::TAstParseResult res = SqlToYql("batch delete from plato.Input returning *;", 10, "kikimr");
1262+
UNIT_ASSERT(!res.Root);
1263+
UNIT_ASSERT_NO_DIFF(Err2Str(res), "<main>:1:6: Error: BATCH DELETE is unsupported with RETURNING\n");
1264+
}
1265+
12601266
Y_UNIT_TEST(DeleteFromTableOnValues) {
12611267
NYql::TAstParseResult res = SqlToYql("delete from plato.Input on (key) values (1);",
12621268
10, "kikimr");
@@ -1341,6 +1347,12 @@ Y_UNIT_TEST_SUITE(SqlParsingOnly) {
13411347
UNIT_ASSERT_VALUES_EQUAL(1, elementStat["Write"]);
13421348
}
13431349

1350+
Y_UNIT_TEST(UpdateByValuesBatchReturning) {
1351+
NYql::TAstParseResult res = SqlToYql("batch update plato.Input set value = 'cool' where key = 200 returning key;", 10, "kikimr");
1352+
UNIT_ASSERT(!res.Root);
1353+
UNIT_ASSERT_NO_DIFF(Err2Str(res), "<main>:1:6: Error: BATCH UPDATE is unsupported with RETURNING\n");
1354+
}
1355+
13441356
Y_UNIT_TEST(UpdateByMultiValues) {
13451357
NYql::TAstParseResult res = SqlToYql("update plato.Input set (key, value, subkey) = ('2','ddd',':') where key = 200;", 10, "kikimr");
13461358
UNIT_ASSERT(res.Root);

yql/essentials/sql/v1/sql_ut_antlr4.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1499,6 +1499,12 @@ Y_UNIT_TEST_SUITE(SqlParsingOnly) {
14991499
UNIT_ASSERT_VALUES_EQUAL(1, elementStat["Write"]);
15001500
}
15011501

1502+
Y_UNIT_TEST(DeleteFromTableBatchReturning) {
1503+
NYql::TAstParseResult res = SqlToYql("batch delete from plato.Input returning *;", 10, "kikimr");
1504+
UNIT_ASSERT(!res.Root);
1505+
UNIT_ASSERT_NO_DIFF(Err2Str(res), "<main>:1:6: Error: BATCH DELETE is unsupported with RETURNING\n");
1506+
}
1507+
15021508
Y_UNIT_TEST(DeleteFromTableOnValues) {
15031509
NYql::TAstParseResult res = SqlToYql("delete from plato.Input on (key) values (1);",
15041510
10, "kikimr");
@@ -1583,6 +1589,12 @@ Y_UNIT_TEST_SUITE(SqlParsingOnly) {
15831589
UNIT_ASSERT_VALUES_EQUAL(1, elementStat["Write"]);
15841590
}
15851591

1592+
Y_UNIT_TEST(UpdateByValuesBatchReturning) {
1593+
NYql::TAstParseResult res = SqlToYql("batch update plato.Input set value = 'cool' where key = 200 returning key;", 10, "kikimr");
1594+
UNIT_ASSERT(!res.Root);
1595+
UNIT_ASSERT_NO_DIFF(Err2Str(res), "<main>:1:6: Error: BATCH UPDATE is unsupported with RETURNING\n");
1596+
}
1597+
15861598
Y_UNIT_TEST(UpdateByMultiValues) {
15871599
NYql::TAstParseResult res = SqlToYql("update plato.Input set (key, value, subkey) = ('2','ddd',':') where key = 200;", 10, "kikimr");
15881600
UNIT_ASSERT(res.Root);

0 commit comments

Comments
 (0)