aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvvvv <vvvv@yandex-team.com>2025-03-13 19:10:19 +0300
committervvvv <vvvv@yandex-team.com>2025-03-13 19:23:38 +0300
commitd72b1a9403edec003d69eb1a21d2e37e4126ea86 (patch)
treeb7cfadc35de2113a42469d97ac2b8f6d6525fb0c
parentf4df711d7e78fb95059b084b527b9003354549e2 (diff)
downloadydb-d72b1a9403edec003d69eb1a21d2e37e4126ea86.tar.gz
YQL-19701 linter extension for unknown clusters
commit_hash:79c042af0cf2c51389b5a22bd866cd211b6acf64
-rw-r--r--yql/essentials/providers/common/provider/yql_provider_names.h1
-rw-r--r--yql/essentials/public/fastcheck/linter.h8
-rw-r--r--yql/essentials/public/fastcheck/linter_ut.cpp161
-rw-r--r--yql/essentials/public/fastcheck/translator.cpp36
-rw-r--r--yql/essentials/sql/v1/sql_into_tables.cpp6
-rw-r--r--yql/essentials/sql/v1/sql_query.cpp4
-rw-r--r--yql/essentials/tools/yql_linter/yql_linter.cpp6
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) {