fastcheck.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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. namespace NYql {
  10. namespace NFastCheck {
  11. bool CheckProgram(const TString& program, const TOptions& options, TIssues& errors) {
  12. TAstParseResult astRes;
  13. if (options.IsSql) {
  14. NSQLTranslation::TTranslationSettings settings;
  15. settings.ClusterMapping = options.ClusterMapping;
  16. settings.SyntaxVersion = options.SyntaxVersion;
  17. settings.V0Behavior = NSQLTranslation::EV0Behavior::Disable;
  18. settings.EmitReadsForExists = true;
  19. if (options.IsLibrary) {
  20. settings.Mode = NSQLTranslation::ESqlMode::LIBRARY;
  21. }
  22. astRes = SqlToYql(program, settings);
  23. } else {
  24. astRes = ParseAst(program);
  25. }
  26. if (!astRes.IsOk()) {
  27. errors = std::move(astRes.Issues);
  28. return false;
  29. }
  30. if (options.IsLibrary) {
  31. return true;
  32. }
  33. if (options.ParseOnly) {
  34. // parse SQL libs
  35. for (const auto& x : options.SqlLibs) {
  36. NSQLTranslation::TTranslationSettings settings;
  37. settings.ClusterMapping = options.ClusterMapping;
  38. settings.SyntaxVersion = options.SyntaxVersion;
  39. settings.V0Behavior = NSQLTranslation::EV0Behavior::Disable;
  40. settings.File = x.first;
  41. settings.Mode = NSQLTranslation::ESqlMode::LIBRARY;
  42. astRes = SqlToYql(x.second, settings);
  43. if (!astRes.IsOk()) {
  44. errors = std::move(astRes.Issues);
  45. return false;
  46. }
  47. }
  48. return true;
  49. }
  50. TVector<NUserData::TUserData> userData;
  51. for (const auto& x : options.SqlLibs) {
  52. NUserData::TUserData data;
  53. data.Type_ = NUserData::EType::LIBRARY;
  54. data.Disposition_ = NUserData::EDisposition::INLINE;
  55. data.Name_ = x.first;
  56. data.Content_ = x.second;
  57. userData.push_back(data);
  58. }
  59. TExprContext libCtx;
  60. libCtx.IssueManager.AddIssues(std::move(astRes.Issues));
  61. IModuleResolver::TPtr moduleResolver;
  62. TUserDataTable userDataTable = GetYqlModuleResolver(libCtx, moduleResolver, userData, options.ClusterMapping, {});
  63. if (!userDataTable) {
  64. errors = libCtx.IssueManager.GetIssues();
  65. libCtx.IssueManager.Reset();
  66. return false;
  67. }
  68. auto userDataStorage = MakeIntrusive<TUserDataStorage>(nullptr, userDataTable, nullptr, nullptr);
  69. if (auto modules = dynamic_cast<TModuleResolver*>(moduleResolver.get())) {
  70. modules->AttachUserData(userDataStorage);
  71. }
  72. TExprContext exprCtx(libCtx.NextUniqueId);
  73. TExprNode::TPtr exprRoot;
  74. if (!CompileExpr(*astRes.Root, exprRoot, exprCtx, moduleResolver.get(), nullptr, false, Max<ui32>(), options.SyntaxVersion)) {
  75. errors = exprCtx.IssueManager.GetIssues();
  76. exprCtx.IssueManager.Reset();
  77. return false;
  78. }
  79. return true;
  80. }
  81. }
  82. }