1414
1515#include < ydb/library/yql/parser/proto_ast/gen/v1_proto_split/SQLv1Parser.pb.main.h>
1616
17+ #include < library/cpp/protobuf/util/simple_reflection.h>
18+
1719#if defined(_tsan_enabled_)
1820#include < util/system/mutex.h>
1921#endif
@@ -29,18 +31,70 @@ namespace NSQLTranslationV1 {
2931
3032using namespace NSQLv1Generated ;
3133
32- google::protobuf::Message* SqlAST (const TString& query, const TString& queryName, TIssues& err, size_t maxErrors, bool ansiLexer, bool anlr4Parser, google::protobuf::Arena* arena) {
34+ void ValidateMessages (const google::protobuf::Message* msg1, const google::protobuf::Message* msg2) {
35+ YQL_ENSURE (!msg1 == !msg2);
36+ if (!msg1) {
37+ return ;
38+ }
39+
40+ YQL_ENSURE (msg1->GetDescriptor () == msg2->GetDescriptor ());
41+ const auto descr = msg1->GetDescriptor ();
42+ if (descr == NSQLv1Generated::TToken::GetDescriptor ()) {
43+ const auto & token1 = dynamic_cast <const NSQLv1Generated::TToken&>(*msg1);
44+ const auto & token2 = dynamic_cast <const NSQLv1Generated::TToken&>(*msg2);
45+ const bool isEof1 = token1.GetId () == Max<ui32>();
46+ const bool isEof2 = token2.GetId () == Max<ui32>();
47+ YQL_ENSURE (isEof1 == isEof2);
48+ YQL_ENSURE (token1.GetValue () == token2.GetValue ());
49+ if (!isEof1) {
50+ YQL_ENSURE (token1.GetLine () == token2.GetLine ());
51+ YQL_ENSURE (token1.GetColumn () == token2.GetColumn ());
52+ }
53+
54+ return ;
55+ }
56+
57+ for (int i = 0 ; i < descr->field_count (); ++i) {
58+ const NProtoBuf::FieldDescriptor* fd = descr->field (i);
59+ NProtoBuf::TConstField field1 (*msg1, fd);
60+ NProtoBuf::TConstField field2 (*msg2, fd);
61+ YQL_ENSURE (field1.IsMessage () == field2.IsMessage ());
62+ if (field1.IsMessage ()) {
63+ YQL_ENSURE (field1.Size () == field2.Size ());
64+ for (size_t j = 0 ; j < field1.Size (); ++j) {
65+ ValidateMessages (field1.template Get <NProtoBuf::Message>(j), field2.template Get <NProtoBuf::Message>(j));
66+ }
67+ }
68+ }
69+ }
70+
71+ google::protobuf::Message* SqlAST (const TString& query, const TString& queryName, TIssues& err,
72+ size_t maxErrors, bool ansiLexer, bool anlr4Parser, bool testAntlr4, google::protobuf::Arena* arena) {
3373 YQL_ENSURE (arena);
3474#if defined(_tsan_enabled_)
3575 TGuard<TMutex> grd (SanitizerSQLTranslationMutex);
3676#endif
3777 NSQLTranslation::TErrorCollectorOverIssues collector (err, maxErrors, " " );
3878 if (ansiLexer && !anlr4Parser) {
3979 NProtoAST::TProtoASTBuilder<NALPAnsi::SQLv1Parser, NALPAnsi::SQLv1Lexer> builder (query, queryName, arena);
40- return builder.BuildAST (collector);
80+ auto res = builder.BuildAST (collector);
81+ if (testAntlr4) {
82+ NProtoAST::TProtoASTBuilder<NALPAnsiAntlr4::SQLv1Antlr4Parser, NALPAnsiAntlr4::SQLv1Antlr4Lexer> builder (query, queryName, arena);
83+ auto res2 = builder.BuildAST (collector);
84+ ValidateMessages (res, res2);
85+ }
86+
87+ return res;
4188 } else if (!ansiLexer && !anlr4Parser) {
4289 NProtoAST::TProtoASTBuilder<NALPDefault::SQLv1Parser, NALPDefault::SQLv1Lexer> builder (query, queryName, arena);
43- return builder.BuildAST (collector);
90+ auto res = builder.BuildAST (collector);
91+ if (testAntlr4) {
92+ NProtoAST::TProtoASTBuilder<NALPDefaultAntlr4::SQLv1Antlr4Parser, NALPDefaultAntlr4::SQLv1Antlr4Lexer> builder (query, queryName, arena);
93+ auto res2 = builder.BuildAST (collector);
94+ ValidateMessages (res, res2);
95+ }
96+
97+ return res;
4498 } else if (ansiLexer && anlr4Parser) {
4599 NProtoAST::TProtoASTBuilder<NALPAnsiAntlr4::SQLv1Antlr4Parser, NALPAnsiAntlr4::SQLv1Antlr4Lexer> builder (query, queryName, arena);
46100 return builder.BuildAST (collector);
@@ -50,17 +104,32 @@ google::protobuf::Message* SqlAST(const TString& query, const TString& queryName
50104 }
51105}
52106
53- google::protobuf::Message* SqlAST (const TString& query, const TString& queryName, NProtoAST::IErrorCollector& err, bool ansiLexer, bool anlr4Parser, google::protobuf::Arena* arena) {
107+ google::protobuf::Message* SqlAST (const TString& query, const TString& queryName, NProtoAST::IErrorCollector& err,
108+ bool ansiLexer, bool anlr4Parser, bool testAntlr4, google::protobuf::Arena* arena) {
54109 YQL_ENSURE (arena);
55110#if defined(_tsan_enabled_)
56111 TGuard<TMutex> grd (SanitizerSQLTranslationMutex);
57112#endif
58113 if (ansiLexer && !anlr4Parser) {
59114 NProtoAST::TProtoASTBuilder<NALPAnsi::SQLv1Parser, NALPAnsi::SQLv1Lexer> builder (query, queryName, arena);
60- return builder.BuildAST (err);
115+ auto res = builder.BuildAST (err);
116+ if (testAntlr4) {
117+ NProtoAST::TProtoASTBuilder<NALPAnsiAntlr4::SQLv1Antlr4Parser, NALPAnsiAntlr4::SQLv1Antlr4Lexer> builder (query, queryName, arena);
118+ auto res2 = builder.BuildAST (err);
119+ ValidateMessages (res, res2);
120+ }
121+
122+ return res;
61123 } else if (!ansiLexer && !anlr4Parser) {
62124 NProtoAST::TProtoASTBuilder<NALPDefault::SQLv1Parser, NALPDefault::SQLv1Lexer> builder (query, queryName, arena);
63- return builder.BuildAST (err);
125+ auto res = builder.BuildAST (err);
126+ if (testAntlr4) {
127+ NProtoAST::TProtoASTBuilder<NALPDefaultAntlr4::SQLv1Antlr4Parser, NALPDefaultAntlr4::SQLv1Antlr4Lexer> builder (query, queryName, arena);
128+ auto res2 = builder.BuildAST (err);
129+ ValidateMessages (res, res2);
130+ }
131+
132+ return res;
64133 } else if (ansiLexer && anlr4Parser) {
65134 NProtoAST::TProtoASTBuilder<NALPAnsiAntlr4::SQLv1Antlr4Parser, NALPAnsiAntlr4::SQLv1Antlr4Lexer> builder (query, queryName, arena);
66135 return builder.BuildAST (err);
0 commit comments