fastcheck.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include "fastcheck.h"
  2. #include <yql/essentials/ast/yql_ast.h>
  3. #include <yql/essentials/ast/yql_expr.h>
  4. #include <yql/essentials/core/services/mounts/yql_mounts.h>
  5. #include <yql/essentials/core/user_data/yql_user_data.h>
  6. #include <yql/essentials/core/yql_type_annotation.h>
  7. #include <yql/essentials/core/yql_user_data_storage.h>
  8. #include <yql/essentials/sql/sql.h>
  9. #include <yql/essentials/sql/v1/sql.h>
  10. #include <yql/essentials/sql/v1/lexer/antlr4/lexer.h>
  11. #include <yql/essentials/sql/v1/lexer/antlr4_ansi/lexer.h>
  12. #include <yql/essentials/sql/v1/proto_parser/antlr4/proto_parser.h>
  13. #include <yql/essentials/sql/v1/proto_parser/antlr4_ansi/proto_parser.h>
  14. #include <yql/essentials/parser/pg_wrapper/interface/parser.h>
  15. namespace NYql {
  16. namespace NFastCheck {
  17. bool CheckProgram(const TString& program, const TOptions& options, TIssues& errors) {
  18. NSQLTranslationV1::TLexers lexers;
  19. lexers.Antlr4 = NSQLTranslationV1::MakeAntlr4LexerFactory();
  20. lexers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiLexerFactory();
  21. NSQLTranslationV1::TParsers parsers;
  22. parsers.Antlr4 = NSQLTranslationV1::MakeAntlr4ParserFactory();
  23. parsers.Antlr4Ansi = NSQLTranslationV1::MakeAntlr4AnsiParserFactory();
  24. NSQLTranslation::TTranslators translators(
  25. nullptr,
  26. NSQLTranslationV1::MakeTranslator(lexers, parsers),
  27. NSQLTranslationPG::MakeTranslator()
  28. );
  29. TAstParseResult astRes;
  30. if (options.IsSql) {
  31. NSQLTranslation::TTranslationSettings settings;
  32. settings.ClusterMapping = options.ClusterMapping;
  33. settings.SyntaxVersion = options.SyntaxVersion;
  34. settings.V0Behavior = NSQLTranslation::EV0Behavior::Disable;
  35. settings.EmitReadsForExists = true;
  36. if (options.IsLibrary) {
  37. settings.Mode = NSQLTranslation::ESqlMode::LIBRARY;
  38. }
  39. astRes = SqlToYql(translators, program, settings);
  40. } else {
  41. astRes = ParseAst(program);
  42. }
  43. if (!astRes.IsOk()) {
  44. errors = std::move(astRes.Issues);
  45. return false;
  46. }
  47. if (options.IsLibrary) {
  48. return true;
  49. }
  50. if (options.ParseOnly) {
  51. // parse SQL libs
  52. for (const auto& x : options.SqlLibs) {
  53. NSQLTranslation::TTranslationSettings settings;
  54. settings.ClusterMapping = options.ClusterMapping;
  55. settings.SyntaxVersion = options.SyntaxVersion;
  56. settings.V0Behavior = NSQLTranslation::EV0Behavior::Disable;
  57. settings.File = x.first;
  58. settings.Mode = NSQLTranslation::ESqlMode::LIBRARY;
  59. astRes = SqlToYql(translators, x.second, settings);
  60. if (!astRes.IsOk()) {
  61. errors = std::move(astRes.Issues);
  62. return false;
  63. }
  64. }
  65. return true;
  66. }
  67. TVector<NUserData::TUserData> userData;
  68. for (const auto& x : options.SqlLibs) {
  69. NUserData::TUserData data;
  70. data.Type_ = NUserData::EType::LIBRARY;
  71. data.Disposition_ = NUserData::EDisposition::INLINE;
  72. data.Name_ = x.first;
  73. data.Content_ = x.second;
  74. userData.push_back(data);
  75. }
  76. TExprContext libCtx;
  77. libCtx.IssueManager.AddIssues(std::move(astRes.Issues));
  78. IModuleResolver::TPtr moduleResolver;
  79. TUserDataTable userDataTable = GetYqlModuleResolver(libCtx, moduleResolver, userData, options.ClusterMapping, {});
  80. if (!userDataTable) {
  81. errors = libCtx.IssueManager.GetIssues();
  82. libCtx.IssueManager.Reset();
  83. return false;
  84. }
  85. auto userDataStorage = MakeIntrusive<TUserDataStorage>(nullptr, userDataTable, nullptr, nullptr);
  86. if (auto modules = dynamic_cast<TModuleResolver*>(moduleResolver.get())) {
  87. modules->AttachUserData(userDataStorage);
  88. }
  89. TExprContext exprCtx(libCtx.NextUniqueId);
  90. TExprNode::TPtr exprRoot;
  91. if (!CompileExpr(*astRes.Root, exprRoot, exprCtx, moduleResolver.get(), nullptr, false, Max<ui32>(), options.SyntaxVersion)) {
  92. errors = exprCtx.IssueManager.GetIssues();
  93. exprCtx.IssueManager.Reset();
  94. return false;
  95. }
  96. return true;
  97. }
  98. }
  99. }