Skip to content

Commit d07aa64

Browse files
Merge 5e0ea2b into 7dd3f4d
2 parents 7dd3f4d + 5e0ea2b commit d07aa64

File tree

4 files changed

+72
-13
lines changed

4 files changed

+72
-13
lines changed

ydb/core/kqp/session_actor/kqp_response.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ TMaybe<Ydb::StatusIds::StatusCode> GetYdbStatus(const TIssue& issue) {
111111
case TIssuesIds::KIKIMR_TRANSACTION_NOT_FOUND:
112112
return Ydb::StatusIds::NOT_FOUND;
113113

114+
case TIssuesIds::CORE_EXEC:
114115
case TIssuesIds::KIKIMR_BAD_REQUEST:
115116
case TIssuesIds::KIKIMR_BAD_COLUMN_TYPE:
116117
case TIssuesIds::KIKIMR_NO_COLUMN_DEFAULT_VALUE:

ydb/library/yql/providers/common/mkql/parser.cpp

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -253,19 +253,25 @@ TRuntimeNode BuildParseCall(
253253
);
254254
} else if (format == "json_list") {
255255
auto parseToListLambda = [&](TRuntimeNode blob) {
256-
const auto json = ctx.ProgramBuilder.StrictFromString(
257-
blob,
258-
ctx.ProgramBuilder.NewDataType(NUdf::TDataType<NUdf::TJson>::Id));
259-
const auto dom = ctx.ProgramBuilder.Apply(
260-
ctx.ProgramBuilder.Udf("Yson2.ParseJson"),
261-
{json});
262-
const auto userType = ctx.ProgramBuilder.NewTupleType({
263-
ctx.ProgramBuilder.NewTupleType({dom.GetStaticType()}),
264-
ctx.ProgramBuilder.NewStructType({}),
265-
ctx.ProgramBuilder.NewListType(parseItemType)});
266-
return ctx.ProgramBuilder.Apply(
267-
ctx.ProgramBuilder.Udf("Yson2.ConvertTo", {}, userType),
268-
{dom});
256+
try {
257+
const auto json = ctx.ProgramBuilder.StrictFromString(
258+
blob,
259+
ctx.ProgramBuilder.NewDataType(NUdf::TDataType<NUdf::TJson>::Id));
260+
const auto dom = ctx.ProgramBuilder.Apply(
261+
ctx.ProgramBuilder.Udf("Yson2.ParseJson"),
262+
{json});
263+
const auto userType = ctx.ProgramBuilder.NewTupleType({
264+
ctx.ProgramBuilder.NewTupleType({dom.GetStaticType()}),
265+
ctx.ProgramBuilder.NewStructType({}),
266+
ctx.ProgramBuilder.NewListType(parseItemType)});
267+
return ctx.ProgramBuilder.Apply(
268+
ctx.ProgramBuilder.Udf("Yson2.ConvertTo", {}, userType),
269+
{dom});
270+
} catch(const yexception& e) {
271+
auto resException = TErrorException(UNEXPECTED_ERROR);
272+
resException.Append(e.what());
273+
throw resException;
274+
}
269275
};
270276

271277
input = ctx.ProgramBuilder.FlatMap(ctx.ProgramBuilder.ToFlow(input),

ydb/library/yql/providers/s3/actors/yql_s3_read_actor.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1152,6 +1152,10 @@ class TS3ReadCoroImpl : public TActorCoroImpl {
11521152
Issues.AddIssue(TIssue(ex.message()));
11531153
FatalCode = NYql::NDqProto::StatusIds::BAD_REQUEST;
11541154
RetryStuff->Cancel();
1155+
} catch (const yexception& ex) {
1156+
Issues.AddIssue(ExceptionToIssue(ex));
1157+
FatalCode = NYql::NDqProto::StatusIds::BAD_REQUEST;
1158+
RetryStuff->Cancel();
11551159
}
11561160
}
11571161
} catch (const TS3ReadAbort&) {

ydb/tests/fq/s3/test_s3_0.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -762,6 +762,54 @@ def test_bad_format(self, kikimr, s3, client, runtime_listing, unique_prefix):
762762
query_id = client.create_query("simple", sql, type=fq.QueryContent.QueryType.ANALYTICS).result.query_id
763763
client.wait_query_status(query_id, fq.QueryMeta.FAILED)
764764

765+
@yq_v2
766+
@pytest.mark.parametrize("client", [{"folder_id": "my_folder"}], indirect=True)
767+
def test_bad_request(self, kikimr, s3, client, unique_prefix):
768+
resource = boto3.resource(
769+
"s3", endpoint_url=s3.s3_url, aws_access_key_id="key", aws_secret_access_key="secret_key"
770+
)
771+
772+
bucket = resource.Bucket("bbucket")
773+
bucket.create(ACL='public-read')
774+
bucket.objects.all().delete()
775+
776+
s3_client = boto3.client(
777+
"s3", endpoint_url=s3.s3_url, aws_access_key_id="key", aws_secret_access_key="secret_key"
778+
)
779+
780+
s3_client.put_object(Body="blah blah blah", Bucket='bbucket', Key='file.json', ContentType='text/plain')
781+
782+
kikimr.control_plane.wait_bootstrap(1)
783+
storage_connection_name = unique_prefix + "badbucket"
784+
client.create_storage_connection(storage_connection_name, "bbucket")
785+
786+
sql = f'''
787+
select * from `{storage_connection_name}`.`file.json` with (
788+
format=json_list,
789+
schema (data timestamp)
790+
);
791+
'''
792+
793+
query_id = client.create_query("simple", sql, type=fq.QueryContent.QueryType.ANALYTICS).result.query_id
794+
client.wait_query_status(query_id, fq.QueryMeta.FAILED)
795+
assert "Query failed with code BAD_REQUEST" in str(
796+
client.describe_query(query_id).result
797+
)
798+
799+
sql = f'''
800+
select * from `{storage_connection_name}`.`file.json` with (
801+
format=csv_with_names,
802+
compression='gzip',
803+
schema (data timestamp)
804+
);
805+
'''
806+
807+
query_id = client.create_query("simple", sql, type=fq.QueryContent.QueryType.ANALYTICS).result.query_id
808+
client.wait_query_status(query_id, fq.QueryMeta.FAILED)
809+
assert "Query failed with code BAD_REQUEST" in str(
810+
client.describe_query(query_id).result
811+
)
812+
765813
@yq_v1
766814
@pytest.mark.parametrize("client", [{"folder_id": "my_folder"}], indirect=True)
767815
@pytest.mark.parametrize("mvp_external_ydb_endpoint", [{"endpoint": os.getenv("YDB_ENDPOINT")}], indirect=True)

0 commit comments

Comments
 (0)