From 0be8dd19be0980cd6e71b5bba00a3d277b8a80a1 Mon Sep 17 00:00:00 2001 From: Kanthi Subramanian Date: Fri, 11 Sep 2026 18:41:10 +0200 Subject: [PATCH 1/3] Remove clickhouse cloud references --- src/Access/AccessControl.cpp | 3 - src/Core/Settings.cpp | 4 - .../configs/config.d/cache_54176.xml | 9 ++ .../test_multi_arg_transforms.py | 134 ++++++++++++++++++ ...ive_not_with_authorization_never.reference | 3 +- ...nteractive_not_with_authorization_never.sh | 2 +- 6 files changed, 145 insertions(+), 10 deletions(-) create mode 100644 tests/integration/test_storage_iceberg_with_spark/configs/config.d/cache_54176.xml create mode 100644 tests/integration/test_storage_iceberg_with_spark/test_multi_arg_transforms.py diff --git a/src/Access/AccessControl.cpp b/src/Access/AccessControl.cpp index b77b33109530..bba860350450 100644 --- a/src/Access/AccessControl.cpp +++ b/src/Access/AccessControl.cpp @@ -629,9 +629,6 @@ AuthResult AccessControl::authenticate(const Credentials & credentials, const Po message << R"( -If you use ClickHouse Cloud, the password can be reset at https://clickhouse.cloud/ -on the settings page for the corresponding service. - If you have installed ClickHouse and forgot password you can reset it in the configuration file. The password for default user is typically located at /etc/clickhouse-server/users.d/default-password.xml and deleting this file will reset the password. diff --git a/src/Core/Settings.cpp b/src/Core/Settings.cpp index 4284793eb44b..723459801cd3 100644 --- a/src/Core/Settings.cpp +++ b/src/Core/Settings.cpp @@ -5183,10 +5183,6 @@ If settings are set to non-default values, then those settings are honored (only This setting takes a ClickHouse version number as a string, like `22.3`, `22.8`. An empty value means that this setting is disabled. Disabled by default. - -:::note -In ClickHouse Cloud the compatibility setting must be set by ClickHouse Cloud support. Please [open a case](https://clickhouse.cloud/support) to have it set. -::: )", 0) \ \ DECLARE(Map, additional_table_filters, "", R"( diff --git a/tests/integration/test_storage_iceberg_with_spark/configs/config.d/cache_54176.xml b/tests/integration/test_storage_iceberg_with_spark/configs/config.d/cache_54176.xml new file mode 100644 index 000000000000..5f8b181ec554 --- /dev/null +++ b/tests/integration/test_storage_iceberg_with_spark/configs/config.d/cache_54176.xml @@ -0,0 +1,9 @@ + + + + + 1Gi + cache_54176 + + + diff --git a/tests/integration/test_storage_iceberg_with_spark/test_multi_arg_transforms.py b/tests/integration/test_storage_iceberg_with_spark/test_multi_arg_transforms.py new file mode 100644 index 000000000000..13d8ed07b112 --- /dev/null +++ b/tests/integration/test_storage_iceberg_with_spark/test_multi_arg_transforms.py @@ -0,0 +1,134 @@ +import pytest + +from helpers.iceberg_utils import ( + create_iceberg_table, + default_upload_directory, + get_creation_expression, + get_uuid_str, +) + + +@pytest.mark.parametrize("storage_type", ["s3", "local"]) +def test_multi_arg_bucket_partition( + started_cluster_iceberg_with_spark, storage_type +): + """Iceberg v3 multi-argument partition transform: bucket over two columns. + + Verifies that ClickHouse can read a table whose partition spec uses + ``source-ids`` (multiple source columns) instead of a single ``source-id``. + Per the Iceberg v3 spec, readers must handle unknown transforms by ignoring + the unsupported partition fields when filtering. + """ + instance = started_cluster_iceberg_with_spark.instances["node1"] + spark = started_cluster_iceberg_with_spark.spark_session + TABLE_NAME = "test_multi_arg_bucket_" + storage_type + "_" + get_uuid_str() + + spark.sql( + f""" + CREATE TABLE {TABLE_NAME} ( + id INT, + region STRING, + value DOUBLE + ) + USING iceberg + PARTITIONED BY (bucket(16, id, region)) + TBLPROPERTIES ('format-version' = '3') + """ + ) + + spark.sql( + f""" + INSERT INTO {TABLE_NAME} VALUES + (1, 'us-east', 10.0), + (2, 'eu-west', 20.0), + (3, 'us-east', 30.0), + (4, 'ap-south', 40.0) + """ + ) + + default_upload_directory( + started_cluster_iceberg_with_spark, + storage_type, + f"/iceberg_data/default/{TABLE_NAME}/", + f"/iceberg_data/default/{TABLE_NAME}/", + ) + + create_iceberg_table( + storage_type, + instance, + TABLE_NAME, + started_cluster_iceberg_with_spark, + ) + + result = instance.query( + f"SELECT id, region, value FROM {TABLE_NAME} ORDER BY id" + ) + expected = "1\tus-east\t10\n2\teu-west\t20\n3\tus-east\t30\n4\tap-south\t40\n" + assert result == expected + + file_count = int( + instance.query( + f"SELECT count() FROM system.iceberg_files " + f"WHERE database = currentDatabase() AND table = '{TABLE_NAME}'" + ).strip() + ) + assert file_count > 0 + + +@pytest.mark.parametrize("storage_type", ["s3", "local"]) +def test_multi_arg_bucket_partition_via_table_function( + started_cluster_iceberg_with_spark, storage_type +): + """Same as above but reads through the table function instead of an engine table.""" + instance = started_cluster_iceberg_with_spark.instances["node1"] + spark = started_cluster_iceberg_with_spark.spark_session + TABLE_NAME = ( + "test_multi_arg_bucket_tf_" + storage_type + "_" + get_uuid_str() + ) + + spark.sql( + f""" + CREATE TABLE {TABLE_NAME} ( + id INT, + region STRING, + value DOUBLE + ) + USING iceberg + PARTITIONED BY (bucket(16, id, region)) + TBLPROPERTIES ('format-version' = '3') + """ + ) + + spark.sql( + f""" + INSERT INTO {TABLE_NAME} VALUES + (10, 'us-west', 100.0), + (20, 'eu-central', 200.0), + (30, 'ap-east', 300.0) + """ + ) + + default_upload_directory( + started_cluster_iceberg_with_spark, + storage_type, + f"/iceberg_data/default/{TABLE_NAME}/", + f"/iceberg_data/default/{TABLE_NAME}/", + ) + + expression = get_creation_expression( + storage_type, + TABLE_NAME, + started_cluster_iceberg_with_spark, + table_function=True, + ) + + result = instance.query( + f"SELECT id, region, value FROM {expression} ORDER BY id" + ) + expected = "10\tus-west\t100\n20\teu-central\t200\n30\tap-east\t300\n" + assert result == expected + + row_count = int( + instance.query(f"SELECT count() FROM {expression}").strip() + ) + assert row_count == 3 diff --git a/tests/queries/0_stateless/03362_basic_auth_interactive_not_with_authorization_never.reference b/tests/queries/0_stateless/03362_basic_auth_interactive_not_with_authorization_never.reference index 5d99d26a414a..915255185e1c 100644 --- a/tests/queries/0_stateless/03362_basic_auth_interactive_not_with_authorization_never.reference +++ b/tests/queries/0_stateless/03362_basic_auth_interactive_not_with_authorization_never.reference @@ -1,3 +1,2 @@ -1 +1 < HTTP/1.1 403 Forbidden -If you use ClickHouse Cloud, the password can be reset at https://clickhouse.cloud/ diff --git a/tests/queries/0_stateless/03362_basic_auth_interactive_not_with_authorization_never.sh b/tests/queries/0_stateless/03362_basic_auth_interactive_not_with_authorization_never.sh index 4a95f67bbe44..f7301a949aad 100755 --- a/tests/queries/0_stateless/03362_basic_auth_interactive_not_with_authorization_never.sh +++ b/tests/queries/0_stateless/03362_basic_auth_interactive_not_with_authorization_never.sh @@ -11,4 +11,4 @@ ${CLICKHOUSE_CURL} -H 'Authorization: never' "$URL?query=SELECT%201" # If the Authorization is set to "never", and the credentials are provided in URL parameters, # the server will return 403 instead of 401 Unauthorized, so there will be no prompt in the browser. URL="${CLICKHOUSE_PORT_HTTP_PROTO}://${CLICKHOUSE_HOST}:${CLICKHOUSE_PORT_HTTP}/?user=default&password=invalid_password" -${CLICKHOUSE_CURL} -H 'Authorization: never' -v "$URL?query=SELECT%201" 2>&1 | grep -P '403 Forbidden|ClickHouse Cloud' +${CLICKHOUSE_CURL} -H 'Authorization: never' -v "$URL?query=SELECT%201" 2>&1 | grep -P '403 Forbidden' | tr -d '\r' From 775fb3c88cc99f2fcfd23f4f9177554e2beda39d Mon Sep 17 00:00:00 2001 From: Kanthi Subramanian Date: Fri, 11 Sep 2026 18:49:47 +0200 Subject: [PATCH 2/3] Remove unrelated files --- .../configs/config.d/cache_54176.xml | 9 -- .../test_multi_arg_transforms.py | 134 ------------------ 2 files changed, 143 deletions(-) delete mode 100644 tests/integration/test_storage_iceberg_with_spark/configs/config.d/cache_54176.xml delete mode 100644 tests/integration/test_storage_iceberg_with_spark/test_multi_arg_transforms.py diff --git a/tests/integration/test_storage_iceberg_with_spark/configs/config.d/cache_54176.xml b/tests/integration/test_storage_iceberg_with_spark/configs/config.d/cache_54176.xml deleted file mode 100644 index 5f8b181ec554..000000000000 --- a/tests/integration/test_storage_iceberg_with_spark/configs/config.d/cache_54176.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - 1Gi - cache_54176 - - - diff --git a/tests/integration/test_storage_iceberg_with_spark/test_multi_arg_transforms.py b/tests/integration/test_storage_iceberg_with_spark/test_multi_arg_transforms.py deleted file mode 100644 index 13d8ed07b112..000000000000 --- a/tests/integration/test_storage_iceberg_with_spark/test_multi_arg_transforms.py +++ /dev/null @@ -1,134 +0,0 @@ -import pytest - -from helpers.iceberg_utils import ( - create_iceberg_table, - default_upload_directory, - get_creation_expression, - get_uuid_str, -) - - -@pytest.mark.parametrize("storage_type", ["s3", "local"]) -def test_multi_arg_bucket_partition( - started_cluster_iceberg_with_spark, storage_type -): - """Iceberg v3 multi-argument partition transform: bucket over two columns. - - Verifies that ClickHouse can read a table whose partition spec uses - ``source-ids`` (multiple source columns) instead of a single ``source-id``. - Per the Iceberg v3 spec, readers must handle unknown transforms by ignoring - the unsupported partition fields when filtering. - """ - instance = started_cluster_iceberg_with_spark.instances["node1"] - spark = started_cluster_iceberg_with_spark.spark_session - TABLE_NAME = "test_multi_arg_bucket_" + storage_type + "_" + get_uuid_str() - - spark.sql( - f""" - CREATE TABLE {TABLE_NAME} ( - id INT, - region STRING, - value DOUBLE - ) - USING iceberg - PARTITIONED BY (bucket(16, id, region)) - TBLPROPERTIES ('format-version' = '3') - """ - ) - - spark.sql( - f""" - INSERT INTO {TABLE_NAME} VALUES - (1, 'us-east', 10.0), - (2, 'eu-west', 20.0), - (3, 'us-east', 30.0), - (4, 'ap-south', 40.0) - """ - ) - - default_upload_directory( - started_cluster_iceberg_with_spark, - storage_type, - f"/iceberg_data/default/{TABLE_NAME}/", - f"/iceberg_data/default/{TABLE_NAME}/", - ) - - create_iceberg_table( - storage_type, - instance, - TABLE_NAME, - started_cluster_iceberg_with_spark, - ) - - result = instance.query( - f"SELECT id, region, value FROM {TABLE_NAME} ORDER BY id" - ) - expected = "1\tus-east\t10\n2\teu-west\t20\n3\tus-east\t30\n4\tap-south\t40\n" - assert result == expected - - file_count = int( - instance.query( - f"SELECT count() FROM system.iceberg_files " - f"WHERE database = currentDatabase() AND table = '{TABLE_NAME}'" - ).strip() - ) - assert file_count > 0 - - -@pytest.mark.parametrize("storage_type", ["s3", "local"]) -def test_multi_arg_bucket_partition_via_table_function( - started_cluster_iceberg_with_spark, storage_type -): - """Same as above but reads through the table function instead of an engine table.""" - instance = started_cluster_iceberg_with_spark.instances["node1"] - spark = started_cluster_iceberg_with_spark.spark_session - TABLE_NAME = ( - "test_multi_arg_bucket_tf_" + storage_type + "_" + get_uuid_str() - ) - - spark.sql( - f""" - CREATE TABLE {TABLE_NAME} ( - id INT, - region STRING, - value DOUBLE - ) - USING iceberg - PARTITIONED BY (bucket(16, id, region)) - TBLPROPERTIES ('format-version' = '3') - """ - ) - - spark.sql( - f""" - INSERT INTO {TABLE_NAME} VALUES - (10, 'us-west', 100.0), - (20, 'eu-central', 200.0), - (30, 'ap-east', 300.0) - """ - ) - - default_upload_directory( - started_cluster_iceberg_with_spark, - storage_type, - f"/iceberg_data/default/{TABLE_NAME}/", - f"/iceberg_data/default/{TABLE_NAME}/", - ) - - expression = get_creation_expression( - storage_type, - TABLE_NAME, - started_cluster_iceberg_with_spark, - table_function=True, - ) - - result = instance.query( - f"SELECT id, region, value FROM {expression} ORDER BY id" - ) - expected = "10\tus-west\t100\n20\teu-central\t200\n30\tap-east\t300\n" - assert result == expected - - row_count = int( - instance.query(f"SELECT count() FROM {expression}").strip() - ) - assert row_count == 3 From 711db17960129b4d6243e158823d705a345c56e7 Mon Sep 17 00:00:00 2001 From: Kanthi Subramanian Date: Fri, 11 Sep 2026 20:39:11 +0200 Subject: [PATCH 3/3] Fix line endings in test reference Signed-off-by: Kanthi Subramanian --- ...ic_auth_interactive_not_with_authorization_never.reference | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/queries/0_stateless/03362_basic_auth_interactive_not_with_authorization_never.reference b/tests/queries/0_stateless/03362_basic_auth_interactive_not_with_authorization_never.reference index 915255185e1c..92b24e73bca6 100644 --- a/tests/queries/0_stateless/03362_basic_auth_interactive_not_with_authorization_never.reference +++ b/tests/queries/0_stateless/03362_basic_auth_interactive_not_with_authorization_never.reference @@ -1,2 +1,2 @@ -1 -< HTTP/1.1 403 Forbidden +1 +< HTTP/1.1 403 Forbidden