translator.cpp 2.7 KB

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