proto_parser.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #include "proto_parser.h"
  2. #include <yql/essentials/utils/yql_panic.h>
  3. #include <yql/essentials/parser/proto_ast/antlr3/proto_ast_antlr3.h>
  4. #include <yql/essentials/parser/proto_ast/antlr4/proto_ast_antlr4.h>
  5. #include <yql/essentials/parser/proto_ast/collect_issues/collect_issues.h>
  6. #include <yql/essentials/parser/proto_ast/gen/v1/SQLv1Lexer.h>
  7. #include <yql/essentials/parser/proto_ast/gen/v1/SQLv1Parser.h>
  8. #include <yql/essentials/parser/proto_ast/gen/v1_ansi/SQLv1Lexer.h>
  9. #include <yql/essentials/parser/proto_ast/gen/v1_ansi/SQLv1Parser.h>
  10. #include <yql/essentials/parser/proto_ast/gen/v1_antlr4/SQLv1Antlr4Lexer.h>
  11. #include <yql/essentials/parser/proto_ast/gen/v1_antlr4/SQLv1Antlr4Parser.h>
  12. #include <yql/essentials/parser/proto_ast/gen/v1_ansi_antlr4/SQLv1Antlr4Lexer.h>
  13. #include <yql/essentials/parser/proto_ast/gen/v1_ansi_antlr4/SQLv1Antlr4Parser.h>
  14. #include <yql/essentials/parser/proto_ast/gen/v1_proto_split/SQLv1Parser.pb.main.h>
  15. #include <library/cpp/protobuf/util/simple_reflection.h>
  16. #include <util/generic/algorithm.h>
  17. #if defined(_tsan_enabled_)
  18. #include <util/system/mutex.h>
  19. #endif
  20. using namespace NYql;
  21. namespace NSQLTranslationV1 {
  22. #if defined(_tsan_enabled_)
  23. TMutex SanitizerSQLTranslationMutex;
  24. #endif
  25. using namespace NSQLv1Generated;
  26. void ValidateMessagesImpl(const google::protobuf::Message* msg1, const google::protobuf::Message* msg2, bool hasNonAscii) {
  27. YQL_ENSURE(!msg1 == !msg2);
  28. if (!msg1) {
  29. return;
  30. }
  31. YQL_ENSURE(msg1->GetDescriptor() == msg2->GetDescriptor());
  32. const auto descr = msg1->GetDescriptor();
  33. if (descr == NSQLv1Generated::TToken::GetDescriptor()) {
  34. const auto& token1 = dynamic_cast<const NSQLv1Generated::TToken&>(*msg1);
  35. const auto& token2 = dynamic_cast<const NSQLv1Generated::TToken&>(*msg2);
  36. const bool isEof1 = token1.GetId() == Max<ui32>();
  37. const bool isEof2 = token2.GetId() == Max<ui32>();
  38. YQL_ENSURE(isEof1 == isEof2);
  39. YQL_ENSURE(token1.GetValue() == token2.GetValue());
  40. if (!isEof1) {
  41. YQL_ENSURE(token1.GetLine() == token2.GetLine());
  42. if (!hasNonAscii) {
  43. YQL_ENSURE(token1.GetColumn() == token2.GetColumn());
  44. }
  45. }
  46. return;
  47. }
  48. for (int i = 0; i < descr->field_count(); ++i) {
  49. const NProtoBuf::FieldDescriptor* fd = descr->field(i);
  50. NProtoBuf::TConstField field1(*msg1, fd);
  51. NProtoBuf::TConstField field2(*msg2, fd);
  52. YQL_ENSURE(field1.IsMessage() == field2.IsMessage());
  53. if (field1.IsMessage()) {
  54. YQL_ENSURE(field1.Size() == field2.Size());
  55. for (size_t j = 0; j < field1.Size(); ++j) {
  56. ValidateMessagesImpl(field1.template Get<NProtoBuf::Message>(j), field2.template Get<NProtoBuf::Message>(j), hasNonAscii);
  57. }
  58. }
  59. }
  60. }
  61. void ValidateMessages(const TString& query, const google::protobuf::Message* msg1, const google::protobuf::Message* msg2) {
  62. const bool hasNonAscii = AnyOf(query, [](char c) { return !isascii(c);});
  63. return ValidateMessagesImpl(msg1, msg2, hasNonAscii);
  64. }
  65. google::protobuf::Message* SqlAST(const TString& query, const TString& queryName, TIssues& err,
  66. size_t maxErrors, bool ansiLexer, bool anlr4Parser, bool testAntlr4, google::protobuf::Arena* arena) {
  67. YQL_ENSURE(arena);
  68. #if defined(_tsan_enabled_)
  69. TGuard<TMutex> grd(SanitizerSQLTranslationMutex);
  70. #endif
  71. NSQLTranslation::TErrorCollectorOverIssues collector(err, maxErrors, "");
  72. if (ansiLexer && !anlr4Parser) {
  73. NProtoAST::TProtoASTBuilder3<NALPAnsi::SQLv1Parser, NALPAnsi::SQLv1Lexer> builder(query, queryName, arena);
  74. auto res = builder.BuildAST(collector);
  75. if (testAntlr4) {
  76. NProtoAST::TProtoASTBuilder4<NALPAnsiAntlr4::SQLv1Antlr4Parser, NALPAnsiAntlr4::SQLv1Antlr4Lexer> builder(query, queryName, arena);
  77. auto res2 = builder.BuildAST(collector);
  78. ValidateMessages(query, res, res2);
  79. }
  80. return res;
  81. } else if (!ansiLexer && !anlr4Parser) {
  82. NProtoAST::TProtoASTBuilder3<NALPDefault::SQLv1Parser, NALPDefault::SQLv1Lexer> builder(query, queryName, arena);
  83. auto res = builder.BuildAST(collector);
  84. if (testAntlr4) {
  85. NProtoAST::TProtoASTBuilder4<NALPDefaultAntlr4::SQLv1Antlr4Parser, NALPDefaultAntlr4::SQLv1Antlr4Lexer> builder(query, queryName, arena);
  86. auto res2 = builder.BuildAST(collector);
  87. ValidateMessages(query, res, res2);
  88. }
  89. return res;
  90. } else if (ansiLexer && anlr4Parser) {
  91. NProtoAST::TProtoASTBuilder4<NALPAnsiAntlr4::SQLv1Antlr4Parser, NALPAnsiAntlr4::SQLv1Antlr4Lexer> builder(query, queryName, arena);
  92. return builder.BuildAST(collector);
  93. } else {
  94. NProtoAST::TProtoASTBuilder4<NALPDefaultAntlr4::SQLv1Antlr4Parser, NALPDefaultAntlr4::SQLv1Antlr4Lexer> builder(query, queryName, arena);
  95. return builder.BuildAST(collector);
  96. }
  97. }
  98. google::protobuf::Message* SqlAST(const TString& query, const TString& queryName, NProtoAST::IErrorCollector& err,
  99. bool ansiLexer, bool anlr4Parser, bool testAntlr4, google::protobuf::Arena* arena) {
  100. YQL_ENSURE(arena);
  101. #if defined(_tsan_enabled_)
  102. TGuard<TMutex> grd(SanitizerSQLTranslationMutex);
  103. #endif
  104. if (ansiLexer && !anlr4Parser) {
  105. NProtoAST::TProtoASTBuilder3<NALPAnsi::SQLv1Parser, NALPAnsi::SQLv1Lexer> builder(query, queryName, arena);
  106. auto res = builder.BuildAST(err);
  107. if (testAntlr4) {
  108. NProtoAST::TProtoASTBuilder4<NALPAnsiAntlr4::SQLv1Antlr4Parser, NALPAnsiAntlr4::SQLv1Antlr4Lexer> builder(query, queryName, arena);
  109. auto res2 = builder.BuildAST(err);
  110. ValidateMessages(query, res, res2);
  111. }
  112. return res;
  113. } else if (!ansiLexer && !anlr4Parser) {
  114. NProtoAST::TProtoASTBuilder3<NALPDefault::SQLv1Parser, NALPDefault::SQLv1Lexer> builder(query, queryName, arena);
  115. auto res = builder.BuildAST(err);
  116. if (testAntlr4) {
  117. NProtoAST::TProtoASTBuilder4<NALPDefaultAntlr4::SQLv1Antlr4Parser, NALPDefaultAntlr4::SQLv1Antlr4Lexer> builder(query, queryName, arena);
  118. auto res2 = builder.BuildAST(err);
  119. ValidateMessages(query, res, res2);
  120. }
  121. return res;
  122. } else if (ansiLexer && anlr4Parser) {
  123. NProtoAST::TProtoASTBuilder4<NALPAnsiAntlr4::SQLv1Antlr4Parser, NALPAnsiAntlr4::SQLv1Antlr4Lexer> builder(query, queryName, arena);
  124. return builder.BuildAST(err);
  125. } else {
  126. NProtoAST::TProtoASTBuilder4<NALPDefaultAntlr4::SQLv1Antlr4Parser, NALPDefaultAntlr4::SQLv1Antlr4Lexer> builder(query, queryName, arena);
  127. return builder.BuildAST(err);
  128. }
  129. }
  130. } // namespace NSQLTranslationV1