parser.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #include "check_runner.h"
  2. #include <yql/essentials/sql/v1/proto_parser/proto_parser.h>
  3. #include <yql/essentials/sql/settings/translation_settings.h>
  4. #include <yql/essentials/parser/pg_wrapper/interface/raw_parser.h>
  5. namespace NYql {
  6. namespace NFastCheck {
  7. namespace {
  8. class TParserRunner : public ICheckRunner {
  9. public:
  10. TString GetCheckName() const final {
  11. return "parser";
  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. TAstParseResult res = ParseAst(request.Program);
  26. return TCheckResponse{
  27. .CheckName = GetCheckName(),
  28. .Success = res.IsOk(),
  29. .Issues = res.Issues
  30. };
  31. }
  32. class TPGParseEventsHandler : public IPGParseEvents {
  33. public:
  34. TPGParseEventsHandler(TCheckResponse& res)
  35. : Res_(res)
  36. {}
  37. void OnResult(const List* raw) final {
  38. Y_UNUSED(raw);
  39. Res_.Success = true;
  40. }
  41. void OnError(const TIssue& issue) final {
  42. Res_.Issues.AddIssue(issue);
  43. }
  44. private:
  45. TCheckResponse& Res_;
  46. };
  47. TCheckResponse RunPg(const TChecksRequest& request) {
  48. TCheckResponse res {.CheckName = GetCheckName()};
  49. TPGParseEventsHandler handler(res);
  50. PGParse(request.Program, handler);
  51. return res;
  52. }
  53. TCheckResponse RunYql(const TChecksRequest& request) {
  54. TCheckResponse res {.CheckName = GetCheckName()};
  55. NSQLTranslation::TTranslationSettings settings;
  56. settings.SyntaxVersion = request.SyntaxVersion;
  57. settings.AnsiLexer = request.IsAnsiLexer;
  58. settings.Antlr4Parser = true;
  59. settings.File = request.File;
  60. if (!ParseTranslationSettings(request.Program, settings, res.Issues)) {
  61. return res;
  62. }
  63. google::protobuf::Arena arena;
  64. auto msg = NSQLTranslationV1::SqlAST(request.Program, request.File, res.Issues, NSQLTranslation::SQL_MAX_PARSER_ERRORS,
  65. settings.AnsiLexer, true, false, &arena);
  66. if (msg) {
  67. res.Success = true;
  68. }
  69. return res;
  70. }
  71. };
  72. }
  73. std::unique_ptr<ICheckRunner> MakeParserRunner() {
  74. return std::make_unique<TParserRunner>();
  75. }
  76. }
  77. }