본문으로 바로가기
본문으로 바로가기

Cloud용 V24.6 변경 내역

v24.6 릴리스를 기반으로 한 ClickHouse Cloud 서비스 관련 변경 사항입니다.

이전 버전과 호환되지 않는 변경 사항

  • 스토리지 S3QueueOrdered 모드에서 병렬 처리 방식을 재설계했습니다. 이 PR은 s3queue_processing_threads_num 또는 s3queue_total_shards_num 설정을 사용한 경우 Ordered 모드에 대해 이전 버전과 호환되지 않습니다. 설정 s3queue_total_shards_num는 삭제되었습니다. 이 설정은 이전에는 s3queue_allow_experimental_sharded_mode가 활성화된 경우에만 사용할 수 있었으며, s3queue_allow_experimental_sharded_mode는 이제 사용 중단(deprecated)되었습니다. 새로운 설정인 s3queue_buckets가 추가되었습니다. #64349 (Kseniia Sumarokova).
  • 새로운 함수 snowflakeIDToDateTime, snowflakeIDToDateTime64, dateTimeToSnowflakeID, dateTime64ToSnowflakeID가 추가되었습니다. 기존 함수 snowflakeToDateTime, snowflakeToDateTime64, dateTimeToSnowflake, dateTime64ToSnowflake와 달리, 새로운 함수는 generateSnowflakeID FUNCTION과 호환됩니다. 즉, generateSnowflakeID가 생성한 스노우플레이크 ID를 입력으로 받고, generateSnowflakeID와 동일한 타입(즉, UInt64)의 스노우플레이크 ID를 생성합니다. 또한 새로운 함수는 generateSnowflakeID와 마찬가지로 기본적으로 UNIX epoch(1970-01-01)을 사용합니다. 필요하다면, 예를 들어 Twitter/X의 epoch인 2010-11-04(UNIX epoch 이후 1288834974657밀리초)와 같이 다른 epoch를 전달할 수 있습니다. 기존 변환 함수는 사용 중단(deprecated)되었으며 전환 기간 이후 제거될 예정입니다. 전환 기간 동안에도 기존 함수를 사용하려면 설정 allow_deprecated_snowflake_conversion_functions를 활성화하십시오. #64948 (Robert Schulze).

New feature

  • 빈 튜플을 지원합니다. #55061 (Amos Bird).
  • Hilbert 곡선 인코딩 및 디코딩 함수가 추가되었습니다. #60156 (Artem Mustafin).
  • hilbertEncode에 대한 인덱스 분석을 지원합니다. #64662 (Artem Mustafin).
  • 함수 readWKTLineString을 사용해 WKT 포맷의 LINESTRING 지오메트리를 읽는 기능이 추가되었습니다. #62519 (Nikita Mikhaylov).
  • Twitter 스타일 Snowflake ID를 생성하는 새로운 SQL 함수 generateSnowflakeID가 추가되었습니다. #63577 (Danila Puzov).
  • = 연산자를 사용하여 IPv4IPv6 타입을 비교하는 기능을 추가했습니다. #64292 (Francisco J. Jurado Moreno).
  • 이항 수학 함수(pow, atan2, max2, min2, hypot)에서 10진수 인자를 지원합니다. #64582 (Mikhail Gorshkov).
  • SQL 함수 parseReadableSize(및 OrNull, OrZero 변형 함수)가 추가되었습니다. #64742 (Francisco J. Jurado Moreno).
  • 파일 기반 스토리지(s3/file/hdfs/url/azureBlobStorage)에 _time 가상 컬럼을 추가했습니다. #64947 (Ilya Golshtein).
  • 새로운 함수 base64URLEncode, base64URLDecode, tryBase64URLDecode가 도입되었습니다. #64991 (Mikhail Gorshkov).
  • 두 UTF-8 문자열 간의 편집 거리를 계산하는 새로운 함수 editDistanceUTF8를 추가했습니다. #65269 (LiuNeng).
  • 사용자 정의 HTTP 핸들러에서 사용자 정의 응답 헤더를 지원하기 위해 http_response_headers 설정을 추가했습니다. #63562 (Grigorii).
  • 쿼리 결과를 무한 루프로 반환할 수 있도록 새로운 테이블 함수 loop가 추가되었습니다. #63452 (Sariel). 이는 테스트에 유용합니다.
  • system.query_logused_privilegesmissing_privileges라는 두 개의 컬럼을 추가했습니다. used_privileges는 쿼리 실행 중에 확인된 권한으로 채워지며, missing_privileges는 누락된 필수 권한을 포함합니다. #64597 (Alexey Katsman).
  • 설정 output_format_pretty_display_footer_column_names가 추가되었으며, 이를 활성화하면 행 수가 많은 테이블(기본값 50행)의 끝에 컬럼 이름을 표시합니다. 최소 행 수에 대한 임계값은 output_format_pretty_display_footer_column_names_min_rows로 제어됩니다. #65144 (Shaun Struwig).

