summaryrefslogtreecommitdiffstats
path: root/yql/essentials/sql
diff options
context:
space:
mode:
authorvitya-smirnov <[email protected]>2025-10-06 09:00:56 +0300
committervitya-smirnov <[email protected]>2025-10-06 09:18:09 +0300
commit96bddf8336a6ca765ee3141049197b8bff1810b5 (patch)
treeeec486eb50dbb0736245f9f4c12ca387162a3707 /yql/essentials/sql
parentff0062834bf261b420f838c43effdf5d49beafd5 (diff)
YQL-20116: Introduce ANTLR4 ambiguity detection
- Ignored 2 known ambiguities. - Tested tools. commit_hash:9e29bb2f876dabc68293b3e5c26a470d373506ae
Diffstat (limited to 'yql/essentials/sql')
-rw-r--r--yql/essentials/sql/v1/complete/analysis/yql/yql_ut.cpp2
-rw-r--r--yql/essentials/sql/v1/complete/check/check_complete_ut.cpp4
-rw-r--r--yql/essentials/sql/v1/proto_parser/antlr4/proto_parser.cpp34
-rw-r--r--yql/essentials/sql/v1/proto_parser/antlr4/proto_parser.h4
-rw-r--r--yql/essentials/sql/v1/proto_parser/antlr4_ansi/proto_parser.cpp34
-rw-r--r--yql/essentials/sql/v1/proto_parser/antlr4_ansi/proto_parser.h4
-rw-r--r--yql/essentials/sql/v1/sql.cpp1
7 files changed, 69 insertions, 14 deletions
diff --git a/yql/essentials/sql/v1/complete/analysis/yql/yql_ut.cpp b/yql/essentials/sql/v1/complete/analysis/yql/yql_ut.cpp
index 3d064e4673b..233086d9ee4 100644
--- a/yql/essentials/sql/v1/complete/analysis/yql/yql_ut.cpp
+++ b/yql/essentials/sql/v1/complete/analysis/yql/yql_ut.cpp
@@ -25,7 +25,7 @@ public:
Settings_.SyntaxVersion = 1;
Lexers_.Antlr4 = NSQLTranslationV1::MakeAntlr4LexerFactory();
- Parsers_.Antlr4 = NSQLTranslationV1::MakeAntlr4ParserFactory();
+ Parsers_.Antlr4 = NSQLTranslationV1::MakeAntlr4ParserFactory(/*isAmbiguityError=*/ true);
}
NYql::TAstParseResult Parse(const TString& query) {
diff --git a/yql/essentials/sql/v1/complete/check/check_complete_ut.cpp b/yql/essentials/sql/v1/complete/check/check_complete_ut.cpp
index 7743f574321..3b4f28e0fd6 100644
--- a/yql/essentials/sql/v1/complete/check/check_complete_ut.cpp
+++ b/yql/essentials/sql/v1/complete/check/check_complete_ut.cpp
@@ -24,8 +24,8 @@ Y_UNIT_TEST_SUITE(CheckTests) {
};
NSQLTranslationV1::TParsers parsers = {
- .Antlr4 = NSQLTranslationV1::MakeAntlr4ParserFactory(),
- .Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiParserFactory(),
+ .Antlr4 = NSQLTranslationV1::MakeAntlr4ParserFactory(/*isAmbiguityError=*/ true),
+ .Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiParserFactory(/*isAmbiguityError=*/ true),
};
NSQLTranslation::TTranslators translators(
diff --git a/yql/essentials/sql/v1/proto_parser/antlr4/proto_parser.cpp b/yql/essentials/sql/v1/proto_parser/antlr4/proto_parser.cpp
index 33ec032f6cf..6cdf0c6d2fb 100644
--- a/yql/essentials/sql/v1/proto_parser/antlr4/proto_parser.cpp
+++ b/yql/essentials/sql/v1/proto_parser/antlr4/proto_parser.cpp
@@ -10,26 +10,52 @@ namespace {
class TParser : public NSQLTranslation::IParser {
public:
+ explicit TParser(bool isAmbuguityError, bool isAmbiguityDebugging)
+ : IsAmbiguityError_(isAmbuguityError)
+ , IsAmbiguityDebugging_(isAmbiguityDebugging)
+ {
+ }
+
google::protobuf::Message* Parse(
const TString& query, const TString& queryName, NProtoAST::IErrorCollector& err,
google::protobuf::Arena* arena) final {
YQL_ENSURE(arena);
- NProtoAST::TProtoASTBuilder4<NALPDefaultAntlr4::SQLv1Antlr4Parser, NALPDefaultAntlr4::SQLv1Antlr4Lexer> builder(query, queryName, arena);
+ NProtoAST::TProtoASTBuilder4<
+ NALPDefaultAntlr4::SQLv1Antlr4Parser,
+ NALPDefaultAntlr4::SQLv1Antlr4Lexer>
+ builder(query, queryName, arena, IsAmbiguityError_, IsAmbiguityDebugging_);
return builder.BuildAST(err);
}
+
+private:
+ bool IsAmbiguityError_;
+ bool IsAmbiguityDebugging_;
};
class TFactory: public NSQLTranslation::IParserFactory {
public:
+ explicit TFactory(bool isAmbuguityError, bool isAmbiguityDebugging)
+ : IsAmbiguityError_(isAmbuguityError)
+ , IsAmbiguityDebugging_(isAmbiguityDebugging)
+ {
+ }
+
std::unique_ptr<NSQLTranslation::IParser> MakeParser() const final {
- return std::make_unique<TParser>();
+ return std::make_unique<TParser>(IsAmbiguityError_, IsAmbiguityDebugging_);
}
+
+private:
+ bool IsAmbiguityError_;
+ bool IsAmbiguityDebugging_;
};
}
-NSQLTranslation::TParserFactoryPtr MakeAntlr4ParserFactory() {
- return MakeIntrusive<TFactory>();
+NSQLTranslation::TParserFactoryPtr MakeAntlr4ParserFactory(
+ bool isAmbiguityError,
+ bool isAmbiguityDebugging)
+{
+ return MakeIntrusive<TFactory>(isAmbiguityError, isAmbiguityDebugging);
}
}
diff --git a/yql/essentials/sql/v1/proto_parser/antlr4/proto_parser.h b/yql/essentials/sql/v1/proto_parser/antlr4/proto_parser.h
index 5fcb4606736..5b33b43c0d3 100644
--- a/yql/essentials/sql/v1/proto_parser/antlr4/proto_parser.h
+++ b/yql/essentials/sql/v1/proto_parser/antlr4/proto_parser.h
@@ -3,6 +3,8 @@
namespace NSQLTranslationV1 {
-NSQLTranslation::TParserFactoryPtr MakeAntlr4ParserFactory();
+NSQLTranslation::TParserFactoryPtr MakeAntlr4ParserFactory(
+ bool isAmbiguityError = false,
+ bool isAmbiguityDebugging = false);
}
diff --git a/yql/essentials/sql/v1/proto_parser/antlr4_ansi/proto_parser.cpp b/yql/essentials/sql/v1/proto_parser/antlr4_ansi/proto_parser.cpp
index fdc0cf64704..bf0160ade02 100644
--- a/yql/essentials/sql/v1/proto_parser/antlr4_ansi/proto_parser.cpp
+++ b/yql/essentials/sql/v1/proto_parser/antlr4_ansi/proto_parser.cpp
@@ -10,26 +10,52 @@ namespace {
class TParser : public NSQLTranslation::IParser {
public:
+ explicit TParser(bool isAmbuguityError, bool isAmbiguityDebugging)
+ : IsAmbiguityError_(isAmbuguityError)
+ , IsAmbiguityDebugging_(isAmbiguityDebugging)
+ {
+ }
+
google::protobuf::Message* Parse(
const TString& query, const TString& queryName, NProtoAST::IErrorCollector& err,
google::protobuf::Arena* arena) final {
YQL_ENSURE(arena);
- NProtoAST::TProtoASTBuilder4<NALPAnsiAntlr4::SQLv1Antlr4Parser, NALPAnsiAntlr4::SQLv1Antlr4Lexer> builder(query, queryName, arena);
+ NProtoAST::TProtoASTBuilder4<
+ NALPAnsiAntlr4::SQLv1Antlr4Parser,
+ NALPAnsiAntlr4::SQLv1Antlr4Lexer>
+ builder(query, queryName, arena, IsAmbiguityError_, IsAmbiguityDebugging_);
return builder.BuildAST(err);
}
+
+private:
+ bool IsAmbiguityError_;
+ bool IsAmbiguityDebugging_;
};
class TFactory: public NSQLTranslation::IParserFactory {
public:
+ explicit TFactory(bool isAmbuguityError, bool isAmbiguityDebugging)
+ : IsAmbiguityError_(isAmbuguityError)
+ , IsAmbiguityDebugging_(isAmbiguityDebugging)
+ {
+ }
+
std::unique_ptr<NSQLTranslation::IParser> MakeParser() const final {
- return std::make_unique<TParser>();
+ return std::make_unique<TParser>(IsAmbiguityError_, IsAmbiguityDebugging_);
}
+
+private:
+ bool IsAmbiguityError_;
+ bool IsAmbiguityDebugging_;
};
}
-NSQLTranslation::TParserFactoryPtr MakeAntlr4AnsiParserFactory() {
- return MakeIntrusive<TFactory>();
+NSQLTranslation::TParserFactoryPtr MakeAntlr4AnsiParserFactory(
+ bool isAmbiguityError,
+ bool isAmbiguityDebugging)
+{
+ return MakeIntrusive<TFactory>(isAmbiguityError, isAmbiguityDebugging);
}
}
diff --git a/yql/essentials/sql/v1/proto_parser/antlr4_ansi/proto_parser.h b/yql/essentials/sql/v1/proto_parser/antlr4_ansi/proto_parser.h
index 15174f44d23..395d89674d6 100644
--- a/yql/essentials/sql/v1/proto_parser/antlr4_ansi/proto_parser.h
+++ b/yql/essentials/sql/v1/proto_parser/antlr4_ansi/proto_parser.h
@@ -3,6 +3,8 @@
namespace NSQLTranslationV1 {
-NSQLTranslation::TParserFactoryPtr MakeAntlr4AnsiParserFactory();
+NSQLTranslation::TParserFactoryPtr MakeAntlr4AnsiParserFactory(
+ bool isAmbiguityError = false,
+ bool isAmbiguityDebugging = false);
}
diff --git a/yql/essentials/sql/v1/sql.cpp b/yql/essentials/sql/v1/sql.cpp
index c21611a4a96..7ddc2a40b18 100644
--- a/yql/essentials/sql/v1/sql.cpp
+++ b/yql/essentials/sql/v1/sql.cpp
@@ -43,7 +43,6 @@ TAstNode* SqlASTsToYqls(const std::vector<::NSQLv1Generated::TRule_sql_stmt_core
void SqlASTToYqlImpl(NYql::TAstParseResult& res, const google::protobuf::Message& protoAst,
TContext& ctx) {
- YQL_ENSURE(!ctx.Issues.Size());
res.Root = SqlASTToYql(protoAst, ctx);
res.Pool = std::move(ctx.Pool);
if (!res.Root) {