diff options
author | vvvv <vvvv@yandex-team.com> | 2025-03-13 19:10:19 +0300 |
---|---|---|
committer | vvvv <vvvv@yandex-team.com> | 2025-03-13 19:23:38 +0300 |
commit | d72b1a9403edec003d69eb1a21d2e37e4126ea86 (patch) | |
tree | b7cfadc35de2113a42469d97ac2b8f6d6525fb0c | |
parent | f4df711d7e78fb95059b084b527b9003354549e2 (diff) | |
download | ydb-d72b1a9403edec003d69eb1a21d2e37e4126ea86.tar.gz |
YQL-19701 linter extension for unknown clusters
commit_hash:79c042af0cf2c51389b5a22bd866cd211b6acf64
-rw-r--r-- | yql/essentials/providers/common/provider/yql_provider_names.h | 1 | ||||
-rw-r--r-- | yql/essentials/public/fastcheck/linter.h | 8 | ||||
-rw-r--r-- | yql/essentials/public/fastcheck/linter_ut.cpp | 161 | ||||
-rw-r--r-- | yql/essentials/public/fastcheck/translator.cpp | 36 | ||||
-rw-r--r-- | yql/essentials/sql/v1/sql_into_tables.cpp | 6 | ||||
-rw-r--r-- | yql/essentials/sql/v1/sql_query.cpp | 4 | ||||
-rw-r--r-- | yql/essentials/tools/yql_linter/yql_linter.cpp | 6 |
7 files changed, 188 insertions, 34 deletions
diff --git a/yql/essentials/providers/common/provider/yql_provider_names.h b/yql/essentials/providers/common/provider/yql_provider_names.h index de54138b28..37c49a4fff 100644 --- a/yql/essentials/providers/common/provider/yql_provider_names.h +++ b/yql/essentials/providers/common/provider/yql_provider_names.h @@ -5,6 +5,7 @@ namespace NYql { +constexpr TStringBuf UnknownProviderName = "unknown"; constexpr TStringBuf ConfigProviderName = "config"; constexpr TStringBuf KikimrProviderName = "kikimr"; constexpr TStringBuf ResultProviderName = "result"; diff --git a/yql/essentials/public/fastcheck/linter.h b/yql/essentials/public/fastcheck/linter.h index 7af5e62455..455a734333 100644 --- a/yql/essentials/public/fastcheck/linter.h +++ b/yql/essentials/public/fastcheck/linter.h @@ -21,6 +21,12 @@ enum class EMode { View }; +enum EClusterMode { + Many, + Single, + Unknown +}; + struct TCheckFilter { bool Include = true; TString CheckNameGlob; @@ -29,6 +35,8 @@ struct TCheckFilter { struct TChecksRequest { TString Program; TString File; + EClusterMode ClusterMode = Many; + TString ClusterSystem; THashMap<TString, TString> ClusterMapping; ESyntax Syntax = ESyntax::YQL; ui16 SyntaxVersion = 1; diff --git a/yql/essentials/public/fastcheck/linter_ut.cpp b/yql/essentials/public/fastcheck/linter_ut.cpp index be44f88c50..2c5c0bbd0a 100644 --- a/yql/essentials/public/fastcheck/linter_ut.cpp +++ b/yql/essentials/public/fastcheck/linter_ut.cpp @@ -19,7 +19,7 @@ Y_UNIT_TEST_SUITE(TLinterTests) { auto res = RunChecks(request); UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "lexer"); - UNIT_ASSERT(res.Checks[0].Success); + UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString()); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0); } @@ -32,7 +32,7 @@ Y_UNIT_TEST_SUITE(TLinterTests) { auto res = RunChecks(request); UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "lexer"); - UNIT_ASSERT(res.Checks[0].Success); + UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString()); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0); } @@ -45,7 +45,7 @@ Y_UNIT_TEST_SUITE(TLinterTests) { auto res = RunChecks(request); UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "lexer"); - UNIT_ASSERT(res.Checks[0].Success); + UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString()); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0); } @@ -72,7 +72,7 @@ Y_UNIT_TEST_SUITE(TLinterTests) { auto res = RunChecks(request); UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "format"); - UNIT_ASSERT(res.Checks[0].Success); + UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString()); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0); } @@ -85,7 +85,7 @@ Y_UNIT_TEST_SUITE(TLinterTests) { auto res = RunChecks(request); UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "format"); - UNIT_ASSERT(res.Checks[0].Success); + UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString()); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0); } @@ -98,8 +98,7 @@ Y_UNIT_TEST_SUITE(TLinterTests) { auto res = RunChecks(request); UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "format"); - UNIT_ASSERT(res.Checks[0].Success); - Cerr << res.Checks[0].Issues.ToString(); + UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString()); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0); } @@ -112,8 +111,7 @@ Y_UNIT_TEST_SUITE(TLinterTests) { auto res = RunChecks(request); UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "format"); - UNIT_ASSERT(res.Checks[0].Success); - Cerr << res.Checks[0].Issues.ToString(); + UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString()); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0); } @@ -126,8 +124,7 @@ Y_UNIT_TEST_SUITE(TLinterTests) { auto res = RunChecks(request); UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "format"); - UNIT_ASSERT(res.Checks[0].Success); - Cerr << res.Checks[0].Issues.ToString(); + UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString()); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0); } @@ -172,8 +169,7 @@ Y_UNIT_TEST_SUITE(TLinterTests) { auto res = RunChecks(request); UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "parser"); - UNIT_ASSERT(res.Checks[0].Success); - Cerr << res.Checks[0].Issues.ToString(); + UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString()); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0); } @@ -200,8 +196,7 @@ Y_UNIT_TEST_SUITE(TLinterTests) { auto res = RunChecks(request); UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "parser"); - UNIT_ASSERT(res.Checks[0].Success); - Cerr << res.Checks[0].Issues.ToString(); + UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString()); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0); } @@ -228,7 +223,7 @@ Y_UNIT_TEST_SUITE(TLinterTests) { auto res = RunChecks(request); UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "parser"); - UNIT_ASSERT(res.Checks[0].Success); + UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString()); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0); } @@ -241,7 +236,7 @@ Y_UNIT_TEST_SUITE(TLinterTests) { auto res = RunChecks(request); UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "parser"); - UNIT_ASSERT(res.Checks[0].Success); + UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString()); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0); } @@ -268,7 +263,7 @@ Y_UNIT_TEST_SUITE(TLinterTests) { auto res = RunChecks(request); UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator"); - UNIT_ASSERT(res.Checks[0].Success); + UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString()); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(), 0); } @@ -282,8 +277,7 @@ Y_UNIT_TEST_SUITE(TLinterTests) { auto res = RunChecks(request); UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator"); - UNIT_ASSERT(res.Checks[0].Success); - Cerr << res.Checks[0].Issues.ToString(); + UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString()); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0); } @@ -311,8 +305,7 @@ Y_UNIT_TEST_SUITE(TLinterTests) { auto res = RunChecks(request); UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator"); - UNIT_ASSERT(res.Checks[0].Success); - Cerr << res.Checks[0].Issues.ToString(); + UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString()); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0); } @@ -340,8 +333,7 @@ Y_UNIT_TEST_SUITE(TLinterTests) { auto res = RunChecks(request); UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator"); - UNIT_ASSERT(res.Checks[0].Success); - Cerr << res.Checks[0].Issues.ToString(); + UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString()); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0); } @@ -354,8 +346,7 @@ Y_UNIT_TEST_SUITE(TLinterTests) { auto res = RunChecks(request); UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator"); - UNIT_ASSERT(res.Checks[0].Success); - Cerr << res.Checks[0].Issues.ToString(); + UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString()); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0); } @@ -399,8 +390,7 @@ Y_UNIT_TEST_SUITE(TLinterTests) { auto res = RunChecks(request); UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator"); - UNIT_ASSERT(res.Checks[0].Success); - Cerr << res.Checks[0].Issues.ToString(); + UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString()); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0); } @@ -465,6 +455,119 @@ Y_UNIT_TEST_SUITE(TLinterTests) { auto res = RunChecks(request); UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1); UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "lexer"); - UNIT_ASSERT(res.Checks[0].Success); + UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString()); + } + + Y_UNIT_TEST(BadTranslatorYqlWithoutUseMany) { + TChecksRequest request; + request.Program = "select * from Input"; + request.Syntax = ESyntax::YQL; + request.Filters.ConstructInPlace(); + request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"}); + auto res = RunChecks(request); + UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1); + UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator"); + UNIT_ASSERT(!res.Checks[0].Success); + Cerr << res.Checks[0].Issues.ToString(); + UNIT_ASSERT(res.Checks[0].Issues.Size() > 0); + } + + Y_UNIT_TEST(GoodTranslatorYqlWithoutUseSingle) { + TChecksRequest request; + request.Program = "select * from Input"; + request.ClusterMode = EClusterMode::Single; + request.ClusterSystem = YtProviderName; + request.Syntax = ESyntax::YQL; + request.Filters.ConstructInPlace(); + request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"}); + auto res = RunChecks(request); + UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1); + UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator"); + UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString()); + UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0); + } + + Y_UNIT_TEST(GoodTranslatorYqlWithoutUseUnknown) { + TChecksRequest request; + request.Program = "select * from Input"; + request.ClusterMode = EClusterMode::Unknown; + request.Syntax = ESyntax::YQL; + request.Filters.ConstructInPlace(); + request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"}); + auto res = RunChecks(request); + UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1); + UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator"); + UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString()); + UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0); + } + + Y_UNIT_TEST(BadTranslatorYqlAnotherClusterMany) { + TChecksRequest request; + request.Program = "select * from foo.Input"; + request.Syntax = ESyntax::YQL; + request.Filters.ConstructInPlace(); + request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"}); + auto res = RunChecks(request); + UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1); + UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator"); + UNIT_ASSERT(!res.Checks[0].Success); + Cerr << res.Checks[0].Issues.ToString(); + UNIT_ASSERT(res.Checks[0].Issues.Size() > 0); + } + + Y_UNIT_TEST(GoodTranslatorYqlAnotherClusterMany) { + TChecksRequest request; + request.Program = "select * from foo.Input"; + request.ClusterSystem = YtProviderName; + request.Syntax = ESyntax::YQL; + request.Filters.ConstructInPlace(); + request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"}); + auto res = RunChecks(request); + UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1); + UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator"); + UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString()); + UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0); + } + + Y_UNIT_TEST(GoodTranslatorYqlUnknownSystemUpdate) { + TChecksRequest request; + request.Program = "update foo set value = 1"; + request.ClusterMode = EClusterMode::Unknown; + request.Syntax = ESyntax::YQL; + request.Filters.ConstructInPlace(); + request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"}); + auto res = RunChecks(request); + UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1); + UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator"); + UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString()); + UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0); + } + + Y_UNIT_TEST(GoodTranslatorYqlUnknownSystemDelete) { + TChecksRequest request; + request.Program = "delete from foo where value = 1"; + request.ClusterMode = EClusterMode::Unknown; + request.Syntax = ESyntax::YQL; + request.Filters.ConstructInPlace(); + request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"}); + auto res = RunChecks(request); + UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1); + UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator"); + UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString()); + UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0); + } + + Y_UNIT_TEST(GoodTranslatorYqlUnknownSystemReplaceInto) { + TChecksRequest request; + request.Program = "replace into foo select 1"; + request.ClusterMode = EClusterMode::Unknown; + request.Syntax = ESyntax::YQL; + request.Filters.ConstructInPlace(); + request.Filters->push_back(TCheckFilter{.CheckNameGlob = "translator"}); + auto res = RunChecks(request); + UNIT_ASSERT_VALUES_EQUAL(res.Checks.size(), 1); + UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].CheckName, "translator"); + UNIT_ASSERT_C(res.Checks[0].Success, res.Checks[0].Issues.ToString()); + UNIT_ASSERT_VALUES_EQUAL(res.Checks[0].Issues.Size(),0); } } diff --git a/yql/essentials/public/fastcheck/translator.cpp b/yql/essentials/public/fastcheck/translator.cpp index 8350dd9b4f..3b5f0b9b07 100644 --- a/yql/essentials/public/fastcheck/translator.cpp +++ b/yql/essentials/public/fastcheck/translator.cpp @@ -6,6 +6,7 @@ #include <yql/essentials/sql/v1/proto_parser/antlr4_ansi/proto_parser.h> #include <yql/essentials/sql/settings/translation_settings.h> #include <yql/essentials/parser/pg_wrapper/interface/parser.h> +#include <yql/essentials/providers/common/provider/yql_provider_names.h> namespace NYql { namespace NFastCheck { @@ -41,7 +42,8 @@ private: NSQLTranslation::TTranslationSettings settings; settings.Arena = &arena; settings.PgParser = true; - settings.ClusterMapping = request.ClusterMapping; + FillClusters(request, settings); + auto astRes = NSQLTranslationPG::PGToYql(request.Program, settings); return TCheckResponse{ .CheckName = GetCheckName(), @@ -56,7 +58,7 @@ private: NSQLTranslation::TTranslationSettings settings; settings.Arena = &arena; settings.File = request.File; - settings.ClusterMapping = request.ClusterMapping; + FillClusters(request, settings); settings.EmitReadsForExists = true; settings.Antlr4Parser = true; settings.AnsiLexer = request.IsAnsiLexer; @@ -102,6 +104,36 @@ private: res.Issues = astRes.Issues; return res; } + + void FillClusters(const TChecksRequest& request, NSQLTranslation::TTranslationSettings& settings) { + if (!request.ClusterSystem.empty()) { + Y_ENSURE(AnyOf(Providers, [&](const auto& p) { return p == request.ClusterSystem; }), + "Invalid ClusterSystem value: " + request.ClusterSystem); + } + + switch (request.ClusterMode) { + case EClusterMode::Many: + for (const auto& x : request.ClusterMapping) { + Y_ENSURE(AnyOf(Providers, [&](const auto& p) { return p == x.second; }), + "Invalid system: " + x.second); + } + + settings.ClusterMapping = request.ClusterMapping; + settings.DynamicClusterProvider = request.ClusterSystem; + break; + case EClusterMode::Single: + Y_ENSURE(!request.ClusterSystem.empty(), "Missing ClusterSystem parameter"); + settings.DefaultCluster = "single"; + settings.ClusterMapping["single"] = request.ClusterSystem; + settings.DynamicClusterProvider = request.ClusterSystem; + break; + case EClusterMode::Unknown: + settings.DefaultCluster = "single"; + settings.ClusterMapping["single"] = UnknownProviderName; + settings.DynamicClusterProvider = UnknownProviderName; + break; + } + } }; } diff --git a/yql/essentials/sql/v1/sql_into_tables.cpp b/yql/essentials/sql/v1/sql_into_tables.cpp index 77498af54a..ff7dd271cd 100644 --- a/yql/essentials/sql/v1/sql_into_tables.cpp +++ b/yql/essentials/sql/v1/sql_into_tables.cpp @@ -156,7 +156,7 @@ TNodePtr TSqlIntoTable::Build(const TRule_into_table_stmt& node) { TVector<TString> eraseColumns; if (intoTableRef.HasBlock2()) { - if (service != StatProviderName) { + if (service != StatProviderName && service != UnknownProviderName) { Ctx.Error() << "ERASE BY is unsupported for " << service; return nullptr; } @@ -217,6 +217,10 @@ bool TSqlIntoTable::ValidateServiceName(const TRule_into_table_stmt& node, const ESQLWriteColumnMode mode, const TPosition& pos) { Y_UNUSED(node); auto serviceName = table.Service; + if (serviceName == UnknownProviderName) { + return true; + } + const bool isMapReduce = serviceName == YtProviderName; const bool isKikimr = serviceName == KikimrProviderName || serviceName == YdbProviderName; const bool isRtmr = serviceName == RtmrProviderName; diff --git a/yql/essentials/sql/v1/sql_query.cpp b/yql/essentials/sql/v1/sql_query.cpp index 6dc510bf57..e919630a03 100644 --- a/yql/essentials/sql/v1/sql_query.cpp +++ b/yql/essentials/sql/v1/sql_query.cpp @@ -3486,7 +3486,7 @@ TNodePtr TSqlQuery::Build(const TRule_delete_stmt& stmt) { } const bool isKikimr = table.Service == KikimrProviderName; - if (!isKikimr) { + if (!isKikimr && table.Service != UnknownProviderName) { Ctx.Error(GetPos(stmt.GetToken2())) << "DELETE is unsupported for " << table.Service; return nullptr; } @@ -3552,7 +3552,7 @@ TNodePtr TSqlQuery::Build(const TRule_update_stmt& stmt) { const bool isKikimr = table.Service == KikimrProviderName; - if (!isKikimr) { + if (!isKikimr && table.Service != UnknownProviderName) { Ctx.Error(GetPos(stmt.GetToken2())) << "UPDATE is unsupported for " << table.Service; return nullptr; } diff --git a/yql/essentials/tools/yql_linter/yql_linter.cpp b/yql/essentials/tools/yql_linter/yql_linter.cpp index 7e392b7fc0..458496c21e 100644 --- a/yql/essentials/tools/yql_linter/yql_linter.cpp +++ b/yql/essentials/tools/yql_linter/yql_linter.cpp @@ -18,6 +18,8 @@ int Run(int argc, char* argv[]) { THashMap<TString, TString> clusterMapping; TString modeStr = "Default"; TString syntaxStr = "YQL"; + TString clusterModeStr = "Many"; + TString clusterSystem; opts.AddLongOption('i', "input", "input file").RequiredArgument("input").StoreResult(&inFileName); opts.AddLongOption('v', "verbose", "show lint issues").NoArgument(); @@ -33,6 +35,8 @@ int Run(int argc, char* argv[]) { opts.AddLongOption('m', "mode", "query mode, allowed values: " + GetEnumAllNames<NYql::NFastCheck::EMode>()).StoreResult(&modeStr); opts.AddLongOption('s', "syntax", "query syntax, allowed values: " + GetEnumAllNames<NYql::NFastCheck::ESyntax>()).StoreResult(&syntaxStr); + opts.AddLongOption("cluster-mode", "cluster mode, allowed values: " + GetEnumAllNames<NYql::NFastCheck::EClusterMode>()).StoreResult(&clusterModeStr); + opts.AddLongOption("cluster-system", "cluster system").StoreResult(&clusterSystem); opts.AddLongOption("ansi-lexer", "use ansi lexer").NoArgument(); opts.AddLongOption("no-colors", "disable colors for output").NoArgument(); opts.SetFreeArgsNum(0); @@ -79,6 +83,8 @@ int Run(int argc, char* argv[]) { checkReq.ClusterMapping = clusterMapping; checkReq.Mode = FromString<NYql::NFastCheck::EMode>(modeStr); checkReq.Syntax = FromString<NYql::NFastCheck::ESyntax>(syntaxStr); + checkReq.ClusterMode = FromString<NYql::NFastCheck::EClusterMode>(clusterModeStr); + checkReq.ClusterSystem = clusterSystem; auto checkResp = NYql::NFastCheck::RunChecks(checkReq); for (const auto& c : checkResp.Checks) { if (!c.Success) { |