diff options
| author | vitya-smirnov <[email protected]> | 2025-10-06 09:00:56 +0300 | 
|---|---|---|
| committer | vitya-smirnov <[email protected]> | 2025-10-06 09:18:09 +0300 | 
| commit | 96bddf8336a6ca765ee3141049197b8bff1810b5 (patch) | |
| tree | eec486eb50dbb0736245f9f4c12ca387162a3707 /yql/essentials/sql | |
| parent | ff0062834bf261b420f838c43effdf5d49beafd5 (diff) | |
YQL-20116: Introduce ANTLR4 ambiguity detection
- Ignored 2 known ambiguities.
- Tested tools.
commit_hash:9e29bb2f876dabc68293b3e5c26a470d373506ae
Diffstat (limited to 'yql/essentials/sql')
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) {  | 
