MySQL과의 호환성을 높이기 위해 함수 locate는 이제 기본적으로 (needle, haystack[, start_pos]) 형식의 인수 순서를 사용합니다. 이전 동작인 (haystack, needle, [, start_pos])는 function_locate_has_mysql_compatible_argument_order = 0을 설정하여 복원할 수 있습니다. #61092 (Robert Schulze).
사용되지 않는 메모리 내(in-memory) 데이터 파트는 23.5 버전부터 사용 중단(deprecated)되었으며, 23.10 버전부터는 더 이상 지원되지 않습니다. 이제 남아 있던 관련 코드가 제거되었습니다. #55186 및 #45409의 후속 작업입니다. 메모리 내 데이터 파트는 23.5 버전 이전에만 사용 가능했고, 또한 MergeTree 테이블에 대해 해당 SETTINGS를 수동으로 지정해 직접 활성화한 경우에만 사용되었기 때문에 메모리 내 데이터 파트를 사용했을 가능성은 낮습니다. 메모리 내 데이터 파트가 있는지 확인하려면 다음 쿼리를 실행하십시오: SELECT part_type, count() FROM system.parts GROUP BY part_type ORDER BY part_type. 메모리 내 데이터 파트 사용을 비활성화하려면 ALTER TABLE ... MODIFY SETTING min_bytes_for_compact_part = DEFAULT, min_rows_for_compact_part = DEFAULT를 실행하십시오. 이전 ClickHouse 릴리스에서 업그레이드하기 전에 먼저 메모리 내 데이터 파트가 없는지 확인하십시오. 메모리 내 데이터 파트가 있다면 먼저 이를 비활성화한 뒤, 메모리 내 데이터 파트가 더 이상 존재하지 않게 될 때까지 기다린 다음 업그레이드를 계속하십시오. #61127 (Alexey Milovidov).
기본적으로 MergeTree 테이블의 ORDER BY 절에서 SimpleAggregateFunction 사용을 금지합니다. 이는 AggregateFunction이 금지된 것과 유사하지만, SimpleAggregateFunction은 비교가 불가능하기 때문에 금지됩니다. 이를 허용하려면 allow_suspicious_primary_key를 사용하십시오. #61399 (Azat Khuzhin).
ClickHouse의 String 데이터 타입은 주로 UTF-8 텍스트를 저장하지만, 임의의 이진 데이터도 허용합니다. Parquet/ORC/Arrow의 String은 UTF-8만 지원합니다. 따라서 ClickHouse String 데이터 타입에 대해 Arrow에서 사용할 데이터 타입을 String으로 할지 Binary로 할지 선택할 수 있습니다. 이는 output_format_parquet_string_as_string, output_format_orc_string_as_string, output_format_arrow_string_as_string 설정으로 제어됩니다. 엄밀성과 호환성 측면에서는 Binary가 더 적합하지만, 기본값을 String으로 사용하는 것이 대부분의 경우 사용자 기대에 더 잘 부합합니다. Parquet/ORC/Arrow는 lz4와 zstd를 포함한 다양한 압축 방식을 지원합니다. ClickHouse는 이 모든 압축 방식을 지원합니다. 일부 품질이 낮은 도구는 더 빠른 lz4 압축 방식을 지원하지 못하므로, 기본값을 zstd로 설정합니다. 이는 output_format_parquet_compression_method, output_format_orc_compression_method, output_format_arrow_compression_method 설정으로 제어됩니다. Parquet과 ORC에 대해서는 기본값을 zstd로 변경했지만, Arrow에 대해서는 변경하지 않았습니다(저수준 사용을 위해 Arrow에서는 기본값을 그대로 유지합니다). #61817 (Alexey Milovidov).
materialized view 보안 이슈에 대한 수정입니다. 이 이슈로 인해 사용자에게 필요한 권한이 없어도 테이블에 데이터를 삽입할 수 있었습니다. 이 수정을 통해 이제 사용자가 materialized view 에만 아니라 그 아래에 있는 모든 기반 테이블에도 데이터를 삽입할 권한이 있는지 검증합니다. 이는 이전에는 정상적으로 동작하던 일부 쿼리가 이제는 「Not enough privileges」 오류와 함께 실패할 수 있음을 의미합니다. 이 문제를 해결하기 위해, 이 릴리스에서는 뷰에 대한 SQL security 기능을 새로 도입했습니다. https://clickhouse.com/docs/sql-reference/statements/create/view#sql_security. #54901 (pufit)
값의 개수와 해당 오차를 반환하는 Topk/topkweighed 지원 모드가 추가되었습니다. #54508 (UnamedRus).
view/materialized view에서 definer 사용자를 지정할 수 있는 새로운 구문이 추가되었습니다. 이를 통해 기저 테이블에 대한 명시적인 권한 부여 없이도 view에서 SELECT/INSERT를 실행할 수 있습니다. #54901 (pufit).
서로 다른 종류의 MergeTree 테이블을 Replicated 엔진으로 자동 변환하는 기능이 추가되었습니다. 테이블의 데이터 디렉터리(/clickhouse/store/xxx/xxxyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy/)에 빈 convert_to_replicated 파일을 생성하면 다음 서버 시작 시 해당 테이블이 자동으로 변환됩니다. #57798 (Kirill).
테이블 함수 mergeTreeIndex가 추가되었습니다. 이 함수는 MergeTree 테이블의 인덱스와 마크 파일 내용을 나타내며, 내부 구조를 살펴보는 용도로 사용할 수 있습니다. 문법: mergeTreeIndex(database, table, [with_marks = true]) 여기서 database.table은 MergeTree 엔진을 사용하는 기존 테이블입니다. #58140 (Anton Popov).
file/s3/hdfs/url/azureBlobStorage 엔진에서 스키마 추론 중 파일 포맷이 알려져 있지 않은 경우 자동으로 감지하도록 시도합니다. #50576을(를) 해결합니다. #59092 (Kruglov Pavel).
generate_series를 테이블 FUNCTION으로 추가합니다. 이 FUNCTION은 자연수 등차수열을 갖는 테이블을 생성합니다. #59390 (divanik).
빈 파티션과 관련된 ZooKeeper 노드를 제거하는 ALTER TABLE table FORGET PARTITION partition 쿼리가 추가되었습니다. #59507 (Sergei Trifonov).
코덱 LZ4HC는 이전 최소 수준인 3보다 빠르지만 압축률이 낮은 새로운 레벨 2를 지원합니다. 이전 버전에서는 LZ4HC(2) 이하의 설정은 모두 LZ4HC(3)와 동일했습니다. 작성자: Cyan4973. #60090 (Alexey Milovidov).
DNS 문제를 디버깅하는 데 유용한 system.dns_cache 테이블이 구현되었습니다. 새로운 서버 설정 dns_cache_max_size가 추가되었습니다. #60257 (Kirill Nikiforov).
DateTime 또는 DateTime64 타입의 값에서 밀리초 단위를 반환하는 함수 toMillisecond가 추가되었습니다. #60281 (Shaun Struwig).
merge 테이블 FUNCTION에서 merge(['db_name', ] 'tables_regexp') 형태의 단일 인자 버전을 지원합니다. #60372 (豪肥肥).
Tsv, TSV, tsv, rowbinary처럼 모든 포맷 이름에서 대소문자를 구분하지 않도록 했습니다. #60420 (豪肥肥).
view/materialized view에서 definer USER를 지정할 수 있는 새로운 구문이 추가되었습니다. 이를 통해 기저 테이블에 대한 별도의 권한 부여 없이도 뷰에서 SELECT/INSERT를 실행할 수 있습니다. #60439 (pufit).
StorageMemory(memory-engine)에 min_bytes_to_keep, max_bytes_to_keep, min_rows_to_keep 및 max_rows_to_keep 4개의 속성을 추가합니다 - 새로운 변경 사항을 반영하도록 테스트를 추가합니다 - memory.md 문서를 업데이트합니다 - 테이블 파라미터 경계값에 접근할 수 있도록 MemorySink에 테이블 context 속성을 추가합니다. #60612 (Jake Bamrah).
DateTime 또는 DateTime64 타입 값에서 밀리초 부분을 반환하는 toMillisecond 함수가 추가되었습니다. #60649 (Robert Schulze).
대기 중인 쿼리와 실행 중인 쿼리 개수에 대해 별도의 제한을 도입했습니다. 새 서버 설정 max_waiting_queries가 추가되어 async_load_databases로 인해 대기 중인 쿼리 개수를 제한합니다. 기존의 실행 중인 쿼리 개수 제한에는 더 이상 대기 중인 쿼리가 포함되지 않습니다. #61053 (Sergei Trifonov).
테이블의 기본 키는 최초 접근 시 지연 로드 방식으로 메모리에 적재됩니다. 이는 기본적으로 활성화되어 있는 새로운 MergeTree SETTING primary_key_lazy_load에 의해 제어됩니다. 이 기능에는 몇 가지 장점이 있습니다: - 사용되지 않는 테이블에 대해서는 기본 키가 로드되지 않습니다; - 메모리가 충분하지 않은 경우 서버 시작 시점이 아니라 최초 사용 시 예외가 발생합니다. 한편 다음과 같은 단점도 있습니다: - 연결을 수락하기 전이 아니라 첫 번째 쿼리 실행 시에 기본 키를 로드하는 지연 시간이 발생하며, 이로 인해 이론적으로 thundering-herd 문제가 발생할 수 있습니다. 이 변경으로 #11188가 해결되었습니다. #60093 (Alexey Milovidov).
테이블의 기본 키에 대부분 쓸모없는 컬럼이 포함되어 있는 경우, 해당 컬럼들을 메모리에 유지하지 않도록 할 수 있습니다. 이는 기본값이 0.9인 새로운 설정 primary_key_ratio_of_unique_prefix_values_to_skip_suffix_columns으로 제어되며, 이 설정은 다음을 의미합니다. 복합 기본 키에서 어떤 컬럼의 값이 전체 경우의 최소 0.9(90%) 비율 이상에서 변경되는 경우, 그 뒤에 오는 컬럼들은 로드되지 않습니다. #60255 (Alexey Milovidov).
result_type의 기저 타입이 숫자인 경우 multiIf 함수를 열 지향 방식으로 실행합니다. #60384 (李扬).
그림 1에서 보듯이, "&&"를 "&"로 대체하면 SIMD 코드가 생성됩니다. 그림 1. '&&'(왼쪽)과 '&'(오른쪽)을 사용해 컴파일한 코드. #60498 (Zhiguo Zhou).
구문 오류가 있는 쿼리에 정규 표현식을 사용하는 COLUMNS matcher가 포함되어 있을 경우, 정규 표현식이 한 번만 컴파일되는 대신 파서의 백트래킹이 일어날 때마다 매번 컴파일되었습니다. 이는 근본적인 오류였습니다. 컴파일된 정규식 객체는 AST에 저장되었습니다. 그러나 AST에서 문자 A는 「abstract」를 의미하며, 이는 AST가 무거운 객체를 포함해서는 안 된다는 뜻입니다. AST의 일부는 파싱 중에 생성되었다가 폐기될 수 있으며, 이 과정에는 많은 양의 백트래킹이 포함될 수 있습니다. 이로 인해 파싱 단계가 느려지고, 결과적으로 읽기 전용 USER에 의한 DoS를 허용하게 됩니다. 그러나 더 큰 문제는 이것이 퍼저(fuzzer)의 진행을 방해한다는 점입니다. #61543 (Alexey Milovidov).
materialized view에서 MODIFY COLUMN 쿼리를 실행할 때는 내부 테이블의 구조를 확인하여 모든 컬럼이 존재하는지 검증합니다. #47427 (sunny).
파서에서 사용되는 모든 키워드를 포함하는 테이블 system.keywords가 추가되었습니다. 이 테이블은 주로 퍼징(fuzzing) 및 구문 강조(syntax highlighting)를 개선하는 데 사용됩니다. #51808 (Nikita Mikhaylov).
analyzer가 CREATE PARAMETERIZED VIEW 문을 분석하지 않도록 파라미터화된 VIEW에 대한 지원을 추가했습니다. 또한 기존 파라미터화된 VIEW 로직을 리팩터링하여 CREATE PARAMETERIZED VIEW 문을 분석하지 않도록 했습니다. #54211 (SmitaRKulkarni).
일반 데이터베이스 엔진은 사용이 중단되었습니다. 서버에서 이를 사용 중이면 clickhouse-client에서 경고 메시지가 표시됩니다. 이 변경으로 #52229가 해결되었습니다. #56942 (shabroo).
테이블이 드롭될 때 해당 테이블과 관련된 zero copy 락은 모두 삭제해야 합니다. 이러한 락이 포함된 디렉터리도 함께 제거해야 합니다. #57575 (Sema Checherinda).
dictGetOrDefault 함수에 단락(short-circuit) 기능을 추가했습니다. #52098 이슈를 해결했습니다. #57767 (jsc0218).
DEFAULT 또는 MATERIALIZED 식이 있는 컬럼에 대해 ALTER COLUMN MATERIALIZE를 실행하면 이제 올바른 값이 기록됩니다. 기본값이 정의된 기존 파트에는 해당 기본값이, 기본값이 아닌 값이 정의된 기존 파트에는 그 값이 기록됩니다. 이전에는 모든 기존 파트에 기본값이 기록되었습니다. #58023 (Duc Canh Le).
백오프 로직(예: 지수 백오프)을 도입했습니다. 이를 통해 CPU 사용량, 메모리 사용량 및 로그 파일 크기를 줄일 수 있습니다. #58036 (MikhailBurdukov).
머지 대상 파트를 선택할 때 경량한 삭제가 적용된 행을 고려하도록 했습니다. #58223 (Zhuo Qiu).
storage_configuration에서 volume_priority를 정의할 수 있게 되었습니다. #58533 (Andrey Zvonov).
이제 PREWHERE에서 가상 컬럼을 사용할 수 있습니다. 특히 _part_offset과 같은 상수가 아닌(non-const) 가상 컬럼에 유용합니다. #59033 (Amos Bird).
Distributed 테이블 엔진에 대한 설정을 이제 서버 설정 파일에서 지정할 수 있습니다(MergeTree 설정과 유사). 예: <distributed> <flush_on_detach>false</flush_on_detach> </distributed>. #59291 (Azat Khuzhin).
상수 키를 사용하던 방식에서 변경되어, 이제는 객체 스토리지가 객체 삭제 가능 여부를 결정하는 키를 자체적으로 생성합니다. #59495 (Sema Checherinda).
기본적으로 지수 표기법으로 표현된 부동 소수점 수를 추론하지 않습니다. 이전 동작을 복원하는 input_format_try_infer_exponent_floats 설정을 추가했습니다(기본값은 비활성화입니다). #59476를 해결합니다. #59500 (Kruglov Pavel).
ALTER 연산을 괄호로 감쌀 수 있도록 허용합니다. 괄호 출력 여부는 format_alter_operations_with_parentheses 설정으로 제어할 수 있습니다. 기본적으로 서식이 지정된 쿼리에서는, 일부 위치에서 서식이 지정된 ALTER 연산을 메타데이터(예: 뮤테이션)로 저장하기 때문에 괄호가 출력됩니다. 새 구문은 ALTER 연산이 목록으로 끝나는 일부 쿼리를 더 명확하게 해 줍니다. 예를 들어 ALTER TABLE x MODIFY TTL date GROUP BY a, b, DROP COLUMN c 쿼리는 기존 구문으로는 올바르게 파싱할 수 없습니다. 새 구문에서는 ALTER TABLE x (MODIFY TTL date GROUP BY a, b), (DROP COLUMN c) 쿼리가 명확합니다. 이전 버전은 새 구문을 읽을 수 없으므로, 새 구문을 사용하면 신규 및 구버전 ClickHouse가 단일 클러스터에 혼재된 경우 문제가 발생할 수 있습니다. #59532 (János Benjamin Antal).
codec DEFLATE_QPL에서 사용하는 Intel QPL 버전을 v1.3.1에서 v1.4.0으로 업데이트했습니다. 또한 폴링 타임아웃 메커니즘의 버그를 수정했습니다. 일부 상황에서 타임아웃이 제대로 동작하지 않아, 타임아웃이 발생하면 IAA와 CPU가 동시에 버퍼를 처리할 수 있음을 관찰했습니다. 현재로서는 IAA 코덱 상태가 QPL_STS_BEING_PROCESSED가 아님을 반드시 확인한 다음, SW 코덱으로 폴백(fallback)하는 것이 좋습니다. #59551 (jasperzhu).
libhdfs3에 위치 기반 pread 기능을 추가했습니다. libhdfs3에서 위치 기반 읽기(positional read)를 호출하려면 다음과 같이 hdfs.h의 hdfsPread 함수를 사용하십시오. tSize hdfsPread(hdfsFS fs, hdfsFile file, void * buffer, tSize length, tOffset position);. #59624 (M1eyu).
사용자가 max_parser_depth 설정을 매우 큰 값으로 잘못 설정한 경우에도 파서에서 스택 오버플로 발생 여부를 검사합니다. 이를 통해 #59622 이슈가 해결됩니다. #59697 (Alexey Milovidov).
새 구성 설정 backups.remove_backup_files_after_failure를 추가합니다: <clickhouse> <backups> <remove_backup_files_after_failure>true</remove_backup_files_after_failure> </backups> </clickhouse>. #60002 (Vitaly Baranov).
RESTORE 명령 실행 시 백업에서 테이블 메타데이터를 읽을 때 여러 스레드를 사용하도록 했습니다. #60040 (Vitaly Baranov).
이제 StorageBuffer의 세그먼트가 1개보다 많으면 (num_layers > 1), 백그라운드 플러시는 여러 스레드에서 모든 세그먼트에 대해 동시에 수행됩니다. #60111 (alesapin).
Variant 값에 대한 비교 연산자를 구현하고, Variant 컬럼에 Field를 올바르게 삽입하도록 했습니다. 기본적으로 유사한 variant 타입들로 Variant 타입을 생성하는 것은 허용되지 않으며(SETTING allow_suspicious_variant_types를 통해 예외적으로 허용할 수 있습니다). #59996를 종료합니다. #59850를 종료합니다. #60198 (Kruglov Pavel).
가상 컬럼의 전반적인 사용성이 개선되었습니다. 이제 _part_offset과 같은 비상수 가상 컬럼도 PREWHERE에서 사용할 수 있습니다. 또한 describe_include_virtual_columns 설정을 활성화하면 DESCRIBE 쿼리에서 컬럼 주석으로 가상 컬럼에 대한 내장 문서를 확인할 수 있습니다. #60205 (Anton Popov).
DETACH/서버 종료 시 및 SYSTEM FLUSH DISTRIBUTED 실행 시 Distributed 엔진의 대기 중인 INSERT 블록을 병렬로 flush합니다 (병렬 처리는 테이블에 다중 디스크 정책이 설정된 경우에만 동작하며, 이는 현재 Distributed 엔진의 다른 동작과 동일합니다). #60225 (Azat Khuzhin).
joinRightColumnsSwitchNullability에서 필터 설정이 잘못되어 있는 문제를 수정합니다. #59625. #60259 (lgbo).
MySQL 포트를 통한 연결은 이제 QuickSight를 기본적으로(out-of-the-box) 지원하기 위해 prefer_column_name_to_alias = 1 설정이 자동으로 적용됩니다. 또한 mysql_map_string_to_text_in_show_columns 및 mysql_map_fixed_string_to_text_in_show_columns 설정이 이제 기본값으로 활성화되며, 이들 역시 MySQL 연결에만 영향을 줍니다. 이를 통해 더 많은 BI 도구와의 호환성이 향상됩니다. #60365 (Robert Schulze).
출력 포맷이 Pretty 형식으로 설정되어 있고 블록이 값이 100만을 초과하는 단일 숫자 값 하나로만 구성되는 경우, 테이블 오른쪽에 사람이 읽기 쉬운 숫자가 함께 출력됩니다. 예: ┌──────count()─┐ │ 233765663884 │ -- 233.77 billion └──────────────┘. #60379 (rogeryk).
clickhouse-server용 HTTP 리디렉션 핸들러를 구성할 수 있습니다. 예를 들어 /를 Play UI로 리디렉션하도록 설정할 수 있습니다. #60390 (Alexey Milovidov).
모호성을 줄이기 위해 서버 설정 이름을 dns_cache_max_size에서 dns_cache_max_entries로 변경했습니다. #60500 (Kirill Nikiforov).
SHOW INDEX | INDEXES | INDICES | KEYS가 더 이상 기본 키 컬럼 순서로 정렬하지 않습니다(이전 동작은 직관적이지 않았습니다). #60514 (Robert Schulze).
Keeper 개선: 데이터 손실을 방지하기 위해 유효하지 않은 스냅샷이 탐지되면 시작 과정에서 중단되도록 했습니다. #60537 (Antonio Andelic).
merge_tree_read_split_ranges_into_intersecting_and_non_intersecting_fault_probability SETTING을 사용하여 MergeTree 읽기 분할 범위에 교차 및 비교차 장애 주입 기능을 추가했습니다. #60548 (Maksim Kita).
Advanced 대시보드에서는 이제 스크롤해도 컨트롤이 항상 표시됩니다. 이를 통해 위로 다시 스크롤하지 않고도 새 차트를 추가할 수 있습니다. #60692 (Alexey Milovidov).
String 타입과 Enum은 배열, UNION 쿼리, 조건식 등과 같은 동일한 문맥에서 사용할 수 있습니다. 이로써 #60726이(가) 해결되었습니다. #60727 (Alexey Milovidov).
Keeper 개선: Keeper 설정에 leadership_expiry_ms 지원이 추가되었습니다. #60806 (Brokenice0415).
input_format_try_infer_exponent_floats 설정과 관계없이 JSON 형식에서 항상 지수 표기 숫자를 자동으로 추론합니다. JSON 객체에서 named Tuples를 추론하는 동안 예외를 발생시키는 대신 모호한 경로에 대해 String 타입을 사용할 수 있도록 하는 설정 input_format_json_use_string_type_for_ambiguous_paths_in_named_tuples_inference_from_objects를 추가했습니다. #60808 (Kruglov Pavel).
SMJ에서 null을 최댓값/최솟값으로 처리하도록 하는 플래그를 추가합니다. 이를 통해 Apache Spark와 같은 다른 SQL 시스템과의 동작 방식이 호환되도록 합니다. #60896 (loudongfeng).
액세스 검사 로직이 개선되어, 대상 사용자에게 실제로 해당 권한이 부여되어 있지 않더라도 권한을 회수할 수 있습니다. 예: ```sql GRANT SELECT ON . TO user1; REVOKE SELECT ON system.* FROM user1;. #61115 (pufit).
이제 서브트리 <include from_zk="/path" merge="true">에 대한 구성 치환(config substitutions)에서 merge="true" 속성을 지정할 수 있습니다. 이 속성을 지정하면 ClickHouse는 기존 구성과 해당 서브트리를 병합하며, 지정하지 않으면 기본 동작으로 구성이 끝에 새 내용을 추가합니다. #61299 (alesapin).
이제 외부 메모리 정렬과 외부 메모리 GROUP BY와 같이 임시 데이터를 생성하는 모든 경우에 temporary_files_codec 설정을 사용할 수 있습니다. 이전에는 partial_merge JOIN 알고리즘에서만 동작했습니다. #61456 (Maksim Kita).
Azure Blob Storage를 사용할 때 백업 IO용으로 관리 ID를 사용하도록 했습니다. 스토리지 계정 수준 권한이 필요한 존재하지 않는 컨테이너를 ClickHouse가 생성하려고 시도하지 않도록 하는 설정을 추가했습니다. #61785 (Daniel Pozo Escalona).
SHOW CREATE TABLE 쿼리 결과처럼 결과 집합에 값이 하나만 있는 경우, Pretty 포맷에서는 긴 값이 잘리지 않습니다. #61795 (Alexey Milovidov).
clickhouse-local과 마찬가지로 clickhouse-client도 --format 옵션과 동일하게 사용할 수 있는 옵션으로 --output-format 옵션을 지원합니다. 이를 통해 #59848가 해결되었습니다. #61797 (Alexey Milovidov).
stdout이 터미널이고 출력 형식이 지정되지 않은 경우, clickhouse-client 및 유사한 도구는 인터랙티브 모드와 마찬가지로 기본적으로 PrettyCompact를 사용합니다. clickhouse-client와 clickhouse-local은 입력 및 출력 형식에 대한 커맨드라인 인자를 일관된 방식으로 처리합니다. 이 변경으로 #61272가 해결되었습니다. #61800 (Alexey Milovidov).
읽기 편의성을 높이기 위해 Pretty 포맷에서 숫자 그룹을 밑줄로 구분하도록 했습니다. 이는 새 설정인 output_format_pretty_highlight_digit_groups로 제어됩니다. #61802 (Alexey Milovidov).