mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
Merge 10.10 into 10.11
This commit is contained in:
@@ -483,7 +483,7 @@ ADD_SUBDIRECTORY(support-files)
|
|||||||
ADD_SUBDIRECTORY(extra/aws_sdk)
|
ADD_SUBDIRECTORY(extra/aws_sdk)
|
||||||
|
|
||||||
IF(NOT CMAKE_CROSSCOMPILING OR DEFINED CMAKE_CROSSCOMPILING_EMULATOR)
|
IF(NOT CMAKE_CROSSCOMPILING OR DEFINED CMAKE_CROSSCOMPILING_EMULATOR)
|
||||||
SET(EXPORTED comp_err comp_sql factorial)
|
SET(EXPORTED comp_err comp_sql factorial uca-dump)
|
||||||
IF(NOT WITHOUT_SERVER)
|
IF(NOT WITHOUT_SERVER)
|
||||||
SET(EXPORTED ${EXPORTED} gen_lex_hash gen_lex_token)
|
SET(EXPORTED ${EXPORTED} gen_lex_hash gen_lex_token)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
@@ -80,10 +80,26 @@ typedef const struct my_charset_handler_st MY_CHARSET_HANDLER;
|
|||||||
typedef const struct my_collation_handler_st MY_COLLATION_HANDLER;
|
typedef const struct my_collation_handler_st MY_COLLATION_HANDLER;
|
||||||
|
|
||||||
typedef const struct unicase_info_st MY_UNICASE_INFO;
|
typedef const struct unicase_info_st MY_UNICASE_INFO;
|
||||||
|
typedef const struct casefold_info_st MY_CASEFOLD_INFO;
|
||||||
typedef const struct uni_ctype_st MY_UNI_CTYPE;
|
typedef const struct uni_ctype_st MY_UNI_CTYPE;
|
||||||
typedef const struct my_uni_idx_st MY_UNI_IDX;
|
typedef const struct my_uni_idx_st MY_UNI_IDX;
|
||||||
typedef uint16 decimal_digits_t;
|
typedef uint16 decimal_digits_t;
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct casefold_info_char_t
|
||||||
|
{
|
||||||
|
uint32 toupper;
|
||||||
|
uint32 tolower;
|
||||||
|
} MY_CASEFOLD_CHARACTER;
|
||||||
|
|
||||||
|
|
||||||
|
struct casefold_info_st
|
||||||
|
{
|
||||||
|
my_wc_t maxchar;
|
||||||
|
MY_CASEFOLD_CHARACTER **page;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
typedef struct unicase_info_char_st
|
typedef struct unicase_info_char_st
|
||||||
{
|
{
|
||||||
uint32 toupper;
|
uint32 toupper;
|
||||||
@@ -720,6 +736,9 @@ struct my_charset_handler_st
|
|||||||
*/
|
*/
|
||||||
my_charset_conv_wc_mb native_to_mb;
|
my_charset_conv_wc_mb native_to_mb;
|
||||||
my_charset_conv_wc_mb wc_to_printable;
|
my_charset_conv_wc_mb wc_to_printable;
|
||||||
|
|
||||||
|
uint (*caseup_multiply)(CHARSET_INFO *cs);
|
||||||
|
uint (*casedn_multiply)(CHARSET_INFO *cs);
|
||||||
};
|
};
|
||||||
|
|
||||||
extern MY_CHARSET_HANDLER my_charset_8bit_handler;
|
extern MY_CHARSET_HANDLER my_charset_8bit_handler;
|
||||||
@@ -752,12 +771,11 @@ struct charset_info_st
|
|||||||
MY_UCA_INFO *uca;
|
MY_UCA_INFO *uca;
|
||||||
const uint16 *tab_to_uni;
|
const uint16 *tab_to_uni;
|
||||||
MY_UNI_IDX *tab_from_uni;
|
MY_UNI_IDX *tab_from_uni;
|
||||||
|
MY_CASEFOLD_INFO *casefold;
|
||||||
MY_UNICASE_INFO *caseinfo;
|
MY_UNICASE_INFO *caseinfo;
|
||||||
const uchar *state_map;
|
const uchar *state_map;
|
||||||
const uchar *ident_map;
|
const uchar *ident_map;
|
||||||
uint strxfrm_multiply;
|
uint strxfrm_multiply;
|
||||||
uchar caseup_multiply;
|
|
||||||
uchar casedn_multiply;
|
|
||||||
uint mbminlen;
|
uint mbminlen;
|
||||||
uint mbmaxlen;
|
uint mbmaxlen;
|
||||||
/*
|
/*
|
||||||
@@ -827,6 +845,16 @@ struct charset_info_st
|
|||||||
return (cset->casedn)(this, src, srclen, dst, dstlen);
|
return (cset->casedn)(this, src, srclen, dst, dstlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint caseup_multiply() const
|
||||||
|
{
|
||||||
|
return (cset->caseup_multiply)(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint casedn_multiply() const
|
||||||
|
{
|
||||||
|
return (cset->casedn_multiply)(this);
|
||||||
|
}
|
||||||
|
|
||||||
size_t long10_to_str(char *dst, size_t dstlen,
|
size_t long10_to_str(char *dst, size_t dstlen,
|
||||||
int radix, long int val) const
|
int radix, long int val) const
|
||||||
{
|
{
|
||||||
|
@@ -13,6 +13,14 @@ INSERT INTO case_folding (code) VALUES
|
|||||||
(0x26B),
|
(0x26B),
|
||||||
(0x271),
|
(0x271),
|
||||||
(0x27D);
|
(0x27D);
|
||||||
|
|
||||||
|
INSERT INTO case_folding (code) VALUES
|
||||||
|
(0x0049) /* LATIN CAPITAL LETTER I */,
|
||||||
|
(0x0069) /* LATIN SMALL LETTER I */,
|
||||||
|
(0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */,
|
||||||
|
(0x0131) /* LATIN SMALL LETTER DOTLESS I */
|
||||||
|
;
|
||||||
|
|
||||||
UPDATE case_folding SET c=CHAR(code USING ucs2);
|
UPDATE case_folding SET c=CHAR(code USING ucs2);
|
||||||
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
|
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
|
||||||
DROP TABLE case_folding;
|
DROP TABLE case_folding;
|
||||||
|
23
mysql-test/include/ctype_unicode_casefold_bmp.inc
Normal file
23
mysql-test/include/ctype_unicode_casefold_bmp.inc
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
--source include/have_utf32.inc
|
||||||
|
--source include/have_ucs2.inc
|
||||||
|
--source include/have_sequence.inc
|
||||||
|
|
||||||
|
EXECUTE IMMEDIATE SFORMAT('
|
||||||
|
CREATE VIEW v_bmp AS
|
||||||
|
SELECT
|
||||||
|
seq AS codepoint,
|
||||||
|
LPAD(HEX(seq),4,''0'') AS codepoint_hex4,
|
||||||
|
CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
|
||||||
|
FROM
|
||||||
|
seq_0_to_65535', @@character_set_connection, @@collation_connection);
|
||||||
|
|
||||||
|
SELECT COLLATION(c) FROM v_bmp LIMIT 1;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
codepoint_hex4,
|
||||||
|
HEX(CAST(LOWER(c) AS CHAR CHARACTER SET ucs2)),
|
||||||
|
HEX(CAST(UPPER(c) AS CHAR CHARACTER SET ucs2))
|
||||||
|
FROM v_bmp
|
||||||
|
WHERE BINARY(c)<>BINARY(LOWER(c)) OR BINARY(c)<>BINARY(UPPER(c));
|
||||||
|
|
||||||
|
DROP VIEW v_bmp;
|
22
mysql-test/include/ctype_unicode_casefold_supplementary.inc
Normal file
22
mysql-test/include/ctype_unicode_casefold_supplementary.inc
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
--source include/have_utf32.inc
|
||||||
|
--source include/have_sequence.inc
|
||||||
|
|
||||||
|
EXECUTE IMMEDIATE SFORMAT('
|
||||||
|
CREATE VIEW v_supplementary AS
|
||||||
|
SELECT
|
||||||
|
seq AS codepoint,
|
||||||
|
LPAD(HEX(seq),8,''0'') AS codepoint_hex8,
|
||||||
|
CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
|
||||||
|
FROM
|
||||||
|
seq_65536_to_1114111', @@character_set_connection, @@collation_connection);
|
||||||
|
|
||||||
|
SELECT COLLATION(c) FROM v_supplementary LIMIT 1;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
codepoint_hex8,
|
||||||
|
HEX(CAST(LOWER(c) AS CHAR CHARACTER SET utf32)),
|
||||||
|
HEX(CAST(UPPER(c) AS CHAR CHARACTER SET utf32))
|
||||||
|
FROM v_supplementary
|
||||||
|
WHERE BINARY(c)<>BINARY(LOWER(c)) OR BINARY(c)<>BINARY(UPPER(c));
|
||||||
|
|
||||||
|
DROP VIEW v_supplementary;
|
26
mysql-test/include/ctype_unicode_ws_bmp.inc
Normal file
26
mysql-test/include/ctype_unicode_ws_bmp.inc
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
--source include/have_utf32.inc
|
||||||
|
--source include/have_sequence.inc
|
||||||
|
|
||||||
|
EXECUTE IMMEDIATE SFORMAT('
|
||||||
|
CREATE VIEW v_bmp AS
|
||||||
|
SELECT
|
||||||
|
seq AS codepoint,
|
||||||
|
LPAD(HEX(seq),4,''0'') AS codepoint_hex4,
|
||||||
|
CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
|
||||||
|
FROM
|
||||||
|
seq_0_to_65535', @@character_set_connection, @@collation_connection);
|
||||||
|
|
||||||
|
SELECT COLLATION(c) FROM v_bmp LIMIT 1;
|
||||||
|
|
||||||
|
SELECT HEX(codepoint) FROM v_bmp WHERE HEX(WEIGHT_STRING(c))='FFFD';
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
SUM(codepoint_hex4=HEX(WEIGHT_STRING(c))) AS count_bmp_weight_is_codepoint,
|
||||||
|
SUM(codepoint_hex4<>HEX(WEIGHT_STRING(c))) AS count_bmp_weight_is_not_codepoint
|
||||||
|
FROM v_bmp;
|
||||||
|
|
||||||
|
SELECT codepoint_hex4,HEX(WEIGHT_STRING(c))
|
||||||
|
FROM v_bmp
|
||||||
|
WHERE codepoint_hex4<>HEX(WEIGHT_STRING(c));
|
||||||
|
|
||||||
|
DROP VIEW v_bmp;
|
19
mysql-test/include/ctype_unicode_ws_supplementary.inc
Normal file
19
mysql-test/include/ctype_unicode_ws_supplementary.inc
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
--source include/have_utf32.inc
|
||||||
|
--source include/have_sequence.inc
|
||||||
|
|
||||||
|
EXECUTE IMMEDIATE SFORMAT('
|
||||||
|
CREATE VIEW v_supplementary AS
|
||||||
|
SELECT
|
||||||
|
seq AS codepoint,
|
||||||
|
CONVERT(CHAR(seq USING utf32) USING {}) COLLATE {} AS c
|
||||||
|
FROM
|
||||||
|
seq_65536_to_1114111', @@character_set_connection, @@collation_connection);
|
||||||
|
|
||||||
|
SELECT COLLATION(c) FROM v_supplementary LIMIT 1;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
SUM(HEX(WEIGHT_STRING(c))<>'FFFD'),
|
||||||
|
SUM(HEX(WEIGHT_STRING(c))='FFFD')
|
||||||
|
FROM v_supplementary;
|
||||||
|
|
||||||
|
DROP VIEW v_supplementary;
|
@@ -3068,6 +3068,12 @@ INSERT INTO case_folding (code) VALUES
|
|||||||
(0x26B),
|
(0x26B),
|
||||||
(0x271),
|
(0x271),
|
||||||
(0x27D);
|
(0x27D);
|
||||||
|
INSERT INTO case_folding (code) VALUES
|
||||||
|
(0x0049) /* LATIN CAPITAL LETTER I */,
|
||||||
|
(0x0069) /* LATIN SMALL LETTER I */,
|
||||||
|
(0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */,
|
||||||
|
(0x0131) /* LATIN SMALL LETTER DOTLESS I */
|
||||||
|
;
|
||||||
UPDATE case_folding SET c=CHAR(code USING ucs2);
|
UPDATE case_folding SET c=CHAR(code USING ucs2);
|
||||||
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
|
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
|
||||||
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
||||||
@@ -3081,6 +3087,10 @@ HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
|||||||
26B C9AB E2B1A2 ɫ
|
26B C9AB E2B1A2 ɫ
|
||||||
271 C9B1 E2B1AE ɱ
|
271 C9B1 E2B1AE ɱ
|
||||||
27D C9BD E2B1A4 ɽ
|
27D C9BD E2B1A4 ɽ
|
||||||
|
49 69 49 I
|
||||||
|
69 69 49 i
|
||||||
|
130 69 C4B0 İ
|
||||||
|
131 C4B1 49 ı
|
||||||
DROP TABLE case_folding;
|
DROP TABLE case_folding;
|
||||||
#
|
#
|
||||||
# End of 10.3 tests
|
# End of 10.3 tests
|
||||||
@@ -3230,5 +3240,51 @@ is_520 0
|
|||||||
is_1400 1
|
is_1400 1
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
#
|
#
|
||||||
|
# MDEV-30661 UPPER() returns an empty string for U+0251 in uca1400 collations for utf8
|
||||||
|
#
|
||||||
|
SET NAMES utf8mb4 COLLATE utf8mb4_uca1400_test01_as_ci;
|
||||||
|
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
|
||||||
|
SHOW CREATE TABLE case_folding;
|
||||||
|
Table Create Table
|
||||||
|
case_folding CREATE TABLE `case_folding` (
|
||||||
|
`code` int(1) NOT NULL,
|
||||||
|
`c` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_test01_as_ci DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
||||||
|
INSERT INTO case_folding (code) VALUES
|
||||||
|
(0x23A),
|
||||||
|
(0x23E),
|
||||||
|
(0x23F),
|
||||||
|
(0x240),
|
||||||
|
(0x250),
|
||||||
|
(0x251),
|
||||||
|
(0x252),
|
||||||
|
(0x26B),
|
||||||
|
(0x271),
|
||||||
|
(0x27D);
|
||||||
|
INSERT INTO case_folding (code) VALUES
|
||||||
|
(0x0049) /* LATIN CAPITAL LETTER I */,
|
||||||
|
(0x0069) /* LATIN SMALL LETTER I */,
|
||||||
|
(0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */,
|
||||||
|
(0x0131) /* LATIN SMALL LETTER DOTLESS I */
|
||||||
|
;
|
||||||
|
UPDATE case_folding SET c=CHAR(code USING ucs2);
|
||||||
|
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
|
||||||
|
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
||||||
|
23A E2B1A5 C8BA Ⱥ
|
||||||
|
23E E2B1A6 C8BE Ⱦ
|
||||||
|
23F C8BF E2B1BE ȿ
|
||||||
|
240 C980 E2B1BF ɀ
|
||||||
|
250 C990 E2B1AF ɐ
|
||||||
|
251 C991 E2B1AD ɑ
|
||||||
|
252 C992 E2B1B0 ɒ
|
||||||
|
26B C9AB E2B1A2 ɫ
|
||||||
|
271 C9B1 E2B1AE ɱ
|
||||||
|
27D C9BD E2B1A4 ɽ
|
||||||
|
49 69 49 I
|
||||||
|
69 69 49 i
|
||||||
|
130 69 C4B0 İ
|
||||||
|
131 C4B1 49 ı
|
||||||
|
DROP TABLE case_folding;
|
||||||
|
#
|
||||||
# End of 10.10 tests
|
# End of 10.10 tests
|
||||||
#
|
#
|
||||||
|
@@ -697,6 +697,13 @@ ORDER BY a, HEX(a);
|
|||||||
--horizontal_results
|
--horizontal_results
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-30661 UPPER() returns an empty string for U+0251 in uca1400 collations for utf8
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET NAMES utf8mb4 COLLATE utf8mb4_uca1400_test01_as_ci;
|
||||||
|
--source include/ctype_casefolding.inc
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.10 tests
|
--echo # End of 10.10 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
1427
mysql-test/main/ctype_ucs2_general_ci_casefold.result
Normal file
1427
mysql-test/main/ctype_ucs2_general_ci_casefold.result
Normal file
File diff suppressed because it is too large
Load Diff
14
mysql-test/main/ctype_ucs2_general_ci_casefold.test
Normal file
14
mysql-test/main/ctype_ucs2_general_ci_casefold.test
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
--echo #
|
||||||
|
--echo # Start of 10.7 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET collation_connection=ucs2_general_ci;
|
||||||
|
--source include/ctype_unicode_casefold_bmp.inc
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.7 tests
|
||||||
|
--echo #
|
1143
mysql-test/main/ctype_ucs2_general_ci_ws.result
Normal file
1143
mysql-test/main/ctype_ucs2_general_ci_ws.result
Normal file
File diff suppressed because it is too large
Load Diff
14
mysql-test/main/ctype_ucs2_general_ci_ws.test
Normal file
14
mysql-test/main/ctype_ucs2_general_ci_ws.test
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
--echo #
|
||||||
|
--echo # Start of 10.7 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET @@collation_connection=ucs2_general_ci;
|
||||||
|
--source include/ctype_unicode_ws_bmp.inc
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.7 tests
|
||||||
|
--echo #
|
1427
mysql-test/main/ctype_ucs2_general_mysql500_ci_casefold.result
Normal file
1427
mysql-test/main/ctype_ucs2_general_mysql500_ci_casefold.result
Normal file
File diff suppressed because it is too large
Load Diff
15
mysql-test/main/ctype_ucs2_general_mysql500_ci_casefold.test
Normal file
15
mysql-test/main/ctype_ucs2_general_mysql500_ci_casefold.test
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
--echo #
|
||||||
|
--echo # Start of 10.7 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET @@collation_connection=ucs2_general_mysql500_ci;
|
||||||
|
--source include/ctype_unicode_casefold_bmp.inc
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.7 tests
|
||||||
|
--echo #
|
1143
mysql-test/main/ctype_ucs2_general_mysql500_ci_ws.result
Normal file
1143
mysql-test/main/ctype_ucs2_general_mysql500_ci_ws.result
Normal file
File diff suppressed because it is too large
Load Diff
15
mysql-test/main/ctype_ucs2_general_mysql500_ci_ws.test
Normal file
15
mysql-test/main/ctype_ucs2_general_mysql500_ci_ws.test
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
--echo #
|
||||||
|
--echo # Start of 10.7 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET @@collation_connection=ucs2_general_mysql500_ci;
|
||||||
|
--source include/ctype_unicode_ws_bmp.inc
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.7 tests
|
||||||
|
--echo #
|
1427
mysql-test/main/ctype_ucs2_turkish_ci_casefold.result
Normal file
1427
mysql-test/main/ctype_ucs2_turkish_ci_casefold.result
Normal file
File diff suppressed because it is too large
Load Diff
14
mysql-test/main/ctype_ucs2_turkish_ci_casefold.test
Normal file
14
mysql-test/main/ctype_ucs2_turkish_ci_casefold.test
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
--echo #
|
||||||
|
--echo # Start of 10.7 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET @@collation_connection=ucs2_turkish_ci;
|
||||||
|
--source include/ctype_unicode_casefold_bmp.inc
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.7 tests
|
||||||
|
--echo #
|
2011
mysql-test/main/ctype_ucs2_unicode_520_ci_casefold.result
Normal file
2011
mysql-test/main/ctype_ucs2_unicode_520_ci_casefold.result
Normal file
File diff suppressed because it is too large
Load Diff
14
mysql-test/main/ctype_ucs2_unicode_520_ci_casefold.test
Normal file
14
mysql-test/main/ctype_ucs2_unicode_520_ci_casefold.test
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
--echo #
|
||||||
|
--echo # Start of 10.7 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET @@collation_connection=ucs2_unicode_520_ci;
|
||||||
|
--source include/ctype_unicode_casefold_bmp.inc
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.7 tests
|
||||||
|
--echo #
|
@@ -612,6 +612,12 @@ INSERT INTO case_folding (code) VALUES
|
|||||||
(0x26B),
|
(0x26B),
|
||||||
(0x271),
|
(0x271),
|
||||||
(0x27D);
|
(0x27D);
|
||||||
|
INSERT INTO case_folding (code) VALUES
|
||||||
|
(0x0049) /* LATIN CAPITAL LETTER I */,
|
||||||
|
(0x0069) /* LATIN SMALL LETTER I */,
|
||||||
|
(0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */,
|
||||||
|
(0x0131) /* LATIN SMALL LETTER DOTLESS I */
|
||||||
|
;
|
||||||
UPDATE case_folding SET c=CHAR(code USING ucs2);
|
UPDATE case_folding SET c=CHAR(code USING ucs2);
|
||||||
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
|
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
|
||||||
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
||||||
@@ -625,6 +631,53 @@ HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
|||||||
26B C9AB C9AB ɫ
|
26B C9AB C9AB ɫ
|
||||||
271 C9B1 C9B1 ɱ
|
271 C9B1 C9B1 ɱ
|
||||||
27D C9BD C9BD ɽ
|
27D C9BD C9BD ɽ
|
||||||
|
49 69 49 I
|
||||||
|
69 69 49 i
|
||||||
|
130 69 C4B0 İ
|
||||||
|
131 C4B1 49 ı
|
||||||
|
DROP TABLE case_folding;
|
||||||
|
SET NAMES utf8mb3 COLLATE utf8mb3_turkish_ci /*Unicode-4.0 folding, with Turkish mapping for I */;
|
||||||
|
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
|
||||||
|
SHOW CREATE TABLE case_folding;
|
||||||
|
Table Create Table
|
||||||
|
case_folding CREATE TABLE `case_folding` (
|
||||||
|
`code` int(1) NOT NULL,
|
||||||
|
`c` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_turkish_ci DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
||||||
|
INSERT INTO case_folding (code) VALUES
|
||||||
|
(0x23A),
|
||||||
|
(0x23E),
|
||||||
|
(0x23F),
|
||||||
|
(0x240),
|
||||||
|
(0x250),
|
||||||
|
(0x251),
|
||||||
|
(0x252),
|
||||||
|
(0x26B),
|
||||||
|
(0x271),
|
||||||
|
(0x27D);
|
||||||
|
INSERT INTO case_folding (code) VALUES
|
||||||
|
(0x0049) /* LATIN CAPITAL LETTER I */,
|
||||||
|
(0x0069) /* LATIN SMALL LETTER I */,
|
||||||
|
(0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */,
|
||||||
|
(0x0131) /* LATIN SMALL LETTER DOTLESS I */
|
||||||
|
;
|
||||||
|
UPDATE case_folding SET c=CHAR(code USING ucs2);
|
||||||
|
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
|
||||||
|
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
||||||
|
23A C8BA C8BA Ⱥ
|
||||||
|
23E C8BE C8BE Ⱦ
|
||||||
|
23F C8BF C8BF ȿ
|
||||||
|
240 C980 C980 ɀ
|
||||||
|
250 C990 C990 ɐ
|
||||||
|
251 C991 C991 ɑ
|
||||||
|
252 C992 C992 ɒ
|
||||||
|
26B C9AB C9AB ɫ
|
||||||
|
271 C9B1 C9B1 ɱ
|
||||||
|
27D C9BD C9BD ɽ
|
||||||
|
49 C4B1 49 I
|
||||||
|
69 69 C4B0 i
|
||||||
|
130 69 C4B0 İ
|
||||||
|
131 C4B1 49 ı
|
||||||
DROP TABLE case_folding;
|
DROP TABLE case_folding;
|
||||||
SET NAMES utf8mb3 COLLATE utf8mb3_unicode_520_ci;
|
SET NAMES utf8mb3 COLLATE utf8mb3_unicode_520_ci;
|
||||||
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
|
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
|
||||||
@@ -645,6 +698,12 @@ INSERT INTO case_folding (code) VALUES
|
|||||||
(0x26B),
|
(0x26B),
|
||||||
(0x271),
|
(0x271),
|
||||||
(0x27D);
|
(0x27D);
|
||||||
|
INSERT INTO case_folding (code) VALUES
|
||||||
|
(0x0049) /* LATIN CAPITAL LETTER I */,
|
||||||
|
(0x0069) /* LATIN SMALL LETTER I */,
|
||||||
|
(0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */,
|
||||||
|
(0x0131) /* LATIN SMALL LETTER DOTLESS I */
|
||||||
|
;
|
||||||
UPDATE case_folding SET c=CHAR(code USING ucs2);
|
UPDATE case_folding SET c=CHAR(code USING ucs2);
|
||||||
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
|
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
|
||||||
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
||||||
@@ -658,6 +717,10 @@ HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
|||||||
26B C9AB E2B1A2 ɫ
|
26B C9AB E2B1A2 ɫ
|
||||||
271 C9B1 E2B1AE ɱ
|
271 C9B1 E2B1AE ɱ
|
||||||
27D C9BD E2B1A4 ɽ
|
27D C9BD E2B1A4 ɽ
|
||||||
|
49 69 49 I
|
||||||
|
69 69 49 i
|
||||||
|
130 69 C4B0 İ
|
||||||
|
131 C4B1 49 ı
|
||||||
DROP TABLE case_folding;
|
DROP TABLE case_folding;
|
||||||
SET NAMES utf8mb3 COLLATE utf8mb3_unicode_520_nopad_ci;
|
SET NAMES utf8mb3 COLLATE utf8mb3_unicode_520_nopad_ci;
|
||||||
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
|
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
|
||||||
@@ -678,6 +741,12 @@ INSERT INTO case_folding (code) VALUES
|
|||||||
(0x26B),
|
(0x26B),
|
||||||
(0x271),
|
(0x271),
|
||||||
(0x27D);
|
(0x27D);
|
||||||
|
INSERT INTO case_folding (code) VALUES
|
||||||
|
(0x0049) /* LATIN CAPITAL LETTER I */,
|
||||||
|
(0x0069) /* LATIN SMALL LETTER I */,
|
||||||
|
(0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */,
|
||||||
|
(0x0131) /* LATIN SMALL LETTER DOTLESS I */
|
||||||
|
;
|
||||||
UPDATE case_folding SET c=CHAR(code USING ucs2);
|
UPDATE case_folding SET c=CHAR(code USING ucs2);
|
||||||
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
|
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
|
||||||
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
||||||
@@ -691,6 +760,10 @@ HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
|||||||
26B C9AB E2B1A2 ɫ
|
26B C9AB E2B1A2 ɫ
|
||||||
271 C9B1 E2B1AE ɱ
|
271 C9B1 E2B1AE ɱ
|
||||||
27D C9BD E2B1A4 ɽ
|
27D C9BD E2B1A4 ɽ
|
||||||
|
49 69 49 I
|
||||||
|
69 69 49 i
|
||||||
|
130 69 C4B0 İ
|
||||||
|
131 C4B1 49 ı
|
||||||
DROP TABLE case_folding;
|
DROP TABLE case_folding;
|
||||||
SET NAMES utf8mb3 COLLATE utf8mb3_myanmar_ci;
|
SET NAMES utf8mb3 COLLATE utf8mb3_myanmar_ci;
|
||||||
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
|
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
|
||||||
@@ -711,6 +784,12 @@ INSERT INTO case_folding (code) VALUES
|
|||||||
(0x26B),
|
(0x26B),
|
||||||
(0x271),
|
(0x271),
|
||||||
(0x27D);
|
(0x27D);
|
||||||
|
INSERT INTO case_folding (code) VALUES
|
||||||
|
(0x0049) /* LATIN CAPITAL LETTER I */,
|
||||||
|
(0x0069) /* LATIN SMALL LETTER I */,
|
||||||
|
(0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */,
|
||||||
|
(0x0131) /* LATIN SMALL LETTER DOTLESS I */
|
||||||
|
;
|
||||||
UPDATE case_folding SET c=CHAR(code USING ucs2);
|
UPDATE case_folding SET c=CHAR(code USING ucs2);
|
||||||
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
|
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
|
||||||
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
||||||
@@ -724,6 +803,10 @@ HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
|||||||
26B C9AB E2B1A2 ɫ
|
26B C9AB E2B1A2 ɫ
|
||||||
271 C9B1 E2B1AE ɱ
|
271 C9B1 E2B1AE ɱ
|
||||||
27D C9BD E2B1A4 ɽ
|
27D C9BD E2B1A4 ɽ
|
||||||
|
49 69 49 I
|
||||||
|
69 69 49 i
|
||||||
|
130 69 C4B0 İ
|
||||||
|
131 C4B1 49 ı
|
||||||
DROP TABLE case_folding;
|
DROP TABLE case_folding;
|
||||||
SET NAMES utf8mb3 COLLATE utf8mb3_thai_520_w2;
|
SET NAMES utf8mb3 COLLATE utf8mb3_thai_520_w2;
|
||||||
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
|
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
|
||||||
@@ -744,6 +827,12 @@ INSERT INTO case_folding (code) VALUES
|
|||||||
(0x26B),
|
(0x26B),
|
||||||
(0x271),
|
(0x271),
|
||||||
(0x27D);
|
(0x27D);
|
||||||
|
INSERT INTO case_folding (code) VALUES
|
||||||
|
(0x0049) /* LATIN CAPITAL LETTER I */,
|
||||||
|
(0x0069) /* LATIN SMALL LETTER I */,
|
||||||
|
(0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */,
|
||||||
|
(0x0131) /* LATIN SMALL LETTER DOTLESS I */
|
||||||
|
;
|
||||||
UPDATE case_folding SET c=CHAR(code USING ucs2);
|
UPDATE case_folding SET c=CHAR(code USING ucs2);
|
||||||
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
|
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
|
||||||
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
||||||
@@ -757,6 +846,10 @@ HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
|||||||
26B C9AB E2B1A2 ɫ
|
26B C9AB E2B1A2 ɫ
|
||||||
271 C9B1 E2B1AE ɱ
|
271 C9B1 E2B1AE ɱ
|
||||||
27D C9BD E2B1A4 ɽ
|
27D C9BD E2B1A4 ɽ
|
||||||
|
49 69 49 I
|
||||||
|
69 69 49 i
|
||||||
|
130 69 C4B0 İ
|
||||||
|
131 C4B1 49 ı
|
||||||
DROP TABLE case_folding;
|
DROP TABLE case_folding;
|
||||||
#
|
#
|
||||||
# End of 10.3 tests
|
# End of 10.3 tests
|
||||||
@@ -1533,3 +1626,55 @@ SET NAMES utf8mb3;
|
|||||||
#
|
#
|
||||||
# End of 10.10 tests
|
# End of 10.10 tests
|
||||||
#
|
#
|
||||||
|
#
|
||||||
|
# Start of 10.10 tests
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# MDEV-30661 UPPER() returns an empty string for U+0251 in uca1400 collations for utf8
|
||||||
|
#
|
||||||
|
SET NAMES utf8mb3 COLLATE utf8mb3_uca1400_ai_ci;
|
||||||
|
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
|
||||||
|
SHOW CREATE TABLE case_folding;
|
||||||
|
Table Create Table
|
||||||
|
case_folding CREATE TABLE `case_folding` (
|
||||||
|
`code` int(1) NOT NULL,
|
||||||
|
`c` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_uca1400_ai_ci DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
||||||
|
INSERT INTO case_folding (code) VALUES
|
||||||
|
(0x23A),
|
||||||
|
(0x23E),
|
||||||
|
(0x23F),
|
||||||
|
(0x240),
|
||||||
|
(0x250),
|
||||||
|
(0x251),
|
||||||
|
(0x252),
|
||||||
|
(0x26B),
|
||||||
|
(0x271),
|
||||||
|
(0x27D);
|
||||||
|
INSERT INTO case_folding (code) VALUES
|
||||||
|
(0x0049) /* LATIN CAPITAL LETTER I */,
|
||||||
|
(0x0069) /* LATIN SMALL LETTER I */,
|
||||||
|
(0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */,
|
||||||
|
(0x0131) /* LATIN SMALL LETTER DOTLESS I */
|
||||||
|
;
|
||||||
|
UPDATE case_folding SET c=CHAR(code USING ucs2);
|
||||||
|
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
|
||||||
|
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
||||||
|
23A E2B1A5 C8BA Ⱥ
|
||||||
|
23E E2B1A6 C8BE Ⱦ
|
||||||
|
23F C8BF E2B1BE ȿ
|
||||||
|
240 C980 E2B1BF ɀ
|
||||||
|
250 C990 E2B1AF ɐ
|
||||||
|
251 C991 E2B1AD ɑ
|
||||||
|
252 C992 E2B1B0 ɒ
|
||||||
|
26B C9AB E2B1A2 ɫ
|
||||||
|
271 C9B1 E2B1AE ɱ
|
||||||
|
27D C9BD E2B1A4 ɽ
|
||||||
|
49 69 49 I
|
||||||
|
69 69 49 i
|
||||||
|
130 69 C4B0 İ
|
||||||
|
131 C4B1 49 ı
|
||||||
|
DROP TABLE case_folding;
|
||||||
|
#
|
||||||
|
# End of 10.10 tests
|
||||||
|
#
|
||||||
|
@@ -34,6 +34,9 @@ SET NAMES utf8 COLLATE utf8_unicode_nopad_ci;
|
|||||||
SET NAMES utf8mb3 COLLATE utf8mb3_unicode_ci /*Unicode-4.0 folding*/;
|
SET NAMES utf8mb3 COLLATE utf8mb3_unicode_ci /*Unicode-4.0 folding*/;
|
||||||
--source include/ctype_casefolding.inc
|
--source include/ctype_casefolding.inc
|
||||||
|
|
||||||
|
SET NAMES utf8mb3 COLLATE utf8mb3_turkish_ci /*Unicode-4.0 folding, with Turkish mapping for I */;
|
||||||
|
--source include/ctype_casefolding.inc
|
||||||
|
|
||||||
SET NAMES utf8mb3 COLLATE utf8mb3_unicode_520_ci;
|
SET NAMES utf8mb3 COLLATE utf8mb3_unicode_520_ci;
|
||||||
--source include/ctype_casefolding.inc
|
--source include/ctype_casefolding.inc
|
||||||
|
|
||||||
@@ -79,3 +82,19 @@ SET NAMES utf8mb3;
|
|||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.10 tests
|
--echo # End of 10.10 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Start of 10.10 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-30661 UPPER() returns an empty string for U+0251 in uca1400 collations for utf8
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET NAMES utf8mb3 COLLATE utf8mb3_uca1400_ai_ci;
|
||||||
|
--source include/ctype_casefolding.inc
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.10 tests
|
||||||
|
--echo #
|
||||||
|
1427
mysql-test/main/ctype_utf8mb3_general_ci_casefold.result
Normal file
1427
mysql-test/main/ctype_utf8mb3_general_ci_casefold.result
Normal file
File diff suppressed because it is too large
Load Diff
14
mysql-test/main/ctype_utf8mb3_general_ci_casefold.test
Normal file
14
mysql-test/main/ctype_utf8mb3_general_ci_casefold.test
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
--echo #
|
||||||
|
--echo # Start of 10.7 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET NAMES utf8mb3 COLLATE utf8mb3_general_ci;
|
||||||
|
--source include/ctype_unicode_casefold_bmp.inc
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.7 tests
|
||||||
|
--echo #
|
1143
mysql-test/main/ctype_utf8mb3_general_ci_ws.result
Normal file
1143
mysql-test/main/ctype_utf8mb3_general_ci_ws.result
Normal file
File diff suppressed because it is too large
Load Diff
14
mysql-test/main/ctype_utf8mb3_general_ci_ws.test
Normal file
14
mysql-test/main/ctype_utf8mb3_general_ci_ws.test
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
--echo #
|
||||||
|
--echo # Start of 10.7 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET NAMES utf8mb3 COLLATE utf8mb3_general_ci;
|
||||||
|
--source include/ctype_unicode_ws_bmp.inc
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.7 tests
|
||||||
|
--echo #
|
1427
mysql-test/main/ctype_utf8mb3_general_mysql500_ci_casefold.result
Normal file
1427
mysql-test/main/ctype_utf8mb3_general_mysql500_ci_casefold.result
Normal file
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,15 @@
|
|||||||
|
--echo #
|
||||||
|
--echo # Start of 10.7 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET NAMES utf8mb3 COLLATE utf8mb3_general_mysql500_ci;
|
||||||
|
--source include/ctype_unicode_casefold_bmp.inc
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.7 tests
|
||||||
|
--echo #
|
1142
mysql-test/main/ctype_utf8mb3_general_mysql500_ci_ws.result
Normal file
1142
mysql-test/main/ctype_utf8mb3_general_mysql500_ci_ws.result
Normal file
File diff suppressed because it is too large
Load Diff
15
mysql-test/main/ctype_utf8mb3_general_mysql500_ci_ws.test
Normal file
15
mysql-test/main/ctype_utf8mb3_general_mysql500_ci_ws.test
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
--echo #
|
||||||
|
--echo # Start of 10.7 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET NAMES utf8mb3 COLLATE utf8mb3_general_mysql500_ci;
|
||||||
|
--source include/ctype_unicode_ws_bmp.inc
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.7 tests
|
||||||
|
--echo #
|
1427
mysql-test/main/ctype_utf8mb3_turkish_ci_casefold.result
Normal file
1427
mysql-test/main/ctype_utf8mb3_turkish_ci_casefold.result
Normal file
File diff suppressed because it is too large
Load Diff
14
mysql-test/main/ctype_utf8mb3_turkish_ci_casefold.test
Normal file
14
mysql-test/main/ctype_utf8mb3_turkish_ci_casefold.test
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
--echo #
|
||||||
|
--echo # Start of 10.7 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET NAMES utf8mb3 COLLATE utf8mb3_turkish_ci;
|
||||||
|
--source include/ctype_unicode_casefold_bmp.inc
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.7 tests
|
||||||
|
--echo #
|
2011
mysql-test/main/ctype_utf8mb3_unicode_520_ci_casefold.result
Normal file
2011
mysql-test/main/ctype_utf8mb3_unicode_520_ci_casefold.result
Normal file
File diff suppressed because it is too large
Load Diff
14
mysql-test/main/ctype_utf8mb3_unicode_520_ci_casefold.test
Normal file
14
mysql-test/main/ctype_utf8mb3_unicode_520_ci_casefold.test
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
--echo #
|
||||||
|
--echo # Start of 10.7 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET NAMES utf8mb3 COLLATE utf8mb3_unicode_520_ci;
|
||||||
|
--source include/ctype_unicode_casefold_bmp.inc
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.7 tests
|
||||||
|
--echo #
|
1446
mysql-test/main/ctype_utf8mb4_general_ci_casefold.result
Normal file
1446
mysql-test/main/ctype_utf8mb4_general_ci_casefold.result
Normal file
File diff suppressed because it is too large
Load Diff
15
mysql-test/main/ctype_utf8mb4_general_ci_casefold.test
Normal file
15
mysql-test/main/ctype_utf8mb4_general_ci_casefold.test
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
--echo #
|
||||||
|
--echo # Start of 10.7 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET NAMES utf8mb4 COLLATE utf8mb4_general_ci;
|
||||||
|
--source include/ctype_unicode_casefold_bmp.inc
|
||||||
|
--source include/ctype_unicode_casefold_supplementary.inc
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.7 tests
|
||||||
|
--echo #
|
1160
mysql-test/main/ctype_utf8mb4_general_ci_ws.result
Normal file
1160
mysql-test/main/ctype_utf8mb4_general_ci_ws.result
Normal file
File diff suppressed because it is too large
Load Diff
16
mysql-test/main/ctype_utf8mb4_general_ci_ws.test
Normal file
16
mysql-test/main/ctype_utf8mb4_general_ci_ws.test
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
--echo #
|
||||||
|
--echo # Start of 10.7 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET NAMES utf8mb4 COLLATE utf8mb4_general_ci;
|
||||||
|
--source include/ctype_unicode_ws_bmp.inc
|
||||||
|
--source include/ctype_unicode_ws_supplementary.inc
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.7 tests
|
||||||
|
--echo #
|
1446
mysql-test/main/ctype_utf8mb4_turkish_ci_casefold.result
Normal file
1446
mysql-test/main/ctype_utf8mb4_turkish_ci_casefold.result
Normal file
File diff suppressed because it is too large
Load Diff
15
mysql-test/main/ctype_utf8mb4_turkish_ci_casefold.test
Normal file
15
mysql-test/main/ctype_utf8mb4_turkish_ci_casefold.test
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
--echo #
|
||||||
|
--echo # Start of 10.7 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET NAMES utf8mb4 COLLATE utf8mb4_turkish_ci;
|
||||||
|
--source include/ctype_unicode_casefold_bmp.inc
|
||||||
|
--source include/ctype_unicode_casefold_supplementary.inc
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.7 tests
|
||||||
|
--echo #
|
@@ -6630,6 +6630,12 @@ INSERT INTO case_folding (code) VALUES
|
|||||||
(0x26B),
|
(0x26B),
|
||||||
(0x271),
|
(0x271),
|
||||||
(0x27D);
|
(0x27D);
|
||||||
|
INSERT INTO case_folding (code) VALUES
|
||||||
|
(0x0049) /* LATIN CAPITAL LETTER I */,
|
||||||
|
(0x0069) /* LATIN SMALL LETTER I */,
|
||||||
|
(0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */,
|
||||||
|
(0x0131) /* LATIN SMALL LETTER DOTLESS I */
|
||||||
|
;
|
||||||
UPDATE case_folding SET c=CHAR(code USING ucs2);
|
UPDATE case_folding SET c=CHAR(code USING ucs2);
|
||||||
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
|
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
|
||||||
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
||||||
@@ -6643,6 +6649,53 @@ HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
|||||||
26B C9AB C9AB ɫ
|
26B C9AB C9AB ɫ
|
||||||
271 C9B1 C9B1 ɱ
|
271 C9B1 C9B1 ɱ
|
||||||
27D C9BD C9BD ɽ
|
27D C9BD C9BD ɽ
|
||||||
|
49 69 49 I
|
||||||
|
69 69 49 i
|
||||||
|
130 69 C4B0 İ
|
||||||
|
131 C4B1 49 ı
|
||||||
|
DROP TABLE case_folding;
|
||||||
|
SET NAMES utf8mb4 COLLATE utf8mb4_turkish_ci /*Unicode-4.0 folding with Turkish mapping for I */;
|
||||||
|
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
|
||||||
|
SHOW CREATE TABLE case_folding;
|
||||||
|
Table Create Table
|
||||||
|
case_folding CREATE TABLE `case_folding` (
|
||||||
|
`code` int(1) NOT NULL,
|
||||||
|
`c` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_turkish_ci DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
||||||
|
INSERT INTO case_folding (code) VALUES
|
||||||
|
(0x23A),
|
||||||
|
(0x23E),
|
||||||
|
(0x23F),
|
||||||
|
(0x240),
|
||||||
|
(0x250),
|
||||||
|
(0x251),
|
||||||
|
(0x252),
|
||||||
|
(0x26B),
|
||||||
|
(0x271),
|
||||||
|
(0x27D);
|
||||||
|
INSERT INTO case_folding (code) VALUES
|
||||||
|
(0x0049) /* LATIN CAPITAL LETTER I */,
|
||||||
|
(0x0069) /* LATIN SMALL LETTER I */,
|
||||||
|
(0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */,
|
||||||
|
(0x0131) /* LATIN SMALL LETTER DOTLESS I */
|
||||||
|
;
|
||||||
|
UPDATE case_folding SET c=CHAR(code USING ucs2);
|
||||||
|
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
|
||||||
|
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
||||||
|
23A C8BA C8BA Ⱥ
|
||||||
|
23E C8BE C8BE Ⱦ
|
||||||
|
23F C8BF C8BF ȿ
|
||||||
|
240 C980 C980 ɀ
|
||||||
|
250 C990 C990 ɐ
|
||||||
|
251 C991 C991 ɑ
|
||||||
|
252 C992 C992 ɒ
|
||||||
|
26B C9AB C9AB ɫ
|
||||||
|
271 C9B1 C9B1 ɱ
|
||||||
|
27D C9BD C9BD ɽ
|
||||||
|
49 C4B1 49 I
|
||||||
|
69 69 C4B0 i
|
||||||
|
130 69 C4B0 İ
|
||||||
|
131 C4B1 49 ı
|
||||||
DROP TABLE case_folding;
|
DROP TABLE case_folding;
|
||||||
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_520_ci;
|
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_520_ci;
|
||||||
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
|
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
|
||||||
@@ -6663,6 +6716,12 @@ INSERT INTO case_folding (code) VALUES
|
|||||||
(0x26B),
|
(0x26B),
|
||||||
(0x271),
|
(0x271),
|
||||||
(0x27D);
|
(0x27D);
|
||||||
|
INSERT INTO case_folding (code) VALUES
|
||||||
|
(0x0049) /* LATIN CAPITAL LETTER I */,
|
||||||
|
(0x0069) /* LATIN SMALL LETTER I */,
|
||||||
|
(0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */,
|
||||||
|
(0x0131) /* LATIN SMALL LETTER DOTLESS I */
|
||||||
|
;
|
||||||
UPDATE case_folding SET c=CHAR(code USING ucs2);
|
UPDATE case_folding SET c=CHAR(code USING ucs2);
|
||||||
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
|
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
|
||||||
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
||||||
@@ -6676,6 +6735,10 @@ HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
|||||||
26B C9AB E2B1A2 ɫ
|
26B C9AB E2B1A2 ɫ
|
||||||
271 C9B1 E2B1AE ɱ
|
271 C9B1 E2B1AE ɱ
|
||||||
27D C9BD E2B1A4 ɽ
|
27D C9BD E2B1A4 ɽ
|
||||||
|
49 69 49 I
|
||||||
|
69 69 49 i
|
||||||
|
130 69 C4B0 İ
|
||||||
|
131 C4B1 49 ı
|
||||||
DROP TABLE case_folding;
|
DROP TABLE case_folding;
|
||||||
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_520_nopad_ci;
|
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_520_nopad_ci;
|
||||||
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
|
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
|
||||||
@@ -6696,6 +6759,12 @@ INSERT INTO case_folding (code) VALUES
|
|||||||
(0x26B),
|
(0x26B),
|
||||||
(0x271),
|
(0x271),
|
||||||
(0x27D);
|
(0x27D);
|
||||||
|
INSERT INTO case_folding (code) VALUES
|
||||||
|
(0x0049) /* LATIN CAPITAL LETTER I */,
|
||||||
|
(0x0069) /* LATIN SMALL LETTER I */,
|
||||||
|
(0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */,
|
||||||
|
(0x0131) /* LATIN SMALL LETTER DOTLESS I */
|
||||||
|
;
|
||||||
UPDATE case_folding SET c=CHAR(code USING ucs2);
|
UPDATE case_folding SET c=CHAR(code USING ucs2);
|
||||||
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
|
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
|
||||||
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
||||||
@@ -6709,6 +6778,10 @@ HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
|||||||
26B C9AB E2B1A2 ɫ
|
26B C9AB E2B1A2 ɫ
|
||||||
271 C9B1 E2B1AE ɱ
|
271 C9B1 E2B1AE ɱ
|
||||||
27D C9BD E2B1A4 ɽ
|
27D C9BD E2B1A4 ɽ
|
||||||
|
49 69 49 I
|
||||||
|
69 69 49 i
|
||||||
|
130 69 C4B0 İ
|
||||||
|
131 C4B1 49 ı
|
||||||
DROP TABLE case_folding;
|
DROP TABLE case_folding;
|
||||||
SET NAMES utf8mb4 COLLATE utf8mb4_myanmar_ci;
|
SET NAMES utf8mb4 COLLATE utf8mb4_myanmar_ci;
|
||||||
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
|
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
|
||||||
@@ -6729,6 +6802,12 @@ INSERT INTO case_folding (code) VALUES
|
|||||||
(0x26B),
|
(0x26B),
|
||||||
(0x271),
|
(0x271),
|
||||||
(0x27D);
|
(0x27D);
|
||||||
|
INSERT INTO case_folding (code) VALUES
|
||||||
|
(0x0049) /* LATIN CAPITAL LETTER I */,
|
||||||
|
(0x0069) /* LATIN SMALL LETTER I */,
|
||||||
|
(0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */,
|
||||||
|
(0x0131) /* LATIN SMALL LETTER DOTLESS I */
|
||||||
|
;
|
||||||
UPDATE case_folding SET c=CHAR(code USING ucs2);
|
UPDATE case_folding SET c=CHAR(code USING ucs2);
|
||||||
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
|
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
|
||||||
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
||||||
@@ -6742,6 +6821,10 @@ HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
|||||||
26B C9AB E2B1A2 ɫ
|
26B C9AB E2B1A2 ɫ
|
||||||
271 C9B1 E2B1AE ɱ
|
271 C9B1 E2B1AE ɱ
|
||||||
27D C9BD E2B1A4 ɽ
|
27D C9BD E2B1A4 ɽ
|
||||||
|
49 69 49 I
|
||||||
|
69 69 49 i
|
||||||
|
130 69 C4B0 İ
|
||||||
|
131 C4B1 49 ı
|
||||||
DROP TABLE case_folding;
|
DROP TABLE case_folding;
|
||||||
SET NAMES utf8mb4 COLLATE utf8mb4_thai_520_w2;
|
SET NAMES utf8mb4 COLLATE utf8mb4_thai_520_w2;
|
||||||
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
|
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
|
||||||
@@ -6762,6 +6845,12 @@ INSERT INTO case_folding (code) VALUES
|
|||||||
(0x26B),
|
(0x26B),
|
||||||
(0x271),
|
(0x271),
|
||||||
(0x27D);
|
(0x27D);
|
||||||
|
INSERT INTO case_folding (code) VALUES
|
||||||
|
(0x0049) /* LATIN CAPITAL LETTER I */,
|
||||||
|
(0x0069) /* LATIN SMALL LETTER I */,
|
||||||
|
(0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */,
|
||||||
|
(0x0131) /* LATIN SMALL LETTER DOTLESS I */
|
||||||
|
;
|
||||||
UPDATE case_folding SET c=CHAR(code USING ucs2);
|
UPDATE case_folding SET c=CHAR(code USING ucs2);
|
||||||
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
|
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
|
||||||
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
||||||
@@ -6775,6 +6864,10 @@ HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
|||||||
26B C9AB E2B1A2 ɫ
|
26B C9AB E2B1A2 ɫ
|
||||||
271 C9B1 E2B1AE ɱ
|
271 C9B1 E2B1AE ɱ
|
||||||
27D C9BD E2B1A4 ɽ
|
27D C9BD E2B1A4 ɽ
|
||||||
|
49 69 49 I
|
||||||
|
69 69 49 i
|
||||||
|
130 69 C4B0 İ
|
||||||
|
131 C4B1 49 ı
|
||||||
DROP TABLE case_folding;
|
DROP TABLE case_folding;
|
||||||
#
|
#
|
||||||
# End of 10.3 tests
|
# End of 10.3 tests
|
||||||
@@ -11379,5 +11472,51 @@ DROP TABLE t1;
|
|||||||
DROP PROCEDURE exec_verbose;
|
DROP PROCEDURE exec_verbose;
|
||||||
DROP PROCEDURE test_styles;
|
DROP PROCEDURE test_styles;
|
||||||
#
|
#
|
||||||
|
# MDEV-30661 UPPER() returns an empty string for U+0251 in uca1400 collations for utf8
|
||||||
|
#
|
||||||
|
SET NAMES utf8mb4 COLLATE utf8mb4_uca1400_ai_ci;
|
||||||
|
CREATE OR REPLACE TABLE case_folding AS SELECT 0 AS code, SPACE(32) AS c LIMIT 0;
|
||||||
|
SHOW CREATE TABLE case_folding;
|
||||||
|
Table Create Table
|
||||||
|
case_folding CREATE TABLE `case_folding` (
|
||||||
|
`code` int(1) NOT NULL,
|
||||||
|
`c` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_uca1400_ai_ci DEFAULT NULL
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
||||||
|
INSERT INTO case_folding (code) VALUES
|
||||||
|
(0x23A),
|
||||||
|
(0x23E),
|
||||||
|
(0x23F),
|
||||||
|
(0x240),
|
||||||
|
(0x250),
|
||||||
|
(0x251),
|
||||||
|
(0x252),
|
||||||
|
(0x26B),
|
||||||
|
(0x271),
|
||||||
|
(0x27D);
|
||||||
|
INSERT INTO case_folding (code) VALUES
|
||||||
|
(0x0049) /* LATIN CAPITAL LETTER I */,
|
||||||
|
(0x0069) /* LATIN SMALL LETTER I */,
|
||||||
|
(0x0130) /* LATIN CAPITAL LETTER I WITH DOT ABOVE */,
|
||||||
|
(0x0131) /* LATIN SMALL LETTER DOTLESS I */
|
||||||
|
;
|
||||||
|
UPDATE case_folding SET c=CHAR(code USING ucs2);
|
||||||
|
SELECT HEX(code), HEX(LOWER(c)), HEX(UPPER(c)), c FROM case_folding;
|
||||||
|
HEX(code) HEX(LOWER(c)) HEX(UPPER(c)) c
|
||||||
|
23A E2B1A5 C8BA Ⱥ
|
||||||
|
23E E2B1A6 C8BE Ⱦ
|
||||||
|
23F C8BF E2B1BE ȿ
|
||||||
|
240 C980 E2B1BF ɀ
|
||||||
|
250 C990 E2B1AF ɐ
|
||||||
|
251 C991 E2B1AD ɑ
|
||||||
|
252 C992 E2B1B0 ɒ
|
||||||
|
26B C9AB E2B1A2 ɫ
|
||||||
|
271 C9B1 E2B1AE ɱ
|
||||||
|
27D C9BD E2B1A4 ɽ
|
||||||
|
49 69 49 I
|
||||||
|
69 69 49 i
|
||||||
|
130 69 C4B0 İ
|
||||||
|
131 C4B1 49 ı
|
||||||
|
DROP TABLE case_folding;
|
||||||
|
#
|
||||||
# End of 10.10 tests
|
# End of 10.10 tests
|
||||||
#
|
#
|
||||||
|
@@ -121,6 +121,9 @@ SET NAMES utf8mb4;
|
|||||||
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci /*Unicode-4.0 folding*/;
|
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci /*Unicode-4.0 folding*/;
|
||||||
--source include/ctype_casefolding.inc
|
--source include/ctype_casefolding.inc
|
||||||
|
|
||||||
|
SET NAMES utf8mb4 COLLATE utf8mb4_turkish_ci /*Unicode-4.0 folding with Turkish mapping for I */;
|
||||||
|
--source include/ctype_casefolding.inc
|
||||||
|
|
||||||
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_520_ci;
|
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_520_ci;
|
||||||
--source include/ctype_casefolding.inc
|
--source include/ctype_casefolding.inc
|
||||||
|
|
||||||
@@ -426,6 +429,13 @@ DROP TABLE t1;
|
|||||||
DROP PROCEDURE exec_verbose;
|
DROP PROCEDURE exec_verbose;
|
||||||
DROP PROCEDURE test_styles;
|
DROP PROCEDURE test_styles;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-30661 UPPER() returns an empty string for U+0251 in uca1400 collations for utf8
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET NAMES utf8mb4 COLLATE utf8mb4_uca1400_ai_ci;
|
||||||
|
--source include/ctype_casefolding.inc
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.10 tests
|
--echo # End of 10.10 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
2110
mysql-test/main/ctype_utf8mb4_unicode_520_ci_casefold.result
Normal file
2110
mysql-test/main/ctype_utf8mb4_unicode_520_ci_casefold.result
Normal file
File diff suppressed because it is too large
Load Diff
15
mysql-test/main/ctype_utf8mb4_unicode_520_ci_casefold.test
Normal file
15
mysql-test/main/ctype_utf8mb4_unicode_520_ci_casefold.test
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
--echo #
|
||||||
|
--echo # Start of 10.7 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_520_ci;
|
||||||
|
--source include/ctype_unicode_casefold_bmp.inc
|
||||||
|
--source include/ctype_unicode_casefold_supplementary.inc
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.7 tests
|
||||||
|
--echo #
|
1446
mysql-test/main/ctype_utf8mb4_unicode_ci_casefold.result
Normal file
1446
mysql-test/main/ctype_utf8mb4_unicode_ci_casefold.result
Normal file
File diff suppressed because it is too large
Load Diff
15
mysql-test/main/ctype_utf8mb4_unicode_ci_casefold.test
Normal file
15
mysql-test/main/ctype_utf8mb4_unicode_ci_casefold.test
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
--echo #
|
||||||
|
--echo # Start of 10.7 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-30716 Wrong casefolding in xxx_unicode_520_ci for U+0700..U+07FF
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
|
||||||
|
--source include/ctype_unicode_casefold_bmp.inc
|
||||||
|
--source include/ctype_unicode_casefold_supplementary.inc
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.7 tests
|
||||||
|
--echo #
|
@@ -1,7 +1,11 @@
|
|||||||
|
SET @save_frequency=@@GLOBAL.innodb_purge_rseg_truncate_frequency;
|
||||||
|
SET @save_dbug=@@GLOBAL.debug_dbug;
|
||||||
|
SET GLOBAL innodb_purge_rseg_truncate_frequency=1;
|
||||||
CREATE TABLE t1(f1 INT NOT NULL, f2 int not null,
|
CREATE TABLE t1(f1 INT NOT NULL, f2 int not null,
|
||||||
f3 int generated always as (f2 * 2) VIRTUAL,
|
f3 int generated always as (f2 * 2) VIRTUAL,
|
||||||
primary key(f1), INDEX (f3))ENGINE=InnoDB;
|
primary key(f1), INDEX (f3))ENGINE=InnoDB;
|
||||||
connect con1,localhost,root,,,;
|
connect con1,localhost,root,,,;
|
||||||
|
InnoDB 0 transactions not purged
|
||||||
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
||||||
connection default;
|
connection default;
|
||||||
INSERT INTO t1(f1, f2) VALUES(1,2);
|
INSERT INTO t1(f1, f2) VALUES(1,2);
|
||||||
@@ -18,5 +22,6 @@ commit;
|
|||||||
disconnect con1;
|
disconnect con1;
|
||||||
disconnect con2;
|
disconnect con2;
|
||||||
connection default;
|
connection default;
|
||||||
set global debug_dbug=default;
|
SET GLOBAL innodb_purge_rseg_truncate_frequency=@save_frequency;
|
||||||
|
SET GLOBAL debug_dbug=@save_dbug;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
@@ -1,9 +1,14 @@
|
|||||||
--source include/have_innodb.inc
|
--source include/have_innodb.inc
|
||||||
--source include/have_debug.inc
|
--source include/have_debug.inc
|
||||||
|
|
||||||
|
SET @save_frequency=@@GLOBAL.innodb_purge_rseg_truncate_frequency;
|
||||||
|
SET @save_dbug=@@GLOBAL.debug_dbug;
|
||||||
|
SET GLOBAL innodb_purge_rseg_truncate_frequency=1;
|
||||||
CREATE TABLE t1(f1 INT NOT NULL, f2 int not null,
|
CREATE TABLE t1(f1 INT NOT NULL, f2 int not null,
|
||||||
f3 int generated always as (f2 * 2) VIRTUAL,
|
f3 int generated always as (f2 * 2) VIRTUAL,
|
||||||
primary key(f1), INDEX (f3))ENGINE=InnoDB;
|
primary key(f1), INDEX (f3))ENGINE=InnoDB;
|
||||||
connect(con1,localhost,root,,,);
|
connect(con1,localhost,root,,,);
|
||||||
|
--source ../innodb/include/wait_all_purged.inc
|
||||||
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
||||||
|
|
||||||
connection default;
|
connection default;
|
||||||
@@ -26,5 +31,6 @@ commit;
|
|||||||
disconnect con1;
|
disconnect con1;
|
||||||
disconnect con2;
|
disconnect con2;
|
||||||
connection default;
|
connection default;
|
||||||
set global debug_dbug=default;
|
SET GLOBAL innodb_purge_rseg_truncate_frequency=@save_frequency;
|
||||||
|
SET GLOBAL debug_dbug=@save_dbug;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
@@ -1,4 +1,7 @@
|
|||||||
|
SET @save_freq=@@GLOBAL.innodb_purge_rseg_truncate_frequency;
|
||||||
|
SET GLOBAL innodb_purge_rseg_truncate_frequency=1;
|
||||||
CREATE TABLE t (a int PRIMARY KEY, b int NOT NULL UNIQUE) engine = InnoDB;
|
CREATE TABLE t (a int PRIMARY KEY, b int NOT NULL UNIQUE) engine = InnoDB;
|
||||||
|
InnoDB 0 transactions not purged
|
||||||
connect prevent_purge,localhost,root,,;
|
connect prevent_purge,localhost,root,,;
|
||||||
start transaction with consistent snapshot;
|
start transaction with consistent snapshot;
|
||||||
connect con_del_1,localhost,root,,;
|
connect con_del_1,localhost,root,,;
|
||||||
@@ -34,3 +37,4 @@ disconnect con_del_2;
|
|||||||
connection default;
|
connection default;
|
||||||
SET DEBUG_SYNC = 'RESET';
|
SET DEBUG_SYNC = 'RESET';
|
||||||
DROP TABLE t;
|
DROP TABLE t;
|
||||||
|
SET GLOBAL innodb_purge_rseg_truncate_frequency=@save_freq;
|
||||||
|
@@ -7,6 +7,7 @@ SET GLOBAL innodb_purge_rseg_truncate_frequency = 1;
|
|||||||
SET GLOBAL innodb_purge_rseg_truncate_frequency = 1;
|
SET GLOBAL innodb_purge_rseg_truncate_frequency = 1;
|
||||||
CREATE TABLE t1(a INT PRIMARY KEY, b INT NOT NULL)
|
CREATE TABLE t1(a INT PRIMARY KEY, b INT NOT NULL)
|
||||||
ROW_FORMAT=REDUNDANT ENGINE=InnoDB;
|
ROW_FORMAT=REDUNDANT ENGINE=InnoDB;
|
||||||
|
InnoDB 0 transactions not purged
|
||||||
connect prevent_purge,localhost,root;
|
connect prevent_purge,localhost,root;
|
||||||
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
||||||
connection default;
|
connection default;
|
||||||
@@ -19,7 +20,11 @@ UPDATE t1 SET b=4 WHERE a=3;
|
|||||||
disconnect prevent_purge;
|
disconnect prevent_purge;
|
||||||
connection default;
|
connection default;
|
||||||
InnoDB 0 transactions not purged
|
InnoDB 0 transactions not purged
|
||||||
|
connection con1;
|
||||||
|
ROLLBACK;
|
||||||
disconnect con1;
|
disconnect con1;
|
||||||
|
connection default;
|
||||||
|
InnoDB 0 transactions not purged
|
||||||
FLUSH TABLE t1 FOR EXPORT;
|
FLUSH TABLE t1 FOR EXPORT;
|
||||||
Clustered index root page contents:
|
Clustered index root page contents:
|
||||||
N_RECS=3; LEVEL=0
|
N_RECS=3; LEVEL=0
|
||||||
|
@@ -3,6 +3,7 @@ SET GLOBAL innodb_purge_rseg_truncate_frequency=1;
|
|||||||
CREATE TABLE t1(id INT PRIMARY key, val VARCHAR(16000)) ENGINE=InnoDB;
|
CREATE TABLE t1(id INT PRIMARY key, val VARCHAR(16000)) ENGINE=InnoDB;
|
||||||
INSERT INTO t1 (id,val) SELECT 2*seq,'x' FROM seq_0_to_1023;
|
INSERT INTO t1 (id,val) SELECT 2*seq,'x' FROM seq_0_to_1023;
|
||||||
connect con1,localhost,root,,;
|
connect con1,localhost,root,,;
|
||||||
|
InnoDB 0 transactions not purged
|
||||||
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
||||||
connection default;
|
connection default;
|
||||||
DELETE FROM t1 WHERE id=1788;
|
DELETE FROM t1 WHERE id=1788;
|
||||||
|
@@ -9,12 +9,10 @@ SET GLOBAL innodb_purge_rseg_truncate_frequency= 1;
|
|||||||
CREATE PROCEDURE insert_n(start int, end int)
|
CREATE PROCEDURE insert_n(start int, end int)
|
||||||
BEGIN
|
BEGIN
|
||||||
DECLARE i INT DEFAULT start;
|
DECLARE i INT DEFAULT start;
|
||||||
START TRANSACTION;
|
|
||||||
WHILE i <= end do
|
WHILE i <= end do
|
||||||
INSERT INTO t1 VALUES (1, 2, 3) ON DUPLICATE KEY UPDATE c = i;
|
INSERT INTO t1 VALUES (1, 2, 3) ON DUPLICATE KEY UPDATE c = i;
|
||||||
SET i = i + 1;
|
SET i = i + 1;
|
||||||
END WHILE;
|
END WHILE;
|
||||||
COMMIT;
|
|
||||||
END~~
|
END~~
|
||||||
CREATE FUNCTION num_pages_get()
|
CREATE FUNCTION num_pages_get()
|
||||||
RETURNS INT
|
RETURNS INT
|
||||||
@@ -30,6 +28,7 @@ END~~
|
|||||||
#
|
#
|
||||||
CREATE TABLE t1 (a INT, b INT, c INT, PRIMARY KEY(a,b), KEY (b,c))
|
CREATE TABLE t1 (a INT, b INT, c INT, PRIMARY KEY(a,b), KEY (b,c))
|
||||||
ENGINE=InnoDB STATS_PERSISTENT=0;
|
ENGINE=InnoDB STATS_PERSISTENT=0;
|
||||||
|
InnoDB 0 transactions not purged
|
||||||
BEGIN;
|
BEGIN;
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
a b c
|
a b c
|
||||||
@@ -38,20 +37,24 @@ a b c
|
|||||||
#
|
#
|
||||||
connect con2, localhost, root,,;
|
connect con2, localhost, root,,;
|
||||||
connection con2;
|
connection con2;
|
||||||
|
BEGIN;
|
||||||
INSERT INTO t1 VALUES (1, 2, 3) ON DUPLICATE KEY UPDATE c = NULL;
|
INSERT INTO t1 VALUES (1, 2, 3) ON DUPLICATE KEY UPDATE c = NULL;
|
||||||
CALL insert_n(1, 50);;
|
CALL insert_n(1, 50);;
|
||||||
connect con3, localhost, root,,;
|
connect con3, localhost, root,,;
|
||||||
connection con3;
|
connection con3;
|
||||||
|
BEGIN;
|
||||||
CALL insert_n(51, 100);;
|
CALL insert_n(51, 100);;
|
||||||
connection con2;
|
connection con2;
|
||||||
|
COMMIT;
|
||||||
connection con3;
|
connection con3;
|
||||||
INSERT INTO t1 VALUES (1, 2, 1) ON DUPLICATE KEY UPDATE c = NULL;
|
INSERT INTO t1 VALUES (1, 2, 1) ON DUPLICATE KEY UPDATE c = NULL;
|
||||||
|
COMMIT;
|
||||||
connection default;
|
connection default;
|
||||||
#
|
#
|
||||||
# Connect to default and record how many pages were accessed
|
# Connect to default and record how many pages were accessed
|
||||||
# when selecting the record using the secondary key.
|
# when selecting the record using the secondary key.
|
||||||
#
|
#
|
||||||
InnoDB 4 transactions not purged
|
InnoDB 2 transactions not purged
|
||||||
SET @num_pages_1 = num_pages_get();
|
SET @num_pages_1 = num_pages_get();
|
||||||
SELECT * FROM t1 force index (b);
|
SELECT * FROM t1 force index (b);
|
||||||
a b c
|
a b c
|
||||||
|
34
mysql-test/suite/innodb/r/lock_move_wait_lock_race.result
Normal file
34
mysql-test/suite/innodb/r/lock_move_wait_lock_race.result
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
CREATE TABLE t (pk int PRIMARY KEY, c varchar(10)) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t VALUES (10, "0123456789");
|
||||||
|
connection default;
|
||||||
|
BEGIN;
|
||||||
|
SELECT * FROM t WHERE c = 10 FOR UPDATE;
|
||||||
|
pk c
|
||||||
|
connect trx2, localhost,root,,;
|
||||||
|
BEGIN;
|
||||||
|
SET DEBUG_SYNC="lock_wait_start SIGNAL trx2_start_waiting";
|
||||||
|
SET DEBUG_SYNC="lock_wait_end SIGNAL trx2_wait_end WAIT_FOR trx2_cont_upd";
|
||||||
|
SET DEBUG_SYNC="lock_rec_store_on_page_infimum_end SIGNAL trx2_moved_locks WAIT_FOR trx2_cont";
|
||||||
|
UPDATE t SET c = NULL WHERE pk = 10;
|
||||||
|
connect trx3, localhost,root,,;
|
||||||
|
SET DEBUG_SYNC="now WAIT_FOR trx2_start_waiting";
|
||||||
|
SET innodb_lock_wait_timeout=1;
|
||||||
|
BEGIN;
|
||||||
|
SET DEBUG_SYNC="lock_wait_start SIGNAL trx3_start_waiting WAIT_FOR trx3_cont_waiting";
|
||||||
|
SET DEBUG_SYNC="lock_sys_t_cancel_enter SIGNAL trx3_cancel_enter WAIT_FOR trx3_cont_cancel_waiting";
|
||||||
|
UPDATE t SET c = "abcdefghij" WHERE pk = 10;
|
||||||
|
connection default;
|
||||||
|
SET DEBUG_SYNC="now WAIT_FOR trx3_start_waiting";
|
||||||
|
COMMIT;
|
||||||
|
SET DEBUG_SYNC="now WAIT_FOR trx2_wait_end";
|
||||||
|
SET DEBUG_SYNC="now SIGNAL trx3_cont_waiting";
|
||||||
|
SET DEBUG_SYNC="now WAIT_FOR trx3_cancel_enter";
|
||||||
|
SET DEBUG_SYNC="now SIGNAL trx2_cont_upd";
|
||||||
|
SET DEBUG_SYNC="now WAIT_FOR trx2_moved_locks";
|
||||||
|
SET DEBUG_SYNC="now SIGNAL trx3_cont_cancel_waiting";
|
||||||
|
SET DEBUG_SYNC="now SIGNAL trx2_cont";
|
||||||
|
disconnect trx2;
|
||||||
|
disconnect trx3;
|
||||||
|
connection default;
|
||||||
|
SET DEBUG_SYNC="RESET";
|
||||||
|
DROP TABLE t;
|
@@ -3,8 +3,11 @@
|
|||||||
source include/have_debug.inc;
|
source include/have_debug.inc;
|
||||||
source include/have_debug_sync.inc;
|
source include/have_debug_sync.inc;
|
||||||
|
|
||||||
|
SET @save_freq=@@GLOBAL.innodb_purge_rseg_truncate_frequency;
|
||||||
|
SET GLOBAL innodb_purge_rseg_truncate_frequency=1;
|
||||||
CREATE TABLE t (a int PRIMARY KEY, b int NOT NULL UNIQUE) engine = InnoDB;
|
CREATE TABLE t (a int PRIMARY KEY, b int NOT NULL UNIQUE) engine = InnoDB;
|
||||||
|
|
||||||
|
--source include/wait_all_purged.inc
|
||||||
--connect(prevent_purge,localhost,root,,)
|
--connect(prevent_purge,localhost,root,,)
|
||||||
start transaction with consistent snapshot;
|
start transaction with consistent snapshot;
|
||||||
|
|
||||||
@@ -80,4 +83,5 @@ INSERT INTO t VALUES(30, 20);
|
|||||||
|
|
||||||
SET DEBUG_SYNC = 'RESET';
|
SET DEBUG_SYNC = 'RESET';
|
||||||
DROP TABLE t;
|
DROP TABLE t;
|
||||||
|
SET GLOBAL innodb_purge_rseg_truncate_frequency=@save_freq;
|
||||||
--source include/wait_until_count_sessions.inc
|
--source include/wait_until_count_sessions.inc
|
||||||
|
@@ -14,6 +14,7 @@ SET GLOBAL innodb_purge_rseg_truncate_frequency = 1;
|
|||||||
|
|
||||||
CREATE TABLE t1(a INT PRIMARY KEY, b INT NOT NULL)
|
CREATE TABLE t1(a INT PRIMARY KEY, b INT NOT NULL)
|
||||||
ROW_FORMAT=REDUNDANT ENGINE=InnoDB;
|
ROW_FORMAT=REDUNDANT ENGINE=InnoDB;
|
||||||
|
--source include/wait_all_purged.inc
|
||||||
|
|
||||||
--connect (prevent_purge,localhost,root)
|
--connect (prevent_purge,localhost,root)
|
||||||
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
||||||
@@ -33,7 +34,12 @@ UPDATE t1 SET b=4 WHERE a=3;
|
|||||||
# Initiate a full purge, which should reset the DB_TRX_ID except for a=3.
|
# Initiate a full purge, which should reset the DB_TRX_ID except for a=3.
|
||||||
--source include/wait_all_purged.inc
|
--source include/wait_all_purged.inc
|
||||||
# Initiate a ROLLBACK of the update, which should reset the DB_TRX_ID for a=3.
|
# Initiate a ROLLBACK of the update, which should reset the DB_TRX_ID for a=3.
|
||||||
|
--connection con1
|
||||||
|
ROLLBACK;
|
||||||
--disconnect con1
|
--disconnect con1
|
||||||
|
--connection default
|
||||||
|
# Reset the DB_TRX_ID for the hidden ADD COLUMN metadata record.
|
||||||
|
--source include/wait_all_purged.inc
|
||||||
|
|
||||||
FLUSH TABLE t1 FOR EXPORT;
|
FLUSH TABLE t1 FOR EXPORT;
|
||||||
# The following is based on innodb.table_flags:
|
# The following is based on innodb.table_flags:
|
||||||
|
@@ -9,6 +9,7 @@ CREATE TABLE t1(id INT PRIMARY key, val VARCHAR(16000)) ENGINE=InnoDB;
|
|||||||
INSERT INTO t1 (id,val) SELECT 2*seq,'x' FROM seq_0_to_1023;
|
INSERT INTO t1 (id,val) SELECT 2*seq,'x' FROM seq_0_to_1023;
|
||||||
|
|
||||||
connect(con1,localhost,root,,);
|
connect(con1,localhost,root,,);
|
||||||
|
source include/wait_all_purged.inc;
|
||||||
# Prevent purge.
|
# Prevent purge.
|
||||||
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
START TRANSACTION WITH CONSISTENT SNAPSHOT;
|
||||||
connection default;
|
connection default;
|
||||||
|
@@ -13,12 +13,10 @@ DELIMITER ~~;
|
|||||||
CREATE PROCEDURE insert_n(start int, end int)
|
CREATE PROCEDURE insert_n(start int, end int)
|
||||||
BEGIN
|
BEGIN
|
||||||
DECLARE i INT DEFAULT start;
|
DECLARE i INT DEFAULT start;
|
||||||
START TRANSACTION;
|
|
||||||
WHILE i <= end do
|
WHILE i <= end do
|
||||||
INSERT INTO t1 VALUES (1, 2, 3) ON DUPLICATE KEY UPDATE c = i;
|
INSERT INTO t1 VALUES (1, 2, 3) ON DUPLICATE KEY UPDATE c = i;
|
||||||
SET i = i + 1;
|
SET i = i + 1;
|
||||||
END WHILE;
|
END WHILE;
|
||||||
COMMIT;
|
|
||||||
END~~
|
END~~
|
||||||
|
|
||||||
CREATE FUNCTION num_pages_get()
|
CREATE FUNCTION num_pages_get()
|
||||||
@@ -37,6 +35,7 @@ DELIMITER ;~~
|
|||||||
--echo #
|
--echo #
|
||||||
CREATE TABLE t1 (a INT, b INT, c INT, PRIMARY KEY(a,b), KEY (b,c))
|
CREATE TABLE t1 (a INT, b INT, c INT, PRIMARY KEY(a,b), KEY (b,c))
|
||||||
ENGINE=InnoDB STATS_PERSISTENT=0;
|
ENGINE=InnoDB STATS_PERSISTENT=0;
|
||||||
|
--source include/wait_all_purged.inc
|
||||||
BEGIN;
|
BEGIN;
|
||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
|
|
||||||
@@ -45,18 +44,22 @@ SELECT * FROM t1;
|
|||||||
--echo #
|
--echo #
|
||||||
connect (con2, localhost, root,,);
|
connect (con2, localhost, root,,);
|
||||||
connection con2;
|
connection con2;
|
||||||
|
BEGIN;
|
||||||
INSERT INTO t1 VALUES (1, 2, 3) ON DUPLICATE KEY UPDATE c = NULL;
|
INSERT INTO t1 VALUES (1, 2, 3) ON DUPLICATE KEY UPDATE c = NULL;
|
||||||
--send CALL insert_n(1, 50);
|
--send CALL insert_n(1, 50);
|
||||||
|
|
||||||
connect (con3, localhost, root,,);
|
connect (con3, localhost, root,,);
|
||||||
connection con3;
|
connection con3;
|
||||||
|
BEGIN;
|
||||||
--send CALL insert_n(51, 100);
|
--send CALL insert_n(51, 100);
|
||||||
|
|
||||||
connection con2;
|
connection con2;
|
||||||
reap;
|
reap;
|
||||||
|
COMMIT;
|
||||||
connection con3;
|
connection con3;
|
||||||
reap;
|
reap;
|
||||||
INSERT INTO t1 VALUES (1, 2, 1) ON DUPLICATE KEY UPDATE c = NULL;
|
INSERT INTO t1 VALUES (1, 2, 1) ON DUPLICATE KEY UPDATE c = NULL;
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
connection default;
|
connection default;
|
||||||
|
|
||||||
@@ -64,7 +67,7 @@ connection default;
|
|||||||
--echo # Connect to default and record how many pages were accessed
|
--echo # Connect to default and record how many pages were accessed
|
||||||
--echo # when selecting the record using the secondary key.
|
--echo # when selecting the record using the secondary key.
|
||||||
--echo #
|
--echo #
|
||||||
--let $wait_all_purged=4
|
--let $wait_all_purged=2
|
||||||
--source include/wait_all_purged.inc
|
--source include/wait_all_purged.inc
|
||||||
SET @num_pages_1 = num_pages_get();
|
SET @num_pages_1 = num_pages_get();
|
||||||
SELECT * FROM t1 force index (b);
|
SELECT * FROM t1 force index (b);
|
||||||
|
58
mysql-test/suite/innodb/t/lock_move_wait_lock_race.test
Normal file
58
mysql-test/suite/innodb/t/lock_move_wait_lock_race.test
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
--source include/have_innodb.inc
|
||||||
|
--source include/count_sessions.inc
|
||||||
|
--source include/have_debug.inc
|
||||||
|
--source include/have_debug_sync.inc
|
||||||
|
|
||||||
|
CREATE TABLE t (pk int PRIMARY KEY, c varchar(10)) ENGINE=InnoDB;
|
||||||
|
INSERT INTO t VALUES (10, "0123456789");
|
||||||
|
|
||||||
|
--connection default
|
||||||
|
BEGIN;
|
||||||
|
SELECT * FROM t WHERE c = 10 FOR UPDATE;
|
||||||
|
|
||||||
|
--connect(trx2, localhost,root,,)
|
||||||
|
BEGIN;
|
||||||
|
SET DEBUG_SYNC="lock_wait_start SIGNAL trx2_start_waiting";
|
||||||
|
SET DEBUG_SYNC="lock_wait_end SIGNAL trx2_wait_end WAIT_FOR trx2_cont_upd";
|
||||||
|
SET DEBUG_SYNC="lock_rec_store_on_page_infimum_end SIGNAL trx2_moved_locks WAIT_FOR trx2_cont";
|
||||||
|
#################
|
||||||
|
# We need to update clustered record without changing ordering fields and
|
||||||
|
# changing the size of non-ordering fields to cause locks moving from deleted
|
||||||
|
# record to infimum.
|
||||||
|
###
|
||||||
|
--send UPDATE t SET c = NULL WHERE pk = 10
|
||||||
|
|
||||||
|
|
||||||
|
--connect(trx3, localhost,root,,)
|
||||||
|
SET DEBUG_SYNC="now WAIT_FOR trx2_start_waiting";
|
||||||
|
#################
|
||||||
|
# The condition wariable waiting in lock_wait() must be finished by timeout
|
||||||
|
###
|
||||||
|
SET innodb_lock_wait_timeout=1;
|
||||||
|
BEGIN;
|
||||||
|
SET DEBUG_SYNC="lock_wait_start SIGNAL trx3_start_waiting WAIT_FOR trx3_cont_waiting";
|
||||||
|
SET DEBUG_SYNC="lock_sys_t_cancel_enter SIGNAL trx3_cancel_enter WAIT_FOR trx3_cont_cancel_waiting";
|
||||||
|
--send UPDATE t SET c = "abcdefghij" WHERE pk = 10
|
||||||
|
|
||||||
|
--connection default
|
||||||
|
SET DEBUG_SYNC="now WAIT_FOR trx3_start_waiting";
|
||||||
|
COMMIT;
|
||||||
|
SET DEBUG_SYNC="now WAIT_FOR trx2_wait_end";
|
||||||
|
SET DEBUG_SYNC="now SIGNAL trx3_cont_waiting";
|
||||||
|
SET DEBUG_SYNC="now WAIT_FOR trx3_cancel_enter";
|
||||||
|
SET DEBUG_SYNC="now SIGNAL trx2_cont_upd";
|
||||||
|
SET DEBUG_SYNC="now WAIT_FOR trx2_moved_locks";
|
||||||
|
#################
|
||||||
|
# If the bug is not fixed, there will be assertion failure here, because trx2
|
||||||
|
# moved trx3 lock from deleted record to infimum when trx3 tried to cancel the
|
||||||
|
# lock.
|
||||||
|
###
|
||||||
|
SET DEBUG_SYNC="now SIGNAL trx3_cont_cancel_waiting";
|
||||||
|
SET DEBUG_SYNC="now SIGNAL trx2_cont";
|
||||||
|
|
||||||
|
--disconnect trx2
|
||||||
|
--disconnect trx3
|
||||||
|
--connection default
|
||||||
|
SET DEBUG_SYNC="RESET";
|
||||||
|
DROP TABLE t;
|
||||||
|
--source include/wait_until_count_sessions.inc
|
@@ -31,5 +31,33 @@ set DEBUG_SYNC= 'now SIGNAL fts_drop_index';
|
|||||||
connection con1;
|
connection con1;
|
||||||
drop table t1, t2;
|
drop table t1, t2;
|
||||||
connection default;
|
connection default;
|
||||||
set DEBUG_SYNC=RESET;
|
|
||||||
SET @@GLOBAL.debug_dbug = @saved_dbug;
|
SET @@GLOBAL.debug_dbug = @saved_dbug;
|
||||||
|
disconnect con1;
|
||||||
|
#
|
||||||
|
# MDEV-25984 Assertion `max_doc_id > 0' failed in fts_init_doc_id()
|
||||||
|
#
|
||||||
|
call mtr.add_suppression("InnoDB: \\(Lock wait timeout\\) while getting next doc id for table `test`.`t1`");
|
||||||
|
CREATE TABLE t1(f1 CHAR(100), f2 INT, fulltext(f1))ENGINE=InnoDB;
|
||||||
|
INSERT INTO t1 VALUES("mariadb", 1), ("innodb", 1);
|
||||||
|
# restart
|
||||||
|
SET DEBUG_SYNC='innodb_rollback_after_fts_lock SIGNAL insert_dml WAIT_FOR ddl_continue';
|
||||||
|
ALTER TABLE t1 ADD UNIQUE INDEX(f2);
|
||||||
|
connect con1,localhost,root,,,;
|
||||||
|
SET DEBUG_SYNC='now WAIT_FOR insert_dml';
|
||||||
|
SET DEBUG_SYNC='fts_cmp_set_sync_doc_id_retry SIGNAL ddl_continue WAIT_FOR dml_finish';
|
||||||
|
INSERT INTO t1 VALUES("index", 2);
|
||||||
|
connection default;
|
||||||
|
ERROR 23000: Duplicate entry '1' for key 'f2'
|
||||||
|
SET DEBUG_SYNC="now SIGNAL dml_finish";
|
||||||
|
connection con1;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`f1` char(100) DEFAULT NULL,
|
||||||
|
`f2` int(11) DEFAULT NULL,
|
||||||
|
FULLTEXT KEY `f1` (`f1`)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
|
||||||
|
connection default;
|
||||||
|
disconnect con1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
set DEBUG_SYNC=RESET;
|
||||||
|
@@ -129,8 +129,9 @@ test
|
|||||||
select * from t1 where a like "te_t";
|
select * from t1 where a like "te_t";
|
||||||
a
|
a
|
||||||
test
|
test
|
||||||
select * from t1 where match a against ("te*" in boolean mode)+0;
|
select * from t1 where match a against ("te*" in boolean mode);
|
||||||
a
|
a
|
||||||
|
test
|
||||||
drop table t1;
|
drop table t1;
|
||||||
#
|
#
|
||||||
# Bug #49734: Crash on EXPLAIN EXTENDED UNION ... ORDER BY
|
# Bug #49734: Crash on EXPLAIN EXTENDED UNION ... ORDER BY
|
||||||
|
@@ -48,5 +48,33 @@ connection con1;
|
|||||||
reap;
|
reap;
|
||||||
drop table t1, t2;
|
drop table t1, t2;
|
||||||
connection default;
|
connection default;
|
||||||
set DEBUG_SYNC=RESET;
|
|
||||||
SET @@GLOBAL.debug_dbug = @saved_dbug;
|
SET @@GLOBAL.debug_dbug = @saved_dbug;
|
||||||
|
disconnect con1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-25984 Assertion `max_doc_id > 0' failed in fts_init_doc_id()
|
||||||
|
--echo #
|
||||||
|
call mtr.add_suppression("InnoDB: \\(Lock wait timeout\\) while getting next doc id for table `test`.`t1`");
|
||||||
|
|
||||||
|
CREATE TABLE t1(f1 CHAR(100), f2 INT, fulltext(f1))ENGINE=InnoDB;
|
||||||
|
INSERT INTO t1 VALUES("mariadb", 1), ("innodb", 1);
|
||||||
|
--source include/restart_mysqld.inc
|
||||||
|
SET DEBUG_SYNC='innodb_rollback_after_fts_lock SIGNAL insert_dml WAIT_FOR ddl_continue';
|
||||||
|
SEND ALTER TABLE t1 ADD UNIQUE INDEX(f2);
|
||||||
|
|
||||||
|
connect(con1,localhost,root,,,);
|
||||||
|
SET DEBUG_SYNC='now WAIT_FOR insert_dml';
|
||||||
|
SET DEBUG_SYNC='fts_cmp_set_sync_doc_id_retry SIGNAL ddl_continue WAIT_FOR dml_finish';
|
||||||
|
send INSERT INTO t1 VALUES("index", 2);
|
||||||
|
|
||||||
|
connection default;
|
||||||
|
--error ER_DUP_ENTRY
|
||||||
|
reap;
|
||||||
|
SET DEBUG_SYNC="now SIGNAL dml_finish";
|
||||||
|
connection con1;
|
||||||
|
reap;
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
connection default;
|
||||||
|
disconnect con1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
set DEBUG_SYNC=RESET;
|
||||||
|
@@ -152,10 +152,7 @@ insert into t1 values ("a"),("abc"),("abcd"),("hello"),("test");
|
|||||||
select * from t1 where a like "abc%";
|
select * from t1 where a like "abc%";
|
||||||
select * from t1 where a like "test%";
|
select * from t1 where a like "test%";
|
||||||
select * from t1 where a like "te_t";
|
select * from t1 where a like "te_t";
|
||||||
# InnoDB_FTS: we don't support the postfix "+0"
|
select * from t1 where match a against ("te*" in boolean mode);
|
||||||
# Work around MDEV-29871 (FIXME: remove this)
|
|
||||||
--echo select * from t1 where match a against ("te*" in boolean mode)+0;
|
|
||||||
--echo a
|
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
|
||||||
|
@@ -308,8 +308,6 @@ copy_uca_collation(struct charset_info_st *to, CHARSET_INFO *from,
|
|||||||
to->max_sort_char= from->max_sort_char;
|
to->max_sort_char= from->max_sort_char;
|
||||||
to->mbminlen= from->mbminlen;
|
to->mbminlen= from->mbminlen;
|
||||||
to->mbmaxlen= from->mbmaxlen;
|
to->mbmaxlen= from->mbmaxlen;
|
||||||
to->caseup_multiply= from->caseup_multiply;
|
|
||||||
to->casedn_multiply= from->casedn_multiply;
|
|
||||||
to->state|= MY_CS_AVAILABLE | MY_CS_LOADED |
|
to->state|= MY_CS_AVAILABLE | MY_CS_LOADED |
|
||||||
MY_CS_STRNXFRM | MY_CS_UNICODE;
|
MY_CS_STRNXFRM | MY_CS_UNICODE;
|
||||||
}
|
}
|
||||||
@@ -359,7 +357,6 @@ static int add_collation(struct charset_info_st *cs)
|
|||||||
if (cs_copy_data(newcs,cs))
|
if (cs_copy_data(newcs,cs))
|
||||||
return MY_XML_ERROR;
|
return MY_XML_ERROR;
|
||||||
|
|
||||||
newcs->caseup_multiply= newcs->casedn_multiply= 1;
|
|
||||||
newcs->levels_for_order= 1;
|
newcs->levels_for_order= 1;
|
||||||
|
|
||||||
if (!strcmp(cs->cs_name.str,"ucs2") )
|
if (!strcmp(cs->cs_name.str,"ucs2") )
|
||||||
|
@@ -1830,7 +1830,7 @@ bool Item_func_lcase::fix_length_and_dec(THD *thd)
|
|||||||
if (agg_arg_charsets_for_string_result(collation, args, 1))
|
if (agg_arg_charsets_for_string_result(collation, args, 1))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
DBUG_ASSERT(collation.collation != NULL);
|
DBUG_ASSERT(collation.collation != NULL);
|
||||||
multiply= collation.collation->casedn_multiply;
|
multiply= collation.collation->casedn_multiply();
|
||||||
converter= collation.collation->cset->casedn;
|
converter= collation.collation->cset->casedn;
|
||||||
fix_char_length_ulonglong((ulonglong) args[0]->max_char_length() * multiply);
|
fix_char_length_ulonglong((ulonglong) args[0]->max_char_length() * multiply);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -1841,7 +1841,7 @@ bool Item_func_ucase::fix_length_and_dec(THD *thd)
|
|||||||
if (agg_arg_charsets_for_string_result(collation, args, 1))
|
if (agg_arg_charsets_for_string_result(collation, args, 1))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
DBUG_ASSERT(collation.collation != NULL);
|
DBUG_ASSERT(collation.collation != NULL);
|
||||||
multiply= collation.collation->caseup_multiply;
|
multiply= collation.collation->caseup_multiply();
|
||||||
converter= collation.collation->cset->caseup;
|
converter= collation.collation->cset->caseup;
|
||||||
fix_char_length_ulonglong((ulonglong) args[0]->max_char_length() * multiply);
|
fix_char_length_ulonglong((ulonglong) args[0]->max_char_length() * multiply);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@@ -5312,7 +5312,7 @@ make_join_statistics(JOIN *join, List<TABLE_LIST> &tables_list,
|
|||||||
/* Initialize POSITION objects */
|
/* Initialize POSITION objects */
|
||||||
for (i=0 ; i <= table_count ; i++)
|
for (i=0 ; i <= table_count ; i++)
|
||||||
(void) new ((char*) (join->positions + i)) POSITION;
|
(void) new ((char*) (join->positions + i)) POSITION;
|
||||||
for (i=0 ; i <= sort_space ; i++)
|
for (i=0 ; i < sort_space ; i++)
|
||||||
(void) new ((char*) (join->sort_positions + i)) POSITION;
|
(void) new ((char*) (join->sort_positions + i)) POSITION;
|
||||||
|
|
||||||
join->best_ref= stat_vector;
|
join->best_ref= stat_vector;
|
||||||
|
@@ -2575,7 +2575,6 @@ fts_cmp_set_sync_doc_id(
|
|||||||
que_t* graph = NULL;
|
que_t* graph = NULL;
|
||||||
fts_cache_t* cache = table->fts->cache;
|
fts_cache_t* cache = table->fts->cache;
|
||||||
char table_name[MAX_FULL_NAME_LEN];
|
char table_name[MAX_FULL_NAME_LEN];
|
||||||
retry:
|
|
||||||
ut_a(table->fts->doc_col != ULINT_UNDEFINED);
|
ut_a(table->fts->doc_col != ULINT_UNDEFINED);
|
||||||
|
|
||||||
fts_table.suffix = "CONFIG";
|
fts_table.suffix = "CONFIG";
|
||||||
@@ -2583,7 +2582,8 @@ retry:
|
|||||||
fts_table.type = FTS_COMMON_TABLE;
|
fts_table.type = FTS_COMMON_TABLE;
|
||||||
fts_table.table = table;
|
fts_table.table = table;
|
||||||
|
|
||||||
trx = trx_create();
|
trx= trx_create();
|
||||||
|
retry:
|
||||||
trx_start_internal(trx);
|
trx_start_internal(trx);
|
||||||
|
|
||||||
trx->op_info = "update the next FTS document id";
|
trx->op_info = "update the next FTS document id";
|
||||||
@@ -2663,7 +2663,8 @@ func_exit:
|
|||||||
"for table " << table->name;
|
"for table " << table->name;
|
||||||
fts_sql_rollback(trx);
|
fts_sql_rollback(trx);
|
||||||
|
|
||||||
if (error == DB_DEADLOCK) {
|
if (error == DB_DEADLOCK || error == DB_LOCK_WAIT_TIMEOUT) {
|
||||||
|
DEBUG_SYNC_C("fts_cmp_set_sync_doc_id_retry");
|
||||||
std::this_thread::sleep_for(FTS_DEADLOCK_RETRY_WAIT);
|
std::this_thread::sleep_for(FTS_DEADLOCK_RETRY_WAIT);
|
||||||
goto retry;
|
goto retry;
|
||||||
}
|
}
|
||||||
@@ -4278,7 +4279,7 @@ fts_add_token(
|
|||||||
|
|
||||||
t_str.f_n_char = str.f_n_char;
|
t_str.f_n_char = str.f_n_char;
|
||||||
|
|
||||||
t_str.f_len = str.f_len * result_doc->charset->casedn_multiply + 1;
|
t_str.f_len = str.f_len * result_doc->charset->casedn_multiply() + 1;
|
||||||
|
|
||||||
t_str.f_str = static_cast<byte*>(
|
t_str.f_str = static_cast<byte*>(
|
||||||
mem_heap_alloc(heap, t_str.f_len));
|
mem_heap_alloc(heap, t_str.f_len));
|
||||||
|
@@ -4043,7 +4043,7 @@ fts_query(
|
|||||||
/* Convert the query string to lower case before parsing. We own
|
/* Convert the query string to lower case before parsing. We own
|
||||||
the ut_malloc'ed result and so remember to free it before return. */
|
the ut_malloc'ed result and so remember to free it before return. */
|
||||||
|
|
||||||
lc_query_str_len = query_len * charset->casedn_multiply + 1;
|
lc_query_str_len = query_len * charset->casedn_multiply() + 1;
|
||||||
lc_query_str = static_cast<byte*>(ut_malloc_nokey(lc_query_str_len));
|
lc_query_str = static_cast<byte*>(ut_malloc_nokey(lc_query_str_len));
|
||||||
|
|
||||||
/* For binary collations, a case sensitive search is
|
/* For binary collations, a case sensitive search is
|
||||||
|
@@ -6489,7 +6489,7 @@ innobase_fts_casedn_str(
|
|||||||
char* dst, /*!< in: buffer for result string */
|
char* dst, /*!< in: buffer for result string */
|
||||||
size_t dst_len)/*!< in: buffer size */
|
size_t dst_len)/*!< in: buffer size */
|
||||||
{
|
{
|
||||||
if (cs->casedn_multiply == 1) {
|
if (cs->casedn_multiply() == 1) {
|
||||||
memcpy(dst, src, src_len);
|
memcpy(dst, src, src_len);
|
||||||
dst[src_len] = 0;
|
dst[src_len] = 0;
|
||||||
my_casedn_str(cs, dst);
|
my_casedn_str(cs, dst);
|
||||||
|
@@ -9035,6 +9035,7 @@ inline bool rollback_inplace_alter_table(Alter_inplace_info *ha_alter_info,
|
|||||||
ut_a(!lock_table_for_trx(dict_sys.sys_fields, ctx->trx, LOCK_X));
|
ut_a(!lock_table_for_trx(dict_sys.sys_fields, ctx->trx, LOCK_X));
|
||||||
}
|
}
|
||||||
innodb_lock_wait_timeout= save_timeout;
|
innodb_lock_wait_timeout= save_timeout;
|
||||||
|
DEBUG_SYNC_C("innodb_rollback_after_fts_lock");
|
||||||
row_mysql_lock_data_dictionary(ctx->trx);
|
row_mysql_lock_data_dictionary(ctx->trx);
|
||||||
ctx->rollback_instant();
|
ctx->rollback_instant();
|
||||||
innobase_rollback_sec_index(ctx->old_table, table,
|
innobase_rollback_sec_index(ctx->old_table, table,
|
||||||
|
@@ -891,8 +891,8 @@ public:
|
|||||||
|
|
||||||
/** Cancel a waiting lock request.
|
/** Cancel a waiting lock request.
|
||||||
@tparam check_victim whether to check for DB_DEADLOCK
|
@tparam check_victim whether to check for DB_DEADLOCK
|
||||||
@param lock waiting lock request
|
|
||||||
@param trx active transaction
|
@param trx active transaction
|
||||||
|
@param lock waiting lock request
|
||||||
@retval DB_SUCCESS if no lock existed
|
@retval DB_SUCCESS if no lock existed
|
||||||
@retval DB_DEADLOCK if trx->lock.was_chosen_as_deadlock_victim was set
|
@retval DB_DEADLOCK if trx->lock.was_chosen_as_deadlock_victim was set
|
||||||
@retval DB_LOCK_WAIT if the lock was canceled */
|
@retval DB_LOCK_WAIT if the lock was canceled */
|
||||||
|
@@ -65,53 +65,44 @@ struct alignas(CPU_LEVEL1_DCACHE_LINESIZE) trx_rseg_t
|
|||||||
/** length of the TRX_RSEG_HISTORY list (number of transactions) */
|
/** length of the TRX_RSEG_HISTORY list (number of transactions) */
|
||||||
uint32_t history_size;
|
uint32_t history_size;
|
||||||
|
|
||||||
|
/** Last known transaction that has not been purged yet,
|
||||||
|
or 0 if everything has been purged. */
|
||||||
|
trx_id_t needs_purge;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/** Reference counter to track rseg allocated transactions,
|
/** Reference counter to track is_persistent() transactions,
|
||||||
with SKIP and NEEDS_PURGE flags. */
|
with SKIP flag. */
|
||||||
std::atomic<uint32_t> ref;
|
std::atomic<uint32_t> ref;
|
||||||
|
|
||||||
/** Whether undo tablespace truncation is pending */
|
/** Whether undo tablespace truncation is pending */
|
||||||
static constexpr uint32_t SKIP= 1;
|
static constexpr uint32_t SKIP= 1;
|
||||||
/** Whether the log segment needs purge */
|
|
||||||
static constexpr uint32_t NEEDS_PURGE= 2;
|
|
||||||
/** Transaction reference count multiplier */
|
/** Transaction reference count multiplier */
|
||||||
static constexpr uint32_t REF= 4;
|
static constexpr uint32_t REF= 2;
|
||||||
|
|
||||||
uint32_t ref_load() const { return ref.load(std::memory_order_relaxed); }
|
uint32_t ref_load() const { return ref.load(std::memory_order_relaxed); }
|
||||||
|
|
||||||
/** Set a bit in ref */
|
/** Set the SKIP bit */
|
||||||
template<bool needs_purge> void ref_set()
|
void ref_set_skip()
|
||||||
{
|
{
|
||||||
static_assert(SKIP == 1U << 0, "compatibility");
|
static_assert(SKIP == 1U, "compatibility");
|
||||||
static_assert(NEEDS_PURGE == 1U << 1, "compatibility");
|
|
||||||
#if defined __GNUC__ && (defined __i386__ || defined __x86_64__)
|
#if defined __GNUC__ && (defined __i386__ || defined __x86_64__)
|
||||||
if (needs_purge)
|
__asm__ __volatile__("lock btsl $0, %0" : "+m" (ref));
|
||||||
__asm__ __volatile__("lock btsl $1, %0" : "+m" (ref));
|
|
||||||
else
|
|
||||||
__asm__ __volatile__("lock btsl $0, %0" : "+m" (ref));
|
|
||||||
#elif defined _MSC_VER && (defined _M_IX86 || defined _M_X64)
|
#elif defined _MSC_VER && (defined _M_IX86 || defined _M_X64)
|
||||||
_interlockedbittestandset(reinterpret_cast<volatile long*>(&ref),
|
_interlockedbittestandset(reinterpret_cast<volatile long*>(&ref), 0);
|
||||||
needs_purge);
|
|
||||||
#else
|
#else
|
||||||
ref.fetch_or(needs_purge ? NEEDS_PURGE : SKIP, std::memory_order_relaxed);
|
ref.fetch_or(SKIP, std::memory_order_relaxed);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
/** Clear a bit in ref */
|
/** Clear a bit in ref */
|
||||||
template<bool needs_purge> void ref_reset()
|
void ref_reset_skip()
|
||||||
{
|
{
|
||||||
static_assert(SKIP == 1U << 0, "compatibility");
|
static_assert(SKIP == 1U, "compatibility");
|
||||||
static_assert(NEEDS_PURGE == 1U << 1, "compatibility");
|
|
||||||
#if defined __GNUC__ && (defined __i386__ || defined __x86_64__)
|
#if defined __GNUC__ && (defined __i386__ || defined __x86_64__)
|
||||||
if (needs_purge)
|
__asm__ __volatile__("lock btrl $0, %0" : "+m" (ref));
|
||||||
__asm__ __volatile__("lock btrl $1, %0" : "+m" (ref));
|
|
||||||
else
|
|
||||||
__asm__ __volatile__("lock btrl $0, %0" : "+m" (ref));
|
|
||||||
#elif defined _MSC_VER && (defined _M_IX86 || defined _M_X64)
|
#elif defined _MSC_VER && (defined _M_IX86 || defined _M_X64)
|
||||||
_interlockedbittestandreset(reinterpret_cast<volatile long*>(&ref),
|
_interlockedbittestandreset(reinterpret_cast<volatile long*>(&ref), 0);
|
||||||
needs_purge);
|
|
||||||
#else
|
#else
|
||||||
ref.fetch_and(needs_purge ? ~NEEDS_PURGE : ~SKIP,
|
ref.fetch_and(~SKIP, std::memory_order_relaxed);
|
||||||
std::memory_order_relaxed);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,26 +116,20 @@ public:
|
|||||||
void destroy();
|
void destroy();
|
||||||
|
|
||||||
/** Note that undo tablespace truncation was started. */
|
/** Note that undo tablespace truncation was started. */
|
||||||
void set_skip_allocation() { ut_ad(is_persistent()); ref_set<false>(); }
|
void set_skip_allocation() { ut_ad(is_persistent()); ref_set_skip(); }
|
||||||
/** Note that undo tablespace truncation was completed. */
|
/** Note that undo tablespace truncation was completed. */
|
||||||
void clear_skip_allocation()
|
void clear_skip_allocation()
|
||||||
{
|
{
|
||||||
ut_ad(is_persistent());
|
ut_ad(is_persistent());
|
||||||
#if defined DBUG_OFF
|
#if defined DBUG_OFF
|
||||||
ref_reset<false>();
|
ref_reset_skip();
|
||||||
#else
|
#else
|
||||||
ut_d(auto r=) ref.fetch_and(~SKIP, std::memory_order_relaxed);
|
ut_d(auto r=) ref.fetch_and(~SKIP, std::memory_order_relaxed);
|
||||||
ut_ad(r == SKIP);
|
ut_ad(r == SKIP);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
/** Note that the rollback segment requires purge. */
|
|
||||||
void set_needs_purge() { ref_set<true>(); }
|
|
||||||
/** Note that the rollback segment will not require purge. */
|
|
||||||
void clear_needs_purge() { ref_reset<true>(); }
|
|
||||||
/** @return whether the segment is marked for undo truncation */
|
/** @return whether the segment is marked for undo truncation */
|
||||||
bool skip_allocation() const { return ref_load() & SKIP; }
|
bool skip_allocation() const { return ref_load() & SKIP; }
|
||||||
/** @return whether the segment needs purge */
|
|
||||||
bool needs_purge() const { return ref_load() & NEEDS_PURGE; }
|
|
||||||
/** Increment the reference count */
|
/** Increment the reference count */
|
||||||
void acquire()
|
void acquire()
|
||||||
{ ut_d(auto r=) ref.fetch_add(REF); ut_ad(!(r & SKIP)); }
|
{ ut_d(auto r=) ref.fetch_add(REF); ut_ad(!(r & SKIP)); }
|
||||||
|
@@ -246,12 +246,10 @@ trx_undo_free_at_shutdown(trx_t *trx);
|
|||||||
@param[in,out] rseg rollback segment
|
@param[in,out] rseg rollback segment
|
||||||
@param[in] id rollback segment slot
|
@param[in] id rollback segment slot
|
||||||
@param[in] page_no undo log segment page number
|
@param[in] page_no undo log segment page number
|
||||||
@param[in,out] max_trx_id the largest observed transaction ID
|
|
||||||
@return the undo log
|
@return the undo log
|
||||||
@retval nullptr on error */
|
@retval nullptr on error */
|
||||||
trx_undo_t *
|
trx_undo_t *
|
||||||
trx_undo_mem_create_at_db_start(trx_rseg_t *rseg, ulint id, uint32_t page_no,
|
trx_undo_mem_create_at_db_start(trx_rseg_t *rseg, ulint id, uint32_t page_no);
|
||||||
trx_id_t &max_trx_id);
|
|
||||||
|
|
||||||
#endif /* !UNIV_INNOCHECKSUM */
|
#endif /* !UNIV_INNOCHECKSUM */
|
||||||
|
|
||||||
@@ -493,6 +491,8 @@ or 0 if the transaction has not been committed */
|
|||||||
/** Before MariaDB 10.3.1, when purge did not reset DB_TRX_ID of
|
/** Before MariaDB 10.3.1, when purge did not reset DB_TRX_ID of
|
||||||
surviving user records, this used to be called TRX_UNDO_DEL_MARKS.
|
surviving user records, this used to be called TRX_UNDO_DEL_MARKS.
|
||||||
|
|
||||||
|
This field is redundant; it is only being read by some debug assertions.
|
||||||
|
|
||||||
The value 1 indicates that purge needs to process the undo log segment.
|
The value 1 indicates that purge needs to process the undo log segment.
|
||||||
The value 0 indicates that all of it has been processed, and
|
The value 0 indicates that all of it has been processed, and
|
||||||
trx_purge_free_segment() has been invoked, so the log is not safe to access.
|
trx_purge_free_segment() has been invoked, so the log is not safe to access.
|
||||||
|
@@ -46,12 +46,12 @@ Created 5/7/1996 Heikki Tuuri
|
|||||||
#include "srv0mon.h"
|
#include "srv0mon.h"
|
||||||
#include "que0que.h"
|
#include "que0que.h"
|
||||||
#include "scope.h"
|
#include "scope.h"
|
||||||
|
#include <debug_sync.h>
|
||||||
|
|
||||||
#include <set>
|
#include <set>
|
||||||
|
|
||||||
#ifdef WITH_WSREP
|
#ifdef WITH_WSREP
|
||||||
#include <mysql/service_wsrep.h>
|
#include <mysql/service_wsrep.h>
|
||||||
#include <debug_sync.h>
|
|
||||||
#endif /* WITH_WSREP */
|
#endif /* WITH_WSREP */
|
||||||
|
|
||||||
/** The value of innodb_deadlock_detect */
|
/** The value of innodb_deadlock_detect */
|
||||||
@@ -1882,6 +1882,7 @@ check_trx_error:
|
|||||||
if (row_lock_wait)
|
if (row_lock_wait)
|
||||||
lock_sys.wait_resume(trx->mysql_thd, suspend_time, my_hrtime_coarse());
|
lock_sys.wait_resume(trx->mysql_thd, suspend_time, my_hrtime_coarse());
|
||||||
|
|
||||||
|
/* Cache trx->lock.wait_lock to avoid unnecessary atomic variable load */
|
||||||
if (lock_t *lock= trx->lock.wait_lock)
|
if (lock_t *lock= trx->lock.wait_lock)
|
||||||
{
|
{
|
||||||
lock_sys_t::cancel<false>(trx, lock);
|
lock_sys_t::cancel<false>(trx, lock);
|
||||||
@@ -1905,6 +1906,12 @@ void lock_wait_end(trx_t *trx)
|
|||||||
ut_d(const auto state= trx->state);
|
ut_d(const auto state= trx->state);
|
||||||
ut_ad(state == TRX_STATE_COMMITTED_IN_MEMORY || state == TRX_STATE_ACTIVE ||
|
ut_ad(state == TRX_STATE_COMMITTED_IN_MEMORY || state == TRX_STATE_ACTIVE ||
|
||||||
state == TRX_STATE_PREPARED);
|
state == TRX_STATE_PREPARED);
|
||||||
|
/* lock_wait() checks trx->lock.was_chosen_as_deadlock_victim flag before
|
||||||
|
requesting lock_sys.wait_mutex, and if the flag is set, it returns error,
|
||||||
|
what causes transaction rollback, which can reset trx->lock.wait_thr before
|
||||||
|
deadlock resolution starts cancelling victim's waiting lock. That's why we
|
||||||
|
don't check trx->lock.wait_thr here if the function was called from deadlock
|
||||||
|
resolution function. */
|
||||||
ut_ad(from_deadlock || trx->lock.wait_thr);
|
ut_ad(from_deadlock || trx->lock.wait_thr);
|
||||||
|
|
||||||
if (trx->lock.was_chosen_as_deadlock_victim)
|
if (trx->lock.was_chosen_as_deadlock_victim)
|
||||||
@@ -3193,6 +3200,8 @@ lock_rec_store_on_page_infimum(
|
|||||||
|
|
||||||
ut_ad(block->page.frame == page_align(rec));
|
ut_ad(block->page.frame == page_align(rec));
|
||||||
const page_id_t id{block->page.id()};
|
const page_id_t id{block->page.id()};
|
||||||
|
ut_d(SCOPE_EXIT(
|
||||||
|
[]() { DEBUG_SYNC_C("lock_rec_store_on_page_infimum_end"); }));
|
||||||
|
|
||||||
LockGuard g{lock_sys.rec_hash, id};
|
LockGuard g{lock_sys.rec_hash, id};
|
||||||
lock_rec_move(g.cell(), *block, id, g.cell(), id,
|
lock_rec_move(g.cell(), *block, id, g.cell(), id,
|
||||||
@@ -5770,17 +5779,30 @@ void lock_sys_t::cancel_lock_wait_for_trx(trx_t *trx)
|
|||||||
|
|
||||||
/** Cancel a waiting lock request.
|
/** Cancel a waiting lock request.
|
||||||
@tparam check_victim whether to check for DB_DEADLOCK
|
@tparam check_victim whether to check for DB_DEADLOCK
|
||||||
@param lock waiting lock request
|
|
||||||
@param trx active transaction
|
@param trx active transaction
|
||||||
|
@param lock waiting lock request
|
||||||
@retval DB_SUCCESS if no lock existed
|
@retval DB_SUCCESS if no lock existed
|
||||||
@retval DB_DEADLOCK if trx->lock.was_chosen_as_deadlock_victim was set
|
@retval DB_DEADLOCK if trx->lock.was_chosen_as_deadlock_victim was set
|
||||||
@retval DB_LOCK_WAIT if the lock was canceled */
|
@retval DB_LOCK_WAIT if the lock was canceled */
|
||||||
template<bool check_victim>
|
template<bool check_victim>
|
||||||
dberr_t lock_sys_t::cancel(trx_t *trx, lock_t *lock)
|
dberr_t lock_sys_t::cancel(trx_t *trx, lock_t *lock)
|
||||||
{
|
{
|
||||||
|
DEBUG_SYNC_C("lock_sys_t_cancel_enter");
|
||||||
mysql_mutex_assert_owner(&lock_sys.wait_mutex);
|
mysql_mutex_assert_owner(&lock_sys.wait_mutex);
|
||||||
ut_ad(trx->lock.wait_lock == lock);
|
|
||||||
ut_ad(trx->state == TRX_STATE_ACTIVE);
|
ut_ad(trx->state == TRX_STATE_ACTIVE);
|
||||||
|
/* trx->lock.wait_lock may be changed by other threads as long as
|
||||||
|
we are not holding lock_sys.latch.
|
||||||
|
|
||||||
|
So, trx->lock.wait_lock==lock does not necessarily hold, but both
|
||||||
|
pointers should be valid, because other threads cannot assign
|
||||||
|
trx->lock.wait_lock=nullptr (or invalidate *lock) while we are
|
||||||
|
holding lock_sys.wait_mutex. Also, the type of trx->lock.wait_lock
|
||||||
|
(record or table lock) cannot be changed by other threads. So, it is
|
||||||
|
safe to call lock->is_table() while not holding lock_sys.latch. If
|
||||||
|
we have to release and reacquire lock_sys.wait_mutex, we must reread
|
||||||
|
trx->lock.wait_lock. We must also reread trx->lock.wait_lock after
|
||||||
|
lock_sys.latch acquiring, as it can be changed to not-null in lock moving
|
||||||
|
functions even if we hold lock_sys.wait_mutex. */
|
||||||
dberr_t err= DB_SUCCESS;
|
dberr_t err= DB_SUCCESS;
|
||||||
/* This would be too large for a memory transaction, except in the
|
/* This would be too large for a memory transaction, except in the
|
||||||
DB_DEADLOCK case, which was already tested in lock_trx_handle_wait(). */
|
DB_DEADLOCK case, which was already tested in lock_trx_handle_wait(). */
|
||||||
@@ -5802,6 +5824,15 @@ dberr_t lock_sys_t::cancel(trx_t *trx, lock_t *lock)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
/* This function is invoked from the thread which executes the
|
||||||
|
transaction. Table locks are requested before record locks. Some other
|
||||||
|
transaction can't change trx->lock.wait_lock from table to record for the
|
||||||
|
current transaction at this point, because the current transaction has not
|
||||||
|
requested record locks yet. There is no need to move any table locks by
|
||||||
|
other threads. And trx->lock.wait_lock can't be set to null while we are
|
||||||
|
holding lock_sys.wait_mutex. That's why there is no need to reload
|
||||||
|
trx->lock.wait_lock here. */
|
||||||
|
ut_ad(lock == trx->lock.wait_lock);
|
||||||
resolve_table_lock:
|
resolve_table_lock:
|
||||||
dict_table_t *table= lock->un_member.tab_lock.table;
|
dict_table_t *table= lock->un_member.tab_lock.table;
|
||||||
if (!table->lock_mutex_trylock())
|
if (!table->lock_mutex_trylock())
|
||||||
@@ -5812,6 +5843,7 @@ resolve_table_lock:
|
|||||||
mysql_mutex_unlock(&lock_sys.wait_mutex);
|
mysql_mutex_unlock(&lock_sys.wait_mutex);
|
||||||
table->lock_mutex_lock();
|
table->lock_mutex_lock();
|
||||||
mysql_mutex_lock(&lock_sys.wait_mutex);
|
mysql_mutex_lock(&lock_sys.wait_mutex);
|
||||||
|
/* Cache trx->lock.wait_lock under the corresponding latches. */
|
||||||
lock= trx->lock.wait_lock;
|
lock= trx->lock.wait_lock;
|
||||||
if (!lock)
|
if (!lock)
|
||||||
goto retreat;
|
goto retreat;
|
||||||
@@ -5821,6 +5853,10 @@ resolve_table_lock:
|
|||||||
goto retreat;
|
goto retreat;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
/* Cache trx->lock.wait_lock under the corresponding latches if
|
||||||
|
it was not cached yet */
|
||||||
|
lock= trx->lock.wait_lock;
|
||||||
if (lock->is_waiting())
|
if (lock->is_waiting())
|
||||||
lock_cancel_waiting_and_release(lock);
|
lock_cancel_waiting_and_release(lock);
|
||||||
/* Even if lock->is_waiting() did not hold above, we must return
|
/* Even if lock->is_waiting() did not hold above, we must return
|
||||||
@@ -5844,6 +5880,7 @@ retreat:
|
|||||||
mysql_mutex_unlock(&lock_sys.wait_mutex);
|
mysql_mutex_unlock(&lock_sys.wait_mutex);
|
||||||
lock_sys.wr_lock(SRW_LOCK_CALL);
|
lock_sys.wr_lock(SRW_LOCK_CALL);
|
||||||
mysql_mutex_lock(&lock_sys.wait_mutex);
|
mysql_mutex_lock(&lock_sys.wait_mutex);
|
||||||
|
/* Cache trx->lock.wait_lock under the corresponding latches. */
|
||||||
lock= trx->lock.wait_lock;
|
lock= trx->lock.wait_lock;
|
||||||
/* Even if waiting lock was cancelled while lock_sys.wait_mutex was
|
/* Even if waiting lock was cancelled while lock_sys.wait_mutex was
|
||||||
unlocked, we need to return deadlock error if transaction was chosen
|
unlocked, we need to return deadlock error if transaction was chosen
|
||||||
@@ -5855,6 +5892,9 @@ retreat:
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
/* Cache trx->lock.wait_lock under the corresponding latches if
|
||||||
|
it was not cached yet */
|
||||||
|
lock= trx->lock.wait_lock;
|
||||||
resolve_record_lock:
|
resolve_record_lock:
|
||||||
if (lock->is_waiting())
|
if (lock->is_waiting())
|
||||||
lock_cancel_waiting_and_release(lock);
|
lock_cancel_waiting_and_release(lock);
|
||||||
@@ -5876,6 +5916,7 @@ resolve_record_lock:
|
|||||||
void lock_sys_t::cancel(trx_t *trx)
|
void lock_sys_t::cancel(trx_t *trx)
|
||||||
{
|
{
|
||||||
mysql_mutex_lock(&lock_sys.wait_mutex);
|
mysql_mutex_lock(&lock_sys.wait_mutex);
|
||||||
|
/* Cache trx->lock.wait_lock to avoid unnecessary atomic variable load */
|
||||||
if (lock_t *lock= trx->lock.wait_lock)
|
if (lock_t *lock= trx->lock.wait_lock)
|
||||||
{
|
{
|
||||||
/* Dictionary transactions must be immune to KILL, because they
|
/* Dictionary transactions must be immune to KILL, because they
|
||||||
@@ -5943,6 +5984,7 @@ dberr_t lock_trx_handle_wait(trx_t *trx)
|
|||||||
mysql_mutex_lock(&lock_sys.wait_mutex);
|
mysql_mutex_lock(&lock_sys.wait_mutex);
|
||||||
if (trx->lock.was_chosen_as_deadlock_victim)
|
if (trx->lock.was_chosen_as_deadlock_victim)
|
||||||
err= DB_DEADLOCK;
|
err= DB_DEADLOCK;
|
||||||
|
/* Cache trx->lock.wait_lock to avoid unnecessary atomic variable load */
|
||||||
else if (lock_t *wait_lock= trx->lock.wait_lock)
|
else if (lock_t *wait_lock= trx->lock.wait_lock)
|
||||||
err= lock_sys_t::cancel<true>(trx, wait_lock);
|
err= lock_sys_t::cancel<true>(trx, wait_lock);
|
||||||
lock_sys.deadlock_check();
|
lock_sys.deadlock_check();
|
||||||
|
@@ -263,6 +263,7 @@ trx_purge_add_undo_to_history(const trx_t* trx, trx_undo_t*& undo, mtr_t* mtr)
|
|||||||
+ undo->hdr_offset;
|
+ undo->hdr_offset;
|
||||||
|
|
||||||
ut_ad(mach_read_from_2(undo_header + TRX_UNDO_NEEDS_PURGE) <= 1);
|
ut_ad(mach_read_from_2(undo_header + TRX_UNDO_NEEDS_PURGE) <= 1);
|
||||||
|
ut_ad(rseg->needs_purge > trx->id);
|
||||||
|
|
||||||
if (UNIV_UNLIKELY(mach_read_from_4(TRX_RSEG + TRX_RSEG_FORMAT
|
if (UNIV_UNLIKELY(mach_read_from_4(TRX_RSEG + TRX_RSEG_FORMAT
|
||||||
+ rseg_header->page.frame))) {
|
+ rseg_header->page.frame))) {
|
||||||
@@ -358,7 +359,6 @@ trx_purge_add_undo_to_history(const trx_t* trx, trx_undo_t*& undo, mtr_t* mtr)
|
|||||||
rseg->last_page_no = undo->hdr_page_no;
|
rseg->last_page_no = undo->hdr_page_no;
|
||||||
rseg->set_last_commit(undo->hdr_offset,
|
rseg->set_last_commit(undo->hdr_offset,
|
||||||
trx->rw_trx_hash_element->no);
|
trx->rw_trx_hash_element->no);
|
||||||
rseg->set_needs_purge();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rseg->history_size++;
|
rseg->history_size++;
|
||||||
@@ -389,24 +389,21 @@ static dberr_t trx_purge_remove_log_hdr(buf_block_t *rseg, buf_block_t* log,
|
|||||||
|
|
||||||
MY_ATTRIBUTE((nonnull, warn_unused_result))
|
MY_ATTRIBUTE((nonnull, warn_unused_result))
|
||||||
/** Free an undo log segment, and remove the header from the history list.
|
/** Free an undo log segment, and remove the header from the history list.
|
||||||
|
@param[in,out] mtr mini-transaction
|
||||||
@param[in,out] rseg rollback segment
|
@param[in,out] rseg rollback segment
|
||||||
@param[in] hdr_addr file address of log_hdr
|
@param[in] hdr_addr file address of log_hdr
|
||||||
@return error code */
|
@return error code */
|
||||||
static dberr_t trx_purge_free_segment(trx_rseg_t *rseg, fil_addr_t hdr_addr)
|
static dberr_t
|
||||||
|
trx_purge_free_segment(mtr_t &mtr, trx_rseg_t* rseg, fil_addr_t hdr_addr)
|
||||||
{
|
{
|
||||||
const page_id_t hdr_page_id{rseg->space->id, hdr_addr.page};
|
mtr.commit();
|
||||||
mtr_t mtr;
|
|
||||||
mtr.start();
|
mtr.start();
|
||||||
|
|
||||||
/* We only need the latch to maintain rseg->curr_size. To follow the
|
const page_id_t hdr_page_id{rseg->space->id, hdr_addr.page};
|
||||||
latching order, we must acquire it before acquiring any related
|
|
||||||
page latch. */
|
|
||||||
rseg->latch.wr_lock(SRW_LOCK_CALL);
|
|
||||||
|
|
||||||
dberr_t err;
|
dberr_t err;
|
||||||
buf_block_t *rseg_hdr= rseg->get(&mtr, &err);
|
buf_block_t *rseg_hdr= rseg->get(&mtr, &err);
|
||||||
if (!rseg_hdr)
|
if (!rseg_hdr)
|
||||||
goto func_exit;
|
return err;
|
||||||
if (buf_block_t *block= buf_page_get_gen(hdr_page_id, 0, RW_X_LATCH,
|
if (buf_block_t *block= buf_page_get_gen(hdr_page_id, 0, RW_X_LATCH,
|
||||||
nullptr, BUF_GET_POSSIBLY_FREED,
|
nullptr, BUF_GET_POSSIBLY_FREED,
|
||||||
&mtr, &err))
|
&mtr, &err))
|
||||||
@@ -421,12 +418,10 @@ static dberr_t trx_purge_free_segment(trx_rseg_t *rseg, fil_addr_t hdr_addr)
|
|||||||
while (!fseg_free_step_not_header(TRX_UNDO_SEG_HDR + TRX_UNDO_FSEG_HEADER +
|
while (!fseg_free_step_not_header(TRX_UNDO_SEG_HDR + TRX_UNDO_FSEG_HEADER +
|
||||||
block->page.frame, &mtr))
|
block->page.frame, &mtr))
|
||||||
{
|
{
|
||||||
rseg->latch.wr_unlock();
|
|
||||||
rseg_hdr->fix();
|
rseg_hdr->fix();
|
||||||
block->fix();
|
block->fix();
|
||||||
mtr.commit();
|
mtr.commit();
|
||||||
mtr.start();
|
mtr.start();
|
||||||
rseg->latch.wr_lock(SRW_LOCK_CALL);
|
|
||||||
rseg_hdr->page.lock.x_lock();
|
rseg_hdr->page.lock.x_lock();
|
||||||
block->page.lock.x_lock();
|
block->page.lock.x_lock();
|
||||||
mtr.memo_push(rseg_hdr, MTR_MEMO_PAGE_X_FIX);
|
mtr.memo_push(rseg_hdr, MTR_MEMO_PAGE_X_FIX);
|
||||||
@@ -445,13 +440,10 @@ static dberr_t trx_purge_free_segment(trx_rseg_t *rseg, fil_addr_t hdr_addr)
|
|||||||
could become inaccessible garbage in the file space. */
|
could become inaccessible garbage in the file space. */
|
||||||
err= trx_purge_remove_log_hdr(rseg_hdr, block, hdr_addr.boffset, &mtr);
|
err= trx_purge_remove_log_hdr(rseg_hdr, block, hdr_addr.boffset, &mtr);
|
||||||
if (UNIV_UNLIKELY(err != DB_SUCCESS))
|
if (UNIV_UNLIKELY(err != DB_SUCCESS))
|
||||||
goto func_exit;
|
return err;
|
||||||
byte *hist= TRX_RSEG + TRX_RSEG_HISTORY_SIZE + rseg_hdr->page.frame;
|
byte *hist= TRX_RSEG + TRX_RSEG_HISTORY_SIZE + rseg_hdr->page.frame;
|
||||||
if (UNIV_UNLIKELY(mach_read_from_4(hist) < seg_size))
|
if (UNIV_UNLIKELY(mach_read_from_4(hist) < seg_size))
|
||||||
{
|
return DB_CORRUPTION;
|
||||||
err= DB_CORRUPTION;
|
|
||||||
goto func_exit;
|
|
||||||
}
|
|
||||||
mtr.write<4>(*rseg_hdr, hist, mach_read_from_4(hist) - seg_size);
|
mtr.write<4>(*rseg_hdr, hist, mach_read_from_4(hist) - seg_size);
|
||||||
|
|
||||||
/* Here we assume that a file segment with just the header page
|
/* Here we assume that a file segment with just the header page
|
||||||
@@ -466,9 +458,6 @@ static dberr_t trx_purge_free_segment(trx_rseg_t *rseg, fil_addr_t hdr_addr)
|
|||||||
rseg->curr_size -= seg_size;
|
rseg->curr_size -= seg_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
func_exit:
|
|
||||||
rseg->latch.wr_unlock();
|
|
||||||
mtr.commit();
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -486,8 +475,6 @@ trx_purge_truncate_rseg_history(
|
|||||||
mtr_t mtr;
|
mtr_t mtr;
|
||||||
|
|
||||||
mtr.start();
|
mtr.start();
|
||||||
ut_ad(rseg.is_persistent());
|
|
||||||
rseg.latch.wr_lock(SRW_LOCK_CALL);
|
|
||||||
|
|
||||||
dberr_t err;
|
dberr_t err;
|
||||||
buf_block_t* rseg_hdr = rseg.get(&mtr, &err);
|
buf_block_t* rseg_hdr = rseg.get(&mtr, &err);
|
||||||
@@ -503,7 +490,6 @@ trx_purge_truncate_rseg_history(
|
|||||||
loop:
|
loop:
|
||||||
if (hdr_addr.page == FIL_NULL) {
|
if (hdr_addr.page == FIL_NULL) {
|
||||||
func_exit:
|
func_exit:
|
||||||
rseg.latch.wr_unlock();
|
|
||||||
mtr.commit();
|
mtr.commit();
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@@ -535,38 +521,30 @@ func_exit:
|
|||||||
prev_hdr_addr.boffset = static_cast<uint16_t>(prev_hdr_addr.boffset
|
prev_hdr_addr.boffset = static_cast<uint16_t>(prev_hdr_addr.boffset
|
||||||
- TRX_UNDO_HISTORY_NODE);
|
- TRX_UNDO_HISTORY_NODE);
|
||||||
|
|
||||||
if (mach_read_from_2(TRX_UNDO_SEG_HDR + TRX_UNDO_STATE
|
if (!rseg.is_referenced()
|
||||||
+ block->page.frame)
|
&& rseg.needs_purge <= (purge_sys.head.trx_no
|
||||||
|
? purge_sys.head.trx_no
|
||||||
|
: purge_sys.tail.trx_no)
|
||||||
|
&& mach_read_from_2(TRX_UNDO_SEG_HDR + TRX_UNDO_STATE
|
||||||
|
+ block->page.frame)
|
||||||
== TRX_UNDO_TO_PURGE
|
== TRX_UNDO_TO_PURGE
|
||||||
&& !mach_read_from_2(block->page.frame + hdr_addr.boffset
|
&& !mach_read_from_2(block->page.frame + hdr_addr.boffset
|
||||||
+ TRX_UNDO_NEXT_LOG)) {
|
+ TRX_UNDO_NEXT_LOG)) {
|
||||||
|
/* We can free the whole log segment.
|
||||||
/* We can free the whole log segment */
|
This will call trx_purge_remove_log_hdr(). */
|
||||||
|
err = trx_purge_free_segment(mtr, &rseg, hdr_addr);
|
||||||
rseg.latch.wr_unlock();
|
|
||||||
mtr.commit();
|
|
||||||
|
|
||||||
/* calls the trx_purge_remove_log_hdr()
|
|
||||||
inside trx_purge_free_segment(). */
|
|
||||||
err = trx_purge_free_segment(&rseg, hdr_addr);
|
|
||||||
if (err != DB_SUCCESS) {
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
/* Remove the log hdr from the rseg history. */
|
/* Remove the log hdr from the rseg history. */
|
||||||
|
rseg.history_size--;
|
||||||
err = trx_purge_remove_log_hdr(rseg_hdr, block,
|
err = trx_purge_remove_log_hdr(rseg_hdr, block,
|
||||||
hdr_addr.boffset, &mtr);
|
hdr_addr.boffset, &mtr);
|
||||||
if (err != DB_SUCCESS) {
|
|
||||||
goto func_exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
rseg.history_size--;
|
|
||||||
rseg.latch.wr_unlock();
|
|
||||||
mtr.commit();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mtr.commit();
|
||||||
|
if (err != DB_SUCCESS) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
mtr.start();
|
mtr.start();
|
||||||
rseg.latch.wr_lock(SRW_LOCK_CALL);
|
|
||||||
|
|
||||||
hdr_addr = prev_hdr_addr;
|
hdr_addr = prev_hdr_addr;
|
||||||
|
|
||||||
@@ -642,8 +620,13 @@ TRANSACTIONAL_TARGET static void trx_purge_truncate_history()
|
|||||||
dberr_t err= DB_SUCCESS;
|
dberr_t err= DB_SUCCESS;
|
||||||
for (auto &rseg : trx_sys.rseg_array)
|
for (auto &rseg : trx_sys.rseg_array)
|
||||||
if (rseg.space)
|
if (rseg.space)
|
||||||
|
{
|
||||||
|
ut_ad(rseg.is_persistent());
|
||||||
|
rseg.latch.wr_lock(SRW_LOCK_CALL);
|
||||||
if (dberr_t e= trx_purge_truncate_rseg_history(rseg, head))
|
if (dberr_t e= trx_purge_truncate_rseg_history(rseg, head))
|
||||||
err= e;
|
err= e;
|
||||||
|
rseg.latch.wr_unlock();
|
||||||
|
}
|
||||||
|
|
||||||
if (err != DB_SUCCESS || srv_undo_tablespaces_active < 2)
|
if (err != DB_SUCCESS || srv_undo_tablespaces_active < 2)
|
||||||
return;
|
return;
|
||||||
@@ -695,43 +678,34 @@ TRANSACTIONAL_TARGET static void trx_purge_truncate_history()
|
|||||||
{
|
{
|
||||||
if (rseg.space != &space)
|
if (rseg.space != &space)
|
||||||
continue;
|
continue;
|
||||||
#ifdef SUX_LOCK_GENERIC
|
|
||||||
rseg.latch.rd_lock(SRW_LOCK_CALL);
|
rseg.latch.rd_lock(SRW_LOCK_CALL);
|
||||||
#else
|
|
||||||
transactional_shared_lock_guard<srw_spin_lock> g{rseg.latch};
|
|
||||||
#endif
|
|
||||||
ut_ad(rseg.skip_allocation());
|
ut_ad(rseg.skip_allocation());
|
||||||
if (rseg.is_referenced())
|
if (rseg.is_referenced() || rseg.needs_purge > head.trx_no)
|
||||||
{
|
{
|
||||||
not_free:
|
not_free:
|
||||||
#ifdef SUX_LOCK_GENERIC
|
|
||||||
rseg.latch.rd_unlock();
|
rseg.latch.rd_unlock();
|
||||||
#endif
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rseg.curr_size != 1)
|
ut_ad(UT_LIST_GET_LEN(rseg.undo_list) == 0);
|
||||||
|
/* Check if all segments are cached and safe to remove. */
|
||||||
|
ulint cached= 0;
|
||||||
|
|
||||||
|
for (const trx_undo_t *undo= UT_LIST_GET_FIRST(rseg.undo_cached); undo;
|
||||||
|
undo= UT_LIST_GET_NEXT(undo_list, undo))
|
||||||
{
|
{
|
||||||
/* Check if all segments are cached and safe to remove. */
|
if (head.trx_no < undo->trx_id)
|
||||||
ulint cached= 0;
|
|
||||||
for (trx_undo_t *undo= UT_LIST_GET_FIRST(rseg.undo_cached); undo;
|
|
||||||
undo= UT_LIST_GET_NEXT(undo_list, undo))
|
|
||||||
{
|
|
||||||
if (head.trx_no < undo->trx_id)
|
|
||||||
goto not_free;
|
|
||||||
else
|
|
||||||
cached+= undo->size;
|
|
||||||
}
|
|
||||||
|
|
||||||
ut_ad(rseg.curr_size > cached);
|
|
||||||
|
|
||||||
if (rseg.curr_size > cached + 1)
|
|
||||||
goto not_free;
|
goto not_free;
|
||||||
|
else
|
||||||
|
cached+= undo->size;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SUX_LOCK_GENERIC
|
ut_ad(rseg.curr_size > cached);
|
||||||
|
if (rseg.curr_size > cached + 1)
|
||||||
|
goto not_free;
|
||||||
|
|
||||||
rseg.latch.rd_unlock();
|
rseg.latch.rd_unlock();
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ib::info() << "Truncating " << file->name;
|
ib::info() << "Truncating " << file->name;
|
||||||
@@ -850,7 +824,9 @@ not_free:
|
|||||||
if (rseg.space != &space)
|
if (rseg.space != &space)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
dberr_t err;
|
ut_ad(!rseg.is_referenced());
|
||||||
|
ut_ad(rseg.needs_purge <= head.trx_no);
|
||||||
|
|
||||||
buf_block_t *rblock= trx_rseg_header_create(&space,
|
buf_block_t *rblock= trx_rseg_header_create(&space,
|
||||||
&rseg - trx_sys.rseg_array,
|
&rseg - trx_sys.rseg_array,
|
||||||
trx_sys.get_max_trx_id(),
|
trx_sys.get_max_trx_id(),
|
||||||
@@ -885,10 +861,6 @@ not_free:
|
|||||||
log_buffer_flush_to_disk();
|
log_buffer_flush_to_disk();
|
||||||
DBUG_SUICIDE(););
|
DBUG_SUICIDE(););
|
||||||
|
|
||||||
for (auto &rseg : trx_sys.rseg_array)
|
|
||||||
if (rseg.space == &space)
|
|
||||||
rseg.clear_skip_allocation();
|
|
||||||
|
|
||||||
ib::info() << "Truncated " << file->name;
|
ib::info() << "Truncated " << file->name;
|
||||||
purge_sys.truncate.last= purge_sys.truncate.current;
|
purge_sys.truncate.last= purge_sys.truncate.current;
|
||||||
ut_ad(&space == purge_sys.truncate.current);
|
ut_ad(&space == purge_sys.truncate.current);
|
||||||
@@ -948,7 +920,6 @@ static void trx_purge_rseg_get_next_history_log(
|
|||||||
/* Read the previous log header. */
|
/* Read the previous log header. */
|
||||||
mtr.start();
|
mtr.start();
|
||||||
|
|
||||||
byte needs_purge= 0;
|
|
||||||
trx_id_t trx_no= 0;
|
trx_id_t trx_no= 0;
|
||||||
|
|
||||||
if (const buf_block_t* undo_page=
|
if (const buf_block_t* undo_page=
|
||||||
@@ -959,7 +930,6 @@ static void trx_purge_rseg_get_next_history_log(
|
|||||||
|
|
||||||
trx_no= mach_read_from_8(log_hdr + TRX_UNDO_TRX_NO);
|
trx_no= mach_read_from_8(log_hdr + TRX_UNDO_TRX_NO);
|
||||||
ut_ad(mach_read_from_2(log_hdr + TRX_UNDO_NEEDS_PURGE) <= 1);
|
ut_ad(mach_read_from_2(log_hdr + TRX_UNDO_NEEDS_PURGE) <= 1);
|
||||||
needs_purge= log_hdr[TRX_UNDO_NEEDS_PURGE + 1];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mtr.commit();
|
mtr.commit();
|
||||||
@@ -971,11 +941,6 @@ static void trx_purge_rseg_get_next_history_log(
|
|||||||
purge_sys.rseg->last_page_no= prev_log_addr.page;
|
purge_sys.rseg->last_page_no= prev_log_addr.page;
|
||||||
purge_sys.rseg->set_last_commit(prev_log_addr.boffset, trx_no);
|
purge_sys.rseg->set_last_commit(prev_log_addr.boffset, trx_no);
|
||||||
|
|
||||||
if (needs_purge)
|
|
||||||
purge_sys.rseg->set_needs_purge();
|
|
||||||
else
|
|
||||||
purge_sys.rseg->clear_needs_purge();
|
|
||||||
|
|
||||||
/* Purge can also produce events, however these are already ordered
|
/* Purge can also produce events, however these are already ordered
|
||||||
in the rollback segment and any user generated event will be greater
|
in the rollback segment and any user generated event will be greater
|
||||||
than the events that Purge produces. ie. Purge can never produce
|
than the events that Purge produces. ie. Purge can never produce
|
||||||
@@ -997,7 +962,7 @@ static void trx_purge_read_undo_rec()
|
|||||||
purge_sys.hdr_offset = purge_sys.rseg->last_offset();
|
purge_sys.hdr_offset = purge_sys.rseg->last_offset();
|
||||||
page_no = purge_sys.hdr_page_no = purge_sys.rseg->last_page_no;
|
page_no = purge_sys.hdr_page_no = purge_sys.rseg->last_page_no;
|
||||||
|
|
||||||
if (purge_sys.rseg->needs_purge()) {
|
if (purge_sys.rseg->needs_purge) {
|
||||||
mtr_t mtr;
|
mtr_t mtr;
|
||||||
mtr.start();
|
mtr.start();
|
||||||
const buf_block_t* undo_page;
|
const buf_block_t* undo_page;
|
||||||
|
@@ -400,7 +400,7 @@ void trx_rseg_t::reinit(uint32_t page)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ut_ad(!is_referenced());
|
ut_ad(!is_referenced());
|
||||||
clear_needs_purge();
|
needs_purge= 0;
|
||||||
last_commit_and_offset= 0;
|
last_commit_and_offset= 0;
|
||||||
last_page_no= FIL_NULL;
|
last_page_no= FIL_NULL;
|
||||||
curr_size= 1;
|
curr_size= 1;
|
||||||
@@ -408,10 +408,9 @@ void trx_rseg_t::reinit(uint32_t page)
|
|||||||
|
|
||||||
/** Read the undo log lists.
|
/** Read the undo log lists.
|
||||||
@param[in,out] rseg rollback segment
|
@param[in,out] rseg rollback segment
|
||||||
@param[in,out] max_trx_id maximum observed transaction identifier
|
|
||||||
@param[in] rseg_header rollback segment header
|
@param[in] rseg_header rollback segment header
|
||||||
@return error code */
|
@return error code */
|
||||||
static dberr_t trx_undo_lists_init(trx_rseg_t *rseg, trx_id_t &max_trx_id,
|
static dberr_t trx_undo_lists_init(trx_rseg_t *rseg,
|
||||||
const buf_block_t *rseg_header)
|
const buf_block_t *rseg_header)
|
||||||
{
|
{
|
||||||
ut_ad(srv_force_recovery < SRV_FORCE_NO_UNDO_LOG_SCAN);
|
ut_ad(srv_force_recovery < SRV_FORCE_NO_UNDO_LOG_SCAN);
|
||||||
@@ -422,8 +421,8 @@ static dberr_t trx_undo_lists_init(trx_rseg_t *rseg, trx_id_t &max_trx_id,
|
|||||||
uint32_t page_no= trx_rsegf_get_nth_undo(rseg_header, i);
|
uint32_t page_no= trx_rsegf_get_nth_undo(rseg_header, i);
|
||||||
if (page_no != FIL_NULL)
|
if (page_no != FIL_NULL)
|
||||||
{
|
{
|
||||||
const trx_undo_t *undo= trx_undo_mem_create_at_db_start(rseg, i, page_no,
|
const trx_undo_t *undo=
|
||||||
max_trx_id);
|
trx_undo_mem_create_at_db_start(rseg, i, page_no);
|
||||||
if (!undo)
|
if (!undo)
|
||||||
return DB_CORRUPTION;
|
return DB_CORRUPTION;
|
||||||
if (is_undo_empty)
|
if (is_undo_empty)
|
||||||
@@ -439,11 +438,9 @@ static dberr_t trx_undo_lists_init(trx_rseg_t *rseg, trx_id_t &max_trx_id,
|
|||||||
|
|
||||||
/** Restore the state of a persistent rollback segment.
|
/** Restore the state of a persistent rollback segment.
|
||||||
@param[in,out] rseg persistent rollback segment
|
@param[in,out] rseg persistent rollback segment
|
||||||
@param[in,out] max_trx_id maximum observed transaction identifier
|
|
||||||
@param[in,out] mtr mini-transaction
|
@param[in,out] mtr mini-transaction
|
||||||
@return error code */
|
@return error code */
|
||||||
static dberr_t trx_rseg_mem_restore(trx_rseg_t *rseg, trx_id_t &max_trx_id,
|
static dberr_t trx_rseg_mem_restore(trx_rseg_t *rseg, mtr_t *mtr)
|
||||||
mtr_t *mtr)
|
|
||||||
{
|
{
|
||||||
if (!rseg->space)
|
if (!rseg->space)
|
||||||
return DB_TABLESPACE_NOT_FOUND;
|
return DB_TABLESPACE_NOT_FOUND;
|
||||||
@@ -459,8 +456,8 @@ static dberr_t trx_rseg_mem_restore(trx_rseg_t *rseg, trx_id_t &max_trx_id,
|
|||||||
trx_id_t id= mach_read_from_8(TRX_RSEG + TRX_RSEG_MAX_TRX_ID +
|
trx_id_t id= mach_read_from_8(TRX_RSEG + TRX_RSEG_MAX_TRX_ID +
|
||||||
rseg_hdr->page.frame);
|
rseg_hdr->page.frame);
|
||||||
|
|
||||||
if (id > max_trx_id)
|
if (id > rseg->needs_purge)
|
||||||
max_trx_id= id;
|
rseg->needs_purge= id;
|
||||||
|
|
||||||
const byte *binlog_name=
|
const byte *binlog_name=
|
||||||
TRX_RSEG + TRX_RSEG_BINLOG_NAME + rseg_hdr->page.frame;
|
TRX_RSEG + TRX_RSEG_BINLOG_NAME + rseg_hdr->page.frame;
|
||||||
@@ -496,7 +493,7 @@ static dberr_t trx_rseg_mem_restore(trx_rseg_t *rseg, trx_id_t &max_trx_id,
|
|||||||
|
|
||||||
rseg->curr_size = mach_read_from_4(TRX_RSEG + TRX_RSEG_HISTORY_SIZE +
|
rseg->curr_size = mach_read_from_4(TRX_RSEG + TRX_RSEG_HISTORY_SIZE +
|
||||||
rseg_hdr->page.frame) + 1;
|
rseg_hdr->page.frame) + 1;
|
||||||
err= trx_undo_lists_init(rseg, max_trx_id, rseg_hdr);
|
err= trx_undo_lists_init(rseg, rseg_hdr);
|
||||||
if (err != DB_SUCCESS);
|
if (err != DB_SUCCESS);
|
||||||
else if (auto len= flst_get_len(TRX_RSEG + TRX_RSEG_HISTORY +
|
else if (auto len= flst_get_len(TRX_RSEG + TRX_RSEG_HISTORY +
|
||||||
rseg_hdr->page.frame))
|
rseg_hdr->page.frame))
|
||||||
@@ -517,19 +514,16 @@ static dberr_t trx_rseg_mem_restore(trx_rseg_t *rseg, trx_id_t &max_trx_id,
|
|||||||
|
|
||||||
trx_id_t id= mach_read_from_8(block->page.frame + node_addr.boffset +
|
trx_id_t id= mach_read_from_8(block->page.frame + node_addr.boffset +
|
||||||
TRX_UNDO_TRX_ID);
|
TRX_UNDO_TRX_ID);
|
||||||
if (id > max_trx_id)
|
if (id > rseg->needs_purge)
|
||||||
max_trx_id= id;
|
rseg->needs_purge= id;
|
||||||
id= mach_read_from_8(block->page.frame + node_addr.boffset +
|
id= mach_read_from_8(block->page.frame + node_addr.boffset +
|
||||||
TRX_UNDO_TRX_NO);
|
TRX_UNDO_TRX_NO);
|
||||||
if (id > max_trx_id)
|
if (id > rseg->needs_purge)
|
||||||
max_trx_id= id;
|
rseg->needs_purge= id;
|
||||||
|
|
||||||
rseg->set_last_commit(node_addr.boffset, id);
|
rseg->set_last_commit(node_addr.boffset, id);
|
||||||
unsigned purge= mach_read_from_2(block->page.frame + node_addr.boffset +
|
ut_ad(mach_read_from_2(block->page.frame + node_addr.boffset +
|
||||||
TRX_UNDO_NEEDS_PURGE);
|
TRX_UNDO_NEEDS_PURGE) <= 1);
|
||||||
ut_ad(purge <= 1);
|
|
||||||
if (purge != 0)
|
|
||||||
rseg->set_needs_purge();
|
|
||||||
|
|
||||||
if (rseg->last_page_no != FIL_NULL)
|
if (rseg->last_page_no != FIL_NULL)
|
||||||
/* There is no need to cover this operation by the purge
|
/* There is no need to cover this operation by the purge
|
||||||
@@ -617,9 +611,11 @@ dberr_t trx_rseg_array_init()
|
|||||||
|
|
||||||
rseg.init(rseg_space, page_no);
|
rseg.init(rseg_space, page_no);
|
||||||
ut_ad(rseg.is_persistent());
|
ut_ad(rseg.is_persistent());
|
||||||
if ((err = trx_rseg_mem_restore(
|
err = trx_rseg_mem_restore(&rseg, &mtr);
|
||||||
&rseg, max_trx_id, &mtr))
|
if (rseg.needs_purge > max_trx_id) {
|
||||||
!= DB_SUCCESS) {
|
max_trx_id = rseg.needs_purge;
|
||||||
|
}
|
||||||
|
if (err != DB_SUCCESS) {
|
||||||
mtr.commit();
|
mtr.commit();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@@ -651,6 +651,7 @@ static dberr_t trx_resurrect(trx_undo_t *undo, trx_rseg_t *rseg,
|
|||||||
uint64_t *rows_to_undo)
|
uint64_t *rows_to_undo)
|
||||||
{
|
{
|
||||||
trx_state_t state;
|
trx_state_t state;
|
||||||
|
ut_ad(rseg->needs_purge >= undo->trx_id);
|
||||||
/*
|
/*
|
||||||
This is single-threaded startup code, we do not need the
|
This is single-threaded startup code, we do not need the
|
||||||
protection of trx->mutex here.
|
protection of trx->mutex here.
|
||||||
@@ -673,6 +674,7 @@ static dberr_t trx_resurrect(trx_undo_t *undo, trx_rseg_t *rseg,
|
|||||||
return DB_SUCCESS;
|
return DB_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rseg->acquire();
|
||||||
trx_t *trx= trx_create();
|
trx_t *trx= trx_create();
|
||||||
trx->state= state;
|
trx->state= state;
|
||||||
ut_d(trx->start_file= __FILE__);
|
ut_d(trx->start_file= __FILE__);
|
||||||
@@ -681,12 +683,6 @@ static dberr_t trx_resurrect(trx_undo_t *undo, trx_rseg_t *rseg,
|
|||||||
trx->rsegs.m_redo.undo= undo;
|
trx->rsegs.m_redo.undo= undo;
|
||||||
trx->undo_no= undo->top_undo_no + 1;
|
trx->undo_no= undo->top_undo_no + 1;
|
||||||
trx->rsegs.m_redo.rseg= rseg;
|
trx->rsegs.m_redo.rseg= rseg;
|
||||||
/*
|
|
||||||
For transactions with active data will not have rseg size = 1
|
|
||||||
or will not qualify for purge limit criteria. So it is safe to increment
|
|
||||||
this trx_ref_count w/o mutex protection.
|
|
||||||
*/
|
|
||||||
trx->rsegs.m_redo.rseg->acquire();
|
|
||||||
trx->xid= undo->xid;
|
trx->xid= undo->xid;
|
||||||
trx->id= undo->trx_id;
|
trx->id= undo->trx_id;
|
||||||
trx->is_recovered= true;
|
trx->is_recovered= true;
|
||||||
@@ -765,6 +761,7 @@ func_exit:
|
|||||||
ut_ad(trx->is_recovered);
|
ut_ad(trx->is_recovered);
|
||||||
ut_ad(trx->rsegs.m_redo.rseg == &rseg);
|
ut_ad(trx->rsegs.m_redo.rseg == &rseg);
|
||||||
ut_ad(rseg.is_referenced());
|
ut_ad(rseg.is_referenced());
|
||||||
|
ut_ad(rseg.needs_purge);
|
||||||
|
|
||||||
trx->rsegs.m_redo.undo = undo;
|
trx->rsegs.m_redo.undo = undo;
|
||||||
if (undo->top_undo_no >= trx->undo_no) {
|
if (undo->top_undo_no >= trx->undo_no) {
|
||||||
@@ -799,20 +796,18 @@ func_exit:
|
|||||||
|
|
||||||
/** Assign a persistent rollback segment in a round-robin fashion,
|
/** Assign a persistent rollback segment in a round-robin fashion,
|
||||||
evenly distributed between 0 and innodb_undo_logs-1
|
evenly distributed between 0 and innodb_undo_logs-1
|
||||||
@return persistent rollback segment
|
@param trx transaction */
|
||||||
@retval NULL if innodb_read_only */
|
static void trx_assign_rseg_low(trx_t *trx)
|
||||||
static trx_rseg_t* trx_assign_rseg_low()
|
|
||||||
{
|
{
|
||||||
if (high_level_read_only) {
|
ut_ad(!trx->rsegs.m_redo.rseg);
|
||||||
ut_ad(!srv_available_undo_logs);
|
|
||||||
return(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
ut_ad(srv_available_undo_logs == TRX_SYS_N_RSEGS);
|
ut_ad(srv_available_undo_logs == TRX_SYS_N_RSEGS);
|
||||||
|
|
||||||
/* The first slot is always assigned to the system tablespace. */
|
/* The first slot is always assigned to the system tablespace. */
|
||||||
ut_ad(trx_sys.rseg_array[0].space == fil_system.sys_space);
|
ut_ad(trx_sys.rseg_array[0].space == fil_system.sys_space);
|
||||||
|
|
||||||
|
trx_sys.register_rw(trx);
|
||||||
|
ut_ad(trx->id);
|
||||||
|
|
||||||
/* Choose a rollback segment evenly distributed between 0 and
|
/* Choose a rollback segment evenly distributed between 0 and
|
||||||
innodb_undo_logs-1 in a round-robin fashion, skipping those
|
innodb_undo_logs-1 in a round-robin fashion, skipping those
|
||||||
undo tablespaces that are scheduled for truncation. */
|
undo tablespaces that are scheduled for truncation. */
|
||||||
@@ -826,7 +821,7 @@ static trx_rseg_t* trx_assign_rseg_low()
|
|||||||
bool look_for_rollover = false;
|
bool look_for_rollover = false;
|
||||||
#endif /* UNIV_DEBUG */
|
#endif /* UNIV_DEBUG */
|
||||||
|
|
||||||
bool allocated = false;
|
bool allocated;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
for (;;) {
|
for (;;) {
|
||||||
@@ -875,9 +870,7 @@ static trx_rseg_t* trx_assign_rseg_low()
|
|||||||
allocated = rseg->acquire_if_available();
|
allocated = rseg->acquire_if_available();
|
||||||
} while (!allocated);
|
} while (!allocated);
|
||||||
|
|
||||||
ut_ad(rseg->is_referenced());
|
trx->rsegs.m_redo.rseg = rseg;
|
||||||
ut_ad(rseg->is_persistent());
|
|
||||||
return(rseg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Assign a rollback segment for modifying temporary tables.
|
/** Assign a rollback segment for modifying temporary tables.
|
||||||
@@ -960,15 +953,11 @@ trx_start_low(
|
|||||||
|
|
||||||
if (!trx->read_only
|
if (!trx->read_only
|
||||||
&& (!trx->mysql_thd || read_write || trx->dict_operation)) {
|
&& (!trx->mysql_thd || read_write || trx->dict_operation)) {
|
||||||
|
|
||||||
/* Temporary rseg is assigned only if the transaction
|
/* Temporary rseg is assigned only if the transaction
|
||||||
updates a temporary table */
|
updates a temporary table */
|
||||||
trx->rsegs.m_redo.rseg = trx_assign_rseg_low();
|
if (!high_level_read_only) {
|
||||||
ut_ad(trx->rsegs.m_redo.rseg != 0
|
trx_assign_rseg_low(trx);
|
||||||
|| srv_read_only_mode
|
}
|
||||||
|| srv_force_recovery >= SRV_FORCE_NO_TRX_UNDO);
|
|
||||||
|
|
||||||
trx_sys.register_rw(trx);
|
|
||||||
} else {
|
} else {
|
||||||
if (!trx->is_autocommit_non_locking()) {
|
if (!trx->is_autocommit_non_locking()) {
|
||||||
|
|
||||||
@@ -1059,25 +1048,21 @@ trx_write_serialisation_history(
|
|||||||
|
|
||||||
trx_undo_t*& undo = trx->rsegs.m_redo.undo;
|
trx_undo_t*& undo = trx->rsegs.m_redo.undo;
|
||||||
|
|
||||||
if (!undo) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ut_ad(!trx->read_only);
|
ut_ad(!trx->read_only);
|
||||||
ut_ad(!undo || undo->rseg == rseg);
|
|
||||||
rseg->latch.wr_lock(SRW_LOCK_CALL);
|
|
||||||
|
|
||||||
/* Assign the transaction serialisation number and add any
|
/* Assign the transaction serialisation number and add any
|
||||||
undo log to the purge queue. */
|
undo log to the purge queue. */
|
||||||
trx_serialise(trx);
|
|
||||||
if (undo) {
|
if (undo) {
|
||||||
|
rseg->latch.wr_lock(SRW_LOCK_CALL);
|
||||||
|
ut_ad(undo->rseg == rseg);
|
||||||
|
trx_serialise(trx);
|
||||||
UT_LIST_REMOVE(rseg->undo_list, undo);
|
UT_LIST_REMOVE(rseg->undo_list, undo);
|
||||||
trx_purge_add_undo_to_history(trx, undo, mtr);
|
trx_purge_add_undo_to_history(trx, undo, mtr);
|
||||||
|
MONITOR_INC(MONITOR_TRX_COMMIT_UNDO);
|
||||||
|
rseg->latch.wr_unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
rseg->latch.wr_unlock();
|
rseg->release();
|
||||||
|
|
||||||
MONITOR_INC(MONITOR_TRX_COMMIT_UNDO);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/********************************************************************
|
/********************************************************************
|
||||||
@@ -1313,10 +1298,6 @@ TRANSACTIONAL_INLINE inline void trx_t::commit_in_memory(const mtr_t *mtr)
|
|||||||
release_locks();
|
release_locks();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (trx_rseg_t *rseg= rsegs.m_redo.rseg)
|
|
||||||
/* This is safe due to us having detached the persistent undo log. */
|
|
||||||
rseg->release();
|
|
||||||
|
|
||||||
if (mtr)
|
if (mtr)
|
||||||
{
|
{
|
||||||
if (trx_undo_t *&undo= rsegs.m_noredo.undo)
|
if (trx_undo_t *&undo= rsegs.m_noredo.undo)
|
||||||
@@ -1454,6 +1435,13 @@ TRANSACTIONAL_TARGET void trx_t::commit_low(mtr_t *mtr)
|
|||||||
|
|
||||||
mtr->commit();
|
mtr->commit();
|
||||||
}
|
}
|
||||||
|
else if (trx_rseg_t *rseg= rsegs.m_redo.rseg)
|
||||||
|
{
|
||||||
|
ut_ad(id);
|
||||||
|
ut_ad(!rsegs.m_redo.undo);
|
||||||
|
rseg->release();
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef ENABLED_DEBUG_SYNC
|
#ifdef ENABLED_DEBUG_SYNC
|
||||||
if (debug_sync)
|
if (debug_sync)
|
||||||
DEBUG_SYNC_C("before_trx_state_committed_in_memory");
|
DEBUG_SYNC_C("before_trx_state_committed_in_memory");
|
||||||
@@ -2170,11 +2158,7 @@ trx_set_rw_mode(
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
trx->rsegs.m_redo.rseg = trx_assign_rseg_low();
|
trx_assign_rseg_low(trx);
|
||||||
ut_ad(trx->rsegs.m_redo.rseg != 0);
|
|
||||||
|
|
||||||
trx_sys.register_rw(trx);
|
|
||||||
ut_ad(trx->id);
|
|
||||||
|
|
||||||
/* So that we can see our own changes. */
|
/* So that we can see our own changes. */
|
||||||
if (trx->read_view.is_open()) {
|
if (trx->read_view.is_open()) {
|
||||||
|
@@ -1011,12 +1011,10 @@ static void trx_undo_seg_free(const trx_undo_t *undo)
|
|||||||
@param[in,out] rseg rollback segment
|
@param[in,out] rseg rollback segment
|
||||||
@param[in] id rollback segment slot
|
@param[in] id rollback segment slot
|
||||||
@param[in] page_no undo log segment page number
|
@param[in] page_no undo log segment page number
|
||||||
@param[in,out] max_trx_id the largest observed transaction ID
|
|
||||||
@return the undo log
|
@return the undo log
|
||||||
@retval nullptr on error */
|
@retval nullptr on error */
|
||||||
trx_undo_t *
|
trx_undo_t *
|
||||||
trx_undo_mem_create_at_db_start(trx_rseg_t *rseg, ulint id, uint32_t page_no,
|
trx_undo_mem_create_at_db_start(trx_rseg_t *rseg, ulint id, uint32_t page_no)
|
||||||
trx_id_t &max_trx_id)
|
|
||||||
{
|
{
|
||||||
mtr_t mtr;
|
mtr_t mtr;
|
||||||
XID xid;
|
XID xid;
|
||||||
@@ -1054,10 +1052,21 @@ corrupted_type:
|
|||||||
const trx_ulogf_t* const undo_header = block->page.frame + offset;
|
const trx_ulogf_t* const undo_header = block->page.frame + offset;
|
||||||
uint16_t state = mach_read_from_2(TRX_UNDO_SEG_HDR + TRX_UNDO_STATE
|
uint16_t state = mach_read_from_2(TRX_UNDO_SEG_HDR + TRX_UNDO_STATE
|
||||||
+ block->page.frame);
|
+ block->page.frame);
|
||||||
|
|
||||||
|
const trx_id_t trx_id= mach_read_from_8(undo_header + TRX_UNDO_TRX_ID);
|
||||||
|
if (trx_id >> 48) {
|
||||||
|
sql_print_error("InnoDB: corrupted TRX_ID %llx", trx_id);
|
||||||
|
goto corrupted;
|
||||||
|
}
|
||||||
|
/* We will increment rseg->needs_purge, like trx_undo_reuse_cached()
|
||||||
|
would do it, to avoid trouble on rollback or XA COMMIT. */
|
||||||
|
trx_id_t trx_no = trx_id + 1;
|
||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case TRX_UNDO_ACTIVE:
|
case TRX_UNDO_ACTIVE:
|
||||||
case TRX_UNDO_PREPARED:
|
case TRX_UNDO_PREPARED:
|
||||||
if (UNIV_LIKELY(type != 1)) {
|
if (UNIV_LIKELY(type != 1)) {
|
||||||
|
trx_no = trx_id + 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
sql_print_error("InnoDB: upgrade from older version than"
|
sql_print_error("InnoDB: upgrade from older version than"
|
||||||
@@ -1080,13 +1089,14 @@ corrupted_type:
|
|||||||
goto corrupted_type;
|
goto corrupted_type;
|
||||||
}
|
}
|
||||||
read_trx_no:
|
read_trx_no:
|
||||||
trx_id_t id = mach_read_from_8(TRX_UNDO_TRX_NO + undo_header);
|
trx_no = mach_read_from_8(TRX_UNDO_TRX_NO + undo_header);
|
||||||
if (id >> 48) {
|
if (trx_no >> 48) {
|
||||||
sql_print_error("InnoDB: corrupted TRX_NO %llx", id);
|
sql_print_error("InnoDB: corrupted TRX_NO %llx",
|
||||||
|
trx_no);
|
||||||
goto corrupted;
|
goto corrupted;
|
||||||
}
|
}
|
||||||
if (id > max_trx_id) {
|
if (trx_no < trx_id) {
|
||||||
max_trx_id = id;
|
trx_no = trx_id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1099,13 +1109,8 @@ corrupted_type:
|
|||||||
xid.null();
|
xid.null();
|
||||||
}
|
}
|
||||||
|
|
||||||
trx_id_t trx_id = mach_read_from_8(undo_header + TRX_UNDO_TRX_ID);
|
if (trx_no > rseg->needs_purge) {
|
||||||
if (trx_id >> 48) {
|
rseg->needs_purge = trx_no;
|
||||||
sql_print_error("InnoDB: corrupted TRX_ID %llx", trx_id);
|
|
||||||
goto corrupted;
|
|
||||||
}
|
|
||||||
if (trx_id > max_trx_id) {
|
|
||||||
max_trx_id = trx_id;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
trx_undo_t* undo = trx_undo_mem_create(
|
trx_undo_t* undo = trx_undo_mem_create(
|
||||||
@@ -1296,6 +1301,22 @@ buf_block_t*
|
|||||||
trx_undo_reuse_cached(trx_t* trx, trx_rseg_t* rseg, trx_undo_t** pundo,
|
trx_undo_reuse_cached(trx_t* trx, trx_rseg_t* rseg, trx_undo_t** pundo,
|
||||||
mtr_t* mtr)
|
mtr_t* mtr)
|
||||||
{
|
{
|
||||||
|
if (rseg->is_persistent()) {
|
||||||
|
ut_ad(rseg->is_referenced());
|
||||||
|
if (rseg->needs_purge <= trx->id) {
|
||||||
|
/* trx_purge_truncate_history() compares
|
||||||
|
rseg->needs_purge <= head.trx_no
|
||||||
|
so we need to compensate for that.
|
||||||
|
The rseg->needs_purge after crash
|
||||||
|
recovery would be at least trx->id + 1,
|
||||||
|
because that is the minimum possible value
|
||||||
|
assigned by trx_serialise() on commit. */
|
||||||
|
rseg->needs_purge = trx->id + 1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ut_ad(!rseg->is_referenced());
|
||||||
|
}
|
||||||
|
|
||||||
trx_undo_t* undo = UT_LIST_GET_FIRST(rseg->undo_cached);
|
trx_undo_t* undo = UT_LIST_GET_FIRST(rseg->undo_cached);
|
||||||
if (!undo) {
|
if (!undo) {
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -1395,9 +1416,8 @@ buf_block_t*
|
|||||||
trx_undo_assign_low(trx_t* trx, trx_rseg_t* rseg, trx_undo_t** undo,
|
trx_undo_assign_low(trx_t* trx, trx_rseg_t* rseg, trx_undo_t** undo,
|
||||||
dberr_t* err, mtr_t* mtr)
|
dberr_t* err, mtr_t* mtr)
|
||||||
{
|
{
|
||||||
ut_d(const bool is_temp = rseg == trx->rsegs.m_noredo.rseg);
|
ut_d(const bool is_temp = rseg == trx->rsegs.m_noredo.rseg);
|
||||||
ut_ad(rseg == trx->rsegs.m_redo.rseg
|
ut_ad(is_temp || rseg == trx->rsegs.m_redo.rseg);
|
||||||
|| rseg == trx->rsegs.m_noredo.rseg);
|
|
||||||
ut_ad(undo == (is_temp
|
ut_ad(undo == (is_temp
|
||||||
? &trx->rsegs.m_noredo.undo
|
? &trx->rsegs.m_noredo.undo
|
||||||
: &trx->rsegs.m_redo.undo));
|
: &trx->rsegs.m_redo.undo));
|
||||||
@@ -1417,7 +1437,6 @@ trx_undo_assign_low(trx_t* trx, trx_rseg_t* rseg, trx_undo_t** undo,
|
|||||||
);
|
);
|
||||||
|
|
||||||
rseg->latch.wr_lock(SRW_LOCK_CALL);
|
rseg->latch.wr_lock(SRW_LOCK_CALL);
|
||||||
|
|
||||||
buf_block_t* block = trx_undo_reuse_cached(trx, rseg, undo, mtr);
|
buf_block_t* block = trx_undo_reuse_cached(trx, rseg, undo, mtr);
|
||||||
|
|
||||||
if (!block) {
|
if (!block) {
|
||||||
|
@@ -41,7 +41,9 @@ ADD_EXECUTABLE(conf_to_src EXCLUDE_FROM_ALL conf_to_src.c)
|
|||||||
SET_TARGET_PROPERTIES(conf_to_src PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD TRUE)
|
SET_TARGET_PROPERTIES(conf_to_src PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD TRUE)
|
||||||
TARGET_LINK_LIBRARIES(conf_to_src mysys strings)
|
TARGET_LINK_LIBRARIES(conf_to_src mysys strings)
|
||||||
|
|
||||||
ADD_EXECUTABLE(uca-dump uca-dump.c)
|
IF(NOT CMAKE_CROSSCOMPILING OR DEFINED CMAKE_CROSSCOMPILING_EMULATOR)
|
||||||
|
ADD_EXECUTABLE(uca-dump uca-dump.c)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
ADD_CUSTOM_COMMAND(
|
ADD_CUSTOM_COMMAND(
|
||||||
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/ctype-uca1400data.h
|
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/ctype-uca1400data.h
|
||||||
|
@@ -78,7 +78,7 @@ static uint get_collation_number(const char *name)
|
|||||||
cs < all_charsets + array_elements(all_charsets);
|
cs < all_charsets + array_elements(all_charsets);
|
||||||
cs++)
|
cs++)
|
||||||
{
|
{
|
||||||
if (cs->name && !strcmp(cs->name, name))
|
if (cs->coll_name.str && !strcmp(cs->coll_name.str, name))
|
||||||
return cs->number;
|
return cs->number;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@@ -93,8 +93,8 @@ get_charset_number_internal(const char *charset_name, uint cs_flags)
|
|||||||
cs < all_charsets + array_elements(all_charsets);
|
cs < all_charsets + array_elements(all_charsets);
|
||||||
cs++)
|
cs++)
|
||||||
{
|
{
|
||||||
if (cs->csname && (cs->state & cs_flags) &&
|
if (cs->cs_name.str && (cs->state & cs_flags) &&
|
||||||
!strcmp(cs->csname, charset_name))
|
!strcmp(cs->cs_name.str, charset_name))
|
||||||
return cs->number;
|
return cs->number;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@@ -114,17 +114,23 @@ static void simple_cs_copy_data(struct charset_info_st *to, CHARSET_INFO *from)
|
|||||||
to->number= from->number ? from->number : to->number;
|
to->number= from->number ? from->number : to->number;
|
||||||
to->state|= from->state;
|
to->state|= from->state;
|
||||||
|
|
||||||
if (from->csname)
|
if (from->cs_name.str)
|
||||||
to->csname= strdup(from->csname);
|
{
|
||||||
|
to->cs_name.str= strndup(from->cs_name.str, from->cs_name.length);
|
||||||
|
to->cs_name.length= from->cs_name.length;
|
||||||
|
}
|
||||||
|
|
||||||
if (from->name)
|
if (from->coll_name.str)
|
||||||
to->name= strdup(from->name);
|
{
|
||||||
|
to->coll_name.str= strndup(from->coll_name.str, from->coll_name.length);
|
||||||
|
to->coll_name.length= from->coll_name.length;
|
||||||
|
}
|
||||||
|
|
||||||
if (from->tailoring)
|
if (from->tailoring)
|
||||||
to->tailoring= strdup(from->tailoring);
|
to->tailoring= strdup(from->tailoring);
|
||||||
|
|
||||||
if (from->ctype)
|
if (from->m_ctype)
|
||||||
to->ctype= (uchar*) mdup((char*) from->ctype, MY_CS_CTYPE_TABLE_SIZE);
|
to->m_ctype= (uchar*) mdup((char*) from->m_ctype, MY_CS_CTYPE_TABLE_SIZE);
|
||||||
if (from->to_lower)
|
if (from->to_lower)
|
||||||
to->to_lower= (uchar*) mdup((char*) from->to_lower, MY_CS_TO_LOWER_TABLE_SIZE);
|
to->to_lower= (uchar*) mdup((char*) from->to_lower, MY_CS_TO_LOWER_TABLE_SIZE);
|
||||||
if (from->to_upper)
|
if (from->to_upper)
|
||||||
@@ -160,9 +166,9 @@ static void inherit_charset_data(struct charset_info_st *cs,
|
|||||||
CHARSET_INFO *refcs)
|
CHARSET_INFO *refcs)
|
||||||
{
|
{
|
||||||
cs->state|= (refcs->state & (MY_CS_PUREASCII|MY_CS_NONASCII));
|
cs->state|= (refcs->state & (MY_CS_PUREASCII|MY_CS_NONASCII));
|
||||||
if (refcs->ctype && cs->ctype &&
|
if (refcs->m_ctype && cs->m_ctype &&
|
||||||
!memcmp(cs->ctype, refcs->ctype, MY_CS_CTYPE_TABLE_SIZE))
|
!memcmp(cs->m_ctype, refcs->m_ctype, MY_CS_CTYPE_TABLE_SIZE))
|
||||||
cs->ctype= NULL;
|
cs->m_ctype= NULL;
|
||||||
if (refcs->to_lower && cs->to_lower &&
|
if (refcs->to_lower && cs->to_lower &&
|
||||||
!memcmp(cs->to_lower, refcs->to_lower, MY_CS_TO_LOWER_TABLE_SIZE))
|
!memcmp(cs->to_lower, refcs->to_lower, MY_CS_TO_LOWER_TABLE_SIZE))
|
||||||
cs->to_lower= NULL;
|
cs->to_lower= NULL;
|
||||||
@@ -179,7 +185,7 @@ static void inherit_charset_data(struct charset_info_st *cs,
|
|||||||
static CHARSET_INFO *find_charset_data_inheritance_source(CHARSET_INFO *cs)
|
static CHARSET_INFO *find_charset_data_inheritance_source(CHARSET_INFO *cs)
|
||||||
{
|
{
|
||||||
CHARSET_INFO *refcs;
|
CHARSET_INFO *refcs;
|
||||||
uint refid= get_charset_number_internal(cs->csname, MY_CS_PRIMARY);
|
uint refid= get_charset_number_internal(cs->cs_name.str, MY_CS_PRIMARY);
|
||||||
return refid && refid != cs->number &&
|
return refid && refid != cs->number &&
|
||||||
(refcs= &all_charsets[refid]) &&
|
(refcs= &all_charsets[refid]) &&
|
||||||
(refcs->state & MY_CS_LOADED) ? refcs : NULL;
|
(refcs->state & MY_CS_LOADED) ? refcs : NULL;
|
||||||
@@ -197,16 +203,16 @@ static CHARSET_INFO *find_charset_data_inheritance_source(CHARSET_INFO *cs)
|
|||||||
*/
|
*/
|
||||||
static my_bool simple_cs_is_full(CHARSET_INFO *cs)
|
static my_bool simple_cs_is_full(CHARSET_INFO *cs)
|
||||||
{
|
{
|
||||||
return ((cs->csname && cs->tab_to_uni && cs->ctype && cs->to_upper &&
|
return ((cs->cs_name.str && cs->tab_to_uni && cs->m_ctype && cs->to_upper &&
|
||||||
cs->to_lower) &&
|
cs->to_lower) &&
|
||||||
(cs->number && cs->name &&
|
(cs->number && cs->coll_name.str &&
|
||||||
(cs->sort_order || cs->tailoring || (cs->state & MY_CS_BINSORT))));
|
(cs->sort_order || cs->tailoring || (cs->state & MY_CS_BINSORT))));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int add_collation(struct charset_info_st *cs)
|
static int add_collation(struct charset_info_st *cs)
|
||||||
{
|
{
|
||||||
if (cs->name &&
|
if (cs->coll_name.str &&
|
||||||
(cs->number || (cs->number= get_collation_number(cs->name))))
|
(cs->number || (cs->number= get_collation_number(cs->coll_name.str))))
|
||||||
{
|
{
|
||||||
if (!(all_charsets[cs->number].state & MY_CS_COMPILED))
|
if (!(all_charsets[cs->number].state & MY_CS_COMPILED))
|
||||||
{
|
{
|
||||||
@@ -215,7 +221,8 @@ static int add_collation(struct charset_info_st *cs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
cs->number= 0;
|
cs->number= 0;
|
||||||
cs->name= NULL;
|
cs->coll_name.str= 0;
|
||||||
|
cs->coll_name.length= 0;
|
||||||
cs->tailoring= NULL;
|
cs->tailoring= NULL;
|
||||||
cs->state= 0;
|
cs->state= 0;
|
||||||
cs->sort_order= NULL;
|
cs->sort_order= NULL;
|
||||||
@@ -276,16 +283,16 @@ static int my_read_charset_file(const char *filename)
|
|||||||
|
|
||||||
void print_arrays(FILE *f, CHARSET_INFO *cs)
|
void print_arrays(FILE *f, CHARSET_INFO *cs)
|
||||||
{
|
{
|
||||||
if (cs->ctype)
|
if (cs->m_ctype)
|
||||||
print_array(f, cs->name, "ctype", cs->ctype, MY_CS_CTYPE_TABLE_SIZE);
|
print_array(f, cs->coll_name.str, "ctype", cs->m_ctype, MY_CS_CTYPE_TABLE_SIZE);
|
||||||
if (cs->to_lower)
|
if (cs->to_lower)
|
||||||
print_array(f, cs->name, "to_lower", cs->to_lower, MY_CS_TO_LOWER_TABLE_SIZE);
|
print_array(f, cs->coll_name.str, "to_lower", cs->to_lower, MY_CS_TO_LOWER_TABLE_SIZE);
|
||||||
if (cs->to_upper)
|
if (cs->to_upper)
|
||||||
print_array(f, cs->name, "to_upper", cs->to_upper, MY_CS_TO_UPPER_TABLE_SIZE);
|
print_array(f, cs->coll_name.str, "to_upper", cs->to_upper, MY_CS_TO_UPPER_TABLE_SIZE);
|
||||||
if (cs->sort_order)
|
if (cs->sort_order)
|
||||||
print_array(f, cs->name, "sort_order", cs->sort_order, MY_CS_SORT_ORDER_TABLE_SIZE);
|
print_array(f, cs->coll_name.str, "sort_order", cs->sort_order, MY_CS_SORT_ORDER_TABLE_SIZE);
|
||||||
if (cs->tab_to_uni)
|
if (cs->tab_to_uni)
|
||||||
print_array16(f, cs->name, "to_uni", cs->tab_to_uni, MY_CS_TO_UNI_TABLE_SIZE);
|
print_array16(f, cs->coll_name.str, "to_uni", cs->tab_to_uni, MY_CS_TO_UNI_TABLE_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -332,7 +339,7 @@ print_array_ref(FILE *f,
|
|||||||
CHARSET_INFO *cs= array0 ? cs0 : array1 ? cs1 : NULL;
|
CHARSET_INFO *cs= array0 ? cs0 : array1 ? cs1 : NULL;
|
||||||
if (cs)
|
if (cs)
|
||||||
fprintf(f," %s_%s, /* %s */\n",
|
fprintf(f," %s_%s, /* %s */\n",
|
||||||
name, cs->name, name);
|
name, cs->coll_name.str, name);
|
||||||
else
|
else
|
||||||
fprintf(f," NULL, /* %s */\n", name);
|
fprintf(f," NULL, /* %s */\n", name);
|
||||||
}
|
}
|
||||||
@@ -344,6 +351,12 @@ static const char *nopad_infix(CHARSET_INFO *cs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void fprintf_lex_str_member(FILE *f, const LEX_CSTRING str, const char *comment)
|
||||||
|
{
|
||||||
|
fprintf(f," { STRING_WITH_LEN(\"%s\") }, %s\n", str.str, comment);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void dispcset(FILE *f,CHARSET_INFO *cs)
|
void dispcset(FILE *f,CHARSET_INFO *cs)
|
||||||
{
|
{
|
||||||
fprintf(f,"{\n");
|
fprintf(f,"{\n");
|
||||||
@@ -356,23 +369,23 @@ void dispcset(FILE *f,CHARSET_INFO *cs)
|
|||||||
cs->state & MY_CS_NONASCII ? "|MY_CS_NONASCII" : "",
|
cs->state & MY_CS_NONASCII ? "|MY_CS_NONASCII" : "",
|
||||||
cs->state & MY_CS_NOPAD ? "|MY_CS_NOPAD" : "");
|
cs->state & MY_CS_NOPAD ? "|MY_CS_NOPAD" : "");
|
||||||
|
|
||||||
if (cs->name)
|
if (cs->coll_name.str)
|
||||||
{
|
{
|
||||||
CHARSET_INFO *srccs= inheritance_source(cs->number);
|
CHARSET_INFO *srccs= inheritance_source(cs->number);
|
||||||
fprintf(f," \"%s\", /* cset name */\n",cs->csname);
|
fprintf_lex_str_member(f, cs->cs_name, "/* cset name */");
|
||||||
fprintf(f," \"%s\", /* coll name */\n",cs->name);
|
fprintf_lex_str_member(f, cs->coll_name, "/* coll name */");
|
||||||
fprintf(f," \"\", /* comment */\n");
|
fprintf(f," \"\", /* comment */\n");
|
||||||
if (cs->tailoring)
|
if (cs->tailoring)
|
||||||
fprintf(f, " \"%s\", /* tailoring */\n", cs->tailoring);
|
fprintf(f, " \"%s\", /* tailoring */\n", cs->tailoring);
|
||||||
else
|
else
|
||||||
fprintf(f," NULL, /* tailoring */\n");
|
fprintf(f," NULL, /* tailoring */\n");
|
||||||
|
|
||||||
print_array_ref(f, cs, cs->ctype, srccs, srccs->ctype, "ctype");
|
print_array_ref(f, cs, cs->m_ctype, srccs, srccs->m_ctype, "ctype");
|
||||||
print_array_ref(f, cs, cs->to_lower, srccs, srccs->to_lower, "to_lower");
|
print_array_ref(f, cs, cs->to_lower, srccs, srccs->to_lower, "to_lower");
|
||||||
print_array_ref(f, cs, cs->to_upper, srccs, srccs->to_upper, "to_upper");
|
print_array_ref(f, cs, cs->to_upper, srccs, srccs->to_upper, "to_upper");
|
||||||
|
|
||||||
if (cs->sort_order)
|
if (cs->sort_order)
|
||||||
fprintf(f," sort_order_%s, /* sort_order */\n",cs->name);
|
fprintf(f," sort_order_%s, /* sort_order */\n", cs->coll_name.str);
|
||||||
else
|
else
|
||||||
fprintf(f," NULL, /* sort_order */\n");
|
fprintf(f," NULL, /* sort_order */\n");
|
||||||
|
|
||||||
@@ -382,8 +395,8 @@ void dispcset(FILE *f,CHARSET_INFO *cs)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
fprintf(f," NULL, /* cset name */\n");
|
fprintf(f," {NULL,0}, /* cset name */\n");
|
||||||
fprintf(f," NULL, /* coll name */\n");
|
fprintf(f," {NULL,0}, /* coll name */\n");
|
||||||
fprintf(f," NULL, /* comment */\n");
|
fprintf(f," NULL, /* comment */\n");
|
||||||
fprintf(f," NULL, /* tailoging */\n");
|
fprintf(f," NULL, /* tailoging */\n");
|
||||||
fprintf(f," NULL, /* ctype */\n");
|
fprintf(f," NULL, /* ctype */\n");
|
||||||
@@ -395,12 +408,11 @@ void dispcset(FILE *f,CHARSET_INFO *cs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
fprintf(f," NULL, /* from_uni */\n");
|
fprintf(f," NULL, /* from_uni */\n");
|
||||||
|
fprintf(f," NULL, /* casefold */\n");
|
||||||
fprintf(f," &my_unicase_default, /* caseinfo */\n");
|
fprintf(f," &my_unicase_default, /* caseinfo */\n");
|
||||||
fprintf(f," NULL, /* state map */\n");
|
fprintf(f," NULL, /* state map */\n");
|
||||||
fprintf(f," NULL, /* ident map */\n");
|
fprintf(f," NULL, /* ident map */\n");
|
||||||
fprintf(f," 1, /* strxfrm_multiply*/\n");
|
fprintf(f," 1, /* strxfrm_multiply*/\n");
|
||||||
fprintf(f," 1, /* caseup_multiply*/\n");
|
|
||||||
fprintf(f," 1, /* casedn_multiply*/\n");
|
|
||||||
fprintf(f," 1, /* mbminlen */\n");
|
fprintf(f," 1, /* mbminlen */\n");
|
||||||
fprintf(f," 1, /* mbmaxlen */\n");
|
fprintf(f," 1, /* mbmaxlen */\n");
|
||||||
fprintf(f," 0, /* min_sort_char */\n");
|
fprintf(f," 0, /* min_sort_char */\n");
|
||||||
@@ -424,7 +436,7 @@ fprint_copyright(FILE *file)
|
|||||||
fprintf(file,
|
fprintf(file,
|
||||||
"/* Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.\n"
|
"/* Copyright 2000-2008 MySQL AB, 2008 Sun Microsystems, Inc.\n"
|
||||||
" Copyright (c) 2000, 2011, Oracle and/or its affiliates.\n"
|
" Copyright (c) 2000, 2011, Oracle and/or its affiliates.\n"
|
||||||
" Copyright 2008-2016 MariaDB Corporation\n"
|
" Copyright 2008-2023 MariaDB Corporation\n"
|
||||||
"\n"
|
"\n"
|
||||||
" This program is free software; you can redistribute it and/or modify\n"
|
" This program is free software; you can redistribute it and/or modify\n"
|
||||||
" it under the terms of the GNU General Public License as published by\n"
|
" it under the terms of the GNU General Public License as published by\n"
|
||||||
@@ -468,9 +480,9 @@ main(int argc, char **argv __attribute__((unused)))
|
|||||||
{
|
{
|
||||||
if (cs->number && !(cs->state & MY_CS_COMPILED))
|
if (cs->number && !(cs->state & MY_CS_COMPILED))
|
||||||
{
|
{
|
||||||
if ( (!simple_cs_is_full(cs)) && (cs->csname))
|
if ( (!simple_cs_is_full(cs)) && (cs->cs_name.str))
|
||||||
{
|
{
|
||||||
sprintf(filename,"%s/%s.xml",argv[1],cs->csname);
|
sprintf(filename,"%s/%s.xml",argv[1], cs->cs_name.str);
|
||||||
my_read_charset_file(filename);
|
my_read_charset_file(filename);
|
||||||
}
|
}
|
||||||
cs->state|= MY_CS_LOADED;
|
cs->state|= MY_CS_LOADED;
|
||||||
@@ -504,7 +516,7 @@ main(int argc, char **argv __attribute__((unused)))
|
|||||||
refids[cs->number]= refcs->number;
|
refids[cs->number]= refcs->number;
|
||||||
inherit_charset_data(cs, refcs);
|
inherit_charset_data(cs, refcs);
|
||||||
}
|
}
|
||||||
fprintf(f,"#ifdef HAVE_CHARSET_%s\n",cs->csname);
|
fprintf(f,"#ifdef HAVE_CHARSET_%s\n", cs->cs_name.str);
|
||||||
print_arrays(f, cs);
|
print_arrays(f, cs);
|
||||||
fprintf(f,"#endif\n");
|
fprintf(f,"#endif\n");
|
||||||
fprintf(f,"\n");
|
fprintf(f,"\n");
|
||||||
@@ -518,7 +530,7 @@ main(int argc, char **argv __attribute__((unused)))
|
|||||||
{
|
{
|
||||||
if (cs->state & MY_CS_LOADED)
|
if (cs->state & MY_CS_LOADED)
|
||||||
{
|
{
|
||||||
fprintf(f,"#ifdef HAVE_CHARSET_%s\n",cs->csname);
|
fprintf(f,"#ifdef HAVE_CHARSET_%s\n", cs->cs_name.str);
|
||||||
dispcset(f,cs);
|
dispcset(f,cs);
|
||||||
fprintf(f,",\n");
|
fprintf(f,",\n");
|
||||||
fprintf(f,"#endif\n");
|
fprintf(f,"#endif\n");
|
||||||
|
1068
strings/ctype-big5.c
1068
strings/ctype-big5.c
File diff suppressed because it is too large
Load Diff
@@ -601,7 +601,9 @@ static MY_CHARSET_HANDLER my_charset_handler=
|
|||||||
my_well_formed_char_length_8bit,
|
my_well_formed_char_length_8bit,
|
||||||
my_copy_8bit,
|
my_copy_8bit,
|
||||||
my_wc_mb_bin,
|
my_wc_mb_bin,
|
||||||
my_wc_to_printable_generic
|
my_wc_to_printable_generic,
|
||||||
|
my_casefold_multiply_1,
|
||||||
|
my_casefold_multiply_1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -620,12 +622,11 @@ struct charset_info_st my_charset_bin =
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default, /* caseinfo */
|
&my_unicase_default, /* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
1, /* mbmaxlen */
|
1, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -617,12 +617,11 @@ struct charset_info_st my_charset_latin2_czech_cs =
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
tab_8859_2_uni, /* tab_to_uni */
|
tab_8859_2_uni, /* tab_to_uni */
|
||||||
idx_uni_8859_2, /* tab_from_uni */
|
idx_uni_8859_2, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default,/* caseinfo */
|
&my_unicase_default,/* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
4, /* strxfrm_multiply */
|
4, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
1, /* mbmaxlen */
|
1, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
1638
strings/ctype-gbk.c
1638
strings/ctype-gbk.c
File diff suppressed because it is too large
Load Diff
@@ -427,7 +427,9 @@ static MY_CHARSET_HANDLER my_charset_handler=
|
|||||||
my_well_formed_char_length_8bit,
|
my_well_formed_char_length_8bit,
|
||||||
my_copy_8bit,
|
my_copy_8bit,
|
||||||
my_wc_mb_bin, /* native_to_mb */
|
my_wc_mb_bin, /* native_to_mb */
|
||||||
my_wc_to_printable_generic
|
my_wc_to_printable_generic,
|
||||||
|
my_casefold_multiply_1,
|
||||||
|
my_casefold_multiply_1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -446,12 +448,11 @@ struct charset_info_st my_charset_latin1=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
cs_to_uni, /* tab_to_uni */
|
cs_to_uni, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default,/* caseinfo */
|
&my_unicase_default,/* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
1, /* mbmaxlen */
|
1, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -479,12 +480,11 @@ struct charset_info_st my_charset_latin1_nopad=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
cs_to_uni, /* tab_to_uni */
|
cs_to_uni, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default, /* caseinfo */
|
&my_unicase_default, /* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
1, /* mbmaxlen */
|
1, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -762,12 +762,11 @@ struct charset_info_st my_charset_latin1_german2_ci=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
cs_to_uni, /* tab_to_uni */
|
cs_to_uni, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default, /* caseinfo */
|
&my_unicase_default, /* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
2, /* strxfrm_multiply */
|
2, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
1, /* mbmaxlen */
|
1, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -795,12 +794,11 @@ struct charset_info_st my_charset_latin1_bin=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
cs_to_uni, /* tab_to_uni */
|
cs_to_uni, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default, /* caseinfo */
|
&my_unicase_default, /* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
1, /* mbmaxlen */
|
1, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -828,12 +826,11 @@ struct charset_info_st my_charset_latin1_nopad_bin=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
cs_to_uni, /* tab_to_uni */
|
cs_to_uni, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default, /* caseinfo */
|
&my_unicase_default, /* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
1, /* mbmaxlen */
|
1, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
|
@@ -63,11 +63,11 @@ size_t my_casedn_str_mb(CHARSET_INFO * cs, char *str)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static inline MY_UNICASE_CHARACTER*
|
static inline MY_CASEFOLD_CHARACTER*
|
||||||
get_case_info_for_ch(CHARSET_INFO *cs, uint page, uint offs)
|
get_case_info_for_ch(CHARSET_INFO *cs, uint page, uint offs)
|
||||||
{
|
{
|
||||||
MY_UNICASE_CHARACTER *p;
|
MY_CASEFOLD_CHARACTER *p;
|
||||||
return cs->caseinfo && (p= cs->caseinfo->page[page]) ? &p[offs] : NULL;
|
return cs->casefold && (p= cs->casefold->page[page]) ? &p[offs] : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -97,7 +97,7 @@ my_casefold_mb(CHARSET_INFO *cs,
|
|||||||
size_t mblen= my_ismbchar(cs, src, srcend);
|
size_t mblen= my_ismbchar(cs, src, srcend);
|
||||||
if (mblen)
|
if (mblen)
|
||||||
{
|
{
|
||||||
MY_UNICASE_CHARACTER *ch;
|
MY_CASEFOLD_CHARACTER *ch;
|
||||||
if ((ch= get_case_info_for_ch(cs, (uchar) src[0], (uchar) src[1])))
|
if ((ch= get_case_info_for_ch(cs, (uchar) src[0], (uchar) src[1])))
|
||||||
{
|
{
|
||||||
int code= is_upper ? ch->toupper : ch->tolower;
|
int code= is_upper ? ch->toupper : ch->tolower;
|
||||||
@@ -125,8 +125,8 @@ size_t
|
|||||||
my_casedn_mb(CHARSET_INFO * cs, const char *src, size_t srclen,
|
my_casedn_mb(CHARSET_INFO * cs, const char *src, size_t srclen,
|
||||||
char *dst, size_t dstlen)
|
char *dst, size_t dstlen)
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(dstlen >= srclen * cs->casedn_multiply);
|
DBUG_ASSERT(dstlen >= srclen * cs->cset->casedn_multiply(cs));
|
||||||
DBUG_ASSERT(src != dst || cs->casedn_multiply == 1);
|
DBUG_ASSERT(src != dst || cs->cset->casedn_multiply(cs) == 1);
|
||||||
return my_casefold_mb(cs, src, srclen, dst, dstlen, cs->to_lower, 0);
|
return my_casefold_mb(cs, src, srclen, dst, dstlen, cs->to_lower, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -135,8 +135,8 @@ size_t
|
|||||||
my_caseup_mb(CHARSET_INFO * cs, const char *src, size_t srclen,
|
my_caseup_mb(CHARSET_INFO * cs, const char *src, size_t srclen,
|
||||||
char *dst, size_t dstlen)
|
char *dst, size_t dstlen)
|
||||||
{
|
{
|
||||||
DBUG_ASSERT(dstlen >= srclen * cs->caseup_multiply);
|
DBUG_ASSERT(dstlen >= srclen * cs->cset->caseup_multiply(cs));
|
||||||
DBUG_ASSERT(src != dst || cs->caseup_multiply == 1);
|
DBUG_ASSERT(src != dst || cs->cset->caseup_multiply(cs) == 1);
|
||||||
return my_casefold_mb(cs, src, srclen, dst, dstlen, cs->to_upper, 1);
|
return my_casefold_mb(cs, src, srclen, dst, dstlen, cs->to_upper, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1483,8 +1483,6 @@ static my_bool
|
|||||||
my_cset_init_8bit(struct charset_info_st *cs, MY_CHARSET_LOADER *loader)
|
my_cset_init_8bit(struct charset_info_st *cs, MY_CHARSET_LOADER *loader)
|
||||||
{
|
{
|
||||||
cs->state|= my_8bit_charset_flags_from_data(cs);
|
cs->state|= my_8bit_charset_flags_from_data(cs);
|
||||||
cs->caseup_multiply= 1;
|
|
||||||
cs->casedn_multiply= 1;
|
|
||||||
cs->pad_char= ' ';
|
cs->pad_char= ' ';
|
||||||
if (!cs->to_lower || !cs->to_upper || !cs->m_ctype || !cs->tab_to_uni)
|
if (!cs->to_lower || !cs->to_upper || !cs->m_ctype || !cs->tab_to_uni)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
@@ -2144,7 +2142,9 @@ MY_CHARSET_HANDLER my_charset_8bit_handler=
|
|||||||
my_well_formed_char_length_8bit,
|
my_well_formed_char_length_8bit,
|
||||||
my_copy_8bit,
|
my_copy_8bit,
|
||||||
my_wc_mb_bin, /* native_to_mb */
|
my_wc_mb_bin, /* native_to_mb */
|
||||||
my_wc_to_printable_8bit
|
my_wc_to_printable_8bit,
|
||||||
|
my_casefold_multiply_1,
|
||||||
|
my_casefold_multiply_1
|
||||||
};
|
};
|
||||||
|
|
||||||
MY_COLLATION_HANDLER my_collation_8bit_simple_ci_handler =
|
MY_COLLATION_HANDLER my_collation_8bit_simple_ci_handler =
|
||||||
|
1634
strings/ctype-sjis.c
1634
strings/ctype-sjis.c
File diff suppressed because it is too large
Load Diff
@@ -933,7 +933,9 @@ static MY_CHARSET_HANDLER my_charset_handler=
|
|||||||
my_well_formed_char_length_8bit,
|
my_well_formed_char_length_8bit,
|
||||||
my_copy_8bit,
|
my_copy_8bit,
|
||||||
my_wc_mb_bin, /* native_to_mb */
|
my_wc_mb_bin, /* native_to_mb */
|
||||||
my_wc_to_printable_generic
|
my_wc_to_printable_generic,
|
||||||
|
my_casefold_multiply_1,
|
||||||
|
my_casefold_multiply_1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -953,12 +955,11 @@ struct charset_info_st my_charset_tis620_thai_ci=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default,/* caseinfo */
|
&my_unicase_default,/* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
4, /* strxfrm_multiply */
|
4, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
1, /* mbmaxlen */
|
1, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -985,12 +986,11 @@ struct charset_info_st my_charset_tis620_bin=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default,/* caseinfo */
|
&my_unicase_default,/* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
1, /* mbmaxlen */
|
1, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -1018,12 +1018,11 @@ struct charset_info_st my_charset_tis620_thai_nopad_ci=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default, /* caseinfo */
|
&my_unicase_default, /* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
4, /* strxfrm_multiply */
|
4, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
1, /* mbmaxlen */
|
1, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -1051,12 +1050,11 @@ struct charset_info_st my_charset_tis620_nopad_bin=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default, /* caseinfo */
|
&my_unicase_default, /* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
1, /* mbmaxlen */
|
1, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -1616,7 +1616,9 @@ MY_CHARSET_HANDLER my_charset_utf16_handler=
|
|||||||
my_well_formed_char_length_utf16,
|
my_well_formed_char_length_utf16,
|
||||||
my_copy_fix_mb2_or_mb4,
|
my_copy_fix_mb2_or_mb4,
|
||||||
my_uni_utf16,
|
my_uni_utf16,
|
||||||
my_wc_to_printable_generic
|
my_wc_to_printable_generic,
|
||||||
|
my_casefold_multiply_1,
|
||||||
|
my_casefold_multiply_1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -1635,12 +1637,11 @@ struct charset_info_st my_charset_utf16_general_ci=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default, /* caseinfo */
|
&my_unicase_default, /* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
2, /* mbminlen */
|
2, /* mbminlen */
|
||||||
4, /* mbmaxlen */
|
4, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -1668,12 +1669,11 @@ struct charset_info_st my_charset_utf16_bin=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default, /* caseinfo */
|
&my_unicase_default, /* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
2, /* mbminlen */
|
2, /* mbminlen */
|
||||||
4, /* mbmaxlen */
|
4, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -1701,12 +1701,11 @@ struct charset_info_st my_charset_utf16_general_nopad_ci=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default, /* caseinfo */
|
&my_unicase_default, /* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
2, /* mbminlen */
|
2, /* mbminlen */
|
||||||
4, /* mbmaxlen */
|
4, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -1735,12 +1734,11 @@ struct charset_info_st my_charset_utf16_nopad_bin=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default, /* caseinfo */
|
&my_unicase_default, /* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
2, /* mbminlen */
|
2, /* mbminlen */
|
||||||
4, /* mbmaxlen */
|
4, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -1977,7 +1975,9 @@ static MY_CHARSET_HANDLER my_charset_utf16le_handler=
|
|||||||
my_well_formed_char_length_utf16,
|
my_well_formed_char_length_utf16,
|
||||||
my_copy_fix_mb2_or_mb4,
|
my_copy_fix_mb2_or_mb4,
|
||||||
my_uni_utf16le,
|
my_uni_utf16le,
|
||||||
my_wc_to_printable_generic
|
my_wc_to_printable_generic,
|
||||||
|
my_casefold_multiply_1,
|
||||||
|
my_casefold_multiply_1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -1996,12 +1996,11 @@ struct charset_info_st my_charset_utf16le_general_ci=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default, /* caseinfo */
|
&my_unicase_default, /* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
2, /* mbminlen */
|
2, /* mbminlen */
|
||||||
4, /* mbmaxlen */
|
4, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -2029,12 +2028,11 @@ struct charset_info_st my_charset_utf16le_bin=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default, /* caseinfo */
|
&my_unicase_default, /* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
2, /* mbminlen */
|
2, /* mbminlen */
|
||||||
4, /* mbmaxlen */
|
4, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -2062,12 +2060,11 @@ struct charset_info_st my_charset_utf16le_general_nopad_ci=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default, /* caseinfo */
|
&my_unicase_default, /* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
2, /* mbminlen */
|
2, /* mbminlen */
|
||||||
4, /* mbmaxlen */
|
4, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -2096,12 +2093,11 @@ struct charset_info_st my_charset_utf16le_nopad_bin=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default, /* caseinfo */
|
&my_unicase_default, /* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
2, /* mbminlen */
|
2, /* mbminlen */
|
||||||
4, /* mbmaxlen */
|
4, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -2823,7 +2819,9 @@ MY_CHARSET_HANDLER my_charset_utf32_handler=
|
|||||||
my_well_formed_char_length_utf32,
|
my_well_formed_char_length_utf32,
|
||||||
my_copy_fix_mb2_or_mb4,
|
my_copy_fix_mb2_or_mb4,
|
||||||
my_uni_utf32,
|
my_uni_utf32,
|
||||||
my_wc_to_printable_generic
|
my_wc_to_printable_generic,
|
||||||
|
my_casefold_multiply_1,
|
||||||
|
my_casefold_multiply_1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -2842,12 +2840,11 @@ struct charset_info_st my_charset_utf32_general_ci=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default, /* caseinfo */
|
&my_unicase_default, /* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
4, /* mbminlen */
|
4, /* mbminlen */
|
||||||
4, /* mbmaxlen */
|
4, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -2875,12 +2872,11 @@ struct charset_info_st my_charset_utf32_bin=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default, /* caseinfo */
|
&my_unicase_default, /* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
4, /* mbminlen */
|
4, /* mbminlen */
|
||||||
4, /* mbmaxlen */
|
4, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -2908,12 +2904,11 @@ struct charset_info_st my_charset_utf32_general_nopad_ci=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default, /* caseinfo */
|
&my_unicase_default, /* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
4, /* mbminlen */
|
4, /* mbminlen */
|
||||||
4, /* mbmaxlen */
|
4, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -2942,12 +2937,11 @@ struct charset_info_st my_charset_utf32_nopad_bin=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default, /* caseinfo */
|
&my_unicase_default, /* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
4, /* mbminlen */
|
4, /* mbminlen */
|
||||||
4, /* mbmaxlen */
|
4, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -3434,7 +3428,9 @@ MY_CHARSET_HANDLER my_charset_ucs2_handler=
|
|||||||
my_well_formed_char_length_ucs2,
|
my_well_formed_char_length_ucs2,
|
||||||
my_copy_fix_mb2_or_mb4,
|
my_copy_fix_mb2_or_mb4,
|
||||||
my_uni_ucs2,
|
my_uni_ucs2,
|
||||||
my_wc_to_printable_generic
|
my_wc_to_printable_generic,
|
||||||
|
my_casefold_multiply_1,
|
||||||
|
my_casefold_multiply_1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -3453,12 +3449,11 @@ struct charset_info_st my_charset_ucs2_general_ci=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default,/* caseinfo */
|
&my_unicase_default,/* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
2, /* mbminlen */
|
2, /* mbminlen */
|
||||||
2, /* mbmaxlen */
|
2, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -3486,12 +3481,11 @@ struct charset_info_st my_charset_ucs2_general_mysql500_ci=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_mysql500, /* caseinfo */
|
&my_unicase_mysql500, /* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
2, /* mbminlen */
|
2, /* mbminlen */
|
||||||
2, /* mbmaxlen */
|
2, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -3519,12 +3513,11 @@ struct charset_info_st my_charset_ucs2_bin=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default,/* caseinfo */
|
&my_unicase_default,/* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
2, /* mbminlen */
|
2, /* mbminlen */
|
||||||
2, /* mbmaxlen */
|
2, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -3552,12 +3545,11 @@ struct charset_info_st my_charset_ucs2_general_nopad_ci=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default, /* caseinfo */
|
&my_unicase_default, /* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
2, /* mbminlen */
|
2, /* mbminlen */
|
||||||
2, /* mbmaxlen */
|
2, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -3585,12 +3577,11 @@ struct charset_info_st my_charset_ucs2_nopad_bin=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default, /* caseinfo */
|
&my_unicase_default, /* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
2, /* mbminlen */
|
2, /* mbminlen */
|
||||||
2, /* mbmaxlen */
|
2, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
|
2152
strings/ctype-ujis.c
2152
strings/ctype-ujis.c
File diff suppressed because it is too large
Load Diff
@@ -4595,7 +4595,7 @@ static MY_UNICASE_CHARACTER u520p104[]={
|
|||||||
|
|
||||||
MY_UNICASE_CHARACTER *my_unicase_pages_unicode520[4352]=
|
MY_UNICASE_CHARACTER *my_unicase_pages_unicode520[4352]=
|
||||||
{
|
{
|
||||||
u520p00, u520p01, u520p02, u520p03, u520p04, u520p05, plane06, plane06,
|
u520p00, u520p01, u520p02, u520p03, u520p04, u520p05, plane06, plane07,
|
||||||
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
u520p10, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
u520p10, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
|
||||||
NULL, NULL, NULL, NULL, NULL, u520p1D, u520p1E, u520p1F,
|
NULL, NULL, NULL, NULL, NULL, u520p1D, u520p1E, u520p1F,
|
||||||
@@ -4656,6 +4656,23 @@ my_tosort_unicode(MY_UNICASE_INFO *uni_plane, my_wc_t *wc, uint flags)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static uint
|
||||||
|
my_casefold_multiply_utf8mbx(CHARSET_INFO *cs)
|
||||||
|
{
|
||||||
|
DBUG_ASSERT(cs->mbminlen == 1 && cs->mbmaxlen >= 3);
|
||||||
|
if (cs->caseinfo == &my_unicase_unicode520)
|
||||||
|
return 2;
|
||||||
|
if (cs->caseinfo == &my_unicase_turkish)
|
||||||
|
return 2;
|
||||||
|
if (cs->caseinfo == &my_unicase_default)
|
||||||
|
return 1;
|
||||||
|
if (cs->caseinfo == &my_unicase_mysql500)
|
||||||
|
return 1;
|
||||||
|
DBUG_ASSERT(0); /*Unknown case folding data */
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Compare string against string with wildcard
|
** Compare string against string with wildcard
|
||||||
** This function is used in UTF8 and UCS2
|
** This function is used in UTF8 and UCS2
|
||||||
@@ -5217,7 +5234,7 @@ static size_t my_caseup_utf8mb3(CHARSET_INFO *cs,
|
|||||||
const char *srcend= src + srclen;
|
const char *srcend= src + srclen;
|
||||||
char *dstend= dst + dstlen, *dst0= dst;
|
char *dstend= dst + dstlen, *dst0= dst;
|
||||||
MY_UNICASE_INFO *uni_plane= cs->caseinfo;
|
MY_UNICASE_INFO *uni_plane= cs->caseinfo;
|
||||||
DBUG_ASSERT(src != dst || cs->caseup_multiply == 1);
|
DBUG_ASSERT(src != dst || cs->cset->caseup_multiply(cs) == 1);
|
||||||
|
|
||||||
while ((src < srcend) &&
|
while ((src < srcend) &&
|
||||||
(srcres= my_utf8mb3_uni(cs, &wc, (uchar *) src, (uchar*) srcend)) > 0)
|
(srcres= my_utf8mb3_uni(cs, &wc, (uchar *) src, (uchar*) srcend)) > 0)
|
||||||
@@ -5270,7 +5287,7 @@ static size_t my_caseup_str_utf8mb3(CHARSET_INFO *cs, char *src)
|
|||||||
int srcres, dstres;
|
int srcres, dstres;
|
||||||
char *dst= src, *dst0= src;
|
char *dst= src, *dst0= src;
|
||||||
MY_UNICASE_INFO *uni_plane= cs->caseinfo;
|
MY_UNICASE_INFO *uni_plane= cs->caseinfo;
|
||||||
DBUG_ASSERT(cs->caseup_multiply == 1);
|
DBUG_ASSERT(cs->cset->caseup_multiply(cs) == 1);
|
||||||
|
|
||||||
while (*src &&
|
while (*src &&
|
||||||
(srcres= my_utf8mb3_uni_no_range(cs, &wc, (uchar *) src)) > 0)
|
(srcres= my_utf8mb3_uni_no_range(cs, &wc, (uchar *) src)) > 0)
|
||||||
@@ -5295,7 +5312,7 @@ static size_t my_casedn_utf8mb3(CHARSET_INFO *cs,
|
|||||||
const char *srcend= src + srclen;
|
const char *srcend= src + srclen;
|
||||||
char *dstend= dst + dstlen, *dst0= dst;
|
char *dstend= dst + dstlen, *dst0= dst;
|
||||||
MY_UNICASE_INFO *uni_plane= cs->caseinfo;
|
MY_UNICASE_INFO *uni_plane= cs->caseinfo;
|
||||||
DBUG_ASSERT(src != dst || cs->casedn_multiply == 1);
|
DBUG_ASSERT(src != dst || cs->cset->casedn_multiply(cs) == 1);
|
||||||
|
|
||||||
while ((src < srcend) &&
|
while ((src < srcend) &&
|
||||||
(srcres= my_utf8mb3_uni(cs, &wc, (uchar*) src, (uchar*)srcend)) > 0)
|
(srcres= my_utf8mb3_uni(cs, &wc, (uchar*) src, (uchar*)srcend)) > 0)
|
||||||
@@ -5316,7 +5333,7 @@ static size_t my_casedn_str_utf8mb3(CHARSET_INFO *cs, char *src)
|
|||||||
int srcres, dstres;
|
int srcres, dstres;
|
||||||
char *dst= src, *dst0= src;
|
char *dst= src, *dst0= src;
|
||||||
MY_UNICASE_INFO *uni_plane= cs->caseinfo;
|
MY_UNICASE_INFO *uni_plane= cs->caseinfo;
|
||||||
DBUG_ASSERT(cs->casedn_multiply == 1);
|
DBUG_ASSERT(cs->cset->casedn_multiply(cs) == 1);
|
||||||
|
|
||||||
while (*src &&
|
while (*src &&
|
||||||
(srcres= my_utf8mb3_uni_no_range(cs, &wc, (uchar *) src)) > 0)
|
(srcres= my_utf8mb3_uni_no_range(cs, &wc, (uchar *) src)) > 0)
|
||||||
@@ -5771,7 +5788,9 @@ MY_CHARSET_HANDLER my_charset_utf8mb3_handler=
|
|||||||
my_well_formed_char_length_utf8mb3,
|
my_well_formed_char_length_utf8mb3,
|
||||||
my_copy_fix_mb,
|
my_copy_fix_mb,
|
||||||
my_uni_utf8mb3,
|
my_uni_utf8mb3,
|
||||||
my_wc_to_printable_generic
|
my_wc_to_printable_generic,
|
||||||
|
my_casefold_multiply_utf8mbx,
|
||||||
|
my_casefold_multiply_utf8mbx
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -5791,12 +5810,11 @@ struct charset_info_st my_charset_utf8mb3_general_ci=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default,/* caseinfo */
|
&my_unicase_default,/* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
3, /* mbmaxlen */
|
3, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -5824,12 +5842,11 @@ struct charset_info_st my_charset_utf8mb3_general_mysql500_ci=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_mysql500, /* caseinfo */
|
&my_unicase_mysql500, /* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
3, /* mbmaxlen */
|
3, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -5857,12 +5874,11 @@ struct charset_info_st my_charset_utf8mb3_bin=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default,/* caseinfo */
|
&my_unicase_default,/* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
3, /* mbmaxlen */
|
3, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -5890,12 +5906,11 @@ struct charset_info_st my_charset_utf8mb3_general_nopad_ci=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default, /* caseinfo */
|
&my_unicase_default, /* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
3, /* mbmaxlen */
|
3, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -5923,12 +5938,11 @@ struct charset_info_st my_charset_utf8mb3_nopad_bin=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default,/* caseinfo */
|
&my_unicase_default,/* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
3, /* mbmaxlen */
|
3, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -6088,12 +6102,11 @@ struct charset_info_st my_charset_utf8mb3_general_cs=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default,/* caseinfo */
|
&my_unicase_default,/* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
3, /* mbmaxlen */
|
3, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -7426,7 +7439,9 @@ static MY_CHARSET_HANDLER my_charset_filename_handler=
|
|||||||
my_well_formed_char_length_filename,
|
my_well_formed_char_length_filename,
|
||||||
my_copy_fix_mb,
|
my_copy_fix_mb,
|
||||||
my_wc_mb_filename,
|
my_wc_mb_filename,
|
||||||
my_wc_to_printable_filename
|
my_wc_to_printable_filename,
|
||||||
|
my_casefold_multiply_1,
|
||||||
|
my_casefold_multiply_1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -7446,12 +7461,11 @@ struct charset_info_st my_charset_filename=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default,/* caseinfo */
|
&my_unicase_default,/* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
5, /* mbmaxlen */
|
5, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -7697,7 +7711,7 @@ my_caseup_utf8mb4(CHARSET_INFO *cs, const char *src, size_t srclen,
|
|||||||
const char *srcend= src + srclen;
|
const char *srcend= src + srclen;
|
||||||
char *dstend= dst + dstlen, *dst0= dst;
|
char *dstend= dst + dstlen, *dst0= dst;
|
||||||
MY_UNICASE_INFO *uni_plane= cs->caseinfo;
|
MY_UNICASE_INFO *uni_plane= cs->caseinfo;
|
||||||
DBUG_ASSERT(src != dst || cs->caseup_multiply == 1);
|
DBUG_ASSERT(src != dst || cs->cset->caseup_multiply(cs) == 1);
|
||||||
|
|
||||||
while ((src < srcend) &&
|
while ((src < srcend) &&
|
||||||
(srcres= my_mb_wc_utf8mb4(cs, &wc,
|
(srcres= my_mb_wc_utf8mb4(cs, &wc,
|
||||||
@@ -7765,7 +7779,7 @@ my_caseup_str_utf8mb4(CHARSET_INFO *cs, char *src)
|
|||||||
int srcres, dstres;
|
int srcres, dstres;
|
||||||
char *dst= src, *dst0= src;
|
char *dst= src, *dst0= src;
|
||||||
MY_UNICASE_INFO *uni_plane= cs->caseinfo;
|
MY_UNICASE_INFO *uni_plane= cs->caseinfo;
|
||||||
DBUG_ASSERT(cs->caseup_multiply == 1);
|
DBUG_ASSERT(cs->cset->caseup_multiply(cs) == 1);
|
||||||
|
|
||||||
while (*src &&
|
while (*src &&
|
||||||
(srcres= my_mb_wc_utf8mb4_no_range(cs, &wc, (uchar *) src)) > 0)
|
(srcres= my_mb_wc_utf8mb4_no_range(cs, &wc, (uchar *) src)) > 0)
|
||||||
@@ -7791,7 +7805,7 @@ my_casedn_utf8mb4(CHARSET_INFO *cs,
|
|||||||
const char *srcend= src + srclen;
|
const char *srcend= src + srclen;
|
||||||
char *dstend= dst + dstlen, *dst0= dst;
|
char *dstend= dst + dstlen, *dst0= dst;
|
||||||
MY_UNICASE_INFO *uni_plane= cs->caseinfo;
|
MY_UNICASE_INFO *uni_plane= cs->caseinfo;
|
||||||
DBUG_ASSERT(src != dst || cs->casedn_multiply == 1);
|
DBUG_ASSERT(src != dst || cs->cset->casedn_multiply(cs) == 1);
|
||||||
|
|
||||||
while ((src < srcend) &&
|
while ((src < srcend) &&
|
||||||
(srcres= my_mb_wc_utf8mb4(cs, &wc,
|
(srcres= my_mb_wc_utf8mb4(cs, &wc,
|
||||||
@@ -7814,7 +7828,7 @@ my_casedn_str_utf8mb4(CHARSET_INFO *cs, char *src)
|
|||||||
int srcres, dstres;
|
int srcres, dstres;
|
||||||
char *dst= src, *dst0= src;
|
char *dst= src, *dst0= src;
|
||||||
MY_UNICASE_INFO *uni_plane= cs->caseinfo;
|
MY_UNICASE_INFO *uni_plane= cs->caseinfo;
|
||||||
DBUG_ASSERT(cs->casedn_multiply == 1);
|
DBUG_ASSERT(cs->cset->casedn_multiply(cs) == 1);
|
||||||
|
|
||||||
while (*src &&
|
while (*src &&
|
||||||
(srcres= my_mb_wc_utf8mb4_no_range(cs, &wc, (uchar *) src)) > 0)
|
(srcres= my_mb_wc_utf8mb4_no_range(cs, &wc, (uchar *) src)) > 0)
|
||||||
@@ -8139,7 +8153,9 @@ MY_CHARSET_HANDLER my_charset_utf8mb4_handler=
|
|||||||
my_well_formed_char_length_utf8mb4,
|
my_well_formed_char_length_utf8mb4,
|
||||||
my_copy_fix_mb,
|
my_copy_fix_mb,
|
||||||
my_wc_mb_utf8mb4,
|
my_wc_mb_utf8mb4,
|
||||||
my_wc_to_printable_generic
|
my_wc_to_printable_generic,
|
||||||
|
my_casefold_multiply_utf8mbx,
|
||||||
|
my_casefold_multiply_utf8mbx
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -8159,12 +8175,11 @@ struct charset_info_st my_charset_utf8mb4_general_ci=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default,/* caseinfo */
|
&my_unicase_default,/* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
4, /* mbmaxlen */
|
4, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -8193,12 +8208,11 @@ struct charset_info_st my_charset_utf8mb4_bin=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default,/* caseinfo */
|
&my_unicase_default,/* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
4, /* mbmaxlen */
|
4, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -8227,12 +8241,11 @@ struct charset_info_st my_charset_utf8mb4_general_nopad_ci=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default,/* caseinfo */
|
&my_unicase_default,/* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
4, /* mbmaxlen */
|
4, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
@@ -8261,12 +8274,11 @@ struct charset_info_st my_charset_utf8mb4_nopad_bin=
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
NULL, /* tab_to_uni */
|
NULL, /* tab_to_uni */
|
||||||
NULL, /* tab_from_uni */
|
NULL, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default,/* caseinfo */
|
&my_unicase_default,/* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
1, /* strxfrm_multiply */
|
1, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
4, /* mbmaxlen */
|
4, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
|
@@ -710,12 +710,11 @@ struct charset_info_st my_charset_cp1250_czech_cs =
|
|||||||
NULL, /* uca */
|
NULL, /* uca */
|
||||||
tab_cp1250_uni, /* tab_to_uni */
|
tab_cp1250_uni, /* tab_to_uni */
|
||||||
idx_uni_cp1250, /* tab_from_uni */
|
idx_uni_cp1250, /* tab_from_uni */
|
||||||
|
NULL, /* casefold */
|
||||||
&my_unicase_default, /* caseinfo */
|
&my_unicase_default, /* caseinfo */
|
||||||
NULL, /* state_map */
|
NULL, /* state_map */
|
||||||
NULL, /* ident_map */
|
NULL, /* ident_map */
|
||||||
2, /* strxfrm_multiply */
|
2, /* strxfrm_multiply */
|
||||||
1, /* caseup_multiply */
|
|
||||||
1, /* casedn_multiply */
|
|
||||||
1, /* mbminlen */
|
1, /* mbminlen */
|
||||||
1, /* mbmaxlen */
|
1, /* mbmaxlen */
|
||||||
0, /* min_sort_char */
|
0, /* min_sort_char */
|
||||||
|
@@ -1397,3 +1397,15 @@ LEX_CSTRING my_ci_get_collation_name_generic(CHARSET_INFO *cs,
|
|||||||
{
|
{
|
||||||
return cs->coll_name;
|
return cs->coll_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint my_casefold_multiply_1(CHARSET_INFO *cs)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint my_casefold_multiply_2(CHARSET_INFO *cs)
|
||||||
|
{
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user