fastcheck.cpp 3.4 KB

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