proto_parser.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #include "proto_parser.h"
  2. #include <yql/essentials/utils/yql_panic.h>
  3. #include <yql/essentials/parser/proto_ast/collect_issues/collect_issues.h>
  4. #include <yql/essentials/sql/v1/proto_parser/antlr3/proto_parser.h>
  5. #include <yql/essentials/sql/v1/proto_parser/antlr3_ansi/proto_parser.h>
  6. #include <yql/essentials/sql/v1/proto_parser/antlr4/proto_parser.h>
  7. #include <yql/essentials/sql/v1/proto_parser/antlr4_ansi/proto_parser.h>
  8. #include <util/generic/algorithm.h>
  9. #if defined(_tsan_enabled_)
  10. #include <util/system/mutex.h>
  11. #endif
  12. using namespace NYql;
  13. namespace NSQLTranslationV1 {
  14. #if defined(_tsan_enabled_)
  15. TMutex SanitizerSQLTranslationMutex;
  16. #endif
  17. namespace {
  18. void ReportError(NProtoAST::IErrorCollector& err, const TString& name) {
  19. err.Error(0, 0, TStringBuilder() << "Parser " << name << " is not supported");
  20. }
  21. }
  22. google::protobuf::Message* SqlAST(const TParsers& parsers, const TString& query, const TString& queryName, TIssues& err,
  23. size_t maxErrors, bool ansiLexer, bool anlr4Parser, google::protobuf::Arena* arena) {
  24. NSQLTranslation::TErrorCollectorOverIssues collector(err, maxErrors, queryName);
  25. return SqlAST(parsers, query, queryName, collector, ansiLexer, anlr4Parser, arena);
  26. }
  27. google::protobuf::Message* SqlAST(const TParsers& parsers, const TString& query, const TString& queryName, NProtoAST::IErrorCollector& err,
  28. bool ansiLexer, bool anlr4Parser, google::protobuf::Arena* arena) {
  29. YQL_ENSURE(arena);
  30. #if defined(_tsan_enabled_)
  31. TGuard<TMutex> grd(SanitizerSQLTranslationMutex);
  32. #endif
  33. if (ansiLexer && !anlr4Parser) {
  34. google::protobuf::Message* res = nullptr;
  35. if (parsers.Antlr3Ansi) {
  36. res = parsers.Antlr3Ansi->MakeParser()->Parse(query, queryName, err, arena);
  37. if (!res) {
  38. return res;
  39. }
  40. } else if (parsers.Antlr4Ansi) {
  41. res = parsers.Antlr4Ansi->MakeParser()->Parse(query, queryName, err, arena);
  42. if (!res) {
  43. return res;
  44. }
  45. } else {
  46. ReportError(err, "antlr3_ansi");
  47. return nullptr;
  48. }
  49. return res;
  50. } else if (!ansiLexer && !anlr4Parser) {
  51. google::protobuf::Message* res = nullptr;
  52. if (parsers.Antlr3) {
  53. res = parsers.Antlr3->MakeParser()->Parse(query, queryName, err, arena);
  54. if (!res) {
  55. return res;
  56. }
  57. } else if (parsers.Antlr4) {
  58. res = parsers.Antlr4->MakeParser()->Parse(query, queryName, err, arena);
  59. if (!res) {
  60. return res;
  61. }
  62. } else {
  63. ReportError(err, "antlr3");
  64. return nullptr;
  65. }
  66. return res;
  67. } else if (ansiLexer && anlr4Parser) {
  68. google::protobuf::Message* res = nullptr;
  69. if (parsers.Antlr4Ansi) {
  70. res = parsers.Antlr4Ansi->MakeParser()->Parse(query, queryName, err, arena);
  71. if (!res) {
  72. return res;
  73. }
  74. } else {
  75. ReportError(err, "antlr4_ansi");
  76. return nullptr;
  77. }
  78. return res;
  79. } else {
  80. google::protobuf::Message* res = nullptr;
  81. if (parsers.Antlr4) {
  82. res = parsers.Antlr4->MakeParser()->Parse(query, queryName, err, arena);
  83. if (!res) {
  84. return res;
  85. }
  86. } else {
  87. ReportError(err, "antlr4");
  88. return nullptr;
  89. }
  90. return res;
  91. }
  92. }
  93. google::protobuf::Message* SqlAST(const TString& query, const TString& queryName,
  94. NYql::TIssues& err, size_t maxErrors, bool ansiLexer, bool antlr4Parser, bool testAntlr4, google::protobuf::Arena* arena) {
  95. Y_UNUSED(testAntlr4);
  96. return SqlAST(MakeAllParsers(), query, queryName, err, maxErrors, ansiLexer, antlr4Parser, arena);
  97. }
  98. google::protobuf::Message* SqlAST(const TString& query, const TString& queryName,
  99. NProtoAST::IErrorCollector& err, bool ansiLexer, bool antlr4Parser, bool testAntlr4, google::protobuf::Arena* arena) {
  100. Y_UNUSED(testAntlr4);
  101. return SqlAST(MakeAllParsers(), query, queryName, err, ansiLexer, antlr4Parser, arena);
  102. }
  103. TParsers MakeAllParsers() {
  104. return TParsers {
  105. .Antlr3 = MakeAntlr3ParserFactory(),
  106. .Antlr3Ansi = MakeAntlr3AnsiParserFactory(),
  107. .Antlr4 = MakeAntlr4ParserFactory(),
  108. .Antlr4Ansi = MakeAntlr4AnsiParserFactory()
  109. };
  110. }
  111. } // namespace NSQLTranslationV1