fastcheck.cpp 3.1 KB

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