하위 호환되지 않는 변경 사항
JSON 및 데이터 포맷 변경
- 이제 기본적으로 JSON 포맷에서 64비트 정수를 따옴표로 감싸지 않습니다. #74079 (Pavel Kruglov).
- 이제 JSON에서 타입이 서로 다른 값으로 구성된 배열은 이름 없는
Tuple대신Array(Dynamic)으로 추론됩니다. 이전 동작을 사용하려면input_format_json_infer_array_of_dynamic_from_array_of_different_types설정을 비활성화하세요. #80859 (Pavel Kruglov). - 이제 기본적으로 Parquet 출력 형식에서
Enum타입 값은ENUM논리 타입의BYTE_ARRAY로 기록됩니다. #84169 (Pavel Kruglov).
스토리지 및 파티셔닝
- Hive 파티션 스타일 쓰기 지원을 추가하고 읽기 구현을 리팩터링했습니다(Hive 파티션 컬럼은 더 이상 가상 컬럼이 아닙니다). #76802 (Arthur Passos).
- MergeTree 설정
write_marks_for_substreams_in_compact_parts을 기본적으로 활성화했습니다. 이 설정으로 새로 생성된 Compact 파트에서 서브컬럼 읽기 성능이 크게 향상됩니다. 25.5 미만 버전의 서버에서는 새로운 Compact 파트를 읽을 수 없습니다. #84171 (Pavel Kruglov). - SummingMergeTree에서 합산 대상으로 명시적으로 지정된 컬럼에 대한
RENAME COLUMN또는DROP COLUMN을 허용하지 않습니다. #81836를 해결합니다. #82821 (Alexey Milovidov).
함수 개선 사항
extractKeyValuePairs함수에unexpected_quoting_character_strategy라는 새 인수를 추가하여,quoting_character가 예상치 않게 발견되었을 때 어떻게 처리할지 제어할 수 있게 했습니다. 자세한 내용은extractKeyValuePairs문서를 참조하십시오. #80657 (Arthur Passos).- 이전에는 패턴이 빈 일치를 허용하더라도
countMatches함수는 첫 번째 빈 일치에서 계산을 중단했습니다. 이 문제를 해결하기 위해 이제countMatches는 빈 일치가 발생하면 한 글자 앞으로 이동한 뒤 실행을 계속합니다. 기존 동작을 유지하려면count_matches_stop_at_empty_match설정을 활성화할 수 있습니다. #81676 (Elmi Ahmadov).
데이터 타입 개선 사항
Decimal에서Float32로 변환할 때의 정밀도를 개선했습니다.Decimal에서BFloat16으로 변환하는 기능을 구현했습니다. #82660이 해결되었습니다. #82823 (Alexey Milovidov).
성능 및 리소스 관리
- 이전에는
BACKUP쿼리, 머지 및 뮤테이션이 로컬(max_local_read_bandwidth_for_server및max_local_write_bandwidth_for_server) 및 원격(max_remote_read_network_bandwidth_for_server및max_remote_write_network_bandwidth_for_server) 트래픽에 대해 서버 전역 스로틀러를 사용하지 않고, 전용 서버 설정(max_backup_bandwidth_for_server,max_mutations_bandwidth_for_server,max_merges_bandwidth_for_server)에 의해서만 속도가 제한되었습니다. 이제는 두 유형의 스로틀러를 동시에 사용합니다. #81753 (Sergei Trifonov). - 기본적으로
true로 설정되면 cluster function에서 아카이브를 처리하는 성능을 높이는 새로운 설정cluster_function_process_archive_on_multiple_nodes이 추가되었습니다. 이전 버전에서 아카이브와 함께 cluster function을 사용하는 경우, 25.7+로 업그레이드할 때 호환성을 유지하고 오류를 방지하려면false로 설정해야 합니다. #82355 (Kseniia Sumarokova). - 이전
concurrent_threads_scheduler의 기본값은round_robin이었으나, 단일 스레드 쿼리(예:INSERT)가 많을 때는 공정하지 않은 것으로 확인되었습니다. 이번 변경으로 더 안전한 대안인fair_round_robinscheduler가 기본값이 됩니다. #84747 (Sergei Trifonov). - lazy materialization은 분석기와 함께 사용할 때만 활성화되며, 이는 분석기 없이 유지 관리해야 하는 상황을 피하기 위한 것입니다. 분석기 없이 사용할 경우 일부 문제가 발생할 수 있습니다(예: conditions에서
indexHint()를 사용하는 경우). #83791 (Igor Nikonov).
스키마 및 SQL 구문
- 삽입 가능한 컬럼이 없는 테이블은 생성할 수 없도록 합니다. #81835 (Pervakov Grigorii).
- 점이 포함된 식별자가 복합 식별자로 파싱되지 않도록, 기본 표현식에서는 해당 식별자를 backticks로 감싸야 합니다. #83162 (Pervakov Grigorii).
- PostgreSQL 스타일의 Heredoc 구문인
$tag$ string contents... $tag$를 지원합니다. 이는 dollar-quoted string literal이라고도 합니다. 이전 버전에서는 tag에 대한 제약이 더 적어 구두점과 공백을 포함한 임의의 문자를 사용할 수 있었습니다. 이로 인해 달러 문자로 시작할 수도 있는 식별자와 파싱 모호성이 발생했습니다. 한편 PostgreSQL은 tag에 단어 문자만 허용합니다. 이 문제를 해결하기 위해 이제 Heredoc tag에는 단어 문자만 포함할 수 있도록 제한합니다. #84731을 해결합니다. #84846 (Alexey Milovidov).
보안 및 권한
SYSTEM RESTART REPLICAS는SHOW TABLES권한이 있는 데이터베이스의 레플리카만 다시 시작합니다. 이전에는 해당 데이터베이스에 대한 접근 권한이 없어도, 테이블이 동시에 삭제되는 동안 이 쿼리로 Lazy 데이터베이스의 테이블이 깨어나는 문제가 있었습니다. #83321 (Alexey Milovidov).azureBlobStorage,deltaLakeAzure,icebergAzure함수는 이제AZURE권한을 올바르게 검증합니다. 이제 모든 cluster 변형 함수(-Cluster함수)는 대응하는 비클러스터 함수 기준으로 권한을 확인합니다. 권한 오류를 방지하려면-Cluster함수를 호출하는 사용자에게 적절한 privilege가 부여되어 있는지 확인하십시오(예:GRANT S3 ON *.* TO user). 또한icebergLocal및deltaLakeLocal함수는 이제FILE권한 검사도 적용합니다. #84938 ([Nikita Mikhaylov](https://github.com/nikitamikhaylov
새 기능
데이터 타입
- 새 데이터 타입
Time([H]HH:MM:SS)및Time64([H]HH:MM:SS[.fractional])와 함께, 일부 기본 CAST 함수와 다른 데이터 타입을 다루기 위한 함수가 추가되었습니다. 레거시 함수ToTime와의 호환성을 위한 설정도 추가되었습니다. #81217 (Yarik Briukhovetskyi).
함수
NumericIndexedVector를 추가했습니다. 이 기능은 비트 슬라이싱 및 roaring-bitmap 압축을 기반으로 하는 새로운 벡터 데이터 구조이며, 생성, 분석, 원소별 산술 연산을 위한 20개 이상의 함수도 함께 제공합니다. 희소 데이터에서 Storage를 줄이고 조인, 필터, 집계 속도를 높일 수 있습니다. #70582와 VLDB 2024의 T. Xiong 및 Y. Wang의 “Large-Scale Metric Computation in Online Controlled Experiment Platform” paper를 구현합니다. #74193 (FriendLey).- 재무 관련 함수를 추가했습니다:
financialInternalRateOfReturnExtended(XIRR),financialInternalRateOfReturn(IRR),financialNetPresentValueExtended(XNPV),financialNetPresentValue(NPV). #81599 (Joanna Hulboj). - 두 Polygon이 교차하는지 확인하는 지리공간 함수
polygonIntersectsCartesian및polygonIntersectsSpherical를 추가했습니다. #81882 (Paul Lamb). lag및lead윈도우 함수를 지원합니다. #9887을 해결했습니다. #82108 (Dmitry Novik).- sRGB와 OkLCH 색 공간 간 색상 변환을 위한 함수
colorSRGBToOkLCH및colorOkLCHToSRGB가 추가되었습니다. #83679 (Fgrtue). - 이제
JSONExtractCaseInsensitive(및JSONExtract의 다른 변형)을 사용해 대소문자를 구분하지 않는 JSON 키 조회를 할 수 있습니다. #83770 (Alistair Evans). - 새로운 함수
nowInBlock64가 추가되었습니다. #84178 (Halersson Paris). - DateTime 값을 UUIDv7로 변환하는
dateTimeToUUIDv7함수를 추가했습니다. 사용 예시:SELECT dateTimeToUUIDv7(toDateTime('2025-08-15 18:57:56'))는0198af18-8320-7a7d-abd3-358db23b9d5c를 반환합니다. #84319 (samradovich). - 지정된 시작 timestamp, 종료 timestamp, 간격으로 정의된 시간 그리드에 맞춰 데이터를 리샘플링하고, 각각 PromQL과 유사한
deriv및predict_linear을 계산하는timeSeriesDerivToGrid및timeSeriesPredictLinearToGrid집계 함수를 추가했습니다. #84328 (Stephen Chi). timeSeriesRange및timeSeriesFromGrid함수를 추가했습니다. #85435 (Vitaly Baranov).
시스템 테이블
- Kafka와 같은 엔진에서 들어오는 오류가 있는 메시지를 보관하기 위해
system.dead_letter_queue테이블을 추가했습니다. #68873 (Ilya Golshtein). - ZooKeeper 연결에 대한 이력 정보를 저장하는
system.zookeeper_connection_log시스템 테이블을 추가했습니다. #79494 (János Benjamin Antal). - 사용 가능한 코덱을 검사할 수 있는 새로운 시스템 테이블
system.codecs를 추가했습니다. (이슈 #81525). #81600 (Jimmy Aguilar Mena). system.completions테이블을 도입했습니다. #81889를 해결합니다. #83833 (|2ustam).
Iceberg 및 DeltaLake
- Iceberg 스키마 진화에서 복합 타입을 지원합니다. #73714 (scanhex12).
insert쿼리에 대한 Iceberg 쓰기를 도입합니다. #82692 (scanhex12).- Iceberg 테이블 엔진에서 위치 기반 삭제를 지원합니다. #83094 (Daniil Ivanik).
- 필드 ID를 기준으로 Iceberg 데이터 파일을 읽습니다. #83065를 해결합니다. #83653 (scanhex12).
- CREATE에 대한 Iceberg 쓰기를 지원합니다. #83927를 해결합니다. #83983 (scanhex12).
- Glue 카탈로그에 대한 쓰기를 지원합니다. #84136 (scanhex12).
- Iceberg REST 카탈로그에 대한 쓰기를 지원합니다. #84684 (scanhex12).
- 모든 Iceberg 포지션 삭제 파일을 데이터 파일에 머지합니다. 이를 통해 Iceberg 스토리지의 Parquet 파일 수와 크기를 줄일 수 있습니다. 구문:
OPTIMIZE TABLE table_name. #85250 (scanhex12). - Iceberg에서
DROP TABLE을 지원합니다(REST/Glue 카탈로그에서 제거하고 테이블 메타데이터도 제거). #85395 (scanhex12). - merge-on-read 포맷의 Iceberg에서
ALTER DELETE뮤테이션을 지원합니다. #85549 (scanhex12). - DeltaLake에 대한 쓰기를 지원합니다. #79603를 해결합니다. #85564 (Kseniia Sumarokova).
- min-max 프루닝을 위해 메타데이터(매니페스트 엔트리)에 더 많은 Iceberg 통계 정보(컬럼 크기, 하한 및 상한)를 기록합니다. #85746 (scanhex12).
- 단순 타입에 대해 Iceberg에서 컬럼 추가/삭제/수정을 지원합니다. #85769 (scanhex12).
MergeTree와 스토리지
- 이제
_table가상 컬럼은 Merge type 테이블뿐 아니라 모든 테이블에서 지원됩니다. #63665 (Xiaozhe Yu). Float32및Float64유형의 컬럼에 대해, 손실이 있지만 오류 범위가 제한된 압축 코덱으로 SZ3가 추가되었습니다. #67161 (scanhex12).MergeTree계열 테이블에 경량 업데이트 지원이 추가되었습니다. 경량 업데이트는 새 구문UPDATE <table> SET col1 = val1, col2 = val2, ... WHERE <condition>으로 사용할 수 있습니다. 또한lightweight_delete_mode = 'lightweight_update'로 설정해 활성화할 수 있는, 경량 업데이트 기반의 경량한 삭제 구현도 추가되었습니다. #82004 (Anton Popov).- MergeTree 계열 테이블에서
_part_granule_offset가상 컬럼을 지원합니다. 이 컬럼은 각 행이 해당 data part 내에서 속한 granule/mark의 0부터 시작하는 인덱스를 나타냅니다. 이로써 #79572가 해결되었습니다. #82341 (Amos Bird).
프로토콜 및 클라이언트 지원
arrowflight테이블 엔진을 추가하여 ArrowFlight RPC 프로토콜 지원을 구현했습니다. #74184 (zakr600).- PostgreSQL 프로토콜의
COPY명령 지원을 추가했습니다. #74344 (scanhex12). - mysql 프로토콜용 C# 클라이언트를 지원합니다. 이로써 #83992가 해결되었습니다. #84397 (scanhex12).
mysql_port및postgresql_port에 보안 connection을 강제합니다. #82962 (Shaohua Wang).
SQL 및 쿼리 기능
DESCRIBE (SELECT ...)뿐만 아니라DESCRIBE SELECT도 지원합니다. #82947 (Yarik Briukhovetskyi).USE DATABASE {name}구문도 지원합니다. #81307 (Yarik Briukhovetskyi).- 병렬 레플리카에서 프로젝션으로부터 읽기를 지원합니다. 프로젝션 지원 활성화 여부를 제어하는 새로운 설정
parallel_replicas_support_projection이 추가되었습니다. 구현을 단순화하기 위해 프로젝션 지원은parallel_replicas_local_plan이 활성화된 경우에만 활성화됩니다. #82807 (zoomxi).
포맷
format_schema의 소스를 정의하는format_schema_source설정이 추가되었습니다. #80874 (Tuan Pham Anh).- 새로운 출력 형식으로
Hash가 추가되었습니다. 이 형식은 결과의 모든 컬럼과 행에 대해 단일 해시 값을 계산합니다. 예를 들어 데이터 전송이 병목이 되는 사용 사례에서 결과의 “fingerprint”를 계산할 때 유용합니다. 예시:SELECT arrayJoin(['abc', 'def']), 42 FORMAT Hash는e5f9e676db098fdb9530d2059d8c23ef를 반환합니다. #84607 (Robert Schulze).
서버 구성 및 워크로드 관리
- 서버 설정
cpu_slot_preemption은 워크로드에 선점형 CPU 스케줄링을 활성화하고, 워크로드 간 CPU 시간을 max-min 공정 방식으로 할당하도록 보장합니다. CPU 스로틀링을 위한 새로운 워크로드 설정max_cpus,max_cpu_share,max_burst_cpu_seconds가 추가되었습니다. #80879 (Sergei Trifonov). - 이제 워크로드 설정
max_waiting_queries를 지원합니다. 이 설정은 쿼리 큐의 크기를 제한하는 데 사용할 수 있습니다. 제한에 도달하면 이후의 모든 쿼리가SERVER_OVERLOADED오류와 함께 종료됩니다. #81250 (Oleg Doronin). - 설정된 쿼리 수 또는 시간 임계값에 도달하면 TCP connection을 종료합니다. #68000을 해결합니다. #81472 (Kenny Sun).
클라우드 스토리지
AzureBlobStorage에서client_id및tenant_id로 인증할 수 있도록extra_credentials가 추가되었습니다. #84235 (Pablo Marcos).
Keeper
- Keeper Multi 쿼리에서 임의의 watch를 설정할 수 있는 기능을 추가했습니다. #84964 (Mikhail Artemenko).
- 부분 집계된 메트릭을 지원합니다. #85328 (Mikhail Artemenko).
실험적 기능
테이블 엔진 및 테이블 함수
- Ytsaurus용 테이블 엔진과 테이블 함수를 추가했습니다. #77606 (MikhailBurdukov).
텍스트 인덱스 개선 사항
- 텍스트 인덱스 검색을 위한 범용 함수
searchAny와searchAll을 추가했습니다. #80641 (Elmi Ahmadov). - 이제 텍스트 인덱스에서
string토크나이저를 지원합니다. #81752 (Elmi Ahmadov). text인덱스의 기본 인덱스 세분화 수준 값을 64로 변경했습니다. 이 변경으로 내부 벤치마크에서 평균적인 테스트 쿼리의 예상 성능이 향상됩니다. #82162 (Jimmy Aguilar Mena).- 256비트 비트맵은 상태의 출력 레이블을 정렬된 순서로 저장하지만, 출력 상태는 해시 테이블에 나타나는 순서대로 디스크에 저장됩니다. 따라서 디스크에서 읽는 동안 레이블이 잘못된 다음 상태를 가리킬 수 있습니다. #82783 (Elmi Ahmadov).
- 현재 FST 트리는 디스크에 압축 없이 저장됩니다. 이로 인해 디스크에 쓰거나 디스크에서 읽을 때 성능이 저하되거나 더 높은 I/O 대역폭이 필요할 수 있습니다. #83093 (Elmi Ahmadov).
기능 성숙도 업데이트
- 카탈로그을 베타로 전환했습니다. #85848 (Melvyn Peignon).
- 경량 업데이트가 실험 단계에서 베타 단계로 전환되었습니다. #85952 (Anton Popov).
성능 개선
쿼리 실행 및 집계
-If집계 함수 조합자에 사소한 최적화를 적용했습니다. #78454 (李扬).- 메모리 효율적인 집계 중 일부 버킷을 순서와 무관하게 전송할 수 있도록 하는 새로운 로직을 추가했습니다(설정
enable_producing_buckets_out_of_order_in_aggregation으로 제어되며, 기본적으로 활성화되어 있습니다). 일부 집계 버킷의 머지에 다른 버킷보다 훨씬 더 오래 걸릴 때, 그동안 initiator가 더 높은 버킷 ID를 가진 버킷을 머지할 수 있어 성능이 향상됩니다. 단점은 메모리 사용량이 다소 증가할 수 있다는 점이지만, 영향은 크지 않을 것으로 예상됩니다. #80179 (Nikita Taranov). TOTALS단계 이후의 파이프라인을 멀티스레드로 처리하도록 변경했습니다. #80331 (UnamedRus).- 집계 쿼리에
NOT NULL컬럼에 대한COUNT()함수 하나만 포함된 경우, 집계 로직이 해시 테이블 프로빙 중 완전히 인라인됩니다. 이로써 집계 state를 할당하고 유지할 필요가 없어져 메모리 사용량과 CPU 오버헤드가 크게 줄어듭니다. 이는 #81982를 부분적으로 해결합니다. #82104 (Amos Bird). - 여러 문자열 또는 숫자 컬럼으로 그룹화할 때 직렬화된 키를 열 지향 방식으로 계산합니다. #83884 (李扬).
-If조합자에addManyDefaults를 구현했습니다. #83870 (Raúl Marín).
JOIN 최적화
- JOIN 입력 및 출력 블록의 최소 블록 크기(행 수 기준)를 제어하는 새로운 설정
min_joined_block_size_rows를 추가했습니다(min_joined_block_size_bytes와 유사하며 기본값은 65409). 조인 알고리즘이 이를 지원하는 경우 작은 블록은 병합됩니다. #81886 (Nikita Taranov). - 키 컬럼이 1개뿐인 일반적인 경우 해시 맵을 추가로 순회하는 루프를 제거해
HashJoin성능을 최적화했습니다. 또한 값이 항상true/false인 경우null_map및join_mask검사도 제거했습니다. #82308 (Nikita Taranov). - #82308의
null_map및JoinMask최적화를 여러 OR 조건이 있는 JOIN에도 적용했습니다. 또한KnownRowsHolder데이터 구조도 최적화했습니다. #83041 (Nikita Taranov). - 플래그에 접근할 때마다 해시를 계산하지 않도록 조인 플래그에 일반
std::vector<std::atomic_bool>를 사용합니다. #83043 (Nikita Taranov). max_joined_block_rows를 해시 JOIN 메인 루프 밖에서 처리합니다. ALL JOIN의 성능이 소폭 향상됩니다. #83216 (Nikolai Kochetov).HashJoin이lazy출력 모드를 사용할 때는 결과 컬럼에 대한 메모리를 사전에 할당하지 않습니다. 이는 특히 일치 개수가 적을 때 비효율적입니다. 또한 조인이 완료되면 정확한 일치 개수를 알 수 있으므로 더 정확하게 미리 할당할 수 있습니다. #83304 (Nikita Taranov).- 오른쪽이 조인 키 컬럼에 의해 함수적으로 결정되는 경우(모든 행이 고유한 조인 키 값을 가짐), 모든
LEFT/INNERJOIN은 자동으로RightAny로 변환됩니다. #84010 (Nikita Taranov). Join모드에서 patch parts 적용 성능을 개선했습니다. #85040 (Anton Popov).
분산 쿼리 개선 사항
- 블록의 압축/압축 해제 및 직렬화/역직렬화를 네트워크 연결당 단일 스레드가 아니라 파이프라인 스레드로 오프로드하는 옵션이 도입되었습니다. 이 기능은
enable_parallel_blocks_marshalling설정으로 제어됩니다. 이 옵션은 initiator 노드와 원격 노드 사이에 상당한 양의 데이터를 전송하는 분산 쿼리의 속도를 높일 수 있습니다. #78694 (Nikita Taranov). - 각 세그먼트에서
INSERT SELECT가 독립적으로 실행되는 모드에서는 병렬 분산INSERT SELECT가 기본적으로 활성화됩니다. 자세한 내용은parallel_distributed_insert_select설정을 참조하십시오. #80425 (Igor Nikonov). - 네이티브 프로토콜에서 로그와 profile events를 압축합니다. 100개 이상의 레플리카가 있는 클러스터에서는 비압축 profile events가 초당 1..10 MB를 차지하며, 느린 인터넷 연결에서는 진행 표시줄이 느리게 반응합니다. 이 변경으로 #82533 문제가 해결됩니다. #82535 (Alexey Milovidov).
- 각 세그먼트에서 INSERT SELECT가 독립적으로 실행되는 모드에서는 병렬 분산
INSERT SELECT가 기본적으로 활성화됩니다. 자세한 내용은parallel_distributed_insert_select설정을 참조하십시오. #83040 (Igor Nikonov). - 병렬 레플리카의 최소 작업 크기 계산을 수정했습니다. #84752 (Nikita Taranov).
인덱스 개선 사항
- 벡터 유사성 인덱스를 사용하는 벡터 검색 쿼리는 저장소 읽기와 CPU 사용량이 줄어들어 더 짧은 지연 시간으로 완료됩니다. #79103 (Shankar Iyer).
- 인덱스로 필터링하는 다른 메서드와 동작을 맞추기 위해
filterPartsByQueryConditionCache에서merge_tree_min_{rows,bytes}_for_seek를 반영합니다. #80312 (李扬). - 세분화 수준이 더 높은 MinMax 인덱스를 먼저 처리합니다. #75381을 해결합니다. #83798 (Maruth Goyal).
- 이제
column이Array유형이 아닐 때has([c1, c2, ...], column)같은 조건에도 블룸 필터 인덱스를 사용합니다. 이로써 이러한 쿼리의 성능이 향상되어IN연산자만큼 효율적으로 처리됩니다. #83945 (Doron David). - 파일 크기가 작은 순서대로 인덱스를 처리합니다. 그 결과, 인덱스 순서는 MinMax 인덱스와 벡터 인덱스(각각 단순성과 선택도 때문)를 우선하고, 이후에는 작은 인덱스를 우선합니다. MinMax/벡터 인덱스 내에서도 더 작은 인덱스를 우선합니다. #84094 (Maruth Goyal).
- 이전에는 텍스트 인덱스 데이터가 여러 세그먼트로 분리되었습니다(기본적으로 각 세그먼트의 크기는 256 MiB였습니다). 이렇게 하면 텍스트 인덱스를 빌드할 때 메모리 사용량을 줄일 수 있지만, 디스크 공간 요구량이 늘어나고 쿼리 응답 시간이 증가할 수 있습니다. #84590 (Elmi Ahmadov).
서브쿼리 최적화
- 동치 클래스를 사용해 중복
JOIN연산을 제거함으로써 상관 서브쿼리에 대해 생성된 계획을 최적화했습니다. 상관 컬럼 전체에 대해 동등한 표현식이 있으면query_plan_correlated_subqueries_use_substitution설정이 활성화된 경우CROSS JOIN이 생성되지 않습니다. #82435 (Dmitry Novik). - 상관 서브쿼리가
EXISTS함수의 인수로 사용될 때 필요한 컬럼만 읽도록 개선했습니다. #82443 (Dmitry Novik).
Azure Blob Storage 개선 사항
azureBlobStorage테이블 엔진은 이제 가능할 때 관리형 아이덴티티 인증 토큰을 캐시하고 재사용하여 스로틀링을 방지합니다. #79860 (Nick Blakely).- Azure blob storage용 curl HTTP 클라이언트를 poco HTTP 클라이언트로 대체했습니다. 이 클라이언트에 대해 S3의 설정을 반영한 여러 설정도 도입했습니다. Azure와 S3 모두에 더 짧은 연결 timeout도 도입했습니다. Azure profile events와 메트릭에 대한 내부 검사도 개선했습니다. 새 클라이언트는 기본적으로 활성화되어 있으며, Azure Blob Storage 기반 콜드 쿼리의 지연 시간을 크게 개선합니다.
azure_sdk_use_native_client=false를 설정하면 기존Curl클라이언트로 되돌릴 수 있습니다. #83294 (alesapin).
스토리지 엔진 개선 사항
- Redis 및 KeeperMap 스토리지의 키 기반 필터가 수정되었습니다. #81833 (Pervakov Grigorii).
ATTACH PARTITION이 더 이상 모든 캐시를 삭제하지 않게 되었습니다. #82377 (Alexey Milovidov).- 높은 동시 부하에서 락 경합을 줄이기 위해 스토리지 스냅샷 데이터를 생성하는 동안 락을 유지하지 않도록 했습니다. #83510 (Duc Canh Le).
- 임시 파트를 제거하는 데는 시간이 걸릴 수 있으며(특히 S3의 경우), 현재는
MergeTreeBackgroundExecutor에서 전역 락을 잡은 상태로 이 작업을 수행합니다. 연결 손실로 인해 모든 테이블을 다시 시작해야 하고 백그라운드 작업이 끝날 때까지 기다리는 경우, 테이블이 1시간 동안 readonly 모드에 머무를 수도 있습니다. 하지만cancel을 호출할 때는 이 락이 필요하지 않은 것으로 보입니다. #84311 (Alexander Tokmakov).
포맷 개선 사항
- 새로운 Parquet 리더 구현을 추가했습니다. 일반적으로 더 빠르며, 페이지 수준 필터 푸시다운과
PREWHERE를 지원합니다. 현재는 실험적 기능입니다. 활성화하려면input_format_parquet_use_native_reader_v3설정을 사용하십시오. #82789 (Michael Kolupaev). - 파싱 오류가 없을 때 직렬화기를 재사용하도록 하여 ProtobufSingle 입력 형식의 성능을 개선했습니다. #83613 (Eduard Karacharov).
데이터 타입 및 직렬화 최적화
- MergeTree의
JSON공유 데이터에 새로운 직렬화 방식을 구현하여, 공유 데이터에서JSON서브컬럼을 읽는 성능을 크게 개선했습니다. #83777 (Pavel Kruglov). - 코드를 단순화해 문자열 역직렬화를 최적화했습니다. #38564를 해결합니다. #84561 (Alexey Milovidov).
파이프라인 및 실행 개선 사항
- 파이프라인 구성 중 포트 헤더의 메모리 복사를 최소화했습니다. 원본 PR: heymind. #83381 (Raúl Marín).
- 파이프라인 빌드 성능을 개선했습니다. #83631 (Raúl Marín).
- MergeTreeReadersChain::getSampleBlock를 최적화했습니다. #83875 (Raúl Marín).
- 단일 행만 반환하기 위해 상수를 머티리얼라이즈하는 경우의 최적화를 개선했습니다. #85071 (Alexey Milovidov).
메모리 및 리소스 최적화
- 성능 향상을 위해 일부 jemalloc 구성을 조정했습니다. #81807 (Antonio Andelic).
- false sharing을 줄이기 위해 ProfileEvents의 Counter에 메모리 정렬을 추가했습니다. #82697 (Jiebin Sun).
- CompressedReadBufferBase::readCompressedData에서 불필요한 memcpy 호출을 줄였습니다. #83986 (Raúl Marín).
쿼리 계획 및 분석
- QueryTreeHash 성능 향상. #82617 (Nikolai Kochetov).
로깅 개선 사항
- 비동기 로깅을 도입했습니다. #82516 (Raúl Marín).
함수 최적화
- 임시 데이터를 제거해
largestTriangleThreeBuckets를 최적화했습니다. #84479 (Alexey Milovidov). - 여러 문자열 처리 함수의 구현을 최적화하고 단순화했습니다. 또한 여러 함수의 잘못된 문서 설명도 수정했습니다. 참고: String 컬럼 및 String 컬럼을 포함하는 복합 타입에서
byteSize의 출력은 빈 문자열당 9바이트에서 8바이트로 변경되었으며, 이는 정상적인 동작입니다. #85063 (Alexey Milovidov).
Keeper 개선 사항
- RocksDB 초기 로딩을 통해 Keeper를 개선했습니다. #83390 (Antonio Andelic).
데이터 레이크 개선 사항
- delta-kernel-rs backend를 사용한 병렬 파일 처리 개선. #85642 (Azat Khuzhin).
개선 사항
접근 제어 및 보안
- 소스에 대해 두 가지 새로운 접근 유형인
READ와WRITE를 도입하고, 소스 관련 기존 접근 유형은 모두 지원 중단했습니다. 이전에는GRANT S3 ON *.* TO user를 사용했지만, 이제는GRANT READ, WRITE ON S3 TO user를 사용합니다. 또한 이를 통해 소스별READ권한과WRITE권한을 분리할 수 있습니다. 예:GRANT READ ON * TO user,GRANT WRITE ON S3 TO user. 이 기능은access_control_improvements.enable_read_write_grants설정으로 제어되며, 기본적으로 비활성화되어 있습니다. #73659 (pufit). CREATE USER쿼리에서 사용자 이름에 매개변수를 사용할 수 있도록 했습니다. #81387 (Diskein).- 코어 덤프에 민감한 데이터가 포함되지 않도록 했습니다. AWS 라이브러리와 호환되는
AwsNodumpMemoryManager와 STL과 호환되는JemallocNodumpSTLAllocator라는 두 가지 메모리 할당자를 추가했습니다. 둘 다 Jemalloc 메모리 할당자를 감싼 래퍼입니다. 이들은 Jemalloc의 extent hook과 madvise를 사용해 메모리 페이지를 “dump 제외”로 표시합니다. S3 자격 증명, 사용자 자격 증명, 일부 쿼리 데이터에 사용됩니다. #82441 (Miсhael Stetsyuk). - 이제 ephemeral user가 생성한 뷰는 실제 사용자의 복사본을 저장하므로, ephemeral user가 삭제된 뒤에도 더 이상 무효화되지 않습니다. #84763 (pufit).
- 외부 인증의
forward_headers를 대소문자를 구분하지 않고 일치시키도록 했습니다. #84737 (ingodwerust). GRANT READ/WRITE의 소스 유형과GRANT TABLE ENGINE의 테이블 엔진을 판별할 수 있도록system.grants에parameter컬럼을 추가했습니다. #85643 (MikhailBurdukov).
백업 및 복원
- PostgreSQL, MySQL 및 DataLake 데이터베이스에 대한 백업을 허용합니다. 이러한 데이터베이스의 백업에는 정의만 저장되고 내부 데이터는 저장되지 않습니다. #79982 (Nikolay Degterinsky).
- 백업 파일 쓰기와 관련된 모든 로그 메시지를 TRACE로 설정합니다. #82907 (Hans Krutzer).
- 백업 및 복원 작업 중 사용되는 S3 재시도 백오프 전략을 구성하기 위해
backup_restore_s3_retry_initial_backoff_ms,backup_restore_s3_retry_max_backoff_ms,backup_restore_s3_retry_jitter_factor를 도입합니다. #84421 (Julia Kartseva). SlowDown과 같은 오류로 인해 발생하는 재시도 폭주 중 S3에 가해지는 부하를 줄이기 위해, 재시도 가능한 오류가 하나라도 발생하면 모든 스레드를 느리게 하는 새로운backup_slow_all_threads_after_retryable_s3_error설정을 도입합니다. #84854 (Julia Kartseva).
데이터 무결성 및 검증
- 커밋 직전에 파트의 checksum.txt 파일 일관성을 검증합니다. #76625 (Sema Checherinda).
- 현재 불완전한 데이터 뮤테이션의 영향을 받는 컬럼의 이름을 바꾸게 되는 경우
RENAME COLUMNALTER 뮤테이션을 시작할 수 없도록 했습니다. #81823 (Mikhail Artemenko). - 이제 뮤테이션 스냅샷은 보이는 파트의 스냅샷을 기반으로 생성됩니다. 스냅샷에 사용되는 뮤테이션 카운터도 포함된 뮤테이션을 기준으로 다시 계산됩니다. #82945 (Mikhail Artemenko).
- 파트의 접두사와 접미사를 파싱하고, 비상수 컬럼에 대한 커버리지도 확인할 수 있는 기능을 추가했습니다. #83377 (Mikhail Artemenko).
Iceberg 테이블 엔진
- Iceberg 테이블 엔진에서 position delete를 지원합니다. #80237 (YanghongZhong).
- 이제 ClickHouse는 Iceberg용 압축
metadata.json파일을 지원합니다. #70874를 해결합니다. #81451 (alesapin). - 복합 타입에서 field id로 Iceberg를 읽는 문제를 수정했습니다. #84821 (scanhex12).
- pyiceberg에서 읽을 수 있는 Iceberg 쓰기를 지원합니다. #84466 (scanhex12).
- 데이터 레이크 테이블 엔진에 snapshot version을 추가했습니다. #84659 (Pete Hampton).
- Iceberg에서 version-hint 파일 쓰기를 지원합니다. 이로써 #85097가 해결되었습니다. #85130 (scanhex12).
iceberg_metadata_compression_method설정을 통해 압축된.metadata.json파일을 지원합니다. ClickHouse의 모든 압축 방식을 지원합니다. 이로써 #84895가 해결되었습니다. #85196 (scanhex12).- Iceberg positional delete 파일의 메모리 사용량을 최적화했습니다. 모든 delete 파일 데이터를 메모리에 로드하는 대신, Parquet delete 파일의 현재 row-group만 RAM에 유지합니다. 이에 따라 큰 positional delete 파일로 작업할 때 메모리 사용량이 크게 줄어듭니다. #85329 (scanhex12).
- 각 데이터 파일의 객체를 명시적으로 저장하지 않고도 Iceberg 테이블의 객체를 비동기적으로 순회할 수 있도록 했습니다. #85369 (Daniil Ivanik).
- Iceberg equality delete를 지원합니다. #85843 (Han Fei).
DeltaLake 테이블 엔진
DeltaLake테이블 엔진 개선: delta-kernel-rs에는 이번 PR에서 구현된ExpressionVisitorAPI가 있으며, 이 API를 파티션 컬럼 표현식 변환에 적용했습니다(기존 코드에서 사용하던 delta-kernel-rs의 오래된 Deprecated 방식을 대체합니다). 앞으로 이ExpressionVisitor를 통해 통계 기반 프루닝과 일부 delta-lake 고유 기능도 구현할 수 있습니다. 또한 이번 변경은DeltaLakeCluster테이블 엔진에서 파티션 프루닝을 지원하기 위한 목적도 있습니다(파싱된 표현식의 결과인 ActionsDAG는 데이터 경로와 함께 initiator에서 직렬화되어 전송됩니다. 프루닝에 필요한 이런 정보는 데이터 파일 목록의 메타정보로만 제공되며, 이 목록 처리는 initiator에서만 수행되지만 실제 적용은 각 읽기 server에서 이루어져야 하기 때문입니다). #81136 (Kseniia Sumarokova).- 데이터 레이크 cluster 함수에서 파티션 프루닝 문제를 수정했습니다. #82131 (Kseniia Sumarokova).
- DeltaLakeCluster 테이블 함수에서 파티션된 데이터를 읽는 문제를 수정했습니다. 이 PR에서는 cluster 함수 protocol 버전을 올려 initiator에서 레플리카로 추가 정보를 전송할 수 있도록 했습니다. 이 추가 정보에는 파티션 컬럼(향후에는 생성 컬럼 등 다른 항목도 포함)을 파싱하는 데 필요한 delta-kernel 변환 표현식이 포함됩니다. #82132 (Kseniia Sumarokova).
- 이제 Datalake 데이터베이스가 더 유용한 exception을 발생시킵니다. #81211을 수정했습니다. #82304 (alesapin).
- storage
DeltaLake에 내부delta-kernel-rs필터링(통계 및 파티션 프루닝)을 구현했습니다. #84006 (Kseniia Sumarokova). - 디버깅 시 test 로그 레벨에서도 expression visitor 로그가 지나치게 장황할 수 있으므로, 이를 끌 수 있는 설정
delta_lake_enable_expression_visitor_logging을 추가했습니다. #84315 (Kseniia Sumarokova). - 테이블 엔진
DeltaLake에서 특정 snapshot version을 읽을 수 있도록 설정delta_lake_snapshot_version을 추가했습니다. #85295 (Kseniia Sumarokova).
데이터 레이크 통합
- 비동기 요청을 통해 데이터 카탈로그에서의 테이블 목록 조회를 가속합니다. #81084 (alesapin).
- Glue catalog에서
TimestampTZ를 지원합니다. 이 변경으로 #81654가 해결됩니다. #83132 (scanhex12). - FormatParserGroup을 서로 독립적인 두 개의 struct로 분리합니다. 첫 번째는 공유 컴퓨트 및 IO 리소스를, 두 번째는 공유 filter 리소스(filter ActionDag, KeyCondition)를 담당합니다. 이는 서로 다른 스레드에서 이러한 구조를 더 유연하게 공유해 사용할 수 있도록 하기 위한 것입니다. #83997 (Daniil Ivanik).
- Azure 구성에 누락된
partition_columns_in_data_file을 추가합니다. #85373 (Arthur Passos). - system.tables에 데이터 레이크 테이블을 추가할지 관리하는
show_data_lake_catalogs_in_system_tables플래그를 추가하여 #85384를 해결합니다. #85411 (Smita Kulkarni).
S3 및 객체 스토리지
s3_plain_rewritable를 데이터베이스 디스크로 사용할 수 있도록moveFile및replaceFile메서드를 구현했습니다. #79424 (Tuan Pham Anh).max_remote_read_network_bandwidth_for_server및max_remote_write_network_bandwidth_for_server스로틀링 관련 문제를 방지하기 위해 S3 읽기 및 쓰기 요청을 전체 S3 요청 단위가 아니라 HTTP 소켓 수준에서 스로틀링합니다. #81837 (Sergei Trifonov).- 이 PR은
s3_slow_all_threads_after_network_error구성이 활성화된 경우 S3 재시도 메커니즘에 지터를 도입합니다. #81849 (zoomxi). - 명시적으로 제공된 IAM role을 사용하는 AWS S3 인증을 구현했습니다. GCS용 OAuth도 구현했습니다. 이러한 기능은 최근까지 ClickHouse Cloud에서만 사용할 수 있었지만 이제 오픈 소스로 공개되었습니다. 객체 스토리지의 연결 매개변수 직렬화 등 일부 인터페이스도 동기화했습니다. #84011 (Alexey Milovidov).
- 외부 집계/정렬에 모든 스토리지 정책(즉, S3와 같은 객체 스토리지)을 사용할 수 있도록 했습니다. #84734 (Azat Khuzhin).
- 제거된 모든 객체를 수집해 객체 스토리지 삭제 작업을 한 번만 수행합니다. #85316 (Mikhail Artemenko).
S3Queue 테이블 엔진
- 이제
{uuid}와 같은 매크로를 S3Queue 테이블 엔진의keeper_path설정에서 사용할 수 있습니다. #82463 (Nikolay Degterinsky). - S3Queue 테이블 엔진을 사용하는 테이블에서 스트리밍을 비활성화하는 새 서버 설정
s3queue_disable_streaming을 추가했습니다. 이 설정은 서버 재시작 없이 변경할 수 있습니다. #82515 (Kseniia Sumarokova). system.s3queue_log에commit_time,commit_id컬럼을 추가했습니다. #83016 (Kseniia Sumarokova).- S3Queue 종료 프로세스에 대한 로그를 추가했습니다. #83163 (Kseniia Sumarokova).
- 서버 종료 시 어떤 테이블이든 종료하기 전에 S3(Azure/etc)Queue 스트리밍을 먼저 종료합니다. #83530 (Kseniia Sumarokova).
S3Queue테이블 수준에서 mv 삽입 설정을 변경할 수 있도록 지원합니다. 새로운S3Queue수준 설정min_insert_block_size_rows_for_materialized_views및min_insert_block_size_bytes_for_materialized_views를 추가했습니다. 기본적으로는 profile 수준 설정이 사용되며,S3Queue수준 설정이 이를 재정의합니다. #83971 (Kseniia Sumarokova).- S3Queue ordered mode 수정: 종료가 호출되면 더 일찍 종료합니다. #84463 (Kseniia Sumarokova).
Kafka 통합
- StorageKafka2에서 이전에 commit된 오프셋에 의존하지 않도록 소비된 메시지 수를 수동으로 계산합니다. #81662 (János Benjamin Antal).
StorageKafka2를system.kafka_consumers에 통합합니다. #82652 (János Benjamin Antal).
ClickHouse Keeper 개선 사항
- Keeper 개선 사항: 백그라운드 스레드에서 changelog 파일을 디스크 간에 이동합니다. 이전에는 changelog를 다른 디스크로 이동하면 이동이 완료될 때까지 Keeper 전체가 차단되었습니다. 이로 인해 이동 작업이 오래 걸리는 경우(예: S3 디스크로 이동) 성능이 저하되었습니다. #82485 (Antonio Andelic).
- Keeper 개선 사항: 새로운 구성
keeper_server.cleanup_old_and_ignore_new_acl을 추가합니다. 활성화하면 모든 노드의 ACL이 지워지고 새 요청에 대한 ACL은 무시됩니다. 노드에서 ACL을 완전히 제거하는 것이 목적이라면, 새 스냅샷이 생성될 때까지 이 구성을 활성화된 상태로 유지하는 것이 중요합니다. #82496 (Antonio Andelic). - Keeper 개선 사항: world:anyone ACL에 대한 세부 권한을 지원합니다. #82755 (Antonio Andelic).
- 구성에서 경로별 추가 Keeper ACL을 지정하는 기능을 추가했습니다. 특정 경로에 추가 ACL을 적용하려면 구성의
zookeeper.path_acls아래에 정의하면 됩니다. #82898 (Antonio Andelic). - 소프트 메모리 제한으로 인해 Keeper가 쓰기를 거부할 때 ProfileEvent를 추가합니다. #82963 (Xander Garbett).
- 새로운 요청 타입을 활성화하는
create_if_not_exists,check_not_exists,remove_recursivefeature flag를 Keeper에서 기본적으로 활성화합니다. #83488 (Antonio Andelic). apply_to_children구성을 사용해 특정 Keeper 노드에 추가 ACL을 적용하는 기능을 추가합니다. #84137 (Antonio Andelic).- KeeperClient에
get_acl명령을 추가합니다. #84641 (Antonio Andelic). - 수신된 요청의 로깅을 전환하는 4LW
lgrq를 Keeper에 추가합니다. #84719 (Antonio Andelic). - Keeper에서 스토리지 잠금 경합을 줄입니다. #84732 (Antonio Andelic).
- 이제
encrypt_decrypt도구가 암호화된 ZooKeeper 연결을 지원합니다. #84764 (Roman Vasin). keeper_server.coordination_settings.latest_logs_cache_entry_count_threshold및keeper_server.coordination_settings.commit_logs_cache_entry_count_threshold를 사용해 항목 수를 기준으로 Keeper 로그 엔트리 캐시 크기를 제한합니다. #84877 (Antonio Andelic).
JSON 및 Dynamic 타입
- 파트에 저장된 모든 하위 스트림을 추적할 수 있도록 Wide 파트에
columns_substreams.txt파일을 추가합니다. 이를 통해 JSON 및 Dynamic 타입의 동적 스트림을 추적할 수 있으며, 동적 스트림 목록을 얻기 위해 이러한 컬럼의 샘플을 읽지 않아도 됩니다(예: 컬럼 크기 계산 시). 이제 모든 동적 스트림이system.parts_columns에도 반영됩니다. #81091 (Pavel Kruglov). - JSON 및 Dynamic 컬럼에서
ALTER UPDATE를 사용할 수 있도록 허용합니다. #82419 (Pavel Kruglov). - 이제 JSON 타입 내에서
Time및Time64타입을 사용할 수 있습니다. #83784 (Yarik Briukhovetskyi). - JSON 타입 파싱 중 JSON 키의 점(.)을 이스케이프하는 설정
json_type_escape_dots_in_keys를 추가합니다. 이 설정은 기본적으로 비활성화되어 있습니다. #84207 (Pavel Kruglov).
Parquet 및 ORC 포맷
- ORC 압축 블록 크기를 설정하는 옵션을 추가하고, Spark 및 Hive와 일관성을 맞추기 위해 기본값을 64KB에서 256KB로 변경했습니다. #80602 (李扬).
- 명세에 따라 Parquet enum을 byte array로 기록하는 기능을 지원합니다. 자세한 내용은 나중에 추가하겠습니다. #81090 (Arthur Passos).
- GeoParquet을 출력 형식으로 기록하는 기능을 지원합니다. #81784 (scanhex12).
분산 쿼리와 병렬 레플리카
- 새로운 설정인 enable_add_distinct_to_in_subqueries가 도입되었습니다. 이 설정을 활성화하면 ClickHouse는 분산 쿼리의 IN 절에 있는 서브쿼리에 DISTINCT를 자동으로 추가합니다. 이렇게 하면 세그먼트 간에 전송되는 임시 테이블(temporary table)의 크기를 크게 줄여 네트워크 효율을 높일 수 있습니다. 참고: 이는 트레이드오프입니다. 네트워크 전송량은 줄어들지만 각 노드에서 추가 병합(중복 제거) 작업이 필요합니다. 네트워크 전송이 병목이고 병합 비용을 감수할 수 있는 경우 이 설정을 활성화하십시오. #81908 (fhw12345).
address_expression인수에 cluster가 지정된 경우, 병렬 레플리카와 함께remote-()테이블 함수를 지원하도록 추가되었습니다. 또한 #73295도 수정되었습니다. #82904 (Igor Nikonov).- 이제 병렬 레플리카를 사용하는 조인은 조인 논리 단계를 사용합니다. 병렬 레플리카를 사용하는 조인 쿼리에서 문제가 발생하면
SET query_plan_use_new_logical_join_step=0을 시도하고 이슈를 보고하십시오. #83801 (Vladimir Cherkasov).
설정 및 구성
allow_experimental_join_condition설정을 폐기된 것으로 표시합니다. #80566 (Vladimir Cherkasov).- 전체 및 사용자별 네트워크 스로틀러는 재설정되지 않으므로
max_network_bandwidth_for_all_users및max_network_bandwidth_for_all_users제한을 절대 초과하지 않습니다. #81729 (Sergei Trifonov). optimize_rewrite_regexp_functions설정(기본적으로 활성화됨)을 도입합니다. 이 설정을 사용하면 특정 정규식 패턴이 감지될 때 옵티마이저가 일부replaceRegexpAll,replaceRegexpOne,extract호출을 더 단순하고 효율적인 형태로 재작성할 수 있습니다. (이슈 #81981). #81992 (Amos Bird).listen_backlog(기본값 4096)를 기준으로 TCP 서버 큐(기본값 64)를 조정합니다. #82045 (Azat Khuzhin).- 서버를 재시작하지 않고
max_local_read_bandwidth_for_server및max_local_write_bandwidth_for_server를 즉시 다시 로드할 수 있는 기능을 추가합니다. #82083 (Kai Zhu). - 벡터 유사도 인덱스를 사용하려면 반드시 활성화해야 하는
enable_vector_similarity_index설정을 도입합니다. 기존 설정allow_experimental_vector_similarity_index는 이제 폐기되었습니다. 필요한 경우에는 여전히 사용할 수 있습니다. #83459 (Robert Schulze). - 큰 컬럼이 있는 JOIN의 메모리 사용량을 제한하기 위해
max_joined_block_size_rows에 더해max_joined_block_size_bytes를 추가합니다. #83869 (Nikolai Kochetov). - cluster_function_process_archive_on_multiple_nodes의 호환성을 수정합니다. #83968 (Kseniia Sumarokova).
- 상관 서브쿼리 지원을 기본적으로 활성화합니다. #85107 (Dmitry Novik).
- DatabaseReplicatedSettings의 기본값을 정의하는
database_replicated설정을 추가합니다. Replicated DB 생성 쿼리에 이 설정이 없으면 이 설정의 값이 사용됩니다. #85127 (Tuan Pham Anh). s3또는s3Cluster테이블 엔진/함수에서 키-값 인수를 허용합니다. 예를 들어s3('url', CSV, structure = 'a Int32', compression_method = 'gzip')와 같습니다. #85134 (Kseniia Sumarokova).- 비상관
EXISTS를 스칼라 서브쿼리로 실행합니다. 이를 통해 스칼라 서브쿼리 캐시를 사용하고 결과를 상수 폴딩할 수 있어 인덱스에 도움이 됩니다. 호환성을 위해 새로운 설정execute_exists_as_scalar_subquery=1도 추가되었습니다. #85481 (Nikolai Kochetov). - 복합 식별자를 더 많은 경우에 해석할 수 있도록 지원합니다. 특히
ARRAY JOIN과 이전 분석기 사이의 호환성이 개선됩니다. 이전 동작을 유지하기 위해 새로운 설정analyzer_compatibility_allow_compound_identifiers_in_unflatten_nested를 도입합니다. #85492 (Nikolai Kochetov).
시스템 테이블과 관측성
- ClickHouse async 메트릭에 pressure 메트릭을 추가했습니다. #80779 (Xander Garbett).
- 마크 캐시에서 제거된 항목을 추적하기 위한 메트릭
MarkCacheEvictedBytes,MarkCacheEvictedMarks,MarkCacheEvictedFiles를 추가했습니다. (이슈 #60989). #80799 (Shivji Kumar Jha). - 이제
system.formats테이블에 HTTP content type, 스키마 추론 기능 등 포맷에 대한 확장 정보가 포함됩니다. #81505 (Alexey Milovidov). TRUNCATE TABLE system.warnings를 사용해system.warnings테이블의 모든 경고를 삭제할 수 있도록 지원을 추가했습니다. #82087 (Vladimir Cherkasov).system.licenses에 Rust 크레이트의 라이선스를 나열합니다. #82440 (Raúl Marín).- 예를 들어
(a < 1 and a > 0) or b = 3과 같은 복잡한 cnf/dnf를 통계를 기반으로 추정합니다. #82663 (Han Fei). - 일부 경우에는 메트릭에 여러 차원이 필요합니다. 예를 들어 단일 카운터 하나만 두는 대신, 오류 코드별로 실패한 머지나 뮤테이션을 집계할 수 있습니다. #83030 (Miсhael Stetsyuk).
MergeParts항목에 대한 part_log profile events에 프로세스 resource 메트릭(UserTimeMicroseconds,SystemTimeMicroseconds,RealTimeMicroseconds등)을 추가했습니다. #83460 (Vladimir Cherkasov).- 이제 cgroup 수준 메트릭과 system-wide 메트릭이 함께 보고됩니다. cgroup 수준 메트릭의 이름은
CGroup<Metric>이고, OS 수준 메트릭(procfs에서 수집)의 이름은OS<Metric>입니다. #84317 (Nikita Taranov). - 더 나은 관측성을 위해 큐 유형과 instance ID로 레이블된 concurrent bounded 큐의 크기를 모니터링하는 dimensional metrics를 추가했습니다. #84675 (Miсhael Stetsyuk).
- 이제
system.columns테이블은 기존name컬럼에 대한 alias로column을 제공합니다. #84695 (Yunchi Pang). system.errors에 포맷 문자열 컬럼을 추가했습니다. 이 컬럼은 알림 규칙에서 동일한 오류 유형별로 그룹화하는 데 필요합니다. #84776 (Miсhael Stetsyuk).- Async Log의 제한을 조정 가능하게 하고 내부 검사 기능을 추가했습니다. #85105 (Raúl Marín).
system.columns의 테이블 컬럼 크기를 가져오는 동안UNKNOWN_DATABASE를 무시합니다. #85632 (Azat Khuzhin).
데이터베이스 엔진
시스템 및 내부 개선 사항
- DatabaseCatalog에 테이블 UUID를 수동으로 추가해, 읽기 전용 원격 디스크가 있는 데이터베이스를 ATTACH할 때 발생하던 문제를 수정했습니다. #82670 (Tuan Pham Anh).
distributed_ddl_output_mode='*_only_active'일 때max_replication_lag_to_enqueue를 초과하는 복제 지연이 있는 신규 또는 복구된 레플리카를 기다리지 않도록 DDL 작업 처리를 개선했습니다. 이를 통해 초기화 또는 복구 후 새 레플리카가 활성화되었지만 대량의 복제 로그가 누적된 경우DDL task is not finished on some hosts오류를 방지하는 데 도움이 됩니다. 또한 복제 로그가max_replication_lag_to_enqueue미만으로 내려갈 때까지 기다리는SYSTEM SYNC DATABASE REPLICA STRICT쿼리도 구현했습니다. #83302 (Alexander Tokmakov).- SystemLogs의 종료 순서를 일반 테이블 이후로 변경했습니다. 이제 SystemLogs는 시스템 테이블 이전에 종료되며, 기존에는 일반 테이블 이전에 종료되었습니다. #83134 (Kseniia Sumarokova).
- 복제된 데이터베이스(Replicated database) 설정용 서버 설정
logs_to_keep를 추가하여, 복제된 데이터베이스의 기본logs_to_keep매개변수를 구성할 수 있게 했습니다. 값을 낮추면 ZooKeeper 노드 수가 줄어들고(특히 데이터베이스가 많은 경우 효과적임), 값을 높이면 오랫동안 중단되었던 누락 레플리카가 다시 따라잡을 수 있습니다. #84183 (Alexey Khatskevich). - Replicated 데이터베이스 설정
max_retries_before_automatic_recovery의 기본값을 10으로 변경해, 일부 경우 더 빠르게 복구할 수 있도록 했습니다. #84369 (Alexander Tokmakov). - 복제된 데이터베이스에서 append가 아닌 갱신 가능 구체화 뷰 DDL 작업을 최적화해, 기존 임시 테이블의 생성과 이름 변경을 스키핑하도록 했습니다. #84858 (Tuan Pham Anh).
복제 및 동기화
SystemAndInternalImprovements
- ZooKeeper 연결 문제 발생 시 테이블이 누락되지 않도록
SYSTEM RESTART REPLICA를 개선하여 테이블 생성을 재시도하도록 합니다. #82616 (Nikolay Degterinsky). ReplicatedMergeTree::executeMetadataAlter에 UUID 검증을 추가하여 StorageID를 가져온 시점과IDatabase::alterTable를 호출하는 시점 사이에 테이블이 EXCHANGE되는 경우 잘못된 테이블 정의가 발생하지 않도록 합니다. #82666 (Nikolay Degterinsky).- experimental zero-copy 복제와 관련된 experimental
send_metadata로직을 제거합니다. 이 코드는 한 번도 사용된 적이 없고, 지원되지 않았으며, 기능을 검증할 테스트도 없어 제대로 동작하지 않았을 가능성이 큽니다. #82508 (alesapin). remote_fs_zero_copy_zookeeper_path에서 매크로 확장을 지원합니다. #85437 (Mikhail Koviazin).
함수와 표현식
- 함수
addressToSymbol와system.symbols테이블은 가상 메모리 주소 대신 파일 오프셋을 사용하게 됩니다. #81896 (Alexey Milovidov). - named tuple의 supertype을 도출할 때 요소 이름이 유지되도록 했습니다. #81345 (lgbo).
- 서로 다른 윈도우에서 동일한 컬럼에 대해 서로 다른 콜레이션을 혼용할 수 있도록 했습니다. #82877 (Yakov Olkhovskiy).
- 타입을 wkb 포맷으로 기록하는 함수를 추가했습니다. #82935 (scanhex12).
Time및Time64를 MM:SS, M:SS, SS 또는 S 형식으로 파싱하는 기능이 추가되었습니다. #83299 (Yarik Briukhovetskyi).- 함수
reinterpret()가 이제T가 고정 크기 데이터 타입인Array(T)로 변환하는 기능을 지원합니다(이슈 #82621). #83399 (Shankar Iyer). structureToProtobufSchema및structureToCapnProtoSchema함수가 개행 문자를 사용하는 대신 0 종료 바이트를 올바르게 추가하도록 수정하여, 출력에서 개행이 누락되는 문제와 0 바이트에 의존하는 함수(logTrace,demangle,extractURLParameter,toStringCutToZero,encrypt/decrypt등)에서 발생할 수 있는 버퍼 오버플로우를 방지했습니다. #85062를 해결합니다. #85063 (Alexey Milovidov).- 0바이트가 포함된 문자열 처리를 지원하도록
regexp_tree딕셔너리 레이아웃을 수정했습니다. #85063 (Alexey Milovidov). formatRowNoNewline함수를Values포맷 또는 행 끝에 줄바꿈이 없는 포맷으로 호출할 때 출력의 마지막 문자가 잘못 잘려 나가던 문제를 수정했습니다. #85063 (Alexey Milovidov).- 드물게 메모리 누수로 이어질 수 있던
stem함수의 예외 안전성 관련 오류를 수정했습니다. #85063 (Alexey Milovidov). - 블록 내에서 이전 문자열이 단어 문자로 끝난 경우에도 문자열 시작 부분의 단어 시작을 올바르게 인식하도록
FixedString인수에 대한initcap함수를 수정했습니다. #85063 (Alexey Milovidov). - 초기화되지 않은 메모리가 노출될 수 있는 Apache
ORC포맷의 보안 취약성을 수정했습니다. #85063 (Alexey Milovidov). replaceRegexpAll및 해당 별칭인REGEXP_REPLACE의 동작이 변경되어, 이전 일치가 문자열 전체를 처리한 경우에도 문자열 끝에서 빈 일치를 허용합니다(예:^a*|a*$또는^|.*). 이는 JavaScript, Perl, Python, PHP, Ruby의 의미 체계와 일치하며 PostgreSQL과는 다릅니다. #85063 (Alexey Milovidov).- 많은 문자열 처리 함수의 구현을 최적화하고 단순화했습니다. 여러 함수에 대한 잘못된 문서를 바로잡았습니다. 참고: String 컬럼과 String 컬럼을 포함하는 복합 타입에서
byteSize출력이 빈 문자열당 9바이트에서 8바이트로 변경되었습니다. 이는 예상된 동작입니다. #85063 (Alexey Milovidov). timeSeries*ToGrid()함수에서 0 간격을 허용합니다. 이는 https://github.com/ClickHouse/ClickHouse/pull/75036의#3에 해당합니다. #85390 (Vitaly Baranov).- 함수
nested가 내부 배열을 지원합니다. #85719 (Nikolai Kochetov).
MergeTree 개선 사항
- 온더플라이 뮤테이션 또는 패치 파트로 인해 즉시 업데이트되는 컬럼에 의존하는 스키핑 인덱스를 더 세밀하게 비활성화합니다. 이제 스키핑 인덱스는 온더플라이 뮤테이션 또는 패치 파트의 영향을 받는 파트에서만 사용되지 않으며, 이전에는 이러한 인덱스가 모든 파트에서 비활성화되었습니다. #84241 (Anton Popov).
- 예를 들어 로컬 메타데이터가 있는 디스크만 대상으로 파트를 찾도록 범위를 제한하는 MergeTree 설정
search_orphaned_parts_drives를 추가합니다. #84710 (Ilya Golshtein). WHERE에read_in_order_use_virtual_row에 대한 누락된 지원을 추가합니다. 이를 통해 필터가PREWHERE로 완전히 푸시되지 않은 쿼리에서 추가 파트 읽기를 건너뛸 수 있습니다. #84835 (Nikolai Kochetov).- MergeTree에서 “compact” Variant 판별자 직렬화 사용을 수정합니다. 이전에는 사용할 수 있는 일부 경우에도 사용되지 않았습니다. #84141 (Pavel Kruglov).
- 패치 파트의 전체 비압축 바이트 수에 대한 제한(테이블 설정
max_uncompressed_bytes_in_patches)을 추가합니다. 이를 통해 경량 업데이트 후SELECT쿼리의 심각한 성능 저하를 방지하고, 경량 업데이트의 오용 가능성도 막을 수 있습니다. #85641 (Anton Popov).
캐시 및 메모리 관리
- 파일 시스템 캐시의 논리적 오류를 수정했습니다: “바이트 수는 0이지만 범위가 아직 끝나지 않았습니다”. #81868 (Kseniia Sumarokova).
- 캐시 지역성을 개선하기 위해 rendezvous hashing을 추가했습니다. #82511 (Anton Ivashkin).
- 파일 시스템 캐시의 동적 크기 조정 기능을 리팩터링했습니다. 내부 검사용 로그도 더 추가했습니다. #82556 (Kseniia Sumarokova).
- 실행형 사용자 정의 함수의 쿼리 메모리 추적 오버헤드를 줄였습니다. #83929 (Eduard Karacharov).
- 이제 외부 라이브러리에서 수행한 모든 메모리 할당이 ClickHouse의 메모리 추적기에 표시되고 올바르게 집계됩니다. 이로 인해 특정 쿼리에서 보고되는 메모리 사용량이 “증가”하거나
MEMORY_LIMIT_EXCEEDED오류가 발생할 수 있습니다. #84082 (Nikita Mikhaylov). - 암호화된 이름이 지정된 컬렉션의 encrypted_buffer에 필요한 최소한의 메모리만 할당합니다. #84432 (Pablo Marcos).
벡터 유사성 인덱스
- 사용자가
NumericIndexedVector에서nan및inf를 사용하지 못하도록 했습니다. #82239 및 몇 가지 추가 문제를 수정했습니다. #82681 (Raufs Dunamalijevs). - 이제 벡터 유사성 인덱스가 바이너리 양자화를 지원합니다. 바이너리 양자화는 메모리 사용량을 크게 줄이고, 더 빠른 거리 계산을 통해 벡터 인덱스 구축 속도를 높입니다. 또한 기존 설정
vector_search_postfilter_multiplier는 폐기되었으며, 더 범용적인 설정인vector_search_index_fetch_multiplier로 대체되었습니다. #85024 (Shankar Iyer). - 벡터 유사성 인덱스를 사용한 근사 벡터 검색이 이제 일반 제공(GA) 상태입니다. #85888 (Robert Schulze).
오류 처리 및 메시지
- Header Connection은 헤더의 마지막에 전송되도록 했습니다. 이 시점이 되어야 연결을 유지해야 하는지 알 수 있기 때문입니다. #81951 (Sema Checherinda).
- 이전 버전에서는 집계 함수 state와 IPv4를 곱할 때 적절한 오류 코드 대신 논리 오류가 발생했습니다. #82817을 해결합니다. #82818 (Alexey Milovidov).
AsynchronousMetrics의 오류 처리가 개선되었습니다./sys/block디렉터리가 존재하지만 접근할 수 없는 경우, 서버는 블록 디바이스 모니터링 없이 시작됩니다. #79229을 해결합니다. #83115 (Alexey Milovidov).- 잘못된 SELECT를 가진 materialized view에 대한
INSERT에서 의존성 검사에 문제가 있었고, 그 결과 명확한 설명이 포함된 의미 있는 오류 대신 이해하기 어려운std::exception이 반환될 수 있었습니다. 이제 이 문제가 수정되었습니다. 다음 문제를 해결합니다: #82889. #83190 (Nikita Mikhaylov). - 예외 메시지에 표현식 actions의 매우 긴 설명을 출력하지 않도록 했습니다. #83164을 해결합니다. #83350 (Alexey Milovidov).
- 스토리지가 종료 중일 때
getStatus가ErrorCodes::ABORTED예외를 발생시킵니다. 이전에는 이로 인해 SELECT 쿼리가 실패했습니다. 이제는ErrorCodes::ABORTED예외를 포착해 의도적으로 무시합니다. #83435 (Miсhael Stetsyuk). - 프로젝션을 로드하고 추가하는 과정의 특정 상황에서 예외 메시지를 더 읽기 쉽게 개선했습니다. #83728 (Robert Schulze).
- 닫힌 연결에서 읽는 일을 방지하기 위해 EOF를 확인하기 전에 연결이 취소되었는지 먼저 확인합니다. #83893를 해결합니다. #84227 (Raufs Dunamalijevs).
- 내부 검사를 단순화하여 클라이언트 연결에 대한 서버 종료 처리를 개선했습니다. #84312 (Raufs Dunamalijevs).
- 이제 UDF 실행 중 발생하는 저수준 오류는
UDF_EXECUTION_FAILED오류 코드로 처리되며, 이전에는 서로 다른 오류 코드가 반환될 수 있었습니다. #84547 (Xu Jia).
SQL 포맷 개선 사항
CREATE DICTIONARY의 일관되지 않은 포맷을 수정했습니다. #82105를 해결했습니다. #82829 (Alexey Milovidov).materialize함수가 포함된 경우TTL의 일관되지 않은 포맷을 수정했습니다. #82828를 해결했습니다. #82831 (Alexey Milovidov).- INTO OUTFILE 등의 출력 옵션이 포함된 서브쿼리에서
EXPLAIN AST의 일관되지 않은 포맷을 수정했습니다. #82826를 해결했습니다. #82840 (Alexey Milovidov). - 별칭이 허용되지 않는 Context에서, 별칭이 있는 괄호 표현식의 일관되지 않은 포맷을 수정했습니다. #82836를 해결했습니다. #82837를 해결했습니다. #82867 (Alexey Milovidov).
- 쿼리 매개변수가 있는 CREATE USER의 포맷을 수정했습니다(예:
CREATE USER {username:Identifier} IDENTIFIED WITH no_password). #84376 (Azat Khuzhin). - 예를 들어 Decimal(8)처럼 매개변수가 있는 컬럼 뒤에 오는
CREATE DICTIONARY쿼리의 컬럼 목록 마지막 쉼표 파싱을 수정했습니다. #85586를 해결했습니다. #85653 (Nikolay Degterinsky).
외부 통합
- 이름이 지정된 컬렉션을 사용할 때 ODBC와 JDBC의 매개변수 이름을 통일합니다. #83410 (Andrey Zvonov).
- MongoDB: 문자열을 숫자 타입으로 암시적으로 파싱합니다. 이전에는 ClickHouse 테이블의 숫자 컬럼에 대해 MongoDB 소스에서 문자열 값을 받으면 예외가 발생했습니다. 이제 엔진이 문자열에서 숫자 값을 자동으로 파싱하려고 시도합니다. #81167를 해결했습니다. #84069 (Kirill Nikiforov).
- 지원되지 않는 아키텍처에서도
simdjson을 허용합니다(이전에는CANNOT_ALLOCATE_MEMORY오류가 발생했습니다). #84966 (Azat Khuzhin).
기타 개선 사항
- Ytsaurus 테이블 엔진과 테이블 함수를 추가했습니다. #77606 (MikhailBurdukov).
- HashJoin::needUsedFlagsForPerRightTableRow를 개선하여 cross join의 경우 false를 반환하도록 했습니다. #82379 (lgbo).
- 맵 컬럼을 튜플 배열 형태로 쓰고 읽을 수 있도록 했습니다. #82408 (MikhailBurdukov).
- 이 PR은 되돌렸습니다. #82884 (Mithun p).
- 비동기 로그: 큐에 보관되는 최대 항목 수를 제한했습니다. #83214 (Raúl Marín).
- JSON 입력 형식에서 Date/Date32를 정수로 사용할 수 있도록 했습니다. #83597 (MikhailBurdukov).
- 첫 번째 인수가 상수 배열(집합)이고 두 번째 인수가 인덱스가 적용된 컬럼(부분 집합)일 때 블룸 필터 인덱스(regular, ngram, token)를 활용할 수 있도록 지원을 개선해 더 효율적인 쿼리 실행이 가능해졌습니다. #84700 (Doron David).
- KeyValue 스토리지 프라이머리 키(예: EmbeddedRocksDB, KeeperMap)에
IN/GLOBAL IN필터를 푸시다운할 때 집합 값의 타입 캐스팅을 허용했습니다. #84515 (Eduard Karacharov). - 인덱스 분석 결과 병렬 레플리카 읽기에서 빈 범위가 나오는 경우 전체 스캔을 제거했습니다. #84971 (Eduard Karacharov).
- 로컬 호스트에서 통합 테스트를 실행할 때 발생할 수 있는 여러 문제를 수정했습니다. #82135 (Oleg Doronin).
- 기존 배포에서도 기본적으로 trace_log.symbolize를 활성화했습니다. #85456 (Azat Khuzhin).
버그 수정(공식 안정 릴리스에서 사용자에게 드러나는 오동작)
성능 최적화
- https://github.com/ClickHouse/ClickHouse/pull/79051에서 25.5에 도입된 SummingMergeTree의 성능 저하를 수정했습니다. #82130 (Pavel Kruglov).
- 분석기가 활성화된 상태에서 2차 쿼리가 VIEW에서 항상 모든 컬럼을 읽는 문제로 인한 성능 저하를 수정했습니다. #81718을 해결합니다. #83036 (Dmitry Novik).
- 의존성이 없는
CREATE TABLE에서는 순환 의존성을 검사하지 않습니다. 이를 통해 https://github.com/ClickHouse/ClickHouse/pull/65405에서 도입된, 수천 개의 테이블을 생성하는 사용 사례의 성능 저하를 수정합니다. #83077 (Pavel Kruglov). DISTINCT윈도우 집계가 선형 시간에 실행되도록 개선하고sumDistinct의 버그를 수정했습니다. #79792를 해결합니다. #52253를 해결합니다. #79859 (Nihal Z. Miaji).
쿼리 실행 관련 수정 사항
ORDER BY ... LIMIT BY ... LIMIT N조합을 사용하는 쿼리에서 ORDER BY가 PartialSorting으로 실행되는 경우, 이제 카운터rows_before_limit_at_least는 정렬 변환이 소비한 행 수가 아니라 LIMIT 절에서 소비한 행 수를 반영합니다. #78999 (Eduard Karacharov).<=>연산자와 Join 스토리지의 논리 오류를 수정하여 이제 쿼리가 올바른 오류 코드를 반환합니다. #80165 (Vladimir Cherkasov).remote함수 계열과 함께 사용할 때loop함수에서 발생하던 충돌을 수정했습니다.loop(remote(...))에서 LIMIT 절이 올바르게 적용되도록 했습니다. #80299 (Julia Kartseva).- Unix epoch(1970-01-01) 이전 날짜와 최대 날짜(2106-02-07 06:28:15) 이후 날짜를 처리할 때
to_utc_timestamp및from_utc_timestamp함수가 잘못 동작하던 문제를 수정했습니다. 이제 이 함수는 값을 각각 epoch 시작 시점과 최대 날짜로 올바르게 제한합니다. #80498 (Surya Kant Ranjan). - 왼쪽 인수가 null이고 서브쿼리 결과가 널 허용이 아닐 때
transform_null_in=1에서IN실행 문제를 수정했습니다. #81584 (Pavel Kruglov). - 스칼라 상관 서브쿼리 처리 중 필수 컬럼을 읽지 않는 문제를 수정했습니다. 이 수정은 #81716을 해결합니다. #81805 (Dmitry Novik).
- 쿼리에서 상수 별칭(alias) 컬럼만 사용할 때 필터 분석을 수정했습니다. #79448를 해결합니다. #82037 (Dmitry Novik).
WHERE조건에서arrayJoin과IndexSet을 사용하는 쿼리의Not found column오류를 수정했습니다. #82113 (Nikolai Kochetov).- CTE 정의가 같은 이름의 다른 테이블 표현식을 참조할 때 발생하는
TOO_DEEP_SUBQUERIES예외를 수정했습니다. #83413 (Dmitry Novik). WHERE ... IN (<subquery>)절 사용 시 쿼리 조건 캐시가 활성화된 경우(설정use_query_condition_cache) 쿼리 결과가 잘못되던 문제를 수정했습니다. #83445 (LB7666).INSERT SELECT에서UNION ALL을 사용하면 특정 예외적인 경우 null 포인터 역참조가 발생할 수 있었습니다. 이 변경으로 #83618이 해결되었습니다. #83643 (Alexey Milovidov).- 연관된 컬럼에 대한 행 정책 표현식을 분석할 때 발생하던
LOGICAL_ERROR를 수정했습니다. #82618 (Dmitry Novik). - 재귀 CTE와 함께 쿼리 조건 캐시를 사용할 때 잘못된 결과가 반환되는 문제를 수정했습니다(이슈 #81506). #84026 (zhongyuankai).
- 잘못된
WINDOW정의를 분석할 때 발생하는 무한 재귀를 수정했습니다. #83131 문제를 수정합니다. #84242 (Dmitry Novik). additional_table_filters expression설정에서IN (subquery)내부의Not-ready Set문제를 수정했습니다. #85210 (Nikolai Kochetov).optimize_syntax_fuse_functions가 활성화되었을 때 중복된 서브쿼리로 인해 발생하는 논리 오류를 수정하고, #75511을 해결했습니다. #83300 (Vladimir Cherkasov).
Iceberg 및 DataLake 수정 사항
- REST 카탈로그를 통해 Iceberg 테이블을 쿼리할 때 메타데이터 해석 문제를 수정했습니다. … #80562 (Saurabh Kumar Ojha).
- Iceberg의 데이터 레이스를 수정했습니다. #82088 (Azat Khuzhin).
- Iceberg에서 “Context has expired” 오류를 수정했습니다. #82146 (Azat Khuzhin).
- 이제 ClickHouse는 스키마 진화 이후에도 Glue catalog의 Iceberg 테이블을 읽을 수 있습니다. #81272를 수정했습니다. #82301 (alesapin).
- Iceberg의 데이터 레이스를 수정했습니다. #82841 (Azat Khuzhin).
- Iceberg 배열 요소와 Iceberg 맵 값(중첩된 모든 하위 필드 포함)에 대해 경계 기반 파일 프루닝을 비활성화했습니다. #83520 (Daniil Ivanik).
- 복합 타입에 대한 Iceberg 쓰기 작업을 수정했습니다. #85330 (scanhex12).
- 복합 타입에서는 lower 및 upper bound 쓰기가 지원되지 않습니다. #85332 (scanhex12).
- Iceberg에서 필드의 nullable 속성을 수정했습니다. #85977 (scanhex12).
- 이제 더 이상 빈 Iceberg 삭제 파일을 생성하지 않습니다. #86061 (scanhex12).
- Iceberg 쓰기 시 메타데이터 timestamp를 업데이트합니다. #85711 (scanhex12).
- Spark가 포지션 삭제 파일을 읽지 못하던 문제를 수정했습니다. #85762 (scanhex12).
- 더 이상 manifest 파일에서 스키마를 가져오지 않고, 각 snapshot별로 관련 스키마를 별도로 저장합니다. 각 데이터 파일의 관련 스키마는 해당 snapshot에서 추론합니다. 이전 동작은 existing status가 있는 manifest 파일 엔트리에 대한 Iceberg 사양을 위반했습니다. #84588 (Daniil Ivanik).
- 이제 Iceberg는 SELECT 쿼리 사이에서 관련 snapshot version을 캐시하지 않으며, 항상 snapshot을 정확하게 해석합니다. 이전의 Iceberg snapshot 캐시 시도는 time travel과 함께 Iceberg 테이블을 사용할 때 문제를 일으켰습니다. #85038 (Daniil Ivanik).
- REST 카탈로그를 통해 Iceberg 테이블을 쿼리할 때 메타데이터 해석 문제를 수정했습니다. … #85531 (Saurabh Kumar Ojha).
- icebergS3Cluster 및 icebergAzureCluster 테이블 함수에서 시크릿 마스킹을 수정했습니다. #85658 (MikhailBurdukov).
DeltaLake 수정 사항
- 스토리지
DeltaLake의 delta-kernel 사용 시 컬럼 프루닝 문제를 수정했습니다. #84543를 해결합니다. #84745 (Kseniia Sumarokova). - 스토리지 DeltaLake의 delta-kernel에서 자격 증명을 갱신하도록 수정했습니다. #84751 (Kseniia Sumarokova).
- delta-kernel 구현의 segfault를 수정했습니다. #85160 (Kseniia Sumarokova).
DeltaLake엔진의 delta-kernel 구현에서 레이스 컨디션 문제를 수정했습니다. #85221 (Kseniia Sumarokova).DeltaLake엔진에서 delta-kernel이 비활성화된 상태로 파티션된 데이터를 읽는 문제를 수정했습니다. 이 문제는 25.7에서 발생했습니다 (https://github.com/ClickHouse/ClickHouse/pull/81136). #85223 (Kseniia Sumarokova).- 호환성을 위해
allow_experimental_delta_kernel_rs의 25.5 이전 값을false로 변경했습니다. #84587 (Kseniia Sumarokova). - Delta Lake의 캐시에서 count를 읽는 문제를 수정했습니다. #85704 (Kseniia Sumarokova).
TTL 및 MergeTree 수정 사항
- TTL로 인해 행 수가 줄어들 때
minmax_count_projection과 같이 이에 의존하는 알고리즘의 정확성을 보장할 수 있도록 MinMax 인덱스를 다시 계산합니다. 이로써 #77091이 해결되었습니다. #77166 (Amos Bird). - TTL을 업데이트할 때 TTL GROUP BY에서 TTL이 잘못 재계산되던 문제를 수정했습니다. #81222 (Evgeniy Ulasik).
- TTL 표현식에서 dict를 사용할 때 머지 중 “Context has expired”가 발생하던 문제를 수정했습니다. #81690 (Azat Khuzhin).
- GROUP BY와 SET용 TTL에서 동일한 컬럼을 사용할 때 발생하던 LOGICAL_ERROR와 그에 따른 크래시를 수정했습니다. #82054 (Pablo Marcos).
- 이제 테이블에서 모든 TTL이 제거되면 MergeTree는 TTL 관련 작업을 수행하지 않습니다. #84441 (alesapin).
ALTER MODIFY ORDER BY가 정렬 키의 TTL 컬럼을 검증하지 않던 문제를 수정했습니다. 이제ALTER작업 중ORDER BY절에서 TTL 컬럼을 사용하면 올바르게 거부되어 잠재적인 테이블 손상을 방지합니다. #84536 (xiaohuanlin).
프로젝션 수정 사항
- 컬럼 유형이 널 허용(Nullable)으로 변경되었을 때 프로젝션을 구체화하는 과정에서 발생하던 논리 오류를 수정했습니다. #80741 (Pavel Kruglov).
enable_shared_storage_snapshot_in_query = 1일 때mergeTreeProjection테이블 함수에서 parent 메타데이터를 잘못 사용하던 문제를 수정했습니다. 이는 #82634 관련 수정입니다. #82638 (Amos Bird).- 테이블에 프로젝션이 있고
lightweight_mutation_projection_mode = 'rebuild'로 설정된 상태에서, 사용자가 테이블의 임의의 block에서 모든 행을 삭제하는 lightweight delete를 실행할 때 드물게 발생하던 ClickHouse 크래시를 수정했습니다. #84158 (alesapin). - 손상된 프로젝션이 있는 파트의 Backup 문제를 수정했습니다. #85362 (Antonio Andelic).
_part_offset컬럼이 안정화될 때까지 릴리스에서 프로젝션 내 사용을 금지했습니다. #85372 (Sema Checherinda).
병렬 레플리카 수정 사항
- 병렬 레플리카로 실행된 일부 쿼리에서는
in order읽기 최적화가 initiator에는 적용되지만 원격 노드에는 적용되지 않을 수 있었습니다. 이로 인해 병렬 레플리카 coordinator(initiator)와 원격 노드에서 서로 다른 읽기 모드가 사용되었고, 이는 논리적 오류였습니다. #80652 (Igor Nikonov). - 하위 쿼리(subquery)에
FINAL이 포함된 경우 병렬 레플리카를 비활성화합니다. #81401 #83455 (zoomxi). - 병렬 레플리카를 사용하는 쿼리에서 여러 INNER 조인 뒤에 RIGHT 조인이 이어질 때 발생하는
LOGICAL_ERROR를 수정했습니다. 이러한 쿼리에는 병렬 레플리카를 사용하지 않습니다. #84299 (Vladimir Cherkasov). - 역방향
in order읽기 최적화를 사용하는 병렬 레플리카 쿼리는 잘못된 결과를 생성할 수 있습니다. #85406 (Igor Nikonov).
인증 및 보안
- 로그/query_log에서 명명된 컬렉션 값이 숨겨지지 않던 문제를 수정했습니다. #82405를 해결합니다. #82510 (Kseniia Sumarokova).
- AST에서 SCRAM_SHA256_PASSWORD 유형으로 파싱할 때 인증 데이터의 salt를 설정하도록 했습니다. #82888 (Tuan Pham Anh).
- Avro 스키마 레지스트리 인증 세부 정보가 사용자나 로그에 표시되지 않도록 마스킹합니다. #83713 (János Benjamin Antal).
REVOKE S3 ON system.*를 실행할 때*.*에 대한 S3 권한까지 함께 취소되던 잘못된 동작을 수정했습니다. 이 변경으로 #83417을 해결합니다. #83420 (pufit).no_password로 생성된 사용자가 서버 설정allow_no_password가 0으로 변경된 후 로그인하려고 시도할 때 서버가 충돌하던 문제를 수정했습니다. #84426 (Shankar Iyer).- JWT로 식별되는 사용자를 생성하려고 할 때의 오류 메시지를 개선했습니다. #85072 (Konstantin Bogdanov).
deltaLakeAzure,deltaLakeCluster,icebergS3Cluster,icebergAzureCluster의 자격 증명을 마스킹합니다. #85889 (Julian Maicher).- #79963에서 도입된 버그를 수정했습니다. definer가 있는 materialized view에 삽입할 때는 권한 검사에 definer의 권한 부여를 사용해야 합니다. #79951을 해결합니다. #83502 (pufit).
Backup 및 복원 수정 사항
- 빈
Memory테이블의 Backup 문제를 수정하여, Backup 복원 시BACKUP_ENTRY_NOT_FOUND오류로 실패하던 문제를 해결했습니다. #82791 (Julia Kartseva). - 읽기 전용 디스크에서 Backup을 복원할 때 표시되던 오해의 소지가 있는 오류 메시지를 수정했습니다. #83051 (Julia Kartseva).
- 연결 문제 발생 후 불필요한 내부 Backup이 시작되던 문제를 수정했습니다. #84755 (Vitaly Baranov).
윈도우 및 집계 함수
- 머지 중 예외가 발생할 때
Aggregator에서 발생할 수 있는 크래시를 수정했습니다. #81450 (Nikita Taranov). - 머지 중 예외가 발생할 때
Aggregator에서 발생할 수 있는 크래시를 수정했습니다. #82022 (Nikita Taranov). - arraySimilarity의 복사-붙여넣기 오류를 수정하고 UInt32 및 Int32 가중치 사용을 금지했습니다. 테스트와 문서도 업데이트했습니다. #82103 (Mikhail f. Shiryaev).
- 큰 수에 적용할 때 발생하던
numericIndexedVectorPointwiseAdd,numericIndexedVectorPointwiseSubtract,numericIndexedVectorPointwiseMultiply,numericIndexedVectorPointwiseDivide함수의 오버플로우를 수정했습니다. #82165 (Raufs Dunamalijevs).
Parquet 및 파일 포맷 수정 사항
WHERE function(key) IN (...)와 같은 조건에 Parquet 블룸 필터를WHERE key IN (...)인 것처럼 잘못 적용하던 문제를 수정했습니다. #81255 (Michael Kolupaev).- Parquet writer가 Decimal 타입에 대해 잘못된 통계값(min/max)을 출력하던 문제를 수정했습니다. #83754 (Michael Kolupaev).
- 요소가 비어 있는 경우
groupArraySample/groupArrayLast의 역직렬화 문제를 수정했습니다(입력이 비어 있으면 역직렬화 과정에서 바이너리의 일부를 건너뛸 수 있었고, 이로 인해 데이터를 읽는 중 손상이 발생하거나 TCP protocol에서 UNKNOWN_PACKET_FROM_SERVER가 발생할 수 있었습니다). 이 문제는 숫자 및 date time 타입에는 영향을 주지 않습니다. #82763 (Pedro Ferreira). - RowBinary format에서 NULL 값을 포함한 JSON paths를 기록할 때 발생하던 문제를 수정했습니다. #83923 (Pavel Kruglov).
조인 관련 수정 사항
Merge스토리지를 사용하는 테이블이 포함된 JOIN 표현식이 있는 쿼리에서 필터 수정이 잘못되던 문제를 해결했습니다. #82092. #82950 (Dmitry Novik).- 타입 캐스팅된 키로 키-값 스토리지를 조인할 때 발생하던 충돌을 해결했습니다. #82497 (Pervakov Grigorii).
- 여러 JOIN이 있는 쿼리에서 matcher를 확인하는 과정에서 발생하던 논리 오류를 해결했습니다. #81969. #82421 (Vladimir Cherkasov).
- 동등 비교의 피연산자 타입이 서로 다르거나 상수를 참조하는 경우, 필터가 JOIN 조건에 머지되는 문제를 해결했습니다. #83432. #84145 (Dmitry Novik).
- 한쪽 컬럼이
LowCardinality이고 다른 쪽이 상수일 때, 부등 조건으로 JOIN을 수행하면 발생하던Expected single dictionary argument for function논리 오류를 해결했습니다. #81779. #84019 (Alexey Milovidov).
복제된 데이터베이스 수정 사항
- DDLWorker와 DatabaseReplicatedDDLWorker의 markReplicasActive를 수정했습니다. #81395 (Tuan Pham Anh).
DatabaseReplicated::getClusterImpl를 수정했습니다.hosts의 첫 번째 요소(또는 여러 요소)에id == DROPPED_MARK가 있고 동일한 세그먼트에 해당하는 다른 요소가 없으면shards의 첫 번째 요소가 빈 벡터가 되어std::out_of_range가 발생할 수 있습니다. #82093 (Miсhael Stetsyuk).- 비동기 테이블 로딩 작업 수를 추적하도록 했습니다. 실행 중인 작업이 있으면
TransactionLog::removeOldEntries에서tail_ptr를 업데이트하지 않습니다. #82824 (Tuan Pham Anh). - MergeTree 테이블을
add_minmax_index_for_numeric_columns=1또는add_minmax_index_for_string_columns=1로 생성한 뒤, 이후 ALTER 작업 중 인덱스가 구체화되면 새 레플리카에서 복제된 데이터베이스가 올바르게 초기화되지 못하는 문제를 수정했습니다. #83751 (Nikolay Degterinsky). - DEFINER가 삭제된 경우 복제된 데이터베이스의 새 레플리카에서 RMV 생성이 실패하는 문제를 수정했습니다. #85327 (Nikolay Degterinsky).
- 메타데이터 파일 이동에 오랜 시간이 걸릴 때 복제된 데이터베이스 복구에 실패하는 문제를 수정했습니다. #85177 (Tuan Pham Anh).
- Keeper에서 데이터베이스 메타데이터를 복원한 후 복제된 데이터베이스를 강제로 복구하도록 했습니다. #85960 (Tuan Pham Anh).
Replicated데이터베이스 복구 시 발생하는 버그를 수정했습니다. 테이블 이름에%기호가 포함된 경우 복구 중 테이블이 다른 이름으로 다시 생성될 수 있었습니다. #85987 (Alexander Tokmakov).- 이제 DDL worker가 레플리카 집합에서 오래된 host를 정리합니다. 이를 통해 ZooKeeper에 저장되는 메타데이터 양이 줄어듭니다. #88154 (alesapin).
경량 업데이트 수정 사항
ReplacingMergeTree및CollapsingMergeTree엔진을 사용하는 테이블에서 경량 업데이트 문제를 수정했습니다. #84851 (Anton Popov).- 테이블의 모든 컬럼을 업데이트하는 경량 업데이트의 논리 오류를 수정했습니다. #84380 (Anton Popov).
- 25.7 미만 버전의 서버에서 생성된
ReplicatedMergeTree엔진 테이블의 경량 업데이트 문제를 수정했습니다. #84933 (Anton Popov). ALTER TABLE ... REPLACE PARTITION쿼리를 실행한 후 복제되지 않은MergeTree엔진 테이블에서 발생하던 경량 업데이트 문제를 수정했습니다. #84941 (Anton Popov).ReplicatedMergeTree에서 패치 파트 정리 문제를 수정했습니다. 이전에는 패치 파트를 구체화하는 머지되었거나 변경이 적용된 파트를 다른 레플리카에서 다운로드하기 전까지, 경량 업데이트 결과가 해당 레플리카에 일시적으로 보이지 않을 수 있었습니다. #85121 (Anton Popov).
S3 및 객체 스토리지 수정 사항
- 시크릿 마스킹에서 S3 테이블 함수 인수 검증을 수정하여 발생할 수 있는
LOGICAL_ERROR를 방지합니다. #80620을 종료합니다. #82056 (Vladimir Cherkasov). - 서버가 메모리 부족 압박 상태일 때 원격 쿼리에서 발생할 수 있는 데드락을 수정합니다. #82160 (Kirill).
- AWS ECS 토큰을 다시 로드할 수 있도록 만료 시간을 추가합니다. #82422 (Konstantin Bogdanov).
- 외부 테이블 엔진의 캐시된 버퍼에서 경계 정렬 비활성화가 동작하지 않던 문제를 수정합니다. 이 문제는 https://github.com/ClickHouse/ClickHouse/pull/81868 에서 발생했습니다. #82493 (Kseniia Sumarokova).
- S3 클라이언트의
no_sign_request를 수정합니다. 이를 사용하면 S3 요청에 서명하지 않도록 명시적으로 설정할 수 있습니다. 또한 엔드포인트 기반 설정을 사용해 특정 엔드포인트별로 정의할 수도 있습니다. #83379 (Antonio Andelic). - s3Cluster()에서 복제된 MergeTree로 INSERT SELECT를 수행할 때 사용할 수 없는 노드를 건너뜁니다. #83676 (Igor Nikonov).
- S3 요청 속도 저하의 조기 반환 조건을 수정합니다. 모든 스레드가 재시도 가능한 오류로 인해 일시 중지되었을 때 속도 저하 동작이 활성화되려면
s3_slow_all_threads_after_network_error또는backup_slow_all_threads_after_retryable_s3_error중 하나만 true이면 되도록 변경했으며, 이전처럼 둘 다 true일 필요는 없습니다. #85505 (Julia Kartseva). - 분산 테이블 또는 원격 테이블 함수를 통해 객체 스토리지 함수에서 읽는 동안 발생하는 논리 오류를 수정합니다. 수정: #84658, 수정: #85173, 수정: #52022. #85359 (alesapin).
- S3Queue의 “Table is already registered” 논리 오류를 수정합니다. #84433을 종료합니다. 이 문제는 https://github.com/ClickHouse/ClickHouse/pull/83530 이후 발생했습니다. #84677 (Kseniia Sumarokova).
- 큰 설정 값으로 인해 S3Queue 테이블과 레플리카 재시작이 깨지던 문제를 수정합니다. #86074 (Nikolay Degterinsky).
Dynamic 및 Variant 타입 수정
- 파싱 실패 시 Dynamic 컬럼의 롤백 문제를 수정했습니다. #82169 (Pavel Kruglov).
- UNION에서 Variant 타입 관련 크래시가 발생할 수 있는 문제를 수정했습니다. #83295 (Pavel Kruglov).
- lazy materialization을 사용할 때 Variant 컬럼을 읽는 문제를 수정했습니다. #84400 (Pavel Kruglov).
- 기존 테이블을 읽는 동안 default/materialize 표현식을 실행할 때 experimental/suspicious 타입을 검증하지 않도록 수정했습니다. #81618 (Pavel Kruglov).
Keeper 수정 사항
- Keeper 수정: 세션 종료 시 임시(ephemeral) 노드가 삭제될 때 전체 watch 수가 올바르게 갱신되도록 수정했습니다. #83583 (Antonio Andelic).
- Keeper 변경 로그에 기록 순서가 뒤바뀌는 문제를 수정했습니다. 이전에는 변경 로그에 진행 중인 쓰기 작업이 있을 수 있었지만, 롤백으로 인해 대상 파일이 동시에 변경될 수 있었습니다. 이로 인해 로그 불일치와 데이터 손실 가능성이 발생할 수 있었습니다. #84434 (Antonio Andelic).
- RocksDB 스토리지를 사용하는 Keeper의 누수 문제를 수정했습니다(이터레이터가 해제되지 않음). #84523 (Azat Khuzhin).
- Keeper 설정
rotate_log_storage_interval = 0으로 인해 ClickHouse가 충돌하던 문제를 수정했습니다. (이슈 #83975). #84637 (George Larionov). - Keeper가 반환하는 전체 watch 수를 수정했습니다. #84890 (Antonio Andelic).
- RefreshTask에서 ‘view’로부터 ZooKeeper를 가져올 때 ‘뮤텍스’를 잠그도록 수정했습니다. #84699 (Tuan Pham Anh).
인덱싱 수정 사항
- alternation이 포함되고 첫 번째 대안이 리터럴이 아닌 regexp로 token/ngram 인덱스를 필터링할 때 발생하던 과도한 그래뉼 스키핑을 수정했습니다. #79373 (Eduard Karacharov).
use_skip_indexes_if_final_exact_mode설정의 구현(25.6에 도입됨)은MergeTree엔진 설정/데이터 분포에 따라 적절한 후보 범위를 선택하지 못할 수 있었습니다. 이 문제를 해결했습니다. #82667 (Shankar Iyer).use_skip_indexes_if_final_exact_mode설정의 최적화(25.6에 도입됨)는MergeTree엔진 설정/데이터 분포에 따라 적절한 후보 범위를 선택하지 못할 수 있었습니다. 이 문제를 해결했습니다. #82879 (Shankar Iyer).- 이전에는
set인덱스가 그래뉼이 필터를 통과하는지 확인할 때널 허용컬럼을 고려하지 않았습니다(이슈 #75485). #84305 (Elmi Ahmadov). MinMax인덱스를 평가하는 동안 nan 값과 비교할 때 올바른 범위를 사용하지 않던 문제를 수정했습니다. #84386 (Elmi Ahmadov).ngram및no_op토크나이저는 이제 빈 입력 토큰 때문에 (실험적) 텍스트 인덱스를 더 이상 충돌시키지 않습니다. #84849 (Robert Schulze).
Materialized View 수정 사항
- 테이블 종속성 버그를 수정하여 Materialized View가 INSERT 쿼리를 누락하던 문제를 해결했습니다. #82222 (Nikolay Degterinsky).
- https://github.com/ClickHouse/ClickHouse/pull/79963 이후 Materialized View에서 서브컬럼 사용이 깨져
Not found column X in block오류가 발생할 수 있었습니다. 이 동작을 수정했습니다. 다음 문제를 해결합니다: #82784. #83221 (Nikita Mikhaylov). - 타입이 서로 다를 때 mv에서 발생하던 illegal_type_of_argument를 수정했습니다. #85135 (Sema Checherinda).
Azure 및 cloud storage 수정 사항
- AzureBlobStorage에서 네이티브 복사를 위해 인증 메서드를 비교하는 과정에서 예외가 발생하면, 읽기 후 복사 방식(즉, 네이티브가 아닌 복사)으로 폴백하도록 코드를 업데이트했습니다. #82693 (Smita Kulkarni).
AzureIteratorAsync의 이중 해제 문제를 수정했습니다. #85064 (Nikita Taranov).
크래시 및 안정성 수정
user_id가 때때로 비어 있을 수 있어, 세션 종료 중 로깅 과정에서 발생할 수 있는 크래시를 수정했습니다. #82513 (Bharat Nallan).- 잘못된
INSERT이후 connection이 끊어진 상태로 남아 클라이언트에서 발생하던 크래시를 수정했습니다. #83253 (Azat Khuzhin). - 빈 컬럼이 있는 block의 크기를 계산할 때 발생하던 크래시를 수정했습니다. #83271 (Raúl Marín).
- CPU 스케줄링이 활성화된 상태에서 부하 중 실행될 때,
max_threads=1설정이 있는 쿼리에서 발생할 수 있는 크래시를 수정했습니다. #83387 (Fan Ziqi). zoutofmemory를 하드웨어 오류로 처리하도록 변경했습니다. 그렇지 않으면 논리 오류를 발생시킵니다. 자세한 내용은 https://github.com/clickhouse/clickhouse-core-incidents/issues/877 를 참조하십시오. #84420 (Han Fei).BackgroundSchedulePool종료 중 발생할 수 있는 abort(작업에서 스레드를 조인하는 과정으로 인한)와, 단위 테스트에서 발생하던 멈춤 현상도 함께 수정했을 가능성이 있습니다. #83769 (Azat Khuzhin).- 백그라운드 취소 검사기 스레드로 인해 발생하던 데드락을 수정했습니다. #84203 (Antonio Andelic).
- 라이브러리 브리지 정리 중 재귀적인 Context 잠금으로 인해 종료 시 발생하던 데드락을 수정했습니다. #83824 (Azat Khuzhin).
- 잘못된
INSERT이후 connection이 끊어진 상태로 남아 클라이언트에서 발생하던 크래시를 수정했습니다. #83842 (Azat Khuzhin). - String 역직렬화 중
MEMORY_LIMIT_EXCEEDED가 발생하는 경우 생길 수 있는 UB(크래시)를 수정했습니다. #85440 (Azat Khuzhin). log_comment또는insert_deduplication_token설정을 변경하는 비동기 삽입에서 드물게 발생하던 크래시를 수정했습니다. #85540 (Anton Popov).
Glue 및 catalog 관련 수정
- Glue catalog 통합의 버그를 수정했습니다. 이제 ClickHouse는 일부 서브컬럼에 Decimal이 포함된 중첩 데이터 타입이 있는 테이블(예:
map<string, decimal(9, 2)>)을 읽을 수 있습니다. #81301을 해결했습니다. #82114 (alesapin). - 이제 ClickHouse는 테이블 유형이 소문자로 지정된 Glue Catalog의 테이블도 읽을 수 있습니다. #84316 (alesapin).
- 이제 Unity Catalog는 Delta가 아닌 테이블의 경우, 비정상적인 데이터 타입이 있는 스키마를 무시합니다. #85699을 해결했습니다. #85950 (alesapin).
함수 관련 수정 사항
- 이제
trim{Left,Right,Both}함수는 “FixedString(N)” 타입의 입력 문자열을 지원합니다. 예를 들어, 이제SELECT trimBoth(toFixedString('abc', 3), 'ac')가 동작합니다. #82691 (Robert Schulze). trim함수를 모든 입력이 상수인 상태로 호출하면 이제 상수 출력 문자열을 생성합니다. (버그 #78796). #82900 (Robert Schulze).- 가변 길이 포매터(예:
%M)와 함께 포매터%f를 사용할 때formatDateTime함수의 출력이 잘못되던 문제를 수정했습니다. #83020 (Robert Schulze). CASE함수에서NULL인수 처리와 관련된 버그를 수정했습니다. #82436 (Yarik Briukhovetskyi).lowCardinalityKeys함수에서 공유 딕셔너리의 관련 없는 파트를 사용하지 않도록 수정했습니다. #83118 (Alexey Milovidov).- const 인수와 non-const 인수가 혼합된 경우
colorSRGBToOKLCH/colorOKLCHToSRGB의 문제를 수정했습니다. #83906 (Azat Khuzhin). array()함수에서 빈 튜플이 잘못 생성되던 문제를 수정했습니다. 이로써 #84202가 해결됩니다. #84297 (Amos Bird).- Bech32 인코딩 및 디코딩이 잘못되던 버그를 수정했습니다. 이 버그가 처음에 발견되지 않았던 것은 테스트에 사용된 알고리즘의 온라인 구현에도 동일한 문제가 있었기 때문입니다. #84257 (George Larionov).
분산 쿼리 수정 사항
- 병렬 분산
INSERT SELECT에서LIMIT를 허용하던 것은 올바르지 않았으며, 이로 인해 대상 테이블에 데이터가 중복될 수 있었습니다. #84477 (Igor Nikonov). JOIN또는 서브쿼리가 있는 경우에는 테이블 함수를 해당 cluster 대안으로 치환하지 않도록 했습니다. #84335 (Konstantin Bogdanov).- 분산 환경에서 상관 서브쿼리가 사용되는지 확인하는 검사를 추가해 크래시를 방지했습니다. #82205를 수정했습니다. #85030 (Dmitry Novik).
distributed_depth를*Cluster함수의 판별 기준으로 사용하는 것은 잘못된 방식이었으며, 데이터 중복을 초래할 수 있었습니다. 대신client_info.collaborate_with_initiator를 사용합니다. #85734 (Konstantin Bogdanov).Distributed대상 테이블을 사용하는 병렬 분산INSERT SELECT에서WITH구문의 전역 상수를 지원합니다. 이전에는 쿼리 실행 시Unknown expression identifier오류가 발생할 수 있었습니다. #85811 (Nikolai Kochetov).DatabaseReplicated에서CREATE ... AS (SELECT * FROM s3Cluster(...))를 시도할 때 발생하던 논리 오류를 수정했습니다. #85904 (Konstantin Bogdanov).- Distributed 테이블에서 ALTER를 수행할 때
sharding_key검사 로직을 추가했습니다. 이전에는 잘못된 ALTER로 인해 테이블 정의가 손상되고 서버를 다시 시작할 수 없게 될 수 있었습니다. #86015 (Nikolay Degterinsky).
메트릭 및 모니터링 수정
- 비동기 메트릭 설정
asynchronous_metrics_update_period_s및asynchronous_heavy_metrics_update_period_s의 유효성 검사 문제를 수정했습니다. #82310 (Bharat Nallan). IndexUncompressedCacheBytes/IndexUncompressedCacheCells/IndexMarkCacheBytes/IndexMarkCacheFiles메트릭을 수정했습니다(이전에는Cache접두사 없이 메트릭에 포함되었습니다). #83730 (Azat Khuzhin).- QueryMetricLog에서 발생하던
LOGICAL_ERROR(“Mutex cannot beNULL”) 문제를 수정했습니다. #82979 (Pablo Marcos). - 잘못된 KafkaAssignedPartitions 및 KafkaConsumersWithAssignment 메트릭을 수정했습니다. #85494 (Ilya Golshtein).
PREWHERE(명시적 또는 자동)를 사용할 때 처리된 바이트 통계가 과소평가되던 문제를 수정했습니다. #85495 (Michael Kolupaev).- background schedule pool 및 실행기에서 발생하던 메모리 추적 드리프트를 수정했습니다. #84946 (Azat Khuzhin).
데이터 타입 및 변환 수정
- Time 파싱 과정에서 msan 관련 문제가 발생할 수 있던 경우를 수정했습니다. 이 수정은 다음 문제를 해결합니다: #82477. #82514 (Yarik Briukhovetskyi).
LowCardinality(Float32|Float64|BFloat16)타입에서 NaN 값 정렬 문제를 수정했습니다. #83786 (Pervakov Grigorii).Date를DateTime64로 CAST할 때 큰 값(>2106-02-07)에서 발생하던 오버플로우를 수정했습니다. #83982 (Yarik Briukhovetskyi).- 음수 Time 값을 테이블에 암묵적으로 읽어들이는 과정의 문제를 수정하고, 문서가 혼동을 주지 않도록 개선했습니다. #83091 (Yarik Briukhovetskyi).
- 이제 코덱
DoubleDelta는 숫자 타입의 컬럼에만 적용할 수 있습니다. 특히FixedString컬럼은 더 이상DoubleDelta를 사용해 압축할 수 없습니다. (#80220 수정). #84383 (Jimmy Aguilar Mena). - JSON 숫자를 Decimal 타입으로 변환할 때
JSONExtract에서 발생하던 정밀도 손실을 수정했습니다. 이제 숫자형 JSON 값은 정확한 십진수 표현을 유지하므로 부동소수점 반올림 오류를 방지합니다. #85665 (ssive7b).
메모리 및 리소스 관리
max_untracked_memory와 관련된 잘못된 메모리 처리를 수정했습니다. #83607 (Azat Khuzhin).async_read_counters가 쿼리 간에 공유되지 않도록 수정했습니다. #83423 (Azat Khuzhin).- 임시 데이터 저장소로 사용할 때 File Cache가 초기화되지 않아 발생할 수 있는 오류를 수정했습니다. #83539 (Bharat Nallan).
filesystem_prefetches_limit가 항상 적용되도록 수정했습니다 (MergeTreePrefetchedReadPool에서만 적용되는 것이 아님). #83999 (Azat Khuzhin).
구성 및 설정 관련 수정
- URI를 통해 설정을 전달할 때 마지막 값이 적용되도록 수정했습니다. #82137 (Sema Checherinda).
- 클라이언트의 데이터 경쟁(data race) 문제를 수정하고(전역 Context를 사용하지 않도록 변경),
session_timezone재정의도 바로잡았습니다(이전에는session_timezone이 예를 들어users.xml/클라이언트 옵션에서는 비어 있지 않은 값으로 설정되고 쿼리 Context에서는 빈 값으로 설정된 경우, 잘못되게도users.xml의 값이 사용되었습니다. 이제는 쿼리 Context가 항상 전역 Context보다 우선합니다). #82444 (Azat Khuzhin). - 서버 작업이 멈추지 않도록
threadpool_writer_pool_size를 0으로 설정할 수 없게 했습니다. #82532 (Bharat Nallan). role_cache_expiration_time_seconds설정 구성에서 발생하던 경미한 정수 오버플로우를 해결했습니다(이슈 #83374). #83461 (wushap).- 논리 오류를 유발할 수 있으므로
max_insert_block_size를 0으로 설정할 수 없게 했습니다. #83688 (Bharat Nallan). block_size_bytes=0일 때estimateCompressionRatio()에서 발생하던 무한 루프를 수정했습니다. #83704 (Azat Khuzhin).date_time_input_format같은 매개변수가 multipart를 사용하는 HTTP에서 그대로 무시되던 문제를 수정했습니다. #85570 (Sema Checherinda).
MongoDB 수정 사항
- 이전에는
MongoDB테이블 엔진 정의의host:port인수에 경로 구성 요소를 포함할 수 있었지만, 이는 별다른 경고 없이 무시되었습니다. MongoDB 통합은 이러한 테이블의 로드를 거부합니다. 이번 수정으로MongoDB엔진에 인수가 5개인 경우에는 이러한 테이블의 로드를 허용하고 경로 구성 요소를 무시하며, 인수에 지정된 데이터베이스 이름을 사용합니다. 참고: 이 수정은 새로 생성된 테이블이나mongo테이블 함수를 사용하는 쿼리에는 적용되지 않으며, 딕셔너리 소스와 이름이 지정된 컬렉션에도 적용되지 않습니다. #81942 (Vladimir Cherkasov).
기타 수정 사항
- 이전 버전에서는 server가
/js요청에 대해 지나치게 많은 내용을 반환했습니다. 이로써 #61890이 해결되었습니다. #81895 (Alexey Milovidov). - 필요한 경우(예: 이름에
-와 같은 특수 문자가 포함된 경우) 데이터베이스 및 테이블 이름에 백쿼트를 다시 추가하도록InterpreterInsertQuery::extendQueryLogElemImpl을 수정했습니다. #81528 (Ilia Shvyrialkin). - 제안 스레드와 메인 클라이언트 스레드 사이에서 발생할 수 있는 데이터 레이스를 수정했습니다. #82233 (Azat Khuzhin).
- union/intersect/except_default_mode 재작성 시 예외 안전성 문제를 수정했습니다. #82664를 해결했습니다. #82820 (Alexey Milovidov).
- 캐싱을 사용하지 않는 데이터베이스 구현을 사용할 경우, 해당 테이블의 메타데이터는 컬럼이 반환된 후 삭제되고 참조는 무효화됩니다. #82939 (buyval01).
- JSONEachRowWithProgress의 Onprogress 호출이 마무리 처리와 동기화됩니다. #83879 (Sema Checherinda).
MATERIALIZE COLUMN쿼리 실행 시checksums.txt에 예기치 않은 파일이 생성되고, 결국 분리된 데이터 파트로 이어질 수 있던 드물게 발생하던 버그를 수정했습니다. #84007 (alesapin).- 주기적인 파트 갱신 시 예외를 적절히 처리합니다. #84083 (Azat Khuzhin).
- 불리언 리터럴의 컬럼 이름을 생성할 때 “1”/“0” 대신 “true”/“false”를 사용하도록 수정하여, 쿼리에서 불리언 리터럴과 정수 리터럴 간의 컬럼 이름 충돌을 방지합니다. #84945 (xiaohuanlin).
- Merge 테이블 엔진에서 정렬이 부정확해질 수 있는 문제를 수정했습니다. #85025 (Xiaozhe Yu).
- DiskEncrypted용 누락된 API를 구현했습니다. #85028 (Azat Khuzhin).
- 이름 충돌 시 새로운 분석기가
WITH절에서 외부 별칭을 참조할 수 있도록 하는 하위 호환성 설정을 도입했습니다. #82700을 수정했습니다. #83797 (Dmitry Novik). - 분석기가 활성화되면
remote테이블 함수의view(...)인수에서 임의의 테이블을 참조할 수 있습니다. #78717을 수정했습니다. #79377을 수정했습니다. #83844 (Dmitry Novik). plain_rewritable/plain메타데이터 타입에서 append를 사용하는 쓰기 동작(Experimental 트랜잭션에 사용되는 MergeTree)을 수정했습니다. 이전에는 이 동작이 단순히 무시되었습니다. #83695 (Tuan Pham Anh).IAccessStorage의 로거 사용을 수정했습니다. #84365 (Konstantin Bogdanov).- 데이터 레이크에서 가상 컬럼 기준의 파일 프루닝 문제를 수정했습니다. #84520 (Kseniia Sumarokova).
- 지연된 원격 소스를 쿼리할 때
vector out of bounds오류가 발생할 수 있던 문제를 수정했습니다. #84820 (George Larionov). - 객체 큐 엔진의 테이블 메타데이터에 모든 설정이 올바르게 저장되도록 했습니다. #84860 (Antonio Andelic).
- 외부 정렬 사용 시 지연 컬럼에서 발생하던
CORRUPTED_DATA오류를 수정했습니다. #84738 (János Benjamin Antal). SYSTEM DROP REPLICA쿼리 실행 중 불필요한getStatus()호출을 제거했습니다. 백그라운드에서 테이블이 삭제될 때Shutdown for storage is called예외가 발생하던 문제를 수정했습니다. #85220 (Nikolay Degterinsky).CREATE OR REPLACE및RENAME쿼리에 누락되어 있던 테이블 이름 길이 검사를 추가했습니다. #85326 (Michael Kolupaev).- JSON에서
ALTER UPDATE수행 중 발생하던 충돌과 데이터 손상 문제를 수정했습니다. #85383 (Pavel Kruglov). - 긴 문자열에서 발생하는 coalescing merge tree segfault를 수정했습니다. 이로써 #84582가 해결되었습니다. #85709 (scanhex12).
- 비동기 로깅 리팩터링 이후 send_logs_source_regexp를 수정했습니다(#85105). #85797 (Azat Khuzhin).
- update_field를 사용하는 딕셔너리에서
MEMORY_LIMIT_EXCEEDED오류 발생 시 생길 수 있는 불일치를 수정했습니다. #85807 (Azat Khuzhin). - 비표준 포트에 액세스할 때
url()테이블 함수가 보내는 HTTP 요청의 Host 헤더에 포트 번호가 올바르게 포함되도록 수정했습니다. 이로써 개발 환경에서 흔히 사용되는, 사용자 지정 포트에서 실행되는 MinIO와 같은 S3 호환 서비스의 사전 서명된 URL 사용 시 발생하던 인증 실패가 해결됩니다. (수정: #85898). #85921 (Tom Quist).