성능 향상

  • #60459 (24.5)에서 발생한 CROSS JOIN의 성능 저하 문제를 수정합니다. #65243 (Nikita Taranov).
  • io_uring 재제출 작업의 가시성을 개선합니다. 프로파일 이벤트 IOUringSQEsResubmits를 IOUringSQEsResubmitsAsync로 이름을 변경하고, 새 이벤트 IOUringSQEsResubmitsSync를 추가합니다. #63699 (Tomer Shafir).
  • 모든 함수가 올바른 크기의 컬럼로 호출되었는지 검증하는 assertion을 도입했습니다. #63723 (Raúl Marín).
  • PRIMARY KEY가 설정한 순서를 위반하지 않으면서도 데이터 크기 최적화를 위해 INSERT 시 행을 재배열할 수 있는 기능이 추가되었습니다. 이 기능은 설정값 optimize_row_order로 제어되며(기본값은 off), #63578에서 도입되었습니다(Igor Markelov).
  • 네이티브 Parquet 리더를 추가하여 Parquet 바이너리를 ClickHouse 컬럼으로 직접 읽을 수 있도록 했습니다. 이 기능은 input_format_parquet_use_native_reader 설정(기본값은 비활성화)으로 제어됩니다. #60361 (ZhiHong Zhang).
  • 쿼리의 필터가 MergeTree 테이블에서 정확한 범위를 선택할 수 있을 때 부분적인 단순 COUNT 최적화를 지원합니다. #60463 (Amos Bird).
  • 멀티스레드 INSERT의 최대 메모리 사용량을 줄이기 위해 여러 스레드의 청크를 하나의 transform에서 수집하도록 했습니다. #61047 (Yarik Briukhovetsky).
  • Azure 객체 스토리지 사용 시 고정 메모리 할당을 사용하여 추가 버퍼 할당을 피함으로써 메모리 사용량을 줄입니다. #63160 (SmitaRKulkarni).
  • ColumnNullable::size에서 가상 함수 호출 횟수를 줄였습니다. #60556 (HappenLee).
  • 정규식 인자가 한 글자인 경우 splitByRegexp의 성능을 향상했습니다. #62696 (Robert Schulze).
  • 사용된 최소 및 최대 키 값을 추적하여 8비트 및 16비트 키에 대한 집계를 가속화합니다. 이를 통해 검증해야 하는 셀의 개수를 줄일 수 있습니다. #62746 (Jiebin Sun).
  • IN 연산자에서 왼쪽 피연산자가 LowCardinality이고 오른쪽이 상수 집합(Set)인 경우를 최적화했습니다. #64060 (Zhiguo Zhou).
  • ConcurrentHashJoin 내부의 해시 테이블 초기화 및 삭제에 스레드 풀을 사용하도록 했습니다. #64241 (Nikita Taranov).
  • 희소 컬럼을 사용하는 테이블에서 수직 병합을 최적화했습니다. #64311 (Anton Popov).
  • 수직 병합 시 원격 파일 시스템에서 데이터를 미리 가져오도록(prefetch) 기능을 활성화했습니다. 이를 통해 데이터가 원격 파일 시스템에 저장된 테이블에서 수직 병합의 지연 시간이 감소합니다. #64314 (Anton Popov).
  • ColumnSparse::filter에서 isDefault의 중복 호출을 줄여 성능을 개선합니다. #64426 (Jiebin Sun).
  • 여러 개의 비동기 getChildren 요청을 보내 find_super_nodesfind_big_family keeper-client 명령의 실행 속도를 높였습니다. #64628 (Alexander Gololobov).
  • 널 허용 숫자형 타입 인자를 사용하는 least/greatest 함수를 개선했습니다. #64668 (KevinyhZou).
  • 쿼리 플랜에서 연속된 두 개의 필터링 단계를 하나로 병합할 수 있도록 했습니다. 이는 상위 단계의 필터 조건을 하위 단계로 내려보낼 수 있는 경우 filter-push-down 최적화를 향상시킵니다. #64760 (Nikolai Kochetov).
  • vertical final 구현에서 잘못된 최적화를 제거하고, vertical final 알고리즘을 기본값으로 다시 활성화합니다. #64783 (Duc Canh Le).
  • 필터 표현식에서 ALIAS 노드를 제거합니다. 이는 새 분석기를 사용할 때 PREWHERE가 포함된 쿼리의 성능을 소폭 향상시킵니다. #64793 (Nikolai Kochetov).
  • OpenSSL 세션 캐시를 다시 활성화합니다. #65111 (Robert Schulze).
  • 삽입 시 skip 인덱스와 통계를 구체화하지 않도록 하는 설정(materialize_skip_indexes_on_insertmaterialize_statistics_on_insert)이 추가되었습니다. #64391 (Anton Popov).
  • 할당된 메모리 크기를 사용하여 row group 크기를 계산하고, 단일 스레드 모드에서 Parquet writer의 최대 메모리 사용량을 줄입니다. #64424 (LiuNeng).
  • 희소 컬럼 이터레이터를 개선하여 size 호출 횟수를 줄였습니다. #64497 (Jiebin Sun).
  • Azure Blob Storage로 백업할 때 서버 측 복사를 사용하도록 조건을 수정합니다. #64518 (SmitaRKulkarni).
  • 스킵 인덱스가 많은 테이블에서 수직 병합 시 메모리 사용을 최적화했습니다. #64580 (Anton Popov).

