MySQL Innovation Release Note

9.0.0 변경 사항 (2024-07-01 Innovation Release)

Estimated reading: 8 minutes 40 views

공식 문서: Changes in MySQL 9.0.0 (2024-07-01, Innovation Release)

감사 로그 관련 사항

감사 로그 플러그인은 처리 중인 감사 로그 파일이 없을 때도 Plugin audit_log reported: 'Cannot process audit log file. File name timestamp value is missing or invalid: 'dbname'' 경고를 출력했습니다. (버그 #36400810)

큰 파일(200MB 이상)에서 audit_log_read()를 실행할 때, 함수 호출 시 지정된 북마크와 일치하는 북마크를 찾는 데 과도한 시간이 소요되었습니다. (버그 #36281295)

감사 로그 파일을 제거하거나 이름을 변경한 후 감사 로그 가지치기가 제대로 작동하지 않았습니다. 이제는 가지치기가 이러한 경우에도 계속되며, 누락된 감사 로그 파일을 삭제할 수 없다는 경고가 오류 로그에 출력됩니다. (버그 #35902913)

audit_null 예제 플러그인이 개선되었습니다. (버그 #35820314)

MySQL이 이제 플러그인의 유형에 관계없이 유효한 플러그인 구조체를 인수로 하여 plugin->deinit()을 호출합니다.
이 수정에 기여한 Martin Alderete에게 감사드립니다.

인증 관련 사항

인증 코드가 개선되었습니다. (버그 #35325870)

authentication_ldap_sasl 플러그인을 프록시 없이 사용할 때 발생하는 Access denied 오류의 원인을 명확히 제공하기 위해 로그 메시지가 개선되었습니다. (버그 #35317691)

OpenLDAP 서버에 GSSAPI 메서드를 사용하여 접근할 때, MySQL LDAP SASL 인증이 MySQL 서버 오류 ‘Plugin authentication_ldap_sasl reported: LDAP authentication failed or group retrieval failed: LDAP error: Invalid DN syntax’ 메시지와 함께 거부되었습니다. 이는 OpenLDAP이 사용된 루트 DN을 인식하지 못했기 때문입니다. (버그 #32631511)

C API 관련 사항

서버 측 준비된 문서의 결과를 수신하는 동안 C API 애플리케이션이 멈추는 문제가 발생했습니다.

캐릭터셋 지원

REPLACE() 함수 호출을 해결할 때, 함수 결과의 캐릭터셋과 콜레이션은 첫 번째 인수에서 복사됩니다. 리터럴 값인 나머지 두 개의 인수도 이 캐릭터셋으로 변환되어야 하지만, 두 번째 인수만 변환되었습니다.
이번 수정에서는 세 번째 인수도 첫 번째 인수의 캐릭터셋과 콜레이션으로 변환되도록 보장합니다. (버그 #114769, 버그 #36562972)

내부 함수 my_instr_mb()는 여러 곳에서 입력 문자열의 바이트 길이를 사용하여 특정 결정을 단축할 수 있다는 잘못된 가정을 했습니다. 멀티바이트 캐릭터셋과 콜레이션의 경우, 일부 콜레이션 규칙에 따라 바이트 길이가 다른 문자도 동등하게 간주될 수 있기 때문에 이것은 불가능합니다. 또한, Item_func_locate()는 잘못된 바이트 길이를 사용했습니다.
이 수정에 기여한 Dirkjan Bussink에게 감사드립니다. (버그 #113933, 버그 #36277823)

내부 함수 Item_func::eq()CONVERT(a USING latin1)CONVERT(a USING utf8mb4) 두 표현식을 동일한 것으로 잘못 처리했습니다.

컴파일 관련 사항

macOS: MacOS에서 CMake가 이제 기본 ctags를 사용하지 않고, MySQL을 빌드할 때 Homebrew 버전의 ctags가 설치되어 있어야 합니다. (버그 #36590594)

macOS: MacOS에서 MySQL 빌드 시 gRPC 사용이 활성화되었습니다. (버그 #36537726)

macOS: Xcode 버전의 zlib-DWITH_SYSTEM_LIBS=ON으로 구성 시 사용할 기본 시스템 라이브러리 목록에서 제거되었습니다. (버그 #36537593)

Microsoft Windows: Windows에서 BUILD_ALL 타겟이 컴파일 시 작동하지 않았습니다. (버그 #36424619)

Microsoft Windows: Ninja를 사용하여 Windows에서 MySQL을 컴파일할 때 과도한 RAM 사용으로 인해 디스크 스왑이 발생했습니다. (버그 #36399256)

Ubuntu 24.04에서 번들로 제공된 protobuf/grpclibrpdserver_shared.so용 인터페이스 라이브러리가 누락되었습니다. (버그 #36678790)

.deb 패키지의 디버그 버전 서버를 빌드할 때 이제 유지보수 모드가 비활성화됩니다. (버그 #36619757)

번들로 포함된 googletestgooglemock 소스가 버전 1.14.0으로 업그레이드되었습니다. (버그 #36562482)

GenError에 대한 누락된 종속성이 추가되었습니다. (버그 #36551721)

Fedora 38에서 컴파일할 때 egrep 대신 grep -E가 사용됩니다. (버그 #36507549)

MySQL 컴파일에 사용된 Boost 버전이 1.84.0에서 1.85.0으로 업그레이드되었습니다. 자세한 내용은 Boost 1.85.0 릴리스 노트를 참조하십시오. (버그 #36495694)

Enterprise Linux 8 및 9용 바이너리는 이제 GCC 13을 사용하여 빌드됩니다. (버그 #36331855)

RapidJSON을 사용하는 코드를 컴파일할 때 발생하는 링커 경고가 제거되었습니다. (버그 #36322583)

Linux 시스템에서는 소스에 제공된 번들 tcmalloc 라이브러리를 사용하여 MySQL을 빌드할 수 있습니다. 이는 -DWITH_TCMALLOC=BUNDLED 옵션을 사용하여 가능합니다. 이 기능은 Linux에서만 지원됩니다. (버그 #36313839)

번들 tcmalloc()은 이제 Enterprise Linux 8에서 MySQL을 빌드할 때 사용됩니다. (버그 #114844, 버그 #35674008)

Ubuntu 23.04에서 빌드할 때 sql/statement/ed_connection.cc에서 발생한 경고가 제거되었습니다. (버그 #114436, 버그 #36428465)

Linux aarch64 플랫폼 바이너리는 이제 4k 또는 64k 페이지 크기를 사용하는 시스템과의 호환성을 위해 patchelf --page-size=65536을 사용하여 빌드됩니다. (버그 #114233, 버그 #36393794)

컴포넌트 관련 사항

UNIX 플랫폼에서 --basedir 옵션이 잘못 지정되고, --plugin-dir 옵션이 지정되지 않은 상태에서 서버를 시작할 때 매니페스트와 구성 파일이 있는 경우, 키링 컴포넌트가 로드되었지만 언로드되지 않았습니다.
이제 매니페스트에서 키링 컴포넌트를 로드할 때, --basedir이 지정되고 --plugin-dir이 지정되지 않은 경우 기본 디렉토리에서 플러그인 디렉토리를 유도합니다. 두 옵션이 모두 지정되지 않은 경우 MySQL 설치 디렉토리에서 플러그인 디렉토리를 유도합니다. 동일한 처리가 이제 --datadir에도 적용됩니다. (버그 #36398484)

--loose 접두사를 사용하여 설정된 컴포넌트 옵션의 값이 컴포넌트가 설치될 때 읽히지 않았습니다. (버그 #28341329)

구성 관련 사항

Microsoft Windows: Windows에서 MySQL Configurator업그레이드 경로에 따라 인플레이스 업그레이드를 지원하도록 업데이트되었습니다. (버그 #36685422)

Microsoft Windows: Windows에서 MySQL Configurator 마법사의 페이지에서 [X] 닫기 버튼을 클릭하면 마법사가 작업을 실행 중일 때 확인 팝업이 나타납니다. (버그 #36671317)

Microsoft Windows: Windows에서 MySQL Configurator가 생성한 MySQL 서버 구성 파일에 더 이상 사용자 정의 server_type 변수를 정의하지 않습니다. 이 정보는 이제 configurator_settings.xml 파일에 저장됩니다. (버그 #36670309)

Microsoft Windows: Windows에서 MySQL ConfiguratorRemoving Windows Firewall 단계가 my.ini 파일에 mysqlx_port 정의가 없을 경우 실패했습니다. (버그 #36666260)

Microsoft Windows: Windows에서 MySQL ConfiguratorMySQL Server Installations 페이지에서 유효한 my.ini 또는 my.cnf 파일을 찾지 못했을 때, Browse 버튼을 클릭해 유효한 파일을 선택해도 Next 버튼이 비활성화되었습니다. (버그 #36395569)

Microsoft Windows: Windows에서 MySQL Configurator가 관련된 MySQL 서버가 이전에 구성된 경우에만 제거 단계를 표시하도록 변경되었습니다. (버그 #36395417)

Microsoft Windows: Windows에서 MySQL Configurator가 기존 루트 사용자가 mysql_native_password 인증 플러그인(9.0.0에서 제거됨)을 사용 중인지 감지하고, MySQL 서버 업그레이드를 수행하기 전에 루트를 caching_sha2_password 인증 플러그인으로 변환하도록 프롬프트를 표시합니다. (WL #16139)

Microsoft Windows: Windows의 MSI 설치에서 MySQL Configurator가 이제 사용자 개입 없이 MySQL 8.4 LTS 설치를 자동으로 업그레이드합니다. (WL #16274)

연결 관리 관련 사항

connection_control 플러그인에 의해 지연이 발생한 후, conn_delay/Waiting in connection_control plugin 단계가 재설정되지 않아 잘못된 모니터링 정보가 표시되었습니다. (버그 #35205358)

데이터 딕셔너리 관련 사항

MySQL 5.7에서 8.0 이상으로 업그레이드할 때 일반 열과 생성된 열이 혼합된 MyISAM 테이블을 업그레이드하려고 시도하면 테이블이 손상되었습니다. (버그 #105301, 버그 #33503328)

데이터 타입 관련 사항

문자열이 숫자 값으로 변환될 때, 숫자 값 뒤에 오는 비숫자 데이터는 엄격 모드에서는 오류를 발생시키고 다른 SQL 모드에서는 경고를 발생시켜야 하지만, 문자열의 길이와 캐릭터셋에 따라 유효하지 않은 문자열이 예상된 오류나 경고를 발생시키지 않는 경우가 있었습니다. (버그 #36457756)

일부 경우에는 double 값을 정수로 캐스팅할 때 반올림이 사용되고, 다른 경우에는 절단(truncation)이 사용되어 일관성 없는 결과가 발생했습니다. 이제 모든 경우에 반올림이 사용됩니다. (버그 #114549, 버그 #36481397)

일부 경우에 DECIMAL 0이 0과 -1 사이의 FLOAT 값보다 작은 값으로 처리되었습니다. (버그 #114196, 버그 #36361165)

사용 중단 및 제거 관련 사항

복제: MySQL 9.0.0에서는 트랜잭션 테이블과 비트랜잭션 테이블 또는 비구성 가능한 테이블을 업데이트하는 트랜잭션이 사용 중단됩니다. 이제 이러한 트랜잭션은 클라이언트와 오류 로그 모두에 사용 중단 경고를 기록합니다. InnoDBBLACKHOLE 스토리지 엔진만 트랜잭션 가능하고 구성 가능합니다. 아래에 나열된 스토리지 엔진 조합만이 사용 중단 경고를 발생시키지 않습니다:

  • InnoDBBLACKHOLE
  • MyISAMMERGE
  • performance_schema와 다른 모든 스토리지 엔진
  • TempTable과 다른 모든 스토리지 엔진
참고 NDBCLUSTER는 트랜잭션 가능하지만 구성 가능하지 않습니다.

자세한 내용은 복제 및 트랜잭션을 참조하십시오. (WL #10495)

MySQL 8.0에서 사용 중단된 mysql_native_password 인증 플러그인이 제거되었으며, 이제 CLIENT_PLUGIN_AUTH 기능을 지원하지 않는 이전 클라이언트 프로그램의 mysql_native 인증 요청을 서버가 거부합니다. 하위 호환성을 위해 mysql_native_password는 여전히 클라이언트에서 사용할 수 있으며, 클라이언트 측 내장 인증 플러그인은 동적으로 로드 가능한 플러그인으로 변환되었습니다.

참고
MySQL 8.0에서는 기본 MySQL 인증 플러그인이 caching_sha2_password로 변경되었습니다(자세한 내용은 Caching SHA-2 Pluggable Authentication을 참조하십시오).

이러한 변경 사항에는 다음 서버 옵션 및 변수의 제거도 포함됩니다:

  • --mysql-native-password 서버 옵션
  • --mysql-native-password-proxy-users 서버 옵션
  • default_authentication_plugin 서버 시스템 변수

자세한 내용은 Authentication Plugins을 참조하십시오. (WL #15930)

Performance Schema의 variables_info 테이블에 있는 MIN_VALUEMAX_VALUE 열은 이제 사용 중단되었으며, 향후 MySQL 버전에서 제거될 예정입니다. 대신 동일한 정보를 제공하는 variables_metadata 테이블의 MIN_VALUEMAX_VALUE 열을 사용해야 합니다. (WL #15585)

이벤트 스케줄러 관련 사항

중요 변경: 이제 다음과 같은 이벤트 관련 SQL 문을 준비(prepare)할 수 있습니다:

이러한 문장에서는 위치 매개변수(? 자리표시자)를 지원하지 않으며, 문장의 텍스트는 문자열 리터럴, 시스템 변수, 사용자 변수를 조합하여 준비해야 합니다. 자세한 내용은 PREPARE, EXECUTE, 및 DEALLOCATE PREPARE 문Prepared Statement에서 허용되는 SQL 문법을 참조하십시오. 기본적인 예시는 CREATE EVENT 문을 참조하십시오. (버그 #109309, 버그 #34875573, WL #16298)

JavaScript 프로그램

MySQL 9.0 Enterprise Edition은 이제 자바스크립트로 작성된 저장 프로그램을 지원합니다. 다음은 CREATE FUNCTION 문과 자바스크립트 코드를 사용하여 작성된 간단한 예입니다:

CREATE FUNCTION gcd(a INT, b INT) 
RETURNS INT 
NO SQL 
LANGUAGE JAVASCRIPT AS
  $mle$
    let x = Math.abs(a)
    let y = Math.abs(b)
    while(y) {
      var t = y
      y = x % y
      x = t
    }
    return x
  $mle$
;

JavaScript Stored Program Creation and Management에서는 자바스크립트 저장 프로그램의 생성과 실행을 설명합니다.
자바스크립트 언어 지원은 저장 프로시저와 저장 함수 모두를 포함하며, 이는 다중 언어 엔진 구성 요소(MLE)에 의해 제공됩니다. 배포에 이 구성 요소가 포함되어 있는지 확인하고 활성화하는 방법은 Multilingual Engine Component (MLE)를 참조하십시오.
MySQL의 자바스크립트 언어 지원은 ECMAScript 2023 사양을 준수하며, 기본적으로 엄격 모드가 적용됩니다. 엄격 모드는 비활성화할 수 없습니다. 이 구현에는 Object, Function, Math, Date, String 등의 표준 ECMAScript 라이브러리 객체가 모두 포함되어 있으며, console.log()console.error()도 지원됩니다.
자바스크립트 저장 프로그램은 입력 및 출력 인수와 반환 데이터 유형으로 대부분의 MySQL 데이터 유형을 지원합니다. 문자열은 utf8mb4 캐릭터셋을 사용해야 합니다. MySQL BLOBTEXT 유형이 지원되며, 많은 MySQL 시간 데이터 유형도 지원됩니다. JSON도 지원됩니다. 다중 언어 엔진 구성 요소나 자바스크립트 저장 프로그램에서는 VECTOR 유형이 지원되지 않습니다. 자세한 내용은 JavaScript Stored Program Data Types and Argument HandlingJavaScript Stored Program Limitations and Restrictions을 참조하십시오.
자바스크립트로 작성된 저장 프로그램은 MLE 구성 요소에서 제공하는 SQL 및 결과 집합 API를 지원합니다. 자세한 내용은 JavaScript SQL APIUsing the JavaScript SQL API를 참조하십시오.
MLE 구성 요소는 mle_session_state()mle_session_reset()와 같은 세션 정보 및 관리 기능을 제공합니다. 또한 SHOW STATUS LIKE 'mle%'와 유사한 문장을 사용하여 여러 MLE 상태 변수를 확인할 수 있습니다. JavaScript Stored Programs—Session Information and Options도 참조하십시오.
자바스크립트 저장 프로그램에 대한 일반 정보는 JavaScript Stored Programs를 참조하십시오. (WL #15605, WL #16129, WL #16172, WL #16226, WL #16272, WL #16276)

키링 관련 사항

키링 코드에서 여러 가지 개선이 이루어졌습니다. (버그 #36401550)

옵티마이저 관련 사항

중요 변경: ER_SUBQUERY_NO_1_ROW 오류가 이제 IGNORE 키워드를 포함하는 문장에서 무시되지 않습니다. 이러한 변경은 다음과 같은 이유로 이루어졌습니다:

  • 이러한 오류를 무시하면 때때로 NULL이 널 허용되지 않는 열에 삽입되거나(변환되지 않은 서브쿼리의 경우), 아무 행도 삽입되지 않는 경우가 있었습니다(subquery_to_derived를 사용하는 서브쿼리의 경우).
  • 서브쿼리가 유도 테이블과의 조인으로 변환될 때, 변환되지 않은 쿼리의 동작과 달랐습니다.

이번 릴리스로 업그레이드한 후, 하나 이상의 행을 반환하는 스칼라 서브쿼리를 포함하는 UPDATE, DELETE 또는 INSERT 문에 IGNORE 키워드가 포함된 경우 오류가 발생할 수 있습니다.자세한 내용은 IGNORE의 실행에 대한 효과를 참조하십시오. (버그 #110961, 버그 #35373406)

Performance Schema 관련 사항

이번 릴리스에서는 MySQL 퍼포먼스 스키마에 두 개의 테이블이 추가되었습니다:

  • variables_metadata 테이블은 시스템 변수에 대한 일반 정보를 제공합니다. 이 정보에는 MySQL 서버에서 인식하는 각 시스템 변수의 이름, 범위, 유형, 범위(적용 가능한 경우), 설명이 포함됩니다.
    이 테이블의 MIN_VALUEMAX_VALUE 열은 더 이상 사용되지 않는 variables_info 테이블의 MIN_VALUEMAX_VALUE 열을 대체합니다.
  • global_variable_attributes 테이블은 서버가 글로벌 시스템 변수에 할당한 속성-값 쌍에 대한 정보를 제공합니다.

자세한 내용은 퍼포먼스 스키마 시스템 변수 테이블을 참조하십시오. (WL #15855)

SQL 구문 관련 사항

JSON: 이제 EXPLAIN ANALYZEJSON 출력 결과를 사용자 변수에 저장할 수 있습니다. 다음 구문을 참조하십시오:

EXPLAIN ANALYZE FORMAT=JSON INTO @variable select_stmt

이 변수는 이후 MySQL의 JSON 함수(참조: JSON 함수)에서 JSON 인수로 사용할 수 있습니다. INTO 절은 FORMAT=JSON과 함께만 지원되며, 이를 명시적으로 포함해야 합니다. 이 형태의 EXPLAIN ANALYZE는 분석되는 SELECT 문 앞에 FOR SCHEMA 또는 FOR DATABASE 절을 선택적으로 포함할 수 있습니다. SELECT가 아닌 문장은 지원되지 않습니다.

주의
이 기능은 explain_json_format_version 서버 시스템 변수가 2로 설정된 경우에만 사용할 수 있습니다; 그렇지 않으면 ER_EXPLAIN_ANALYZE_JSON_FORMAT_VERSION_NOT_SUPPORTED 오류가 발생합니다.

자세한 내용과 예시는 실행 계획 정보 얻기를 참조하십시오. (WL #16216)

MySQL은 이제 인라인 외래 키 명세를 허용하고 이를 강제합니다(이전에는 파서에서 허용되었지만 무시됨). 또한, 상위 테이블의 기본 키 열에 대한 암시적 참조도 허용됩니다.
다음과 같이 생성된 person 상위 테이블을 고려하십시오:

CREATE TABLE person (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name CHAR(60) NOT NULL
);

person에 외래 키 owner를 가진 shirt 테이블을 생성하려면 MySQL은 이제 다음과 같은 표준에 따라 CREATE TABLE 문 중 어느 것이든 올바르게 처리합니다:

CREATE TABLE shirt (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    style ENUM('tee', 'polo', 'dress') NOT NULL,
    color ENUM('red', 'blue', 'yellow', 'white', 'black') NOT NULL,
    owner SMALLINT UNSIGNED NOT NULL,
    
    FOREIGN KEY (owner) REFERENCES person (id)
);

CREATE TABLE shirt (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    style ENUM('tee', 'polo', 'dress') NOT NULL,
    color ENUM('red', 'blue', 'yellow', 'white', 'black') NOT NULL,
    owner SMALLINT UNSIGNED NOT NULL REFERENCES person (id)
);

CREATE TABLE shirt (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    style ENUM('tee', 'polo', 'dress') NOT NULL,
    color ENUM('red', 'blue', 'yellow', 'white', 'black') NOT NULL,
    owner SMALLINT UNSIGNED NOT NULL,
    
    FOREIGN KEY (owner) REFERENCES person
);

CREATE TABLE shirt (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    style ENUM('tee', 'polo', 'dress') NOT NULL,
    color ENUM('red', 'blue', 'yellow', 'white', 'black') NOT NULL,
    owner SMALLINT UNSIGNED NOT NULL REFERENCES person
);

이전 버전의 MySQL에서는 위의 네 문장 중 첫 번째만 외래 키를 생성했으며, 두 번째는 구문 분석되었으나 REFERENCES 절이 무시되었습니다. 나머지 두 문장은 구문 오류를 발생시켰습니다.
자세한 내용은 FOREIGN KEY ConstraintsFOREIGN KEY Constraint Differences를 참조하십시오. (버그 #4919, 버그 #17943, 버그 #102904, 버그 #11744902, 버그 #11745637, 버그 #32613571, WL #16130, WL #16131)

sys 스키마 관련 사항

이번 릴리스에서는 innodb_lock_waits 뷰의 성능이 개선되었습니다. (버그 #36337708)

스레드 풀 관련 사항

연결 처리 스레드가 없는 스레드 그룹에 연결 시도가 멈췄습니다. 이제 연결 처리 스레드는 최소한 하나의 연결 스레드가 남아 있을 때만 종료되도록 수정했습니다. (버그 #36550125)

이전 리팩토링 과정에서 들어오는 연결 요청을 처리할 때 수행되는 연결 잠금이 잘못 제거되어, 새로운 연결을 추가하는 스레드와 이를 처리하는 연결 핸들러 스레드 간에 경합 조건이 발생했습니다. 이로 인해 연결 요청이 무시되어 처리되지 않아, 연결 시도가 멈춘 것처럼 보일 수 있었습니다.
이 문제는 대기열을 처리하기 전에 연결을 취하고, 새 스레드를 깨우거나 생성하기 전에 연결을 해제하도록 수정되었습니다. (버그 #36548687)

Information Schema 테이블 TP_THREAD_GROUP_STATE, TP_THREAD_GROUP_STATS, 그리고 TP_THREAD_STATE 는 MySQL 8.0.14에서 사용 중단되었습니다. 이제 이러한 테이블에 접근하면 경고가 발생하며, 대신 해당하는 퍼포먼스 스키마 테이블을 사용해야 합니다.
자세한 내용은 퍼포먼스 스키마 스레드 풀 테이블을 참조하십시오. (버그 #36359860)

thread_pool_longrun_trx_limit 시스템 변수를 지정된 범위를 벗어난 값으로 설정할 수 있었습니다.
또한, 이 변수의 설정이 SHOW VARIABLES 또는 SELECT 출력에 반영되지 않았습니다. (버그 #36347102, 버그 #36371145)

SET PERSIST_ONLY 명령어가 thread_pool_max_transactions_limit와 제대로 작동하지 않았습니다. (버그 #35019884)

KILL CONNECTION 명령어가 thread_pool_max_transactions_limit와 제대로 작동하지 않았습니다. (버그 #34019954)

Thread Pool 플러그인을 사용할 때 performance_schema.socket_instances 테이블에 클라이언트 연결의 스레드 ID가 표시되지 않았습니다. (버그 #24796018)

벡터 데이터 타입

이번 릴리스에서는 VECTOR 열 타입에 대한 지원이 추가되었습니다. 벡터는 항목(4바이트 부동 소수점 값)의 리스트로 구성된 데이터 구조로, 이진 문자열 값 또는 리스트 형식의 문자열로 표현될 수 있습니다. VECTOR 열은 최대 길이 또는 항목 수(괄호 안에)를 지정하여 선언되며, 기본값은 2048이고 최대값은 16383입니다.
VECTOR 열을 사용하는 InnoDB 테이블을 다음과 같이 CREATE TABLE 명령어를 사용하여 생성할 수 있습니다:

mysql> CREATE TABLE v1 (c1 VECTOR(5000));
Query OK, 0 rows affected (0.03 sec)

다른 스토리지 엔진은 VECTOR 열을 포함한 테이블을 지원하지 않습니다.
이번 릴리스에서 벡터 열은 여러 제한 사항을 가지고 있으며, 일부는 다음과 같습니다:

  • VECTOR 열은 어떤 유형의 키로도 사용할 수 없습니다. 여기에는 기본 키, 외래 키, 고유 키 및 파티셔닝 키가 포함됩니다.
  • 일부 MySQL 함수 및 연산자는 벡터를 인수로 허용하지 않습니다. 여기에는 숫자 함수 및 연산자, 시간 함수, 전체 텍스트 검색 함수, XML 함수, 비트 함수 및 JSON 함수가 포함되지만 이에 국한되지 않습니다.
    일부(모든 것은 아님) 문자열 및 암호화 함수는 VECTOR 값을 지원합니다. 보다 완전한 정보는 VECTOR 지원 및 비지원 함수를 참조하십시오.
  • VECTOR는 다른 유형과 비교할 수 없으며, 다른 VECTOR와는 동등성만 비교할 수 있습니다.
  • MLE 자바스크립트 프로그램은 VECTOR 열 또는 값을 지원하지 않습니다.
  • NDB Cluster는 VECTOR 열 또는 값을 지원하지 않습니다.

벡터의 길이를 얻으려면 VECTOR_DIM() 함수를 사용하십시오. 표현 간 변환 함수도 제공됩니다. STRING_TO_VECTOR() (별칭: TO_VECTOR()) 함수는 벡터의 리스트 형식 표현을 가져와 이진 문자열 표현으로 반환합니다. VECTOR_TO_STRING() (별칭: FROM_VECTOR()) 함수는 반대로 변환합니다. 예시는 다음과 같습니다:

mysql> SELECT STRING_TO_VECTOR('[2, 3, 5, 7]');
+------------------------------------------------------+
| TO_VECTOR('[2, 3, 5, 7]')                            |
+------------------------------------------------------+
| 0x00000040000040400000A0400000E040                   |
+------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT VECTOR_TO_STRING(0x00000040000040400000A0400000E040);
+------------------------------------------------------+
| VECTOR_TO_STRING(0x00000040000040400000A0400000E040) |
+------------------------------------------------------+
| [2.00000e+00,3.00000e+00,5.00000e+00,7.00000e+00]    |
+------------------------------------------------------+
1 row in set (0.00 sec)

자세한 정보와 예시는 The VECTOR TypeVector Functions을 참조하십시오. (WL #16081)

X Plugin 관련 사항

caching_sha2_password_digest_rounds 시스템 변수를 X Protocol을 사용하여 기본값이 아닌 값으로 설정할 수 없었습니다. (버그 #36402455)

mysql_function_names 유닛 테스트 소스 파일에서 MySQL 문서로의 오래된 링크가 업데이트되었습니다.
Minha Jeong에게 감사드립니다. (버그 #113500, 버그 #36137217)

추가 및 변경된 기능

이제 EXPLAIN FORMAT=JSON 출력에 조인 열이 포함됩니다. (버그 #36230046)

이제 상관 서브쿼리가 LIMIT 1 절을 포함할 경우 외부 왼쪽 조인으로 최적화할 수 있습니다(이전에는 모든 LIMIT 절이 포함된 서브쿼리는 이 방식으로 변환할 수 없었습니다). LIMIT 절은 반드시 리터럴 1을 사용해야 하며, 다른 값이나 플레이스홀더(?) 또는 변수를 사용할 경우 이 변환이 적용되지 않습니다.
자세한 내용은 상관 서브쿼리를 참조하십시오. (WL #16124)

버그 수정

중요 변경 사항; 복제: replica_parallel_workers1로 설정된 경우, 트랜잭션의 논리적 타임스탬프가 잘못되어 복제본이 오류와 함께 중단되었으나, 논리적 타임스탬프는 단일 적용 스레드가 있을 때는 관련이 없습니다.
이제 replica_parallel_workers = 1인 경우 복제본에서 경고를 기록하고, 이 시스템 변수가 1보다 클 때만 오류를 발생시킵니다. 또한 오류 메시지의 형식과 정보가 개선되었으며, 동일한 메시지가 SHOW REPLICA STATUS의 출력과 퍼포먼스 스키마 replication_applier_status 테이블에도 사용됩니다. (버그 #36058442)

InnoDB: ALTER TABLE 작업 후 UPDATE에서 MySQL이 예기치 않게 중단되었습니다. (버그 #36571091)
참조: 이 문제는 버그 #35183686의 회귀 문제입니다.

InnoDB: InnoDB 복구 로직을 개선하여 복구 작업 간의 일시 중단을 줄였습니다. (버그 #36332645)

InnoDB: 파일 시스템 작업을 수행할 때 InnoDB가 이제 디렉토리 변경 작업 시 항상 상위 디렉토리를 fsync합니다. (버그 #36174938)

InnoDB: 디버그 빌드에서 innodb_interpreter_output 디버그 변수를 설정하면 서버가 예기치 않게 중단되었습니다. 이제 이 변수는 읽기 전용으로 설정되었습니다. (버그 #36041032)

InnoDB: os_innodb_umask 처리를 개선하고, 이 변수를 읽기 전용으로 설정했습니다. (버그 #35932118)
참조: 이 문제는 버그 #29472125의 회귀 문제입니다.

InnoDB: Fusion IO 원자적 쓰기 기능에 대한 특정 기능이 제거되었습니다. 이 제품은 2014년에 마지막으로 제공되었습니다. (버그 #35072139)

InnoDB: 유효한 열 인덱스가 있을 때도 InnoDB에서 유효하지 않은 열 인덱스를 참조하는 assertion 오류가 발생했습니다. (버그 #34800754)

InnoDB: 빈 XA 트랜잭션이 있을 때 XA START 후 서버를 종료하면 서버가 예기치 않게 중단되었습니다. (버그 #32416819)

InnoDB: 빈 XA 트랜잭션을 처리하는 동안 복제 적용기 또는 바이너리 로그 적용기를 종료하면 시스템이 예기치 않게 중단되었습니다. (버그 #32416819)

InnoDB: Validate_files::check() 함수에서 불필요한 힙 사용이 제거되었습니다.
Huaxiong Song에게 감사드립니다. (버그 #115041, 버그 #36626203)

InnoDB: notify_about_advanced_write_lsn() 로직을 개선하여 잠재적인 로그 알림 지연을 방지했습니다.
Zongzhi Chen에게 감사드립니다. (버그 #114660, 버그 #36528707)

InnoDB: innodb_parallel_read_threads=1 설정에서 파티션 테이블을 읽으면 256회 이상의 읽기 이후 읽기 성능이 크게 감소했습니다. InnoDB는 병렬 읽기 스레드를 사용하지 않았음에도 불구하고 최대 병렬 읽기 스레드 용량에 도달한 것처럼 동작했습니다.
Ke Yu에게 감사드립니다. (버그 #114154, 버그 #36347408)

InnoDB: get_next_redo_rseg_from_undo_spaces()에서 불필요한 조건부 검사가 제거되었습니다.
Alex Xing에게 감사드립니다. (버그 #113640, 버그 #36185805)

InnoDB: 공간 참조 식별자(SRID) 속성이 포함된 열이 있는 공간 인덱스에서 결과가 비어 있었습니다. 또한, FORCE INDEX를 사용하여 공간 인덱스에서 커버링 인덱스 스캔을 강제할 때 assertion이 발생했습니다. (버그 #112676, 버그 #114200, 버그 #35894664, 버그 #36361834)

InnoDB: SELECT ... GROUP BY 쿼리는 TempTable 엔진에서 메모리 엔진보다 최소 두 배 느렸습니다. (버그 #107700, 버그 #34338001)

복제: 소스에 JSON 함수를 사용하여 채워진 저장된 생성된 열이 포함되어 있고 binlog_row_imageMINIMAL로 설정된 경우, 해당 열에 대한 후속 업데이트 또는 삭제 작업이 실패했습니다:

        Invalid JSON text in argument 1 to function json_extract: 'The document is empty.'

복제본은 생성된 열을 다시 평가하려고 시도했지만 기본 열이 사용 불가능하여 해당 오류로 실패했습니다. 이번 릴리스부터 기본 열이 사용 불가능한 경우 생성된 열은 다시 평가되지 않습니다. (버그 #36515172)

복제: relay_log_space_limit를 활성화한 상태에서 GTID 기반 복제를 실행할 때, 자동 포지셔닝 프로토콜을 다시 시작하면 가끔 무한 루프가 발생하여 복제에서 교착 상태가 발생했습니다. 이는 트랜잭션 크기가 이 한도를 초과한 경우뿐만 아니라 이전 로그를 삭제할 수 없을 때도 relay_log_space_limit이 준수되지 않았기 때문입니다.

이 문제를 해결하기 위해 다음과 같은 변경 사항을 적용했습니다:

  • 수신기가 사용자에 의해 설정된 relay_log_space_limit을 준수하며, 수신된 트랜잭션이 삭제된 릴레이 로그에 맞지 않을 경우, 수신기는 전체 트랜잭션을 예약할 수 있는지 확인한 후, 불가능할 경우 다음 작업을 수행합니다:
    • 수신기가 대기 중임을 나타내는 플래그를 설정
    • 릴레이 로그를 회전
    • 릴레이 로그 삭제가 실행되었고 적용기가 모든 릴레이 로그를 삭제했음을 알릴 때까지 대기; 이후 수신기는 다시 한도 확인 없이 트랜잭션을 예약할 수 있습니다.
  • 다음 파일로 이동하기 전에 코디네이터는 수신기가 릴레이 로그 공간을 기다리고 있는지 확인합니다. 만약 그렇다면 코디네이터는 적용된 로그를 강제로 삭제하며, 현재 릴레이 로그 파일도 포함됩니다. 릴레이 로그 파일을 안전하게 삭제하려면 코디네이터는 다음 작업을 수행해야 합니다:
    • 다음 파일로 이동하기 전에 모든 작업자를 동기화
    • 릴레이 로그를 현재 삭제하기 위해 그룹 위치를 강제로 업데이트
    • 적용기가 이동한 릴레이 로그 파일 이름을 수신기가 읽을 수 있는 변수로 업데이트
    이러한 작업은 수신기가 트랜잭션 경계에서 대기하고 릴레이 로그를 회전한 후 대기 중임을 알고 있기 때문에 안전하게 수행될 수 있습니다.

(버그 #36507020)

복제: 작업자 작업에는 트랜잭션을 시작한 릴레이 로그 파일에 대한 정보가 포함되며, 더 이상 relay_log에 정의된 기본값을 사용하지 않습니다. (버그 #36395631)

복제: 오류 ER_SERVER_REPLICA_CONVERSION_FAILED에서 반환된 열 번호가 실제 값보다 하나 적었습니다. (버그 #36246205)

복제: 트랜잭션이 바이너리 로그에 커밋되는 동안 사고를 처리하면 MySQL이 무기한 대기 상태에 빠졌습니다. (버그 #35671897)

복제: binlog_rows_query_log_events가 활성화된 상태에서 행 기반 복제를 사용할 때, SQL 문이 Rows_query_log_event에 기록되고 Table_map_event 앞에 작성되었습니다. SQL은 이진 데이터를 포함할 수 있으며 이 데이터는 임베디드 null(\0)을 포함할 수 있으므로, strlen(), snprintf()와 같은 C 함수가 null 바이트까지만 처리하는 방식에 의존할 경우 쿼리 문자열이 첫 번째 null 바이트에서 잘려서 불완전한 데이터가 처리될 수 있었습니다.
이제 각 Rows_query_log_event의 길이를 명시하여 길이 계산에 C 스타일 문자열 메서드에 의존할 필요가 없도록 수정했습니다. 또한, 쿼리를 처리할 때 null 종료에 의존하지 않는 함수를 사용하도록 했습니다. 또한 Rows_query_log_event 데이터 본문의 첫 번째 바이트를 사용하지 않음으로 표시했습니다. (버그 #109401, 버그 #35336260)

그룹 복제: /xcom/gcs_xcom_networking.cc에서 메모리 누수가 제거되었습니다. (버그 #36532199)

그룹 복제: 특정 상황에서 새 프라이머리를 성공적으로 설정한 후, group_replication_set_as_primary()가 작업 완료를 무기한 대기했습니다.
이번 릴리스부터 주기적으로 체크하여 함수가 불필요하게 대기하지 않도록 했습니다. (버그 #36348650)

그룹 복제: 특정 상황에서 프라이머리 호스트가 20초 이상 네트워크 비활성 상태를 겪으면, 세컨더리가 예기치 않게 중단될 수 있었습니다. (버그 #36306144)

그룹 복제: REPLICATION_GROUP_MEMBERS 테이블의 MEMBER_ID, MEMBER_HOST, MEMBER_PORT 열이 오프라인 멤버에 대해 항상 채워지지 않았습니다. (버그 #36290046)

그룹 복제: 특정 상황에서 쓰레기 수집이 릴레이 로그 회전 직전에 발생하면 세컨더리 멤버에서 새로운 트랜잭션 적용이 중단될 수 있었습니다.
이는 쓰레기 수집이 릴레이 로그의 last_committedsequence_number를 증가시켜 로그 회전 후 기록된 sequence_number에 갭을 만들었기 때문입니다. 로그의 다른 위치에서 갭이 발생한 경우 적용기에 영향을 미치지 않았습니다.
이번 릴리스부터 쓰레기 수집 중에는 last_committed만 업데이트됩니다. (버그 #36280130, 버그 #36446250)

그룹 복제: 다음 테이블들은 호스트 이름이 구성되지 않은 복제 채널(예: 그룹 복제 복구 채널)에 대한 데이터를 포함하지 않았습니다:

이번 릴리스부터 이러한 테이블에는 부분적으로 구성된 그룹 복제 채널에 대한 데이터가 포함됩니다. (버그 #36018242)

JSON: NULLIF()COALESCE(), 그리고 시프트(>>) 연산자에 대한 누락된 오류 처리가 추가되었습니다. (버그 #113668, 버그 #35513196, 버그 #36198403)
참조: 버그 #31358416도 참조하십시오.

MySQL NDB ClusterJ: ClusterJ 테스트 스위트를 실행할 때 존재하지 않는 스레드에 대한 오류 메시지가 발생했습니다. 이는 스레드 및 연결 처리 문제로 인해 발생했으며, 이번 패치로 수정되었습니다. (버그 #36086735)

<=> 연산자를 평가할 때 누락된 오류 검사가 추가되었습니다. (버그 #36570474)

CASE 연산자를 평가할 때 누락된 오류 검사가 추가되었습니다. (버그 #36570439)

특정 숫자의 평균이 항상 정확하게 계산되지 않았습니다. (버그 #36563773)

find_field_in_tables() 함수에서 Item::m_table_ref에 대한 중복 할당이 제거되어 잘못된 GROUP BY 결과 및 기타 오류가 수정되었습니다. (버그 #36556725, 버그 #36557029)
참조: 이 문제는 버그 #36533080의 회귀 문제입니다.

strings 디렉터리 내 다음 파일들에 잘못된 라이선스 정보가 포함되어 있었습니다:

  • mb_wc.h
  • ctype-uca.cc
  • ctype-ucs2.cc
  • ctype-utf8.cc
  • dtoa.cc
  • strxmov.cc
  • strxnmov.cc

(버그 #36506181)

특정한 비정상적인 경우에, UpdateXML() 함수가 모든 인수를 올바르게 처리하지 않았습니다. (버그 #36479091)

subquery_to_derived=ON 설정 시, 서브쿼리가 파생 테이블로 변환된 후 일부 경우 외부 참조가 교체되지 않았습니다. (버그 #36475633)
참조: 버그 #36314993도 참조하십시오.

TIME 값과 관련된 누락된 오류 검사가 sql/item.cc에서 어설션을 유발했습니다. (버그 #36421511)

SRID 속성을 포함하는 열이 있는 공간 인덱스에 FORCE INDEX를 사용하여 쿼리를 설명할 때, 예기치 않게 종료되는 문제가 발생했습니다. (버그 #36418426)

저장 프로시저 내에서 생성된 이벤트가 항상 올바르게 처리되지 않았습니다. (버그 #36402968, 버그 #35395333)참조: 이 문제는 버그 #17809, 버그 #11745618의 회귀 문제입니다.

InnoDB OpenTelemetry 메트릭스(mysql.inno)가 자동으로 업데이트되지 않았습니다. (버그 #36399090)

이 수정 사항은 두 가지 문제를 해결합니다:

  • GROUP BY 목록에 배치된 항목을 검색할 때 아직 고정되지 않은 항목이 include/sql_string.h에서 어설션을 발생시켰습니다.
  • TIME_FORMAT() 함수가 일부 경우에 NULL 인수를 올바르게 처리하지 못했습니다.

(버그 #36367313, 버그 #36367776)

CMake 및 Bison의 새 버전 요구 사항에 맞게 BuildRequire 규칙이 업데이트되었습니다. (버그 #36343254)

내부 함수 MY_COLLATION_HANDLER::strstr()에서 사용되지 않는 인수가 제거되었습니다. (버그 #36342997)

IN 술어가 EXCEPT ALL 집합 연산을 포함할 때 잘못된 결과를 반환했습니다. (버그 #36332697)

WHERE primary_key IN(SELECT constant1 EXCEPT SELECT constant2)을 사용하는 쿼리가 ORDER BY 절의 존재 여부에 따라 다른 행 수를 반환했습니다. (버그 #36307622)

표현식의 참조 카운트를 증가할 때, 해당 표현식 내부의 하위 표현식들은 검사되지 않았습니다. 그러나 표현식을 제거할 때 참조 카운트를 감소시키면 하위 표현식들도 검사되었고, 이로 인해 하위 표현식들이 의도치 않게 삭제되는 문제가 발생했습니다. 이 문제는 Item_ref::real_item()sql/item.h의 어설션에서 나타났습니다. 이번 수정에서는 현재 표현식이 유일한 남은 참조를 포함하지 않는 한 하위 표현식을 검사하지 않도록 했습니다. (버그 #36204344, 버그 #36356279)

특정 조건에서, EXPLAIN FORMAT=JSON FOR CONNECTION 명령이 예기치 않게 종료되는 문제가 발생했습니다. (버그 #36189820)

특정 조건에서 경쟁 상태로 인해 TABLE_HANDLES에서 사용되는 RAM 양이 최대 9GB까지 증가할 수 있었습니다. (버그 #36170903)

하위 쿼리를 파생 테이블로 변환하는 과정에서 HAVING 조건에 있는 하위 쿼리의 대체가 항목 참조를 사용하지 않아, 프로덕션 빌드에서는 어설션이 발생하고, 디버그 빌드에서는 예기치 않게 종료되었습니다. 이는 옵티마이저가 하위 쿼리가 HAVING 조건의 일부임을 제대로 감지하지 못했기 때문에 발생했습니다. (버그 #36079456)
참조: 이 문제는 버그 #35060385의 회귀 문제입니다.

MaterializeIterator<Profiler>::load_HF_row_into_hash_map() 함수가 행을 다시 읽는 동안 리소스를 소진할 가능성이 있었습니다. (버그 #36075756)

일부 CREATE USER 명령이 올바르게 처리되지 않았습니다. (버그 #36022885)

특정 경우에, lateral 조인이 올바르게 처리되지 않았습니다. (버그 #35945239)
참조: 버그 #107700, 버그 #34338001도 참조하십시오. 이 문제는 버그 #32644631의 회귀 문제입니다.

SELECT에서 ORDER BYLIMIT을 사용한 쿼리의 옵티마이저가 먼저 매우 비싼 비용을 가진 전체 테이블 스캔을 선택한 후, 추가 검사를 수행하여 perform_order_index 유형의 경로를 사용했으나, 이 경로의 비용이 옵티마이저 계획에 반영되지 않았습니다. (버그 #35930969)

클라이언트 연결이 종료 중에 항상 올바르게 종료되지 않았습니다. (버그 #35854919)

복제본에서 mysqldump를 실행하면 FLUSH TABLES 작업이 이진 로그에 기록되는 문제가 발생했습니다. 이제 GTID 관련 복제 문제를 방지하기 위해 FLUSH LOCAL TABLES가 대신 삽입됩니다.
임시 해결 방법으로는 --source-data 옵션을 1 또는 2로 설정하는 것이 있었습니다. (버그 #35665076)
참조: 이 문제는 버그 #33630199의 회귀 문제입니다.

모든 내부 ACL 비트마스크 변수가 이제 명시적으로 32비트(uint32_t)로 설정되었습니다. (버그 #35507223)

FIND_IN_SET()에 대한 함수적 인덱스를 추가할 수 없었습니다. (버그 #35352161)

authentication_kerberos를 Valgrind에서 실행할 때 관찰된 메모리 누수가 제거되었습니다. (버그 #34482788, 버그 #36570929)

gen_range() 함수가 (더 이상 사용되지 않는) 데이터 마스킹 플러그인에서 항상 올바른 결과를 반환하지 않았습니다.
이 문제는 데이터 마스킹 플러그인에만 영향을 미쳤으며, 이를 대체하는 데이터 마스킹 컴포넌트에는 영향을 미치지 않았습니다. (버그 #34163992)

일부 경우에 SELECT constant 구문을 사용하는 쿼리에서 빈 테이블에 대해 ORDER BY COUNT(*)를 사용하면, 뷰에서 행을 반환하지 않았습니다. (버그 #115035, 버그 #36625752)

매우 많은 수의 테이블에서 DDL 작업이 수행될 때, 에러 로그가 백그라운드 히스토그램 업데이트로 인한 경고 메시지로 가득 차는 문제가 발생했습니다. 해당 경고는 메타데이터 잠금을 획득하지 못한 테이블과 관련된 것이었습니다.
이 문제를 해결하기 위해 백그라운드 히스토그램 업데이트 작업에서 에러 로그에 기록되는 메시지를 1분당 하나로 제한했습니다. 또한 백그라운드 히스토그램 업데이트 중 발생하는 모든 에러 이벤트를 경고로 낮췄습니다. (버그 #114845, 버그 #36574298)

include/my_command.h에 잘못된 주석이 수정되었습니다.
Sho Nakazono에게 기여해 주신 것에 감사드립니다. (버그 #114507, 버그 #36455468)

MySQL 9에서 새 오류 번호 범위가 6400부터 시작하도록 지정되었습니다. (버그 #114414, 버그 #36421351)

UDF의 인수에 대한 캐릭터셋이 컴포넌트 서비스를 통해 지정되었고, 전달된 인수 값이 원하는 캐릭터셋으로 제대로 변환되지 않을 때, UDF가 실행을 중지하고 SQL NULL을 반환했습니다. (버그 #114409, 버그 #36420251)

결정론적 저장 함수가 JOIN ONreturn 문 내부에서 사용할 때 잘못된 결과를 반환할 수 있었습니다. 쿼리가 예를 들어 두 번 실행 사이에 FLUSH TABLES와 같은 테이블 메타데이터 변경으로 인해 다시 준비해야 할 경우, ON 절이 때때로 손실되었습니다. (버그 #114235, 버그 #36379879)

상위 테이블의 열을 참조하는 하위 쿼리가 포함된 쿼리가 서버에 의해 거부되었습니다. (버그 #113887, 버그 #36262779)

다음과 같은 쿼리:

SELECT 
  ( 
    SELECT COUNT(1) AS cnt
    FROM t2
    WHERE t2.a = t1.a
    HAVING cnt > 0
  ) 
FROM t1;

가 다음과 같이 변환되었습니다:

SELECT COALESCE(derived_1_2.cnt,0) AS cnt
FROM t1
LEFT JOIN
  (
    SELECT COUNT(1) AS cnt,
    t2.a AS a from t2
    GROUP BY t2.a
    HAVING (cnt > 0)
  ) AS derived_1_2
ON derived_1_2.a = t1.a;

하위 쿼리에서 잘못된 HAVING 조건의 존재는 스칼라 하위 쿼리의 올바른 결과를 0에서 NULL로 변경해야 하지만, 원본 쿼리에서는 예상대로 발생했으나 변환된 쿼리에서는 그렇지 않았습니다. (버그 #113319, 버그 #36070647)

SUM(SUBSTRING())가 경고를 반환했지만, SUM(DISTINCT SUBSTRING())는 그렇지 않았습니다. (버그 #113171, 버그 #36035064)

EL8 및 EL9 플랫폼용 mysql-community-libs-compat 패키지가 누락되어 있었습니다. (버그 #112949, 버그 #35975348)

SHOW PARSE_TREE CREATE SCHEMA 명령이 디버그 빌드에서 서버 종료를 야기했습니다.

참고SHOW PARSE_TREE 명령은 디버그 빌드에서만 사용할 수 있습니다.

(버그 #112883, 버그 #35964157)

CHAR() 함수에 대한 열 참조 인수를 동일한 열 참조와 사실상 동일한 CASE() 표현식으로 대체했을 때 다른 결과가 도출되는 문제가 발생했습니다. 이 문제는 CHAR() 함수가 외부 조인의 WHERE 절에 위치하고, 열 참조가 외부 조인의 내부 테이블에서 온 경우 발생했습니다. 아래와 같은 쿼리가 그 예입니다:

SELECT 1 AS c_0
FROM t0 
LEFT JOIN t1 ON t0.vkey = t1.vkey
WHERE CHAR(CASE WHEN FALSE THEN t1.vkey ELSE t1.vkey END) NOT LIKE 'X';

열 참조가 직접 사용되었을 때 잘못된 값이 반환되었으며, 외부 조인을 내부 조인으로 변환하기 위해 WHERE 절의 CHAR() 함수가 사용되었습니다. 이는 인수로 NULL이 주어질 때 결과가 NULL이 되는 경우에만 올바른데, CHAR() 함수에는 해당되지 않습니다. 이 변환을 강제하는 구현 세부 사항은 함수의 not_null_tables() 속성 함수가 테이블의 맵 비트를 반환한다는 것입니다. 그러나 열 참조가 CASE() 표현식으로 대체되면 CASE()not_null_tables() 값을 전달하지 않아 외부 조인이 부적절하게 최적화되어 내부 조인으로 변환되지 않도록 합니다.
이 문제는 CHAR() 함수의 null_on_null 속성을 true에서 false로 설정하여 해결되었습니다. 이를 통해 not_null_tables()가 테이블의 맵 비트가 아닌 0을 반환하게 하여, 외부 조인이 필요할 때 내부 조인으로 변환되지 않도록 했습니다. (버그 #112397, 버그 #36118590)

THREADS 테이블의 PROCESSLIST_INFO 열이 준비된 문장을 실행할 때 업데이트되지 않았습니다.
Daniel Lenski와 Amazon에 기여해 주신 것에 감사드립니다. (버그 #104121, 버그 #33057164)

Leave a Comment



이 문서 공유

9.0.0 변경 사항 (2024-07-01 Innovation Release)

링크 복사

CONTENTS