translator.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #include "check_runner.h"
  2. #include <yql/essentials/sql/v1/sql.h>
  3. #include <yql/essentials/sql/v1/lexer/antlr4/lexer.h>
  4. #include <yql/essentials/sql/v1/lexer/antlr4_ansi/lexer.h>
  5. #include <yql/essentials/sql/v1/proto_parser/antlr4/proto_parser.h>
  6. #include <yql/essentials/sql/v1/proto_parser/antlr4_ansi/proto_parser.h>
  7. #include <yql/essentials/sql/settings/translation_settings.h>
  8. #include <yql/essentials/parser/pg_wrapper/interface/parser.h>
  9. namespace NYql {
  10. namespace NFastCheck {
  11. namespace {
  12. class TTranslatorRunner : public ICheckRunner {
  13. public:
  14. TString GetCheckName() const final {
  15. return "translator";
  16. }
  17. TCheckResponse Run(const TChecksRequest& request) final {
  18. switch (request.Syntax) {
  19. case ESyntax::SExpr:
  20. return RunSExpr(request);
  21. case ESyntax::PG:
  22. return RunPg(request);
  23. case ESyntax::YQL:
  24. return RunYql(request);
  25. }
  26. }
  27. private:
  28. TCheckResponse RunSExpr(const TChecksRequest& request) {
  29. Y_UNUSED(request);
  30. // no separate check for translator here
  31. return TCheckResponse{.CheckName = GetCheckName(), .Success = true};
  32. }
  33. TCheckResponse RunPg(const TChecksRequest& request) {
  34. google::protobuf::Arena arena;
  35. NSQLTranslation::TTranslationSettings settings;
  36. settings.Arena = &arena;
  37. settings.PgParser = true;
  38. settings.ClusterMapping = request.ClusterMapping;
  39. auto astRes = NSQLTranslationPG::PGToYql(request.Program, settings);
  40. return TCheckResponse{
  41. .CheckName = GetCheckName(),
  42. .Success = astRes.IsOk(),
  43. .Issues = astRes.Issues
  44. };
  45. }
  46. TCheckResponse RunYql(const TChecksRequest& request) {
  47. TCheckResponse res {.CheckName = GetCheckName()};
  48. google::protobuf::Arena arena;
  49. NSQLTranslation::TTranslationSettings settings;
  50. settings.Arena = &arena;
  51. settings.File = request.File;
  52. settings.ClusterMapping = request.ClusterMapping;
  53. settings.EmitReadsForExists = true;
  54. settings.Antlr4Parser = true;
  55. settings.AnsiLexer = request.IsAnsiLexer;
  56. settings.SyntaxVersion = request.SyntaxVersion;
  57. switch (request.Mode) {
  58. case EMode::Default:
  59. settings.AlwaysAllowExports = true;
  60. break;
  61. case EMode::Library:
  62. settings.Mode = NSQLTranslation::ESqlMode::LIBRARY;
  63. break;
  64. case EMode::Main:
  65. break;
  66. case EMode::View:
  67. settings.Mode = NSQLTranslation::ESqlMode::LIMITED_VIEW;
  68. break;
  69. }
  70. if (!ParseTranslationSettings(request.Program, settings, res.Issues)) {
  71. return res;
  72. }
  73. NSQLTranslationV1::TLexers lexers;
  74. lexers.Antlr4 = NSQLTranslationV1::MakeAntlr4LexerFactory();
  75. lexers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiLexerFactory();
  76. NSQLTranslationV1::TParsers parsers;
  77. parsers.Antlr4 = NSQLTranslationV1::MakeAntlr4ParserFactory();
  78. parsers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiParserFactory();
  79. auto astRes = NSQLTranslationV1::SqlToYql(lexers, parsers, request.Program, settings);
  80. res.Success = astRes.IsOk();
  81. res.Issues = astRes.Issues;
  82. return res;
  83. }
  84. };
  85. }
  86. std::unique_ptr<ICheckRunner> MakeTranslatorRunner() {
  87. return std::make_unique<TTranslatorRunner>();
  88. }
  89. }
  90. }