summaryrefslogtreecommitdiffstats
path: root/yql/essentials/sql/v1/sql_ut_common.h
diff options
context:
space:
mode:
authorvitya-smirnov <[email protected]>2025-10-01 20:51:41 +0300
committervitya-smirnov <[email protected]>2025-10-01 21:25:50 +0300
commitf3f7b33a285e94cb3e27aaa4d9b23b543ece4106 (patch)
tree89740eeddb803123f1ed3d6b6f7be2bcd865f68c /yql/essentials/sql/v1/sql_ut_common.h
parent5cfb01d33937d2b2e038abf3b50e04136dcf7496 (diff)
YQL-20307: Support inline subqueries
- Alter grammar to support inline subqueries. - Support inline subqueries in `sql/v1` (translator). - Introduce `sql/v1/proto_ast/parse_tree.h` for reusable parse tree predicates. - Support inline subqueries in `sql/v1/format`. - Support inline subqueries in `sql/v1/complete`. - Add some SQL-tests. - Pass all tests. commit_hash:075b2240778d071e1c7542f912d3cc83019ef849
Diffstat (limited to 'yql/essentials/sql/v1/sql_ut_common.h')
-rw-r--r--yql/essentials/sql/v1/sql_ut_common.h237
1 files changed, 236 insertions, 1 deletions
diff --git a/yql/essentials/sql/v1/sql_ut_common.h b/yql/essentials/sql/v1/sql_ut_common.h
index 3837b892464..d6d86e9954b 100644
--- a/yql/essentials/sql/v1/sql_ut_common.h
+++ b/yql/essentials/sql/v1/sql_ut_common.h
@@ -2516,7 +2516,7 @@ Y_UNIT_TEST_SUITE(SqlParsingOnly) {
SELECT * FROM $squ2;
SELECT * FROM $squ3;
)");
- UNIT_ASSERT(res.Root);
+ UNIT_ASSERT_C(res.IsOk(), res.Issues.ToOneLineString());
}
Y_UNIT_TEST(SubqueriesJoin) {
@@ -10525,3 +10525,238 @@ return /*Комментарий*/ $x;
UNIT_ASSERT_VALUES_EQUAL(0, NSQLTranslationV1::GetQueryPosition(query, tokenProto, antlr4));
}
}
+
+Y_UNIT_TEST_SUITE(InlineUncorrelatedSubquery) {
+ Y_UNIT_TEST(EmptyTuple) {
+ NYql::TAstParseResult res = SqlToYql(R"sql(
+ SELECT ();
+ SELECT (());
+ SELECT (,);
+ )sql");
+ UNIT_ASSERT_C(res.IsOk(), res.Issues.ToOneLineString());
+ }
+
+ Y_UNIT_TEST(ParenthesisedExpression) {
+ NYql::TAstParseResult res = SqlToYql(R"sql(
+ SELECT 1;
+ SELECT (1);
+ SELECT ((1));
+ SELECT (((1)));
+ )sql");
+ UNIT_ASSERT_C(res.IsOk(), res.Issues.ToOneLineString());
+ }
+
+ Y_UNIT_TEST(Tuple) {
+ NYql::TAstParseResult res = SqlToYql(R"sql(
+ SELECT (1,);
+ SELECT (1, 2);
+ SELECT (1, 2, 3);
+ SELECT (1, 2, 3, 4);
+ SELECT ((1, 2));
+ )sql");
+ UNIT_ASSERT_C(res.IsOk(), res.Issues.ToOneLineString());
+ }
+
+ Y_UNIT_TEST(Struct) {
+ NYql::TAstParseResult res = SqlToYql(R"sql(
+ SELECT (1 AS a);
+ SELECT (1 AS a, 2 AS b);
+ SELECT (1 AS a, 2 AS b, 3 AS c);
+ )sql");
+ UNIT_ASSERT_C(res.IsOk(), res.Issues.ToOneLineString());
+ }
+
+ Y_UNIT_TEST(Lambda) {
+ NYql::TAstParseResult res = SqlToYql(R"sql(
+ SELECT (($a) -> { RETURN $a; })(1);
+ SELECT (($a, $b) -> { RETURN $a + $b; })(1, 2);
+ SELECT (($a, $b, $c) -> { RETURN $a + $b + $c; })(1, 2, 3);
+ )sql");
+ UNIT_ASSERT_C(res.IsOk(), res.Issues.ToOneLineString());
+ }
+
+ Y_UNIT_TEST(AtProjection) {
+ NSQLTranslation::TTranslationSettings settings;
+ settings.LangVer = NYql::MakeLangVersion(2025, 4);
+
+ NYql::TAstParseResult res = SqlToYqlWithSettings(R"sql(
+ SELECT (SELECT 1);
+ SELECT (SELECT (SELECT 1));
+ )sql", settings);
+ UNIT_ASSERT_C(res.IsOk(), res.Issues.ToOneLineString());
+ }
+
+ Y_UNIT_TEST(AtExpression) {
+ NSQLTranslation::TTranslationSettings settings;
+ settings.LangVer = NYql::MakeLangVersion(2025, 4);
+
+ NYql::TAstParseResult res = SqlToYqlWithSettings(R"sql(
+ SELECT 1 + (SELECT 1);
+ SELECT (SELECT 1) + 1;
+ )sql", settings);
+ UNIT_ASSERT_C(res.IsOk(), res.Issues.ToOneLineString());
+ }
+
+ Y_UNIT_TEST(UnionParenthesis) {
+ NSQLTranslation::TTranslationSettings settings;
+ settings.LangVer = NYql::MakeLangVersion(2025, 4);
+
+ NYql::TAstParseResult res = SqlToYqlWithSettings(R"sql(
+ SELECT ( SELECT 1 UNION SELECT 1);
+ SELECT ( SELECT 1 UNION (SELECT 1));
+ SELECT ((SELECT 1) UNION SELECT 1);
+ SELECT ((SELECT 1) UNION (SELECT 1));
+ )sql", settings);
+ UNIT_ASSERT_C(res.IsOk(), res.Issues.ToOneLineString());
+ }
+
+ Y_UNIT_TEST(IntersectParenthesis) {
+ NSQLTranslation::TTranslationSettings settings;
+ settings.LangVer = NYql::MakeLangVersion(2025, 4);
+
+ NYql::TAstParseResult res = SqlToYqlWithSettings(R"sql(
+ SELECT ( SELECT 1 INTERSECT SELECT 1);
+ SELECT ( SELECT 1 INTERSECT (SELECT 1));
+ SELECT ((SELECT 1) INTERSECT SELECT 1);
+ SELECT ((SELECT 1) INTERSECT (SELECT 1));
+ )sql", settings);
+ UNIT_ASSERT_C(res.IsOk(), res.Issues.ToOneLineString());
+ }
+
+ Y_UNIT_TEST(UnionIntersect) {
+ NSQLTranslation::TTranslationSettings settings;
+ settings.LangVer = NYql::MakeLangVersion(2025, 4);
+
+ NYql::TAstParseResult res = SqlToYqlWithSettings(R"sql(
+ SELECT (SELECT 1 UNION SELECT 1 UNION SELECT 1);
+ SELECT (SELECT 1 UNION SELECT 1 INTERSECT SELECT 1);
+ SELECT (SELECT 1 INTERSECT SELECT 1 UNION SELECT 1);
+ SELECT (SELECT 1 INTERSECT SELECT 1 INTERSECT SELECT 1);
+ )sql", settings);
+ UNIT_ASSERT_C(res.IsOk(), res.Issues.ToOneLineString());
+ }
+
+ Y_UNIT_TEST(ScalarExpressionUnion) {
+ NSQLTranslation::TTranslationSettings settings;
+ settings.LangVer = NYql::MakeLangVersion(2025, 4);
+
+ NYql::TAstParseResult res = SqlToYqlWithSettings(R"sql(
+ SELECT ((2 + 2) UNION (2 * 2));
+ )sql", settings);
+ UNIT_ASSERT(!res.IsOk());
+ UNIT_ASSERT_STRING_CONTAINS(
+ res.Issues.ToOneLineString(),
+ "2:24: Error: Expected SELECT/PROCESS/REDUCE statement");
+ }
+
+ Y_UNIT_TEST(OrderByIgnorance1) {
+ NSQLTranslation::TTranslationSettings settings;
+ settings.LangVer = NYql::MakeLangVersion(2025, 4);
+
+ NYql::TAstParseResult res = SqlToYqlWithSettings(R"sql(
+ SELECT (SELECT * FROM (SELECT * FROM (SELECT 1 AS x UNION SELECT 2 AS x) ORDER BY x));
+
+ )sql", settings);
+ UNIT_ASSERT_C(res.IsOk(), res.Issues.ToOneLineString());
+ UNIT_ASSERT_STRING_CONTAINS(
+ res.Issues.ToOneLineString(),
+ "ORDER BY without LIMIT in subquery will be ignored");
+
+ TWordCountHive stat = {{TString("Sort"), 0}};
+ VerifyProgram(res, stat);
+ UNIT_ASSERT_VALUES_EQUAL(stat["Sort"], 0);
+ }
+
+ Y_UNIT_TEST(OrderByIgnorance2) {
+ NSQLTranslation::TTranslationSettings settings;
+ settings.LangVer = NYql::MakeLangVersion(2025, 4);
+
+ NYql::TAstParseResult res = SqlToYqlWithSettings(R"sql(
+ SELECT (SELECT * FROM (SELECT 1 AS x UNION SELECT 2 AS x) ORDER BY x);
+ )sql", settings);
+ UNIT_ASSERT_C(res.IsOk(), res.Issues.ToOneLineString());
+ UNIT_ASSERT_STRING_CONTAINS(
+ res.Issues.ToOneLineString(),
+ "ORDER BY without LIMIT in subquery will be ignored");
+
+ TWordCountHive stat = {{TString("Sort"), 0}};
+ VerifyProgram(res, stat);
+ UNIT_ASSERT_VALUES_EQUAL(stat["Sort"], 0);
+ }
+
+ Y_UNIT_TEST(InSubquery) {
+ NYql::TAstParseResult res;
+
+ res = SqlToYql(R"sql(
+ SELECT 1 IN (SELECT 1);
+ )sql");
+ UNIT_ASSERT_C(res.IsOk(), res.Issues.ToOneLineString());
+
+ res = SqlToYql(R"sql(
+ SELECT * FROM (SELECT 1 AS x) WHERE x IN (SELECT 1);
+ )sql");
+ UNIT_ASSERT_C(res.IsOk(), res.Issues.ToOneLineString());
+
+ res = SqlToYql(R"sql(
+ SELECT * FROM (SELECT 1 AS x) WHERE x IN ((SELECT 1));
+ )sql");
+ UNIT_ASSERT_C(res.IsOk(), res.Issues.ToOneLineString());
+ }
+
+ Y_UNIT_TEST(GroupByUnit) {
+ NYql::TAstParseResult res = SqlToYql(R"sql(
+ SELECT * FROM (SELECT 1) GROUP BY ();
+ )sql");
+ UNIT_ASSERT_C(res.IsOk(), res.Issues.ToOneLineString());
+ }
+
+ Y_UNIT_TEST(NamedNodeUnion) {
+ NYql::TAstParseResult res = SqlToYql(R"sql(
+ $a = (SELECT 1);
+ $b = (SELECT 1);
+ $x = ($a UNION $b);
+ SELECT * FROM $x;
+ )sql");
+ UNIT_ASSERT_C(res.IsOk(), res.Issues.ToOneLineString());
+ }
+
+ Y_UNIT_TEST(NamedNodeExpr) {
+ NYql::TAstParseResult res = SqlToYql(R"sql(
+ $a = 1; SELECT $a;
+ $b = SELECT 1; SELECT $b;
+ $c = (SELECT 1); SELECT $c;
+ $d = ((SELECT 1)); SELECT $d;
+ SELECT $b + 1;
+ SELECT ($b);
+ )sql");
+ UNIT_ASSERT_C(res.IsOk(), res.Issues.ToString());
+ }
+
+ Y_UNIT_TEST(NamedNodeProcess) {
+ NYql::TAstParseResult res = SqlToYql(R"sql(
+ $a = SELECT 1, 2;
+ $a = PROCESS $a;
+ SELECT $a;
+ )sql");
+ UNIT_ASSERT_C(res.IsOk(), res.Issues.ToString());
+ }
+
+ Y_UNIT_TEST(SubqueryDeduplication) {
+ NYql::TAstParseResult res = SqlToYql(R"sql(
+ DEFINE SUBQUERY $sub() AS
+ SELECT * FROM (SELECT 1);
+ END DEFINE;
+ SELECT * FROM $sub();
+ )sql");
+ UNIT_ASSERT_C(res.IsOk(), res.Issues.ToOneLineString());
+ }
+
+ Y_UNIT_TEST(NamedNode) {
+ NYql::TAstParseResult res = SqlToYql(R"sql(
+ $x = (SELECT 1 AS x);
+ SELECT 1 < $x;
+ SELECT 1 < ($x);
+ )sql");
+ UNIT_ASSERT_C(res.IsOk(), res.Issues.ToOneLineString());
+ }
+}