하위 호환되지 않는 변경 사항
쿼리 및 구문 변경 사항
- 윈도우 함수
RANK와DENSE_RANK는 이제 SQL 표준에 맞춰 인수를 허용하지 않으며NUMBER_OF_ARGUMENTS_DOESNT_MATCH예외를 발생시킵니다. 이전에는RANK(x) OVER (ORDER BY id)와 같은 쿼리가 인수를 무시한 채 조용히 허용되었고, 이로 인해 혼란을 겪는 사용자가 많았습니다. 이전의 관대한 동작으로 되돌리려면allow_rank_dense_rank_arguments = 1을 설정하십시오. #104324 (groeneai).
데이터 타입 변경 사항
- 이제
icebergHash및icebergBucket은Int128,UInt128,Int256,UInt256,Decimal256인수를 명시적인 오류와 함께 거부합니다. 이전에는 더 큰 값을 조용히 잘라내 해시 충돌을 일으켰습니다. Iceberg 사양에서는 32/64비트 정수와 정밀도가 최대 38인 Decimal에 대해서만 해싱을 정의합니다. 범위에 맞는 값에서 이전 동작을 유지하려면Int64또는Decimal128로 캐스팅하십시오. #105866 (Algunenano). toUUID,toUUIDOrNull,toUUIDOrZero,toUUIDOrDefault,UUID및Nullable(UUID)로의CAST,UUID로의accurateCastOrNull, 그리고 텍스트에서 UUID를 파싱하는 입력 형식(Avro,MsgPack,JSONExtract등)은 이제 길이는 올바르지만 16진수가 아닌 문자를 포함하는 문자열을 거부합니다. 이전에는 이러한 입력이 16진수 조회 테이블의 끝을 벗어나 읽으면서 조용히 엉뚱한 UUID로 변환되었습니다. 이제toUUID는CANNOT_PARSE_UUID를 발생시키고,Or*변형은NULL, 0 UUID 또는 지정된 기본값을 반환합니다. #104370 (groeneai).- 이제
Dynamic및Variant타입이 윈도우의PARTITION BY절에서 검사됩니다. 이전에는allow_suspicious_types_in_group_by가 비활성화된 경우에도 이 부분이 확인되지 않았습니다.Dynamic또는Variant컬럼으로 윈도우를 파티셔닝하는 쿼리는 이제allow_suspicious_types_in_group_by = 1이 아닌 한 오류를 발생시킵니다. #105450 (Avogar).
스토리지 및 인덱스 변경 사항
- min/max 집계 및 MinMax 인덱스에서 중첩된 Dynamic/Variant를 허용하지 않습니다. 이전에는 최상위 수준의 Dynamic/Variant만 검사했습니다. #105468 (Avogar).
- 서버 설정
insert_deduplication_version의 기본값이compatible_double_hashes에서new_unified_hash로 변경됩니다. 이제 삽입 중복 제거는 파트/파티션별이 아니라 삽입된 블록 전체(삽입 1회당)에 적용됩니다. 따라서 동일한 삽입을 재시도하면 여전히 중복 제거되지만, 동일한 파트를 생성하는 서로 다른 2개의 삽입 간에는 더 이상 중복 제거되지 않으며, 같은 행을 순서만 바꿔 삽입한 경우에도 더 이상 중복 제거되지 않습니다. 이전 동작으로 되돌리려면insert_deduplication_version = compatible_double_hashes를 설정하십시오.new_unified_hash에서는 비동기 삽입 중복 제거도 동기화 윈도우를 따릅니다. 활성화 여부(replicated_deduplication_window)와 보존 기간(replicated_deduplication_window_seconds, 기본값 1시간)이 모두 동기화 설정을 따르므로,*_for_async_inserts는 레거시이며old_separate_hashes/compatible_double_hashes에만 적용됩니다. 기본값이old_separate_hashes였던 릴리스에서 직접 업그레이드하는 인스턴스는new_unified_hash를 사용하기 전에 가장 긴 관련 중복 제거 윈도우가 경과할 때까지 먼저compatible_double_hashes로 실행해야 합니다(비동기 삽입을 사용하는 경우 기본값이 1주인replicated_deduplication_window_for_async_inserts포함).compatible_double_hashes에서 전환하는 비동기 워크로드는new_unified_hash가 더 이상 장기간 유지되는async_blocksID를 확인하지 않으므로, 먼저replicated_deduplication_window[_seconds]를 비동기 윈도우 수준으로 늘린 후 전체 비동기 윈도우 동안 실행하거나, 비동기 삽입을 중지하거나,compatible_double_hashes를 계속 사용해야 합니다. #107886 (CheSema). - 구분자가 포함된 needle에서
hasToken이BAD_ARGUMENTS를 발생시키지 않고 텍스트 인덱스를 통해 결과를 반환하던 문제를 수정했습니다. #108189 (Ergus).
제거된 기능
- 더 이상 사용되지 않는 Arrow 기반 Parquet 리더 및 writer를 사용할 수 없습니다. 대신 항상 네이티브 구현이 사용됩니다. 이전 구현을 선택하거나 조정하던 설정들은 이제 더 이상 사용되지 않으며 무시됩니다:
input_format_parquet_use_native_reader_v3,output_format_parquet_use_custom_encoder,output_format_parquet_version,output_format_parquet_compliant_nested_types,output_format_parquet_unsupported_types_as_binary. Native writer는 항상 규격을 준수하는 nested types으로 Parquet V2.6 이상을 기록하며, 지원되지 않는 타입은 raw binary로 기록하는 대신UNKNOWN_TYPE을 발생시킵니다. #100949 (alexey-milovidov). - 더 이상 사용되지 않는
allow_experimental_query_deduplication설정 및 지원되지 않는 실험적 쿼리 중복 제거 동작을 제거했습니다. #99398 (devcrafter). - 소스 테이블의 요청된 파티션에 파트가 없으면
ALTER TABLE ... REPLACE PARTITION ... FROM ...는 더 이상 대상 파티션의 데이터를 조용히 삭제하지 않습니다. 이전에는 이러한 요청으로 대상 파티션이 제거되고 그 자리에 아무 데이터도 기록되지 않았습니다. 이제 기본적으로BAD_ARGUMENTS오류와 함께 거부됩니다. 이는 하위 호환되지 않는 변경 사항입니다. 이전에는 성공하여 대상 파티션을 비우던 빈 소스에서의REPLACE PARTITION은 업그레이드 후 오류를 발생시킵니다. 이전의 자동 삭제 동작을 복원하려면 새 설정allow_replace_partition_from_empty_source = 1을 설정하거나(쿼리별 또는 profile에서),compatibility를26.5이하로 설정하십시오. 대상 데이터를 명시적으로 삭제하려면ALTER TABLE ... DROP PARTITION ...를 사용하십시오. #104939 (groeneai). - 실험적 KQL(Kusto) 함수
array_sort_asc및array_sort_desc와 해당 SQL 백엔드인kql_array_sort_asc및kql_array_sort_desc를 제거했습니다. 이 함수들은 실험적 기능으로, 구현 품질이 낮았으며 정확성 및 파서 버그의 원인이었습니다. 이제 이 이름을 사용하는 쿼리는UNKNOWN_FUNCTION을 반환합니다. #108101 (groeneai).
새 기능
함수
prometheusQuery및prometheusQueryRange테이블 함수에서 PromQLhistogram_quantile함수를 지원합니다. 이를 통해le레이블로 식별되는 기존 Prometheus 히스토그램 버킷의 분위수를 계산할 수 있습니다. #103477 (Yasumoto).- 중심 기반, 완전 포함, 겹침 포함 모드를 지원하는
h3PolygonToCellsWithContainment함수를 추가했습니다. #104455 (yousefQadry). - 이제
formatReadableSize,formatReadableDecimalSize,formatReadableQuantity함수에 선택적 정밀도 인수를 지정하여 소수점 이하 자릿수를 제어할 수 있습니다. 기본값은 2이며, 기존 동작이 유지됩니다. #104648 (antoniofilipovic). argMin및argMax의 집계 별칭인min_by및max_by를 추가했습니다. #105712 (itsjoeoui).
SQL 및 쿼리 기능
formatReadableTimeDelta가 이제Month및Year이외의 유형인INTERVAL표현식도 입력으로 받습니다. #64315 (Beetelbrox).- PNG 출력 형식을 지원하여 쿼리 결과를 PNG 이미지로 직접 렌더링할 수 있습니다. #74691 (m7kss1).
- 워크로드를 위한 메모리 예약 기능을 도입했습니다. 워크로드 스케줄링 문서를 참조하십시오. #82414 (serxa).
IP_ADDRESS또는FORWARDED_IP_ADDRESS를 기준으로 하는 QUOTA에IPV4_PREFIX_BITS및IPV6_PREFIX_BITS옵션을 추가했습니다. 이제 전체 IP 주소마다 개별적으로 QUOTA 제한을 적용하는 대신 IP 서브넷별로 제한을 공유할 수 있습니다. #89270 (adityachopra29).- 기존 Enum 유형에 새 값을 추가할 때 현재의 모든 Enum 값을 다시 지정할 필요가 없도록
ALTER TABLE쿼리에ADD ENUM VALUES를 구현했습니다. #93830 (ilejn). - 읽기용
GeoJSON입력 형식을 추가했습니다. #98124 (mneedham). - 토큰화 후 토큰을 변환하는 텍스트 인덱스용 후처리기를 추가했습니다. #98939 (Ergus).
- ClickHouse Keeper에서 TTL 노드를 선택적으로 지원합니다. TTL 노드는 구성된 수명이 지나면 자동으로 만료되며 하위 노드를 가질 수 없습니다. #100397 (scanhex12).
- 정확한
hasPhrase검색을 지원하도록 텍스트 인덱스에 토큰 위치 저장 기능을 추가했습니다.support_phrase_search인덱스 인수와allow_experimental_text_index_phrase_searchMergeTree설정을 활성화하십시오. #103172 (ahmadov). - arrayTopK 및 arrayBottomK 함수를 추가했습니다. -
arrayTopK(k, array)는 가장 큰 K개의 원소를 내림차순으로 반환합니다. -arrayBottomK(k, array)는 가장 작은 K개의 원소를 오름차순으로 반환합니다. #104563 (vitlibar). * LIKE '<pattern>'및* ILIKE '<pattern>'를 사용해 이름 패턴으로 컬럼을 선택하는 기능을 추가했습니다.table.* LIKE '<pattern>',table.* ILIKE '<pattern>'와 같은 한정 형식도 지원합니다.LIKE는 컬럼명을 대소문자를 구분하여 일치시키고,ILIKE는 대소문자를 구분하지 않고 일치시킵니다. #104569 (niyue).- 스냅샷 읽기 시퀀스를 사용하는
MergeTree테이블용 연속 쿼리를 추가했습니다. #105114 (Michicosun). - 스키마 진화 지원을 개선하기 위해
RowBinaryWithNamesAndTypesAndDefaults포맷을 추가했습니다. #105736 (mzitnik). - SQL에서 Mapbox Vector Tiles를 직접 제공하기 위한 함수를 추가했습니다.
MVTEncodeGeom은 지오메트리를 slippy-map 타일의 픽셀 공간에 투영하고 클리핑하며,MVTEncode는 그룹의 투영된 지오메트리를 단일 레이어 타일의 바이너리 바이트로 집계합니다.MVTBoundingBox/MVTBoundingBoxMercator는 행을 해당 타일로 제한하는 데 사용할 타일의 경계 상자를 반환합니다. Point, 선, Polygon 지오메트리를 지원합니다. PostGIS 별칭인ST_AsMVTGeom및ST_AsMVT로도 사용할 수 있습니다. #106107 (saarthak2002). LOCALTIME및LOCALTIMESTAMP를 추가했습니다(SQL 표준 / PostgreSQL 구문).LOCALTIMESTAMP는now()의 별칭이며(DateTime반환),LOCALTIME은 현재 시간을Time값으로 반환합니다. #106139 (thomas-cabral).- 새
load_balancing전략 2개인hostname_longest_common_prefix및hostname_longest_common_suffix를 추가했습니다. 이 전략은 시작자 호스트명과 가장 긴 공통 접두사(각각 접미사)를 공유하는 레플리카를 우선적으로 선택합니다. 기존nearest_hostname및hostname_levenshtein_distance전략이 잘못된 레플리카를 선택할 수 있는, 숫자 세그먼트의 길이가 가변적인 호스트명의 접두사 또는 접미사에 데이터 센터 정보가 포함된 환경에서 유용합니다. #107360 (den-crane). - 새 함수
quantizeBFloat16ToInt8및dequantizeInt8ToBFloat16: embedding 구성 요소를 256단계 Gaussian Lloyd-Max 양자화기를 사용해 8비트로 압축하는 스칼라 코덱입니다. 비트 절단을 통해 Int4/Int2/binary 코드를 추출할 수 있습니다. #108102 (alexey-milovidov).
테이블 엔진 및 스토리지
설정 및 구성
- 값이 정수여도 부동 소수점 및
Decimal숫자를 텍스트 포맷으로 출력할 때 항상 소수점을 표시하는output_format_always_write_decimal_point_in_float_and_decimal설정을 추가했습니다. 예를 들어1대신1.을 출력합니다. 기본적으로 비활성화되어 있습니다. #62614 (qoega). - 기본적으로 비활성화되는 새 불변
MergeTree설정allow_tuple_element_aggregation을 추가했습니다. 활성화하면SummingMergeTree,AggregatingMergeTree,CoalescingMergeTree는 머지 중에Tuple컬럼을 재귀적으로 평면화하고 각 리프 원소를 최상위 컬럼인 것처럼 독립적으로 집계합니다. 즉,SummingMergeTree는 값을 합산하고,AggregatingMergeTree는 집계 함수 상태를 머지하며,CoalescingMergeTree는 마지막 non-NULL 값을 유지합니다. 이 설정은 테이블 생성 시 지정해야 하며, 지원하지 않는 엔진에서는 별도 알림 없이 무시됩니다. #98039 (JingYanchao). - 부동 소수점 텍스트 출력의 소수 자릿수를 제어하는
output_format_float_precision설정을 추가했습니다. #99721 (phulv94). materialize_projections_on_insert및materialize_projections_on_mergeMergeTree 테이블 설정을 추가했습니다.materialize_projections_on_insert = 0이면 INSERT 시 프로젝션 파트 생성을 건너뛰므로 프로젝션이 많은 테이블의 삽입 처리량이 향상됩니다.materialize_projections_on_merge = 1이면 머지 시 모든 소스 파트에 없는 프로젝션을 재구성하므로 삽입 시점이 아니라 머지 중에 프로젝션을 생성할 수 있습니다. 머지는 계속해서 동일한 프로젝션 집합을 공유하는 파트끼리만 결합합니다. #100993 (cwurm).- 새 S3Queue 설정
after_processing_move_preserve_path를 추가했습니다.after_processing='move'및after_processing_move_prefix와 함께 활성화하면 처리된 객체는 파일 이름만 남기도록 평면화되지 않고 대상 접두사 아래에서 전체 소스 경로를 유지한 채 이동됩니다. #105354 (asya-ch). - 지정된 접두사로 시작하는 모든 경로를 일치시키기 위한
url_prefix및full_url_prefixHTTP 핸들러 구성 요소와 명시적인url_regexp,full_url_regexp,headers_regexp요소를 추가했습니다. 기존<url>regex:...</url>형식은 계속 지원됩니다. #107492 (vitlibar).
인증
- S3 역할 기반 접근을 위한 선택적
external_id자격 증명을 추가했습니다. #106941 (eliangidoni). - 인증서 기반 인증의 관측성을 개선하기 위해 TLS 클라이언트 인증서 정보(주체, 일련번호, 발급자, 유효 기간)를
system.session_log테이블에 추가했습니다. #107679 (alexey-milovidov).
시스템 테이블
system.iceberg_files테이블을 추가했습니다. 이 테이블은 Iceberg 테이블의 파일별 메타데이터를 제공하며, 각 테이블의 현재 스냅샷에 있는 데이터 파일 또는 삭제 파일마다 하나의 행을 포함합니다. #104415 (asya-ch).- 가상(what-if) 스킵 인덱스를 추가했습니다.
CREATE HYPOTHETICAL INDEX ... ON t (expr) TYPE ...를 사용해 세션 범위의 가상 스킵 인덱스를 정의한 다음,EXPLAIN WHATIF SELECT ...를 사용해 실제로 구체화하지 않고 스킵 비율과 비용을 추정할 수 있습니다. 정의된 인덱스는 새system.hypothetical_indexes테이블에서 확인할 수 있습니다. #104608 (yariks5s). - 제약 조건 이름, 유형, 표현식을 포함하여 모든 테이블의 CHECK 및 ASSUME 제약 조건에 대한 정보를 제공하는
system.constraints테이블을 추가했습니다. #105337 (PedroTadim). - 함수, 테이블 엔진, 데이터 타입, 설정, 포맷 등의 시스템 구성 요소에 내장된 참고 문서를 Markdown으로 렌더링하여 단일 테이블에 수집하는 새 시스템 테이블
system.documentation을 추가했습니다. #107463 (alexey-milovidov).
실험적 기능
- 내부 조인용 실험적
dphyp조인 순서 재정렬 알고리즘을query_plan_optimize_join_order_algorithm설정의 옵션으로 추가했습니다. 또한 조인 순서 검색 범위를 제한하고, 제한을 초과하면 체인의 다음 알고리즘으로 대체하는query_plan_optimize_join_order_max_searched_plans설정을 추가했습니다. 기존의 제한 없는 검색 동작을 유지하려면0으로 설정하십시오. #98798 (davenger). - 텍스트 인덱스에 지연 포스팅 리스트 적용 모드를 추가했습니다.
SET allow_experimental_text_index_lazy_apply = 1및SET text_index_posting_list_apply_mode = 'lazy'로 활성화하면 포스팅 리스트를 Roaring Bitmap으로 완전히 구체화하지 않고, 커서 기반 방식을 사용해 패킹 블록 단위로 필요할 때 디코딩합니다. 이를 통해 선택적인 텍스트 인덱스 쿼리의 메모리 사용량과 CPU 시간을 줄입니다. #100035 (fastio). - 선택적 접두사를 사용해 기본 HTTP 포트에 prometheus 핸들러를 연결할 수 있습니다. #104975 (JTCunning).
- 작은 스킵 인덱스 서브스트림을 파트당 단일
skp_idx.packed아카이브로 묶는 실험적 MergeTree 설정packed_skip_index_max_bytes를 추가했습니다. 이를 통해 테이블에 많은 스킵 인덱스가 정의된 경우 inode 부담을 줄입니다. 이 결정은 쓰기 시점에 서브스트림별로 이루어집니다. 직렬화된 크기가 임곗값 이하인 서브스트림은 아카이브에 저장되고, 더 큰 서브스트림은 독립형skp_idx_<name>.idx2/.mrk2레이아웃을 유지합니다. 하나의 파트에서 두 레이아웃을 혼합할 수 있습니다. 전문 인덱스는 지원되지 않으며 항상 파일별로 저장됩니다. 기본값은 0(패킹 비활성화)입니다. #105321 (Algunenano). ABI BUFFERED_V1을 사용하는 WebAssembly UDF에Buffers직렬화를 지원하고, 영속적인 WASM UDF 함수 설정으로webassembly_udf_enable_fuel을 추가했습니다. #105574 (antonio2368).- 다단계 분산 쿼리 실행: 플래너가 쿼리 계획을 scatter / broadcast / gather / shuffle exchange로 연결된 단계로 분할하고, 계획 조각을 worker 노드에 디스패치합니다. 단계 간 데이터는 TCP를 통해 스트리밍되거나 공유 객체 스토리지의 임시 파일을 통해 전달됩니다. 이 경로는 분산 shuffle 및 broadcast 해시 조인, shuffle 집계, 분산 정렬을 지원합니다. 이 기능은 실험적 기능이며 기본적으로 비활성화되어 있습니다. #106020 (davenger).
- 실험적 분산 쿼리 계획 엔진(
make_distributed_plan)은 이제<remote_servers>에서 각 레플리카에stateless_worker_port와streaming_exchange_port를 구성하여 worker마다 서로 다른 작업 디스패치 및 스트리밍 exchange 포트를 사용할 수 있습니다. 설정하지 않으면 기존 서버 수준 포트(stateless_worker_client.port및distributed_query.streaming_exchange_port)가 사용됩니다. 이를 통해 하나의 호스트에서 여러 worker를 실행할 수 있습니다. #107885 (davenger).
성능 개선
JOIN 성능
- JOIN 뒤에 선택적인 LIMIT나 TopN 또는 다른 JOIN이 이어질 때 셀렉터 및 복제 인덱스를 지연 적용하도록 구현했습니다. 지연 셀렉터 인덱스를 활성화하는 데 필요한 페이로드 컬럼 수는 설정
query_plan_min_columns_for_join_lazy_indexing으로 제어합니다(0은 최적화가 비활성화됨을 의미합니다). 최적화가 적용될 LIMIT는 설정query_plan_max_limit_for_join_lazy_indexing으로 제어합니다. #98883 (m-selmi). ASOF JOIN에서parallel_hash조인 알고리즘을 사용할 수 있도록 하여, 서로 다른 동등 키 값별로 빌드 작업을 병렬화합니다. 이전에는 ASOF가 항상parallel_hash에서 제외되었습니다. #105375 (gregakinman).- 해시 조인의 FixedHashMap을 프로브 측의 JOIN 런타임 필터로 공유합니다. 빌드 측 해시 테이블이 FixedHashMap이거나 FixedHashMap으로 변환할 수 있으면 런타임 필터로 게시되어,
BuildRuntimeFilterStep이 설치했을Set/BloomFilter를 대체합니다. 새로운 설정enable_join_runtime_filter_shared_fixed_hash_table(기본값true)으로 제어합니다. #105640 (wudidapaopao). - 이제 병렬 레플리카에서 DP JOIN 재정렬이 허용됩니다. #105889 (nickitat).
- JOIN에서 런타임 필터(기본 활성화된
enable_join_runtime_filters)를 사용할 때의 쿼리 계획을 개선했습니다. 이제 조인 재정렬 비용 모델은 오른쪽 하위 트리의WindowTransform(및 기타 행을 보존하는 계획 단계)을 통과하여, 통계가 없는 것으로 처리하는 대신 기본 행 수와 컬럼별 NDV를 사용합니다. #107229 (UnamedRus).
쿼리 최적화
- 희귀 토큰 처리를 최적화하여 여러 토큰을 검색할 때의 텍스트 인덱스 분석 성능을 개선했습니다. #98226 (CurtizJ).
- OpenSSL 3.x에서 행마다 암시적으로 OpenSSL provider를 조회하지 않도록 하여
encrypt,decrypt,halfMD5함수의 성능을 개선했습니다. #99105 (thevar1able). - 임시 프로젝션 파트 수와 머지 오버헤드를 줄이기 위해
MATERIALIZE PROJECTION중projection.calculate()전에 원본 블록을 병합합니다. 5,000만 행 테이블에서 약 3.4배 빨라집니다. #100047 (amosbird). - Approximate Runtime Filters 및 Bloom Filter Indices의 성능을 개선했습니다. #100201 (cv4g).
LIMIT BY의 컬럼이ORDER BY의 접두사인 경우,Sort중 각 병렬 정렬 스트림에서LIMIT BY를 실행하여ORDER BY ... LIMIT BY쿼리의 속도를 높입니다. 이렇게 하면 최종 정렬 머지 및 이후 파이프라인 단계로 전달되는 행 수가 줄어듭니다. 이 최적화는 새 설정query_plan_push_limit_by_into_sort로 제어되며 기본적으로 활성화되어 있습니다. #104000 (nihalzp).- 단순 SELECT 쿼리의 쿼리별 오버헤드(파싱, 분석, 계획 수립)를 줄였습니다. 예를 들어 단일 연결에서 실행하는
SELECT count() FROM hits는 약 50% 더 빨라집니다. #104513 (Algunenano). - 범위 검사 중
rb_max를 반복 호출하지 않도록 하여UInt64가 아닌groupBitmap상태에서bitmapContains의 성능을 개선했습니다. #105960 (niyue). bloom_filter인덱스가 있는LowCardinality컬럼의 삽입 성능을 개선했습니다. #106410 (EmeraldShift).QBit데이터 타입에서L2DistanceTransposed및cosineDistanceTransposed함수의 성능을 개선했습니다. #106701 (rienath).- 컬럼이 많은 테이블에 대한 쿼리 분석 성능을 개선했습니다. 필요하지 않을 때 전체 원본 테이블 표현식을 포함하는 컬럼 노드 해시를 계산하지 않습니다. 약 1,200개 컬럼이 있는 테이블의 중첩
SELECT *서브쿼리 분석은 이제 약 50배 빨라집니다. #106957 (novikd). - BoringSSL에서 OpenSSL 3.x로 마이그레이션(24.4)하면서 저하된 성능을 복구하여
encrypt,decrypt,tryDecrypt,aes_encrypt_mysql,aes_decrypt_mysql함수의 성능을 최대 10배 개선했습니다. #107339 (thevar1able). - 불필요한 문자열 구체화를 방지하여
Array(LowCardinality(String))에서arrayElement의 실행 성능과LowCardinality(String)키 또는 값을 사용하는 맵의 LIKE 함수 성능을 개선했습니다. #107450 (EmeraldShift). DateTime64컬럼을 필터링하는 쿼리의 CPU 사용량을 줄이고 skip-index 평가 성능을 개선했습니다. #107707 (shankar-iyer).positionCaseInsensitiveUTF8,ILIKE,multiSearchAnyCaseInsensitiveUTF8를 포함한 대소문자 비구분 부분 문자열 검색 성능을 개선했습니다. #107882 (Algunenano).- 예측기 테이블이
VectorWithMemoryTracking을 사용하기 시작하면서 발생한 ARM의FPC부동 소수점 코덱 처리량 약 16% 회귀를 수정했습니다. #108182 (groeneai). - 단일 경량
DELETE로 인해 전체 테이블의 쿼리 조건 캐시가 비활성화되던 성능 회귀를 수정했습니다. 경량 DELETE가 한 번이라도 적용된 테이블에서 선택적 쿼리를 반복 실행하면 그래뉼 프루닝이 중단되고 모든 mark를 읽게 되었습니다. #112947 (fm4v). - 컬럼 통계에서
col IN (...)의 선택도를 추정하는 비용을 제한했습니다. 이로 인해 단일 쿼리의 계획 수립에 수백 밀리초가 추가될 수 있었습니다. 이제 추정기는 선택도 값 하나만 필요한 집합을 채우기 위해col IN (subquery)의 하위 쿼리를 실행하지 않으며, 빌드되지 않은 집합은 건너뜁니다. 새statistics_max_set_size_for_exact_selectivity_estimation설정(기본값 10000)보다 큰 집합의 선택도는 이제 집합의 크기와 경계 범위를 기반으로 추정합니다. #114389 (nickitat).
함수 및 집계 성능
- 길거나 카디널리티가 높은 프라이머리 키의 프라이머리 키 인덱스 분석을 최적화했습니다. 긴 프라이머리 키에서는 이제 인덱스 분석 실행 시간이 프라이머리 키의 길이가 아니라 주로 쿼리 필터의 복잡성(실제로 사용하는 키 컬럼)에 따라 결정됩니다. 따라서 일부 컬럼만 필터링하는 쿼리에서는 정렬 키를 확장해도 인덱스 분석에 거의 추가 오버헤드가 발생하지 않습니다. ClickHouse가 키 컬럼 중 선택적인 접두사만 메모리에 유지하고 후행 컬럼은 로드하지 않는 카디널리티가 높은 프라이머리 키에서는, 이제 인덱스 분석이 전체 키 대신 메모리에 있는 접두사만 대상으로 수행됩니다. 이 최적화는 기본적으로 활성화되며, 새로운 설정
use_lightweight_primary_key_index_analysis로 비활성화할 수 있습니다. #91836 (nihalzp). - 큰 집계 상태(예:
groupArray)가 포함된 부분 2단계 집계 결과를 머지할 때, 머지가 완료될 때까지 모든 상태를 유지하는 대신 머지 과정에서 각 버킷의 소스 상태를 점진적으로 해제하여 피크 메모리 사용량을 줄였습니다. #102330 (yurifedoseev). - 그룹화 키를 해싱해 행을 스레드 간에 분산함으로써, 각 스레드가 머지 단계 없이 서로 겹치지 않는 키 하위 집합을 집계하는 카디널리티가 높고 균등하게 분포된 키용
GROUP BY최적화를 추가했습니다. 활성화하려면enable_sharding_aggregator = 1로 설정하십시오. #104233 (nihalzp). - 제한을 적용하기 전에 모든 스트림을 하나로 머지하는 대신, 각 파티션의 스트림에서
LIMIT BY를 병렬로 실행하여 파티션된MergeTree테이블의LIMIT BY쿼리 속도를 높였습니다. 파티션 표현식이LIMIT BY컬럼의 결정론적 함수여서 어떤LIMIT BY그룹도 2개의 파티션에 걸칠 수 없을 때 적용됩니다. 새로운 설정allow_limit_by_partitions_independently로 제어하며 기본적으로 활성화됩니다. #105126 (nihalzp). <cols>가 테이블 정렬 키의 접두사이거나WHERE col = const로 선행 컬럼이 고정된 후 접두사가 되는 경우,SELECT ... LIMIT N BY <cols>쿼리 속도를 높였습니다. 활성화하면MergeTree는 프라이머리 키 순서로 데이터를 읽고,LIMIT BY는 먼저 정렬된 스트림당 O(1) 메모리를 사용하는 스트리밍 모드에서 대부분의 데이터를 필터링한 다음, 축소된 데이터에 일반LIMIT BY를 실행해 최종 결과를 얻습니다. 새로운 설정optimize_limit_by_in_order로 제어하며 기본적으로 활성화됩니다. #105135 (nihalzp).- 중복 키 표현식을 제거하여
LIMIT BY쿼리 속도를 높였습니다. 다른 키의 결정론적 함수인 키는 제거되며(예:LIMIT 5 BY x, f(x)는LIMIT 5 BY x가 됨), 키의 단사 함수는 인수로 대체됩니다(예:LIMIT 5 BY toString(x)는LIMIT 5 BY x가 됨). 이에 따라 행당 평가되는 표현식 수와 비용이 줄어듭니다. 새로운 설정optimize_limit_by_function_keys및optimize_injective_functions_in_limit_by로 제어하며, 둘 다 기본적으로 활성화됩니다. #106818 (nihalzp). - 함수 확인 캐시에서 중복된 쿼리 트리 해시를 제거하여, 함수 호출이 많거나 깊게 중첩된 쿼리의 분석 속도를 높였습니다. #107516 (novikd).
- 재귀 CTE 결과 처리를 병렬화했습니다. 이제 대규모
WITH RECURSIVE결과에 대한GROUP BY또는 기타 작업은 단일 스레드로 제한되지 않습니다. #107694 (alexey-milovidov).
스토리지 및 I/O 성능
- 동일한 엔드포인트와 버킷을 사용하는 S3 클라이언트가 캐시를 공유하여 중복된 리전 검색을 방지합니다. #96802 (zvonand).
- 블롭을 병렬로 복사하여 객체 스토리지 복사 성능을 개선했습니다. #105089 (asya-ch).
- file 및 s3와 같은 파일 기반 테이블 함수에서 One 입력 형식을 사용할 때 파일 내용을 읽지 않도록 했습니다. #105157 (niyue).
- 이제
MergeTree프라이머리 키와 스킵 인덱스는ifNull(key = 0, 0)또는coalesce(key = 0, 0)처럼ifNull또는coalesce로 조건을 감싼 필터에서 그래뉼을 제외할 수 있습니다. 이러한 프레디케이트는 쿼리 생성기가NULL이 될 수 있는 비교를 명확한 불리언 값으로 변환하기 위해 자주 생성하며, 이전에는 인덱스 분석에서 해석할 수 없어 그래뉼을 건너뛸 수 없었습니다. 이는 기본적으로 활성화되는 기존allow_key_condition_coalesce_rewrite설정을 확장한 것입니다. #106272 (andyzzhao). BYTE_STREAM_SPLIT으로 인코딩된 ParquetFLOAT및DOUBLE컬럼의 디코딩 성능을 개선했습니다. #106376 (Algunenano).- 많은 액세스 엔터티(행 정책, 역할, 할당량, 설정 프로필)가 한 번에 변경될 때 복제된 액세스 스토리지에서 로그인 및 쿼리 시작이 장시간 지연되는 문제를 수정했습니다. 이제 엔터티별 캐시는 변경된 엔터티마다 한 번씩이 아니라 알림 배치마다 한 번씩만 다시 계산하므로, 액세스 잠금을 수분간 유지할 수 있던 이차 복잡도의 작업을 제거합니다. #107672 (azat).
s3및 기타 테이블 함수를 통해 객체 스토리지에서 많은 작은 파일을 읽을 때 프리페치가 중단되고 동기 읽기로 대체되어, 단일 스레드 또는 낮은 동시성으로 많은 작은 파일을 읽는 작업이 크게 느려지던 성능 회귀를 수정했습니다. #108872 (fm4v).- 객체 스토리지 읽기가 파일 시스템 캐시(
filesystem_cache_name)를 거칠 때 초기 소형 객체 프리페치를 활성화했습니다. 이전에는 파일 시스템 캐시가 활성화된 경우S3Queue수집처럼 많은 작은 파일을 읽는 작업이 동기식으로 처리되어 지연 시간의 영향을 받았습니다. #109478 (fm4v). - 디스크상 크기를 고려하도록
Map서브컬럼의PREWHERE최적화를 개선했습니다. #110623 (Avogar). - 이제
ORDER BY가 없어도FINAL, 필터 및 작은LIMIT가 있는 쿼리에 지연 머티리얼라이즈가 적용됩니다(ReplacingMergeTree의 경우). #110722 (KochetovNicolai). - 여러 파티션에 걸친 비동기 삽입 플러시의 중복 제거에 필요한 CPU 시간을 줄였습니다. #111150 (valerypetrov).
- 테이블에
LowCardinality컬럼이 있을 때 동일한MergeTree파트에 대해 독립적인 소규모 읽기를 많이 수행하는 쿼리에서 발생한 CPU 성능 회귀를 수정했습니다. 파트에 단일 공유 딕셔너리가 있는지 판단하는 검사는 이전에는 각 읽기 작업마다 전체 파트의 모든 마크를 검사했지만, 이제는 이진 검색으로 동일한 마크가 연속된 각 구간을 찾습니다. 작은index_granularity를 가진 테이블에서는 이러한 형태의 쿼리가 26.6 이후 최대 수배까지 느려졌습니다. #116134 (groeneai).
메모리 최적화
Enum컬럼이 있는 테이블에서Enum유형 메타데이터에 사용하는 메모리를 최대 10배 줄였습니다. 값에서 이름으로의 조회 성능은 동일하거나 더 빠르며, 파싱 및 역직렬화 중 이름에서 값으로의 조회는 더 느려질 수 있습니다. #95668 (qoega).- 백업 항목을 기록할 때 내부 파일 정보 목록을 더 이상 복사하지 않아
BACKUP의 최대 메모리 사용량을 줄였습니다(수백만 개의 파일이 포함된 백업에서 특히 효과적입니다). #111162 (jkartseva).
개선 사항
쿼리 및 SQL
- 쿼리 계획에서 사용되지 않는 컬럼을 제거할 때 컬럼명 대신 위치를 기준으로 컬럼을 식별합니다. 따라서 중복된 컬럼명이 있어도 사용되지 않는 컬럼을 제거할 수 있습니다. #100586 (antaljanosbenjamin).
- PostgreSQL / SQL 표준과의 호환성을 위해
currentUser()의 대소문자를 구분하지 않는 별칭으로SESSION_USER를 추가했습니다. #106081 (takumihara). - PostgreSQL wire 프로토콜을 통해 실행되는 쿼리의 취소 지연 시간을 줄였습니다. 이제 KILL QUERY는 전체 청크가 클라이언트로 전송될 때까지 기다리지 않고 청크 내에서 출력 직렬화를 중단합니다. #106535 (rvasin).
- 상수 인수가 있는 lambda(예:
arrayMap(t -> t.2, ...))를 포함하는serialize_query_plan = 1분산 쿼리에서 발생하는ILLEGAL_TYPE_OF_ARGUMENT오류를 수정했습니다. 이제 쿼리 계획을 직렬화하는 동안ActionsDAGINPUT노드의 상수 컬럼이 유지됩니다. #107124 (alexey-milovidov). - MySQL wire 프로토콜을 통해 실행되는 쿼리의 취소 지연 시간을 줄였습니다. 이제 KILL QUERY는 전체 청크가 클라이언트로 전송될 때까지 기다리지 않고 청크 내에서 출력 직렬화를 중단합니다. #107228 (rvasin).
함수
- 이제
EXPLAIN SYNTAX는 explain 출력에서 연산자를 일관되게 함수 호출 형식으로 포맷합니다(예:1 + 2대신plus(1, 2)). #94681 (1abdelhalim). - 이제 PostgreSQL 스타일의
expr OP SOME(array)/expr OP ALL(array)(오른쪽 피연산자가 하위 쿼리가 아닌 경우)를 지원하며,=/<>에는has/NOT has로, 그 외 비교 연산자에는arrayExists/arrayAlllambda로 재작성됩니다.any는 집계 함수이기도 하므로 배열 형식에서는ANY를 사용할 수 없습니다. 대신SOME을 사용하십시오.ANY/SOME/ALL의 하위 쿼리 형식은 계속해서IN/NOT IN으로 변환됩니다. #105129 (alexey-milovidov). - 텍스트 인덱스에서 함수
multiSearchAny,multiSearchAnyUTF8,multiMatchAny를 지원합니다. 또한 함수match의 텍스트 인덱스 분석을 개선했습니다. 이제 대체 그룹이 있는 패턴으로 더 많은 그래뉼을 건너뛸 수 있습니다. #106279 (CurtizJ). - 이제 함수
h3PolygonToCells는MultiPolygon에 포함된 모든 다각형 전체에 최대 배열 크기 제한을 적용하고, 내부 H3 라이브러리의 반환 코드를 검증하며, 빈 결과를 조용히 반환하는 대신MultiLineString인수를 거부합니다. #106399 (Algunenano). - 이제 집계 함수
contingency,cramersV,cramersVBiasCorrected,theilsU의 상태를 역직렬화할 때 저장된 counts가 일관된 분할표를 구성하는지 검증하며, 그렇지 않으면CORRUPTED_DATA예외를 발생시킵니다. #107185 (nihalzp). - 쿼리 계획 최적화기의 카디널리티 추정을 개선했습니다. 이제 결정론적인 단일 인수 함수(예:
toYear(date))가 생성한 컬럼은 통계가 없는 상태로 남는 대신 인수의 고유값 수를 상한으로 상속하므로, 조인 순서 재정렬의 정확도가 향상됩니다. #107757 (davenger).
테이블 엔진 및 스토리지
- 파티션 할당 후에도 짧은 폴링 주기를 계속 사용하던 Kafka 테이블 엔진 소비자를 수정했습니다. 이제 구성된
kafka_poll_timeout_ms로 돌아가 리밸런싱 후 발생하는 과도한 빈 폴링, 작은 삽입 파트 및 추가 머지 오버헤드를 방지합니다. #100431 (sugaf1204). Iceberg및DeltaLake를 포함한 데이터 레이크 테이블 엔진에서 이제 캐시로 래핑된 S3 및 Azure 디스크를 사용할 수 있어, 반복 읽기 시 파일 시스템 캐시를 활용할 수 있습니다. #102017 (RinChanNOWWW).- 초기 PREWHERE 선택 이후 추가된 필터(프레디케이트 푸시다운, 런타임 필터 또는 플래너가 설정한 명시적 PREWHERE 및 WHERE)를 MergeTree 읽기 위의 별도 Filter 단계로 남겨 두는 대신, 두 번째 옵티마이저 패스에서 기존 PREWHERE와 병합할 수 있도록 했습니다. #105445 (yariks5s).
wait_for_part_commit_in_dependent_materialized_views설정을 추가했습니다. 활성화하면 소스에 다시 조인하는 연쇄 materialized view에서 현재 삽입 중인 행을 확인할 수 있습니다. #105943 (ahmadov).- 시간대 오프셋의 시 및 분 값을 추출하는 PostgreSQL 호환
EXTRACT(TIMEZONE_HOUR FROM dt)및EXTRACT(TIMEZONE_MINUTE FROM dt)와, 인터벌에서 값을 추출하는EXTRACT(<unit> FROM INTERVAL n <unit>)/date_part('<unit>', INTERVAL n <unit>)를 추가했습니다. #106227 (vinayakj592). SYSTEM RESTART DISK <name>을 구현했습니다. 이제 디스크의 메모리 내 메타데이터를 다시 로드하고 해당 디스크에 있는 읽기 전용 레플리카 테이블의 데이터 파트를 다시 스캔합니다. 이를 통해 공유plain_rewritable스토리지에 있는 테이블의 읽기 전용 레플리카가refresh_parts_interval을 기다리거나 서버를 재시작하지 않고도 필요할 때 다른 서버가 쓴 데이터를 확인할 수 있습니다. #106645 (jrdi).- JSON 고급 공유 데이터에서 불필요한 마크 파일 로드를 건너뜁니다. #107051 (Avogar).
MaterializedPostgreSQL데이터베이스 엔진에 생성 시 설정하는materialized_postgresql_use_extended_date_and_time_types설정을 추가했습니다. 기본값(활성화됨)에서는 PostgreSQLdate/timestamp컬럼이Date32/DateTime64로 추론됩니다.CREATE DATABASE시 이를0으로 설정하면 더 좁은Date/DateTime타입으로 추론됩니다. 이 설정은MaterializedPostgreSQL테이블 엔진에는 적용되지 않습니다. #107428 (alexey-milovidov).- 이제 MergeTree에서 블록마다 서로 다른 코덱을 사용하는 압축 스트림을 읽을 수 있습니다. 이는 적응형 코덱 선택을 위한 읽기 측 사전 조건입니다. #108592 (rienath).
transform_null_in = 1이고IN세트에NULL값이 없을 때 직접 인덱싱된 컬럼의IN프레디케이트에bloom_filter스킵 인덱스를 사용합니다. 이전에는 이러한 쿼리에서 인덱스를 건너뛰어 전체 스캔이 필요했습니다. #111329 (groeneai).
S3 및 객체 스토리지
- 예외를 발생시키지 않는
isGranted경로(checkAccessWithFilter)를 통한 검사를 포함해, 권한이 부여된 모든 액세스 검사에 대한 권한을system.query_log.used_privileges에 기록합니다. 이전에는 예외를 발생시키는 진입점(checkAccess/checkGrantOption)을 통해 검사한 권한만 기록되었으므로,file/s3/azure/url테이블 함수를 사용하는DESCRIBE,CREATE TABLE AS및 유사 쿼리의READ ON FILE/READ ON S3/READ ON AZURE/READ ON URL이 감사 로그에 표시되지 않았습니다. 액세스 제어는 변경되지 않았습니다. #104693 (alexbakharew). - 작업 추적기를 통해 최종 S3 멀티파트 업로드 요청을 비동기적으로 완료하여, 마무리 단계에서 순차적으로 실행하는 대신 마지막 파트 업로드와 동시에 진행할 수 있도록 했습니다. #105487 (asya-ch).
S3Queue및AzureQueue의 기본persistent_processing_node_ttl_seconds설정을 1시간에서 6시간으로 늘려, 장기 실행되거나 재시작된 처리 작업이 버킷 잠금을 너무 일찍 잃지 않도록 했습니다. #106838 (kssenii).s3_storage_class_name설정에서STANDARD및INTELLIGENT_TIERING외에REDUCED_REDUNDANCY,STANDARD_IA,ONEZONE_IA,GLACIER_IR,EXPRESS_ONEZONE값도 지원합니다. #107251 (adityaksolves).- 객체 스토리지 테이블(예:
S3)의 Hive 파티셔닝 샘플 경로는CREATE/ATTACH시점이 아니라 테이블을 처음 사용할 때 해석되므로, 연결할 수 없는 엔드포인트가 더 이상 테이블 생성 및 서버 시작을 차단하지 않습니다. #111842 (evillique).
설정 및 구성
- 호환성 설정
file_like_engine_default_partition_strategy에서 hive 파티션 전략을 기본값으로 설정했습니다. #86746 (kssenii). - 텍스트 인덱스의 기본 매개변수를 제어하는 새로운 MergeTree 테이블 설정 4개를 추가했습니다.
text_index_dictionary_block_size,text_index_dictionary_block_frontcoding_compression,text_index_posting_list_block_size,text_index_posting_list_codec입니다. 이 설정을 사용하면 각 인덱스 정의마다 매개변수를 지정하지 않고도 테이블 수준에서 텍스트 인덱스 동작을 조정할 수 있습니다. 인덱스별로 명시적으로 지정한 인수는 계속 우선 적용됩니다. #100626 (CurtizJ). output_format_pretty_grid_charset가UTF-8일 때 테이블 스타일Pretty포맷에서 테이블 레이아웃 정렬용 공백을U+00A0NO-BREAK SPACE로 렌더링하는 설정output_format_pretty_use_nbsp_for_padding을 추가했습니다. 이를 통해 일반 공백을 축소하는 도구에서도 복사한Pretty출력의 테이블 정렬을 유지할 수 있습니다. 이 설정은 기본적으로 비활성화되어 있으며,ASCII문자 집합 출력에서는 일반 공백을 유지합니다. #103559 (ashrithb).analyzer_compatibility_allow_non_aggregate_in_having설정을 통해 이전 분석기와의 호환성을 지원합니다. 활성화하면 비집계 조건이 HAVING에서 WHERE로 이동합니다. #104232 (novikd).- 대상 테이블에
table_readonly = 1이 설정된 경우 더 이상OPTIMIZE TABLE ... ON CLUSTER및 기타 DDL이 중단되지 않습니다. 이제 이 설정은 전용 오류 코드TABLE_IS_PERMANENTLY_READ_ONLY를 발생시키며,DDLWorker는 이를 재시도하지 않는 오류로 처리합니다(일시적인ReplicatedMergeTreeZooKeeper 연결 해제 중 발생하는TABLE_IS_READ_ONLY와 구분됩니다). 또한table_readonly설정은 이제 테이블 생성 시와ALTER MODIFY SETTING을 통해ReplicatedMergeTree에 적용하려는 경우 모두 명시적으로 거부됩니다. #105109 (alexey-milovidov). MergeTree정렬 키의 내림차순 정렬(예:ORDER BY (time DESC, key))은 이제 항상 지원되며, 더 이상 사용되지 않는 Experimental 설정allow_experimental_reverse_key도 더 이상 필요하지 않습니다. #106440 (nikitamikhaylov).- 기존
CREATE QUOTA ... KEYED BY normalized_query_hashDDL 구문에 맞춰 정적 서버 구성(users.xml)에 정의된 할당량에서keyed_by_normalized_query_hash를 지원합니다. #107654 (alexey-milovidov). - 호환성 설정은 더 이상 사용되지 않는 설정에 적용되지 않으므로, 해당 설정을 변경된 것으로 표시하거나 관련 경고를 생성하지 않습니다. #107737 (UberDever).
- 설정
analyzer_compatibility_multiple_joins_qualify_column_names(기본값false)를 추가했습니다. 이 설정을 활성화하고 쿼리의FROM절에 2개 이상의JOIN이 포함된 경우, 분석기가 생성하는 결과 컬럼명은 이전 분석기의 다중 조인 재작성 방식을 따릅니다.*에서 확장된 컬럼은<alias-or-table>.<column>형식으로 이름이 지정되고,SELECT목록의 별칭 없는 컬럼 참조는 작성한 이름을 그대로 유지합니다. 이를 통해SELECT ll.Date FROM (SELECT * FROM t AS ll JOIN t1 ON ... JOIN t2 ON ...)처럼 이러한 한정된 이름을 참조하는 외부 쿼리가 이전 분석기와 동일하게 작동합니다. 또한group_by_use_nulls를ROLLUP,CUBE또는GROUPING SETS와 함께 사용할 때 분석기가*에서 확장된 컬럼의 한정된 결과 컬럼명을 잃어버리던 문제를 수정했습니다. 이 문제로 중복된 결과 컬럼명이 생성되어 해당 컬럼에 대한 외부 참조가 작동하지 않았습니다. #110746 (novikd). - JOIN에서 가장 왼쪽 테이블의
FINAL수정자가 다른 조인 테이블에도 적용되던 이전 동작을 복원하는analyzer_compatibility_apply_final_to_all_joined_tables설정을 추가했습니다. 이 설정은 설정 변경 이력에 등록되므로, 26.6 이전 버전의compatibility를 사용하면 이전 의미 체계가 자동으로 복원됩니다. #111589 (fm4v). - 텍스트 인덱스의 디스크 저장 포맷 버전을 제어하는 새 MergeTree 설정
text_index_version을 추가했습니다. 값은v0_initial,v1_with_codec,v2_with_positions입니다. 롤링 업그레이드 중이거나 다운그레이드 전에는 최신 서버가 이전 서버에서도 읽을 수 있는 포맷으로 텍스트 인덱스 파트를 계속 작성하도록 이 값을 이전 버전으로 설정하십시오.compatibility설정이 이 값을 자동으로 조정합니다. #111803 (CurtizJ).
시스템 테이블 및 모니터링
- DataLakeCatalog를 통해 테이블을 쿼리할 때
system.query_log의used_storages에 저장 엔진 이름을 기록합니다. #100706 (melvynator). - 프로젝션 머지 진행 상황을 표시하기 위해
system.merges에current_projection,current_projection_progress,projections_completed,projections_remaining컬럼을 추가합니다. #102611 (amosbird). - 테이블 엔진에 내장 문서가 추가되었으며,
system.table_engines테이블의 새description,syntax,examples,introduced_in,related컬럼을 통해 이를 확인할 수 있습니다. #106177 (alexey-milovidov). - 데이터베이스 엔진에 내장 문서가 추가되었으며,
system.database_engines테이블의 새description,syntax,examples,introduced_in,related컬럼을 통해 이를 확인할 수 있습니다. #106178 (alexey-milovidov). - 데이터 타입에 내장 문서가 추가되었으며,
system.data_type_families테이블의 새description,syntax,examples,introduced_in,related컬럼을 통해 이를 확인할 수 있습니다. #106180 (alexey-milovidov). - 입출력 포맷에 내장 문서가 추가되었으며,
system.formats테이블의 새description,examples,introduced_in,related컬럼을 통해 이를 확인할 수 있습니다. #106181 (alexey-milovidov). - 집계 함수 조합자에 내장 문서가 추가되었으며,
system.aggregate_function_combinators테이블의 새description,syntax,examples,introduced_in,related컬럼을 통해 이를 확인할 수 있습니다. #106185 (alexey-milovidov). - 사용 가능한 데이터 스키핑 인덱스 유형과 내장 문서(
description,syntax,examples,introduced_in,related)를 나열하는 새system.data_skipping_index_types테이블을 추가했습니다. #106186 (alexey-milovidov). - 사용 가능한 디스크 유형과 내장 문서(
description,syntax,examples,introduced_in,related)를 나열하는 새system.disk_types테이블을 추가했습니다. #106187 (alexey-milovidov). - MergeTree 계열 테이블에 저장된 데이터의 총 압축되지 않은 크기를 보고하는 비동기 메트릭
TotalUncompressedBytesOfMergeTreeTables및TotalUncompressedBytesOfMergeTreeTablesSystem을 추가했습니다. #106364 (alexey-milovidov). - 운영자가 서버 전체 메모리 한도에 도달한 시점을 모니터링할 수 있도록
GlobalMemoryLimitExceeded프로필 이벤트를 추가합니다. #106466 (sacheendra). - 하위 프로세스와 유휴 풀 워커를 포함해
executable및executable_pool사용자 정의 함수의 상주 메모리(VmRSS)와 실행 중인 프로세스 수를 보고하는 비동기 메트릭ExecutableUserDefinedFunctionMemoryResidentBytes및ExecutableUserDefinedFunctionProcesses를 추가했습니다. #107300 (HanziJiang). - 사용자가
system.tables,system.columns,system.completions에서MySQL및PostgreSQL데이터베이스를 숨길 수 있도록 기본적으로 활성화되는show_remote_databases_in_system_tables를 추가했습니다.show_data_lake_catalogs_in_system_tables는 계속해서DataLakeCatalog의 표시 여부만 제어합니다. #104416 (pamarcos). #109082 (pamarcos).
ClickHouse Keeper
- 전반적인 성능을 약 2배 향상하는 다양한 Keeper 변경 사항(배칭 개선, leader로의 메시지 파이프라이닝, 로그 추가 파이프라이닝). #101757 (al13n321).
- watch를 위한 Keeper profile 이벤트(서버 측 및 클라이언트 측)를 추가합니다. #105336 (scanhex12).
- 로컬 ClickHouse Keeper 스냅샷 정보를 제공하는 새로운 Keeper 전용
system.keeper_snapshots테이블을 추가합니다. #105571 (mstetsyuk). - 로컬 ClickHouse Keeper changelog(Raft 로그) 파일 정보를 제공하는 새로운 Keeper 전용
system.keeper_changelogs테이블을 추가합니다. #105617 (mstetsyuk). - Keeper 전용
system.keeper_cluster테이블을 추가합니다. 현재 Keeper에서 확인되는 Raft 클러스터 멤버마다 하나의 행을 포함합니다. #105646 (mstetsyuk). KeeperMemoryStorage를 사용하는 ClickHouse Keeper에서 수신한 스냅샷을 적용할 때의 최대 메모리 사용량을 줄입니다. #105851 (antonio2368).NuRaft의 커밋되지 않은 로그 항목 admission 제한 및 append-entries 역방향 probe 스로틀링을 위한 Keepercoordination_settings를 추가했습니다. #106108 (antonio2368).
메모리 관리
- 파서가 statement 끝을 넘어 역추적할 때 인접한 메모리의 바이트가 포함될 수 있던 구문 오류 메시지를 수정했습니다. #105086 (groeneai).
- 백업을 열 때(
RESTORE를 수행하거나 증분BACKUP의 기반으로 사용할 때) 메모리 사용량을 줄였습니다. 이제.backup메타데이터를 인메모리 XML 문서 트리로 로드하는 대신 스트림으로 파싱하므로, 대규모(특히 증분) 백업에서 수 GB에 달하는 DOM 트리를 할당하지 않아도 됩니다. #109107 (jkartseva). BACKUP을 완료할 때 최대 메모리 사용량을 줄였습니다. 이제 백업 메타데이터를 쓸 때 모든 파일의 정보를 임시 벡터에 복사하지 않고 제자리에서 순회하므로, 수백만 개 파일을 백업할 때 일시적으로 수 GB가 필요하던 문제가 해소됩니다. #109861 (jkartseva).
데이터 포맷
- 이제 8비트/16비트/32비트/64비트 정수 Variant에 Avro Fixed 필드를 삽입할 수 있습니다. #98139 (patrickpichler).
AvroConfluent포맷은 이제 첫 번째 네트워크 문제 발생 시 INSERT를 중단하는 대신, 일시적인 장애(전송 시간 초과, 연결 거부, DNS 오류, HTTP5xx/408/429) 발생 시 Confluent 스키마 레지스트리 HTTP 클라이언트를 지수 백오프로 재시도합니다. 새 설정인format_avro_schema_registry_max_retries(기본값5) 및format_avro_schema_registry_retry_initial_backoff_ms(기본값100)로 이 정책을 제어합니다. 스키마 유효성 검사 오류(HTTP409, 잘못된 형식의 Avro JSON)는 계속 치명적 오류로 처리됩니다. #106661 (groeneai).- Apache Arrow를 통해 반환된 오류에 대해서는 원래 ClickHouse 오류 코드를 유지했습니다. #107267 (azat).
이름이 지정된 컬렉션 및 딕셔너리
mysql테이블 함수,MySQL테이블 엔진,MySQL데이터베이스 엔진, 딕셔너리SOURCE(MYSQL), 이름이 지정된 컬렉션에enable_compression설정을 추가했습니다. 활성화하면 ClickHouse는 연결을 통해 전송되는 모든 데이터에 대해 MySQL 프로토콜 수준의 압축을 협상합니다. #103229 (bernardlim).- 사용 가능한 딕셔너리 레이아웃과 내장 문서(
description,syntax,examples,introduced_in,related)를 함께 나열하는 새system.dictionary_layouts테이블을 추가했습니다. #106182 (alexey-milovidov). - 사용 가능한 딕셔너리 소스와 내장 문서(
description,syntax,examples,introduced_in,related)를 함께 나열하는 새system.dictionary_sources테이블을 추가했습니다. #106184 (alexey-milovidov). - 이제
system.server_settings의named_collections_storage.type및getServerSetting('named_collections_storage_type')를 통해 실제로 적용되는 이름이 지정된 컬렉션 스토리지 유형을 확인할 수 있습니다. #111806 (pamarcos).
기타 개선 사항
- 오류 메시지의 테이블 이름 힌트를 개선했습니다. 더 이상 동일한 이름을 그대로 제안하지 않으며, 제안에 데이터베이스 이름도 포함합니다(예: “other_db.my_table을 의미하셨나요?”). #95116 (matt-metivier).
- FROM 절이 없는 쿼리에서 해석할 수 없는 식별자에 대한 오류 메시지를 개선하여 FROM 절을 추가하도록 안내합니다. #101769 (Onyx2406).
- 프라이머리 키 컬럼에서
IN서브쿼리와 함께 사용된PREWHERE가 그래뉼 프루닝에 프라이머리 키 인덱스를 사용하지 않아 관련 그래뉼만 읽는 대신 전체 테이블 스캔이 발생하던 문제를 수정했습니다. #102570 (nikitamikhaylov). - 이제 갱신 가능 구체화 뷰는
EXCHANGE TABLES로 대상 테이블을 대체하고 이전 테이블을 삭제한 후에도 계속 갱신됩니다. 이전에는 이전 테이블의 UUID를 유지하므로UNKNOWN_TABLE예외로 인해 갱신에 실패할 수 있었습니다. #102724 (seva-potapov). - 기본적으로
enable_join_transitive_predicates를 활성화합니다. #103724 (davenger). - 이제 갱신 가능 구체화 뷰는 시간 기반 일정 대신 다른 RMV가 갱신될 때 갱신을 트리거하는
REFRESH DEPENDS ON을 지원합니다. (REFRESH EVERY ... DEPENDS ON은 이미 존재했지만 이 사용 사례에 안정적으로 사용할 수 없었습니다.) CREATE MATERIALIZED VIEW 문서를 참조하십시오. #104440 (al13n321). - 반복되는 프로세서 체인을 간소화하는
EXPLAIN PIPELINE옵션을 추가했습니다. #104662 (niyue). - Oracle/MySQL/Snowflake 호환성을 위해
regexpExtract의 대소문자를 구분하지 않는 별칭으로REGEXP_SUBSTR를 추가했습니다. #105122 (alexey-milovidov). EXTRACT(unit FROM expr)의 문법적 편의 기능으로date_part('unit', expr)를 추가했습니다. 표준 인터벌 종류와 PostgreSQL 추가 항목(epoch,dow,doy,isodow,isoyear,century,decade,millennium)을 모두 지원합니다. #105127 (alexey-milovidov).- 이제
QueryConditionCache는 PREWHERE를 부분적으로 통과하는 읽기 배치에서도 개별적으로 필터링된 그래뉼을 기록하여 동일한 조건의 후속 쿼리에서 다시 읽는 마크 수를 줄입니다. #105335 (hanfei1991). - 숫자 프레디케이트 함수에 BFloat16 지원을 추가했습니다. #105391 (mohhddhassan).
- 적용 가능한 경우 숫자 최솟값/최댓값, 평균 문자열 길이 및 NULL 개수를 저장하는 간결한 컬럼별 통계인 기본 통계를 지원합니다. #106048 (hanfei1991).
CREATE TABLE과 마찬가지로ALTER TABLE ... ADD/MODIFY COLUMN에서 후행NULL/NOT NULL수정자를 지원합니다. #106150 (takumihara).- 이제 PREWHERE 최적화기는 선택도를 추정하기 전에 동일한 컬럼 집합을 참조하는 논리곱 구성요소를 그룹화합니다. 따라서
a > 2500 AND a < 2502와 같은 조건은 독립적인 두 프레디케이트(각각 약 50%)가 아니라 결합된 범위(선택도 약 0.02%)로 함께 평가됩니다. 컬럼 통계를 사용할 수 있을 때 PREWHERE 조건의 순서를 더 정확하게 결정할 수 있습니다. #106337 (hanfei1991). - 스택 트레이스가 실제로 비어 있는 경우 예외 메시지에 “Stack trace (when copying this message, always include the lines below):” 머리말을 출력하지 않습니다. #106524 (alexey-milovidov).
- 암호화된 디스크에서
CREATE TABLE ... CLONE AS (and REPLACE / ATTACH PARTITION ... FROM)가 데이터를 하드링크하지 않고 복사하던 문제를 수정했습니다. #106731 (nikitamikhaylov). catalog_type = 'onelake'인DataLakeCatalog데이터베이스가 기본적으로 OneLake Blob 엔드포인트(.blob.fabric.microsoft.com)를 사용해 테이블 데이터를 읽도록 수정했습니다. 이전 DFS 엔드포인트(.dfs.fabric.microsoft.com) 동작을 유지하려면onelake_use_blob_endpoint = false를 설정하십시오. #106843 (scanhex12).- 로그 발생률이 높을 때 모든 메시지마다 알리는 대신, 큐가 비어 있는 상태에서 비어 있지 않은 상태로 전환될 때만 로그 consumer에 알리도록 하여 비동기 로깅의 CPU 오버헤드를 줄였습니다. #107352 (nikitamikhaylov).
- MySQL handshake에서
auth_response길이를 읽을 때 길이 바이트를 부호 있는char로 읽어>= 128인 값이 수 GB 값으로 해석되던 문제를 수정했습니다. #107384 (uwezkhan). - 이제
MaterializedPostgreSQL은 precision이 76보다 큰 PostgreSQLnumeric(p, 0)컬럼(예: 256비트 정수에 사용되는numeric(78, 0))을 “Precision too big” 오류로 실패시키는 대신 ClickHouseInt256에 매핑합니다.Int256에 맞지 않는 값은 명확한 오류와 함께 거부됩니다. #107431 (alexey-milovidov). - 이제
Nullable(Tuple(...))는 Beta입니다. 기본적으로 비활성화되어 있으며, 사용하려면enable_nullable_tuple_type = 1을 설정하십시오. #107754 (nihalzp). - 비동기 삽입은 더 이상
trace/debug수준에서 전체query_id목록을 로깅하지 않습니다. 26.2부터 비동기 삽입 트래픽이 많은 서비스에서는 이로 인해text_log가 과도하게 커질 수 있었습니다. 이제 상세 로그는test수준에서 기록됩니다. #107852 (CheSema). - 무효화된 priority 항목을 즉시 해제하여 파일 시스템 캐시 메타데이터 사용량을 줄였습니다. #107903 (kssenii).
- 이제
Array컬럼의bloom_filter스킵 인덱스는hasAny(column, set)및has(column, const)에 이미 사용되던 방식과 동일하게arrayJoin(column) IN (set),arrayJoin(column) GLOBAL IN (set),arrayJoin(column) = const에도 사용됩니다. 이전에는 이러한arrayJoin ...형식이 전체 스캔으로 처리되었습니다. #109536 (groeneai). - 이제
IS NOT DISTINCT FROM및IS TRUE는=와 마찬가지로 프라이머리 키와 MinMax 인덱스를 사용해 그래뉼을 프루닝합니다. 이전에는k IS NOT DISTINCT FROM 42및(k = 42) IS TRUE가 모든 그래뉼을 스캔했습니다. #110006 (groeneai).
버그 수정
JOIN 수정 사항
ARRAY JOIN에서 내부적으로 사용하는nested함수가 컬럼 타입의LowCardinality를 제거해 출력에서Array(LowCardinality(String))이Array(String)으로 변경되던 문제를 수정했습니다. #98974 (Onyx2406).- 다른 테이블과 쉼표 조인(cross)된
RIGHT/LEFT JOIN에서 join reordering으로 인해 일치하지 않는 행이 조용히 누락되던 문제를 수정했습니다. 예:t1 RIGHT JOIN t2 ON t1.c = t2.c, t3. 이전에는 쿼리가 outer join 결과 대신 inner join 결과를 반환했습니다. #101684 (groeneai). - JOIN 내 집계가 포함된 VIEW와 관련된 쿼리를 실행할 때 발생할 수 있던
LOGICAL_ERROR(“Port is not connected”, 코드 49)를 수정했습니다. #102574 (Ergus). - 새 분석기에서
GLOBAL IN및GLOBAL JOIN쿼리에 대해max_rows_to_transfer와max_bytes_to_transfer가 조용히 무시되던 문제를 수정했습니다. 이제 구체화된 외부 테이블이 구성된 제한을 초과하면 이전 분석기와 동일하게 설정에서SET_SIZE_LIMIT_EXCEEDED를 발생시키거나(transfer_overflow_mode에 따라) 중단합니다. #104119 (groeneai). - 최적화 과정에서 조회 컬럼의 순서가 변경될 때, 오른쪽에
MergeTree테이블이 있는join_algorithm = 'direct'를 사용하는JOIN쿼리가 잘못된 결과를 반환하거나 실패하던 문제를 수정했습니다. #104174 (groeneai). JOIN뒤에arrayJoin과ORDER BY ... LIMIT를 함께 사용하는 쿼리가 조용히 0개의 행을 반환할 수 있던 버그를 수정했습니다.arrayJoin은 행 수를 변경할 수 있으므로, 함수 평가를SortingStep위로 끌어올리는 쿼리 계획 최적화는 끌어올린 표현식에arrayJoin이 포함된 경우 더 이상 적용되지 않습니다. #104558 (groeneai).- 일부 상황에서
ARRAY JOIN과 함께 사용할 때 음수LIMIT BY에서 발생하던 논리 오류를 수정했습니다. #105403 (nihalzp). - 새 compatibility 설정
analyzer_compatibility_prefer_alias_over_subcolumn을 추가했습니다(기본적으로 비활성화됨). 활성화하면 새 분석기는 여러 부분으로 구성된 식별자에서 Tuple 하위 컬럼 또는 점 표기 컬럼 일치보다 별칭 접두사 해석을 우선하여 이전 인터프리터의 동작을 복원합니다. 이를 통해 조인에SELECT *를 사용하는 CTE/하위 쿼리의 내부 테이블과 이름이 같은 테이블을 쿼리에서 조인할 때, 애스터리스크로 이름이 변경된 컬럼(예:b.id)이 내부 테이블 식별자를 외부 범위로 노출해 발생할 수 있는AMBIGUOUS_IDENTIFIER(및 관련) 오류를 방지합니다. #105491 (vdimir). - outer join의 NULL을 제공하는 쪽을 참조하는 후속 inner join과 outer join을 결합한 쿼리에서 잘못된 결과가 반환될 수 있던 문제를 수정했습니다. Join reordering이 inner join 조건을 outer join의 ON 절로 가져오는 계획을 선택할 수 있었습니다. #105992 (vdimir).
- 이전 분석기와의 호환성을 개선했습니다. 테이블에
x.a Array, x.b Array, x String과 같은 컬럼이 있으면ARRAY JOIN x에서 배열을 우선합니다. #106069 (KochetovNicolai). enable_parallel_replicas,query_plan_use_new_logical_join_step,query_plan_optimize_join_order_algorithm = 'greedy'가 활성화된 상태에서 왼쪽MergeTree테이블이 비어 있는INNER JOIN쿼리에서 발생하던 예외를 수정했습니다. #106338 (KochetovNicolai).- 조인 그래프에서 두 릴레이션이 동일한 컬럼명을 공유할 때 병렬 레플리카로 실행되는 조인에서 발생할 수 있는 조인 순서 최적화기의 논리 오류(
Left and right columns have same names)를 수정했습니다. #106418 (alexey-milovidov). - 오른쪽 키가 고유하고
ON조건이 혼합되어 있으며max_joined_block_size_rows가 작은LEFT JOIN의JoiningTransform에서 발생하는LOGICAL_ERROR(Invalid number of rows in Chunk)를 수정했습니다. #106928 (groeneai). - 조인 키에
Tuple,Array또는Map안에 중첩된Variant또는Dynamic타입이 포함되고 조인 오른쪽에 서로 다른 값이 하나만 있을 때 JOIN 런타임 필터에서 발생하는 예외(LOGICAL_ERROR)를 수정했습니다. #106931 (groeneai). Dynamic에 대한 JOIN으로 생성된Dynamic컬럼에서 함수를 실행할 때 발생하는LOGICAL_ERROR(Expected the argument N to have X rows, but it has Y)를 수정했습니다(예:RIGHT/FULL JOIN에서 조인되지 않은 행 또는 조인으로 비상관화된 상관EXISTS하위 쿼리). #107095 (groeneai).JOIN ... USING키의 한정 애스터리스크(t.*)가 집계 함수에 전달되고 외부 JOIN의 반대쪽에Nullable키가 있을 때(join_use_nulls = 0) 발생하는Bad cast from type DB::IColumn const* to DB::ColumnNullable const*논리 오류 예외를 수정했습니다. #107129 (groeneai).- 분리(부분 프레디케이트) 푸시다운 최적화가 JOIN으로 타입이 확장된
USING키의 조건을 푸시다운할 때 발생하는 논리 오류(Unexpected return type from equals. Expected Nullable(UInt8). Got UInt8)를 수정했습니다. 또한 알 수 없는 식별자를 참조하는 상수 폴딩 가능한if/multiIf분기를 포함한JOIN ... USING쿼리에서 식별자를 해석할 때 분석기에서 발생하는 서버 충돌(세그멘테이션 폴트)도 수정했습니다. #107407 (groeneai). - JSON 컬럼에서 잘못된 결과를 생성하던 런타임 조인 필터를 수정했습니다. #107663 (Avogar).
- 한정 애스터리스크(
t.*)가JOIN USING키를 선택하고 해당 조인이PASTE/CROSS/쉼표 조인이나 외부ON조인 아래에 중첩된 경우(join_use_nulls = 0) 발생하는Bad cast from type DB::ColumnNullable to DB::ColumnVector<...>논리 오류 예외를 수정했습니다. #108043 (groeneai). - 새 분석기에서 JOIN의 한 테이블에 적용한 FINAL(예:
FROM t1 FINAL JOIN t2)이 다른 조인 테이블에도 잘못 적용되어 쿼리가 느려질 수 있었던 버그를 수정했습니다. #108979 (vdimir). - 이제
analyzer_compatibility_join_using_top_level_identifier = 1을 사용하면 이전 분석기의 동작과 동일하게JOIN ... USING의 식별자를 SELECT 목록 내 하위 표현식에 정의된 별칭으로 해석할 수 있습니다(예:SELECT uniqExact(lower(x) AS id) FROM t1 JOIN t2 USING (id)). 이전에는 최상위 프로젝션 별칭만 고려되었으며, 설정을 활성화해도 이러한 쿼리는UNKNOWN_IDENTIFIER예외로 실패했습니다. 이제 일치하는 별칭이 중첩되어 있는 경우에도 이 설정을 제안하는 오류 힌트가 표시됩니다. #110739 (novikd). - 오른쪽 컬럼에 대한
WHERE필터로 쿼리 플래너가 조인을SEMI또는ANTI로 재작성할 수 있는 경우,Join엔진 테이블의ANY조인에서 발생하던INCOMPATIBLE_TYPE_OF_JOIN오류를 수정했습니다.Join엔진 테이블은 선언된 엄격성이 고정되어 변경할 수 있으므로, 이제 이러한 테이블에는 변환을 적용하지 않습니다. #111362 (groeneai). - 딕셔너리에 대한
JOIN에서 딕셔너리 키가 래핑되지 않았는데Nullable,LowCardinality또는LowCardinality(Nullable)조인 키를 사용하는 경우 발생하는TYPE_MISMATCH(“복합 키의 키 유형 …이 일치하지 않음”)를 수정했습니다. 이제 직접 조인 딕셔너리 조회는dictGet/dictHas와 마찬가지로 키를 딕셔너리에 선언된 키 유형으로 정규화하며,NULL키는 절대 일치하지 않습니다. #111857 (groeneai). join_use_nulls = 1에서WHERE절에JOIN ON조건을 반복하는 쿼리에서 발생하던AMBIGUOUS_COLUMN_NAME(Block 구조 불일치(동일한 이름의 컬럼은 동일한 구조를 가져야 함))를 수정했습니다. 이제 이러한 쿼리는 실패하지 않고 결과를 반환합니다. #112007 (groeneai).- 키에 희소 직렬화를 사용하는 직접 딕셔너리
JOIN에서 잘못된 결과가 반환되거나 서버가 종료되던 문제를 수정했습니다. #112327 (groeneai). - 8바이트보다 큰 유형(
UInt128,Int128,UInt256,Int256및 해당Nullable변형)의 단일LowCardinality키를 사용하는 해시 조인에서 잘못된 결과가 반환되던 문제를 수정했습니다. 이러한 조인은 키 값이 서로 다른 행을 아무런 오류 없이 반환했습니다. #113230 (groeneai). - 반대쪽의 상수 컬럼이 포함된
JOIN ON조건에 대한 파트 및 그래뉼 프루닝을 수정했습니다. #113484 (vdimir). DirectKeyValueJoin(예:EmbeddedRocksDB,KeeperMap,Redis또는 딕셔너리 등의 키-값 스토리지)으로 처리되는 JOIN의 오른쪽에서 선택한_table또는_database같은 가상 컬럼이 잘못된 값을 반환하던 문제를 수정했습니다. 이전에는 쿼리가 데이터 컬럼의 내용을 반환하거나LOGICAL_ERROR와 함께 실패했습니다. #113698 (groeneai).
쿼리 및 분석기 수정
- 세미콜론 뒤의 주석으로 끝나는 쿼리에서 splitMultipartQuery가 “Empty query” 오류를 발생시키는 버그를 수정했습니다. #85491 (yariks5s).
- DESCRIBE TABLE에서 하위 쿼리 뒤에 오는 별칭을 파서가 허용하지 않아 구문 오류가 발생하는 문제를 수정했습니다. #100205 (yariks5s).
EXPLAIN INSERT INTO ... SELECT ... FORMAT ...에서FORMAT절이EXPLAIN출력에 적용되지 않고INSERT에 의해 처리되던 문제를 수정했습니다. #101772 (Onyx2406).- 동시 INSERT가 실행 중일 때 SELECT 쿼리가 현저히 느려지는 문제를 수정했습니다. 이전에는 대부분의 슬롯이 실제로 사용되지 않더라도 INSERT 파이프라인이 쿼리 시작 시
max_threads만큼의 CPU 슬롯을 예약하여 동시에 실행되는 SELECT에 필요한 리소스가 부족해졌습니다. 이제 CPU 슬롯은 수요에 따라 할당됩니다. 파이프라인은 실제로 병렬화 가능한 작업을 전달할 때만 슬롯을 요청합니다. 이는 동시성 제어와 워크로드용 선점형 CPU 스케줄러 모두에 적용됩니다. 새로운 서버 설정concurrent_threads_lazy_allocation(기본값true)은 롤백 수단으로 사용할 수 있습니다. #102928 (seva-potapov). - 서버가 쿼리를 거부한 경우에도
EmbeddedRocksDB테이블에서ALTER TABLE ... MODIFY SETTING을 실행하면 잘못된 설정값이 테이블 메타데이터 파일에 저장될 수 있는 버그를 수정했습니다. 다음에 서버를 재시작하면 테이블 연결이CANNOT_PARSE_BOOL(또는 유사한 파싱 오류)로 실패했으며, 로드 실패가 치명적인 데이터베이스에서는 서버가 시작되지 않았습니다. 이제 메타데이터를 기록하기 전에 잘못된 설정값을 거부합니다. #103417 (groeneai). HTTP인터페이스 및INSERT SELECT FROM input에서input_format_max_block_wait_ms를 사용하는 스트리밍INSERT를 수정하여, 요청이 완료되기 전에 부분 입력 블록이 플러시되도록 했습니다. #104534 (alexey-milovidov).- 표현식과
WHEN값이 모두NULL일 때CASE표현식이 일치하는THEN대신ELSE분기를 반환하는 문제를 수정했습니다. #105556 (Algunenano). MATERIALIZED VIEW정의에서WASMSQL UDF를 사용할 수 있도록 지원을 수정했습니다. #106161 (niyue).- 이전 분석기에서 SELECT 목록의 ORDER BY 열에 별칭이 지정된 경우
INTERPOLATE ()가INVALID_WITH_FILL_EXPRESSION을 발생시키는 문제를 수정했습니다. #106252 (yakov-olkhovskiy). - 이제 함수
base58Encode,base58Decode,tryBase58Decode는 대규모 입력에서max_execution_time및 쿼리 취소를 준수하며, 매우 오랫동안 실행되는 대신 10 KB를 초과하는 입력을 거부합니다. 이 제한은 새로운 설정function_base58_max_input_size를 통해 구성할 수 있습니다(0은 제한을 비활성화함). #106428 (alexey-milovidov). f(const)가 NaN으로 평가될 때WHERE c0 = const가ORDER BY f(c0)를 사용하는 테이블에서 행을 반환하지 않는 잘못된 결과 버그를 수정했습니다. 예를 들어 음수 상수를 사용하는ORDER BY sqrt(c0)가 해당합니다. 기본 키 분석이 모든 그래뉼을 잘못 제거하고 이후 쿼리의 쿼리 조건 캐시를 오염시켰습니다. #106507 (groeneai).- 암시적
_minmax_count_projection, 명시적 집계 프로젝션 또는 일반 프로젝션이 있는 테이블에서SELECT c, count() FROM t WHERE c GROUP BY c실행 시 잘못된 결과가 반환되던 문제를 수정했습니다. 이전에는 모든 그룹이 상수 키와 전체 행 수를 가진 하나의 행으로 합쳐졌습니다. #106590 (groeneai). SETTINGS가FORMAT보다 앞에 있거나 출력 형식이Values인 경우에도FORMAT이EXPLAIN ... INSERT ... SELECT ... FORMAT ...의EXPLAIN출력에 적용되도록 했습니다. #106686 (alexey-milovidov).- 재사용된 스레드 로컬 요청 객체에 이전 요청의 실패 상태가 남아 있어, 실제로 워크로드 리소스에 대한 액세스가 부여된 쿼리에서 드물게 발생하던 잘못된
RESOURCE_ACCESS_DENIED오류(“Scheduler queue with resource request is about to be destructed”)를 수정했습니다. #106690 (alexey-milovidov). - 16진수 또는 8진수 이스케이프를 포함하는 정규식에서
match,extract,extractAll,countMatches가 잘못된 결과를 반환하던 문제를 수정했습니다. #106709 (ofeliacode). - 길이 필드가 4보다 작은 메시지로 인해
size - 4에서 래핑이 발생하고 과도한resize/ignore가 수행되던 PostgreSQL wire 프로토콜 파서의 정수 언더플로를 수정했습니다. #107485 (uwezkhan). - 기본값인
enable_analyzer = 1을 사용하면, 다른 데이터베이스에만 존재하는 테이블을 이름만으로 쿼리할 때 이제 올바른 테이블을 제안합니다. 예를 들어SELECT * FROM functions는Maybe you meant system.functions?를 표시합니다. 이전에는 새 분석기가 힌트 없는Unknown table expression identifier오류를 반환했지만, 기존 분석기는 이미 유용한 제안을 제공했습니다. #107550 (groeneai). - 워커 상태 확인이 다음 확인을 다시 예약하지 못할 때(예: 종료 시
CANNOT_SCHEDULE_TASK또는MEMORY_LIMIT_EXCEEDED) 분산 계획 쿼리(make_distributed_plan = 1)를 정리하는 과정에서 발생하던 서버 중단(std::terminate, signal 6)을 수정했습니다. 이제 쿼리는 정상적으로 실패하고 서버는 계속 실행됩니다. #107575 (groeneai). - 공통 하위 표현식을 공유하는
ALIAS컬럼을 선택하는 분산 쿼리에서 잘못된 결과가 반환되던 문제를 수정했습니다. 컬럼 정렬이 어긋나 값이 잘못된 컬럼에 반환될 수 있었습니다. #107675 (vdimir). CODEC또는 엔진 선언 내 인수 없는 윈도 함수(예:CODEC(cume_dist() OVER (...)))에서 발생하던Inconsistent AST formatting논리 오류를 수정했습니다. 이제 이러한 함수는 괄호를 유지하므로 쿼리가 포맷/파싱 왕복 과정에서도 유지됩니다. #107806 (alexey-milovidov).- 이제
getClientHTTPHeader가 비결정적으로 올바르게 처리되므로, 그 결과가 쿼리 결과 캐시에 잘못 재사용되지 않습니다. #108029 (alexey-milovidov). - 쿼리 조건 캐시(기본값인 설정
use_query_condition_cache = 1)와 함께SELECT [...] SAMPLE [...]를 사용할 때 잘못된 결과가 반환되던 문제를 수정했습니다. #108488 (groeneai). enable_identifier_resolve_cache가 활성화된 경우(기본값), 복합 프레디케이트에GROUP BY에서 별칭을 지정한 후 다시 참조할 때 발생하는NOT_FOUND_COLUMN_IN_BLOCK오류를 수정했습니다.optimize_and_compare_chain최적화는 멱등적이지 않았으며, 공유되는 해석 노드에 중복된 전이적 논리곱 조건이 누적되었습니다. #108553 (groeneai).Distributed테이블의 하위 쿼리가 동일한 표현식으로 확장되는 2개 이상의ALIAS컬럼(예:a1 String ALIAS toString(x), a2 String ALIAS toString(x))을 읽고 그 결과가 외부 쿼리에 사용될 때 발생하는NUMBER_OF_COLUMNS_DOESNT_MATCH오류를 수정했습니다. 예:SELECT count() FROM (SELECT a1, a2 FROM dist GROUP BY a1, a2). #108725 (groeneai).- 다른 컬럼에 인라인 별칭을 정의하고 참조하는
DEFAULT또는MATERIALIZED표현식이 있을 때ALTER TABLE ... DROP COLUMN에서 발생하는UNKNOWN_IDENTIFIER오류를 수정했습니다. #109374 (alexey-milovidov). - 쿼리가
name/database컬럼만 읽을 때 데이터베이스별 권한이 부여된 사용자의 데이터베이스를system.tables에서 자동으로 건너뛰는 문제를 수정했습니다. 26.2에 도입되었습니다. #109723 (samay-sharma). - 분석기가 활성화된 상태에서 뷰에 저장된 쿼리에서 CTE 이름으로 한정된 컬럼(
cte_name.column)에 발생하는UNKNOWN_IDENTIFIER오류를 수정했습니다. #111386 (novikd). FINAL쿼리가SELECT목록에 없는 정렬 키 컬럼으로 필터링하고 해당 필터가PREWHERE로 이동될 때 발생하는NOT_FOUND_COLUMN_IN_BLOCK오류를 수정했습니다(예:optimize_move_to_prewhere_if_final = 1이 설정된SELECT s FROM t FINAL WHERE k GROUP BY s). #111721 (groeneai).enable_analyzer = 0이 서버 기본값일 때 재귀 CTE가 있는 뷰에서WITH RECURSIVE is not supported with the old analyzer오류로 인해 서버 시작 및ATTACH가 실패하던 문제를 수정했습니다. #112784 (evillique).accurateCastOrDefault의 쿼리 설정 전파 및 NULL 처리를 수정했습니다. #114912 (alexey-milovidov).system.query_thread_log의read_rows,read_bytes,written_rows,written_bytes가 기록된 쿼리의 값 대신 스레드 수명 동안의 누적 합계를 보고하던 문제를 수정했습니다. 특히 쿼리를 시작한HTTPHandler스레드와 같은 장기간 유지되는 풀 스레드의 행이 영향을 받았습니다. #115596 (groeneai).
MergeTree 및 스토리지 관련 수정 사항
tryN접미사가 붙은 분리된 파트를 이제 삭제할 수 있습니다. #58957 (antaljanosbenjamin).- 병렬 레플리카로 실행할 때 중첩된 서브쿼리 안에서 중복된 프로젝션 별칭(예:
SELECT *, day + 365 AS day)을 사용하는 쿼리에서 발생하는MULTIPLE_EXPRESSIONS_FOR_ALIAS예외를 수정했습니다. #80310 (alexey-milovidov). - 테이블 수준의
default_compression_codec설정을 명시적으로 구성했을 때MergeTree파트에 잘못된 압축 코덱이 선택되던 문제를 수정했습니다. 삽입 시, 머지 중, 프로젝션용으로 기록된 파트가 테이블 수준 설정 대신 서버 전체의 기본 코덱을 사용했습니다. 완전 삭제 mutation으로 생성되는 빈 파트도 이제 올바르게 처리됩니다. #101784 (Onyx2406). - 병렬 레플리카와
parallel_replicas_local_plan = 0을 사용하여PREWHERE/WHERE/HAVING/QUALIFY에서 프로젝션 별칭(예:SELECT x AS a, y AS b, (a AND b) AS c FROM t PREWHERE c)을 참조하는 쿼리 또는 컬럼 이름이 겹치는 자체 조인에 대한SELECT *쿼리를 실행할 때 원격 레플리카에서 발생하는MULTIPLE_EXPRESSIONS_FOR_ALIAS오류를 수정했습니다. #103806 (groeneai). ALTER TABLE ... DROP PARTITION ID 'patch-...'후DETACH/ATTACH TABLE을 실행했을 때 패치 파트가 손상되던 문제를 수정했습니다. 이전에는 빈 커버링 파트가partition.dat와source_parts.dat없이 기록되어, 다음 attach 또는 서버 재시작 후system.detached_parts에broken-on-start_patch-...항목이 생성되었습니다. #104353 (groeneai).ALTER TABLE ... RENAME COLUMN이OPTIMIZE TABLE ... FINAL또는 다른 백그라운드 머지와 동시에 실행될 때 데이터가 기본값으로 조용히 대체되던 문제를 수정했습니다. #104822 (groeneai).enable_materialized_cte를 사용하는 쿼리에서 발생하던 두 가지LOGICAL_ERROR: Reading from materialized CTE 'X' before it has been materialized패턴을 수정했습니다. (1) 다른 구체화된 CTE에 대한IN (subquery)로 필터링되는 재사용 구체화된 CTE, (2) 중첩된 IN 서브쿼리를 통해 MergeTree 기본 키를 사용하는WHERE ... IN (...)필터 내부와 직접 참조되는 구체화된 CTE입니다. 계획 최적화 중 버그가 발생했으므로 동일한 쿼리에 대한EXPLAIN도 영향을 받았습니다. #105041 (novikd).skip_cache_on_disk_failure = 1을 사용하면 이제FileCache가 디스크 캐시 디렉터리를 생성하지 못해도 쿼리가 계속 실행됩니다. 쿼리를 실패시키는 대신 해당 실패를 로그에 기록합니다. #105250 (Diskein).ALTER TABLE <memory_table> APPLY PATCHES및ALTER TABLE <memory_table> APPLY DELETED MASK에서 발생하던 논리적 오류 예외Mutation of Memory table produced incomplete output를 수정했습니다.Memory테이블은 패치 파트나 삭제 마스크를 보유하지 않으므로 이제 두 명령 모두 올바르게 아무 작업도 수행하지 않는 작업으로 처리됩니다. #105286 (groeneai).distributed_group_by_no_merge=1에서Distributed위의Merge위에 있는Merge에 대해 발생하는CANNOT_CONVERT_TYPE를 수정했습니다. #105330 (azat).- 여러 고유 값을 이미 관찰한 상태를 머지할 때
singleValueOrNullMerge가NULL대신 특정 값을 반환하던 문제를 수정했습니다. #105734 (fallintoplace). - 컬렉션 이름이 비어 있거나 NUL 바이트를 포함할 때
mongodb테이블 함수, MongoDB 스토리지 및 MongoDB 딕셔너리 소스에서 발생하는 충돌을 수정했습니다. #105776 (Algunenano). - 명시적으로 지정된
SummingMergeTree및CoalescingMergeTree의columns_to_sum컬럼에 대해ALTER TABLE ... CLEAR COLUMN이 거부되던 문제를 수정했습니다. #105785 (antonio2368). - 데이터베이스 이름을 쿼리 매개변수로 지정한 매개변수화된 뷰를 생성할 때 발생하던
UNKNOWN_DATABASE오류를 수정했습니다. #105799 (groeneai). - analyzer 사용 시
Merge테이블의 순서 읽기 최적화를 복원했습니다. #105867 (KochetovNicolai). - 카탈로그를 통해 액세스하는 Iceberg 테이블의
UPDATE및DELETE뮤테이션 문제를 수정했습니다. 여기에는 일치하는 행이 없는 반복 업데이트 및 삭제도 포함됩니다. #106111 (scanhex12). - 프레디케이트가 상위에 적용된 상태에서
Merge테이블 또는merge테이블 함수를 통해Distributed테이블을 쿼리할 때optimize_skip_unused_shards가 적용되지 않고force_optimize_skip_unused_shards가 잘못 실패하던 문제를 수정했습니다. #106250 (KochetovNicolai). - 뮤테이션(
DELETE/UPDATE) 프레디케이트에 다른 하위 쿼리 안에 중첩된 기본 테이블 표현식에서 읽는IN/EXISTS하위 쿼리가 포함될 때 발생하는 논리 오류Column identifier ... is already registered를 수정했습니다. #106414 (alexey-milovidov). read_in_order_use_virtual_row_per_block = 1및 작은max_block_size를 사용해 와이드 파트를 역순으로 읽을 때ORDER BY ... DESC쿼리에서 간헐적으로 잘못된 결과가 발생하던 문제를 수정했습니다. #106429 (vdimir).cache/direct레이아웃과 단일 문자열(복합) 키로STORAGE_TYPE 'simple'을 사용하는 Redis 딕셔너리에서 발생하던Bad cast exception을 수정했습니다. 이제 이러한 딕셔너리를 사용할 수 있으며,simple스토리지의 복합 키는 명확한 오류를 보고합니다. #106501 (vdimir).APPLY PATCHES,APPLY DELETED MASK,MATERIALIZE STATISTICS,MATERIALIZE INDEX,MATERIALIZE PROJECTION,REWRITE PARTS를 포함해,Memory엔진에서 행별 데이터에 영향을 주지 않는ALTER TABLE <memory_table>명령으로 인해 발생하던 예외Mutation of Memory table produced incomplete output을 수정했습니다.Memory테이블은 이러한 구조를 보유하지 않으므로 이제 이 명령은 아무 작업도 수행하지 않는 것으로 처리됩니다. #106621 (groeneai).MergeTree테이블에 0개의 그래뉼과 디스크에 비어 있지 않은 마크 파일이 있는 skip-index 파트가 있을 때 서버가Too many marks in file ...skp_idx_idx.cmrk4, marks expected 0 (bytes size 0)오류와 함께 시작하지 못하던 문제를 수정했습니다. #106675 (groeneai).- UNION에 빈 테이블이 포함되어 UNION을 사용하는 뷰에 병렬 레플리카가 적용되지 않던 문제를 수정했습니다. #106900 (devcrafter).
- 완전히 중복 제거된 블록을
ReplicatedMergeTree테이블에 동기식으로 삽입할 때, 충돌한 파트의 중복 제거 노드가 이미 제거된 경우(예: 동시에 실행된DROP PARTITION으로 인해) 발생할 수 있던 논리 오류 예외conflicted_part_name.has_value()를 수정했습니다. #107026 (groeneai). enable_filesystem_query_cache_limit = 1로 생성된 파일 시스템 캐시 디스크를 통해MergeTree테이블을 읽을 때 발생할 수 있던 드문LOGICAL_ERROR“Attempt to release query context that does not exist”와 이에 따른 서버 크래시를 수정했습니다. #107028 (groeneai).- 빈 파트를
plain_rewritable디스크로 이동할 때 발생하던 서버 크래시를 수정했습니다(예:remove_empty_parts = 0으로 유지된 빈 파트에ALTER TABLE ... MOVE PARTITION ... TO DISK를 실행하는 경우). #107040 (groeneai). adaptive_write_buffer_initial_size가 매우 큰 값으로 설정된 경우MergeTree테이블에INSERT할 때 발생하던Logical error: Too large size passed to allocator예외를 수정했습니다. 이제 적응형 쓰기 버퍼의 초기 크기는 버퍼 최대 크기로 제한됩니다. #107104 (groeneai).MODIFY SETTING/RESET SETTING과 주석 변경(예:MODIFY COMMENT 'x', MODIFY SETTING old_parts_lifetime = 123)을 혼합한ALTER TABLE ... ON CLUSTER배치가 리더 레플리카에만 적용되어 다른 레플리카와 불일치가 발생하던 문제를 수정했습니다. 또한 위치 기반 또는 컬럼별SETTINGS를 사용하는MODIFY COLUMN ... COMMENT가 로컬 주석 전용 메타데이터 변경으로 잘못 분류되어, 복제된 메타데이터에서 컬럼 재정렬이 누락되고 레플리카 재시작 시INCOMPATIBLE_COLUMNS오류를 유발할 수 있던 문제도 수정했습니다. #107142 (groeneai).group_by_use_nulls설정을 활성화한 상태에서grouping함수를 사용하는 쿼리에 발생하던Argument ... of GROUPING function is not a part of GROUP BY clause오류를 수정했습니다. #107206 (KochetovNicolai).- 복제되지 않은
MergeTree테이블에서 레거시 병렬 레플리카를 활성화한 경량UPDATE쿼리 문제를 수정했습니다. #107246 (groeneai). - SYSTEM SYNC DATABASE REPLICA … STRICT에서 발생할 수 있는 논리 오류 예외를 수정하고, STRICT 수정자가 데이터베이스 레플리카에 실제로 적용되도록 했습니다. #107344 (PedroTadim).
- 스칼라 서브쿼리에 동일한 테이블을 읽는 중첩 서브쿼리가 포함된 경우 병렬 레플리카에서 발생할 수 있던
Logical error: 'Duplicate announcement received for replica number N'오류를 수정했습니다. #107381 (groeneai). - 아직 적용되지 않은 경량
UPDATE패치가 있는 파티션에서REPLACE PARTITION,MOVE PARTITION,DETACH PARTITION또는DETACH PART를 실행할 때 일반(복제되지 않은)MergeTree에서 발생하던 무음 데이터 손실을 수정했습니다. 이제 이러한 작업은 커밋된 업데이트를 조용히 되돌리는 대신(ReplicatedMergeTree와 마찬가지로)ALTER TABLE ... APPLY PATCHES를 안내하며 명령을 거부합니다. #107386 (groeneai). - PostgreSQL 데이터베이스 또는 테이블 이름에 대문자가 포함된 경우
MaterializedPostgreSQL이 변경 사항의 복제를 조용히 중단하던 문제를 수정했습니다(pgoutput소비자가 대소문자를 보존하는 publication과 일치하지 않는, 따옴표 없이 소문자로 변환된 publication 이름을 요청했습니다). #107423 (alexey-milovidov). optimize_if_transform_strings_to_enum = 1이고 최적화된 문자열 리터럴 기반if/transform표현식이 분산 테이블 또는 병렬 레플리카의GROUP BY또는ORDER BY키인 경우 발생하는THERE_IS_NO_COLUMN오류를 수정했습니다. #107455 (groeneai).- 일반
MergeTree에서ReplacingMergeTree,SummingMergeTree또는AggregatingMergeTree로 파트를 채택한 뒤CREATE TABLE ... CLONE AS,ATTACH PARTITION ... FROM또는MOVE PARTITION ... TO TABLE을 수행하면SELECT ... FINAL및OPTIMIZE TABLE ... FINAL이 중복 행을 반환하던 문제를 수정했습니다. 이제 원본 엔진과 대상 엔진이 다르면 채택된 파트의 머지 수준이 0으로 재설정되므로, 다음 머지에서 대상 엔진이 중복을 제거합니다. #107481 (groeneai). - ReplicatedMergeTree에서 쿼럼을 기다리는 동안 쿼리 취소를 더 정확하게 추적하도록 개선했습니다. #107513 (nickitat).
- rapidjson 라이브러리(
prettyPrintJSON,JSONMergePatch및 rapidjson JSON 파서)가 사용하는 메모리를 메모리 트래커에 반영하여, 비정상적인 입력이 제한 없이 메모리를 할당하는 대신MEMORY_LIMIT_EXCEEDED로 거부되도록 했습니다. #107555 (Algunenano). Dynamic컬럼이 있는 테이블의 mutation으로 생성된MergeTree파트를 머지하거나 읽을 때 발생할 수 있는Logical error: Stream ... variant_discr ... is not found오류를 수정했습니다. #107562 (alexey-milovidov).optimize_prewhere_after_pushdown이 활성화된 상태에서 명시적PREWHERE와WHERE를 모두 사용해file(),url()또는 객체 스토리지 소스를 쿼리할 때 발생하던LOGICAL_ERROR(updateFormatPrewhereInfo called more than once)를 수정했습니다. #107568 (groeneai).Replicated데이터베이스 내TimeSeries테이블과 관련된RENAME TABLE,RENAME DATABASE또는CREATE OR REPLACE TABLE에서 발생할 수 있던 서버 예외(Digest does not match논리 오류)를 수정했습니다. 이제TimeSeries테이블 이름 변경이 지원됩니다. #107583 (groeneai).- 이전에는 내부 테이블이 남아 있고 백그라운드 삭제 작업이 무한히 재시도되던
Replicated데이터베이스의TimeSeries테이블에 대한DROP TABLE문제를 수정했습니다(DROP TABLE ... SYNC가 멈춤). #107604 (groeneai). - 악의적인 레플리카가 파트 디렉터리 외부에 파일을 쓸 수 있던 복제 파트 가져오기 프로토콜의 경로 탐색 취약점 2건을 수정했습니다. #107606 (antonio2368).
- 일반
MergeTree테이블에서ALTER TABLE ... REPLACE PARTITION을 실행한 후 서버를 재시작하면 교체된 파트가 다시 나타나, 테이블이 대체 행과 기존의 교체된 행을 모두 반환하던 문제를 수정했습니다. #107623 (groeneai). TO대상 테이블에서 뷰의SELECT가 생성하는 것보다 더 넓은Enum을 가진 컬럼을 선언한 materialized view에 삽입할 때 발생하던LOGICAL_ERROR(“ConvertingTransform및RemovingReplicatedColumnsTransform간의 Block structure mismatch …”)를 수정했습니다. 이제 직접INSERT ... SELECT와 마찬가지로 materialized view 삽입 경로에서도 유효한Enum확장이 적용됩니다. #107648 (groeneai).- 동일한 표현식으로 확장되는 여러
ALIAS컬럼이 있는Distributed테이블을 쿼리하거나 병렬 레플리카를 사용하면서 해당 컬럼을ORDER BY/GROUP BY/HAVING와 함께 참조할 때 발생하는NUMBER_OF_COLUMNS_DOESNT_MATCH오류를 수정했습니다. #107913 (yakov-olkhovskiy). - 읽기 전용 테이블의 데이터 파트를 갱신하는 중 발생하는 일시적 오류가 더 이상 백그라운드 갱신 작업을 영구적으로 중지시키지 않습니다. #108034 (alexey-milovidov).
- 이제
AggregateFunction상태 컬럼에index_granularity_bytes가 적용됩니다. 이전에는 이러한 컬럼(예:AggregatingMergeTree테이블 및 집계 프로젝션의uniqExact상태)에 세분화 단위의 바이트 제한이 적용되지 않아, 구성된 제한보다 훨씬 큰 세분화 단위가 생성되고 읽기 증폭 및 쿼리 시 메모리 사용량이 증가했습니다. #108297 (groeneai). - 활성 레플리카 수가 과반수에 미치지 않을 때
insert_quorum = 'auto'가 삽입을 즉시 거부하지 않던 문제를 수정했습니다. 이제 이러한 삽입은 로컬 파트를 기록한 후 나중에UNKNOWN_STATUS_OF_INSERT로 시간 초과되는 대신 즉시TOO_FEW_LIVE_REPLICAS로 실패합니다. #108800 (gagandhakrey). optimize_on_insert로 인해 삽입 블록이 비어 있을 때(예:SummingMergeTree에서 행의 합계가 0인 경우) 중복 제거를 사용하는 비동기 삽입에서 발생하던 서버 충돌을 수정했습니다. #109229 (Diskein).- 머지가
ALTER TABLE ... RENAME COLUMN과 동시에 실행되거나 컬럼의 유일한 값이 경량UPDATE에서 비롯된 경우, 기본 표현식이 없는 컬럼의 데이터가 손실되던 문제를 수정했습니다. 해당 컬럼이 병합된 파트에서 삭제되어 다시 읽을 때 모든 값이 NULL로 반환될 수 있었습니다. #109356 (groeneai). GROUPING SETS,ROLLUP또는CUBE와 병렬로uniqExact집계 상태를 머지할 때 드물게 발생하던 서버 종료를 수정했습니다. #109389 (groeneai).- 롤업 머지가 무기한 재예약되던 문제를 수정했습니다. #109410 (Michicosun).
- 구체화된 가상 컬럼 또는 영구 가상 컬럼이 있는 테이블의
GROUP BY뮤테이션 문제를 수정했습니다. #109532 (Michicosun). - 새로 삽입된(0레벨) 파트가 있는 테이블에서
add_minmax_index_for_block_number_column/add_minmax_index_for_block_offset_column이 생성한 암시적 minmax 인덱스에 대해ALTER TABLE ... MATERIALIZE INDEX를 실행할 때 발생하는UNKNOWN_IDENTIFIER: Missing columns: '_block_offset'오류를 수정했습니다. 이제 해당 파트에서 실패하는 대신 인덱스가 생성됩니다. #110236 (groeneai). - 읽기 전용 객체 스토리지 레플리카(
read_only = true로 구성된 디스크)가refresh_parts_interval을 통해 새 파트를 검색하지 못하던 문제와, 이러한 디스크에서 “table_disk is not supported for non-ObjectStorage disks” 메시지와 함께table_disk = true가 거부되던 문제를 수정했습니다. #110460 (jkartseva). - 표현식에서 IN 연산자(다른
ALIAS컬럼을 통해 사용하는 경우 포함)를 사용하는ALIAS컬럼이 있는 테이블에서ALTER TABLE ... DROP COLUMN,ALTER TABLE ... DELETE/UPDATE뮤테이션 및 경량 DELETE 수행 시 발생하는 LOGICAL_ERROR(“No set is registered for key”)를 수정했습니다. #111039 (PedroTadim). - 쿼리 실행 중 MergeTree 프로젝션에 ROW POLICY가 적용되지 않던 문제를 수정했습니다. #112329 (yariks5s).
- 직접 I/O를 사용하는
encrypted디스크에서Compact파트를 읽을 때 발생하던ReadBufferFromEncryptedFile: Wrong file position논리 오류를 수정했습니다. 이 오류로 인해 머지가system.replication_queue에서 멈추던 문제를 해결했습니다. #112943 (alexey-milovidov). merge테이블 함수와Merge테이블 엔진을 통해 내부_temporary_and_external_tables데이터베이스를 읽을 수 있던 문제를 수정했습니다. 이 문제로 한 세션에서 다른 세션 및 사용자의 임시 테이블을 읽을 수 있었고, 이전 분석기 경로에서는 예외가 발생했습니다. 이제 데이터베이스 정규식에서 해당 데이터베이스를 제외하며, 직접 액세스와 마찬가지로 명시적으로 이름을 지정하는 것도 거부됩니다. #113224 (alexey-milovidov).- 스칼라 하위 쿼리가 포함된 ROW POLICY가
Merge테이블을 통해 테이블을 읽은 뒤 한 번만 평가되고 이후 계속 재사용되던 문제를 수정했습니다. 파싱된 정책 조건은 캐시되어 모든 쿼리에서 공유되는데,Merge를 통한 읽기가 캐시된 표현식을 제자리에서 다시 작성하면서 동일한 정책을 사용하는 동시 쿼리 간 데이터 레이스도 발생했습니다. #113563 (alexey-milovidov). - 사용자 정의 키 병렬 레플리카가 있는
Distributed테이블을 포함한Merge테이블을 읽을 때 발생하던CANNOT_CONVERT_TYPE오류를 수정했습니다. #113742 (alexey-milovidov). - 자식 테이블이
IN을 포함하는ALIAS컬럼을 선언하고 해당 컬럼의 기본값이 자식 테이블마다 다를 때Merge테이블을 통해 읽으면 발생하던Logical error: No set is registered for key ...를 수정했습니다. #113757 (groeneai). - mergeTreeIndex 테이블 함수가 원본 테이블의 SELECT ROW POLICY로 숨겨진 행의 프라이머리 키 및 minmax 인덱스 값을 노출하던 ROW POLICY 우회 문제를 수정했습니다. 이제 ROW POLICY가 적용된 테이블에 대해 mergeTreeIndex를 읽는 작업은 거부됩니다. #115304 (yariks5s).
데이터 타입 및 직렬화 관련 수정 사항
LowCardinality숫자 타입 사용 시ARRAY JOIN에서 발생하던 예외를 수정했습니다. #91784 (Ergus).data_type_default_nullable = 1이고 테이블을Replicated데이터베이스 또는ON CLUSTER를 통해 생성할 때NOT NULL컬럼이 자동으로Nullable로 생성되던 문제를 수정했습니다. #97572 (xiaohuanlin).- 뷰가
integer컬럼을Bool컬럼에 매핑하는 경우,query_plan_enable_optimizations = 0이 설정된MaterializedView쿼리가 잘못된 행 수를 반환하던 문제를 수정했습니다. #100692 (Maximus5). - 기본 직렬화가 아닌 직렬화가 적용된 컬럼의 뮤테이션 후 파트 메타데이터가 일관되지 않던 문제를 수정했습니다. #102817 (korowa).
Nullable(Tuple(...))컬럼에서 추출한 서브컬럼을 읽을 때NULL이 올바르게 전파되지 않던 문제를 수정했습니다. 예를 들어tup Nullable(Tuple(s Nullable(String)))에서 이제SELECT tup.s는 외부 튜플이NULL인 행에 대해 잘못된 값 대신 올바르게NULL을 반환합니다. 이는NULL을 표현할 수 있는 모든 요소 타입, 즉Nullable,Dynamic,Variant,LowCardinality(Nullable(...))에 적용됩니다. #102942 (nihalzp).recursiveRemoveLowCardinality가 사용자 지정 geometry 타입 이름(예:LineString과Ring,MultiLineString과Polygon)을 삭제하여 geometry 타입이 잘못 해석되던 문제를 수정했습니다. #103041 (jh0x).- 딕셔너리에 값이 없는
Nullable키 컬럼으로 호출할 때dictGetOrNull이SELECT프로젝션의 다른 컬럼을 자동으로NULL로 덮어쓰던 문제를 수정했습니다. 이 함수는 입력 별칭의 null 맵을 제자리에서 변경했지만, 이제 뮤테이션 전에 결과 컬럼을 딥 클론합니다. #104327 (groeneai). optimize_skip_unused_shards_rewrite_in이 활성화된 경우 세그먼트 키에 빈IN튜플이 포함된 분산 쿼리에서 발생하던 예외를 수정했습니다. #104966 (alexey-milovidov).Float64리터럴과의 비교를 포함해Float32컬럼의 count-min 통계에 대한PREWHERE선택도 추정 문제를 수정했습니다. #105047 (hanfei1991).quantileExactWeightedInterpolated,quantileDD또는quantilePrometheusHistogram집계 상태를 해당 복수형quantilesXxxMerge함수와 병합할 때(또는 그 반대) 발생하던ILLEGAL_TYPE_OF_ARGUMENT문제를 수정했습니다. 이 3개 분위수 계열의 단수형과 복수형 변형은 동일한 내부 집계 상태를 공유하지만 내부 이름 매핑 테이블에 등록되지 않아, 함수 간 상태 병합과 이들 계열의 함수 융합 최적화가 거부되었습니다. #105189 (groeneai).- 결과가
Date범위를 벗어나는Date32및DateTime64인수에서toStartOfWeek,toLastDayOfWeek,toMonday,toStartOfMonth,toLastDayOfMonth,toStartOfQuarter,toStartOfYear가 잘못된 결과를 반환하던 문제를 수정했습니다. 임의의 날짜로 오버플로우하는 대신,1970-01-01이전 결과는 이제1970-01-01로 제한되며2149-06-06이후 결과는2149-06-06로 제한됩니다. 또한 범위를 벗어난 값을 포함하는Date32또는DateTime64키의WHERE절에서 이러한 함수를 사용할 때 잘못된 쿼리 결과(파트 및 그래뉼이 잘못 제거됨)가 발생하던 문제도 수정했습니다. #105244 (yariks5s). - 첫 번째 인수가 모든 대안이 두 번째 인수의 타입과 호환되지 않는
Variant배열이고variant_throw_on_type_mismatch가 비활성화된 경우arrayRemove에서 발생하던 논리 오류를 수정했습니다. 이제 함수는 비교를 “절대 같지 않음”으로 처리하며, 서버 측assertTypeEquality실패를 유발하는 대신 배열을 변경 없이 반환합니다. #105248 (groeneai). Dynamic에서toFloat64/toUInt32/toString등이cast_keep_nullable를 무시하던 문제를 수정했습니다. #105467 (Avogar).- 널 허용 인수와 함께
GROUP BY ... WITH ROLLUP,WITH CUBE또는WITH TOTALS를 사용할 때uniqStateOrNull/uniqStateOrDefault/uniqOrNullState(및uniq에 대한 유사한 combinator 체인)에서 발생하던 서버 segfault를 수정했습니다. #105470 (groeneai). - 음수(에포크 이전)
DateTime64값에서toStartOfMillisecond및toStartOfMicrosecond가 거의 1초 차이 나는 결과를 반환하던 문제를 수정하고,INT64_MIN에 가까운DateTime64입력에서toStartOfSecond,toStartOfMillisecond,toStartOfMicrosecond에 발생하던UndefinedBehaviorSanitizersigned-integer-overflow를 수정했습니다. #105482 (groeneai). JSON의singleValueOrNull상태를 역직렬화할 때 서버가 종료되던 문제를 수정했습니다. #105535 (Avogar).- JSON의 공유 데이터에 삽입할 때
input_format_try_infer_datetimes가 무시되던 문제를 수정했습니다. #105544 (Avogar). JSONExtract및 텍스트 역직렬화에서 범위를 벗어난 값에 대해DateTime값이 래핑되던 문제를 수정했습니다. #105551 (Avogar).- 동일한 VALUES 절에서 크기가 서로 다른 튜플을
String컬럼에 삽입할 때 발생하던 충돌을 수정했습니다. #105582 (Avogar). - NULL 값을 포함하는 시간대가 지정된
DateTime에서toString사용 시 발생하던 NOT_IMPLEMENTED 오류를 수정했습니다. #105587 (yariks5s). - Native 입력에서 형식이 잘못된 flattened
Dynamic컬럼에 대한 유효성 검사를 추가했습니다. #105666 (Avogar). - 결과 타입이
Variant이고 두 번째 또는 세 번째 분기가Int64에 맞는UInt64리터럴에 대한 상수 조건if인if표현식의 쿼리 계획 중 발생하던LOGICAL_ERROR(Unexpected return type from if)를 수정했습니다. #105680 (groeneai). - 집계 상태를 직렬화할 때(예: 병렬 레플리카, 바이너리 상태 포맷터를 통한
sumMapState, 외부 집계)Nested(... Nullable(Decimal(P, S)))컬럼에서sumMap및sumMapWithOverflow실행 시 발생하던Bad get: has Decimal32, requested Decimal128문제를 수정했습니다. #105816 (groeneai). ALTER MODIFY COLUMN ... LowCardinality(...)뮤테이션 전에 온더플라이UPDATE/DELETE뮤테이션이 대기열에 있는 테이블에서apply_mutations_on_fly = 1을 사용할 때 발생하던Expected ColumnLowCardinality, got String/Bad cast from type DB::ColumnString to DB::ColumnLowCardinality오류를 수정했습니다. #105847 (Algunenano).- 새 분석기에서
IN Array(...)필터를 사용하는 분산 쿼리의Cannot find column오류를 수정했습니다. #105894 (KochetovNicolai). - 한
ALTER이STATISTICS가 있는 컬럼을 삭제하는 동시에 다른ALTER이 해당 컬럼을Nullable로 수정할 때 발생하던 서버 종료 문제를 수정했습니다. #105917 (groeneai). RowBinaryWithNamesAndTypes타입 디코딩(input_format_binary_decode_types_in_binary_format = 1) 중 범위를 벗어난IntervalKind바이트를 거부하고, 이후 해시 경로에서 정의되지 않은 동작을 일으킬 수 있는 잘못된 kind의DataTypeInterval을 생성하는 대신 명확한INCORRECT_DATA오류를 반환하도록 했습니다. #106261 (groeneai).- Nullable(JSON)에서 ‘null’ 서브컬럼을 null-map이 아닌 JSON 경로로 읽도록 수정했습니다. #106295 (Avogar).
- 배열이 모두 비어 있고 키가 상수가 아닌 컬럼을 해싱할 때
sipHash64Keyed,sipHash128Keyed,sipHash128ReferenceKeyed에서 발생하던 범위를 벗어난 읽기 문제를 수정했습니다. #106355 (Algunenano). - 두 번째 인수가 상수가 아닌 튜플일 때
IN의 첫 번째 인수에 스칼라 서브쿼리를 사용할 수 없었던 버그를 수정했습니다. #106610 (yariks5s). LowCardinality(DateTime)컬럼을 텍스트 포맷(CSV, TSV, JSONEachRow 등)으로 직렬화할 때session_timezone이 무시되는 문제를 수정했습니다. 이전에는 서버에서LowCardinality(DateTime)컬럼을 처음 기록한 후, 해당 컬럼을 기록하는 이후의 모든 쿼리가session_timezone과 관계없이 처음 확인된 시간대의 현지 시각 문자열을 표시했습니다. #106634 (groeneai).- 조건이 상수
Nullable(Nothing)값일 때if및multiIf에서 발생하던 서버 종료 문제를 수정했습니다. #106678 (groeneai). sumMap/-Map조합자가ILLEGAL_TYPE_OF_ARGUMENT: Values for -Map cannot be summed오류와 함께 사용자 지정 이름의 숫자 값 타입(예:SimpleAggregateFunction(sum, T)및Bool)을 거부하여 기존에 작동하던 집계를 중단시킨 변경 사항을 되돌렸습니다. #106729 (fm4v).- 키 컬럼이
LowCardinality이고 프레디케이트 상수가LowCardinality(Nullable(...))일 때MinMax통계로 파트를 프루닝하는 동안 발생하던Bad cast예외를 수정했습니다. #106793 (groeneai). - ASCII가 아닌 입력 바이트가 포함된
parseDateTime의 논리 오류를 수정했습니다. #106856 (Avogar). - 집계 함수 인수를 널 허용 타입으로 캐스팅해야 하는 경우,
optimize_rewrite_aggregate_function_with_if최적화와 관련된 분산 쿼리에서 발생하는THERE_IS_NO_COLUMN예외를 수정했습니다. #106908 (yakov-olkhovskiy). - 가중치 배열에 큰 정수 값이 포함된 경우
arrayLevenshteinDistanceWeighted및arraySimilarity에서 발생하는 부호 있는 정수 오버플로우(정의되지 않은 동작)를 수정했습니다. 이제 정수 가중치의 가중 거리는 더 넓은 정수 타입에 누적되므로 큰 정수 가중치도 더 이상 오버플로우하지 않으며 정확하게 유지됩니다. #106934 (groeneai). - 로컬 저장소 순서가 전역 순서와 다른
Map변형을 가진Variant컬럼이 포함된 정렬된 블록을 병합할 때 발생하는 충돌(Source column is not Map/SIGSEGV)을 수정했습니다. #107011 (groeneai). - 지연 머티리얼라이즈로 인해 정렬 컬럼 앞에 다른 컬럼이 배치될 때
ORDER BY <numeric column> ... LIMIT n쿼리에서 발생하는TYPE_MISMATCH오류(“Cannot convert string … to type …”)를 수정했습니다. 이제 상위 K 임계값을 올바른 정렬 컬럼에서 읽습니다. #107060 (groeneai). - 타입이 다른 컬럼 간에 해제된 컬럼명(“교환”)을 재사용하는 복합
ALTER TABLE ... RENAME COLUMN a TO b, RENAME COLUMN c TO a문제를 수정했습니다. 구체화된 파트에 잘못된 컬럼 타입이 기록되어 이후SELECT가Conversion between numeric types and IPv6 is not supported오류와 함께 실패하거나, 디버그 빌드에서는 파트 로드 중 중단되었습니다. #107064 (groeneai). - 경계 배열에
NaN이 포함될 때 발생하는roundDown함수의 비결정적 결과를 수정했습니다. 동일한 입력 값이 배치 내 주변 행에 따라 유한한 경계 또는NaN을 반환할 수 있었습니다. 이제NaN경계는 무시되므로 결과는 유한한 경계에만 의존합니다. #107065 (groeneai). - 보간된 분위수가 소수이지만 범위 내에 있을 때
Date및DateTime인수에 대해quantileTDigest및quantileTDigestWeighted가DECIMAL_OVERFLOW를 발생시키는 문제를 수정했습니다(예: 모든 값이 타입 범위 내에 있는quantileTDigestWeighted(date, weight)). 이제 소수 결과는quantilesTDigestWeighted와 일치하도록 결과 타입으로 잘리며, 실제 범위를 벗어난 값은 계속 오류를 발생시킵니다. #107066 (groeneai). Enum8/Enum16타입 정의에서 범위를 벗어난 정수 값이 자동으로 잘리던 문제를 수정했습니다. 이제Enum8('a' = 200)은 자동으로Enum8('a' = -56)을 생성하는 대신ARGUMENT_OUT_OF_BOUND를 발생시킵니다. #107081 (groeneai).- 여러 행이 선행 컬럼에서 동률일 때 널 허용 컬럼을 기준으로 정렬하는 다중 컬럼
ORDER BY ... LIMIT쿼리에서 잘못된 행 순서가 발생하는 문제(및 디버그 빌드의LOGICAL_ERROR“Rows are not sorted with permutation”)를 수정했습니다. #107094 (groeneai). - 기본값으로 채워진
Array(Tuple(...))컬럼을 읽을 때 발생하는Logical error: 'Bad cast from type DB::ColumnVector<...> to DB::ColumnTuple'를 수정했습니다. 이는ALTER TABLE ... ADD COLUMN이후 또는 즉석에서 적용된 미완료ALTER TABLE ... CLEAR COLUMN뮤테이션 이후에 발생할 수 있습니다. #107232 (groeneai). - TTL 실행 중 나중에
ILLEGAL_TYPE_OF_ARGUMENT오류로 실패하는 대신,CREATE TABLE시점에 TTL 표현식에서 지원되지 않는AggregateFunction컬럼 사용(예:TTL toDateTime(state))을 거부하도록 수정했습니다. 이는Variant대안 및Dynamic값 내부에 포함된 상태에도 적용됩니다.finalizeAggregation과 같이 상태를 인식하는 유효한 소비자는 계속 허용됩니다. #107366 (Ria-K912). Decimal크기 인수를 사용하는arrayResize를 수정했습니다. 이제 원시 스케일 미적용 표현이 아니라 실제 값으로 크기를 해석합니다(예:arrayResize([1, 2, 3], 1.5::Decimal(2, 1))는 원소 하나를 반환합니다). #107389 (alexey-milovidov).ALTER MODIFY COLUMN ... LowCardinality(...)뮤테이션 이전에, 대상 컬럼이 앞선 즉석UPDATE의 함수 인수로도 읽히는 보류 중인 즉석UPDATE가 있는 테이블에서apply_mutations_on_fly = 1을 사용할 때 발생하는LOGICAL_ERROR: Unexpected return type from materialize(및 유사한 유형 불일치 오류)를 수정했습니다. #107475 (groeneai).- Arrow/ORC 데이터를
LowCardinality(Nullable(...))컬럼에 삽입할 때 NULL 값이 조용히 빈 문자열로 변환되는 문제를 수정했습니다. 이는 26.5에서 도입된 회귀였습니다. #107532 (Ergus). make_distributed_plan = 1인 쿼리에서 양쪽에 공통 유형이 없는 함수로 래핑된 키를 조인할 때 발생하는LOGICAL_ERROR(“Input nodes size mismatch in dag”)를 수정했습니다(예: 오른쪽 키가UInt64인ON intDiv(-1, t1.key) = t2.key). #107701 (groeneai).- 서버 설정
insert_deduplication_version = new_unified_hash에서String및Array컬럼의 해시를 잘못 계산하던 삽입 중복 제거 문제를 수정했습니다. 중복 제거 해시가 삽입된 블록 내 행의 위치에 따라 달라져 동일한 삽입이 중복 제거되지 않을 수 있었습니다. #107915 (CheSema). LowCardinality인수로Dynamic키를 가진Map을 검색할 때has에서 발생하던 서버 종료 문제를 수정했습니다. #107956 (groeneai).PREWHERE와 함께 사용되는Map서브컬럼의 성능 회귀를 수정했습니다. #107988 (Avogar).accurateCastOrNull또는accurateCastOrDefault를 사용하여Tuple내부에 중첩된Dynamic또는Variant컬럼을 널 허용이 아닌 원소 타입으로 캐스팅할 때 발생하는 논리 오류를 수정했습니다. #108061 (alexey-milovidov).- 희소 저장된 컬럼에서 직접 읽기 폴백 경로를 통해
text인덱스를 읽는LIKE쿼리에서 발생하는Bad cast from type DB::ColumnSparse to DB::ColumnVector<char8_t>논리 오류 예외를 수정했습니다. #108068 (groeneai). - 비상수이거나 거짓인 조건의
ALTER UPDATE col = ... WHERE <cond>뒤에ALTER MODIFY COLUMN col <new type>를 실행한 후apply_mutations_on_fly = 1에서 컬럼을 읽을 때 발생하던LOGICAL_ERROR(“Unexpected return type from if”)를 수정했습니다. #108128 (groeneai). Int64범위 한계에 가까운 극단적인DateTime64값에서hour및minute단위로dateDiff를 사용할 때 발생하던signed integer overflow(정의되지 않은 동작)를 수정했습니다. #108229 (groeneai).Array(Dynamic)또는Array(Variant)를accurateCastOrNull로QBit에 캐스팅할 때 발생하던 서버 예외(IColumn::insertFrom의Logical error)를 수정했습니다. 예:accurateCastOrNull(CAST(range(114), 'Array(Dynamic)'), 'QBit(Float32, 114)'). #108288 (groeneai).- 시간대를 지정한
parseDateTimeBestEffort가toString(Nullable(DateTime64))의 NULL 행에서CANNOT_PARSE_DATETIME을 발생시키던 문제를 수정했습니다. #108310 (yariks5s). max_parser_depth를 큰 값으로 설정했을 때[[[ ... ]]]또는array(array( ... ))처럼 깊게 중첩된 표현식으로 인해 발생하던 서버 충돌(스택 오버플로우)을 수정했습니다. #108493 (Algunenano).- 프로젝션 생성 후
ALTER TABLE ... ADD COLUMN ... DEFAULT로 추가된 컬럼을 읽을 때SELECT *프로젝션이 해당DEFAULT값(예:-1) 대신 컬럼 유형의 기본값(예:0)을 반환하던 문제를 수정했습니다. 기본 테이블에서 읽는 경우는 이미 올바르게 작동했으며, 프로젝션을 다시 빌드하기 전까지 프로젝션이 처리한 읽기만 영향을 받았습니다. #108569 (tiandiwonder). - 키 컬럼
LowCardinality(FixedString)(또는LowCardinality(Nullable(FixedString)))이 키 내 함수로 감싸진 경우 파티션 및 기본 키 프루닝이 아무 알림 없이 비활성화되던 문제를 수정했습니다. 예를 들어WHERE k = 'literal'과 함께PARTITION BY sipHash64(k) % N을 사용하는 경우입니다. 이러한 쿼리는 파티션을 프루닝하지 않고 모든 파티션을 스캔했습니다. #108777 (groeneai). - 이에 의존하는 비교 연산을 수정하기 위해 버킷형 Map 직렬화에서 원래 키 순서를 유지합니다. #109178 (Avogar).
Arrow,ArrowStream,Avro형식 및 레거시ORC,Parquet리더의 스키마 추론이 널 허용 구조체 컬럼에 대해 허용되지 않는Nullable(Tuple)유형을 반환하던 문제를 수정했습니다(allow_experimental_nullable_tuple_type가 비활성화된 경우).DESCRIBE가CREATE TABLE에서 거부되는 유형을 반환해, 추론된 스키마로 테이블을 생성하거나 데이터를 삽입할 때Nullable Tuple type is not allowed오류와 함께 실패했습니다. #109185 (nihalzp).- 서버가 인라인 데이터를 직접 파싱할 때(
send_table_structure_on_insert_with_inline_data = 0) 인라인VALUES데이터와 함께INSERT INTO TABLE FUNCTION(예:remote(...)또는file(...))을 사용하면 컬럼DEFAULT값이 적용되지 않던 버그를 수정했습니다.DEFAULT가 있는 널 비허용 컬럼에 명시적으로NULL을 삽입하면 선언된 기본값 대신0이 저장되었습니다. 이제 일반 테이블INSERT및 HTTP protocol과 동일하게 동작합니다. #109258 (groeneai). groupArrayLastMerge의 segfault를 수정했습니다. 이제 집계 함수 상태의 역직렬화 시 유효성을 검사하므로 손상된 상태로 인해 OOB가 발생하지 않습니다. #109485 (mstetsyuk).- 역직렬화 단계에서 손상된 집계 함수 상태를 거부하도록 하여
largestTriangleThreeBuckets집계 함수의 segfault를 수정했습니다. #109492 (mstetsyuk). - 요청한 ClickHouse 유형이 널 비허용
Tuple을Nullable로 감싸는 경우(예:Nullable(Tuple(...))) Parquet 컬럼을 읽을 때 이전에는TYPE_MISMATCH로 실패하던 문제를 수정했습니다. #109615 (groeneai). - 이제 Parquet v3 네이티브 리더에서 물리적으로 널 허용인 구조체 컬럼(Parquet OPTIONAL 그룹)을
Nullable(Tuple(...))로 읽을 수 있습니다. 이전에는TYPE_MISMATCH가 발생했습니다. #109898 (groeneai). - 깊게 중첩된
Array/Tuple/Map/Object리터럴을 복사하거나 삭제할 때 발생하는 서버 충돌(네이티브 스택 오버플로)을 수정했습니다. 예를 들어max_parser_depth를 높인 상태에서 매우 깊게 중첩된 리터럴이 포함된 쿼리에서 발생할 수 있습니다. #110393 (Algunenano). - 메타데이터 전용
ALTER MODIFY COLUMN T로Nullable(T)로 변경된 컬럼에서optimize_functions_to_subcolumns사용 시 발생하던 잘못된IS NULL/IS NOT NULL/count()결과를 수정했습니다. 변환 전에 작성된 파트에서는.null서브컬럼이 물리적으로 존재하는 부모 컬럼에서 파생되지 않고 스토리지 유형의 기본값(NULL)으로 채워져, 기존의 널이 아닌 행이 NULL로 잘못 보고되었습니다. #110584 (groeneai). LowCardinality키 컬럼이LowCardinality를 다시 도입하는 중첩CAST체인으로 감싸진 경우(예:WHERE CAST(CAST(s, 'LowCardinality(String)'), 'String') < '5') 기본 키 인덱스 분석 중 발생하던LOGICAL_ERROR(“ColumnString에서 ColumnLowCardinality로 잘못 캐스팅”)를 수정했습니다. 디버그 및 새니타이저 빌드에서는 서버가 중단되고, 릴리스 빌드에서는 쿼리가 실패했습니다. #111050 (groeneai).- 이전에는 offsets 버퍼가 너무 작다는
INCORRECT_DATA오류로 거부되었던, Apache Arrow Java 19.0.0 이전 버전(Apache Spark에 번들로 포함됨)에서 생성한 빈 중첩Array또는Map컬럼이 포함된Arrow및ArrowStream데이터를 읽는 문제를 수정했습니다. #111101 (Algunenano). Tuple,Array,Map,Nullable또는Variant같은 컨테이너 컬럼 안에 중첩된 호환 가능한 집계 상태 컬럼(예:quantileState및quantilesState(0.9))에 대한 집합 연산에서 발생하던 논리 오류Block structure mismatch(디버그 및 새니타이저 빌드)와Illegal types of arguments오류를 수정했습니다. #111191 (alexey-milovidov).- 네이티브 프로토콜을 통해 수신한 손상된 복제 인덱스 데이터에 대한 유효성 검사를 추가했습니다. #112331 (Avogar).
- 행 수를 변경하는 materialized view를 거쳐 파티션된 대상 테이블에 쓰는
INSERT에서 발생하던 삽입 중복 제거 중 범위 밖 읽기를 수정했습니다. #112649 (CheSema). - 선언된 정밀도에 매핑되는 타입보다 물리적 타입이 더 넓은
ParquetDECIMAL컬럼(예: 물리적으로INT64로 저장된DECIMAL(9, 2))을 읽을 때 발생하던 범위 초과 쓰기 문제를 수정했습니다. 이러한 파일은 유효한Parquet파일이며 다른 작성 도구에서도 생성되지만, 리더는 선언된 정밀도를 기준으로 대상 컬럼의 크기를 정하는 반면 디코더는 물리적 너비만큼 데이터를 기록해 메모리를 손상시켰습니다. 이제 이러한 파일을 읽을 때 값이 선언된 정밀도에 맞지 않으면 손상된 데이터를 반환하는 대신DECIMAL_OVERFLOW를 발생시키며, 물리적 타입 이상으로 넓은 타입 힌트를 사용하면 데이터 손실 없이 읽을 수 있습니다. #113046 (groeneai). PARTITION BY (a),ORDER BY (b),INDEX ix (b * c) TYPE minmax,PROJECTION p (SELECT (b) ...),CONSTRAINT c CHECK (a > 0),TTL (d + INTERVAL 10 YEAR)또는DEFAULT (a + 1)처럼 불필요한 괄호를 포함해 작성된 정의를 가진 테이블에서ATTACH PARTITION FROM,REPLACE PARTITION,MOVE PARTITION TO TABLE및ReplicatedMergeTree레플리카 추가가Tables have different ...,METADATA_MISMATCH또는INCOMPATIBLE_COLUMNS오류와 함께 실패하던 문제를 수정했습니다. #114188 (alexey-milovidov).http_response_headers또는additional_table_filters가 있는 설정 프로필처럼Map값을 갖는 설정이 포함된 액세스 엔터티가 ClickHouse에서 다시 읽을 수 없는 형식으로 저장되어, 재시작 후 엔터티를 영구적으로 로드할 수 없게 되는 버그를 수정했습니다. #114620 (groeneai).- 빈
String이나 숫자 0처럼 원소 타입의 기본값과 같은 상수LowCardinality검색값에 대해has,indexOf,countEqual,mapContainsKey,mapContainsValue및Map첨자가 “찾을 수 없음”을 반환하던 문제를 수정했습니다. #114624 (groeneai). DISTINCT,QUALIFY, 윈도우 함수 또는 프로젝션의arrayJoin이 포함된 쿼리에서 단순GROUP BY ... LIMIT최적화(설정optimize_trivial_group_by_limit_query)가 잘못된 결과를 반환하던 문제를 수정했습니다. 이러한 요소는 집계 후 그룹을 소비하거나 필터링하므로, 집계를LIMIT + OFFSET개의 키로 제한하면 행이 너무 적게 반환되거나 값이 잘못될 수 있었습니다. 이제 이 최적화는 이러한 쿼리에 적용되지 않습니다. #114695 (alexey-milovidov).- 기본 설정인
optimize_trivial_count_query = 1에서SELECT count(arrayJoin(arr))가 잘못된 결과를 반환하던 문제를 수정했습니다. 배열 원소 수 대신 저장된 행 수가 반환되었으며,file()및url()에서는 쿼리가0을 반환했습니다. #115227 (groeneai). Nullable컬럼에 대한uniqExact(tuple(x))처럼 널 허용 여부를 숨기는 단사 함수로 감싼 인수에서uniq,uniqExact,uniqHLL12및uniqTheta가 잘못된 결과를 반환하던 문제를 수정했습니다.optimize_injective_functions_inside_uniq최적화가 래핑 함수를 제거한 후 NULL 행이 계산되지 않고 건너뛰어졌습니다. #115466 (vdimir).- 동등한 기본 키가 불필요한 바깥쪽 괄호의 유무만 다른 경우 KeeperMap 리더가 공유 메타데이터를 허용하도록 했습니다. #115642 (skuznetsov-clickhouse).
텍스트 인덱스 및 스킵 인덱스 버그 수정
- 여러
minmax스킵 인덱스와use_skip_indexes_for_disjunctions = 1이 설정된MergeTree테이블에서 중첩된coalesce/ifNull비교(예:WHERE coalesce(a, b, coalesce(c, d), e) = const)를 사용하는 쿼리로 인해 서버가 중단되는 문제를 수정했습니다. 이제<op>(coalesce(...), const)의 스킵 인덱스 재작성이 내부coalesce인수에도 재귀적으로 적용되므로, 인덱스별KeyConditionRPN이 분기 추적 코드에서 가정하는 템플릿 RPN과 일치합니다. #103929 (groeneai). - 25.8에서 생성되고 별도의
ALTER TABLE ... ADD COLUMN으로 추가된 컬럼의 스킵 인덱스를 포함하는 파트에서ALTER TABLE ... MATERIALIZE INDEX실행 시 발생하는NOT_FOUND_COLUMN_IN_BLOCK문제를 수정했습니다. 이제 강제 재계산 시 뮤테이션이 해당 파트의 기존 모든 스킵 인덱스와 프로젝션에 필요한 모든 컬럼을 올바르게 읽습니다. #105039 (groeneai). use_query_condition_cache = 1(기본값)일 때SELECT쿼리 결과가 조용히 과소 집계되는 문제를 수정했습니다. bloom-filter 스킵 인덱스가 있는 컬럼에 대해PREWHERE pk_prefix = X WHERE non_pk IN (...)형태의 쿼리를 실행하면pk_prefix = X프레디케이트의QueryConditionCache가 오염되어, 이후 정상적인SELECT count() ... WHERE pk_prefix = X가 부정확하게 과소 집계된 결과를 반환했습니다. 모든 26.x 릴리스에 영향을 미쳤습니다. #105686 (groeneai).- 벡터 검색 쿼리가 벡터 인덱스 및
minmax같은 다른 스킵 인덱스를 사용하고use_skip_indexes_on_data_read = 1이 설정된 경우 발생하는 예외를 수정했습니다. #106473 (shankar-iyer). - 빈 병합된 파트의 텍스트 인덱스에서 발생하는 “Too many marks” 문제를 수정했습니다. #106867 (azat).
query_plan_optimize_lazy_final이 활성화된 상태에서 텍스트 인덱스 필터와 함께FINAL을 사용해ReplacingMergeTree테이블을 쿼리할 때 잘못된 결과가 반환되는 문제를 수정했습니다. 지연 실행FINAL최적화가 텍스트 인덱스의 직접 읽기를 재현하지 못하는 읽기 단계를 생성하여 필터가 일치하는 모든 행을 제거했습니다. #106894 (Ergus).LowCardinality멤버를 포함하는Variant상수를 키 표현식이 비단조 결정론적 함수인 키 컬럼(예:sipHash64(col)에 대한minmax스킵 인덱스)과 비교할 때 발생하는LOGICAL ERROR(Bad cast from type DB::ColumnString to DB::ColumnLowCardinality)를 수정했습니다. #107111 (groeneai).use_skip_indexes_for_top_k최적화가 활성화되어 있고 정렬 컬럼에minmax스킵 인덱스가 있는 파트에서 경량DELETE로 행이 제거된 경우,ORDER BY <col> LIMIT n이 잘못된(대개 비어 있는) 결과를 반환하는 문제를 수정했습니다. 이제 이 최적화는 경량 삭제된 파트의 오래된 minmax 값을 실제 상위 행을 보유한 파트보다 높은 순위로 지정하지 않습니다. #107320 (groeneai).- Set 스킵 인덱스가 LowCardinality 컬럼의 그래뉼을 프루닝하지 않는 문제를 수정했습니다. #107868 (thevar1able).
- 이제
use_skip_indexes_on_data_read설정을compatibility설정을 통해 26.1 이전 기본값인false로 되돌릴 수 있습니다. 이에 따라 on-data-read 경로가minmax/set/bloom_filter스킵 인덱스의 마크 범위 프루닝을 방해하는 성능 회귀를 우회할 수 있습니다. #108330 (egor-click). - 부분적으로 구체화된 여러 텍스트 인덱스에 대한 직접 읽기 문제를 수정했습니다. #108607 (CurtizJ).
- 분석기를 사용해
Distributed엔진 테이블을 통해 테이블을 쿼리할 때mapValues(map)또는mapKeys(map)에 정의된 텍스트 인덱스가 조용히 사용되지 않던 문제를 수정했습니다. 로컬 테이블 및cluster()/remote()를 통해서는 인덱스가 사용되었지만,Distributed엔진 테이블을 통한 쿼리에서는 인덱스를 건너뛰었고(force_data_skipping_indices사용 시INDEX_NOT_USED오류 발생) 문제가 발생했습니다. #109188 (groeneai). - 필수 인덱스 인수가 생략되었을 때
CREATE HYPOTHETICAL INDEX ... TYPE set(및ngrambf_v1/tokenbf_v1)에서 발생하던 서버 크래시를 수정했습니다. 이제 이러한 SQL 문은 명확한 오류와 함께 거부됩니다. #109294 (groeneai). - 텍스트 인덱스가 있을 때 빈 검색 문자열을 사용하는 함수
has,mapContainsKey,mapContainsValue가 잘못된 결과를 반환하던 문제를 수정했습니다. #110246 (rschu1ze). - 병합할 파트 중 하나가 비어 있을 때(예: mutation으로 해당 파트의 모든 행을 삭제한 후) 텍스트 인덱스가 있는 파트를 머지하는 과정에서 발생하던
ATTEMPT_TO_READ_AFTER_EOF오류를 수정했습니다. #112490 (CurtizJ). WHERE절에 점이 많은 큰 문자열 상수가 포함되고 테이블에bloom_filter,tokenbf_v1,ngrambf_v1또는text스킵 인덱스가 있을 때 발생하던 쿼리 계획 최적화 중단 문제를 수정했습니다. 필터 컬럼명을JSONAllPaths(...)인덱스 컬럼과 대조하는 과정에서 이름을 점으로 분할할 수 있는 모든 경우를 열거하여, 스킵 인덱스 조건 생성의 복잡도가 상수 길이에 대해 이차적으로 증가했습니다. #113289 (groeneai).- 행 정책이 쿼리의 유일한 필터이고 정렬 컬럼에
minmax스킵 인덱스가 있을 때ORDER BY ... LIMIT가 요청한 것보다 적은 행을 반환하거나 행을 전혀 반환하지 않던 문제를 수정했습니다. top-K 최적화가 행 정책을 적용하기 전에 읽기 범위를 좁혔습니다. #114073 (alexey-milovidov).
데이터 레이크 버그 수정
- 외부 도구(예: Spark)로 포맷 버전이 업그레이드된 Iceberg 테이블을 읽을 때 발생하는 논리 오류 예외를 수정했습니다. #100407 (alexey-milovidov).
- PREWHERE 최적화가 활성화된 ORC 데이터 파일이 포함된 Iceberg 테이블을 읽을 때 발생하는 예외(
LOGICAL_ERROR: 'PREWHERE passed to format that doesn't support it')를 수정했습니다. #101206 (groeneai). - 동시 Iceberg 메타데이터 업데이트 또는 DeltaLake 테이블의
merge읽기처럼 고정된datalake_table_state없이 읽기 파이프라인에 도달할 수 있는 경로로Iceberg또는DeltaLake데이터 레이크 테이블을 읽을 때 발생하는LOGICAL_ERROR예외를 수정했습니다. #102033 (groeneai). - 비동기 메타데이터 로드 중 일반 데이터베이스에서
Iceberg엔진 테이블을 로드할 때DataLakeConfiguration::getCatalog에서 간헐적으로 발생하는Logical error: 'Database <name> not found'오류를 수정했습니다. #103775 (groeneai). show_data_lake_catalogs_in_system_tables가 활성화된 DataLake 카탈로그 데이터베이스에서 삽입 또는 DDL 문이 존재하지 않는 테이블을 참조할 때 발생하는 과도한 카탈로그/S3 메타데이터 읽기를 수정했습니다. 오타 힌트 제안 경로에서 전체 카탈로그의 모든 테이블에 대한 전체 Iceberg 메타데이터를 로드해 대규모 카탈로그에서는 메모리가 고갈될 수 있었습니다. #104124 (il9ue).- Parquet 파일을 읽을 때
read_bytes값(및system.query_log, 진행률 표시줄 등에 표시되는 여기서 파생된 bytes/s)이 부풀려지는 문제를 수정했습니다. 이전 구현에서는 모든 청크에 row group의 전체 압축된 크기를 보고했으므로, N개 컬럼 중 K개를 읽을 때N / K만큼 과대 계산되었습니다. 이제 선택된 컬럼에 대해서만 합산됩니다. 또한 이전에는 데이터 파일 크기를 전혀 보고하지 않았던 Iceberg 테이블의 파일 수준 진행률 추적도 수정했습니다. #105413 (groeneai). - 설정을 사용하지 않는 다른 작성자(예:
icebergLocal/icebergS3테이블 함수)가 테이블을 업데이트한 후iceberg_use_version_hint = 1을 사용해 Iceberg 테이블을 읽을 때 잘못된 결과가 반환되는 문제를 수정했습니다. 이제 파일이 존재하는 경우 모든 작성자가version-hint.text를 동기화된 상태로 유지하므로, 힌트를 사용하는 후속 리더에서 최신 스냅샷을 확인할 수 있습니다. #105682 (groeneai). - 이제 Iceberg 쓰기에서
Nullable(T)파티션 컬럼의 NULL 값을 보존합니다. 이전에는 ClickHouse가 쓴 NULL이 Spark 또는 다른 Iceberg 리더에서 다시 읽힐 때 내부 유형의 기본값(int의 경우0)으로 표시되었습니다. #105862 (groeneai). - 단일 삭제 파일이 여러 데이터 파일을 참조하고 여러 삭제 파일이 동일한 데이터 파일에 적용될 때
Icebergv2 merge-on-read 위치 삭제에서 잘못된 행이 반환되는 문제를 수정했습니다. 이제 삭제 항목은 참조하는 파일 경로를 기준으로 필터링됩니다. #105888 (groeneai). DETACH+ATTACH주기 또는 서버 재시작 후IcebergLocal테이블 엔진이 읽기 전용이 되어 이후 모든INSERT가Local object storage Local is readonly. (READONLY)오류와 함께 실패하는 문제를 수정했습니다. #106016 (groeneai).- 객체 메타데이터에 blob ETag가 포함되지 않아 Azure Blob Storage(예: Azure 기반 Delta Lake 테이블)에서 파일 시스템 캐시가 자동으로 비활성화되는 문제를 수정했습니다. #106091 (thewisenerd).
- 메타데이터가 구성된 스토리지 위치 외부의 객체에 액세스하지 못하도록 Delta Lake 테이블에 대한 경로 유효성 검사를 추가했습니다. #106115 (scanhex12).
- 이제 Iceberg 파티션 프루닝이 분석기에서 스칼라 서브쿼리 결과를 소스 타입과 대상 타입이 일치하는 내부
_CAST(Const, 'TargetType')로 래핑하는WHERE partition_col = (SELECT ... FROM ...)필터를 올바르게 처리합니다. 이전에는 이러한 필터로 인해 파티션 프루닝이 비활성화되고 전체 테이블 스캔이 수행되었습니다. #106204 (groeneai). - 테이블이 포함된
IcebergREST 카탈로그가 비어 있는 것으로 잘못 보고되던 문제를 수정했습니다. #106301 (LefterisXefteris). - Parquet V3 네이티브 리더를 사용해
SELECT목록에 없는 컬럼에 대한IS NOT NULL을 포함하는 복합WHERE조건으로 Iceberg 또는 S3 테이블을 쿼리할 때 발생하던NOT_FOUND_COLUMN_IN_BLOCK예외를 수정했습니다. #106443 (tiandiwonder). _file또는_path필터로 Iceberg 테이블을 읽을 때 진행 상태가 과도하게 보고되던 문제를 수정했습니다. 이전에는 필터링 여부와 관계없이 매니페스트의 모든 파일이total_bytes_to_read진행 상태에 포함되었습니다. #106491 (PedroTadim).- 쓰기 블록의 컬럼명이 최신 스키마의 필드 ID와 일치하지 않는
Iceberg테이블에 삽입할 때 발생하던 서버 예외(std::out_of_range논리 오류)를 수정했습니다(예: 동시 작성기가iceberg_metadata_staleness_ms기간 내에 컬럼명을 변경한 경우). 이제 삽입은 서버를 중단하는 대신 명확한 쿼리 오류와 함께 실패합니다. #107279 (groeneai). - MsgPack, BSON, ORC, Parquet, JSON, DeltaLake, Iceberg 및 Paimon 형식에서 매우 깊게 중첩된 스키마 또는 값을 읽을 때 발생할 수 있는 서버 스택 오버플로(크래시)를 수정했습니다. 이제 이러한 깊게 중첩된 입력은 예외와 함께 거부됩니다. #107341 (Algunenano).
- 메타데이터 버전 간에 기존
schema-id를 다른 스키마에 다시 바인딩하는 메타데이터가 있는 Iceberg 테이블을 읽을 때 발생하던 크래시(디버그 빌드의LOGICAL_ERROR)와 잘못된 결과가 조용히 반환되는 버그(릴리스 빌드)를 수정했습니다. 이제 이러한 메타데이터는ICEBERG_SPECIFICATION_VIOLATION과 함께 거부됩니다. #107370 (groeneai). - Parquet 데이터 파일에 예약된 행 계보 컬럼(예:
_row_id)이 포함된 Iceberg v3 테이블을 읽는 문제를 수정했습니다. 이제 네이티브 Parquet 리더는 테이블 스키마에 포함되지 않은 예약된 필드 ID에 대해ICEBERG_SPECIFICATION_VIOLATION을 발생시키지 않습니다. #107377 (gregakinman). - 파일이 동시에 교체되는 동안 로컬 디스크 객체 스토리지 디렉터리(예:
local디스크의 Iceberg 테이블)를 나열할 때 발생하던 불필요한filesystem error: in last_write_time: No such file or directory예외를 수정했습니다. 이제 동시에 제거된 항목은 나열 작업을 중단하는 대신 목록에서 제외됩니다. #107432 (groeneai). - Azure에서 Delta Lake 테이블을 읽을 때 발생하던 ‘Account must be specified’ 오류를 수정했습니다. #107620 (SmitaRKulkarni).
- 동등 삭제 파일이 있는 Iceberg 테이블을 읽을 때 발생하는 크래시를 수정했습니다. 동등 삭제 파일의 컬럼은 널 허용인데 테이블 스키마의 해당 컬럼은 널 허용이 아니거나(또는 그 반대인 경우), 삭제 파일에서 읽은 값이 검증되지 않은 캐스트(컬럼 타입 혼동)를 통해 다른 타입의 컬럼에 삽입되어 컬럼이 손상되고 서버가 크래시될 수 있었습니다. #109551 (mstetsyuk).
- 메타데이터 파일마다 decimal(또는 다른 매개변수화된 Primitive) 타입이 서로 다른 공백 형식으로 직렬화된 Iceberg 테이블을 읽을 때 발생하던 잘못된
ICEBERG_SPECIFICATION_VIOLATION오류를 수정했습니다. 예를 들어 테이블 메타데이터에는decimal(20,0)로, 매니페스트에는decimal(20, 0)으로 직렬화된 경우입니다. 이제 사양상 동등한 이러한 타입 문자열은 공백을 무시하고 비교됩니다. #109676 (groeneai). - 기본 정렬 순서에서 인용 처리가 필요한 컬럼(예:
@timestamp)을 참조하는 Iceberg 테이블을 읽지 못하던 문제를 수정했습니다. 합성된 스토리지ORDER BY가 이스케이프 처리되지 않은 컬럼명으로 구성되어SYNTAX_ERROR와 함께 구문 분석에 실패했기 때문에 이러한 테이블을 읽을 수 없었습니다. #110233 (groeneai). - 널 허용
ARRAY또는MAP컬럼을 포함하는 Paimon 테이블을 읽지 못하던 문제를 수정했습니다. 스키마 매퍼가 복합 타입을 ClickHouse에서 허용하지 않는Nullable로 감쌌기 때문에 이러한 테이블은 전혀 읽을 수 없었고,DESC와SELECT모두Nested type Array(Nullable(Int32)) cannot be inside Nullable type오류로 실패했습니다. 이제 널 허용 복합 컬럼은Nullable이 아닌 복합 타입에 매핑되며,NULL값은 빈 값으로 읽습니다. #113450 (groeneai). - 테이블 파일을 쓰기 전에 catalog에 Iceberg 네임스페이스를 등록하도록 했습니다(SeaweedFS에 필요). #114285 (azat).
S3/Azure/객체 스토리지 수정 사항
- 병렬 레플리카가 활성화된 쿼리에서
url,s3또는 유사한 테이블 함수를 사용할 때 발생하는 “Distributed task iterator is not initialized” 예외를 수정했습니다. #100146 (alexey-milovidov). - 플래너가
recursive_with플래그가 설정되어 있지만WITH표현식이 없는SELECT를 생성할 때 클러스터 테이블 함수(s3Cluster,urlCluster,fileCluster, …)에서 발생할 수 있는 서버 segfault를 수정했습니다. #105433 (groeneai). IN (subquery)프레디케이트의Parquet및ORC필터 푸시다운을 수정하여file,url,s3및 객체 스토리지 읽기에서 행 그룹/페이지/bloom 필터 프루닝이 작동하도록 했습니다. #105863 (arsenmuk).- 목록 조회와 읽기 사이에 원격 S3 객체가 더 짧은 콘텐츠로 덮어써질 때 캐시 사전 다운로드 중 발생하는
LOGICAL_ERROR예외를 수정했습니다. #106375 (fm4v). s3테이블 함수가 소문자로 지정된 위치 기반partition_strategy(예:hive)를 자동으로 무시하던 문제를 수정했습니다. #107297 (jkartseva).compatibility = '26.6'설정(hive파티션 전략을 암시적으로 활성화함) 시BAD_ARGUMENTS를 발생시키는 대신 S3 및 객체 스토리지 테이블 경로의{_partition_id}를 자동으로 허용하던 회귀를 수정했습니다. #107437 (LefterisXefteris).- 키-값 인수가 중복될 때
s3및 기타 객체 스토리지 테이블 함수가BAD_ARGUMENTS대신LOGICAL_ERROR를 발생시키던 문제를 수정했습니다. 예:s3('http://...', format = 'CSV', format = 'TSV'). #107670 (groeneai). s3/gcs테이블 함수의 위치 기반 시크릿 인수 형식과 이름 지정 시크릿 인수 형식을 혼용한 잘못된 쿼리를 포맷할 때 발생하는 서버 예외(Logical error: 'index >= result.start')를 수정했습니다. 예:s3('url', 'a', 'b', secret_access_key = 'c'). #107818 (groeneai).- URL 범위의
<s3>엔드포인트 블록이 최상위<s3>기본값보다 우선하도록 S3 설정의 우선순위를 수정했습니다. #109251 (bharatnc). - Azure 서비스에서 발생하는
411 Length Required오류를 수정했습니다. 이제 Poco 기반 Azure HTTP 전송은 헤더를 직접 설정하지 않는 SDK 클라이언트(예: Azure Key Vault)의 요청 본문을 기반으로Content-Length를 설정합니다. #110299 (thevar1able).
S3Queue 수정 사항
- 배치에 처리할 수 없는 파일이 포함되어 있고, 동시에 배치를 처리 중으로 설정하는 Keeper 요청이 실패할 때
enable_hash_ring_filtering = 1을 사용하는S3Queue/AzureQueue에서 발생하던 서버 크래시(범위를 벗어난 접근) 문제를 수정했습니다. #108977 (groeneai). SHOW CREATE,system.query_log, 서버 로그 및EXPLAIN출력에서 자격 증명이 노출되는 문제를 수정했습니다. 이제 모든S3로케이터 형식에서session_token, Google ADC 시크릿, 모든 인수 위치의extra_credentials/headers값, 중복되거나 표현식으로 구성된 시크릿 키, 잘못된 위치 기반 형식(안전하게 차단됨), S3 URL에 포함된 자격 증명이 마스킹됩니다. 이는 명시적 URL 및 명명된 컬렉션을 사용하는s3/s3Cluster테이블 함수, S3 기반 테이블 엔진(S3,GCS, 데이터 레이크 엔진,S3Queue),S3데이터베이스 엔진,BACKUP ... TO S3,Backup데이터베이스 엔진에 적용됩니다. 또한 표현식으로 구성된(SQL UDF에서 인라인된 경우 포함)encrypt/decrypt/HMAC의 시크릿 인수는 이제 프로젝션 이름,EXPLAIN QUERY TREE,EXPLAIN actions에서 숨겨집니다. #109768 (Algunenano).- 영구 처리 노드를 사용하는
S3Queue/AzureQueue의 ordered mode를 수정했습니다. 이제 스트리밍 중에 버킷 잠금이 갱신되므로 TTL 정리(persistent_processing_node_ttl_seconds)가 활성 프로세서의 잠금을 제거하지 않습니다. 잠금 소유권이 상실되더라도 이를 감지하고 보고하며(논리 오류 및ObjectStorageQueueBucketLockLostOwnership프로필 이벤트), 스트리밍은 새 파일 이터레이터로 복구됩니다. #110292 (kssenii).
보안 및 액세스 제어 관련 수정
- HTTP 또는 native protocol을 통해
ENGINE절 없이CREATE TABLE ... TO INNER UUID '...'를 전송할 때CREATE TABLE권한이 있는 모든 사용자가 유발할 수 있는 서버 크래시(SIGSEGV)를 수정했습니다. 동일한 버그로 클라이언트도 크래시될 수 있었습니다. 이제 파서는 null 포인터를 역참조하는 대신 적절한BAD_ARGUMENTS오류를 보고합니다. #105579 (groeneai). allow_experimental_delta_kernel_rs를 활성화한 상태에서 잘못된 바이트가 포함된 자격 증명 또는 옵션으로 DeltaLake 테이블을 쿼리할 때 발생하던 서버 크래시를 수정했습니다(Rust FFI가extern "C"경계를 넘어 패닉을 일으켰습니다). #106109 (Algunenano).- Arrow IPC 포맷 리더(
ArrowColumnToCHColumn)에서 발생하는 여러 힙 범위 밖 읽기를 수정했습니다. 잘못된 형식의 Arrow 파일은 버퍼에 포함된 행 수보다 많은 행을 선언하거나, 부모와 일관되지 않은 list/struct/map 하위 요소 길이를 선언하거나, 단조 증가하지 않는 list 오프셋을 제공하거나, 하위 유효성 비트맵을 잘라낼 수 있어 힙 할당 영역의 끝을 넘어 읽기가 발생할 수 있었습니다. 이는file(),format(), 테이블 함수 또는 ArrowFlight 입력을 통해SELECT권한이 있는 모든 사용자가 유발할 수 있습니다. 이제 원시 포인터에 접근하기 전에 모든 데이터, 오프셋, view-struct 및 유효성 비트맵 버퍼를 검증하며, list/struct/map 형태와 오프셋의 일관성도 확인합니다. #106395 (Algunenano). system.query_log의used_privileges및missing_privileges컬럼에 다른 사용자, 데이터베이스 또는 세션의 무관한 이전 쿼리에서 유출된 권한 문자열이 포함될 수 있던 버그를 수정했습니다. #106425 (alexey-milovidov).- 단일
SELECT권한이 있는 모든 사용자가 유발할 수 있는, 확장되는 HTML 엔터티≫⃒또는≪⃒를 포함한 문자열을 디코딩할 때decodeHTMLComponent에서 발생하던 힙 버퍼 오버플로(서버 크래시)를 수정했습니다. #106741 (Algunenano). - 즉석 뮤테이션(
apply_mutations_on_fly) 또는 패치 파트가PREWHERE전에 행을 필터링할 때 쿼리 조건 캐시로 인해 잘못된 쿼리 결과가 발생하던 문제를 수정했습니다.apply_mutations_on_fly = 1로 읽는 쿼리는 캐시를 오염시켜, 이후apply_mutations_on_fly = 0에서 동일한 프레디케이트를 사용하는 쿼리가 읽어야 할 마크를 건너뛰고 너무 적은 행을 반환할 수 있었습니다. 이번 수정은PREWHERE앞에 필터로 추가되는 행 수준 보안 정책도 처리합니다. 제한적인 행 정책에서 실행된 쿼리는 해당 정책 없이 동일한 프레디케이트를 사용하는 이후 쿼리의 캐시를 오염시킬 수 있었습니다. #107145 (groeneai). - 단일
SELECT권한이 있는 모든 사용자가 유발할 수 있는, 범위를 벗어난 이벤트 유형으로 조작된 집계 함수 상태를 마무리할 때windowFunnel에서 발생하던 힙 버퍼 오버플로(서버 크래시)를 수정했습니다. #107412 (uwezkhan). - 비동기 삽입 플러시 경로(
async_insert = 1)에서currentUser(),user(),SESSION_USER,authenticatedUser()가 빈 문자열로 평가되던 문제를 수정했습니다. 이 문제는 이러한 함수를 참조하는DEFAULT/MATERIALIZED컬럼 표현식과 materialized view에 영향을 주었으며, 삽입한 사용자 대신 빈 문자열이 아무런 알림 없이 저장되었습니다. #107541 (groeneai). - 동일한 사용자 또는 역할에 여러 쿼터가 할당된 경우, 이제 비결정적으로 선택된 하나의 쿼터만 적용하는 대신 모든 쿼터를 함께 적용합니다(하나라도 초과하면 쿼리가 거부됨). 이제
SHOW QUOTA및system.quota_usage는 현재 사용자에게 적용되는 모든 쿼터를 표시합니다. #107664 (alexey-milovidov). - 이제
SYSTEM RESET DDL WORKER를 실행하려면 새SYSTEM RESET DDL WORKER권한이 필요합니다. 이전에는 인증된 모든 사용자(readonly사용자 포함)가 이를 실행해 DDL worker 상태를 반복적으로 재설정하고ON CLUSTERDDL을 차단할 수 있었습니다. #108460 (groeneai). - 단일
*와일드카드가 정확히 하나의 이름 구성 요소와만 일치하도록ssl_certificate사용자 식별 방식을 수정했습니다(RFC 6125 6.4.3). 이전에는CN또는DNS:SAN 주체의 와일드카드(예:*.corp.example.com)가evil.deep.corp.example.com과 같은 다중 레이블 이름에도 일치하여, 더 깊은 하위 도메인용 인증서 보유자가 와일드카드 사용자로 인증할 수 있었습니다.URI:SAN 일치 방식은 변경되지 않았습니다. #108472 (groeneai). - 이제 MySQL wire 프로토콜 명령
COM_FIELD_LIST(mysql_list_fields) 및COM_INIT_DB(USE database)에도 SQL 대응식(SHOW COLUMNS/DESCRIBE및USE)과 동일한 액세스 제어가 적용됩니다. 이전에는 사용자가 일부 컬럼에 대한 권한만 가진 테이블의 컬럼명을 노출하거나,SHOW DATABASES권한 없이 현재 데이터베이스를 전환할 수 있었습니다. #108508 (groeneai). http_forbid_headers를 대소문자 구분 없이 일치하도록 수정했습니다. HTTP header 이름은 대소문자를 구분하지 않으므로, 이제Authorization을 금지하면authorization,AUTHORIZATION및 기타 대소문자 변형도 차단됩니다. 구성된header_regexp패턴도 명시적인(?i)플래그 없이 대소문자 구분 없이 일치합니다. #108509 (groeneai).DESCRIBE loop('db', 'table')및DESCRIBE loop(<inner table function>)가SHOW COLUMNS/ 소스 액세스 검사를 우회하여 권한이 없는 사용자가 테이블의 컬럼 스키마를 읽을 수 있었던 메타데이터 노출 문제를 수정했습니다. #108624 (groeneai).- 이전 버전(25.12 이하)에서 잘못된 형식의
auth_header를 사용해 생성한DataLakeCatalog데이터베이스가 26.2 이상으로 업그레이드한 후 ATTACH되지 않아 서버 시작이 실패하던 문제를 수정했습니다. 이제auth_header는CREATE시에만 검증되며,ATTACH시에는 시작 과정이 아니라 처음 사용할 때 카탈로그가 지연 생성됩니다. 따라서 잘못 구성되었거나 연결할 수 없는 카탈로그 데이터베이스 하나가 더 이상 서버 시작을 차단하지 않습니다. #108674 (groeneai). - 악의적으로 큰 AMQP 프레임으로부터 RabbitMQ 연결을 보호하도록 강화하고,
remote_url_allow_hosts검사를rabbitmq_address에 일관되게 적용했습니다. #112479 (kssenii). - 컬럼 목록 없이 실행한
CREATE TABLE ... ENGINE = Distributed(...)가 생성 사용자가 볼 권한이 없는 로컬 테이블의 구조를 노출할 수 있었던 문제를 수정했습니다.CREATE의 경우 로컬 서버가 자체적으로 실행하므로, 이제 구조는 사용자 컨텍스트에서 추론되며Remoteengine에서와 마찬가지로 대상 테이블에 대한SHOW COLUMNS권한이 필요합니다. DDL queue에서 재실행되는CREATE(ON CLUSTER또는Replicated데이터베이스 내의CREATE)에는 적용되지 않습니다. #113220 (groeneai). - 컬럼 목록 없이
CREATE TABLE ... ENGINE = Buffer(...)를 사용할 때, 생성 작업을 수행한 사용자에게 열람 권한이 없는 대상 테이블의 구조가 노출될 수 있던 문제를 수정했습니다. 로컬 서버에서 직접 실행되는CREATE는 이제 해당 사용자의 Context에서 구조를 추론하므로,Merge및Remote와 마찬가지로 대상 테이블에 대한SHOW COLUMNS권한이 필요합니다. DDL 큐(ON CLUSTER또는Replicated데이터베이스 내)에서 재실행된CREATE에는 적용되지 않습니다. #113372 (groeneai). - authentication 전에 읽히는 PostgreSQL wire 프로토콜 시작 메시지의 크기를 제한했습니다. #115708 (alexey-milovidov).
Backup 및 복원 수정 사항
- 순환 종속성이 있는 테이블을 포함한 백업을
RESTORE하는 동안 서버가 비정상 종료되는 문제를 수정했습니다. #103824 (thevar1able). S3디스크 및 객체 스토리지에서 멀티파트 업로드를 통해 기록된 객체에 S3 스토리지 클래스(s3_storage_class/s3_storage_class_name)가 적용되지 않아 대용량 객체가 기본STANDARD클래스로 생성되던 문제를 수정했습니다. 이제 디스크, 객체 스토리지 및 백업에서s3_storage_class와s3_storage_class_name을 모두 옵션 이름으로 사용할 수 있습니다. #106214 (alexey-milovidov).SYSTEM RELOAD CONFIG가 엔드포인트별 Azure Blob Storage 설정(예:use_native_copy)을 삭제하여 서버를 재시작할 때까지 디스크에 구성된 설정이BACKUP/RESTORE에서 무시되던 문제를 수정했습니다. #106357 (jkartseva).- 백업을 시작한 레플리카에 materialized view가 아직 생성되지 않은 Replicated 또는 Shared 데이터베이스에서 갱신 가능 구체화 뷰의 REPLACE 대상이 수집될 때 백업이 FILE_DOESNT_EXIST 오류로 실패하던 문제를 수정했습니다. #106411 (jkartseva).
- 레거시 형식의
azure_blob_storage디스크에서 Azure BACKUP/RESTORE가 엔드포인트 설정을 무시하던 문제를 수정했습니다. #106784 (jkartseva). AzureBlobStorage로 수행하는BACKUP을 수정했습니다. 백업 내 데이터 파일을 복사할 때 대상 객체가 백업 디렉터리 외부에 기록되던 문제를 해결했습니다. 이제S3대상의 백업 객체 존재 여부 확인은 접두사 목록 대신 정확한HeadObject요청을 사용하여 유사한 접두사를 가진 키가 잘못 일치하는 문제를 방지합니다. #107153 (pamarcos).- 증분 백업은 더 이상
.backup메타데이터 파일의<base_backup>위치 지정자에S3자격 증명을 저장하지 않습니다.use_same_s3_credentials_for_base_backup = 1로 생성되었거나 이 백업 위치 지정자와 일치하는 명시적 기준 백업 자격 증명으로 생성된 백업은 비밀 정보가 없는 마커를 저장하며, 복원 시 추가 설정 없이 복원됩니다. 서로 다른 명시적 기준 백업 자격 증명 또는 추가 기준 인증 인수로 생성된 백업은base_backup설정을 사용하여 이를RESTORE에 전달하십시오. 포함된 자격 증명으로 이전 버전에서 생성된 백업도 계속 복원할 수 있습니다. #107357 (pamarcos). ReplicatedMergeTree테이블의RESTORE에서 백업의 중복 콘텐츠 파트가 자동으로 중복 제거되지 않고 유지되도록 수정했습니다. #107652 (pamarcos).- 명시적인
partition_strategy가 없는 파일형 엔진(S3,AzureBlobStorage,URL등)의 경로에{_partition_id}플레이스홀더가 있으면file_like_engine_default_partition_strategy와 관계없이 다시wildcard전략으로 간주됩니다. 이로써BAD_ARGUMENTS(“Partition strategy hive can not be used with a ‘_partition_id’ wildcard in the path”) 오류와 함께 실패하기 시작한 26.6 이전 DDL의 이전 버전과의 호환성을 복원합니다. #111279 (fm4v).
ClickHouse Keeper 수정 사항
- 쓰기 실패 후
Keeper스냅샷 정리 문제를 수정했습니다. 이제 부분 스냅샷이 안전하게 정리되며,latest_snapshot_meta를 갱신하지 않고 실패한 쓰기를 재시도할 수 있습니다. #105779 (antonio2368). - 새 요청 디스패처의 응답 큐가 응답 스레드 시작 전에 가득 찰 때 팔로워 동기화 과정에서 발생하던
Keeper오류를 수정했습니다. #106049 (antonio2368). nuraft_max_log_gap_in_stream설정을 기본값이 아닌 값으로 지정했을 때 Keeper가 시작 중 간헐적으로 멈추는 문제를 수정했습니다(기본값은 0이며, 즉 append_entries 요청의 파이프라이닝을 비활성화합니다). #106220 (al13n321).- Keeper의 내부 Raft TLS가 이제
openSSL.client.verificationMode설정을 따릅니다. 이전에는 이 설정과 관계없이 Keeper 간 Raft 통신에서 피어 인증서 검증이 항상 활성화되어none설정이 무시되었습니다. 이제none은 Raft 피어 인증서 검증을 명시적으로 비활성화하며, 설정을 지정하지 않으면 기존의 기본 보안 동작이 유지됩니다.none을 명시적으로 설정한 구성에서는 업그레이드 후 설정 의도에 따라 Raft 피어 인증서 검증이 중단됩니다. #106726 (antonio2368). - 구성 다시 로드 시 ZooKeeper 세션이 불필요하게 재생성되는 문제를 수정했습니다. #107096 (azat).
- 오래되었거나 중복된 스냅샷을 설치한 후
last_snapshot(및mntr의zk_latest_snapshot_size)으로 보고되는 스냅샷 메타데이터가 이전 값으로 되돌아갈 수 있던 ClickHouse Keeper 버그를 수정했습니다. 이 문제로 인해 동일한 인덱스의 로컬 스냅샷이 피어로 스트리밍되거나 S3에 업로드되는 동안 등록된 스냅샷 파일을 제자리에서 덮어쓸 수도 있었습니다. #107321 (antonio2368). - 부적절한 시점에 ZooKeeper 연결이 끊어질 경우 갱신 가능 구체화 뷰가 멈추는 문제를 수정했습니다. #108234 (al13n321).
- 파티션에 쿼리 매개변수를 사용하는 뮤테이션(
ALTER TABLE ... UPDATE/DELETE ... IN PARTITION {param:Type}) 문제를 수정했습니다. 대체된 파티션 값이 다시 파싱할 수 없는 형식으로 뮤테이션 항목에 직렬화되어 테이블을 로드할 수 없었습니다(복제된 테이블의 경우 모든 레플리카에서 발생). 이제 뮤테이션 명령어는 ZooKeeper 또는 디스크에 기록되기 전에 다시 파싱할 수 있는지도 검증하므로, 유사한 불일치가 발생하면 테이블이 손상되는 대신ALTER쿼리가 실패합니다. #111518 (al13n321). system.zookeeper_info의 데이터를 파싱하는 동안 발생하는 숫자 오버플로우를 수정했습니다. #111629 (kssenii).
크래시 및 안정성 관련 수정
- 새 분석기에서 상수 컬럼과 함께
LIMIT BY,DISTINCT,ORDER BY를 사용할 때 발생하는 NOT_FOUND_COLUMN_IN_BLOCK 예외를 수정했습니다. #93195 (ashrithb). - Hive Metastore와 통신하는 중 발생하는 TTransportException 오류를 처리하기 위해 자동 재시도 메커니즘과 재연결 로직을 추가하여 HiveCatalog 연결 안정성을 개선했습니다. #98471 (otselnik).
- 정적으로 도달할 수 없는 분기에서 분석 단계에 더 이상 예외가 발생하지 않도록 short-circuit 함수(
if,multiIf,and,or등)의 분석기 단계 상수 폴딩을 수정했습니다. 예를 들어 이제WITH 0 AS n SELECT multiIf(n = 0, 0, intDiv(100, n))는 0으로 나누기 오류로 실패하지 않고 올바르게0을 반환합니다. #103157 (fastio). - 자체 상태를 반환하는 집계 함수에
runningAccumulate를 호출할 때 발생하던 서버 종료 문제를 수정했습니다. #105085 (antaljanosbenjamin). system.server_settings에서 보고하는 값과 일치하도록, 런타임에 변경 가능한 서버 설정(max_server_memory_usage,mark_cache_size,max_concurrent_queries, 스레드 풀 크기 등)의 현재 유효 값을 반환하도록getServerSetting을 수정했습니다. #105172 (alexey-milovidov).- 분석기가 활성화된 상태에서
ORDER BY ... WITH FILL INTERPOLATE와LIMIT N BY를 함께 사용할 때 발생하는NOT_FOUND_COLUMN_IN_BLOCK예외를 수정했습니다. #105481 (yakov-olkhovskiy). - 본문이 상관 하위 쿼리인
MATERIALIZEDCTE를IN의 오른쪽 피연산자로 사용할 때 발생하는 서버 예외(Trying to execute PLACEHOLDER action논리 오류)를 수정했습니다. 이제 이러한 CTE는 분석 단계에서 거부되며, CTE를FROM에서 직접 참조할 때 동일한 패턴이 이미 거부되는 방식과 일치합니다. #105518 (groeneai). variant_throw_on_type_mismatch/dynamic_throw_on_type_mismatch=false가 함수 실행 중 예외를 포착하지 못하던 문제를 수정했습니다. #105543 (Avogar).- TTL 표현식이 하위 컬럼을 참조할 때 발생하는 NOT_FOUND_COLUMN_IN_BLOCK 예외를 수정했습니다. #105578 (Avogar).
- PostgreSQL 테이블 함수, PostgreSQL 테이블 엔진 또는 PostgreSQL 소스를 사용하는 딕셔너리를 통해 PostgreSQL에서 읽는 쿼리가 취소되고(예: KILL QUERY 사용), 원격 PostgreSQL 쿼리 취소에 실패할 때 발생할 수 있던 서버 크래시를 수정했습니다. #105949 (rorylshanks).
- 쿼리에 포함되어 전송된 지나치게 큰 문자열 리터럴로 인해 발생할 수 있던 크래시를 수정했습니다. #105996 (nickitat).
ORDER BY에서 정렬 접두사와use_with_fill_by_sorting_prefix가 활성화된 상태로 빈INTERPOLATE ()를 사용할 때 발생하는INVALID_WITH_FILL_EXPRESSION예외를 수정했습니다. 이제 정렬 접두사 컬럼은 암시적 보간 대상에서 올바르게 제외되며, 이름을 명시한INTERPOLATE (col)의 동작과 일치합니다. #106001 (yakov-olkhovskiy).- 이제
RowBinary입력 또는 쿼리 매개변수에서 형식이 잘못된AggregateFunction(uniqTheta, ...)상태는 서버를 종료하는 대신CORRUPTED_DATA로 거부됩니다. #106260 (groeneai). - 제약 조건 기반 최적화(
optimize_using_constraints)를 연관 서브쿼리와 함께 사용할 때 발생하는 크래시와NOT_FOUND_COLUMN_IN_BLOCK오류 가능성을 수정했습니다. #106349 (Algunenano). - 동일한 표현식으로 확장되는 ALIAS 컬럼이 2개 이상(예: 둘 다
toString(x)로 정의됨) 있는Distributed테이블을ORDER BY절과 함께 쿼리하거나, 동일한 표현식을 ALIAS 컬럼 참조와 SELECT 목록에 직접 모두 작성할 때 발생하는NUMBER_OF_COLUMNS_DOESNT_MATCH예외를 수정했습니다. #106404 (yakov-olkhovskiy). multiIf내의 애스터리스크를 테이블 함수의 인수로 전달하는 쿼리(예:numbers(multiIf(*, ...), 2))에서 발생하던LOGICAL_ERROR“컬럼이 아닌 항목의 이름을 가져오려고 합니다:ExpressionList”를 수정했습니다. 이제 쿼리는 확인할 수 없는 매처를UNSUPPORTED_METHOD로 거부합니다. #106647 (groeneai).- 디렉터리 목록 조회 시 무한 재귀를 유발할 수 있는 비정상적인
file글롭 패턴을 거부합니다. 이제 최대 재귀 깊이가 1000으로 제한되며, 이를 초과하는 쿼리는 스택 오버플로우로 서버를 중단시키는 대신TOO_DEEP_RECURSION을 발생시킵니다. #106676 (groeneai). - 쿼리에서 두 곳 이상에서 참조되는 구체화되지 않은 CTE로 테이블 함수
input을 감쌀 때 발생하던'Trying to read from input() twice.'예외를 수정했습니다. 이제 쿼리는 계획 수립 시점에 명확한INVALID_USAGE_OF_INPUT오류로 거부됩니다.input은 일회성 클라이언트 스트림이므로 쿼리 계획에서 단일 소스만 사용할 수 있습니다. #106682 (groeneai). - 파싱 중 예외(예: MEMORY_LIMIT_EXCEEDED)가 발생할 때 일관되지 않은 컬럼이 생성되어 이후 LOGICAL_ERROR를 유발하는 문제를 수정했습니다. #106802 (azat).
input_format_allow_errors_num > 0으로 잘린 Protobuf 데이터를 읽을 때 발생하는 서버 크래시(SIGSEGV)를 수정했습니다. #106905 (atsarevskiy).- RocksDB 핸들이 해제된
EmbeddedRocksDB테이블에서TRUNCATE또는DROP을 실행할 때 발생하는 서버 크래시(null 포인터 역참조)를 수정했습니다. 예를 들어 이전TRUNCATE로 데이터 디렉터리가 비워진read_only테이블에서 발생할 수 있습니다. #106940 (groeneai). - 매우 큰
max_streams_for_files_processing_in_cluster_functions설정에서urlCluster같은*Cluster테이블 함수로 읽을 때 발생하는 예외(LOGICAL_ERROR로 보고되는std::length_error)를 수정했습니다. 이제 스트림 수는 적절한 값으로 제한됩니다. #106946 (groeneai). - 분산 쿼리가 샤드로 전송되기 직전에 취소될 때 발생하는 서버 종료 문제를 수정했습니다. #106950 (groeneai).
- 동일한 원본 테이블을 사용하는 두 materialized view가 동일한 대상 테이블에 쓰고, 종속 뷰가 해당 대상 테이블을 읽는 상황에서
materialized_views_squash_parallel_inserts가 활성화되어 있을 때INSERT시 발생하던 서버 예외(논리 오류this->visited_views == right->visited_views)를 수정했습니다. #107027 (groeneai). - 쓰기 스키마와 일치하지 않는 컬럼(예: 서브컬럼으로 평면화되는
Nested컬럼 또는 명시적 컬럼 하위 집합을 지정한 테이블 함수)을 포함한 DeltaLake 테이블에 삽입할 때 발생하던LOGICAL_ERROR예외를 수정했습니다. 이제 이러한 삽입은 사용자에게 표시되는INCOMPATIBLE_COLUMNS오류와 함께 실패합니다. #107058 (groeneai). - 정규화된 애스터리스크 매처(예:
x.*)가 자체 재귀 항에서 이름으로 재귀 CTE를 참조할 때 발생하던LOGICAL_ERROR(“Table expression … data must be initialized”)를 수정했습니다. 이제 이러한 매처는 해당 위치에서 정규화된 컬럼(x.a)이나 정규화되지 않은 매처(*)와 마찬가지로 재귀 테이블의 컬럼으로 확장됩니다. #107144 (groeneai). - 갱신 가능 구체화 뷰에 정규화되지 않은 이름이 임시 테이블 또는 CTE 이름과 일치하는
REFRESH ... DEPENDS ON <name>종속성이 있을 때, 재시작 시 서버가 크래시 루프에 빠질 수 있던LOGICAL_ERROR(“Unexpected exception in refresh scheduling”)를 수정했습니다. #107156 (groeneai). toString또는concat같은 함수가 NULL과 함께 단일 비어 있지 않은 variant를 포함하는Variant또는Dynamic컬럼에 적용되고, 함수가 입력 컬럼을 그대로 반환할 때 발생하던LOGICAL_ERROR(Variant N (T) has size X, but expected Y)를 수정했습니다. #107374 (groeneai).use_strict_insert_block_limits가 활성화된 상태에서Alias테이블에 비동기INSERT를 수행할 때 발생하던LOGICAL_ERROR(block.rows() == getRows())를 수정했습니다. #107400 (groeneai).- 키 표현식(
ORDER BY,PRIMARY KEY,PARTITION BY또는 스킵INDEX)에 오른쪽 피연산자가 테이블인IN연산자(예:ORDER BY (x IN some_table))가 포함될 때 발생하던 서버 예외(Logical error: Not-ready Set is passed as the second argument for function 'in')를 수정했습니다. 이제 이러한 키 표현식은 테이블 생성 시 거부됩니다. #107424 (groeneai). - 고유 키 집합을 초기화하는 동안 할당에 실패할 경우(예: 메모리 한도에 도달한 경우) 발생할 수 있던 드문
DISTINCT처리 중 서버 크래시를 수정했습니다. #107467 (groeneai). - 다음 작업 전에 캐시된 자격 증명을 갱신하여 임시 S3 자격 증명이 만료된 후
DeltaLake작업이 실패하던 문제를 수정했습니다. STS assume-role 자격 증명도 인증 실패 후 갱신됩니다. #107480 (ahmadov). PARTITION BY키가 있는 테이블을 쿼리할 때 더 큰 표현식으로 감싼IN/NOT IN서브쿼리(예:WHERE (c0 IN (SELECT ...)) != 0)로 인해 발생하던Not-ready Set is passed as the second argument for function 'in'(LOGICAL_ERROR)를 수정했습니다. #107515 (groeneai).log_formatted_queries = 1에서 분산 쿼리 계획을 로컬로 실행할 때(make_distributed_plan+distributed_plan_execute_locally) 발생할 수 있던 크래시(null 포인터 역참조)를 수정했습니다. #107570 (groeneai).- 쿼리를
enable_analyzer = 0으로 실행하면서 대상이Distributed테이블인 구체화된 뷰(Materialized View)를 읽을 때 발생하는 서버 크래시를 수정했습니다. #107653 (groeneai). input_format_allow_errors_num > 0으로 Protobuf 데이터를 읽을 때 동일한 블록에서 유효한 메시지 다음에 잘못된(건너뛸 수 있는) 메시지가 있을 경우 발생하는 서버 크래시(SIGSEGV)를 수정했습니다. #107739 (atsarevskiy).- 원격 테이블 구조를 추론하는 동안 브리지가 응답하지 않을 때
odbc및jdbc테이블 함수가 몇 분간 멈추고 쿼리 취소(KILL QUERY,max_execution_time)를 무시하던 문제를 수정했습니다. #107809 (alexey-milovidov). remote()/remoteSecure()에 전달된 명명된 컬렉션의database/db재정의가 상수 데이터베이스 이름이 아닐 때(예:remote(nc, database = (SELECT 1))) 발생할 수 있던 크래시(null 포인터 역참조)를 수정했습니다. 이제 쿼리는 크래시되는 대신 명확한 오류와 함께 실패합니다. #108271 (groeneai).- 이제
_distance컬럼을 SELECT하는 벡터 검색 쿼리는LOGICAL_ERROR로 실패하는 대신 적절한 오류를 반환합니다. #108423 (rschu1ze). quantileTDigest계열 집계 함수 상태 컬럼을GROUP BY키로 사용하고 여러 스레드에서 동시에 직렬화할 때 발생할 수 있던 크래시(heap-buffer-overflow)를 수정했습니다. #110263 (groeneai).- 역순(내림차순) 정렬 키(
ORDER BY (g, r DESC))가 있는 테이블에서 프라이머리 키 인덱스 분석으로 인해 잘못된 가지치기가 발생하던 문제를 수정했습니다. 선행 키 컬럼의 값이 변경된 뒤 내림차순 키 컬럼이 이어지는 범위에 걸친 그래뉼이 잘못 가지치기되어 일치하는 행이 누락될 수 있었습니다. #111059 (nihalzp). INSERT가 대상이Alias이고 내부 쿼리가 행 수를 변경하는 종속 구체화된 뷰를 통과하며, 별칭을 거쳐 중복 제거 테이블에 연결할 수 있는 경우 발생하는 논리 오류block.rows() == getRows()를 수정했습니다. 이 오류는 릴리스 빌드에서 범위를 벗어난 읽기와 삽입 중복 제거 손상을 유발했습니다. #111103 (alexey-milovidov).String값을 포함하는 잘못된 집계 함수 상태를 역직렬화할 때 범위를 벗어난 메모리 접근으로 인해 발생하는 segfault를 수정했습니다. 이제 이러한 상태는 segfault를 유발하는 대신 검증 후 거부됩니다. #111606 (mstetsyuk).- 블룸 필터 메타데이터가 일관되지 않은 Parquet 파일을 읽을 때 발생하는 크래시를 수정했습니다. 이러한 파일은 실제보다 적은 행을 아무런 경고 없이 반환할 수도 있었습니다. #112498 (tiandiwonder).
Avro처럼 추가를 지원하지 않는 포맷에서File엔진 또는file테이블 함수로 비어 있지 않은 파일에INSERT할 때 발생하는 segfault 및 조용한 데이터 손상 문제를 수정했습니다. 파일 디스크립터 또는 파티션된 경로를 통한 쓰기는 기존 검사를 우회하여 포맷 접두사가 생략되고 기존 데이터 뒤에 두 번째 헤더가 기록되므로 파일을 읽을 수 없게 되었습니다. 이제 이러한INSERT는 일반 경로와 마찬가지로CANNOT_APPEND_TO_FILE오류와 함께 거부됩니다. #112839 (groeneai).- 갱신 쿼리 계획 수립 중 갱신 가능 구체화 뷰가 차단될 때
DROP TABLE및SYSTEM STOP VIEW가 멈추는 문제를 수정했습니다. #113188 (evillique). - 비동기 삽입 큐 항목의 마감 시간이 동일할 때 드물게 서버가 종료되는 문제를 수정했습니다. #113363 (mstetsyuk).
- 예를 들어
SOURCE(FILE(... format 'Parquet'))를 사용하는 딕셔너리와 같이 자체 읽기 버퍼를 소유하는 입력 형식으로 Parquet를 읽을 때 발생하는 힙 메모리 손상 문제를 수정했습니다. 파이프라인이 버퍼를 해제한 후에도 백그라운드 프리페치 및 디코드 작업이 해당 버퍼를 통해 읽기와 쓰기를 수행할 수 있어 서버가 중단될 수 있었습니다. #114668 (groeneai). - 이름이 내부 테이블 이름보다 사전순으로 앞서는
TimeSeries테이블(예:-ts라는 이름의 테이블)이나ENGINE = TimeSeries로 선언된 materialized view를 삭제할 때 멈추는 문제를 수정했습니다. 삭제 작업이 DDL 가드에서 자체 교착 상태에 빠져KILL QUERY로 취소할 수 없었습니다. #114953 (groeneai).
기타 버그 수정
- 함수
like,ilike,notLike,notILike,match가 이제 비상수 needle과 함께 사용되는 상수 haystack(예:'foo' LIKE pattern_column)을 지원합니다. 이전에는ILLEGAL_COLUMN오류가 발생했습니다. #100479 (Onyx2406). - 일반 PROJECTION이 있는 테이블에 대한 VIEW에서 조회할 때 발생하는
NOT_FOUND_COLUMN_IN_BLOCK오류를 수정했습니다. #101218 (amosbird). max_bytes_per_second,max_cpus등의 workload 설정에서 음수 Float64 값(예:-100.5)을 거부합니다. 이전에는 음의 정수만 검증되어 음의 부동 소수점 값으로 손상된 scheduler 노드가 조용히 생성될 수 있었습니다. #101842 (groeneai).- 객체 스토리지 읽기 작업이 이제 쿼리 취소에 신속하게 응답합니다. #103016 (SmitaRKulkarni).
max_insert_block_size_bytes가0(기본값)일 때INSERT파싱 중input_format_max_block_size_bytes가 조용히 무시되던 문제를 수정했습니다. 이제 이 설정이 행 입력 포맷에서 생성되는 블록의 크기를 올바르게 제한합니다. #103068 (Fgrtue).- 후행 null bytes를 잘못 제거해 ClickHouse가 간헐적으로 유효하지 않은 GSSAPI 토큰을 생성하던 문제를 수정했습니다. #103114 (EmeraldShift).
- EXPLAIN SYNTAX가 매개변수화된 뷰(Parameterized View)를 확장합니다. #103263 (jrdi).
INSERT INTO FUNCTION hdfs(...)를 통해 HDFS에 Parquet(및 ORC, Arrow 등 트레일러가 포함되는 다른 포맷)을 쓸 때 발생하는 데이터 손상 문제를 수정했습니다. 26.1부터WriteBufferFromHDFS가finalize()에서 작업 버퍼를 플러시하지 않아, ParquetPAR1푸터를 포함해 각 파일 끝부분의 최대DBMS_DEFAULT_BUFFER_SIZE바이트가 조용히 손실되었습니다. 이러한 파일을 읽으면Not a Parquet file (wrong magic bytes at the end of file)오류가 반환되었습니다. #103268 (groeneai).- join 크기 제한(
max_rows_in_join/max_bytes_in_join)이join_overflow_mode = 'break'와 함께 설정된 경우 상관 서브쿼리에서 잘못된 결과가 반환되거나 logical error가 발생할 수 있던 문제를 수정했습니다. 이제 상관 서브쿼리를 평가하기 위해 내부적으로 생성되는 join은 이러한 사용자 제한을 무시하므로, 조기에 중단되어 행이 누락되지 않습니다. #103322 (groeneai). - 집계 PROJECTION에 서로 다른
IN (...)조건을 사용하는 여러sumIf집계가 포함된 경우 잘못된 결과가 반환되거나 projection이 누락되던 문제를 수정했습니다. #104765 (Ergus). - 0을 넘나드는 부호 있는 정수 타입에서
deltaSumTimestamp가 잘못된 결과를 반환하던 문제를 수정했습니다. #104830 (thevar1able). - 메타데이터 파일이 손상되었거나 로드할 수 없는 새로 attached 상태인
Iceberg,DeltaLake,Hudi테이블에서DELETE FROM실행 시 발생하던Logical error: 'Metadata is not initialized'문제를 수정했습니다. 대신 일반적인 사용자 대상 예외가 보고되며 서버는 계속 실행됩니다. #104917 (groeneai). - 스토리지 절(
ORDER BY,PARTITION BY,PRIMARY KEY,SAMPLE BY,TTL,UNIQUE KEY또는 엔진SETTINGS)을 지정하지만ENGINE이 없는ATTACH TABLE name <clauses>;쿼리는 이제 저장된 정의를 사용해 테이블을 자동으로 다시 연결하고 사용자가 지정한 절을 무시하는 대신BAD_ARGUMENTS를 발생시킵니다. 쿼리 수준 세션SETTINGS(log_comment등)은 계속 적용됩니다. 저장된 메타데이터를 사용해 다시 연결하려면ATTACH TABLE t;를 사용하고, 설정을 변경하려면ATTACH후ALTER TABLE t MODIFY SETTING ...을 사용하십시오. #105068 (groeneai). - 바이너리 또는 문자열 컬럼의 중간 오프셋이 손상된 Arrow 또는 ArrowStream 파일을 읽을 때 발생하는 힙 버퍼 오버플로우와, 지리 태그가 지정된 Arrow 컬럼을 읽을 때 발생하는 널 포인터 역참조 문제를 수정했습니다. #105449 (Algunenano).
ALTER후 압축된Memory테이블에서Dynamic서브컬럼을 읽을 때 서버가 종료되는 문제를 수정했습니다. #105464 (Avogar).WithNames포맷의 스키마 캐시 키에skip_first_lines를 포함했습니다. #105469 (Avogar).- 정렬되지 않은 작은 입력에서
histogram이 잘못된 결과를 반환하는 문제를 수정했습니다. #105548 (Avogar). optimize_trivial_insert_select가 활성화된 경우 테이블 함수에서 삽입 테이블을 사용하는 문제를 수정했습니다. #105555 (Avogar).estimateCompressionRatio윈도 함수가 행 간에 누적 데이터를 잃는 문제를 수정했습니다. #105581 (Avogar).- Hive 파티션 값 추출이 이제
cast_string_to_date_time_mode설정을 준수하며, 기본적으로 파티션 키에서 시간대 접미사(예:+0000,+00:00,Z)가 있는 ISO 8601 타임스탬프를 허용합니다. #105584 (alexey-milovidov). - 잘못된 형식의 행 뒤에
Template입력 형식에서 오류를 복구하는 문제를 수정했습니다. #105735 (niyue). - 핸들러 인수가 공백 하나로 구분되도록
SYSTEM INSTRUMENT ADD포맷팅을 수정했으며, 값이 2개를 초과하거나 최솟값이 최댓값보다 큰 범위를 포함하는 잘못된SLEEPinstrumentation 인수 목록을 거부합니다. #105984 (pamarcos). - Bool 파티션 키에 대한 ALTER TABLE 파티션 작업이 아무 오류 없이 실패하는 문제를 수정했습니다. #106004 (Avogar).
- 기본값이 있는 타입 지정 JSON 경로에서
JSONExtractRaw및JSONHas관련 문제를 수정했습니다. #106005 (Avogar). - 데이터 레이크 구성에서 빈 기본 경로에 잘못된
/접두사가 붙는 문제를 수정했습니다. #106013 (thewisenerd). SHOW DICTIONARIES권한이 일부만 취소된 경우system.dictionaries가 0개 행을 반환하는 문제를 수정했습니다. #106105 (Avogar).(c0 / -42)또는intDiv(c0, -42)처럼 단조 감소 함수가 포함된ORDER BY를 사용하는 테이블 쿼리에서 잘못된 결과가 반환되던 문제를 수정했습니다. 기본 열에 대한 프레디케이트(예:c0 < 0)가 일치하는 행이 포함된 그래뉼을 잘못 제외해 결과가 누락될 수 있었습니다. #106136 (nihalzp).- 삽입 중 형식이 잘못된
DDSketch집계 상태에 대한 유효성 검사를 추가했습니다. #106236 (yariks5s). - 실패한
SLRU다운그레이드 후 파일 시스템 캐시의 일관성 문제를 수정해 항목이 축출 상태에 계속 남아 있지 않도록 했습니다. 또한System/Data분할 캐시의 크기 조정 및 여유 공간 정리 문제를 수정해 제한값이 원자적으로 업데이트되고 두 캐시 세그먼트에서 모두 공간을 회수할 수 있도록 했습니다. #106286 (kssenii). - 가수 시프트의 오프바이원 오류로 인해 비정규
Float16값이Float32로 잘못 변환되던 문제(예: Numpy.npy파일에서 읽을 때)를 수정했습니다. #106343 (jh0x). - 캡처 그룹이 없는 패턴에서
INDEX_OF_POSITIONAL_ARGUMENT_IS_OUT_OF_RANGE를 발생시키는 대신 전체 일치 항목을 반환하도록regexpExtract(haystack, pattern)을 수정했습니다. #106374 (groeneai). NaN또는 무한대 점 좌표를 포함하는 소스 데이터로 polygon dictionary를 빌드할 때 발생하는 논리 오류를 수정했습니다. 이제 이러한 좌표는 명확한 오류 메시지와 함께 거부됩니다. #106423 (alexey-milovidov).- 이제 HTTP 딕셔너리에서 이름이 지정된 컬렉션을 통해 요청 헤더를 지정할 수 있습니다. #106459 (ZelvaMan).
- 형식이 잘못된
Avro열거형 값은 이제 범위를 벗어난 메모리 접근 및 서버 종료를 유발하는 대신 유효성 검사 후 예외와 함께 거부됩니다. #106476 (mstetsyuk). - 동률을 판단할 때
ORDER BY ... COLLATE의 콜레이션을 적용하지 않던LIMIT WITH TIES및 소수LIMIT WITH TIES문제를 수정했습니다. 콜레이션상 동일한 행(예: 숫자 콜레이션에서'1'과'01')이 바이트 단위로 비교되어 일부 동률 행이 결과에서 잘못 제외되었습니다. #106539 (nihalzp). - 입력이 콜레이션(
ORDER BY ... COLLATE)으로 정렬된 경우 잘못된 결과를 반환하던 순서 기반DISTINCT및 순서 기반LIMIT BY최적화(음수LIMIT BY포함)를 수정했습니다. 콜레이션상 동일한 행(예: 대소문자를 구분하지 않는 콜레이션에서'a'와'A')은 콜레이션 키로 정렬되며 값 기준으로 인접하지 않으므로, 이제 collator를 사용할 때 순서 기반 최적화를 건너뜁니다. #106564 (nihalzp). - NATS consumer 종료 중 서버가 종료될 수 있던 경쟁 상태를 수정했습니다. #106692 (mstetsyuk).
- 신뢰할 수 없는 입력을 통해 발생할 수 있는 형식 리더의 여러 메모리 안전성 및 리소스 고갈 문제를 수정했습니다. 여기에는 기본 Parquet 리더의
DataPageV2정의/반복 수준 길이 처리에서 발생하는 힙 범위 밖 읽기, 깊게 중첩된 스키마를 가진 Parquet 파일에서의 스택 오버플로우, GeoParquet WKB/WKT Geometry 및 Avro 문자열/바이트를 파싱할 때max_memory_usage를 무시하던 메모리 할당이 포함됩니다. #106739 (Algunenano). - HTTPS 클라이언트에 평문 HTTP 응답을 반환하던
keeper_server.http_control.secure_port문제를 수정했습니다. 이제 보안 포트가 HTTPS를 올바르게 제공합니다. #106822 (linjiayu1025-collab). - 다른 키워드와 달리
restrictive/permissive를 대문자가 아닌 소문자로 출력하던SHOW CREATE ROW POLICY문제를 수정했습니다. #106865 (valerypetrov). - 파티션 키에
LowCardinality(Nullable(...))컬럼이 있는 테이블에서 파트를 다시 로드할 때마다(서버 재시작,DETACH또는ATTACH) 파트가 손상된 것으로 표시되어 분리되던 문제를 수정했습니다. 26.5부터 이러한 컬럼의 최솟값과 최댓값이NULL인 경우 파트별 minmax 인덱스 파일이 기록되지 않았지만, 파트 일관성 검사는 여전히 해당 파일을 요구했습니다. 영향을 받은 버전에서 기록된 파트에는 minmax 인덱스 파일이 없으므로 여전히 수동으로 다시 연결해야 합니다. #106945 (PedroTadim). - 비동기 삽입 플러시(
AsyncInsertFlush) 쿼리에서system.processors_profile_log및system.query_log의elapsed_us가 항상 0으로 기록되고read_rows/read_bytes가 적게 집계되던 문제를 수정했습니다. #106982 (cwurm). UNION/INTERSECT/EXCEPT의 한 브랜치가Sparse로 직렬화된 컬럼을 읽고 다른 브랜치가 같은 컬럼을 전체 컬럼으로 읽을 때(예: materialized view에 푸시할 때) 발생하던Block structure mismatch in UnionStep stream논리 오류(디버그/새니타이저 빌드에서는 서버 중단, 릴리스 빌드에서는Code: 49)를 수정했습니다. #107041 (groeneai).optimize_read_in_order및read_in_order_use_virtual_row가 활성화된 상태에서UNION ALL에 대한ORDER BY쿼리의 행 순서가 잘못되던 문제를 수정했습니다. #107053 (vdimir).SHOW ROW POLICIES또는SHOW MASKING POLICIES뒤에FORMAT,SETTINGS또는INTO OUTFILE절이 올 때 발생하던 구문 오류를 수정했습니다(예:SHOW ROW POLICIES FORMAT TabSeparated). #107061 (groeneai).- 사용자 지정 트림 문자 집합이 16자보다 길면
trimLeft,trimRight,trimBoth(및 별칭ltrim,rtrim,trim)가TOO_LARGE_STRING_SIZE오류를 발생시키던 문제를 수정했습니다. 이제 길이에 관계없이 트림 집합이 다시 지원됩니다. #107071 (fm4v). - 큰 범위에 걸친
Int64입력에서 잘못된 결과를 생성할 수 있던quantileExactExclusive,quantilesExactExclusive,quantileExactInclusive,quantilesExactInclusive의 부호 있는 정수 오버플로를 수정했습니다. #107154 (groeneai). - 이제 구성 다시 로드 시 시작 스크립트를 다시 실행하지 않으므로, 일회성 시작 작업이 다시 실행되는 것을 방지합니다. #107187 (mstetsyuk).
max_streams_for_union_step설정으로 인해 UNION 파이프라인이 축소된 경우,optimize_read_in_order가 활성화된UNION ALL에 대한ORDER BY결과 순서가 잘못되던 문제를 수정했습니다. 이제 계획이 정렬된 UNION 출력 스트림에 의존하는 경우 축소를 건너뜁니다. #107208 (vdimir).- 서버 종료 후반에 프록시 구성을 확인하는 동안 발생할 수 있는 널 포인터 역참조 문제를 수정했습니다. #107231 (PedroTadim).
ORDER BY ... WITH FILL에서 채우기 컬럼 앞의 ORDER BY 컬럼에COLLATE콜레이션이 사용될 때 추가 행이 생성되던 문제를 수정했습니다. 이제 해당 콜레이션을 적용해 정렬 접두사별로 행을 그룹화하므로 정렬 순서와 일치합니다. #107365 (groeneai).- 유한하지 않은 부동 소수점 값(예:
nan또는inf)이prometheusQuery/prometheusQueryRange테이블 함수의 타임스탬프/기간 인수로 전달될 때 발생하던 정의되지 않은 동작을 수정했습니다. 이제 이러한 인수는 잘못된 타임스탬프를 생성하는 대신BAD_ARGUMENTS오류를 발생시킵니다. #107417 (groeneai). NULL페이로드 값을 보존하는 집계 함수(*_respect_nulls계열:anyRespectNulls,first_value_respect_nulls,anyLast_respect_nulls,last_value_respect_nulls)에서optimize_rewrite_aggregate_function_with_if최적화로 인해 잘못된 결과가 생성되던 문제를 수정했습니다. 이제 이 최적화는 이러한 함수에 대해f(if(cond, x, NULL))를-If형식으로 재작성하지 않습니다. #107430 (groeneai).- ORC 입력의 잘못된 경계값에 대한 유효성 검사를 추가했습니다. #107580 (al13n321).
- MySQL 프로토콜 포트에서 인증 없이 메모리 고갈을 유발할 수 있는 서비스 거부 문제를 수정했습니다. #107599 (tiandiwonder).
MySQL Connector/J8.2.0 이상(9.x 포함)에서 MySQL 인터페이스를 사용할 수 없던 문제를 수정했습니다. 이제OK패킷의info필드는 MySQL 서버와 마찬가지로 길이 인코딩되므로 JDBC 드라이버가 연결할 수 있습니다. #107693 (alexey-milovidov).UNION/INTERSECT/EXCEPT의 형제 브랜치가WHERE프레디케이트만 다르고 한 브랜치의 프레디케이트가 상수 폴딩되어Const컬럼이 되는 경우 발생하던Block structure mismatch in UnionStep stream논리 오류(디버그/새니타이저 빌드에서는 서버 중단, 릴리스 빌드에서는Code: 49)를 수정했습니다. #107719 (groeneai).- Apache Arrow Java 19.0.0 이전 버전(Apache Spark 포함)에서 생성된 비어 있는
String또는Binary컬럼이 포함된Arrow및ArrowStream데이터를 읽을 때 더 이상INCORRECT_DATA오류가 발생하지 않습니다. #107764 (Algunenano). Variant판별자가 존재하지 않는 variant를 참조하는 잘못된 Native 블록은 이제 안전하게 거부됩니다. #107991 (uwezkhan).- 여러 스레드로
Dynamic컬럼을 읽을 때 발생하던 성능 회귀를 수정했습니다. #107997 (Avogar). - 더 이상 사용되지 않는 데이터 레이크 설정
storage_catalog_url이 이제 카탈로그 가드에서 올바르게 거부되며(이전에는storage_catalog_type및storage_aws_access_key_id만 확인됨), 오류 메시지에 모든 더 이상 사용되지 않는 설정이 나열됩니다. #108040 (alexey-milovidov). - 선택 사항인
dataset키가 없는 명명된 컬렉션을ArrowFlight테이블 함수/엔진이No such key 'dataset'오류와 함께 거부하던 문제를 수정했습니다. #108041 (alexey-milovidov). - 이제 로그에 기록된 뷰 SQL에 시크릿 및 자격 증명이 노출되지 않고
system.query_views_log.view_query에서 마스킹됩니다. #108214 (Fidelaggio). - JSON의 타입이 지정된 경로에서
type_json_allow_duplicated_key_with_literal_and_nested_object가 작동하지 않던 문제를 수정했습니다. #108218 (Avogar). - 입력 문자열이 32768바이트보다 크고 문자 집합을 감지할 수 없을 때
detectCharset및detectLanguageUnknown함수에서 발생하던 정의되지 않은 동작(memcpy에 널 포인터 전달)을 수정했습니다. #108250 (groeneai). - 지연 구체화와 함께 WHERE 절에서
_part_starting_offset/_part_offset가상 컬럼을 사용하는 쿼리의NOT_FOUND_COLUMN_IN_BLOCK오류를 수정했습니다. #108287 (vdimir). - 기본값으로 비활성화된
format_display_secrets_in_show_and_select설정에서EXPLAIN actions,EXPLAIN header,EXPLAIN PIPELINE출력 시encrypt,decrypt,HMAC등의 함수에 전달되는 시크릿 인수를 숨깁니다. #108386 (Algunenano). - 갱신 가능 구체화 뷰의
TO대상이 해당 뷰에 이미 속해 있으면 이제CREATE OR REPLACE가 성공합니다. 다른 뷰에 속한 대상은 계속 거부됩니다. #108392 (evillique). file()및 딕셔너리 소스와 마찬가지로catboostEvaluate의 모델 경로를user_files디렉터리로 제한했습니다. 이전에는 이 함수가 경로 제한 검사 없이 임의의 파일 시스템 경로를 허용하여user_files외부 파일의 존재 여부를 확인하고 읽기를 트리거할 수 있었습니다. 이제 모델은 반드시user_files내부에 있어야 합니다. #108463 (groeneai).CREATE OR REPLACE MATERIALIZED VIEW ... POPULATE로 인해 새 뷰가 원본 테이블을 구독하지 않아 대체 후 삽입된 모든 행이 조용히 손실되던 문제를 수정했습니다. #108728 (alexey-milovidov).GROUPING SETS,ROLLUP또는CUBE와max_threads > 1을 함께 사용해uniqExact집계 상태를 병합할 때 발생하는 세그먼테이션 오류를 수정했습니다. #108928 (Algunenano).- compatibility 설정을 상향 조정하는 동안 발생할 수 있는 논리 오류 “Unexpected substream … for column …”를 수정했습니다. #109496 (Avogar).
- 이제
getClientHTTPHeader함수는 RFC 9110에 따라 헤더 이름을 대소문자를 구분하지 않고 처리합니다. 특히authorization헤더는 대소문자와 관계없이 필터링됩니다. #109791 (Felixoid). - 비동기 삽입 및 중복 제거(
async_insert=1,async_insert_deduplicate=1)에서 발생하던 무음 데이터 손실을 수정했습니다. 서로 다른insert_deduplication_token값을 가진 여러 비동기 삽입 항목이 서로 다른 파티션에 기록되는 하나의 플러시로 통합될 때, 각 토큰이 해당 행이 기록된 파티션뿐 아니라 플러시가 처리한 모든 파티션의 중복 제거 로그에 등록되었습니다. 이후 해당 토큰 중 하나를 이전에 기록된 적 없는 파티션에 재사용해 삽입하면 해당 삽입이 조용히 중복 제거되었습니다. 이제 토큰은 해당 행이 실제로 기록된 파티션에만 등록됩니다. #111049 (groeneai). ALTER ... MODIFY COLUMN후 호환되지 않게 된 버퍼링 항목 하나 때문에 전체 일괄 삽입이 실패하지 않도록 비동기 Native 포맷 삽입을 수정했습니다. #111108 (Felixoid).- 다른 종류의 객체로 딕셔너리에
CREATE OR REPLACE를 수행할 때 발생하던 문제를 수정했습니다. 교체 작업이 이미 커밋된 뒤CANNOT_DETACH_DICTIONARY_AS_TABLE오류로 실패하면서 고아 상태의_tmp_replace_*테이블이 남던 문제입니다. #111142 (evillique). - 인증서 검증이 활성화된 TLS 핸드셰이크 중 발생하던 피어 인증서 메모리 누수를 수정했습니다. #111425 (thevar1able).
- 필터 컬럼명이 입력 컬럼명과 같은
WHERE절에서 필터 분할 최적화(query_plan_split_filter)가 실행될 때 발생할 수 있던 논리적 오류Block structure mismatch in IntersectOrExceptStep stream: different number of columns를 수정했습니다. 이 최적화로 인해 내부__split_filter컬럼이 브랜치 출력 헤더에 남아, 이후INTERSECT또는UNION같은 집합 연산의 다른 브랜치와 불일치하던 문제입니다. #111930 (groeneai). - 일광 절약 시간제를 사용하는 시간대에서
Time,Time64또는DateTime값과 함께toString을 사용하는 필터나ORDER BY표현식에서 잘못된 결과가 반환되던 문제를 수정했습니다. 또한 테이블 정렬 키의 접두사에 대한ORDER BY및String에서Nullable(String)으로 변환할 때 순서대로 읽기 최적화를 복원했습니다. #113291 (vdimir). kafka_num_consumers가 CPU 코어 수에 따라 계산된 제한을 초과할 때Kafka테이블의ATTACH가 실패하던 문제를 수정했습니다. #113390 (evillique).- 잘못된 쿼리 결과를 방지하기 위해 프로젝션 사용 시 분산 인덱스 분석을 비활성화했습니다. #115132 (azat).
- 행을 빈 결과로 포맷할 때 잘못된 결과 또는 논리적 오류가 발생할 수 있던 함수
formatRowNoNewline의 버그를 수정했습니다. #115669 (alexey-milovidov). - 길이가 8의 배수가 아닌 바이너리 문자열 리터럴의 결과나 본문이 없는 압축 블록을 처리하는 LZ4 압축 해제기에서 초기화되지 않은 메모리를 반환하지 않도록 했습니다. #115704 (alexey-milovidov).
- 서로 다른 객체 값이 잘못 중복 제거되는 것을 방지하기 위해 중복 제거 해시에 객체 경로를 포함했습니다. #115866 (Felixoid).