proto_parser.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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 {
  41. ReportError(err, "antlr3_ansi");
  42. return nullptr;
  43. }
  44. return res;
  45. } else if (!ansiLexer && !anlr4Parser) {
  46. google::protobuf::Message* res = nullptr;
  47. if (parsers.Antlr3) {
  48. res = parsers.Antlr3->MakeParser()->Parse(query, queryName, err, arena);
  49. if (!res) {
  50. return res;
  51. }
  52. } else {
  53. ReportError(err, "antlr3");
  54. return nullptr;
  55. }
  56. return res;
  57. } else if (ansiLexer && anlr4Parser) {
  58. google::protobuf::Message* res = nullptr;
  59. if (parsers.Antlr4Ansi) {
  60. res = parsers.Antlr4Ansi->MakeParser()->Parse(query, queryName, err, arena);
  61. if (!res) {
  62. return res;
  63. }
  64. } else {
  65. ReportError(err, "antlr4_ansi");
  66. return nullptr;
  67. }
  68. return res;
  69. } else {
  70. google::protobuf::Message* res = nullptr;
  71. if (parsers.Antlr4) {
  72. res = parsers.Antlr4->MakeParser()->Parse(query, queryName, err, arena);
  73. if (!res) {
  74. return res;
  75. }
  76. } else {
  77. ReportError(err, "antlr4");
  78. return nullptr;
  79. }
  80. return res;
  81. }
  82. }
  83. google::protobuf::Message* SqlAST(const TString& query, const TString& queryName,
  84. NYql::TIssues& err, size_t maxErrors, bool ansiLexer, bool antlr4Parser, bool testAntlr4, google::protobuf::Arena* arena) {
  85. Y_UNUSED(testAntlr4);
  86. return SqlAST(MakeAllParsers(), query, queryName, err, maxErrors, ansiLexer, antlr4Parser, arena);
  87. }
  88. google::protobuf::Message* SqlAST(const TString& query, const TString& queryName,
  89. NProtoAST::IErrorCollector& err, bool ansiLexer, bool antlr4Parser, bool testAntlr4, google::protobuf::Arena* arena) {
  90. Y_UNUSED(testAntlr4);
  91. return SqlAST(MakeAllParsers(), query, queryName, err, ansiLexer, antlr4Parser, arena);
  92. }
  93. TParsers MakeAllParsers() {
  94. return TParsers {
  95. .Antlr3 = MakeAntlr3ParserFactory(),
  96. .Antlr3Ansi = MakeAntlr3AnsiParserFactory(),
  97. .Antlr4 = MakeAntlr4ParserFactory(),
  98. .Antlr4Ansi = MakeAntlr4AnsiParserFactory()
  99. };
  100. }
  101. } // namespace NSQLTranslationV1