Skip to content

Commit af45a1a

Browse files
fixed issues
1 parent a03f6c6 commit af45a1a

File tree

3 files changed

+37
-9
lines changed

3 files changed

+37
-9
lines changed

ydb/core/external_sources/object_storage.cpp

+23
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ struct TObjectStorageExternalSource : public IExternalSource {
150150
}
151151
const bool hasPartitioning = objectStorage.projection_size() || objectStorage.partitioned_by_size();
152152
issues.AddIssues(ValidateFormatSetting(objectStorage.format(), objectStorage.format_setting(), location, hasPartitioning));
153+
issues.AddIssues(ValidateSchema(schema, objectStorage.partitioned_by()));
153154
issues.AddIssues(ValidateJsonListFormat(objectStorage.format(), schema, objectStorage.partitioned_by()));
154155
issues.AddIssues(ValidateRawFormat(objectStorage.format(), schema, objectStorage.partitioned_by()));
155156
if (hasPartitioning) {
@@ -268,6 +269,28 @@ struct TObjectStorageExternalSource : public IExternalSource {
268269
return issues;
269270
}
270271

272+
template<typename TScheme>
273+
static NYql::TIssues ValidateSchema(const TScheme& schema, const google::protobuf::RepeatedPtrField<TString>& partitionedBy) {
274+
NYql::TIssues issues;
275+
TSet<TString> partitionedBySet{partitionedBy.begin(), partitionedBy.end()};
276+
277+
for (const auto& column: schema.column()) {
278+
if (partitionedBySet.contains(column.name())) {
279+
continue;
280+
}
281+
282+
const auto type = column.type();
283+
if (type.has_optional_type() && type.optional_type().item().has_optional_type()) {
284+
issues.AddIssue(MakeErrorIssue(
285+
Ydb::StatusIds::BAD_REQUEST,
286+
TStringBuilder{} << "Double optional types are not supported for bindings (you have '"
287+
<< column.name() << " " << NYdb::TType(column.type()).ToString() << "' field)"));
288+
}
289+
}
290+
291+
return issues;
292+
}
293+
271294
template<typename TScheme>
272295
static NYql::TIssues ValidateJsonListFormat(const TString& format, const TScheme& schema, const google::protobuf::RepeatedPtrField<TString>& partitionedBy) {
273296
NYql::TIssues issues;

ydb/core/external_sources/object_storage_ut.cpp

+9
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,15 @@ Y_UNIT_TEST_SUITE(ObjectStorageTest) {
5555
UNIT_ASSERT_EXCEPTION_CONTAINS(source->Pack(schema, general), NExternalSource::TExternalSourceException, "Date, Timestamp and Interval types are not allowed in json_list format");
5656
}
5757

58+
Y_UNIT_TEST(FailedOptionalTypeValidation) {
59+
auto source = NExternalSource::CreateObjectStorageExternalSource({}, nullptr, 1000, nullptr, false, false);
60+
NKikimrExternalSources::TSchema schema;
61+
NKikimrExternalSources::TGeneral general;
62+
auto newColumn = schema.add_column();
63+
newColumn->mutable_type()->mutable_optional_type()->mutable_item()->mutable_optional_type()->mutable_item()->set_type_id(Ydb::Type::INT32);
64+
UNIT_ASSERT_EXCEPTION_CONTAINS(source->Pack(schema, general), NExternalSource::TExternalSourceException, "Double optional types are not supported for bindings");
65+
}
66+
5867
Y_UNIT_TEST(WildcardsValidation) {
5968
auto source = NExternalSource::CreateObjectStorageExternalSource({}, nullptr, 1000, nullptr, false, false);
6069
NKikimrExternalSources::TSchema schema;

ydb/tests/fq/s3/test_insert.py

+5-9
Original file line numberDiff line numberDiff line change
@@ -543,17 +543,12 @@ def test_insert_type_validation(self, kikimr, s3, client, unique_prefix):
543543
"s3", endpoint_url=s3.s3_url, aws_access_key_id="key", aws_secret_access_key="secret_key"
544544
)
545545

546-
bucket = resource.Bucket("fbucket")
546+
bucket = resource.Bucket("insert_bucket")
547547
bucket.create(ACL='public-read')
548548
bucket.objects.all().delete()
549549

550-
s3_client = boto3.client(
551-
"s3", endpoint_url=s3.s3_url, aws_access_key_id="key", aws_secret_access_key="secret_key"
552-
)
553-
554-
kikimr.control_plane.wait_bootstrap(1)
555-
storage_connection_name = unique_prefix + "fruitbucket"
556-
client.create_storage_connection(storage_connection_name, "fbucket")
550+
storage_connection_name = unique_prefix + "ibucket"
551+
client.create_storage_connection(storage_connection_name, "insert_bucket")
557552

558553
sql = f'''
559554
INSERT INTO `{storage_connection_name}`.`insert/`
@@ -565,5 +560,6 @@ def test_insert_type_validation(self, kikimr, s3, client, unique_prefix):
565560

566561
query_id = client.create_query("simple", sql, type=fq.QueryContent.QueryType.ANALYTICS).result.query_id
567562
client.wait_query_status(query_id, fq.QueryMeta.FAILED)
563+
issues = str(client.describe_query(query_id).result.query.issue)
568564

569-
assert "Double optional types are not supported for output" in str(client.describe_query(query_id).result)
565+
assert "Double optional types are not supported for output" in issues, "Incorrect issues: " + issues

0 commit comments

Comments
 (0)