개선 사항

  • CSV 형식에서 ClickHouse가 튜플(Tuple)을 처리하고 해석하는 동작을 이전 방식으로 되돌렸습니다. 이 변경 사항은 사실상 ClickHouse/ClickHouse#60994를 되돌리는 것이며, 다음과 같은 몇 가지 설정에서만 활성화됩니다: output_format_csv_serialize_tuple_into_separate_columns, input_format_csv_deserialize_separate_columns_into_tuple 및 input_format_csv_try_infer_strings_from_quoted_tuples. #65170 (Nikita Mikhaylov).
  • 시스템 테이블에 대해 실행하는 SHOW CREATE TABLE 명령은 이제 각 테이블이 왜 필요한지 설명하는, 테이블마다 고유하고 매우 유용한 주석을 표시합니다. #63788 (Nikita Mikhaylov).
  • 이제 함수 round(), roundBankers(), floor(), ceil()trunc()의 두 번째 인수인 scale이 상수가 아닌(non-const) 값일 수 있습니다. #64798 (Mikhail Gorshkov).
  • 서비스가 포화 상태인 환경에서 스레드를 스케줄링할 때 MergeTree 인덱스 분석 과정에서 발생할 수 있는 데드락을 방지합니다. #59427 (Sean Haynes).
  • S3 프록시 지원 및 터널링에서 발생하는 몇 가지 경미한 코너 케이스가 수정되었습니다. #63427 (Arthur Passos).
  • plain_rewritable 메타데이터 스토리지가 생성 및 삭제한 디렉터리 개수와 로컬-원격 인메모리 맵에 있는 엔트리 개수를 추적하기 위한 메트릭을 추가합니다. #64175 (Julia Kartseva).
  • 이제 쿼리 캐시는 설정이 서로 다른 동일한 쿼리를 각각 별개의 것으로 간주합니다. 이는 limit 또는 additional_table_filters와 같은 설정 차이가 쿼리 결과에 영향을 미치는 경우에도 동작의 견고성을 높여 줍니다. #64205 (Robert Schulze).
  • 객체 스토리지에서 비표준 오류 코드 QpsLimitExceeded를 재시도 가능한 오류로 지원합니다. #64225 (Sema Checherinda).
  • 평균 출력 블록 크기(바이트 단위)를 제어하기 위한 새로운 설정 input_format_parquet_prefer_block_bytes를 추가하고, input_format_parquet_max_block_size의 기본값을 65409로 변경했습니다. #64427 (LiuNeng).
  • 사용자 config의 Settings 값은 객체 스토리지를 기반으로 하는 MergeTree 테이블의 머지(merge)와 뮤테이션(mutation)에 영향을 주지 않습니다. #64456 (alesapin).
  • 객체 스토리지에서 비표준 오류 코드 TotalQpsLimitExceeded를 재시도 가능한 오류로 지원합니다. #64520 (Sema Checherinda).
  • 오픈 소스 및 ClickHouse Cloud 버전 모두의 고급 대시보드에 'Maximum concurrent network connections' 차트를 추가했습니다. #64610 (Thom O'Connor).
  • zeros_mtgenerateRandom의 진행 상황 보고를 개선했습니다. #64804 (Raúl Marín).
  • 비동기 메트릭 jemalloc.profile.active를 추가하여 현재 샘플링이 활성 상태인지 여부를 표시합니다. 이는 prof.active와 함께 사용하는 추가적인 활성화 메커니즘으로, 호출 스레드가 샘플링을 수행하려면 둘 다 활성 상태여야 합니다. #64842 (Unalian).
  • allow_experimental_join_condition의 중요(important) 표시를 제거합니다. 이 표시는 혼합 버전 클러스터에서 분산 쿼리가 성공적으로 실행되지 못하게 했을 수 있습니다. #65008 (Nikita Mikhaylov).
  • 서버 비동기 메트릭 DiskGetObjectThrottler*DiskGetObjectThrottler*를 추가하여 디스크 설정 s3_max_get_rpss3_max_put_rps로 정의된 초당 요청 수(rate limit)와, 디스크의 스로틀링 한도에 도달하지 않고 전송할 수 있는 현재 가능한 요청 수를 반영합니다. 이 메트릭은 제한이 설정된 각 디스크에 대해 정의됩니다. #65050 (Sergei Trifonov).
  • bcrypt_hash를 사용해 USER를 생성할 때 검증을 추가했습니다. #65242 (Raúl Marín).
  • PREWHERE 실행 중 및 실행 후에 읽힌 행 수를 위한 프로파일 이벤트를 추가합니다. #64198 (Nikita Taranov).
  • 병렬 레플리카 사용 시 EXPLAIN PLAN에 쿼리를 출력하도록 했습니다. #64298 (vdimir).
  • allow_deprecated_functions의 이름을 allow_deprecated_error_prone_window_functions로 변경합니다. #64358 (Raúl Marín).
  • file 테이블 함수에서 파일 디스크립터에 대해서도 max_read_buffer_size 설정을 준수하도록 했습니다. #64532 (Azat Khuzhin).
  • 지원되지 않는 스토리지에서는 materialized view에서도 트랜잭션을 비활성화합니다. #64918 (alesapin).
  • 이전 분석기에서 QUALIFY 절 사용을 금지했습니다. 이전 분석기는 QUALIFY를 무시했으므로 뮤테이션에서 예상치 못한 데이터 삭제가 발생할 수 있었습니다. #65356 (Dmitry Novik).

