Skip to content

Commit 6d69d37

Browse files
Merge pull request ClickHouse#87012 from ClickHouse/backport/25.8/86166
Backport ClickHouse#86166 to 25.8: Remove UB while parsing Iceberg partition transform expression
2 parents 436f3ea + 7ecbfb5 commit 6d69d37

File tree

2 files changed

+21
-0
lines changed
  • src/Storages/ObjectStorage/DataLakes/Iceberg
  • tests/integration/test_storage_iceberg

2 files changed

+21
-0
lines changed

src/Storages/ObjectStorage/DataLakes/Iceberg/Utils.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -496,11 +496,15 @@ Poco::JSON::Object::Ptr getPartitionField(
496496
}
497497
else if (partition_function->name == "icebergTruncate")
498498
{
499+
if (!param.has_value())
500+
throw Exception(ErrorCodes::BAD_ARGUMENTS, "TRUNCATE function for iceberg partitioning requires one integer parameter");
499501
result->set(Iceberg::f_transform, fmt::format("truncate[{}]", *param));
500502
return result;
501503
}
502504
else if (partition_function->name == "icebergBucket")
503505
{
506+
if (!param.has_value())
507+
throw Exception(ErrorCodes::BAD_ARGUMENTS, "BUCKET function for iceberg partitioning requires one integer parameter");
504508
result->set(Iceberg::f_transform, fmt::format("bucket[{}]", *param));
505509
return result;
506510
}

tests/integration/test_storage_iceberg/test.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2590,6 +2590,23 @@ def test_writes_with_compression_metadata(started_cluster, format_version, stora
25902590
instance.query(f"INSERT INTO {TABLE_NAME} VALUES ('123', 1);", settings={"allow_experimental_insert_into_iceberg": 1, "iceberg_metadata_compression_method": "gzip"})
25912591
assert instance.query(f"SELECT * FROM {TABLE_NAME} ORDER BY ALL") == '123\t1\n'
25922592

2593+
def test_writes_create_table_bugs(started_cluster):
2594+
instance = started_cluster.instances["node1"]
2595+
TABLE_NAME = "test_writes_create_table_bugs_" + get_uuid_str()
2596+
TABLE_NAME_1 = "test_writes_create_table_bugs_" + get_uuid_str()
2597+
instance.query(
2598+
f"CREATE TABLE {TABLE_NAME} (c0 Int) ENGINE = IcebergLocal('/iceberg_data/default/{TABLE_NAME}/', 'CSV') AS (SELECT 1 OFFSET 1 ROW);",
2599+
settings={"allow_experimental_insert_into_iceberg": 1}
2600+
)
2601+
2602+
error = instance.query_and_get_error(
2603+
f"CREATE TABLE {TABLE_NAME_1} (c0 Int) ENGINE = IcebergLocal('/iceberg_data/default/{TABLE_NAME_1}/', 'CSV') PARTITION BY (icebergTruncate(c0));",
2604+
settings={"allow_experimental_insert_into_iceberg": 1}
2605+
)
2606+
2607+
assert "BAD_ARGUMENTS" in error
2608+
assert "LOGICAL_ERROR" not in error
2609+
25932610

25942611
@pytest.mark.parametrize("format_version", [1, 2])
25952612
@pytest.mark.parametrize("storage_type", ["local"])

0 commit comments

Comments
 (0)