formatter에서 별칭(alias)을 잘못 치환하여 발생한 일관성 없는 서식을 수정합니다. 이 변경으로 #82833이(가) 해결됩니다. #82832도 해결됩니다. #68296도 해결됩니다. 이 변경으로 인해 잠재적인 하위 호환성 문제가 발생할 수 있습니다. analyzer가 비활성화된 경우, IN 절에서 별칭을 참조하는 일부 CREATE VIEW 쿼리는 처리되지 않습니다. 이러한 비호환성을 방지하려면 analyzer를 활성화해야 합니다(24.3부터 기본값으로 활성화되어 있습니다). #82838 (Alexey Milovidov).
코덱 DEFLATE_QPL 및 ZSTD_QAT가 제거되었습니다. 업그레이드하기 전에 DEFLATE_QPL 또는 ZSTD_QAT로 압축된 기존 데이터를 다른 코덱으로 변환할 것을 권장합니다. 이 코덱들을 사용하려면 enable_deflate_qpl_codec 및 enable_zstd_qat_codec 설정을 활성화해야 했다는 점에 유의하십시오. #92150 (Robert Schulze).
system.query_log.exception에서 stderr 캡처를 활성화하여 UDF 디버깅이 개선되었습니다. 이전에는 UDF stderr가 파일에만 기록되고 쿼리 로그에는 노출되지 않아 디버깅이 불가능했습니다. 이제 stderr가 기본적으로 예외를 발생시키며, 예외를 던지기 전에 완전히 수집(최대 1MB)되므로, system.query_log.exception에 전체 Python traceback과 오류 메시지가 표시되어 효과적인 문제 해결이 가능합니다. #92209 (Xu Jia).
JOIN USING () 절에서 컬럼 목록이 비어 있는 경우 이제 구문 오류로 간주됩니다. 이전에는 쿼리 실행 중 INVALID_JOIN_ON_EXPRESSION이어야 했습니다. 그러나 Join 스토리지와 조인하는 경우와 같이 일부 상황에서는 LOGICAL_ERROR로 이어졌으며, 이 문제를 해결하여 #82502를 닫습니다. #92371 (Vladimir Cherkasov).
버그로 인해 사용할 수 없어 metric_log의 transposed_with_wide_view 모드를 제거했습니다. 이제 이 모드로 system.metric_log를 정의하는 것은 불가능합니다. 이는 #78412의 변경 사항을 부분적으로 되돌립니다. #93867 (Alexey Milovidov).
워크로드용 CPU 스케줄링은 이제 기본적으로 선점형으로 동작합니다. cpu_slot_preemption 서버 설정을 참조하십시오. #94060 (Sergei Trifonov).
손상된 파트가 생기지 않도록 인덱스 파일 이름을 이스케이프합니다. 이 변경으로 인해 이전 버전에서 생성된 인덱스 중 이름에 비-ASCII 문자가 포함된 것은 ClickHouse가 로드하지 못하게 됩니다. 이를 처리하려면 MergeTree 설정 escape_index_filenames을(를) 사용할 수 있습니다. #94079 (Raúl Marín).
포맷용 SETTING이던 exact_rows_before_limit, rows_before_aggregation, cross_to_inner_join_rewrite, regexp_dict_allow_hyperscan, regexp_dict_flag_case_insensitive, regexp_dict_flag_dotall, dictionary_use_async_executor는 이제 일반적인(포맷 전용이 아닌) SETTING으로 변경되었습니다. 이는 전적으로 내부적인 변경으로서, Iceberg, DeltaLake, Kafka, S3, S3Queue, Azure, Hive, RabbitMQ, Set, FileLog 또는 NATS 테이블 엔진 정의에서 이러한 SETTING을 명시적으로 지정한 (드문) 경우를 제외하면 사용자에게 보이는 영향은 없습니다. 이러한 경우, 이전에는 이 SETTING들이 무시되었지만 이제는 해당 정의가 오류를 발생시킵니다. #94106 (Robert Schulze).
joinGet/joinGetOrNull 함수는 이제 기반이 되는 Join 테이블에 대해 SELECT 권한을 요구합니다. 이 변경 이후에는 joinGet('db.table', 'column', key)를 실행하려면 Join 테이블에 정의된 키 컬럼과 조회되는 속성 컬럼 모두에 대해 SELECT 권한이 있어야 합니다. 이러한 권한이 없는 쿼리는 ACCESS_DENIED 오류와 함께 실패합니다. 마이그레이션을 위해 전체 테이블 단위 접근 권한이 필요하면 GRANT SELECT ON db.join_table TO user를, 컬럼 단위 접근 권한이 필요하면 GRANT SELECT(key_col, attr_col) ON db.join_table TO user를 사용하여 필요한 권한을 부여하십시오. 이 변경은 이전에 명시적인 SELECT 권한이 설정되지 않았던 joinGet/joinGetOrNull에 의존하는 모든 사용자와 애플리케이션에 영향을 줍니다. #94307 (Vladimir Cherkasov).
이제 CREATE TABLE ... AS ... 쿼리에 대해 SHOW COLUMNS 권한을 확인합니다. 이전에는 SHOW TABLES 권한을 확인했는데, 이 유형의 권한 검사에는 올바르지 않은 grant였습니다. #94556 (pufit).
Hash 출력 형식이 블록 크기와 무관하게 동작하도록 변경되었습니다. #94503 (Alexey Milovidov). 이로 인해 이전 버전과 비교했을 때 출력되는 해시 값이 달라진다는 점에 유의하십시오.
비동기 INSERT 중복 제거가 이제 의존하는 materialized view와 함께 동작합니다. block_id 충돌이 발생하면, 원래 블록에서 해당 block_id와 연결된 행을 제거하도록 필터링하고, 남은 행에 관련된 모든 materialized view의 SELECT 쿼리를 적용합니다. 이를 통해 충돌하는 행이 없는 원래 블록이 다시 생성됩니다. #89140 (Sema Checherinda). materialized view가 관련된 경우에도 비동기 INSERT와 함께 중복 제거를 사용할 수 있습니다. #93957 (Sema Checherinda).
Prometheus /metrics 엔드포인트에 주로 버전 정보를 담는 ClickHouse_Info 메트릭을 추가하여, 시간 경과에 따른 상세한 버전 정보를 추적하는 차트를 생성할 수 있도록 합니다. #91125 (Christoph Wurm).
클러스터 구성을 변경할 수 있도록 하는 Keeper용 새로운 네 글자 명령 rcfg를 도입합니다. 이 명령은 표준 reconfigure 요청보다 더 폭넓은 구성 변경을 지원합니다. 이 명령은 인자로 json 문자열을 받습니다. TCP 인터페이스로 전송되는 전체 바이트 시퀀스는 다음과 같은 형식이어야 합니다: rcfg{json_string_length_big_endian}{json_string}. 명령 예시는 다음과 같습니다: {"preconditions": {"leaders": [1, 2], "members": [1, 2, 3, 4, 5]}, "actions": [{"transfer_leadership": [3]}, {"remove_members": [1, 2]}, {"set_priority": [{"id": 4, "priority": 100}, {"id": 5, "priority": 100}]}, {"transfer_leadership": [4, 5]}, {"set_priority": [{"id": 3, "priority": 0}]}]}. #91354 (alesapin).
지정한 구분 기호로 분리된 문자열에서 각 부분 문자열의 순서를 뒤집는 reverseBySeparator FUNCTION을 추가합니다. #91463를 해결합니다. #91780 (Xuewei Wang).
삽입되는 블록의 구성을 더 세밀하게 제어할 수 있도록 하는 새로운 설정 max_insert_block_size_bytes가 추가되었습니다. #92833 (Kirill Kopnev).
ignore_on_cluster_for_replicated_database 설정이 활성화된 경우, 복제된 데이터베이스(Replicated database)에 대해 ON CLUSTER 절을 포함한 DDL 쿼리를 실행할 수 있습니다. 이때 클러스터 이름은 무시됩니다. #92872 (Kirill).
각 데이터 파트에 포함된 파일 수를 보여주는 files 컬럼을 system.parts 테이블에 추가합니다. #94337 (Match).
동시성 제어를 위해 max-min fair 스케줄러를 추가합니다. 많은 쿼리가 제한된 CPU 슬롯을 두고 경쟁하는 리소스 과할당 상태에서 더 나은 공정성을 제공합니다. 장시간 실행되는 쿼리가 시간이 지나며 더 많은 슬롯을 축적하더라도, 짧게 실행되는 쿼리가 불이익을 받지 않습니다. concurrent_threads_scheduler 서버 SETTING을 max_min_fair 값으로 설정하면 활성화됩니다. #94732 (Sergei Trifonov).
서버에 연결할 때 ClickHouse 클라이언트가 TLS SNI를 재정의할 수 있도록 했습니다. #89761 (Matt Klein).
해시 조인에서 오른쪽 입력이 비어 있는 경우 이제 왼쪽 입력 읽기를 건너뜁니다. 이전에는 비어 있지 않은 첫 번째 블록을 찾을 때까지 왼쪽 입력을 계속 읽었기 때문에, 필터링이나 집계가 많이 이루어지는 경우 불필요한 작업이 많이 발생할 수 있었습니다. #94062 (Alexander Gololobov).
쿼리 파이프라인 내부에서 데이터를 파티션으로 분할하기 위해 "fastrange" (Daniel Lemire) 방법을 사용합니다. 이를 통해 병렬 정렬 및 조인 작업이 개선될 수 있습니다. #93080 (Alexey Milovidov).
PARTITION BY 절이 정렬 키와 일치하거나 정렬 키의 접두사인 경우 윈도 함수 성능을 향상합니다. #87299 (Nikita Taranov).
FINAL 쿼리에서 사용되는 skip 인덱스가 기본 키의 일부인 컬럼에 설정되어 있는 경우, 다른 파트에서 기본 키 교집합을 확인하는 추가 단계를 수행할 필요가 없으므로 이제 수행되지 않습니다. #85897이(가) 해결되었습니다. #93899 (Shankar Iyer).
adaptive write buffer를 활성화하여 매우 많은 열을 가진 테이블에서 wide 파트를 사용할 때 INSERT/merge 작업의 메모리 사용량을 줄입니다. 암호화된 디스크에서도 adaptive write buffer를 지원합니다. #92250 (Azat Khuzhin).
텍스트 인덱스와 sparseGrams 토크나이저를 사용하는 전문 검색에서 인덱스에 대해 검색되는 토큰 수를 줄여 성능을 개선했습니다. #93078 (Anton Popov).
함수 isValidASCII는 모든 문자가 ASCII인 입력 값과 같이 검사가 통과하는 경우에 최적화되었습니다. #93347 (Robert Schulze).
read-in-order 최적화 기능이 이제 WHERE 조건으로 인해 ORDER BY 컬럼의 값이 상수임을 인식하여, 데이터를 역순으로 효율적으로 읽을 수 있습니다. 이로 인해 WHERE tenant='42' ORDER BY tenant, event_time DESC와 같은 멀티 테넌트 쿼리는 전체 정렬이 필요하지 않고 InReverseOrder를 사용한 역순 읽기를 활용할 수 있습니다. #94103 (matanper).
Enum AST 전용 클래스를 도입하여 값 파라미터를 ASTLiteral 자식 노드 대신 (문자열, 정수) 쌍으로 저장해 메모리 사용량을 최적화합니다. #94178 (Ilya Yatsishin).
여러 레플리카에 걸쳐 분산 인덱스 분석을 수행합니다. 공유 스토리지를 사용하는 클러스터에서 방대한 양의 데이터를 처리할 때 유용합니다. SharedMergeTree(ClickHouse Cloud)에 적용되며, 공유 스토리지를 사용하는 다른 유형의 MergeTree 테이블에도 적용될 수 있습니다. #86786 (Azat Khuzhin).
다음과 같은 경우 조인 런타임 필터를 비활성화하여 오버헤드를 줄입니다. - 블룸 필터에서 설정된 비트가 너무 많은 경우 - 런타임에 필터링되는 행 수가 너무 적은 경우. #91578 (Alexander Gololobov).
max_server_memory_usage 대비 더티 페이지 크기 비율이 memory_worker_purge_dirty_pages_threshold_ratio를 초과하면 jemalloc arena를 강제로 정리(purge)합니다. #93500 (Eduard Karacharov).
Iceberg 매니페스트 파일 엔트리에서 position delete에 해당하는 파일 이름의 하한과 상한을 파싱하여, 해당 데이터 파일을 보다 정확하게 선택할 수 있도록 했습니다. #93980 (Daniil Ivanik).
JSON 컬럼에서 동적 서브컬럼의 최대 개수를 제어하기 위한 두 가지 설정이 추가되었습니다. 첫 번째는 MergeTree 설정인 merge_max_dynamic_subcolumns_in_compact_part로, 이미 추가된 merge_max_dynamic_subcolumns_in_wide_part와 유사하며 Compact 파트로 머지하는 동안 생성되는 동적 서브컬럼의 개수를 제한합니다. 두 번째는 쿼리 수준 설정인 max_dynamic_subcolumns_in_json_type_parsing으로, JSON 데이터를 파싱하는 동안 생성되는 동적 서브컬럼의 개수를 제한하며, 이를 통해 INSERT 시 한도를 지정할 수 있습니다. #94184 (Pavel Kruglov).
프로덕션 환경 운영 경험을 바탕으로 스레드 풀 대기열 크기를 줄였습니다. MergeTree에서 어떤 데이터를 읽기 전에 메모리 사용량을 명시적으로 확인하는 검사를 추가했습니다. #94692 (Nikita Mikhaylov).
CPU 리소스 부족 상황에서 스케줄러가 ClickHouse 프로세스를 치명적인 위협으로부터 보호하는 MemoryWorker 스레드를 우선적으로 스케줄링하도록 했습니다. #94864 (Nikita Mikhaylov).
jemalloc의 dirty 페이지 정리를 MemoryWorker의 메인 스레드와는 별도의 스레드에서 실행하도록 했습니다. 정리 작업이 느리면 RSS 사용량 업데이트가 지연되고, 이로 인해 프로세스가 메모리 부족(out of memory)으로 종료될 수 있습니다. 전체 메모리 사용량 비율에 따라 dirty 페이지 정리를 시작하도록 하는 새로운 설정 memory_worker_purge_total_memory_threshold_ratio를 도입했습니다. #94902 (Antonio Andelic).
Local 및 HDFS용 blob_storage_log를 구현합니다. S3Queue가 blob_storage_log에 로깅할 때 디스크 이름이 아닌 다른 값을 사용하는 경우 발생하던 오류를 수정합니다. blob_storage_log에 error_code 컬럼을 추가합니다. 로컬 테스트를 단순화하기 위해 테스트용 구성 파일을 분리합니다. #93106 (Alexey Milovidov).
clickhouse-client 및 clickhouse-local은(는) 입력하는 동안 숫자 리터럴 내의 자리수 구분(천 단위, 백만 단위 등)을 강조 표시합니다. 이로써 #93100이(가) 해결되었습니다. #93108 (Alexey Milovidov).
clickhouse-client에서 등호(=) 양쪽에 공백이 있는 커맨드라인 인수를 지원하도록 했습니다. #93077 이슈를 해결합니다. #93174 (Cole Smith).
<interactive_history_legacy_keymap>true</interactive_history_legacy_keymap>로 설정하면 CLI 클라이언트에서 이전과 마찬가지로 일반 검색에 Ctrl-R을 다시 사용할 수 있고, Ctrl-T는 퍼지(fuzzy) 검색을 수행합니다. #87785 (Larry Snizek).
캐시를 비우는 구문인 SYSTEM DROP [...] CACHE는 캐시를 비활성화하는 명령으로 오해를 불러일으켰습니다. 이제 ClickHouse는 더 명확한 구문인 SYSTEM CLEAR [...] CACHE를 지원합니다. 기존 구문도 계속 사용할 수 있습니다. #93727 (Pranav Tiwari).
EmbeddedRocksDB에서 여러 컬럼을 기본 키(primary key)로 사용할 수 있도록 지원합니다. #32819를 해결합니다. #33917 (usurai).
이제 스칼라 값에 대해 상수가 아닌 IN 조건(non-constant IN)을 사용할 수 있습니다(예: val1 NOT IN if(cond, val2, val3) 형태의 쿼리). #93495 (Yarik Briukhovetskyi).
지원되지 않는 x-amz-server-side-encryption 헤더가 HeadObject, UploadPart 및 CompleteMultipartUpload S3 요청으로 전달되지 않도록 했습니다. #64577 (Francisco J. Jurado Moreno).
새로운 설정인 trace_profile_events_list를 추가하여 trace_profile_event 추적을 지정된 이벤트 이름 목록으로만 제한합니다. 이를 통해 대규모 워크로드에서 더 정밀한 데이터 수집이 가능합니다. #92298 (Alexey Milovidov).
일시 중지 가능한 failpoint에서 SYSTEM NOTIFY FAILPOINT를 지원합니다. - SYSTEM WAIT FAILPOINT fp PAUSE/RESUME를 지원합니다. #92368 (Shaohua Wang).
#63985에서 포트별로 TLS 구성을 위해 필요한 모든 매개변수를 지정할 수 있도록 개선하여(자세한 내용은 composable protocols 참고), 전역 TLS 구성에 의존하지 않아도 되도록 했습니다. 그러나 구현 상 여전히 전역 openSSL.server 구성 섹션이 존재해야 한다는 암묵적인 요구 사항이 있어, 포트마다 서로 다른 TLS 구성이 필요한 환경과 충돌합니다. 예를 들어 keeper-in-server 배포에서는 Keeper 간 통신과 ClickHouse 클라이언트 연결을 위해 서로 다른 TLS 구성이 필요합니다. #92457 (Miсhael Stetsyuk).
이진 형식으로 디코딩될 수 있는 타입 노드의 총 개수를 제한하여 악의적인 페이로드를 방지하기 위한 새로운 설정 input_format_binary_max_type_complexity를 추가했습니다. #92519 (Raufs Dunamalijevs).
실행 중인 작업을 system.background_schedule_pool{,_log}에 반영했습니다. 관련 문서를 추가했습니다. #92587 (Azat Khuzhin).
히스토리에서 일치 항목을 찾지 못한 경우 클라이언트의 Ctrl+R 검색 시 현재 쿼리를 실행하도록 했습니다. #92749 (Azat Khuzhin).
Parquet 리더는 이제 Tuple 또는 맵 컬럼을 JSON으로 읽을 수 있습니다. 따라서 f.parquet에서 컬럼 x의 타입이 tuple 또는 map이어도 select x from file(f.parquet, auto, 'x JSON') 쿼리가 정상적으로 동작합니다. #92864 (Michael Kolupaev).
Azure Blob Storage에서 네이티브 copy가 BadRequest(예: 잘못된 block list)로 실패할 경우 read-write copy로 폴백하도록 했습니다. 이전에는 서로 다른 storage account로 blob을 복사하는 동안 발생하는 Unauthorized 오류에 대해서만 이 동작을 수행했습니다. 하지만 때때로 「The specified block list is invalid」 오류도 발생합니다. 그래서 이제는 모든 네이티브 copy 실패에 대해 read & write로 폴백하도록 조건을 업데이트했습니다. #92888 (Smita Kulkarni).
EC2 인스턴스 프로파일 자격 증명을 사용하여 다수의 동시 S3 쿼리를 실행할 때 발생하던 EC2 메타데이터 엔드포인트 스로틀링 문제를 수정합니다. 이전에는 각 쿼리가 자체 AWSInstanceProfileCredentialsProvider 를 생성하여 EC2 메타데이터 서비스에 대한 동시 요청을 발생시켜, 이로 인해 타임아웃과 HTTP response code: 403 오류가 발생할 수 있었습니다. 이제 자격 증명 프로바이더는 캐시되어 모든 쿼리에서 공유됩니다. #92891 (Sav).
하위 호환성을 유지할 수 있도록 insert_select_deduplicate SETTING을 재작업했습니다. #92951 (Sema Checherinda).
과도한 작업 로깅을 방지하기 위해 평균보다 느린 백그라운드 작업만 로깅합니다 (background_schedule_pool_log.duration_threshold_milliseconds=30). #92965 (Azat Khuzhin).
이전 버전에서는 일부 C++ 함수 이름이 system.trace_log 및 system.symbols에서 맹글링된 이름(「mangled」)으로 올바르지 않게 표시되었고, demangle 함수가 이를 제대로 처리하지 못했습니다. #93074 이슈를 해결합니다. #93075 (Alexey Milovidov).
backup_data_from_refreshable_materialized_view_targets 백업 설정을 도입하여 갱신 가능 구체화 뷰(refreshable materialized view)를 백업에서 제외할 수 있도록 했습니다. APPEND 갱신 전략을 사용하는 RMV는 항상 백업됩니다. #93076 (Julia Kartseva). #93658 (Julia Kartseva)
함수와 같은 무거운 translation unit에 대해서는 디버그 정보를 완전히 제거하는 대신 최소한의 디버그 정보를 사용하도록 했습니다. #93079 (Alexey Milovidov).
MinIO 특화 오류에 대한 오류 코드 매핑을 구현하여 AWS S3 C++ SDK에 MinIO 호환성 지원을 추가했습니다. 이 변경으로 MinIO 배포를 AWS S3 대신 사용할 때 ClickHouse가 MinIO 서버 오류를 적절히 처리하고 재시도할 수 있게 되어, 자체 호스팅 MinIO 클러스터에서 객체 스토리지를 운영하는 환경의 신뢰성이 향상됩니다. #93082 (XiaoBinMu).
기호화된 jemalloc 프로파일을 기록하여 힙 프로파일을 생성할 때 바이너리 파일이 필요 없도록 했습니다. #93099 (Azat Khuzhin).
SYSTEM INSTRUMENT ADD/REMOVE의 UX를 개선했습니다. FUNCTION 이름에는 String 리터럴을 사용하고, 일치하는 모든 FUNCTION에 패치를 적용하며, REMOVE에서 function_name을 사용할 수 있도록 했습니다. #93345 (Pablo Marcos).
머지 중 통계를 구체화할지 여부를 제어하는 새로운 설정 materialize_statistics_on_merge가 추가되었습니다. 기본값은 1입니다. #93379 (Han Fei).
JSON에서 하나는 리터럴이고 다른 하나는 중첩 객체인 경우(예: {"a" : 42, "a" : {"b" : 42}}) 중복된 경로를 허용하기 위한 설정 type_json_allow_duplicated_key_with_literal_and_nested_object가 추가되었습니다. 일부 데이터는 중복된 경로에 대한 이 제한이 https://github.com/ClickHouse/ClickHouse/pull/79317 에 도입되기 이전에 생성되었을 수 있으며, 이러한 데이터에 대해 후속 처리를 수행하면 현재는 오류가 발생할 수 있습니다. 이 설정을 사용하면 이러한 기존 데이터도 오류 없이 계속 사용할 수 있습니다. #93604 (Pavel Kruglov).
조인 재정렬 시 런타임 해시 테이블 크기 통계를 사용할지 여부를 제어하는 use_hash_table_stats_for_join_reordering 설정을 추가했습니다. 이 설정은 기본적으로 활성화되어 있으며, collect_hash_table_stats_during_joins의 기존 동작을 유지합니다. #93912 (Vladimir Cherkasov).
이제 system.server_settings 테이블에서 중첩된 전역 서버 설정(예: logger.level)을 일부까지 조회할 수 있습니다. 이는 고정된 구조를 가진 설정에만 적용되며, 목록, 열거형, 반복 등이 포함된 설정은 제외됩니다. #94001 (Hechem Selmi).
Keeper가 손상된 스냅샷 또는 불일치하는 변경 로그를 감지하면, 프로세스를 수동으로 중단하거나 파일을 자동으로 정리하는 대신 예외를 발생시킵니다. 이를 통해 수동 개입을 전제로 하는 Keeper의 동작이 더 안전해집니다. #94168 (Antonio Andelic).
allow_statistics_optimize 설정에 대한 별칭인 use_statistics를 추가했습니다. 이는 기존 설정인 use_primary_key 및 use_skip_indexes와 더 일관됩니다. #94366 (Robert Schulze).
숫자(Number) 타입에서 Enum 타입으로 변환할 때 요소가 존재하는지 확인하도록 input_format_numbers_enum_on_conversion_error 설정을 활성화했습니다. #94384 (Elmi Ahmadov).
S3(Azure)Queue 정렬(Ordered) 모드에서 제한을 기준으로 실패한 노드를 정리하도록 했습니다(이전에는 실패 및 처리된 노드 모두에 대해 비정렬(Unordered) 모드에서만 정리가 수행되었으나, 이제는 정렬 모드에서도 실패한 노드에 대해서만 정리가 수행됩니다). #94412 (Kseniia Sumarokova).
clickhouse-local에서 default USER에 대한 액세스 관리를 사용 가능하도록 했습니다. clickhouse-local의 기본 USER에는 access_management 권한이 없어, USER에 제한이 없어야 함에도 불구하고 DROP ROW POLICY IF EXISTS와 같은 작업이 ACCESS_DENIED 오류와 함께 실패했습니다. #94501 (Alexey Milovidov).
가장 오래 실행 중인 머지 작업의 경과 시간을 나타내는 비동기 메트릭을 추가합니다. #94825 (Raúl Marín).
IcebergBitmapPositionDeleteTransform를 사용해 position delete를 적용하기 전에 position delete가 해당 파일에 속하는지 확인하는 검사를 추가했습니다. #94897 (Yang Jiang).
이제 view_duration_ms는 그룹 내 스레드 지속 시간의 합이 아니라, 그룹이 활성 상태였던 시간을 보여줍니다. #94966 (Sema Checherinda).
hasAnyTokens 및 hasAllTokens 함수에서 검색 토큰의 최대 개수 제한(기존 64개)을 제거했습니다. 예시: SELECT count() FROM table WHERE hasAllTokens(text, ['token_1', 'token_2', [...], 'token_65']]); 이 쿼리는 검색 토큰이 65개이므로 BAD_ARGUMENTS 오류가 발생했습니다. 이번 PR로 해당 제한이 완전히 제거되어, 동일한 쿼리가 오류 없이 실행됩니다. #95152 (Elmi Ahmadov).
Numbers에서 Enums로의 변환 시 요소가 존재하는지 확인하기 위한 설정 input_format_numbers_enum_on_conversion_error를 추가합니다. Closes: #56144. #56240 (Nikolay Degterinsky).
Iceberg 테이블에서 데이터 파일과 position delete 파일을 읽을 때 포맷 파서 리소스를 공유하여 메모리 할당량을 줄였습니다. #94701 (Yang Jiang).
미리 정의된 쿼리 핸들러에서 삽입 시 끝에 오는 공백이 데이터로 해석되던 버그를 수정합니다. #83604 (Fabian Ponce).
Join storage에서 outer join을 inner join으로 변환하는 최적화가 적용될 때 발생하던 INCOMPATIBLE_TYPE_OF_JOIN 오류를 수정합니다. #80794를 해결합니다. #84292 (Vladimir Cherkasov).
해시 조인을 사용할 때 allow_experimental_join_right_table_sorting가 활성화된 경우 발생하는 예외 "Invalid number of rows in Chunk"를 수정합니다. #86440 (yanglongwei).
파일 시스템이 대소문자를 구분하지 않는 경우에는 MergeTree에서 파일 이름을 항상 해시로 대체하도록 했습니다. 이전에는 macOS와 같이 대소문자를 구분하지 않는 파일 시스템에서 여러 컬럼/서브컬럼 이름이 대소문자만 다른 경우 데이터 손상이 발생할 수 있었습니다. #86559 (Pavel Kruglov).
materialized view 내부의 기본 쿼리에 대해 CREATE 단계에서 전체 권한 검사를 수행하도록 합니다. #89180 (pufit).
count_distinct_optimization 패스가 윈도우 함수 및 여러 인자에 대해 동작하는 방식을 수정합니다. #92376 (Raúl Marín).
일부 윈도 함수와 함께 특정 집계 함수를 사용할 때 발생하는 "Cannot write to finalized buffer" 오류를 수정합니다. #91415을(를) 해결합니다. #92395 (Jimmy Aguilar Mena).
CREATE TABLE ... AS urlCluster() 및 데이터베이스 엔진 Replicated를 함께 사용할 때 발생하는 논리 오류를 수정합니다. #92216을(를) 해결합니다. #92418 (Kseniia Sumarokova).
MergeTree에서 mutation 수행 시 소스 파트의 직렬화 정보 설정을 상속합니다. 이로써 데이터 타입의 직렬화가 변경된 이후 mutation이 적용된 파트에 대한 쿼리 결과가 잘못 나올 수 있던 문제를 수정합니다. #92419 (Pavel Kruglov).
동일한 이름을 가진 컬럼과 서브컬럼 간에 발생할 수 있는 충돌을 수정하여 잘못된 직렬화 방식이 사용되거나 쿼리가 실패하는 문제를 해결했습니다. #90219를 해결합니다. #85161를 해결합니다. #92453 (Pavel Kruglov).
외부 조인을 내부 조인으로 변환하는 과정에서 쿼리 플랜이 의도치 않게 수정되어 발생하던 LOGICAL_ERROR를 수정합니다. 또한 조인 과정에서 집계 키에 단사 함수(injective function)가 적용되는 경우에도 이 최적화를 적용할 수 있도록 최적화 조건을 완화합니다. #92503 (János Benjamin Antal).
빈 튜플 컬럼을 정렬하는 동안 발생할 수 있는 SIZES_OF_COLUMNS_DOESNT_MATCH 오류를 수정하여 #92422를 해결했습니다. #92520 (Pavel Kruglov).
Backup 데이터베이스에 대한 SHOW CREATE DATABASE 실행 시 교착 상태가 발생하던 문제를 수정했습니다. #92541 (Azat Khuzhin).
hypothesis 인덱스를 검증할 때 올바른 오류 코드를 사용하도록 수정했습니다. #92559 (Raúl Marín).
analyzer에서 컬럼 별칭의 동적 서브컬럼(dynamic subcolumn) 해석 문제를 수정했습니다. 이전에는 컬럼 별칭의 동적 서브컬럼이 getSubcolumn으로 래핑되었으며, 일부 상황에서 전혀 해석되지 않는 문제가 있었습니다. #91434 이슈를 해결합니다. #92583 (Pavel Kruglov).
두 번째 인수가 null일 때 tokens()에서 발생하던 크래시를 방지합니다. #92586 (Raúl Marín).
기반이 되는 const PREWHERE 컬럼을 제자리에서(in-place) 변경하면서 발생할 수 있던 잠재적인 크래시를 수정합니다. 이 문제는 컬럼 축소(IColumn::shrinkToFit) 또는 필터링(IColumn::filter) 시에, 여러 스레드에서 동시에 호출되는 경우 발생할 수 있었습니다. #92588 (Arsen Muk).
대용량 파트(4,294,967,295행을 초과하는 파트)를 포함하는 테이블에서 텍스트 인덱스를 생성하고 구체화하는 기능이 일시적으로 비활성화되었습니다. 현재 인덱스 구현이 이러한 대용량 파트를 아직 지원하지 않기 때문에, 잘못된 쿼리 결과를 방지하기 위한 제한입니다. #92644 (Anton Popov).
Ordered 모드의 storage S3Queue에서 발생하던 논리적 오류 Failed to set file processing within 100 retries를 수정했습니다. 이제 이 오류는 경고로 대체됩니다. 이 오류는 25.10 버전 이전에는 keeper 세션이 만료된 경우 발생할 수 있었으며, 25.10+ 버전에서도 Ordered 모드에서 처리 동시성이 매우 높은 경우 이 오류가 이론적으로 여전히 발생할 수 있으므로 계속해서 경고로 유지됩니다. #92814 (Kseniia Sumarokova).
ratio_of_defaults_for_sparse_serialization=0.0으로 설정된 희소 컬럼에 대한 뮤테이션(mutation) 이후 발생할 수 있는 FILE_DOESNT_EXIST 오류를 수정합니다. #92633 이슈를 해결합니다. #92860 (Pavel Kruglov).
기본값으로 사용되지 않는 이전 Parquet 리더에서 Tuple 컬럼 뒤에 JSON 컬럼이 오는 경우 Parquet 스키마 추론 문제를 수정했습니다. 또한 이 리더가 비어 있는 Tuple을 처리할 때 실패하던 문제를 수정했습니다. #92867 (Michael Kolupaev).
백그라운드 스케줄 풀 종료 시 발생할 수 있는 정지(hang) 문제를 수정했습니다(서버 종료 시 서버가 정지 상태에 빠질 수 있음). #93008 (Azat Khuzhin).
희소 컬럼 mutation 이후 ALTER를 통해 설정인 ratio_of_defaults_for_sparse_serialization을 1.0으로 변경했을 때 발생할 수 있는 FILE_DOESNT_EXIST 오류를 수정했습니다. #93016 (Pavel Kruglov).
WHERE 절에서 not materialize(...) 또는 not CAST(...)가 사용될 때 잘못된 결과를 초래하던 data skipping 로직의 버그를 수정합니다. #88536을(를) 해결합니다. #93017 (Nihal Z. Miaji).
공유 파트에서 발생하는 TOCTOU 경쟁 상태로 인해 오래된 파트가 사용될 수 있는 문제를 수정합니다. #93022 (Azat Khuzhin).
범위를 벗어난 오프셋을 포함하는 잘못된 형식의 groupConcat 집계 상태를 역직렬화할 때 발생하던 크래시를 수정합니다. #93028 (Raufs Dunamalijevs).
머지 작업 중 프로젝션을 다시 빌드할 때 사용되지 않는 컬럼을 제거합니다. 이렇게 하면 메모리 사용량이 줄어들고 생성되는 임시 파트의 개수가 줄어듭니다. #93233 (Nikolai Kochetov).
스칼라 상관 서브쿼리가 존재하는 경우, 서브쿼리에서 사용되지 않는 컬럼을 제거하는 로직을 수정합니다. 수정 이전에는 컬럼이 상관 서브쿼리에서만 사용되는 경우에도 제거될 수 있었고, 그 결과 쿼리가 NOT_FOUND_COLUMN_IN_BLOCK 오류로 실패했습니다. #93273 (Dmitry Novik).
소스 테이블에 대한 ALTER 작업 중 구체화된 뷰(Materialized View, MV)에서 서브컬럼이 누락될 수 있는 문제를 수정합니다. #93231 이슈를 해결합니다. #93276 (Pavel Kruglov).
로컬 테이블과 원격/Distributed 테이블을 병합할 때 hostName()에 대해 ILLEGAL_COLUMN 오류가 발생할 수 있던 분석기 문제를 해결하여 Merge 테이블 엔진의 쿼리 계획 수립을 수정했습니다. 이를 통해 #92059 이슈를 해결했습니다. #93286 (Jinlin).
상수가 아닌 배열 인수를 사용하는 NOT IN이 잘못된 값을 반환하던 문제를 수정하고, 상수가 아닌 Array 함수에 대한 지원을 추가했습니다. 관련 이슈 #14980을(를) 해결합니다. #93314 (Yarik Briukhovetskyi).
use_top_k_dynamic_filtering 최적화 사용 시 발생하던 Not found column 오류를 수정합니다. #93186을(를) 해결합니다. #93316 (Nikolai Kochetov).
hasAllTokens 및 hasAnyTokens 함수에서 두 번째 인자가 빈 배열일 때의 처리를 수정했습니다. #93328 (Anton Popov).
오른쪽 테이블에 대한 totals 옵션이 있는 쿼리에서 runtime filter를 사용할 때 발생하던 논리 오류를 수정했습니다. #93330 (Alexander Gololobov).
이제 함수 tokens가 상수가 아닌 토크나이저 매개변수(두 번째, 세 번째, 네 번째 매개변수)와 함께 호출되는 경우, 예를 들어 SELECT tokens(NULL, 1, materialize(1))와 같이 호출되더라도 서버가 더 이상 충돌하지 않습니다. #93383 (Robert Schulze).
특정 방식으로 조작된 집계 상태로 인해 메모리 안전성 문제가 발생할 수 있었던 groupConcat 상태 역직렬화의 정수 오버플로우 취약점을 수정했습니다. #93426 (Raufs Dunamalijevs).
인덱스에 토큰이 없는 경우(모든 배열이 비어 있거나 토크나이저에 의해 모든 토큰이 건너뛰어진 경우) 배열 컬럼에서의 텍스트 인덱스 분석 동작을 수정했습니다. #93457 (Anton Popov).
연결 문자열에 사용자 이름과 비밀번호가 포함되어 있으면 ClickHouse Client에서 OAuth 로그인을 시도하지 않습니다. #93459 (Krishna Mannem).
텍스트 인덱스에서 중복된 검색 쿼리를 사용할 때 발생하던 직접 읽기 동작을 수정했습니다. #93516 (Anton Popov).
runtime filter가 활성화되어 있고 조인된 테이블에서 동일한 컬럼이 여러 번 선택되어 반환되는 경우(예: SELECT a, a, a FROM t)에 발생하던 NOT_FOUND_COLUMN_IN_BLOCK 오류를 수정했습니다. #93526 (Alexander Gololobov).
SSH를 사용하여 연결할 때 clickhouse-client가 비밀번호를 두 번 입력하라고 요청하던 버그를 수정했습니다. #93547 (Isak Ellmer).
종료 시 ZooKeeper가 완전히 종료되도록 보장합니다(매우 드문 경우에 종료 시 발생할 수 있는 정지(hang) 문제를 수정). #93602 (Azat Khuzhin).
중복 제거 과정에서의 경쟁 상태로 인해 ReplicatedMergeTree를 복원할 때 발생하던 LOGICAL_ERROR를 수정합니다. #93612 (Pablo Marcos).
일부 입력 포맷에서 Sparse 컬럼으로 직접 역직렬화할 때 TTL 업데이트에 Sparse 컬럼을 사용하는 동작을 수정했습니다. 이를 통해 Unexpected type of result TTL column 논리 오류가 발생할 수 있던 문제를 해결했습니다. #93619 (Pavel Kruglov).
머지 작업 중 프로젝션이 재구축될 때 발생하던 _part_offset 손상 문제를 수정하고, _part_offset 컬럼에 대한 불필요한 읽기를 피하고 프로젝션 계산에서 불필요한 컬럼을 건너뛰어 프로젝션 처리 성능을 최적화했습니다. 이는 #93233에서 도입된 최적화를 이어 가는 변경입니다. #93827 (Amos Bird).
https://github.com/ClickHouse/ClickHouse/pull/89173 에서 TraceSender가 내부 파이프를 통해 전송하는 구조체에 필드를 하나 더 추가했습니다. 하지만 버퍼 크기는 업데이트되지 않았습니다(여기 참조). 이로 인해 buffer_size보다 더 많은 데이터를 버퍼에 기록하게 되었고, 그 결과 버퍼가 여러 번 flush됩니다. 그리고 TraceSender::send가 서로 다른 스레드에서 호출되기 때문에, 서로 다른 스레드에서의 flush가 서로 섞일 수 있으며, 이는 수신 측(TraceCollector)이 의존하는 불변 조건을 깨뜨리게 됩니다. #93966 (Miсhael Stetsyuk).
병렬 환경에서(max_threads > 1 - 기본값) UInt8 집계 키를 사용할 때 uniqTheta의 정확성을 수정합니다. #94095 (Azat Khuzhin).
SCOPE_EXIT 내부에서 호출되는 socket.setBlocking(true)에서 예외가 발생하여 크래시가 일어나던 문제를 수정합니다. #94100 (Miсhael Stetsyuk).
ReplicatedMergeTree에서 DROP PARTITION이 이후 로그 항목에 의해 생성된 파트까지 삭제하던 동작으로 인해 발생하던 데이터 손실을 수정합니다. #94123 (Tuan Pham Anh).
페이지 경계를 넘는 배열을 잘못 처리하던 Parquet reader v3를 수정했습니다. 예를 들어, Arrow가 page statistics 또는 page index를 활성화하지 않고 생성한 파일에서 발생합니다. Array 데이터 타입의 컬럼에만 영향을 줍니다. 전형적인 증상은 약 1 MB의 데이터마다 배열 하나가 잘리는 현상입니다. 이 수정 이전에는 다음 설정을 우회책으로 사용해야 했습니다: input_format_parquet_use_native_reader_v3 = 0. #94125 (Michael Kolupaev).
로그 엔트리를 기다리는 동안 ReplicatedMergeTree에서 너무 많은 watch가 생성되던 문제를 수정합니다. #94133 (Azat Khuzhin).
함수 arrayShuffle, arrayPartialShuffle 및 arrayRandomSample가 상수 컬럼을 구체화하여 각 행이 서로 다른 결과를 얻도록 합니다. #94134 (Joanna Hulboj).
materialized view에서 table functions를 평가하는 과정에서 발생하는 데이터 레이스를 수정합니다. #94171 (Alexey Milovidov).
메모리 예외가 발생할 경우 std::terminate 크래시로 이어질 수 있는 HashTable 복사 대입 연산자의 잘못된 noexcept 지정자를 제거합니다. #94275 (Nikita Taranov).
이전에 GROUP BY에 중복된 컬럼이 있는 프로젝션을 생성한 후(예: GROUP BY c0, c0) 데이터를 삽입하면, optimize_row_order가 활성화되어 있을 때 std::length_error가 발생하던 문제가 있었습니다. #94065를 수정했습니다. #94277 (Alexey Milovidov).
연결 시 ZooKeeper 클라이언트에서 잘 드러나지 않던 버그로 인해 멈춤 및 충돌이 발생하던 문제를 수정했습니다. #94320 (Azat Khuzhin).
서브컬럼에 function-to-subcolumns 최적화가 적용되지 않았던 문제를 수정했습니다. #94323 (Pavel Kruglov).
enable_lazy_columns_replication이 활성화된 상태에서 중첩된 RIGHT JOIN에서 잘못된 결과가 반환될 수 있던 문제를 수정합니다. 이 버그로 인해 복제된 컬럼의 모든 행이 서로 다른 값이 아니라 동일한 값으로 잘못 반환되는 현상이 발생했습니다. #93891 이슈를 종료합니다. #94339 (Vladimir Cherkasov).
동치 집합을 사용하는 SEMI JOIN에서 필터 푸시다운 동작을 수정했습니다. 인자 타입이 변경된 경우에는 필터를 푸시다운하지 않도록 했습니다. #93264를 수정합니다. #94340 (Dmitry Novik).
DeltaLake CDF를 DataLake database 엔진과 함께 사용할 때의 동작(Delta Lake 카탈로그 통합)을 수정했습니다. #94122 이슈를 해결했습니다. #94342 (Kseniia Sumarokova).
두 개 미만의 인수로 Backup 데이터베이스 엔진을 생성하면 이제 std::out_of_range: InlinedVector::at(size_type) const failed bounds check. 대신 Wrong number of arguments라는 더 구체적인 오류 메시지가 반환됩니다. #94374 (Robert Schulze).
grant option이 있는 권한의 데이터베이스 수준 global grant에 대해, 수행될 수 없는 REVOKE를 무시합니다. #94386 (pufit).
read_in_order_use_virtual_row가 활성화된 경우, 코드가 인덱스가 잘려 있었는지(truncated) 여부를 확인하지 않고 전체 기본 키 크기를 기준으로 인덱스 컬럼에 접근하여 use-after-free / 초기화되지 않은 메모리 접근이 발생할 수 있었습니다. #85596 이슈를 해결합니다. #94500 (Alexey Milovidov).
타입이 널 허용(Nullable)인 경우 GLOBAL IN이 있는 서브쿼리에서 외부 테이블을 전송할 때 타입 불일치로 인해 발생하던 오류를 수정합니다. #94097를 해결합니다. #94511 (Alexey Milovidov).
이전 버전에서는 동일한 표현식에 여러 인덱스 조건을 사용하는 쿼리가 오류로 인해 Not found column 예외를 잘못 던질 수 있었습니다. #60660을(를) 수정합니다. #94515 (Alexey Milovidov).
테이블 엔진 URL() 및 테이블 함수 url()에서 사용되는 URL에 포함된 비밀번호 마스킹을 개선합니다. #95006 (Vitaly Baranov).
이제 enable_extended_results_for_datetime_functions 설정이 켜져 있을 때 FUNCTION toStartOfInterval은 toStartOfX와 동일하게 동작하며, 이때 X는 Day, Week, Month, Quarter, Year입니다. #95011 (Kirill Kopnev).
상수 문자열 비교에서 cast_string_to_date_time_mode, bool_true_representation, bool_false_representation, input_format_null_as_default 설정을 준수하지 않던 동작을 수정합니다. #91681를 해결합니다. #95040 (Nihal Z. Miaji).
DateTime/정수에서 Time64로 변환할 때 toTime을 사용해 시각(time-of-day) 구성 요소를 추출하는데, 이 함수는 단조(monotonic)가 아닙니다. ToDateTimeMonotonicity 템플릿이 이 변환이 단조라고 잘못 표시하여 디버그 빌드에서 "Invalid binary search result in MergeTreeSetIndex" 예외가 발생했습니다. #95125 (Alexey Milovidov).
필요한 경우에만 manifest 파일 항목 목록을 다시 생성하도록 변경했습니다(이전에는 각 반복 시마다 다시 생성했습니다). #95162 (Daniil Ivanik).
ClickHouse SQL 파서에서 jemalloc의 힙 프로파일링 기능을 사용해 메모리 할당을 프로파일링하기 위한 도구 세트를 추가했습니다. #94072 (Ilya Yatsishin).
파서에서 메모리 할당 디버깅을 단순화하는 도구를 추가했습니다. 이 도구는 쿼리를 AST 표현으로 파싱하기 전후의 jemalloc stats.allocated 지표를 사용해 어떤 메모리가 할당되었는지 보여줍니다. 또한 메모리 프로파일링 모드를 지원하여, 파싱 전후의 프로파일을 덤프하고, 할당이 발생한 위치를 보여주는 보고서를 생성할 수 있습니다. #93523 (Ilya Yatsishin).