버그 수정 (공식 안정 릴리스에서 사용자가 인지할 수 있는 오동작)

  • IN 및 indexHint()와 함께 사용할 때 'set' skip 인덱스가 작동하지 않던 문제를 수정했습니다. #62083 (Michael Kolupaev).
  • 테이블이 adaptive granularity를 사용하지 않을 때 FINAL을 사용하는 쿼리에서 잘못된 결과가 반환되던 문제를 수정했습니다. #62432 (Duc Canh Le).
  • 매개변수화된 VIEW 값 할당 시 FUNCTION 실행을 지원합니다. #63502 (SmitaRKulkarni).
  • Parquet 메모리 사용량 추적을 수정했습니다. #63584 (Michael Kolupaev).
  • 분산 쿼리 결과에서 데이터가 누락될 수 있었던 드문 문제를 수정했습니다. #63691 (vdimir).
  • Tuple(Map(LowCardinality(String), String), ...) 타입 컬럼의 읽기 처리를 수정했습니다. #63956 (Anton Popov).
  • 한정되지 않은 COLUMNS matcher의 처리 방식을 수정합니다. 입력 컬럼의 순서를 유지하고 알 수 없는 식별자의 사용을 금지합니다. #63962 (Dmitry Novik).
  • 서로 다른 유형(식과 함수)의 순환 별칭에서 발생하던 Cyclic aliases 오류를 수정했습니다. #63993 (Nikolai Kochetov).
  • 이 수정사항은 쿼리 파이프라인에서 각 개별 뷰마다 올바른 definer가 설정된 적절히 재정의된 컨텍스트를 사용합니다. #64079 (pufit).
  • Analyzer 수정: INTERPOLATE 사용 시 발생하던 "Not found column" 오류를 수정했습니다. #64096 (Yakov Olkhovskiy).
  • CREATE TABLE을 MaterializedView로 실행할 때 LOGICAL_ERROR가 발생하지 않도록 수정했습니다. #64174 (Raúl Marín).
  • 이제 쿼리 캐시는 서로 다른 데이터베이스에서 실행된 동일한 두 개의 쿼리를 서로 다른 것으로 간주합니다. 이전 동작은 테이블에서 읽기 권한이 없을 때 이를 우회하는 데 악용될 수 있었습니다. #64199 (Robert Schulze).
  • StatusFile의 ~WriteBufferFromFileDescriptor에서 처리되지 않은 예외 발생 시 중단될 수 있던 문제를 수정합니다. #64206 (Kruglov Pavel).
  • ARRAY JOIN이 포함된 분산 쿼리에서 발생하던 중복 별칭 오류를 수정합니다. #64226 (Nikolai Kochetov).
  • 문자열에서 정수로의 예기치 않은 accurateCast 동작을 수정합니다. #64255 (wudidapaopao).
  • 어떤 OR 그룹에 상호 배타적인 원자식이 포함된 경우의 CNF 단순화를 수정했습니다. #64256 (Eduard Karacharov).
  • 쿼리 트리 크기 검증을 수정했습니다. #64377 (Dmitry Novik).
  • 논리적 오류 수정: PREWHERE가 있는 Buffer 테이블에서 잘못된 캐스트가 발생하는 문제를 해결했습니다. #64388 (Nikolai Kochetov).
  • 기본 표현식이 있는 테이블에서도 CREATE TABLE AS 쿼리가 올바르게 동작하도록 수정했습니다. #64455 (Anton Popov).
  • 널 허용 키가 있는 테이블에서 ORDER BY ... NULLS FIRST / LAST를 사용할 때 optimize_read_in_order 설정의 동작을 수정했습니다. #64483 (Eduard Karacharov).
  • 별칭(alias)을 사용하는 GLOBAL IN.. 쿼리에서 Expression 노드 목록이 PROJECTION 이름 1개만을 기대하던 문제와 「Unknown expression or identifier」 오류를 수정했습니다. #64517 (Nikolai Kochetov).
  • GROUP BY 키에 상수 CTE가 있을 때 분산 쿼리에서 발생하는 "Cannot find column" 오류를 수정합니다. #64519 (Nikolai Kochetov).
  • 서식 지정자가 생성하는 문자 수가 홀수이고 마지막 문자가 0인 경우 함수 formatDateTimeInJodaSyntax의 출력이 올바르지 않던 문제를 수정했습니다. 예를 들어 이제는 SELECT formatDateTimeInJodaSyntax(toDate('2012-05-29'), 'D')이(가) 예전에는 15를 반환했지만, 이제는 올바르게 150을 반환합니다. #64614 (LiuNeng).
  • -If 콤비네이터가 이미 사용된 경우 집계를 재작성하지 않습니다. #64638 (Dmitry Novik).
  • 작은 버퍼(예: --max_read_buffer_size 1인 경우)에서 float에 대한 타입 추론을 수정합니다. #64641 (Azat Khuzhin).
  • 식 기반 TTL이 동작하지 않을 수 있는 버그를 수정했습니다. #64694 (alesapin).
  • 새 애널라이저에서 항상 참인 WHERE 및 PREWHERE 표현식을 제거하도록 수정했습니다. #64695 (Nikolai Kochetov).
  • startsWith, endsWith, match, multiSearchAny 결과로 필터링할 때 토큰 기반 텍스트 인덱스(ngrambf, full_text)에 의해 데이터 파트가 과도하게 제거되던 문제를 수정했습니다. #64720 (Eduard Karacharov).
  • UTF8::computeWidth FUNCTION에서 ANSI CSI 이스케이프 처리가 잘못 동작하던 문제를 수정합니다. #64756 (Shaun Struwig).
  • 서브쿼리 전반에 걸쳐 ORDER BY / LIMIT BY 절이 잘못 제거되던 문제를 수정합니다. #64766 (Raúl Marín).
  • 혼합 조인 조건에 포함된 Set에 대한 서브쿼리를 사용하는 비등가 조인을 (실험적으로) 수정했습니다. #64775 (lgbo).
  • plain_rewritable 디스크의 로컬 캐시에서 발생하던 비정상 종료 문제를 수정했습니다. #64778 (Julia Kartseva).
  • 분산 쿼리에서 Nested 컬럼에 대한 ARRAY JOIN 사용 시 컬럼을 찾을 수 없는 문제를 수정합니다. #64755를 수정합니다. #64801 (Nikolai Kochetov).
  • SLRU 캐시 정책의 메모리 누수를 수정합니다. #64803 (Kseniia Sumarokova).
  • S3에서 데이터를 읽는 쿼리, HTTP 프로토콜을 통한 쿼리, 비동기 insert 등 여러 종류의 쿼리에서 메모리 추적이 잘못될 수 있던 문제를 수정했습니다. #64844 (Anton Popov).
  • 소스 테이블과 다른 타입의 컬럼을 가진 materialized view에서 PREWHERE로 읽는 쿼리 실행 시 발생하던 Block 구조 불일치 오류를 수정했습니다. Fixes #64611. #64855 (Nikolai Kochetov).
  • 테이블에서 서브쿼리가 포함된 TTL을 사용하고, 데이터베이스가 복제되어 있으며, 병렬 레플리카와 analyzer가 함께 사용될 때 드물게 크래시가 발생하던 문제를 수정했습니다. 매우 드문 경우이지만, 서브쿼리가 포함된 TTL은 사용하지 않는 것이 좋습니다. #64858 (alesapin).
  • ClickHouse/ClickHouse#54211에서 매개변수화된 VIEW에 대해 올바르게 동작하지 않던 ALTER MODIFY COMMENT 쿼리를 수정했습니다. #65031 (Nikolay Degterinsky).
  • cluster_secure_connection 파라미터가 활성화된 경우 DatabaseReplicated에서 host_id를 수정했습니다. 이전에는 이 파라미터가 활성화되어 있어도 DatabaseReplicated가 클러스터 내에서 생성하는 모든 연결이 보안 연결이 아니었습니다. #65054 (Nikolay Degterinsky).
  • StorageMerge에 대한 PREWHERE 최적화 적용 후 발생하던 「Not-ready Set」 오류를 수정합니다. #65057 (Nikolai Kochetov).
  • File-like 스토리지에서 finalized 버퍼에 쓰지 않도록 수정했습니다. #65063 (Kruglov Pavel).
  • 순환 별칭으로 인해 쿼리 실행 시간이 무한히 길어질 수 있는 문제를 수정합니다. #64849를 수정합니다. #65081 (Nikolai Kochetov).
  • 새로운 analyzer에서 INTERPOLATE (alias)를 사용하는 원격 쿼리 실행 시 발생하는 「Unknown expression identifier」 오류를 수정합니다. #64636 이슈를 해결합니다. #65090 (Nikolai Kochetov).
  • 집계 밖으로 산술 연산을 푸시하는 최적화를 수정합니다. 새로운 analyzer에서는 해당 최적화가 한 번만 적용되었습니다. #65104 (Dmitry Novik).
  • 새 분석기에서 집계 FUNCTION 이름 재작성 문제를 수정했습니다. #65110 (Dmitry Novik).
  • 클라이언트 소켓에서 요청 본문(의 일부)을 읽는 동안 수신 타임아웃이 발생하는 경우 200 OK 대신 5xx를 반환하도록 변경했습니다. #65118 (Julian Maicher).
  • hedged 요청에서 발생할 수 있는 잠재적인 크래시를 수정했습니다. #65206 (Azat Khuzhin).
  • Hashed 및 Hashed_Array 딕셔너리의 단락 평가에서 초기화되지 않은 숫자를 읽어 다양한 오류가 발생할 수 있는 문제를 수정합니다. #65256 (jsc0218).
  • 이 PR은 상수(IN 연산자의 두 번째 매개변수)의 타입이 IN 연산자의 타입 변환 과정에서 항상 보이도록 보장합니다. 그렇지 않으면 타입 정보가 손실되어 DateTime에서 Date로의 변환과 같은 일부 변환이 실패할 수 있습니다. fix (#64487). #65315 (pn).