diff --git a/ydb/core/kqp/gateway/kqp_metadata_loader.cpp b/ydb/core/kqp/gateway/kqp_metadata_loader.cpp index fd1b64e43a2d..046a3b04b851 100644 --- a/ydb/core/kqp/gateway/kqp_metadata_loader.cpp +++ b/ydb/core/kqp/gateway/kqp_metadata_loader.cpp @@ -842,6 +842,11 @@ NThreading::TFuture TKqpTableMetadataLoader::LoadTableMeta .Subscribe([promise, externalDataSourceMetadata, settings](const TFuture& result) mutable { UpdateExternalDataSourceSecretsValue(externalDataSourceMetadata, result.GetValue()); + if (!externalDataSourceMetadata.Success()) { + promise.SetValue(externalDataSourceMetadata); + return; + } + NExternalSource::IExternalSource::TPtr externalSource; if (settings.ExternalSourceFactory) { externalSource = settings.ExternalSourceFactory->GetOrCreate(externalDataSourceMetadata.Metadata->ExternalSource.Type); diff --git a/ydb/core/kqp/ut/federated_query/common/common.cpp b/ydb/core/kqp/ut/federated_query/common/common.cpp index d62f98894328..bd95dd3a6246 100644 --- a/ydb/core/kqp/ut/federated_query/common/common.cpp +++ b/ydb/core/kqp/ut/federated_query/common/common.cpp @@ -27,6 +27,7 @@ namespace NKikimr::NKqp::NFederatedQueryTest { NKikimrConfig::TFeatureFlags featureFlags; featureFlags.SetEnableExternalDataSources(true); featureFlags.SetEnableScriptExecutionOperations(true); + featureFlags.SetEnableExternalSourceSchemaInference(true); if (!appConfig) { appConfig.emplace(); } diff --git a/ydb/core/kqp/ut/federated_query/s3/kqp_federated_query_ut.cpp b/ydb/core/kqp/ut/federated_query/s3/kqp_federated_query_ut.cpp index b839915d30eb..453f019d0e13 100644 --- a/ydb/core/kqp/ut/federated_query/s3/kqp_federated_query_ut.cpp +++ b/ydb/core/kqp/ut/federated_query/s3/kqp_federated_query_ut.cpp @@ -2265,6 +2265,48 @@ Y_UNIT_TEST_SUITE(KqpFederatedQuery) { UNIT_ASSERT_STRING_CONTAINS(readyOp.Status().GetIssues().ToString(), "File pattern '{' contains invalid wildcard:"); } } + + Y_UNIT_TEST(TestSecretsExistingValidation) { + const TString bucket = "test_bucket14"; + + CreateBucket(bucket); + + NKikimrConfig::TAppConfig appConfig; + appConfig.MutableFeatureFlags()->SetEnableExternalSourceSchemaInference(true); + auto kikimr = NTestUtils::MakeKikimrRunner(appConfig); + + auto tc = kikimr->GetTableClient(); + auto session = tc.CreateSession().GetValueSync().GetSession(); + const TString query = fmt::format(R"( + GRANT ALL ON `/Root` TO `test@builtin`; + CREATE OBJECT TestSecret (TYPE SECRET) WITH value = `test_value`; + CREATE EXTERNAL DATA SOURCE `/Root/external_data_source` WITH ( + SOURCE_TYPE="ObjectStorage", + LOCATION="{location}", + AUTH_METHOD="SERVICE_ACCOUNT", + SERVICE_ACCOUNT_ID="TestSa", + SERVICE_ACCOUNT_SECRET_NAME="TestSecret" + );)", + "location"_a = GetBucketLocation(bucket) + ); + auto result = session.ExecuteSchemeQuery(query).GetValueSync(); + UNIT_ASSERT_C(result.GetStatus() == NYdb::EStatus::SUCCESS, result.GetIssues().ToString()); + + auto db = kikimr->GetQueryClient(NYdb::NQuery::TClientSettings().AuthToken("test@builtin")); + + const TString sql = R"( + SELECT * FROM `/Root/external_data_source`.`/` WITH ( + SCHEMA = (data String), + FORMAT = "csv_with_names" + ))"; + + auto scriptExecutionOperation = db.ExecuteScript(sql).ExtractValueSync(); + UNIT_ASSERT_VALUES_EQUAL_C(scriptExecutionOperation.Status().GetStatus(), EStatus::SUCCESS, scriptExecutionOperation.Status().GetIssues().ToString()); + + NYdb::NQuery::TScriptExecutionOperation readyOp = WaitScriptExecutionOperation(scriptExecutionOperation.Id(), kikimr->GetDriver()); + UNIT_ASSERT_EQUAL_C(readyOp.Metadata().ExecStatus, EExecStatus::Failed, readyOp.Status().GetIssues().ToString()); + UNIT_ASSERT_STRING_CONTAINS(readyOp.Status().GetIssues().ToString(), "secret with name 'TestSecret' not found"); + } } } // namespace NKikimr::NKqp