diff --git a/ydb/core/kqp/gateway/behaviour/resource_pool/manager.cpp b/ydb/core/kqp/gateway/behaviour/resource_pool/manager.cpp index 14ac6ed41a80..5ae3c3fe8dca 100644 --- a/ydb/core/kqp/gateway/behaviour/resource_pool/manager.cpp +++ b/ydb/core/kqp/gateway/behaviour/resource_pool/manager.cpp @@ -14,8 +14,14 @@ void CheckFeatureFlag(TResourcePoolManager::TInternalModificationContext& contex ythrow yexception() << "This place needs an actor system. Please contact internal support"; } - if (!AppData(actorSystem)->FeatureFlags.GetEnableDynamicResourcePools()) { - throw std::runtime_error("Dynamic resource pools are disabled. Please contact your system administrator to enable it"); + if (!AppData(actorSystem)->FeatureFlags.GetEnableResourcePools()) { + throw std::runtime_error("Resource pools are disabled. Please contact your system administrator to enable it"); + } +} + +void ValidateObjectId(const TString& objectId) { + if (objectId.find('/') != TString::npos) { + throw std::runtime_error("Resource pool id should not contain '/' symbol"); } } @@ -28,10 +34,10 @@ TResourcePoolManager::TYqlConclusionStatus StatusFromActivityType(TResourcePoolM return TYqlConclusionStatus::Fail("Undefined operation for RESOURCE_POOL object"); case EActivityType::Upsert: return TYqlConclusionStatus::Fail("Upsert operation for RESOURCE_POOL objects is not implemented"); - case EActivityType::Alter: - return TYqlConclusionStatus::Fail("Alter operation for RESOURCE_POOL objects is not implemented"); case EActivityType::Create: return TYqlConclusionStatus::Fail("Create operation for RESOURCE_POOL objects is not implemented"); + case EActivityType::Alter: + return TYqlConclusionStatus::Fail("Alter operation for RESOURCE_POOL objects is not implemented"); case EActivityType::Drop: return TYqlConclusionStatus::Fail("Drop operation for RESOURCE_POOL objects is not implemented"); } @@ -44,6 +50,7 @@ NThreading::TFuture TResourcePoolMan try { CheckFeatureFlag(context); + ValidateObjectId(settings.GetObjectId()); return NThreading::MakeFuture(StatusFromActivityType(context.GetActivityType())); } catch (...) { @@ -56,6 +63,7 @@ TResourcePoolManager::TYqlConclusionStatus TResourcePoolManager::DoPrepare(NKqpP try { CheckFeatureFlag(context); + ValidateObjectId(settings.GetObjectId()); return StatusFromActivityType(context.GetActivityType()); } catch (...) { diff --git a/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp b/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp index d1280dc8ce40..c91e7dcff563 100644 --- a/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp +++ b/ydb/core/kqp/ut/scheme/kqp_scheme_ut.cpp @@ -5989,8 +5989,8 @@ Y_UNIT_TEST_SUITE(KqpScheme) { } } - Y_UNIT_TEST(DisableDynamicResourcePools) { - TKikimrRunner kikimr(TKikimrSettings().SetEnableDynamicResourcePools(false)); + Y_UNIT_TEST(DisableResourcePools) { + TKikimrRunner kikimr(TKikimrSettings().SetEnableResourcePools(false)); auto db = kikimr.GetTableClient(); auto session = db.CreateSession().GetValueSync().GetSession(); @@ -5998,7 +5998,7 @@ Y_UNIT_TEST_SUITE(KqpScheme) { Cerr << "Check query:\n" << query << "\n"; auto result = session.ExecuteSchemeQuery(query).GetValueSync(); UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::GENERIC_ERROR); - UNIT_ASSERT_STRING_CONTAINS(result.GetIssues().ToString(), "Dynamic resource pools are disabled. Please contact your system administrator to enable it"); + UNIT_ASSERT_STRING_CONTAINS(result.GetIssues().ToString(), "Resource pools are disabled. Please contact your system administrator to enable it"); }; // CREATE RESOURCE POOL @@ -6020,6 +6020,19 @@ Y_UNIT_TEST_SUITE(KqpScheme) { // DROP RESOURCE POOL checkDisabled("DROP RESOURCE POOL `MyResourcePool`;"); } + + Y_UNIT_TEST(ResourcePoolsValidation) { + TKikimrRunner kikimr(TKikimrSettings().SetEnableResourcePools(true)); + auto db = kikimr.GetTableClient(); + auto session = db.CreateSession().GetValueSync().GetSession(); + + auto result = session.ExecuteSchemeQuery(R"( + CREATE RESOURCE POOL `MyFolder/MyResourcePool` WITH ( + CONCURRENT_QUERY_LIMIT=20 + );)").GetValueSync(); + UNIT_ASSERT_VALUES_EQUAL(result.GetStatus(), EStatus::GENERIC_ERROR); + UNIT_ASSERT_STRING_CONTAINS(result.GetIssues().ToString(), "Resource pool id should not contain '/' symbol"); + } } Y_UNIT_TEST_SUITE(KqpOlapScheme) { diff --git a/ydb/core/protos/feature_flags.proto b/ydb/core/protos/feature_flags.proto index 3df334d9068b..ae2f2bb63c63 100644 --- a/ydb/core/protos/feature_flags.proto +++ b/ydb/core/protos/feature_flags.proto @@ -140,5 +140,5 @@ message TFeatureFlags { optional bool EnableGraphShard = 125 [default = false]; optional bool EnableExternalSourceSchemaInference = 126 [default = false]; optional bool EnableDbMetadataCache = 127 [default = false]; - optional bool EnableDynamicResourcePools = 128 [default = false]; + optional bool EnableResourcePools = 128 [default = false]; } diff --git a/ydb/core/testlib/basics/feature_flags.h b/ydb/core/testlib/basics/feature_flags.h index d8c1d063198f..f6a3f6a897f4 100644 --- a/ydb/core/testlib/basics/feature_flags.h +++ b/ydb/core/testlib/basics/feature_flags.h @@ -58,7 +58,7 @@ class TTestFeatureFlagsHolder { FEATURE_FLAG_SETTER(EnableAddColumsWithDefaults) FEATURE_FLAG_SETTER(EnableReplaceIfExistsForExternalEntities) FEATURE_FLAG_SETTER(EnableCMSRequestPriorities) - FEATURE_FLAG_SETTER(EnableDynamicResourcePools) + FEATURE_FLAG_SETTER(EnableResourcePools) #undef FEATURE_FLAG_SETTER }; diff --git a/ydb/tests/tools/kqprun/configuration/app_config.conf b/ydb/tests/tools/kqprun/configuration/app_config.conf index 0bf247d1d829..eebc7479f333 100644 --- a/ydb/tests/tools/kqprun/configuration/app_config.conf +++ b/ydb/tests/tools/kqprun/configuration/app_config.conf @@ -2,7 +2,7 @@ FeatureFlags { EnableExternalDataSources: true EnableScriptExecutionOperations: true EnableExternalSourceSchemaInference: true - EnableDynamicResourcePools: true + EnableResourcePools: true } KQPConfig {