diff --git a/debian/control b/debian/control index 35c3e00d4a6b6..9643a66f540af 100644 --- a/debian/control +++ b/debian/control @@ -980,8 +980,7 @@ Description: Connect storage engine JDBC interface for MariaDB server. Package: mariadb-plugin-s3 Architecture: any -Depends: libcurl4, - mariadb-server (= ${server:Version}), +Depends: mariadb-server (= ${server:Version}), ${misc:Depends}, ${shlibs:Depends} Description: Amazon S3 archival storage engine for MariaDB @@ -1010,8 +1009,7 @@ Description: RocksDB storage engine for MariaDB server Package: mariadb-plugin-oqgraph Architecture: any -Depends: libjudydebian1, - mariadb-server (= ${server:Version}), +Depends: mariadb-server (= ${server:Version}), ${misc:Depends}, ${shlibs:Depends} Breaks: mariadb-oqgraph-engine-10.0, @@ -1076,8 +1074,7 @@ Description: Spider storage engine for MariaDB server Package: mariadb-plugin-gssapi-server Architecture: any -Depends: libgssapi-krb5-2, - mariadb-server, +Depends: mariadb-server (= ${server:Version}), ${misc:Depends}, ${shlibs:Depends} Breaks: mariadb-gssapi-server-10.1, @@ -1100,8 +1097,7 @@ Description: GSSAPI authentication plugin for MariaDB server Package: mariadb-plugin-gssapi-client Architecture: any -Depends: libgssapi-krb5-2, - mariadb-client (= ${binary:Version}), +Depends: mariadb-client (= ${binary:Version}), ${misc:Depends}, ${shlibs:Depends} Breaks: mariadb-gssapi-client-10.1, @@ -1120,8 +1116,7 @@ Description: GSSAPI authentication plugin for MariaDB client Package: mariadb-plugin-cracklib-password-check Architecture: any -Depends: libcrack2 (>= 2.9.0), - mariadb-server, +Depends: mariadb-server, ${misc:Depends}, ${shlibs:Depends} Description: CrackLib Password Validation Plugin for MariaDB server @@ -1134,8 +1129,7 @@ Description: CrackLib Password Validation Plugin for MariaDB server Package: mariadb-plugin-hashicorp-key-management Architecture: any -Depends: libcurl4, - mariadb-server, +Depends: mariadb-server, ${misc:Depends}, ${shlibs:Depends} Description: Hashicorp Key Management plugin for MariaDB diff --git a/include/m_ctype.h b/include/m_ctype.h index 660c5f1c0a205..1ee0a71abb5c1 100644 --- a/include/m_ctype.h +++ b/include/m_ctype.h @@ -92,6 +92,30 @@ typedef struct casefold_info_char_t } MY_CASEFOLD_CHARACTER; +typedef struct halfwidth_fullwidth_info_tuple_t +{ + uint32 k_sj_orig; + uint32 k_sj_voiced_mark_variant; + uint32 k_sj_semi_voiced_mark_variant; + uint32 h_sj_orig; + uint32 h_sj_voiced_mark_variant; + uint32 h_sj_semi_voiced_mark_variant; + uint32 k_uj_orig; + uint32 k_uj_voiced_mark_variant; + uint32 k_uj_semi_voiced_mark_variant; + uint32 h_uj_orig; + uint32 h_uj_voiced_mark_variant; + uint32 h_uj_semi_voiced_mark_variant; +} MY_HALFWIDTH_FULLWIDTH_TUPLE; + + +typedef struct fullwidth_halfwidth_info_tuple_t +{ + uint32 orig; + uint32 mark; +} MY_FULLWIDTH_HALFWIDTH_TUPLE; + + struct casefold_info_st { my_wc_t maxchar; @@ -624,6 +648,10 @@ typedef int (*my_charset_conv_wc_mb)(CHARSET_INFO *, my_wc_t, uchar *, uchar *); typedef size_t (*my_charset_conv_case)(CHARSET_INFO *, const char *, size_t, char *, size_t); +typedef size_t (*my_charset_conv_to_halfwidth)(CHARSET_INFO *, int from_fullwidth_only, + const char *, size_t, char *, size_t); +typedef size_t (*my_charset_conv_to_fullwidth)(CHARSET_INFO *, int to_hiragana, + const char *, size_t, char *, size_t); /* A structure to return the statistics of a native string copying, @@ -781,6 +809,8 @@ struct my_charset_handler_st uint (*caseup_multiply)(CHARSET_INFO *cs); uint (*casedn_multiply)(CHARSET_INFO *cs); + my_charset_conv_to_fullwidth halfwidth_fullwidth; + my_charset_conv_to_halfwidth fullwidth_halfwidth; }; extern MY_CHARSET_HANDLER my_charset_8bit_handler; diff --git a/include/mysql_com.h b/include/mysql_com.h index b9fae54e7f476..a7d1ea56f52c6 100644 --- a/include/mysql_com.h +++ b/include/mysql_com.h @@ -159,6 +159,7 @@ enum enum_indicator_type #define PART_KEY_FLAG 16384U /* Intern; Part of some key */ #define GROUP_FLAG 32768U /* Intern: Group field */ #define CONTEXT_COLLATION_FLAG 131072U /* Intern: Used by sql_yacc */ +#define ANYCS_COLLATION_FLAG 65536U /* Intern: Used by sql_yacc */ #define GET_FIXED_FIELDS_FLAG (1U << 18) /* Used to get fields in item tree */ #define FIELD_IN_PART_FUNC_FLAG (1U << 19)/* Field part of partition func */ #define PART_INDIRECT_KEY_FLAG (1U << 20) diff --git a/mysql-test/main/ctype_utf8_uca.result b/mysql-test/main/ctype_utf8_uca.result index 616e4feba9401..a01ad6b19cc83 100644 --- a/mysql-test/main/ctype_utf8_uca.result +++ b/mysql-test/main/ctype_utf8_uca.result @@ -1213,739 +1213,739 @@ SELECT rec.COLLATION_NAME; END FOR; $$ Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 13 Y 0 0 192 +def COLLATION_NAME rec.COLLATION_NAME 253 192 13 Y 4096 0 192 rec.COLLATION_NAME uca1400_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 13 Y 0 0 192 +def COLLATION_NAME rec.COLLATION_NAME 253 192 13 Y 4096 0 192 rec.COLLATION_NAME uca1400_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 13 Y 0 0 192 +def COLLATION_NAME rec.COLLATION_NAME 253 192 13 Y 4096 0 192 rec.COLLATION_NAME uca1400_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 13 Y 0 0 192 +def COLLATION_NAME rec.COLLATION_NAME 253 192 13 Y 4096 0 192 rec.COLLATION_NAME uca1400_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 19 Y 0 0 192 +def COLLATION_NAME rec.COLLATION_NAME 253 192 19 Y 4096 0 192 rec.COLLATION_NAME uca1400_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 19 Y 0 0 192 +def COLLATION_NAME rec.COLLATION_NAME 253 192 19 Y 4096 0 192 rec.COLLATION_NAME uca1400_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 19 Y 0 0 192 +def COLLATION_NAME rec.COLLATION_NAME 253 192 19 Y 4096 0 192 rec.COLLATION_NAME uca1400_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 19 Y 0 0 192 +def COLLATION_NAME rec.COLLATION_NAME 253 192 19 Y 4096 0 192 rec.COLLATION_NAME uca1400_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 0 0 193 +def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 4096 0 193 rec.COLLATION_NAME uca1400_icelandic_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 0 0 193 +def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 4096 0 193 rec.COLLATION_NAME uca1400_icelandic_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 0 0 193 +def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 4096 0 193 rec.COLLATION_NAME uca1400_icelandic_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 0 0 193 +def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 4096 0 193 rec.COLLATION_NAME uca1400_icelandic_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 0 0 193 +def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 4096 0 193 rec.COLLATION_NAME uca1400_icelandic_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 0 0 193 +def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 4096 0 193 rec.COLLATION_NAME uca1400_icelandic_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 0 0 193 +def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 4096 0 193 rec.COLLATION_NAME uca1400_icelandic_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 0 0 193 +def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 4096 0 193 rec.COLLATION_NAME uca1400_icelandic_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 0 0 194 +def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 4096 0 194 rec.COLLATION_NAME uca1400_latvian_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 0 0 194 +def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 4096 0 194 rec.COLLATION_NAME uca1400_latvian_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 0 0 194 +def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 4096 0 194 rec.COLLATION_NAME uca1400_latvian_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 0 0 194 +def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 4096 0 194 rec.COLLATION_NAME uca1400_latvian_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 0 0 194 +def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 4096 0 194 rec.COLLATION_NAME uca1400_latvian_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 0 0 194 +def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 4096 0 194 rec.COLLATION_NAME uca1400_latvian_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 0 0 194 +def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 4096 0 194 rec.COLLATION_NAME uca1400_latvian_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 0 0 194 +def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 4096 0 194 rec.COLLATION_NAME uca1400_latvian_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 0 0 195 +def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 4096 0 195 rec.COLLATION_NAME uca1400_romanian_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 0 0 195 +def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 4096 0 195 rec.COLLATION_NAME uca1400_romanian_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 0 0 195 +def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 4096 0 195 rec.COLLATION_NAME uca1400_romanian_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 0 0 195 +def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 4096 0 195 rec.COLLATION_NAME uca1400_romanian_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 0 0 195 +def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 4096 0 195 rec.COLLATION_NAME uca1400_romanian_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 0 0 195 +def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 4096 0 195 rec.COLLATION_NAME uca1400_romanian_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 0 0 195 +def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 4096 0 195 rec.COLLATION_NAME uca1400_romanian_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 0 0 195 +def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 4096 0 195 rec.COLLATION_NAME uca1400_romanian_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 0 0 196 +def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 4096 0 196 rec.COLLATION_NAME uca1400_slovenian_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 0 0 196 +def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 4096 0 196 rec.COLLATION_NAME uca1400_slovenian_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 0 0 196 +def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 4096 0 196 rec.COLLATION_NAME uca1400_slovenian_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 0 0 196 +def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 4096 0 196 rec.COLLATION_NAME uca1400_slovenian_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 0 0 196 +def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 4096 0 196 rec.COLLATION_NAME uca1400_slovenian_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 0 0 196 +def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 4096 0 196 rec.COLLATION_NAME uca1400_slovenian_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 0 0 196 +def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 4096 0 196 rec.COLLATION_NAME uca1400_slovenian_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 0 0 196 +def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 4096 0 196 rec.COLLATION_NAME uca1400_slovenian_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 20 Y 0 0 197 +def COLLATION_NAME rec.COLLATION_NAME 253 192 20 Y 4096 0 197 rec.COLLATION_NAME uca1400_polish_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 20 Y 0 0 197 +def COLLATION_NAME rec.COLLATION_NAME 253 192 20 Y 4096 0 197 rec.COLLATION_NAME uca1400_polish_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 20 Y 0 0 197 +def COLLATION_NAME rec.COLLATION_NAME 253 192 20 Y 4096 0 197 rec.COLLATION_NAME uca1400_polish_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 20 Y 0 0 197 +def COLLATION_NAME rec.COLLATION_NAME 253 192 20 Y 4096 0 197 rec.COLLATION_NAME uca1400_polish_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 26 Y 0 0 197 +def COLLATION_NAME rec.COLLATION_NAME 253 192 26 Y 4096 0 197 rec.COLLATION_NAME uca1400_polish_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 26 Y 0 0 197 +def COLLATION_NAME rec.COLLATION_NAME 253 192 26 Y 4096 0 197 rec.COLLATION_NAME uca1400_polish_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 26 Y 0 0 197 +def COLLATION_NAME rec.COLLATION_NAME 253 192 26 Y 4096 0 197 rec.COLLATION_NAME uca1400_polish_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 26 Y 0 0 197 +def COLLATION_NAME rec.COLLATION_NAME 253 192 26 Y 4096 0 197 rec.COLLATION_NAME uca1400_polish_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 0 0 198 +def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 4096 0 198 rec.COLLATION_NAME uca1400_estonian_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 0 0 198 +def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 4096 0 198 rec.COLLATION_NAME uca1400_estonian_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 0 0 198 +def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 4096 0 198 rec.COLLATION_NAME uca1400_estonian_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 0 0 198 +def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 4096 0 198 rec.COLLATION_NAME uca1400_estonian_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 0 0 198 +def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 4096 0 198 rec.COLLATION_NAME uca1400_estonian_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 0 0 198 +def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 4096 0 198 rec.COLLATION_NAME uca1400_estonian_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 0 0 198 +def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 4096 0 198 rec.COLLATION_NAME uca1400_estonian_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 0 0 198 +def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 4096 0 198 rec.COLLATION_NAME uca1400_estonian_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 0 0 199 +def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 4096 0 199 rec.COLLATION_NAME uca1400_spanish_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 0 0 199 +def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 4096 0 199 rec.COLLATION_NAME uca1400_spanish_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 0 0 199 +def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 4096 0 199 rec.COLLATION_NAME uca1400_spanish_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 0 0 199 +def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 4096 0 199 rec.COLLATION_NAME uca1400_spanish_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 0 0 199 +def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 4096 0 199 rec.COLLATION_NAME uca1400_spanish_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 0 0 199 +def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 4096 0 199 rec.COLLATION_NAME uca1400_spanish_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 0 0 199 +def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 4096 0 199 rec.COLLATION_NAME uca1400_spanish_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 0 0 199 +def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 4096 0 199 rec.COLLATION_NAME uca1400_spanish_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 0 0 200 +def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 4096 0 200 rec.COLLATION_NAME uca1400_swedish_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 0 0 200 +def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 4096 0 200 rec.COLLATION_NAME uca1400_swedish_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 0 0 200 +def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 4096 0 200 rec.COLLATION_NAME uca1400_swedish_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 0 0 200 +def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 4096 0 200 rec.COLLATION_NAME uca1400_swedish_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 0 0 200 +def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 4096 0 200 rec.COLLATION_NAME uca1400_swedish_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 0 0 200 +def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 4096 0 200 rec.COLLATION_NAME uca1400_swedish_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 0 0 200 +def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 4096 0 200 rec.COLLATION_NAME uca1400_swedish_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 0 0 200 +def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 4096 0 200 rec.COLLATION_NAME uca1400_swedish_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 0 0 201 +def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 4096 0 201 rec.COLLATION_NAME uca1400_turkish_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 0 0 201 +def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 4096 0 201 rec.COLLATION_NAME uca1400_turkish_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 0 0 201 +def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 4096 0 201 rec.COLLATION_NAME uca1400_turkish_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 0 0 201 +def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 4096 0 201 rec.COLLATION_NAME uca1400_turkish_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 0 0 201 +def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 4096 0 201 rec.COLLATION_NAME uca1400_turkish_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 0 0 201 +def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 4096 0 201 rec.COLLATION_NAME uca1400_turkish_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 0 0 201 +def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 4096 0 201 rec.COLLATION_NAME uca1400_turkish_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 0 0 201 +def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 4096 0 201 rec.COLLATION_NAME uca1400_turkish_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 19 Y 0 0 202 +def COLLATION_NAME rec.COLLATION_NAME 253 192 19 Y 4096 0 202 rec.COLLATION_NAME uca1400_czech_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 19 Y 0 0 202 +def COLLATION_NAME rec.COLLATION_NAME 253 192 19 Y 4096 0 202 rec.COLLATION_NAME uca1400_czech_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 19 Y 0 0 202 +def COLLATION_NAME rec.COLLATION_NAME 253 192 19 Y 4096 0 202 rec.COLLATION_NAME uca1400_czech_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 19 Y 0 0 202 +def COLLATION_NAME rec.COLLATION_NAME 253 192 19 Y 4096 0 202 rec.COLLATION_NAME uca1400_czech_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 25 Y 0 0 202 +def COLLATION_NAME rec.COLLATION_NAME 253 192 25 Y 4096 0 202 rec.COLLATION_NAME uca1400_czech_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 25 Y 0 0 202 +def COLLATION_NAME rec.COLLATION_NAME 253 192 25 Y 4096 0 202 rec.COLLATION_NAME uca1400_czech_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 25 Y 0 0 202 +def COLLATION_NAME rec.COLLATION_NAME 253 192 25 Y 4096 0 202 rec.COLLATION_NAME uca1400_czech_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 25 Y 0 0 202 +def COLLATION_NAME rec.COLLATION_NAME 253 192 25 Y 4096 0 202 rec.COLLATION_NAME uca1400_czech_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 20 Y 0 0 203 +def COLLATION_NAME rec.COLLATION_NAME 253 192 20 Y 4096 0 203 rec.COLLATION_NAME uca1400_danish_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 20 Y 0 0 203 +def COLLATION_NAME rec.COLLATION_NAME 253 192 20 Y 4096 0 203 rec.COLLATION_NAME uca1400_danish_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 20 Y 0 0 203 +def COLLATION_NAME rec.COLLATION_NAME 253 192 20 Y 4096 0 203 rec.COLLATION_NAME uca1400_danish_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 20 Y 0 0 203 +def COLLATION_NAME rec.COLLATION_NAME 253 192 20 Y 4096 0 203 rec.COLLATION_NAME uca1400_danish_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 26 Y 0 0 203 +def COLLATION_NAME rec.COLLATION_NAME 253 192 26 Y 4096 0 203 rec.COLLATION_NAME uca1400_danish_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 26 Y 0 0 203 +def COLLATION_NAME rec.COLLATION_NAME 253 192 26 Y 4096 0 203 rec.COLLATION_NAME uca1400_danish_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 26 Y 0 0 203 +def COLLATION_NAME rec.COLLATION_NAME 253 192 26 Y 4096 0 203 rec.COLLATION_NAME uca1400_danish_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 26 Y 0 0 203 +def COLLATION_NAME rec.COLLATION_NAME 253 192 26 Y 4096 0 203 rec.COLLATION_NAME uca1400_danish_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 24 Y 0 0 204 +def COLLATION_NAME rec.COLLATION_NAME 253 192 24 Y 4096 0 204 rec.COLLATION_NAME uca1400_lithuanian_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 24 Y 0 0 204 +def COLLATION_NAME rec.COLLATION_NAME 253 192 24 Y 4096 0 204 rec.COLLATION_NAME uca1400_lithuanian_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 24 Y 0 0 204 +def COLLATION_NAME rec.COLLATION_NAME 253 192 24 Y 4096 0 204 rec.COLLATION_NAME uca1400_lithuanian_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 24 Y 0 0 204 +def COLLATION_NAME rec.COLLATION_NAME 253 192 24 Y 4096 0 204 rec.COLLATION_NAME uca1400_lithuanian_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 30 Y 0 0 204 +def COLLATION_NAME rec.COLLATION_NAME 253 192 30 Y 4096 0 204 rec.COLLATION_NAME uca1400_lithuanian_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 30 Y 0 0 204 +def COLLATION_NAME rec.COLLATION_NAME 253 192 30 Y 4096 0 204 rec.COLLATION_NAME uca1400_lithuanian_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 30 Y 0 0 204 +def COLLATION_NAME rec.COLLATION_NAME 253 192 30 Y 4096 0 204 rec.COLLATION_NAME uca1400_lithuanian_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 30 Y 0 0 204 +def COLLATION_NAME rec.COLLATION_NAME 253 192 30 Y 4096 0 204 rec.COLLATION_NAME uca1400_lithuanian_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 20 Y 0 0 205 +def COLLATION_NAME rec.COLLATION_NAME 253 192 20 Y 4096 0 205 rec.COLLATION_NAME uca1400_slovak_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 20 Y 0 0 205 +def COLLATION_NAME rec.COLLATION_NAME 253 192 20 Y 4096 0 205 rec.COLLATION_NAME uca1400_slovak_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 20 Y 0 0 205 +def COLLATION_NAME rec.COLLATION_NAME 253 192 20 Y 4096 0 205 rec.COLLATION_NAME uca1400_slovak_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 20 Y 0 0 205 +def COLLATION_NAME rec.COLLATION_NAME 253 192 20 Y 4096 0 205 rec.COLLATION_NAME uca1400_slovak_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 26 Y 0 0 205 +def COLLATION_NAME rec.COLLATION_NAME 253 192 26 Y 4096 0 205 rec.COLLATION_NAME uca1400_slovak_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 26 Y 0 0 205 +def COLLATION_NAME rec.COLLATION_NAME 253 192 26 Y 4096 0 205 rec.COLLATION_NAME uca1400_slovak_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 26 Y 0 0 205 +def COLLATION_NAME rec.COLLATION_NAME 253 192 26 Y 4096 0 205 rec.COLLATION_NAME uca1400_slovak_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 26 Y 0 0 205 +def COLLATION_NAME rec.COLLATION_NAME 253 192 26 Y 4096 0 205 rec.COLLATION_NAME uca1400_slovak_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 0 0 206 +def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 4096 0 206 rec.COLLATION_NAME uca1400_spanish2_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 0 0 206 +def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 4096 0 206 rec.COLLATION_NAME uca1400_spanish2_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 0 0 206 +def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 4096 0 206 rec.COLLATION_NAME uca1400_spanish2_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 0 0 206 +def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 4096 0 206 rec.COLLATION_NAME uca1400_spanish2_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 0 0 206 +def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 4096 0 206 rec.COLLATION_NAME uca1400_spanish2_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 0 0 206 +def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 4096 0 206 rec.COLLATION_NAME uca1400_spanish2_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 0 0 206 +def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 4096 0 206 rec.COLLATION_NAME uca1400_spanish2_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 0 0 206 +def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 4096 0 206 rec.COLLATION_NAME uca1400_spanish2_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 19 Y 0 0 207 +def COLLATION_NAME rec.COLLATION_NAME 253 192 19 Y 4096 0 207 rec.COLLATION_NAME uca1400_roman_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 19 Y 0 0 207 +def COLLATION_NAME rec.COLLATION_NAME 253 192 19 Y 4096 0 207 rec.COLLATION_NAME uca1400_roman_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 19 Y 0 0 207 +def COLLATION_NAME rec.COLLATION_NAME 253 192 19 Y 4096 0 207 rec.COLLATION_NAME uca1400_roman_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 19 Y 0 0 207 +def COLLATION_NAME rec.COLLATION_NAME 253 192 19 Y 4096 0 207 rec.COLLATION_NAME uca1400_roman_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 25 Y 0 0 207 +def COLLATION_NAME rec.COLLATION_NAME 253 192 25 Y 4096 0 207 rec.COLLATION_NAME uca1400_roman_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 25 Y 0 0 207 +def COLLATION_NAME rec.COLLATION_NAME 253 192 25 Y 4096 0 207 rec.COLLATION_NAME uca1400_roman_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 25 Y 0 0 207 +def COLLATION_NAME rec.COLLATION_NAME 253 192 25 Y 4096 0 207 rec.COLLATION_NAME uca1400_roman_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 25 Y 0 0 207 +def COLLATION_NAME rec.COLLATION_NAME 253 192 25 Y 4096 0 207 rec.COLLATION_NAME uca1400_roman_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 0 0 208 +def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 4096 0 208 rec.COLLATION_NAME uca1400_persian_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 0 0 208 +def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 4096 0 208 rec.COLLATION_NAME uca1400_persian_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 0 0 208 +def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 4096 0 208 rec.COLLATION_NAME uca1400_persian_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 0 0 208 +def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 4096 0 208 rec.COLLATION_NAME uca1400_persian_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 0 0 208 +def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 4096 0 208 rec.COLLATION_NAME uca1400_persian_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 0 0 208 +def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 4096 0 208 rec.COLLATION_NAME uca1400_persian_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 0 0 208 +def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 4096 0 208 rec.COLLATION_NAME uca1400_persian_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 0 0 208 +def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 4096 0 208 rec.COLLATION_NAME uca1400_persian_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 0 0 209 +def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 4096 0 209 rec.COLLATION_NAME uca1400_esperanto_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 0 0 209 +def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 4096 0 209 rec.COLLATION_NAME uca1400_esperanto_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 0 0 209 +def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 4096 0 209 rec.COLLATION_NAME uca1400_esperanto_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 0 0 209 +def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 4096 0 209 rec.COLLATION_NAME uca1400_esperanto_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 0 0 209 +def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 4096 0 209 rec.COLLATION_NAME uca1400_esperanto_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 0 0 209 +def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 4096 0 209 rec.COLLATION_NAME uca1400_esperanto_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 0 0 209 +def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 4096 0 209 rec.COLLATION_NAME uca1400_esperanto_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 0 0 209 +def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 4096 0 209 rec.COLLATION_NAME uca1400_esperanto_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 0 0 210 +def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 4096 0 210 rec.COLLATION_NAME uca1400_hungarian_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 0 0 210 +def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 4096 0 210 rec.COLLATION_NAME uca1400_hungarian_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 0 0 210 +def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 4096 0 210 rec.COLLATION_NAME uca1400_hungarian_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 0 0 210 +def COLLATION_NAME rec.COLLATION_NAME 253 192 23 Y 4096 0 210 rec.COLLATION_NAME uca1400_hungarian_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 0 0 210 +def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 4096 0 210 rec.COLLATION_NAME uca1400_hungarian_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 0 0 210 +def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 4096 0 210 rec.COLLATION_NAME uca1400_hungarian_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 0 0 210 +def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 4096 0 210 rec.COLLATION_NAME uca1400_hungarian_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 0 0 210 +def COLLATION_NAME rec.COLLATION_NAME 253 192 29 Y 4096 0 210 rec.COLLATION_NAME uca1400_hungarian_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 0 0 211 +def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 4096 0 211 rec.COLLATION_NAME uca1400_sinhala_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 0 0 211 +def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 4096 0 211 rec.COLLATION_NAME uca1400_sinhala_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 0 0 211 +def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 4096 0 211 rec.COLLATION_NAME uca1400_sinhala_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 0 0 211 +def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 4096 0 211 rec.COLLATION_NAME uca1400_sinhala_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 0 0 211 +def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 4096 0 211 rec.COLLATION_NAME uca1400_sinhala_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 0 0 211 +def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 4096 0 211 rec.COLLATION_NAME uca1400_sinhala_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 0 0 211 +def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 4096 0 211 rec.COLLATION_NAME uca1400_sinhala_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 0 0 211 +def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 4096 0 211 rec.COLLATION_NAME uca1400_sinhala_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 0 0 212 +def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 4096 0 212 rec.COLLATION_NAME uca1400_german2_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 0 0 212 +def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 4096 0 212 rec.COLLATION_NAME uca1400_german2_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 0 0 212 +def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 4096 0 212 rec.COLLATION_NAME uca1400_german2_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 0 0 212 +def COLLATION_NAME rec.COLLATION_NAME 253 192 21 Y 4096 0 212 rec.COLLATION_NAME uca1400_german2_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 0 0 212 +def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 4096 0 212 rec.COLLATION_NAME uca1400_german2_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 0 0 212 +def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 4096 0 212 rec.COLLATION_NAME uca1400_german2_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 0 0 212 +def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 4096 0 212 rec.COLLATION_NAME uca1400_german2_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 0 0 212 +def COLLATION_NAME rec.COLLATION_NAME 253 192 27 Y 4096 0 212 rec.COLLATION_NAME uca1400_german2_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 24 Y 0 0 215 +def COLLATION_NAME rec.COLLATION_NAME 253 192 24 Y 4096 0 215 rec.COLLATION_NAME uca1400_vietnamese_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 24 Y 0 0 215 +def COLLATION_NAME rec.COLLATION_NAME 253 192 24 Y 4096 0 215 rec.COLLATION_NAME uca1400_vietnamese_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 24 Y 0 0 215 +def COLLATION_NAME rec.COLLATION_NAME 253 192 24 Y 4096 0 215 rec.COLLATION_NAME uca1400_vietnamese_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 24 Y 0 0 215 +def COLLATION_NAME rec.COLLATION_NAME 253 192 24 Y 4096 0 215 rec.COLLATION_NAME uca1400_vietnamese_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 30 Y 0 0 215 +def COLLATION_NAME rec.COLLATION_NAME 253 192 30 Y 4096 0 215 rec.COLLATION_NAME uca1400_vietnamese_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 30 Y 0 0 215 +def COLLATION_NAME rec.COLLATION_NAME 253 192 30 Y 4096 0 215 rec.COLLATION_NAME uca1400_vietnamese_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 30 Y 0 0 215 +def COLLATION_NAME rec.COLLATION_NAME 253 192 30 Y 4096 0 215 rec.COLLATION_NAME uca1400_vietnamese_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 30 Y 0 0 215 +def COLLATION_NAME rec.COLLATION_NAME 253 192 30 Y 4096 0 215 rec.COLLATION_NAME uca1400_vietnamese_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 0 0 576 +def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 4096 0 576 rec.COLLATION_NAME uca1400_croatian_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 0 0 576 +def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 4096 0 576 rec.COLLATION_NAME uca1400_croatian_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 0 0 576 +def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 4096 0 576 rec.COLLATION_NAME uca1400_croatian_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 0 0 576 +def COLLATION_NAME rec.COLLATION_NAME 253 192 22 Y 4096 0 576 rec.COLLATION_NAME uca1400_croatian_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 0 0 576 +def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 4096 0 576 rec.COLLATION_NAME uca1400_croatian_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 0 0 576 +def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 4096 0 576 rec.COLLATION_NAME uca1400_croatian_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 0 0 576 +def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 4096 0 576 rec.COLLATION_NAME uca1400_croatian_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 0 0 576 +def COLLATION_NAME rec.COLLATION_NAME 253 192 28 Y 4096 0 576 rec.COLLATION_NAME uca1400_croatian_nopad_as_cs # diff --git a/mysql-test/main/ctype_utf8mb4_0900.result b/mysql-test/main/ctype_utf8mb4_0900.result index 4e94f3d3f3339..f4a85e30b626f 100644 --- a/mysql-test/main/ctype_utf8mb4_0900.result +++ b/mysql-test/main/ctype_utf8mb4_0900.result @@ -214,136 +214,136 @@ SELECT rec.COLLATION_NAME; END FOR; $$ Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 18 Y 0 0 255 +def COLLATION_NAME rec.COLLATION_NAME 253 256 18 Y 4096 0 255 utf8mb4_0900_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 24 Y 0 0 256 +def COLLATION_NAME rec.COLLATION_NAME 253 256 24 Y 4096 0 256 utf8mb4_de_pb_0900_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 257 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 257 utf8mb4_is_0900_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 258 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 258 utf8mb4_lv_0900_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 259 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 259 utf8mb4_ro_0900_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 260 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 260 utf8mb4_sl_0900_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 261 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 261 utf8mb4_pl_0900_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 262 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 262 utf8mb4_et_0900_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 263 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 263 utf8mb4_es_0900_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 264 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 264 utf8mb4_sv_0900_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 265 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 265 utf8mb4_tr_0900_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 266 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 266 utf8mb4_cs_0900_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 267 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 267 utf8mb4_da_0900_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 268 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 268 utf8mb4_lt_0900_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 269 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 269 utf8mb4_sk_0900_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 26 Y 0 0 270 +def COLLATION_NAME rec.COLLATION_NAME 253 256 26 Y 4096 0 270 utf8mb4_es_trad_0900_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 271 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 271 utf8mb4_la_0900_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 273 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 273 utf8mb4_eo_0900_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 274 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 274 utf8mb4_hu_0900_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 275 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 275 utf8mb4_hr_0900_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 277 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 277 utf8mb4_vi_0900_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 18 Y 0 0 278 +def COLLATION_NAME rec.COLLATION_NAME 253 256 18 Y 4096 0 278 utf8mb4_0900_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 24 Y 0 0 279 +def COLLATION_NAME rec.COLLATION_NAME 253 256 24 Y 4096 0 279 utf8mb4_de_pb_0900_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 280 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 280 utf8mb4_is_0900_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 281 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 281 utf8mb4_lv_0900_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 282 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 282 utf8mb4_ro_0900_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 283 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 283 utf8mb4_sl_0900_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 284 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 284 utf8mb4_pl_0900_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 285 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 285 utf8mb4_et_0900_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 286 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 286 utf8mb4_es_0900_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 287 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 287 utf8mb4_sv_0900_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 288 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 288 utf8mb4_tr_0900_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 289 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 289 utf8mb4_cs_0900_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 290 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 290 utf8mb4_da_0900_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 291 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 291 utf8mb4_lt_0900_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 292 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 292 utf8mb4_sk_0900_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 26 Y 0 0 293 +def COLLATION_NAME rec.COLLATION_NAME 253 256 26 Y 4096 0 293 utf8mb4_es_trad_0900_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 294 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 294 utf8mb4_la_0900_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 296 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 296 utf8mb4_eo_0900_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 297 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 297 utf8mb4_hu_0900_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 298 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 298 utf8mb4_hr_0900_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 300 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 300 utf8mb4_vi_0900_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 18 Y 0 0 305 +def COLLATION_NAME rec.COLLATION_NAME 253 256 18 Y 4096 0 305 utf8mb4_0900_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 16 Y 0 0 309 +def COLLATION_NAME rec.COLLATION_NAME 253 256 16 Y 4096 0 309 utf8mb4_0900_bin # # MDEV-36361 Wrong utf8mb4_0900_bin alias for utf8mb4_bin (should be utf8mb4_nopad_bin) diff --git a/mysql-test/main/ctype_utf8mb4_uca.result b/mysql-test/main/ctype_utf8mb4_uca.result index f6a89557359dc..dc70144680494 100644 --- a/mysql-test/main/ctype_utf8mb4_uca.result +++ b/mysql-test/main/ctype_utf8mb4_uca.result @@ -6943,739 +6943,739 @@ SELECT rec.COLLATION_NAME; END FOR; $$ Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 13 Y 0 0 224 +def COLLATION_NAME rec.COLLATION_NAME 253 256 13 Y 4096 0 224 rec.COLLATION_NAME uca1400_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 13 Y 0 0 224 +def COLLATION_NAME rec.COLLATION_NAME 253 256 13 Y 4096 0 224 rec.COLLATION_NAME uca1400_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 13 Y 0 0 224 +def COLLATION_NAME rec.COLLATION_NAME 253 256 13 Y 4096 0 224 rec.COLLATION_NAME uca1400_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 13 Y 0 0 224 +def COLLATION_NAME rec.COLLATION_NAME 253 256 13 Y 4096 0 224 rec.COLLATION_NAME uca1400_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 19 Y 0 0 224 +def COLLATION_NAME rec.COLLATION_NAME 253 256 19 Y 4096 0 224 rec.COLLATION_NAME uca1400_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 19 Y 0 0 224 +def COLLATION_NAME rec.COLLATION_NAME 253 256 19 Y 4096 0 224 rec.COLLATION_NAME uca1400_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 19 Y 0 0 224 +def COLLATION_NAME rec.COLLATION_NAME 253 256 19 Y 4096 0 224 rec.COLLATION_NAME uca1400_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 19 Y 0 0 224 +def COLLATION_NAME rec.COLLATION_NAME 253 256 19 Y 4096 0 224 rec.COLLATION_NAME uca1400_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 0 0 225 +def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 4096 0 225 rec.COLLATION_NAME uca1400_icelandic_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 0 0 225 +def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 4096 0 225 rec.COLLATION_NAME uca1400_icelandic_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 0 0 225 +def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 4096 0 225 rec.COLLATION_NAME uca1400_icelandic_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 0 0 225 +def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 4096 0 225 rec.COLLATION_NAME uca1400_icelandic_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 0 0 225 +def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 4096 0 225 rec.COLLATION_NAME uca1400_icelandic_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 0 0 225 +def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 4096 0 225 rec.COLLATION_NAME uca1400_icelandic_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 0 0 225 +def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 4096 0 225 rec.COLLATION_NAME uca1400_icelandic_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 0 0 225 +def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 4096 0 225 rec.COLLATION_NAME uca1400_icelandic_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 226 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 226 rec.COLLATION_NAME uca1400_latvian_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 226 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 226 rec.COLLATION_NAME uca1400_latvian_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 226 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 226 rec.COLLATION_NAME uca1400_latvian_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 226 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 226 rec.COLLATION_NAME uca1400_latvian_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 0 0 226 +def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 4096 0 226 rec.COLLATION_NAME uca1400_latvian_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 0 0 226 +def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 4096 0 226 rec.COLLATION_NAME uca1400_latvian_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 0 0 226 +def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 4096 0 226 rec.COLLATION_NAME uca1400_latvian_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 0 0 226 +def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 4096 0 226 rec.COLLATION_NAME uca1400_latvian_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 0 0 227 +def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 4096 0 227 rec.COLLATION_NAME uca1400_romanian_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 0 0 227 +def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 4096 0 227 rec.COLLATION_NAME uca1400_romanian_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 0 0 227 +def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 4096 0 227 rec.COLLATION_NAME uca1400_romanian_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 0 0 227 +def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 4096 0 227 rec.COLLATION_NAME uca1400_romanian_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 0 0 227 +def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 4096 0 227 rec.COLLATION_NAME uca1400_romanian_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 0 0 227 +def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 4096 0 227 rec.COLLATION_NAME uca1400_romanian_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 0 0 227 +def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 4096 0 227 rec.COLLATION_NAME uca1400_romanian_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 0 0 227 +def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 4096 0 227 rec.COLLATION_NAME uca1400_romanian_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 0 0 228 +def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 4096 0 228 rec.COLLATION_NAME uca1400_slovenian_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 0 0 228 +def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 4096 0 228 rec.COLLATION_NAME uca1400_slovenian_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 0 0 228 +def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 4096 0 228 rec.COLLATION_NAME uca1400_slovenian_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 0 0 228 +def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 4096 0 228 rec.COLLATION_NAME uca1400_slovenian_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 0 0 228 +def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 4096 0 228 rec.COLLATION_NAME uca1400_slovenian_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 0 0 228 +def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 4096 0 228 rec.COLLATION_NAME uca1400_slovenian_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 0 0 228 +def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 4096 0 228 rec.COLLATION_NAME uca1400_slovenian_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 0 0 228 +def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 4096 0 228 rec.COLLATION_NAME uca1400_slovenian_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 20 Y 0 0 229 +def COLLATION_NAME rec.COLLATION_NAME 253 256 20 Y 4096 0 229 rec.COLLATION_NAME uca1400_polish_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 20 Y 0 0 229 +def COLLATION_NAME rec.COLLATION_NAME 253 256 20 Y 4096 0 229 rec.COLLATION_NAME uca1400_polish_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 20 Y 0 0 229 +def COLLATION_NAME rec.COLLATION_NAME 253 256 20 Y 4096 0 229 rec.COLLATION_NAME uca1400_polish_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 20 Y 0 0 229 +def COLLATION_NAME rec.COLLATION_NAME 253 256 20 Y 4096 0 229 rec.COLLATION_NAME uca1400_polish_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 26 Y 0 0 229 +def COLLATION_NAME rec.COLLATION_NAME 253 256 26 Y 4096 0 229 rec.COLLATION_NAME uca1400_polish_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 26 Y 0 0 229 +def COLLATION_NAME rec.COLLATION_NAME 253 256 26 Y 4096 0 229 rec.COLLATION_NAME uca1400_polish_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 26 Y 0 0 229 +def COLLATION_NAME rec.COLLATION_NAME 253 256 26 Y 4096 0 229 rec.COLLATION_NAME uca1400_polish_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 26 Y 0 0 229 +def COLLATION_NAME rec.COLLATION_NAME 253 256 26 Y 4096 0 229 rec.COLLATION_NAME uca1400_polish_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 0 0 230 +def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 4096 0 230 rec.COLLATION_NAME uca1400_estonian_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 0 0 230 +def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 4096 0 230 rec.COLLATION_NAME uca1400_estonian_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 0 0 230 +def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 4096 0 230 rec.COLLATION_NAME uca1400_estonian_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 0 0 230 +def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 4096 0 230 rec.COLLATION_NAME uca1400_estonian_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 0 0 230 +def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 4096 0 230 rec.COLLATION_NAME uca1400_estonian_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 0 0 230 +def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 4096 0 230 rec.COLLATION_NAME uca1400_estonian_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 0 0 230 +def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 4096 0 230 rec.COLLATION_NAME uca1400_estonian_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 0 0 230 +def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 4096 0 230 rec.COLLATION_NAME uca1400_estonian_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 231 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 231 rec.COLLATION_NAME uca1400_spanish_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 231 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 231 rec.COLLATION_NAME uca1400_spanish_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 231 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 231 rec.COLLATION_NAME uca1400_spanish_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 231 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 231 rec.COLLATION_NAME uca1400_spanish_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 0 0 231 +def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 4096 0 231 rec.COLLATION_NAME uca1400_spanish_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 0 0 231 +def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 4096 0 231 rec.COLLATION_NAME uca1400_spanish_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 0 0 231 +def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 4096 0 231 rec.COLLATION_NAME uca1400_spanish_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 0 0 231 +def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 4096 0 231 rec.COLLATION_NAME uca1400_spanish_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 232 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 232 rec.COLLATION_NAME uca1400_swedish_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 232 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 232 rec.COLLATION_NAME uca1400_swedish_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 232 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 232 rec.COLLATION_NAME uca1400_swedish_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 232 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 232 rec.COLLATION_NAME uca1400_swedish_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 0 0 232 +def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 4096 0 232 rec.COLLATION_NAME uca1400_swedish_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 0 0 232 +def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 4096 0 232 rec.COLLATION_NAME uca1400_swedish_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 0 0 232 +def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 4096 0 232 rec.COLLATION_NAME uca1400_swedish_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 0 0 232 +def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 4096 0 232 rec.COLLATION_NAME uca1400_swedish_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 233 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 233 rec.COLLATION_NAME uca1400_turkish_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 233 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 233 rec.COLLATION_NAME uca1400_turkish_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 233 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 233 rec.COLLATION_NAME uca1400_turkish_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 233 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 233 rec.COLLATION_NAME uca1400_turkish_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 0 0 233 +def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 4096 0 233 rec.COLLATION_NAME uca1400_turkish_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 0 0 233 +def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 4096 0 233 rec.COLLATION_NAME uca1400_turkish_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 0 0 233 +def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 4096 0 233 rec.COLLATION_NAME uca1400_turkish_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 0 0 233 +def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 4096 0 233 rec.COLLATION_NAME uca1400_turkish_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 19 Y 0 0 234 +def COLLATION_NAME rec.COLLATION_NAME 253 256 19 Y 4096 0 234 rec.COLLATION_NAME uca1400_czech_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 19 Y 0 0 234 +def COLLATION_NAME rec.COLLATION_NAME 253 256 19 Y 4096 0 234 rec.COLLATION_NAME uca1400_czech_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 19 Y 0 0 234 +def COLLATION_NAME rec.COLLATION_NAME 253 256 19 Y 4096 0 234 rec.COLLATION_NAME uca1400_czech_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 19 Y 0 0 234 +def COLLATION_NAME rec.COLLATION_NAME 253 256 19 Y 4096 0 234 rec.COLLATION_NAME uca1400_czech_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 25 Y 0 0 234 +def COLLATION_NAME rec.COLLATION_NAME 253 256 25 Y 4096 0 234 rec.COLLATION_NAME uca1400_czech_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 25 Y 0 0 234 +def COLLATION_NAME rec.COLLATION_NAME 253 256 25 Y 4096 0 234 rec.COLLATION_NAME uca1400_czech_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 25 Y 0 0 234 +def COLLATION_NAME rec.COLLATION_NAME 253 256 25 Y 4096 0 234 rec.COLLATION_NAME uca1400_czech_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 25 Y 0 0 234 +def COLLATION_NAME rec.COLLATION_NAME 253 256 25 Y 4096 0 234 rec.COLLATION_NAME uca1400_czech_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 20 Y 0 0 235 +def COLLATION_NAME rec.COLLATION_NAME 253 256 20 Y 4096 0 235 rec.COLLATION_NAME uca1400_danish_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 20 Y 0 0 235 +def COLLATION_NAME rec.COLLATION_NAME 253 256 20 Y 4096 0 235 rec.COLLATION_NAME uca1400_danish_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 20 Y 0 0 235 +def COLLATION_NAME rec.COLLATION_NAME 253 256 20 Y 4096 0 235 rec.COLLATION_NAME uca1400_danish_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 20 Y 0 0 235 +def COLLATION_NAME rec.COLLATION_NAME 253 256 20 Y 4096 0 235 rec.COLLATION_NAME uca1400_danish_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 26 Y 0 0 235 +def COLLATION_NAME rec.COLLATION_NAME 253 256 26 Y 4096 0 235 rec.COLLATION_NAME uca1400_danish_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 26 Y 0 0 235 +def COLLATION_NAME rec.COLLATION_NAME 253 256 26 Y 4096 0 235 rec.COLLATION_NAME uca1400_danish_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 26 Y 0 0 235 +def COLLATION_NAME rec.COLLATION_NAME 253 256 26 Y 4096 0 235 rec.COLLATION_NAME uca1400_danish_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 26 Y 0 0 235 +def COLLATION_NAME rec.COLLATION_NAME 253 256 26 Y 4096 0 235 rec.COLLATION_NAME uca1400_danish_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 24 Y 0 0 236 +def COLLATION_NAME rec.COLLATION_NAME 253 256 24 Y 4096 0 236 rec.COLLATION_NAME uca1400_lithuanian_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 24 Y 0 0 236 +def COLLATION_NAME rec.COLLATION_NAME 253 256 24 Y 4096 0 236 rec.COLLATION_NAME uca1400_lithuanian_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 24 Y 0 0 236 +def COLLATION_NAME rec.COLLATION_NAME 253 256 24 Y 4096 0 236 rec.COLLATION_NAME uca1400_lithuanian_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 24 Y 0 0 236 +def COLLATION_NAME rec.COLLATION_NAME 253 256 24 Y 4096 0 236 rec.COLLATION_NAME uca1400_lithuanian_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 30 Y 0 0 236 +def COLLATION_NAME rec.COLLATION_NAME 253 256 30 Y 4096 0 236 rec.COLLATION_NAME uca1400_lithuanian_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 30 Y 0 0 236 +def COLLATION_NAME rec.COLLATION_NAME 253 256 30 Y 4096 0 236 rec.COLLATION_NAME uca1400_lithuanian_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 30 Y 0 0 236 +def COLLATION_NAME rec.COLLATION_NAME 253 256 30 Y 4096 0 236 rec.COLLATION_NAME uca1400_lithuanian_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 30 Y 0 0 236 +def COLLATION_NAME rec.COLLATION_NAME 253 256 30 Y 4096 0 236 rec.COLLATION_NAME uca1400_lithuanian_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 20 Y 0 0 237 +def COLLATION_NAME rec.COLLATION_NAME 253 256 20 Y 4096 0 237 rec.COLLATION_NAME uca1400_slovak_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 20 Y 0 0 237 +def COLLATION_NAME rec.COLLATION_NAME 253 256 20 Y 4096 0 237 rec.COLLATION_NAME uca1400_slovak_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 20 Y 0 0 237 +def COLLATION_NAME rec.COLLATION_NAME 253 256 20 Y 4096 0 237 rec.COLLATION_NAME uca1400_slovak_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 20 Y 0 0 237 +def COLLATION_NAME rec.COLLATION_NAME 253 256 20 Y 4096 0 237 rec.COLLATION_NAME uca1400_slovak_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 26 Y 0 0 237 +def COLLATION_NAME rec.COLLATION_NAME 253 256 26 Y 4096 0 237 rec.COLLATION_NAME uca1400_slovak_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 26 Y 0 0 237 +def COLLATION_NAME rec.COLLATION_NAME 253 256 26 Y 4096 0 237 rec.COLLATION_NAME uca1400_slovak_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 26 Y 0 0 237 +def COLLATION_NAME rec.COLLATION_NAME 253 256 26 Y 4096 0 237 rec.COLLATION_NAME uca1400_slovak_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 26 Y 0 0 237 +def COLLATION_NAME rec.COLLATION_NAME 253 256 26 Y 4096 0 237 rec.COLLATION_NAME uca1400_slovak_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 0 0 238 +def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 4096 0 238 rec.COLLATION_NAME uca1400_spanish2_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 0 0 238 +def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 4096 0 238 rec.COLLATION_NAME uca1400_spanish2_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 0 0 238 +def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 4096 0 238 rec.COLLATION_NAME uca1400_spanish2_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 0 0 238 +def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 4096 0 238 rec.COLLATION_NAME uca1400_spanish2_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 0 0 238 +def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 4096 0 238 rec.COLLATION_NAME uca1400_spanish2_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 0 0 238 +def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 4096 0 238 rec.COLLATION_NAME uca1400_spanish2_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 0 0 238 +def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 4096 0 238 rec.COLLATION_NAME uca1400_spanish2_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 0 0 238 +def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 4096 0 238 rec.COLLATION_NAME uca1400_spanish2_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 19 Y 0 0 239 +def COLLATION_NAME rec.COLLATION_NAME 253 256 19 Y 4096 0 239 rec.COLLATION_NAME uca1400_roman_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 19 Y 0 0 239 +def COLLATION_NAME rec.COLLATION_NAME 253 256 19 Y 4096 0 239 rec.COLLATION_NAME uca1400_roman_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 19 Y 0 0 239 +def COLLATION_NAME rec.COLLATION_NAME 253 256 19 Y 4096 0 239 rec.COLLATION_NAME uca1400_roman_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 19 Y 0 0 239 +def COLLATION_NAME rec.COLLATION_NAME 253 256 19 Y 4096 0 239 rec.COLLATION_NAME uca1400_roman_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 25 Y 0 0 239 +def COLLATION_NAME rec.COLLATION_NAME 253 256 25 Y 4096 0 239 rec.COLLATION_NAME uca1400_roman_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 25 Y 0 0 239 +def COLLATION_NAME rec.COLLATION_NAME 253 256 25 Y 4096 0 239 rec.COLLATION_NAME uca1400_roman_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 25 Y 0 0 239 +def COLLATION_NAME rec.COLLATION_NAME 253 256 25 Y 4096 0 239 rec.COLLATION_NAME uca1400_roman_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 25 Y 0 0 239 +def COLLATION_NAME rec.COLLATION_NAME 253 256 25 Y 4096 0 239 rec.COLLATION_NAME uca1400_roman_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 240 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 240 rec.COLLATION_NAME uca1400_persian_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 240 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 240 rec.COLLATION_NAME uca1400_persian_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 240 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 240 rec.COLLATION_NAME uca1400_persian_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 240 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 240 rec.COLLATION_NAME uca1400_persian_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 0 0 240 +def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 4096 0 240 rec.COLLATION_NAME uca1400_persian_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 0 0 240 +def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 4096 0 240 rec.COLLATION_NAME uca1400_persian_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 0 0 240 +def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 4096 0 240 rec.COLLATION_NAME uca1400_persian_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 0 0 240 +def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 4096 0 240 rec.COLLATION_NAME uca1400_persian_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 0 0 241 +def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 4096 0 241 rec.COLLATION_NAME uca1400_esperanto_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 0 0 241 +def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 4096 0 241 rec.COLLATION_NAME uca1400_esperanto_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 0 0 241 +def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 4096 0 241 rec.COLLATION_NAME uca1400_esperanto_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 0 0 241 +def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 4096 0 241 rec.COLLATION_NAME uca1400_esperanto_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 0 0 241 +def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 4096 0 241 rec.COLLATION_NAME uca1400_esperanto_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 0 0 241 +def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 4096 0 241 rec.COLLATION_NAME uca1400_esperanto_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 0 0 241 +def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 4096 0 241 rec.COLLATION_NAME uca1400_esperanto_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 0 0 241 +def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 4096 0 241 rec.COLLATION_NAME uca1400_esperanto_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 0 0 242 +def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 4096 0 242 rec.COLLATION_NAME uca1400_hungarian_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 0 0 242 +def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 4096 0 242 rec.COLLATION_NAME uca1400_hungarian_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 0 0 242 +def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 4096 0 242 rec.COLLATION_NAME uca1400_hungarian_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 0 0 242 +def COLLATION_NAME rec.COLLATION_NAME 253 256 23 Y 4096 0 242 rec.COLLATION_NAME uca1400_hungarian_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 0 0 242 +def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 4096 0 242 rec.COLLATION_NAME uca1400_hungarian_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 0 0 242 +def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 4096 0 242 rec.COLLATION_NAME uca1400_hungarian_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 0 0 242 +def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 4096 0 242 rec.COLLATION_NAME uca1400_hungarian_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 0 0 242 +def COLLATION_NAME rec.COLLATION_NAME 253 256 29 Y 4096 0 242 rec.COLLATION_NAME uca1400_hungarian_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 243 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 243 rec.COLLATION_NAME uca1400_sinhala_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 243 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 243 rec.COLLATION_NAME uca1400_sinhala_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 243 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 243 rec.COLLATION_NAME uca1400_sinhala_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 243 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 243 rec.COLLATION_NAME uca1400_sinhala_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 0 0 243 +def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 4096 0 243 rec.COLLATION_NAME uca1400_sinhala_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 0 0 243 +def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 4096 0 243 rec.COLLATION_NAME uca1400_sinhala_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 0 0 243 +def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 4096 0 243 rec.COLLATION_NAME uca1400_sinhala_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 0 0 243 +def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 4096 0 243 rec.COLLATION_NAME uca1400_sinhala_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 244 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 244 rec.COLLATION_NAME uca1400_german2_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 244 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 244 rec.COLLATION_NAME uca1400_german2_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 244 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 244 rec.COLLATION_NAME uca1400_german2_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 0 0 244 +def COLLATION_NAME rec.COLLATION_NAME 253 256 21 Y 4096 0 244 rec.COLLATION_NAME uca1400_german2_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 0 0 244 +def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 4096 0 244 rec.COLLATION_NAME uca1400_german2_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 0 0 244 +def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 4096 0 244 rec.COLLATION_NAME uca1400_german2_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 0 0 244 +def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 4096 0 244 rec.COLLATION_NAME uca1400_german2_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 0 0 244 +def COLLATION_NAME rec.COLLATION_NAME 253 256 27 Y 4096 0 244 rec.COLLATION_NAME uca1400_german2_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 24 Y 0 0 247 +def COLLATION_NAME rec.COLLATION_NAME 253 256 24 Y 4096 0 247 rec.COLLATION_NAME uca1400_vietnamese_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 24 Y 0 0 247 +def COLLATION_NAME rec.COLLATION_NAME 253 256 24 Y 4096 0 247 rec.COLLATION_NAME uca1400_vietnamese_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 24 Y 0 0 247 +def COLLATION_NAME rec.COLLATION_NAME 253 256 24 Y 4096 0 247 rec.COLLATION_NAME uca1400_vietnamese_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 24 Y 0 0 247 +def COLLATION_NAME rec.COLLATION_NAME 253 256 24 Y 4096 0 247 rec.COLLATION_NAME uca1400_vietnamese_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 30 Y 0 0 247 +def COLLATION_NAME rec.COLLATION_NAME 253 256 30 Y 4096 0 247 rec.COLLATION_NAME uca1400_vietnamese_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 30 Y 0 0 247 +def COLLATION_NAME rec.COLLATION_NAME 253 256 30 Y 4096 0 247 rec.COLLATION_NAME uca1400_vietnamese_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 30 Y 0 0 247 +def COLLATION_NAME rec.COLLATION_NAME 253 256 30 Y 4096 0 247 rec.COLLATION_NAME uca1400_vietnamese_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 30 Y 0 0 247 +def COLLATION_NAME rec.COLLATION_NAME 253 256 30 Y 4096 0 247 rec.COLLATION_NAME uca1400_vietnamese_nopad_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 0 0 608 +def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 4096 0 608 rec.COLLATION_NAME uca1400_croatian_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 0 0 608 +def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 4096 0 608 rec.COLLATION_NAME uca1400_croatian_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 0 0 608 +def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 4096 0 608 rec.COLLATION_NAME uca1400_croatian_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 0 0 608 +def COLLATION_NAME rec.COLLATION_NAME 253 256 22 Y 4096 0 608 rec.COLLATION_NAME uca1400_croatian_as_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 0 0 608 +def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 4096 0 608 rec.COLLATION_NAME uca1400_croatian_nopad_ai_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 0 0 608 +def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 4096 0 608 rec.COLLATION_NAME uca1400_croatian_nopad_ai_cs Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 0 0 608 +def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 4096 0 608 rec.COLLATION_NAME uca1400_croatian_nopad_as_ci Catalog Database Table Table_alias Column Column_alias Type Length Max length Is_null Flags Decimals Charsetnr -def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 0 0 608 +def COLLATION_NAME rec.COLLATION_NAME 253 256 28 Y 4096 0 608 rec.COLLATION_NAME uca1400_croatian_nopad_as_cs # diff --git a/mysql-test/main/fetch_first.result b/mysql-test/main/fetch_first.result index 775595783b9fd..f67fb3423caff 100644 --- a/mysql-test/main/fetch_first.result +++ b/mysql-test/main/fetch_first.result @@ -1462,3 +1462,88 @@ a b 3 bar 3 zzz DROP TABLE t1; +# +# MDEV-37901: Wrong result with Loose Scan on QUICK_GROUP_MIN_MAX_SELECT WITH TIES +# +create table t1 ( +country varchar(100), +city varchar(100), +user_score int, +index (country, city, user_score) +); +insert into t1 +select 'China', 'Shenzhen', seq from seq_10_to_100; +insert into t1 +select 'India', 'New Delhi', seq from seq_10_to_100; +insert into t1 +select 'Sri Lanka', 'Colombo', seq from seq_10_to_100; +analyze table t1 persistent for all; +Table Op Msg_type Msg_text +test.t1 analyze status Engine-independent statistics collected +test.t1 analyze status OK +insert into t1 +select 'Finland', 'Espoo', seq from seq_10_to_200; +insert into t1 +select 'Greece', 'Chania', seq from seq_10_to_20; +insert into t1 +select 'Estonia', 'Narva', seq from seq_10_to_20; +insert into t1 +select 'Russia', 'St Petersburg', seq from seq_10_to_20; +# Must use "Using index for group-by": +explain +select country, city, min(user_score) +from t1 +where user_score between 9 and 199 +group by country, city +order by country +fetch first 5 rows with ties; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 range NULL country 211 NULL 4 Using where; Using index for group-by; Using temporary; Using filesort +# Must not use "Using index for group-by": +explain +select country, city, sum(user_score) +from t1 +where user_score between 9 and 199 +group by country, concat(city,'AA') +order by country +fetch first 5 rows with ties; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 index NULL country 211 NULL 273 Using where; Using index; Using temporary; Using filesort +select country, city, sum(user_score) +from t1 +where user_score between 9 and 199 +group by country, concat(city,'AA') +order by country +fetch first 5 rows with ties; +country city sum(user_score) +China Shenzhen 5005 +Estonia Narva 165 +Finland Espoo 19855 +Greece Chania 165 +India New Delhi 5005 +# both using index and index with group by should produce same result +select country, city, min(user_score) +from t1 +where user_score between 9 and 199 +group by country, city +order by country +fetch first 5 rows with ties; +country city min(user_score) +China Shenzhen 10 +Estonia Narva 10 +Finland Espoo 10 +Greece Chania 10 +India New Delhi 10 +select country, city, min(user_score) +from t1 use index() +where user_score between 9 and 199 +group by country, city +order by country +fetch first 5 rows with ties; +country city min(user_score) +China Shenzhen 10 +Estonia Narva 10 +Finland Espoo 10 +Greece Chania 10 +India New Delhi 10 +drop table t1; diff --git a/mysql-test/main/fetch_first.test b/mysql-test/main/fetch_first.test index 71e45f5c28880..d4cb8edaa0d4f 100644 --- a/mysql-test/main/fetch_first.test +++ b/mysql-test/main/fetch_first.test @@ -1095,3 +1095,77 @@ SELECT DISTINCT a, b FROM t1 ORDER BY a FETCH FIRST 3 ROWS WITH TIES; # Cleanup DROP TABLE t1; + + +--echo # +--echo # MDEV-37901: Wrong result with Loose Scan on QUICK_GROUP_MIN_MAX_SELECT WITH TIES +--echo # + +--source include/have_sequence.inc + +create table t1 ( + country varchar(100), + city varchar(100), + user_score int, + index (country, city, user_score) +); + +insert into t1 +select 'China', 'Shenzhen', seq from seq_10_to_100; +insert into t1 +select 'India', 'New Delhi', seq from seq_10_to_100; +insert into t1 +select 'Sri Lanka', 'Colombo', seq from seq_10_to_100; +analyze table t1 persistent for all; + +insert into t1 +select 'Finland', 'Espoo', seq from seq_10_to_200; +insert into t1 +select 'Greece', 'Chania', seq from seq_10_to_20; +insert into t1 +select 'Estonia', 'Narva', seq from seq_10_to_20; +insert into t1 +select 'Russia', 'St Petersburg', seq from seq_10_to_20; + +--echo # Must use "Using index for group-by": +explain +select country, city, min(user_score) +from t1 +where user_score between 9 and 199 +group by country, city +order by country +fetch first 5 rows with ties; + +--echo # Must not use "Using index for group-by": +explain +select country, city, sum(user_score) +from t1 +where user_score between 9 and 199 +group by country, concat(city,'AA') +order by country +fetch first 5 rows with ties; + +select country, city, sum(user_score) +from t1 +where user_score between 9 and 199 +group by country, concat(city,'AA') +order by country +fetch first 5 rows with ties; + +--echo # both using index and index with group by should produce same result + +select country, city, min(user_score) +from t1 +where user_score between 9 and 199 +group by country, city +order by country +fetch first 5 rows with ties; + +select country, city, min(user_score) +from t1 use index() +where user_score between 9 and 199 +group by country, city +order by country +fetch first 5 rows with ties; + +drop table t1; diff --git a/mysql-test/main/merge_alter-master.opt b/mysql-test/main/merge_alter-master.opt new file mode 100644 index 0000000000000..4d69f3359db5c --- /dev/null +++ b/mysql-test/main/merge_alter-master.opt @@ -0,0 +1 @@ +--timezone=GMT-3 diff --git a/mysql-test/main/merge_alter.result b/mysql-test/main/merge_alter.result new file mode 100644 index 0000000000000..2508cc7355b30 --- /dev/null +++ b/mysql-test/main/merge_alter.result @@ -0,0 +1,77 @@ +SET timestamp=1000000000; +RESET MASTER; +CREATE TABLE t (i1 int, i2 int, pk int) ; +CREATE TABLE t3 LIKE t ; +ALTER TABLE t3 ENGINE = MERGE UNION (t1,t2); +insert into t values(1,1,1); +flush logs; +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/; +/*!40019 SET @@session.max_delayed_threads=0*/; +/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; +DELIMITER /*!*/; +# at # +#010909 4:46:40 server id # end_log_pos # CRC32 XXX Start: binlog v 4, server v #.##.## created 010909 4:46:40 at startup +ROLLBACK/*!*/; +# at # +#010909 4:46:40 server id # end_log_pos # CRC32 XXX Gtid list [] +# at # +#010909 4:46:40 server id # end_log_pos # CRC32 XXX Binlog checkpoint master-bin.000001 +# at # +#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-1 ddl +/*M!100101 SET @@session.skip_parallel_replication=0*//*!*/; +/*M!100001 SET @@session.gtid_domain_id=0*//*!*/; +/*M!100001 SET @@session.server_id=1*//*!*/; +/*M!100001 SET @@session.gtid_seq_no=1*//*!*/; +# at # +#010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= +use `test`/*!*/; +SET TIMESTAMP=1000000000/*!*/; +SET @@session.pseudo_thread_id=#/*!*/; +SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1, @@session.check_constraint_checks=1, @@session.sql_if_exists=0, @@session.explicit_defaults_for_timestamp=1, @@session.system_versioning_insert_history=0/*!*/; +SET @@session.sql_mode=1411383296/*!*/; +SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; +/*!\C latin1 *//*!*/; +SET @@session.character_set_client=X,@@session.collation_connection=X,@@session.collation_server=X/*!*/; +SET @@session.lc_time_names=0/*!*/; +SET @@session.collation_database=DEFAULT/*!*/; +CREATE TABLE t (i1 int, i2 int, pk int) +/*!*/; +# at # +#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-2 ddl +/*M!100001 SET @@session.gtid_seq_no=2*//*!*/; +# at # +#010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= +SET TIMESTAMP=1000000000/*!*/; +CREATE TABLE t3 LIKE t +/*!*/; +# at # +#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-3 ddl +/*M!100001 SET @@session.gtid_seq_no=3*//*!*/; +# at # +#010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= +SET TIMESTAMP=1000000000/*!*/; +ALTER TABLE t3 ENGINE = MERGE UNION (t1,t2) +/*!*/; +# at # +#010909 4:46:40 server id # end_log_pos # CRC32 XXX GTID 0-1-4 +/*M!100001 SET @@session.gtid_seq_no=4*//*!*/; +START TRANSACTION +/*!*/; +# at # +#010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= +SET TIMESTAMP=1000000000/*!*/; +insert into t values(1,1,1) +/*!*/; +# at # +#010909 4:46:40 server id # end_log_pos # CRC32 XXX Query thread_id=# exec_time=# error_code=0 xid= +SET TIMESTAMP=1000000000/*!*/; +COMMIT +/*!*/; +# at # +#010909 4:46:40 server id # end_log_pos # CRC32 XXX Rotate to master-bin.000002 pos: 4 +DELIMITER ; +# End of log file +ROLLBACK /* added by mysqlbinlog */; +/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; +/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/; +drop table t,t3; diff --git a/mysql-test/main/merge_alter.test b/mysql-test/main/merge_alter.test new file mode 100644 index 0000000000000..8094fd4e9f9ab --- /dev/null +++ b/mysql-test/main/merge_alter.test @@ -0,0 +1,20 @@ +--source include/have_binlog_format_mixed.inc + +# MDEV-37903 ALTER TABLE ... ENGINE=MRG_MyISAM is not binlogged as DDL + +# Fix timestamp to avoid varying results. +SET timestamp=1000000000; + +RESET MASTER; + +CREATE TABLE t (i1 int, i2 int, pk int) ; +CREATE TABLE t3 LIKE t ; +ALTER TABLE t3 ENGINE = MERGE UNION (t1,t2); +insert into t values(1,1,1); + +flush logs; +let $MYSQLD_DATADIR= `select @@datadir`; +--replace_regex /server id [0-9]*/server id #/ /server v [^ ]*/server v #.##.##/ /exec_time=[0-9]*/exec_time=#/ /thread_id=[0-9]*/thread_id=#/ /table id [0-9]*/table id #/ /mapped to number [0-9]*/mapped to number #/ /end_log_pos [0-9]*/end_log_pos #/ /# at [0-9]*/# at #/ /CRC32 0x[0-9a-f]*/CRC32 XXX/ /collation_server=[0-9]+/collation_server=X/ /character_set_client=[a-zA-Z0-9]+/character_set_client=X/ /collation_connection=[0-9]+/collation_connection=X/ /xid=\d*/xid=/ +--exec $MYSQL_BINLOG --base64-output=decode-rows -v -v $MYSQLD_DATADIR/master-bin.000001 + +drop table t,t3; diff --git a/mysql-test/main/null-aware-cardinality.result b/mysql-test/main/null-aware-cardinality.result new file mode 100644 index 0000000000000..5c5aae9dfb79b --- /dev/null +++ b/mysql-test/main/null-aware-cardinality.result @@ -0,0 +1,150 @@ +# Small driving table +CREATE TABLE t1 (a INT, b INT); +INSERT INTO t1 VALUES (1, 1), (2, 2000),(3,300); +ANALYZE TABLE t1 PERSISTENT FOR ALL; +Table Op Msg_type Msg_text +test.t1 analyze status Engine-independent statistics collected +test.t1 analyze status OK +# Table that will be accessed by an index lookup (`ref` access) +CREATE TABLE t2 (a INT, b INT, KEY key_b(b)); +# All t11.b values are NULL +INSERT INTO t2 SELECT seq/100, NULL FROM seq_1_to_1000; +ANALYZE TABLE t2 PERSISTENT FOR ALL; +Table Op Msg_type Msg_text +test.t2 analyze status Engine-independent statistics collected +test.t2 analyze status Table is already up to date +# NULL-rejecting equality t1.b = t2.b will not return any matches +# because all values of t2.b are NULL. So "rows" = 1 for t2 where 1 is +# a special value meaning "very few" rows +EXPLAIN EXTENDED SELECT * FROM t1 JOIN t2 ON t1.a = t2.a AND t1.b = t2.b; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00 Using where +1 SIMPLE t2 ref key_b key_b 5 test.t1.b 1 100.00 Using where +Warnings: +Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b` from `test`.`t1` join `test`.`t2` where `test`.`t2`.`a` = `test`.`t1`.`a` and `test`.`t2`.`b` = `test`.`t1`.`b` +# However, rows estimation for not NULL-rejecting conditions +# must not be affected ("rows" > 1 is expected) +EXPLAIN EXTENDED SELECT * FROM t1 JOIN t2 ON t1.a = t2.a AND t1.b <=> t2.b; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00 +1 SIMPLE t2 ref key_b key_b 5 test.t1.b 11 100.00 Using index condition; Using where +Warnings: +Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b` from `test`.`t1` join `test`.`t2` where `test`.`t2`.`a` = `test`.`t1`.`a` and `test`.`t1`.`b` <=> `test`.`t2`.`b` +ANALYZE SELECT * FROM t1 JOIN t2 ON t1.a = t2.a AND t1.b <=> t2.b; +id select_type table type possible_keys key key_len ref rows r_rows filtered r_filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 3.00 100.00 100.00 +1 SIMPLE t2 ref key_b key_b 5 test.t1.b 11 0.00 100.00 100.00 Using index condition; Using where +# Insert some non-NULL values and re-collect the stats +INSERT INTO t2 SELECT 1, 1 FROM seq_1_to_100; +ANALYZE TABLE t2 PERSISTENT FOR COLUMNS (b) INDEXES (key_b); +Table Op Msg_type Msg_text +test.t2 analyze status Engine-independent statistics collected +test.t2 analyze status OK +EXPLAIN EXTENDED SELECT * FROM t1 JOIN t2 ON t1.a = t2.a AND t1.b = t2.b; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00 Using where +1 SIMPLE t2 ref key_b key_b 5 test.t1.b 100 100.00 Using where +Warnings: +Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t2`.`a` AS `a`,`test`.`t2`.`b` AS `b` from `test`.`t1` join `test`.`t2` where `test`.`t2`.`a` = `test`.`t1`.`a` and `test`.`t2`.`b` = `test`.`t1`.`b` +# Test composite index for two columns. Key prefix is used for access +CREATE TABLE t3 (a INT, b INT, KEY key_ab(a,b)); +# All t3.b values are NULL +INSERT INTO t3 SELECT seq/100, NULL FROM seq_1_to_1000; +ANALYZE TABLE t3 PERSISTENT FOR COLUMNS(b) INDEXES(key_ab); +Table Op Msg_type Msg_text +test.t3 analyze status Engine-independent statistics collected +test.t3 analyze status Table is already up to date +# NULL-rejecting equality t1.b = t3.b, same as above. +# "rows" must be estimated to 1 +EXPLAIN EXTENDED SELECT * FROM t1 JOIN t3 ON t1.a = t3.a AND t1.b = t3.b; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00 Using where +1 SIMPLE t3 ref key_ab key_ab 10 test.t1.a,test.t1.b 1 100.00 Using index +Warnings: +Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t3`.`a` AS `a`,`test`.`t3`.`b` AS `b` from `test`.`t1` join `test`.`t3` where `test`.`t3`.`a` = `test`.`t1`.`a` and `test`.`t3`.`b` = `test`.`t1`.`b` +# Rows estimation for not NULL-rejecting conditions are not affected +# ("rows" > 1 is expected) +EXPLAIN EXTENDED SELECT * FROM t1 JOIN t3 ON t1.a = t3.a; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00 Using where +1 SIMPLE t3 ref key_ab key_ab 5 test.t1.a 90 100.00 Using index +Warnings: +Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t3`.`a` AS `a`,`test`.`t3`.`b` AS `b` from `test`.`t1` join `test`.`t3` where `test`.`t3`.`a` = `test`.`t1`.`a` +EXPLAIN EXTENDED SELECT * FROM t1 JOIN t3 ON t1.a = t3.a AND t1.b <=> t3.b; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00 Using where +1 SIMPLE t3 ref key_ab key_ab 10 test.t1.a,test.t1.b 11 100.00 Using where; Using index +Warnings: +Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t3`.`a` AS `a`,`test`.`t3`.`b` AS `b` from `test`.`t1` join `test`.`t3` where `test`.`t3`.`a` = `test`.`t1`.`a` and `test`.`t1`.`b` <=> `test`.`t3`.`b` +EXPLAIN EXTENDED SELECT * FROM t1 JOIN t3 ON t1.a = t3.a AND t3.b is NULL; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00 Using where +1 SIMPLE t3 ref key_ab key_ab 10 test.t1.a,const 11 100.00 Using where; Using index +Warnings: +Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t3`.`a` AS `a`,`test`.`t3`.`b` AS `b` from `test`.`t1` join `test`.`t3` where `test`.`t3`.`a` = `test`.`t1`.`a` and `test`.`t3`.`b` is null +# Insert some non-NULL values and re-collect the stats +INSERT INTO t3 SELECT 1, 1 FROM seq_1_to_100; +ANALYZE TABLE t3 PERSISTENT FOR COLUMNS (b) INDEXES (key_ab); +Table Op Msg_type Msg_text +test.t3 analyze status Engine-independent statistics collected +test.t3 analyze status OK +EXPLAIN EXTENDED SELECT * FROM t1 JOIN t3 ON t1.a = t3.a AND t1.b = t3.b; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00 Using where +1 SIMPLE t3 ref key_ab key_ab 10 test.t1.a,test.t1.b 100 100.00 Using index +Warnings: +Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t3`.`a` AS `a`,`test`.`t3`.`b` AS `b` from `test`.`t1` join `test`.`t3` where `test`.`t3`.`a` = `test`.`t1`.`a` and `test`.`t3`.`b` = `test`.`t1`.`b` +# Test composite index for 3 columns. Key prefix is used for access +CREATE TABLE t4 (a INT, b INT, c INT, KEY key_abc(a,b,c)); +# All t3.b values are NULL +INSERT INTO t4 SELECT seq/10, NULL, seq/10 FROM seq_1_to_1000; +ANALYZE TABLE t4 PERSISTENT FOR COLUMNS(b) INDEXES(key_abc); +Table Op Msg_type Msg_text +test.t4 analyze status Engine-independent statistics collected +test.t4 analyze status Table is already up to date +# NULL-rejecting equality t1.b = t3.b, same as above. +# "rows" must be estimated to 1 +EXPLAIN EXTENDED SELECT * FROM t1 JOIN t4 ON t1.a = t4.a AND t1.b = t4.b; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00 Using where +1 SIMPLE t4 ref key_abc key_abc 10 test.t1.a,test.t1.b 1 100.00 Using index +Warnings: +Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t4`.`a` AS `a`,`test`.`t4`.`b` AS `b`,`test`.`t4`.`c` AS `c` from `test`.`t1` join `test`.`t4` where `test`.`t4`.`a` = `test`.`t1`.`a` and `test`.`t4`.`b` = `test`.`t1`.`b` +EXPLAIN EXTENDED SELECT * FROM t1 JOIN t4 ON t1.a = t4.a AND t1.b = t4.b and t1.b = t4.c; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00 Using where +1 SIMPLE t4 ref key_abc key_abc 15 test.t1.a,test.t1.b,test.t1.b 1 100.00 Using index +Warnings: +Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t4`.`a` AS `a`,`test`.`t4`.`b` AS `b`,`test`.`t4`.`c` AS `c` from `test`.`t1` join `test`.`t4` where `test`.`t4`.`a` = `test`.`t1`.`a` and `test`.`t4`.`b` = `test`.`t1`.`b` and `test`.`t4`.`c` = `test`.`t1`.`b` +# "rows" expected to be > 1 +EXPLAIN EXTENDED SELECT * FROM t1 JOIN t4 ON t1.a = t4.a; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00 Using where +1 SIMPLE t4 ref key_abc key_abc 5 test.t1.a 9 100.00 Using index +Warnings: +Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t4`.`a` AS `a`,`test`.`t4`.`b` AS `b`,`test`.`t4`.`c` AS `c` from `test`.`t1` join `test`.`t4` where `test`.`t4`.`a` = `test`.`t1`.`a` +EXPLAIN EXTENDED SELECT * FROM t1 JOIN t4 ON t1.a = t4.a AND t1.b <=> t4.c; +id select_type table type possible_keys key key_len ref rows filtered Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 3 100.00 Using where +1 SIMPLE t4 ref key_abc key_abc 5 test.t1.a 9 100.00 Using where; Using index +Warnings: +Note 1003 select `test`.`t1`.`a` AS `a`,`test`.`t1`.`b` AS `b`,`test`.`t4`.`a` AS `a`,`test`.`t4`.`b` AS `b`,`test`.`t4`.`c` AS `c` from `test`.`t1` join `test`.`t4` where `test`.`t4`.`a` = `test`.`t1`.`a` and `test`.`t1`.`b` <=> `test`.`t4`.`c` +DROP TABLE t1, t2, t3, t4; +# Test for partially covered column +CREATE TABLE t1 (a VARCHAR(10)); +INSERT INTO t1 SELECT seq FROM seq_1_to_10; +CREATE TABLE t2 ( +a VARCHAR(10), +b VARCHAR(10), +INDEX i1(a, b(5)) +); +INSERT INTO t2 SELECT seq, NULL FROM seq_1_to_1000; +ANALYZE TABLE t2 PERSISTENT FOR COLUMNS (b) INDEXES (i1); +Table Op Msg_type Msg_text +test.t2 analyze status Engine-independent statistics collected +test.t2 analyze status Table is already up to date +EXPLAIN SELECT * FROM t1, t2 WHERE t2.a=t1.a AND t2.b=t1.a; +id select_type table type possible_keys key key_len ref rows Extra +1 SIMPLE t1 ALL NULL NULL NULL NULL 10 Using where +1 SIMPLE t2 ref i1 i1 21 test.t1.a,test.t1.a 1 Using where +DROP TABLE t1, t2; diff --git a/mysql-test/main/null-aware-cardinality.test b/mysql-test/main/null-aware-cardinality.test new file mode 100644 index 0000000000000..418f0f3d9af08 --- /dev/null +++ b/mysql-test/main/null-aware-cardinality.test @@ -0,0 +1,95 @@ +--source include/have_sequence.inc + +--echo # Small driving table +CREATE TABLE t1 (a INT, b INT); +INSERT INTO t1 VALUES (1, 1), (2, 2000),(3,300); + +ANALYZE TABLE t1 PERSISTENT FOR ALL; + +--echo # Table that will be accessed by an index lookup (`ref` access) +CREATE TABLE t2 (a INT, b INT, KEY key_b(b)); +--echo # All t11.b values are NULL +INSERT INTO t2 SELECT seq/100, NULL FROM seq_1_to_1000; + +ANALYZE TABLE t2 PERSISTENT FOR ALL; + +--echo # NULL-rejecting equality t1.b = t2.b will not return any matches +--echo # because all values of t2.b are NULL. So "rows" = 1 for t2 where 1 is +--echo # a special value meaning "very few" rows +EXPLAIN EXTENDED SELECT * FROM t1 JOIN t2 ON t1.a = t2.a AND t1.b = t2.b; + +--echo # However, rows estimation for not NULL-rejecting conditions +--echo # must not be affected ("rows" > 1 is expected) +EXPLAIN EXTENDED SELECT * FROM t1 JOIN t2 ON t1.a = t2.a AND t1.b <=> t2.b; + +ANALYZE SELECT * FROM t1 JOIN t2 ON t1.a = t2.a AND t1.b <=> t2.b; + +--echo # Insert some non-NULL values and re-collect the stats +INSERT INTO t2 SELECT 1, 1 FROM seq_1_to_100; + +ANALYZE TABLE t2 PERSISTENT FOR COLUMNS (b) INDEXES (key_b); + +EXPLAIN EXTENDED SELECT * FROM t1 JOIN t2 ON t1.a = t2.a AND t1.b = t2.b; + +--echo # Test composite index for two columns. Key prefix is used for access +CREATE TABLE t3 (a INT, b INT, KEY key_ab(a,b)); +--echo # All t3.b values are NULL +INSERT INTO t3 SELECT seq/100, NULL FROM seq_1_to_1000; + +ANALYZE TABLE t3 PERSISTENT FOR COLUMNS(b) INDEXES(key_ab); + +--echo # NULL-rejecting equality t1.b = t3.b, same as above. +--echo # "rows" must be estimated to 1 +EXPLAIN EXTENDED SELECT * FROM t1 JOIN t3 ON t1.a = t3.a AND t1.b = t3.b; + +--echo # Rows estimation for not NULL-rejecting conditions are not affected +--echo # ("rows" > 1 is expected) +EXPLAIN EXTENDED SELECT * FROM t1 JOIN t3 ON t1.a = t3.a; + +EXPLAIN EXTENDED SELECT * FROM t1 JOIN t3 ON t1.a = t3.a AND t1.b <=> t3.b; + +EXPLAIN EXTENDED SELECT * FROM t1 JOIN t3 ON t1.a = t3.a AND t3.b is NULL; + +--echo # Insert some non-NULL values and re-collect the stats +INSERT INTO t3 SELECT 1, 1 FROM seq_1_to_100; + +ANALYZE TABLE t3 PERSISTENT FOR COLUMNS (b) INDEXES (key_ab); + +EXPLAIN EXTENDED SELECT * FROM t1 JOIN t3 ON t1.a = t3.a AND t1.b = t3.b; + +--echo # Test composite index for 3 columns. Key prefix is used for access +CREATE TABLE t4 (a INT, b INT, c INT, KEY key_abc(a,b,c)); + +--echo # All t3.b values are NULL +INSERT INTO t4 SELECT seq/10, NULL, seq/10 FROM seq_1_to_1000; + +ANALYZE TABLE t4 PERSISTENT FOR COLUMNS(b) INDEXES(key_abc); + +--echo # NULL-rejecting equality t1.b = t3.b, same as above. +--echo # "rows" must be estimated to 1 +EXPLAIN EXTENDED SELECT * FROM t1 JOIN t4 ON t1.a = t4.a AND t1.b = t4.b; + +EXPLAIN EXTENDED SELECT * FROM t1 JOIN t4 ON t1.a = t4.a AND t1.b = t4.b and t1.b = t4.c; + +--echo # "rows" expected to be > 1 +EXPLAIN EXTENDED SELECT * FROM t1 JOIN t4 ON t1.a = t4.a; + +EXPLAIN EXTENDED SELECT * FROM t1 JOIN t4 ON t1.a = t4.a AND t1.b <=> t4.c; + +DROP TABLE t1, t2, t3, t4; + +--echo # Test for partially covered column +CREATE TABLE t1 (a VARCHAR(10)); +INSERT INTO t1 SELECT seq FROM seq_1_to_10; + +CREATE TABLE t2 ( + a VARCHAR(10), + b VARCHAR(10), + INDEX i1(a, b(5)) +); +INSERT INTO t2 SELECT seq, NULL FROM seq_1_to_1000; +ANALYZE TABLE t2 PERSISTENT FOR COLUMNS (b) INDEXES (i1); + +EXPLAIN SELECT * FROM t1, t2 WHERE t2.a=t1.a AND t2.b=t1.a; + +DROP TABLE t1, t2; \ No newline at end of file diff --git a/mysql-test/main/range.result b/mysql-test/main/range.result index 70480222a6f4a..56560180c801a 100644 --- a/mysql-test/main/range.result +++ b/mysql-test/main/range.result @@ -3794,6 +3794,27 @@ DROP TABLE t1; # # End of 10.5 tests # +# +# MDEV-37913: disable_index_merge_plans causes SELECT data loss when more than 100 ORs +# +CREATE TABLE t1 ( +id int primary key, +key1 int, +index(key1) +); +INSERT INTO t1 VALUES +(1, 1), +(2, 1), +(3, 2); +$query; +id key1 +1 1 +2 1 +3 2 +drop table t1; +# +# End of 10.11 tests +# set global innodb_stats_persistent= @innodb_stats_persistent_save; set global innodb_stats_persistent_sample_pages= @innodb_stats_persistent_sample_pages_save; diff --git a/mysql-test/main/range.test b/mysql-test/main/range.test index 9bff8b5d683c0..ae3bc84aed0ba 100644 --- a/mysql-test/main/range.test +++ b/mysql-test/main/range.test @@ -2558,6 +2558,32 @@ DROP TABLE t1; --echo # End of 10.5 tests --echo # +--echo # +--echo # MDEV-37913: disable_index_merge_plans causes SELECT data loss when more than 100 ORs +--echo # +CREATE TABLE t1 ( + id int primary key, + key1 int, + index(key1) +); + +INSERT INTO t1 VALUES +(1, 1), +(2, 1), +(3, 2); + +let $query=` + select concat('select * from t1 where (key1 = 2 AND id = 3) ', + REPEAT(' OR (key1 = 1)', 100)) +`; + +evalp $query; + +drop table t1; + +--echo # +--echo # End of 10.11 tests +--echo # set global innodb_stats_persistent= @innodb_stats_persistent_save; set global innodb_stats_persistent_sample_pages= @innodb_stats_persistent_sample_pages_save; diff --git a/mysql-test/main/range_mrr_icp.result b/mysql-test/main/range_mrr_icp.result index accf79d9c49a8..3e7048e1e463c 100644 --- a/mysql-test/main/range_mrr_icp.result +++ b/mysql-test/main/range_mrr_icp.result @@ -3792,6 +3792,27 @@ DROP TABLE t1; # # End of 10.5 tests # +# +# MDEV-37913: disable_index_merge_plans causes SELECT data loss when more than 100 ORs +# +CREATE TABLE t1 ( +id int primary key, +key1 int, +index(key1) +); +INSERT INTO t1 VALUES +(1, 1), +(2, 1), +(3, 2); +$query; +id key1 +1 1 +2 1 +3 2 +drop table t1; +# +# End of 10.11 tests +# set global innodb_stats_persistent= @innodb_stats_persistent_save; set global innodb_stats_persistent_sample_pages= @innodb_stats_persistent_sample_pages_save; diff --git a/mysql-test/suite/compat/oracle/r/sp-package-i_s.result b/mysql-test/suite/compat/oracle/r/sp-package-i_s.result index 2f4201f7d600d..a099fc0c47830 100644 --- a/mysql-test/suite/compat/oracle/r/sp-package-i_s.result +++ b/mysql-test/suite/compat/oracle/r/sp-package-i_s.result @@ -20,11 +20,268 @@ SELECT routine_name, routine_type, routine_definition FROM information_schema.routines WHERE routine_type LIKE 'PACKAGE%' ORDER BY routine_type; +routine_name dbms_random +routine_type PACKAGE +routine_definition AS + PROCEDURE initialize (input INT) + SQL SECURITY INVOKER + COMMENT '\n Description\n Initializes the seed\n Raises\n ' + ; + PROCEDURE terminate + SQL SECURITY INVOKER + COMMENT '\n Description\n Terminates package\n Raises\n ' + ; + FUNCTION value RETURN DECIMAL(65,38) + SQL SECURITY INVOKER + COMMENT '\n Description\n Gets a random number greater than or equal to 0 and less than 1,\n with 38 digits to the right of the decimal point (38-digit\n precision)\n Raises\n ' + ; + FUNCTION random RETURN INT + SQL SECURITY INVOKER + COMMENT '\n Description\n Generates a random number\n Raises\n ' + ; +END +routine_name dbms_sql +routine_type PACKAGE +routine_definition AS + FUNCTION open_cursor RETURN INT + SQL SECURITY INVOKER + COMMENT '\n Description\n This function opens a new cursor.\n Raises\n ' + ; + PROCEDURE parse (cursor_id INT, input VARCHAR2(65511), language_flag INT) + SQL SECURITY INVOKER + COMMENT '\n Description\n This procedure parses the given statement in the given cursor. All statements are parsed immediately. In addition, DDL statements are run immediately when parsed.\n Raises\n ' + ; + FUNCTION execute (cursor_id INT) RETURN INT + SQL SECURITY INVOKER + COMMENT '\n Description\n This function executes a given cursor. This function accepts the ID number of the cursor and returns the number of rows processed.\n Raises\n ' + ; + PROCEDURE close_cursor (cursor_id INT) + SQL SECURITY INVOKER + COMMENT '\n Description\n When you no longer need a cursor for a session, close the cursor by calling the CLOSE_CURSOR Procedure.\n Raises\n ' + ; +END +routine_name dbms_utility +routine_type PACKAGE +routine_definition AS + FUNCTION format_error_backtrace RETURN VARCHAR(65532) + SQL SECURITY INVOKER + COMMENT '\n Description\n This procedure displays the call stack at the point where an exception was raised, even if the procedure is called from an exception handler in an outer scope.\n Raises\n ' + ; + FUNCTION format_error_stack RETURN VARCHAR(65532) + SQL SECURITY INVOKER + COMMENT '\n Description\n This function formats the current error stack. It can be used in exception handlers to look at the full error stack\n Raises\n ' + ; + FUNCTION get_time RETURN INT + SQL SECURITY INVOKER + COMMENT '\n Description\n This function returns a measure of current time in hundredths of a second\n Raises\n ' + ; +END routine_name pkg1 routine_type PACKAGE routine_definition AS FUNCTION f1() RETURN INT; END +routine_name UTL_I18N +routine_type PACKAGE +routine_definition AS + FUNCTION transliterate(val VARCHAR2(255) CHARACTER SET ANY_CS, name VARCHAR2(255)) RETURN VARCHAR2(255) CHARACTER SET ANY_CS + SQL SECURITY INVOKER + COMMENT '\n Description\n This function performs script transliteration.\n Parameters\n val (VARCHAR2):\n Specifies the data to be converted.\n name (VARCHAR2):\n Specifies the transliteration name string.\n Returns\n The converted string.\n ' + ; + FUNCTION raw_to_char(jc RAW, charset_or_collation VARCHAR(255)) RETURN VARCHAR2 + SQL SECURITY INVOKER + COMMENT '\n Description\n This function converts RAW data from a valid character set to a\n VARCHAR2 string in the database character set.\n Parameters\n jc (RAW):\n Specifies the RAW data to be converted to a VARCHAR2 string\n charset_or_collation (VARCHAR):\n Specifies the character set that the RAW data was derived from.\n Returns\n the VARCHAR2 string equivalent in the database character set of\n the RAW data.\n ' + ; + FUNCTION string_to_raw(jc VARCHAR2, charset_or_collation VARCHAR(255)) RETURN RAW + SQL SECURITY INVOKER + COMMENT '\n Description\n This function converts a VARCHAR2 string to another valid\n character set and returns the result as RAW data.\n Parameters\n jc (VARCHAR2):\n Specifies the VARCHAR2 or NVARCHAR2 string to convert.\n charset_or_collation (VARCHAR):\n Specifies the destination character set.\n Returns\n RAW data representation of the input string in the new character set\n ' + ; +END +routine_name dbms_random +routine_type PACKAGE BODY +routine_definition AS + FUNCTION get_seed_from_session() RETURN INTEGER + AS + v_user_hash INTEGER; + v_time_num INTEGER; + v_process_id INTEGER; + v_seed INTEGER; + v_username VARCHAR(128); + v_i INTEGER; + BEGIN + v_username := USER(); + v_user_hash := 0; + FOR v_i IN 1..LENGTH(v_username) LOOP + v_user_hash := v_user_hash + (ASCII(SUBSTR(v_username, v_i, 1)) * v_i); + END LOOP; + v_time_num := UNIX_TIMESTAMP(); + v_process_id := CONNECTION_ID(); + v_seed := MOD( + (v_user_hash * 31) + + (v_time_num * 17) + + (v_process_id * 13), + 2147483647 -- Max 32-bit signed integer + ); + RETURN v_seed; + END; + PROCEDURE initialize (input INT) + SQL SECURITY INVOKER + COMMENT '\n Description\n Initializes the seed\n Raises\n ' + IS + BEGIN + SET @@rand_seed1 = input * 0x10001 + 55555555; + SET @@rand_seed2 = input * 0x10000001; + END; + PROCEDURE terminate + SQL SECURITY INVOKER + COMMENT '\n Description\n Terminates package\n Raises\n ' + IS + BEGIN + END; + FUNCTION value RETURN DECIMAL(65,38) + SQL SECURITY INVOKER + COMMENT '\n Description\n Gets a random number greater than or equal to 0 and less than 1, with\n 38 digits to the right of the decimal point (38-digit precision)\n Raises\n ' + IS + BEGIN + RETURN CAST(RAND() AS DECIMAL(65, 38)); + END; + FUNCTION random RETURN INT + SQL SECURITY INVOKER + COMMENT '\n Description\n Generates a random number\n Raises\n ' + IS + BEGIN + RETURN CONVERT(RAND() * (POW(2, 31) - 1 + POW(2, 31)) - POW(2, 31), DECIMAL(65, 0)); + END; + PROCEDURE set_seed + SQL SECURITY INVOKER + COMMENT '\n Description\n Terminates package\n Raises\n ' + IS + BEGIN + SET @seed = get_seed_from_session(); + SET @@rand_seed1 = @seed * 0x10001 + 55555555; + SET @@rand_seed2 = @seed * 0x10001; + END; +BEGIN + set_seed; +END +routine_name dbms_sql +routine_type PACKAGE BODY +routine_definition AS + FUNCTION open_cursor RETURN INT + SQL SECURITY INVOKER + COMMENT '\n Description\n This function opens a new cursor.\n Raises\n ' + AS + BEGIN + DECLARE + cursor_id INT; + BEGIN + SET cursor_id = dbms_sql_open_cursor(); + RETURN cursor_id; + END; + END; + PROCEDURE parse (cursor_id INT, input VARCHAR2(65511), language_flag INT) + SQL SECURITY INVOKER + COMMENT '\n Description\n This procedure parses the given statement in the given cursor. All statements are parsed immediately. In addition, DDL statements are run immediately when parsed.\n Raises\n ' + AS + BEGIN + DECLARE + first_word VARCHAR2(64); + second_word VARCHAR2(64); + final_ps VARCHAR2(256); + first_word_id INT; + parse_result INT; + BEGIN + SET first_word = LOWER(SUBSTRING_INDEX(LTRIM(input), ' ', 1)); + SET second_word = SUBSTRING_INDEX(SUBSTRING_INDEX(input, ' ', 2), ' ', -1); + IF first_word IN ('create', 'alter', 'drop', 'insert', 'update', 'delete') OR + (first_word = 'rename' AND second_word IN ('table', 'tables')) THEN + IF first_word IN ('create', 'alter', 'drop') OR + (first_word = 'rename' AND second_word IN ('table', 'tables')) THEN + SET final_ps = CONCAT('CREATE PROCEDURE final_NESTED_PROC() AS BEGIN PREPARE s', cursor_id, ' FROM ''', input, '''; EXECUTE s', cursor_id, '; END'); + CASE first_word + WHEN 'create' THEN + SET first_word_id = 0; + WHEN 'alter' THEN + SET first_word_id = 1; + WHEN 'drop' THEN + SET first_word_id = 2; + WHEN 'rename' THEN + SET first_word_id = 3; + END CASE; + ELSIF first_word IN ('insert', 'update', 'delete') THEN + SET final_ps = CONCAT('CREATE PROCEDURE final_NESTED_PROC() AS BEGIN PREPARE s', cursor_id, ' FROM ''', input, '''; END');CASE first_word + WHEN 'insert' THEN + SET first_word_id = 4; + WHEN 'update' THEN + SET first_word_id = 5; + WHEN 'delete' THEN + SET first_word_id = 6; + END CASE; + END IF; + EXECUTE IMMEDIATE final_ps; + EXECUTE IMMEDIATE 'CALL final_NESTED_PROC()'; + EXECUTE IMMEDIATE 'DROP PROCEDURE final_NESTED_PROC'; + SET parse_result = dbms_sql_parse(cursor_id, first_word_id); + ELSE + SIGNAL SQLSTATE 'HY000' set mysql_errno=3047, message_text='missing or invalid option'; + END IF; + END; + END; + FUNCTION execute (cursor_id INT) RETURN INT + SQL SECURITY INVOKER + COMMENT '\n Description\n This function executes a given cursor. This function accepts the ID number of the cursor and returns the number of rows processed.\n Raises\n ' + AS + BEGIN + DECLARE + element VARCHAR2(32); + BEGIN + SET element = CONCAT('s', cursor_id); + CALL dbmssql_execute (element); + RETURN ROW_COUNT(); + END; + END; + PROCEDURE close_cursor (cursor_id INT) + SQL SECURITY INVOKER + COMMENT '\n Description\n When you no longer need a cursor for a session, close the cursor by calling the CLOSE_CURSOR Procedure.\n Raises\n ' + AS + BEGIN + DECLARE + final_ps VARCHAR2(256); + res INT; + BEGIN + set res = dbms_sql_close_cursor(cursor_id); + SET final_ps = CONCAT('CREATE PROCEDURE NESTED_PROC() AS BEGIN DEALLOCATE PREPARE s', cursor_id, '; END'); + EXECUTE IMMEDIATE final_ps; + EXECUTE IMMEDIATE 'CALL NESTED_PROC()'; + EXECUTE IMMEDIATE 'DROP PROCEDURE NESTED_PROC'; + END; + END; +END +routine_name dbms_utility +routine_type PACKAGE BODY +routine_definition AS + FUNCTION format_error_backtrace RETURN VARCHAR(65532) + SQL SECURITY INVOKER + COMMENT '\n Description\n This procedure displays the call stack at the point where an exception was raised, even if the procedure is called from an exception handler in an outer scope.\n Raises\n ' + IS + BEGIN + RETURN @@backtrace_str; + END; + FUNCTION format_error_stack RETURN VARCHAR(65532) + SQL SECURITY INVOKER + COMMENT '\n Description\n This function formats the current error stack. It can be used in exception handlers to look at the full error stack\n Raises\n ' + AS + BEGIN + RETURN @@errstack_str; + END; + FUNCTION get_time RETURN INT + SQL SECURITY INVOKER + COMMENT '\n Description\n This function returns a measure of current time in hundredths of a second\n Raises\n ' + IS + BEGIN + RETURN UNIX_TIMESTAMP(CURRENT_TIMESTAMP(2)); + END; +END routine_name pkg1 routine_type PACKAGE BODY routine_definition AS @@ -33,6 +290,77 @@ BEGIN RETURN 1; END; END +routine_name UTL_I18N +routine_type PACKAGE BODY +routine_definition AS + FUNCTION transliterate(val VARCHAR2(255) CHARACTER SET ANY_CS, name VARCHAR2(255)) RETURN VARCHAR2(255) CHARACTER SET ANY_CS + SQL SECURITY INVOKER + COMMENT '\n Description\n This function performs script transliteration.\n Parameters\n val (VARCHAR2):\n Specifies the data to be converted.\n name (VARCHAR2):\n Specifies the transliteration name string.\n Returns\n The converted string.\n ' + AS + BEGIN + RETURN transliterate(val, name); + END; + FUNCTION raw_to_char(jc RAW, charset_or_collation VARCHAR(255)) RETURN VARCHAR2 + SQL SECURITY INVOKER + COMMENT '\n Description\n This function converts RAW data from a valid character set to a\n VARCHAR2 string in the database character set.\n Parameters\n jc (RAW):\n Specifies the RAW data to be converted to a VARCHAR2 string\n charset_or_collation (VARCHAR):\n Specifies the character set that the RAW data was derived from.\n Returns\n the VARCHAR2 string equivalent in the database character set of\n the RAW data.\n ' + IS + BEGIN + DECLARE + dst_charset VARCHAR(65532); + sourced_jc VARCHAR(65532); + targeted_sourced_jc VARCHAR(65532); + unhexed_hexed_data BLOB; + BEGIN + SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME = 'character_set_results' into dst_charset; + CASE charset_or_collation + WHEN 'utf8' THEN + CASE dst_charset + WHEN 'utf8mb3' THEN + BEGIN + SET sourced_jc = CONVERT(jc USING utf8); + SET targeted_sourced_jc = CONVERT(sourced_jc USING utf8mb3); + END; + ELSE + RETURN NULL; + END CASE; + WHEN 'utf8mb3' THEN + CASE dst_charset + WHEN 'utf8mb4' THEN + BEGIN + SET sourced_jc = CONVERT(jc USING utf8mb3); + SET targeted_sourced_jc = CONVERT(sourced_jc USING utf8mb4); + END; + ELSE + RETURN NULL; + END CASE; + ELSE + RETURN NULL; + END CASE; + SET unhexed_hexed_data = UNHEX(HEX(targeted_sourced_jc)); + CASE dst_charset + WHEN 'utf8mb3' THEN + RETURN CONVERT(unhexed_hexed_data USING utf8mb3); + WHEN 'utf8mb4' THEN + RETURN CONVERT(unhexed_hexed_data USING utf8mb4); + END CASE; + RETURN NULL; + END; + END; + FUNCTION string_to_raw(jc VARCHAR2, charset_or_collation VARCHAR(255)) RETURN RAW + SQL SECURITY INVOKER + COMMENT '\n Description\n This function converts a VARCHAR2 string to another valid\n character set and returns the result as RAW data.\n Parameters\n jc (VARCHAR2):\n Specifies the VARCHAR2 or NVARCHAR2 string to convert.\n charset_or_collation (VARCHAR):\n Specifies the destination character set.\n Returns\n RAW data representation of the input string in the new character set\n ' + AS + BEGIN + CASE charset_or_collation + WHEN 'utf8' THEN + RETURN CAST(CONVERT(jc USING utf8mb4) AS BINARY); + WHEN 'ucs2' THEN + RETURN CAST(CONVERT(jc USING ucs2) AS BINARY); + ELSE + RETURN NULL; + END CASE; + END; +END DROP PACKAGE pkg1; SET sql_mode=ORACLE; CREATE OR REPLACE PACKAGE pkg1 AS @@ -53,11 +381,268 @@ SELECT routine_name, routine_type, routine_definition FROM information_schema.routines WHERE routine_type LIKE 'PACKAGE%' ORDER BY routine_type; +routine_name dbms_random +routine_type PACKAGE +routine_definition AS + PROCEDURE initialize (input INT) + SQL SECURITY INVOKER + COMMENT '\n Description\n Initializes the seed\n Raises\n ' + ; + PROCEDURE terminate + SQL SECURITY INVOKER + COMMENT '\n Description\n Terminates package\n Raises\n ' + ; + FUNCTION value RETURN DECIMAL(65,38) + SQL SECURITY INVOKER + COMMENT '\n Description\n Gets a random number greater than or equal to 0 and less than 1,\n with 38 digits to the right of the decimal point (38-digit\n precision)\n Raises\n ' + ; + FUNCTION random RETURN INT + SQL SECURITY INVOKER + COMMENT '\n Description\n Generates a random number\n Raises\n ' + ; +END +routine_name dbms_sql +routine_type PACKAGE +routine_definition AS + FUNCTION open_cursor RETURN INT + SQL SECURITY INVOKER + COMMENT '\n Description\n This function opens a new cursor.\n Raises\n ' + ; + PROCEDURE parse (cursor_id INT, input VARCHAR2(65511), language_flag INT) + SQL SECURITY INVOKER + COMMENT '\n Description\n This procedure parses the given statement in the given cursor. All statements are parsed immediately. In addition, DDL statements are run immediately when parsed.\n Raises\n ' + ; + FUNCTION execute (cursor_id INT) RETURN INT + SQL SECURITY INVOKER + COMMENT '\n Description\n This function executes a given cursor. This function accepts the ID number of the cursor and returns the number of rows processed.\n Raises\n ' + ; + PROCEDURE close_cursor (cursor_id INT) + SQL SECURITY INVOKER + COMMENT '\n Description\n When you no longer need a cursor for a session, close the cursor by calling the CLOSE_CURSOR Procedure.\n Raises\n ' + ; +END +routine_name dbms_utility +routine_type PACKAGE +routine_definition AS + FUNCTION format_error_backtrace RETURN VARCHAR(65532) + SQL SECURITY INVOKER + COMMENT '\n Description\n This procedure displays the call stack at the point where an exception was raised, even if the procedure is called from an exception handler in an outer scope.\n Raises\n ' + ; + FUNCTION format_error_stack RETURN VARCHAR(65532) + SQL SECURITY INVOKER + COMMENT '\n Description\n This function formats the current error stack. It can be used in exception handlers to look at the full error stack\n Raises\n ' + ; + FUNCTION get_time RETURN INT + SQL SECURITY INVOKER + COMMENT '\n Description\n This function returns a measure of current time in hundredths of a second\n Raises\n ' + ; +END routine_name pkg1 routine_type PACKAGE routine_definition AS FUNCTION f1() RETURN INT; END +routine_name UTL_I18N +routine_type PACKAGE +routine_definition AS + FUNCTION transliterate(val VARCHAR2(255) CHARACTER SET ANY_CS, name VARCHAR2(255)) RETURN VARCHAR2(255) CHARACTER SET ANY_CS + SQL SECURITY INVOKER + COMMENT '\n Description\n This function performs script transliteration.\n Parameters\n val (VARCHAR2):\n Specifies the data to be converted.\n name (VARCHAR2):\n Specifies the transliteration name string.\n Returns\n The converted string.\n ' + ; + FUNCTION raw_to_char(jc RAW, charset_or_collation VARCHAR(255)) RETURN VARCHAR2 + SQL SECURITY INVOKER + COMMENT '\n Description\n This function converts RAW data from a valid character set to a\n VARCHAR2 string in the database character set.\n Parameters\n jc (RAW):\n Specifies the RAW data to be converted to a VARCHAR2 string\n charset_or_collation (VARCHAR):\n Specifies the character set that the RAW data was derived from.\n Returns\n the VARCHAR2 string equivalent in the database character set of\n the RAW data.\n ' + ; + FUNCTION string_to_raw(jc VARCHAR2, charset_or_collation VARCHAR(255)) RETURN RAW + SQL SECURITY INVOKER + COMMENT '\n Description\n This function converts a VARCHAR2 string to another valid\n character set and returns the result as RAW data.\n Parameters\n jc (VARCHAR2):\n Specifies the VARCHAR2 or NVARCHAR2 string to convert.\n charset_or_collation (VARCHAR):\n Specifies the destination character set.\n Returns\n RAW data representation of the input string in the new character set\n ' + ; +END +routine_name dbms_random +routine_type PACKAGE BODY +routine_definition AS + FUNCTION get_seed_from_session() RETURN INTEGER + AS + v_user_hash INTEGER; + v_time_num INTEGER; + v_process_id INTEGER; + v_seed INTEGER; + v_username VARCHAR(128); + v_i INTEGER; + BEGIN + v_username := USER(); + v_user_hash := 0; + FOR v_i IN 1..LENGTH(v_username) LOOP + v_user_hash := v_user_hash + (ASCII(SUBSTR(v_username, v_i, 1)) * v_i); + END LOOP; + v_time_num := UNIX_TIMESTAMP(); + v_process_id := CONNECTION_ID(); + v_seed := MOD( + (v_user_hash * 31) + + (v_time_num * 17) + + (v_process_id * 13), + 2147483647 -- Max 32-bit signed integer + ); + RETURN v_seed; + END; + PROCEDURE initialize (input INT) + SQL SECURITY INVOKER + COMMENT '\n Description\n Initializes the seed\n Raises\n ' + IS + BEGIN + SET @@rand_seed1 = input * 0x10001 + 55555555; + SET @@rand_seed2 = input * 0x10000001; + END; + PROCEDURE terminate + SQL SECURITY INVOKER + COMMENT '\n Description\n Terminates package\n Raises\n ' + IS + BEGIN + END; + FUNCTION value RETURN DECIMAL(65,38) + SQL SECURITY INVOKER + COMMENT '\n Description\n Gets a random number greater than or equal to 0 and less than 1, with\n 38 digits to the right of the decimal point (38-digit precision)\n Raises\n ' + IS + BEGIN + RETURN CAST(RAND() AS DECIMAL(65, 38)); + END; + FUNCTION random RETURN INT + SQL SECURITY INVOKER + COMMENT '\n Description\n Generates a random number\n Raises\n ' + IS + BEGIN + RETURN CONVERT(RAND() * (POW(2, 31) - 1 + POW(2, 31)) - POW(2, 31), DECIMAL(65, 0)); + END; + PROCEDURE set_seed + SQL SECURITY INVOKER + COMMENT '\n Description\n Terminates package\n Raises\n ' + IS + BEGIN + SET @seed = get_seed_from_session(); + SET @@rand_seed1 = @seed * 0x10001 + 55555555; + SET @@rand_seed2 = @seed * 0x10001; + END; +BEGIN + set_seed; +END +routine_name dbms_sql +routine_type PACKAGE BODY +routine_definition AS + FUNCTION open_cursor RETURN INT + SQL SECURITY INVOKER + COMMENT '\n Description\n This function opens a new cursor.\n Raises\n ' + AS + BEGIN + DECLARE + cursor_id INT; + BEGIN + SET cursor_id = dbms_sql_open_cursor(); + RETURN cursor_id; + END; + END; + PROCEDURE parse (cursor_id INT, input VARCHAR2(65511), language_flag INT) + SQL SECURITY INVOKER + COMMENT '\n Description\n This procedure parses the given statement in the given cursor. All statements are parsed immediately. In addition, DDL statements are run immediately when parsed.\n Raises\n ' + AS + BEGIN + DECLARE + first_word VARCHAR2(64); + second_word VARCHAR2(64); + final_ps VARCHAR2(256); + first_word_id INT; + parse_result INT; + BEGIN + SET first_word = LOWER(SUBSTRING_INDEX(LTRIM(input), ' ', 1)); + SET second_word = SUBSTRING_INDEX(SUBSTRING_INDEX(input, ' ', 2), ' ', -1); + IF first_word IN ('create', 'alter', 'drop', 'insert', 'update', 'delete') OR + (first_word = 'rename' AND second_word IN ('table', 'tables')) THEN + IF first_word IN ('create', 'alter', 'drop') OR + (first_word = 'rename' AND second_word IN ('table', 'tables')) THEN + SET final_ps = CONCAT('CREATE PROCEDURE final_NESTED_PROC() AS BEGIN PREPARE s', cursor_id, ' FROM ''', input, '''; EXECUTE s', cursor_id, '; END'); + CASE first_word + WHEN 'create' THEN + SET first_word_id = 0; + WHEN 'alter' THEN + SET first_word_id = 1; + WHEN 'drop' THEN + SET first_word_id = 2; + WHEN 'rename' THEN + SET first_word_id = 3; + END CASE; + ELSIF first_word IN ('insert', 'update', 'delete') THEN + SET final_ps = CONCAT('CREATE PROCEDURE final_NESTED_PROC() AS BEGIN PREPARE s', cursor_id, ' FROM ''', input, '''; END');CASE first_word + WHEN 'insert' THEN + SET first_word_id = 4; + WHEN 'update' THEN + SET first_word_id = 5; + WHEN 'delete' THEN + SET first_word_id = 6; + END CASE; + END IF; + EXECUTE IMMEDIATE final_ps; + EXECUTE IMMEDIATE 'CALL final_NESTED_PROC()'; + EXECUTE IMMEDIATE 'DROP PROCEDURE final_NESTED_PROC'; + SET parse_result = dbms_sql_parse(cursor_id, first_word_id); + ELSE + SIGNAL SQLSTATE 'HY000' set mysql_errno=3047, message_text='missing or invalid option'; + END IF; + END; + END; + FUNCTION execute (cursor_id INT) RETURN INT + SQL SECURITY INVOKER + COMMENT '\n Description\n This function executes a given cursor. This function accepts the ID number of the cursor and returns the number of rows processed.\n Raises\n ' + AS + BEGIN + DECLARE + element VARCHAR2(32); + BEGIN + SET element = CONCAT('s', cursor_id); + CALL dbmssql_execute (element); + RETURN ROW_COUNT(); + END; + END; + PROCEDURE close_cursor (cursor_id INT) + SQL SECURITY INVOKER + COMMENT '\n Description\n When you no longer need a cursor for a session, close the cursor by calling the CLOSE_CURSOR Procedure.\n Raises\n ' + AS + BEGIN + DECLARE + final_ps VARCHAR2(256); + res INT; + BEGIN + set res = dbms_sql_close_cursor(cursor_id); + SET final_ps = CONCAT('CREATE PROCEDURE NESTED_PROC() AS BEGIN DEALLOCATE PREPARE s', cursor_id, '; END'); + EXECUTE IMMEDIATE final_ps; + EXECUTE IMMEDIATE 'CALL NESTED_PROC()'; + EXECUTE IMMEDIATE 'DROP PROCEDURE NESTED_PROC'; + END; + END; +END +routine_name dbms_utility +routine_type PACKAGE BODY +routine_definition AS + FUNCTION format_error_backtrace RETURN VARCHAR(65532) + SQL SECURITY INVOKER + COMMENT '\n Description\n This procedure displays the call stack at the point where an exception was raised, even if the procedure is called from an exception handler in an outer scope.\n Raises\n ' + IS + BEGIN + RETURN @@backtrace_str; + END; + FUNCTION format_error_stack RETURN VARCHAR(65532) + SQL SECURITY INVOKER + COMMENT '\n Description\n This function formats the current error stack. It can be used in exception handlers to look at the full error stack\n Raises\n ' + AS + BEGIN + RETURN @@errstack_str; + END; + FUNCTION get_time RETURN INT + SQL SECURITY INVOKER + COMMENT '\n Description\n This function returns a measure of current time in hundredths of a second\n Raises\n ' + IS + BEGIN + RETURN UNIX_TIMESTAMP(CURRENT_TIMESTAMP(2)); + END; +END routine_name pkg1 routine_type PACKAGE BODY routine_definition AS @@ -69,6 +654,77 @@ BEGIN SET @a=10; SET @a=f1(); END +routine_name UTL_I18N +routine_type PACKAGE BODY +routine_definition AS + FUNCTION transliterate(val VARCHAR2(255) CHARACTER SET ANY_CS, name VARCHAR2(255)) RETURN VARCHAR2(255) CHARACTER SET ANY_CS + SQL SECURITY INVOKER + COMMENT '\n Description\n This function performs script transliteration.\n Parameters\n val (VARCHAR2):\n Specifies the data to be converted.\n name (VARCHAR2):\n Specifies the transliteration name string.\n Returns\n The converted string.\n ' + AS + BEGIN + RETURN transliterate(val, name); + END; + FUNCTION raw_to_char(jc RAW, charset_or_collation VARCHAR(255)) RETURN VARCHAR2 + SQL SECURITY INVOKER + COMMENT '\n Description\n This function converts RAW data from a valid character set to a\n VARCHAR2 string in the database character set.\n Parameters\n jc (RAW):\n Specifies the RAW data to be converted to a VARCHAR2 string\n charset_or_collation (VARCHAR):\n Specifies the character set that the RAW data was derived from.\n Returns\n the VARCHAR2 string equivalent in the database character set of\n the RAW data.\n ' + IS + BEGIN + DECLARE + dst_charset VARCHAR(65532); + sourced_jc VARCHAR(65532); + targeted_sourced_jc VARCHAR(65532); + unhexed_hexed_data BLOB; + BEGIN + SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME = 'character_set_results' into dst_charset; + CASE charset_or_collation + WHEN 'utf8' THEN + CASE dst_charset + WHEN 'utf8mb3' THEN + BEGIN + SET sourced_jc = CONVERT(jc USING utf8); + SET targeted_sourced_jc = CONVERT(sourced_jc USING utf8mb3); + END; + ELSE + RETURN NULL; + END CASE; + WHEN 'utf8mb3' THEN + CASE dst_charset + WHEN 'utf8mb4' THEN + BEGIN + SET sourced_jc = CONVERT(jc USING utf8mb3); + SET targeted_sourced_jc = CONVERT(sourced_jc USING utf8mb4); + END; + ELSE + RETURN NULL; + END CASE; + ELSE + RETURN NULL; + END CASE; + SET unhexed_hexed_data = UNHEX(HEX(targeted_sourced_jc)); + CASE dst_charset + WHEN 'utf8mb3' THEN + RETURN CONVERT(unhexed_hexed_data USING utf8mb3); + WHEN 'utf8mb4' THEN + RETURN CONVERT(unhexed_hexed_data USING utf8mb4); + END CASE; + RETURN NULL; + END; + END; + FUNCTION string_to_raw(jc VARCHAR2, charset_or_collation VARCHAR(255)) RETURN RAW + SQL SECURITY INVOKER + COMMENT '\n Description\n This function converts a VARCHAR2 string to another valid\n character set and returns the result as RAW data.\n Parameters\n jc (VARCHAR2):\n Specifies the VARCHAR2 or NVARCHAR2 string to convert.\n charset_or_collation (VARCHAR):\n Specifies the destination character set.\n Returns\n RAW data representation of the input string in the new character set\n ' + AS + BEGIN + CASE charset_or_collation + WHEN 'utf8' THEN + RETURN CAST(CONVERT(jc USING utf8mb4) AS BINARY); + WHEN 'ucs2' THEN + RETURN CAST(CONVERT(jc USING ucs2) AS BINARY); + ELSE + RETURN NULL; + END CASE; + END; +END DROP PACKAGE pkg1; # # End of 10.5 tests diff --git a/mysql-test/suite/compat/oracle/r/sp-package-mysqldump.result b/mysql-test/suite/compat/oracle/r/sp-package-mysqldump.result index 72cd4bdce609a..a2165b89ad56b 100644 --- a/mysql-test/suite/compat/oracle/r/sp-package-mysqldump.result +++ b/mysql-test/suite/compat/oracle/r/sp-package-mysqldump.result @@ -189,6 +189,50 @@ DROP PACKAGE pkg1; DROP PACKAGE pkg2; DROP PROCEDURE p1; SHOW PACKAGE STATUS; +Db sys +Name dbms_random +Type PACKAGE +Definer root@localhost +Modified 0000-00-00 00:00:00 +Created 0000-00-00 00:00:00 +Security_type INVOKER +Comment Collection of random routines +character_set_client utf8mb3 +collation_connection utf8mb3_general_ci +Database Collation utf8mb3_general_ci +Db sys +Name dbms_sql +Type PACKAGE +Definer root@localhost +Modified 0000-00-00 00:00:00 +Created 0000-00-00 00:00:00 +Security_type INVOKER +Comment Collection of sql routines +character_set_client utf8mb3 +collation_connection utf8mb3_general_ci +Database Collation utf8mb3_general_ci +Db sys +Name dbms_utility +Type PACKAGE +Definer root@localhost +Modified 0000-00-00 00:00:00 +Created 0000-00-00 00:00:00 +Security_type INVOKER +Comment Collection of utility routines +character_set_client utf8mb3 +collation_connection utf8mb3_general_ci +Database Collation utf8mb3_general_ci +Db sys +Name UTL_I18N +Type PACKAGE +Definer root@localhost +Modified 0000-00-00 00:00:00 +Created 0000-00-00 00:00:00 +Security_type INVOKER +Comment Collection of routines to manipulate RAW data +character_set_client utf8mb3 +collation_connection utf8mb3_general_ci +Database Collation utf8mb3_general_ci Db test Name pkg1 Type PACKAGE @@ -212,6 +256,50 @@ character_set_client latin1 collation_connection latin1_swedish_ci Database Collation utf8mb4_uca1400_ai_ci SHOW PACKAGE BODY STATUS; +Db sys +Name dbms_random +Type PACKAGE BODY +Definer root@localhost +Modified 0000-00-00 00:00:00 +Created 0000-00-00 00:00:00 +Security_type INVOKER +Comment +character_set_client utf8mb3 +collation_connection utf8mb3_general_ci +Database Collation utf8mb3_general_ci +Db sys +Name dbms_sql +Type PACKAGE BODY +Definer root@localhost +Modified 0000-00-00 00:00:00 +Created 0000-00-00 00:00:00 +Security_type INVOKER +Comment +character_set_client utf8mb3 +collation_connection utf8mb3_general_ci +Database Collation utf8mb3_general_ci +Db sys +Name dbms_utility +Type PACKAGE BODY +Definer root@localhost +Modified 0000-00-00 00:00:00 +Created 0000-00-00 00:00:00 +Security_type INVOKER +Comment +character_set_client utf8mb3 +collation_connection utf8mb3_general_ci +Database Collation utf8mb3_general_ci +Db sys +Name UTL_I18N +Type PACKAGE BODY +Definer root@localhost +Modified 0000-00-00 00:00:00 +Created 0000-00-00 00:00:00 +Security_type INVOKER +Comment +character_set_client utf8mb3 +collation_connection utf8mb3_general_ci +Database Collation utf8mb3_general_ci Db test Name pkg1 Type PACKAGE BODY diff --git a/mysql-test/suite/compat/oracle/r/sp-package.result b/mysql-test/suite/compat/oracle/r/sp-package.result index 0224597b29cca..8bd9b38b5f8b7 100644 --- a/mysql-test/suite/compat/oracle/r/sp-package.result +++ b/mysql-test/suite/compat/oracle/r/sp-package.result @@ -712,6 +712,50 @@ COLLATION_CONNECTION latin1_swedish_ci DATABASE_COLLATION utf8mb4_uca1400_ai_ci SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA='test' AND ROUTINE_NAME LIKE 'test2.%'; SHOW PACKAGE STATUS; +Db sys +Name dbms_random +Type PACKAGE +Definer root@localhost +Modified 0000-00-00 00:00:00 +Created 0000-00-00 00:00:00 +Security_type INVOKER +Comment Collection of random routines +character_set_client utf8mb3 +collation_connection utf8mb3_general_ci +Database Collation utf8mb3_general_ci +Db sys +Name dbms_sql +Type PACKAGE +Definer root@localhost +Modified 0000-00-00 00:00:00 +Created 0000-00-00 00:00:00 +Security_type INVOKER +Comment Collection of sql routines +character_set_client utf8mb3 +collation_connection utf8mb3_general_ci +Database Collation utf8mb3_general_ci +Db sys +Name dbms_utility +Type PACKAGE +Definer root@localhost +Modified 0000-00-00 00:00:00 +Created 0000-00-00 00:00:00 +Security_type INVOKER +Comment Collection of utility routines +character_set_client utf8mb3 +collation_connection utf8mb3_general_ci +Database Collation utf8mb3_general_ci +Db sys +Name UTL_I18N +Type PACKAGE +Definer root@localhost +Modified 0000-00-00 00:00:00 +Created 0000-00-00 00:00:00 +Security_type INVOKER +Comment Collection of routines to manipulate RAW data +character_set_client utf8mb3 +collation_connection utf8mb3_general_ci +Database Collation utf8mb3_general_ci Db test Name test2 Type PACKAGE @@ -724,6 +768,50 @@ character_set_client latin1 collation_connection latin1_swedish_ci Database Collation utf8mb4_uca1400_ai_ci SHOW PACKAGE BODY STATUS; +Db sys +Name dbms_random +Type PACKAGE BODY +Definer root@localhost +Modified 0000-00-00 00:00:00 +Created 0000-00-00 00:00:00 +Security_type INVOKER +Comment +character_set_client utf8mb3 +collation_connection utf8mb3_general_ci +Database Collation utf8mb3_general_ci +Db sys +Name dbms_sql +Type PACKAGE BODY +Definer root@localhost +Modified 0000-00-00 00:00:00 +Created 0000-00-00 00:00:00 +Security_type INVOKER +Comment +character_set_client utf8mb3 +collation_connection utf8mb3_general_ci +Database Collation utf8mb3_general_ci +Db sys +Name dbms_utility +Type PACKAGE BODY +Definer root@localhost +Modified 0000-00-00 00:00:00 +Created 0000-00-00 00:00:00 +Security_type INVOKER +Comment +character_set_client utf8mb3 +collation_connection utf8mb3_general_ci +Database Collation utf8mb3_general_ci +Db sys +Name UTL_I18N +Type PACKAGE BODY +Definer root@localhost +Modified 0000-00-00 00:00:00 +Created 0000-00-00 00:00:00 +Security_type INVOKER +Comment +character_set_client utf8mb3 +collation_connection utf8mb3_general_ci +Database Collation utf8mb3_general_ci Db test Name test2 Type PACKAGE BODY @@ -805,6 +893,50 @@ PROCEDURE p1 AS BEGIN SELECT f1(); END; END; $$ SHOW PACKAGE STATUS; +Db sys +Name dbms_random +Type PACKAGE +Definer root@localhost +Modified 0000-00-00 00:00:00 +Created 0000-00-00 00:00:00 +Security_type INVOKER +Comment Collection of random routines +character_set_client utf8mb3 +collation_connection utf8mb3_general_ci +Database Collation utf8mb3_general_ci +Db sys +Name dbms_sql +Type PACKAGE +Definer root@localhost +Modified 0000-00-00 00:00:00 +Created 0000-00-00 00:00:00 +Security_type INVOKER +Comment Collection of sql routines +character_set_client utf8mb3 +collation_connection utf8mb3_general_ci +Database Collation utf8mb3_general_ci +Db sys +Name dbms_utility +Type PACKAGE +Definer root@localhost +Modified 0000-00-00 00:00:00 +Created 0000-00-00 00:00:00 +Security_type INVOKER +Comment Collection of utility routines +character_set_client utf8mb3 +collation_connection utf8mb3_general_ci +Database Collation utf8mb3_general_ci +Db sys +Name UTL_I18N +Type PACKAGE +Definer root@localhost +Modified 0000-00-00 00:00:00 +Created 0000-00-00 00:00:00 +Security_type INVOKER +Comment Collection of routines to manipulate RAW data +character_set_client utf8mb3 +collation_connection utf8mb3_general_ci +Database Collation utf8mb3_general_ci Db test2 Name test2 Type PACKAGE @@ -817,6 +949,50 @@ character_set_client latin1 collation_connection latin1_swedish_ci Database Collation utf8mb4_uca1400_ai_ci SHOW PACKAGE BODY STATUS; +Db sys +Name dbms_random +Type PACKAGE BODY +Definer root@localhost +Modified 0000-00-00 00:00:00 +Created 0000-00-00 00:00:00 +Security_type INVOKER +Comment +character_set_client utf8mb3 +collation_connection utf8mb3_general_ci +Database Collation utf8mb3_general_ci +Db sys +Name dbms_sql +Type PACKAGE BODY +Definer root@localhost +Modified 0000-00-00 00:00:00 +Created 0000-00-00 00:00:00 +Security_type INVOKER +Comment +character_set_client utf8mb3 +collation_connection utf8mb3_general_ci +Database Collation utf8mb3_general_ci +Db sys +Name dbms_utility +Type PACKAGE BODY +Definer root@localhost +Modified 0000-00-00 00:00:00 +Created 0000-00-00 00:00:00 +Security_type INVOKER +Comment +character_set_client utf8mb3 +collation_connection utf8mb3_general_ci +Database Collation utf8mb3_general_ci +Db sys +Name UTL_I18N +Type PACKAGE BODY +Definer root@localhost +Modified 0000-00-00 00:00:00 +Created 0000-00-00 00:00:00 +Security_type INVOKER +Comment +character_set_client utf8mb3 +collation_connection utf8mb3_general_ci +Database Collation utf8mb3_general_ci Db test2 Name test2 Type PACKAGE BODY diff --git a/mysql-test/suite/galera/r/MDEV-37056.result b/mysql-test/suite/galera/r/MDEV-37056.result new file mode 100644 index 0000000000000..6870e2dbb3e4e --- /dev/null +++ b/mysql-test/suite/galera/r/MDEV-37056.result @@ -0,0 +1,15 @@ +connection node_2; +connection node_1; +connection node_1; +SET SESSION wsrep_on=OFF; +SET default_storage_engine=MYISAM; +CREATE SEQUENCE t; +SET SESSION wsrep_on=ON; +CREATE INDEX idx ON t (a); +ERROR HY000: Sequence 'test.t' table structure is invalid (Sequence tables cannot have any keys) +DROP SEQUENCE t; +SET default_storage_engine='MYISAM'; +CREATE SEQUENCE t INCREMENT BY 0 CACHE=0 ENGINE=InnoDB; +CREATE INDEX c ON t (c); +ERROR HY000: Sequence 'test.t' table structure is invalid (Sequence tables cannot have any keys) +DROP SEQUENCE t; diff --git a/mysql-test/suite/galera/r/MDEV-37857.result b/mysql-test/suite/galera/r/MDEV-37857.result new file mode 100644 index 0000000000000..243a4b4b72793 --- /dev/null +++ b/mysql-test/suite/galera/r/MDEV-37857.result @@ -0,0 +1,44 @@ +connection node_2; +connection node_1; +drop table if exists t1; +drop view if exists t1; +connection node_2; +SELECT @@character_set_server, @@collation_server; +@@character_set_server @@collation_server +latin1 latin1_swedish_ci +SELECT @@character_set_client, @@collation_connection; +@@character_set_client @@collation_connection +latin1 latin1_swedish_ci +connection node_1; +SET NAMES latin1 COLLATE latin1_bin; +SELECT @@character_set_server, @@collation_server; +@@character_set_server @@collation_server +latin1 latin1_swedish_ci +SELECT @@character_set_client, @@collation_connection; +@@character_set_client @@collation_connection +latin1 latin1_bin +create table t1 (a int); +insert into t1 values (1); +create view v1 as select a from t1; +SHOW CREATE VIEW v1; +View Create View character_set_client collation_connection +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`a` AS `a` from `t1` latin1 latin1_bin +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +connection node_2; +SHOW CREATE VIEW v1; +View Create View character_set_client collation_connection +v1 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`a` AS `a` from `t1` latin1 latin1_bin +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE `t1` ( + `a` int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci +connection node_1; +DROP VIEW v1; +DROP TABLE t1; +disconnect node_2; +disconnect node_1; diff --git a/mysql-test/suite/galera/t/MDEV-37056.test b/mysql-test/suite/galera/t/MDEV-37056.test new file mode 100644 index 0000000000000..d442c6d99cfc1 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-37056.test @@ -0,0 +1,18 @@ +--source include/galera_cluster.inc + +--connection node_1 +SET SESSION wsrep_on=OFF; +SET default_storage_engine=MYISAM; +CREATE SEQUENCE t; +SET SESSION wsrep_on=ON; +--error ER_SEQUENCE_INVALID_TABLE_STRUCTURE +CREATE INDEX idx ON t (a); +DROP SEQUENCE t; + +SET default_storage_engine='MYISAM'; +CREATE SEQUENCE t INCREMENT BY 0 CACHE=0 ENGINE=InnoDB; +--error ER_SEQUENCE_INVALID_TABLE_STRUCTURE +CREATE INDEX c ON t (c); + +# cleanup +DROP SEQUENCE t; \ No newline at end of file diff --git a/mysql-test/suite/galera/t/MDEV-37857.test b/mysql-test/suite/galera/t/MDEV-37857.test new file mode 100644 index 0000000000000..8a950d39bcf2b --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-37857.test @@ -0,0 +1,29 @@ +--source include/galera_cluster.inc + +--disable_warnings +drop table if exists t1; +drop view if exists t1; +--enable_warnings + +--connection node_2 +SELECT @@character_set_server, @@collation_server; +SELECT @@character_set_client, @@collation_connection; +--connection node_1 +SET NAMES latin1 COLLATE latin1_bin; +SELECT @@character_set_server, @@collation_server; +SELECT @@character_set_client, @@collation_connection; +create table t1 (a int); +insert into t1 values (1); +create view v1 as select a from t1; +SHOW CREATE VIEW v1; +SHOW CREATE TABLE t1; + +--connection node_2 +SHOW CREATE VIEW v1; +SHOW CREATE TABLE t1; + +--connection node_1 +DROP VIEW v1; +DROP TABLE t1; + +--source include/galera_end.inc diff --git a/mysql-test/suite/innodb/r/innodb_bug12400341.result b/mysql-test/suite/innodb/r/innodb_bug12400341.result deleted file mode 100644 index f4114595819e2..0000000000000 --- a/mysql-test/suite/innodb/r/innodb_bug12400341.result +++ /dev/null @@ -1,18 +0,0 @@ -call mtr.add_suppression("\\[Warning\\] InnoDB: Cannot find a free slot for an undo log. Do you have too"); -drop database if exists mysqltest; -create database mysqltest; -CREATE TABLE mysqltest.transtable (id int unsigned NOT NULL PRIMARY KEY, val int DEFAULT 0) ENGINE=InnoDB; -select count(*) from information_schema.processlist where command != 'Daemon'; -count(*) -33 -connection default; -CREATE TABLE mysqltest.testtable (id int unsigned not null primary key) ENGINE=InnoDB; -ERROR HY000: Can't create table `mysqltest`.`testtable` (errno: 177 "Too many active concurrent transactions") -select count(*) from information_schema.processlist where command != 'Daemon'; -count(*) -33 -connection default; -select count(*) from information_schema.processlist where command != 'Daemon'; -count(*) -33 -drop database mysqltest; diff --git a/mysql-test/suite/innodb/t/innodb_bug12400341.test b/mysql-test/suite/innodb/t/innodb_bug12400341.test deleted file mode 100644 index 13eadc70beec9..0000000000000 --- a/mysql-test/suite/innodb/t/innodb_bug12400341.test +++ /dev/null @@ -1,102 +0,0 @@ -# Test for bug #12400341: INNODB CAN LEAVE ORPHAN IBD FILES AROUND - --- source include/have_debug.inc --- source include/have_innodb.inc --- source include/have_innodb_16k.inc - -# Don't test under valgrind, undo slots of the previous test might exist still -# and cause unstable result. ---source include/not_valgrind.inc -# undo slots of the previous test might exist still ---source include/not_windows.inc - -call mtr.add_suppression("\\[Warning\\] InnoDB: Cannot find a free slot for an undo log. Do you have too"); - ---disable_query_log -set @old_innodb_trx_rseg_n_slots_debug = @@innodb_trx_rseg_n_slots_debug; -set global innodb_trx_rseg_n_slots_debug = 32; ---enable_query_log - ---disable_warnings -drop database if exists mysqltest; ---enable_warnings - -create database mysqltest; -CREATE TABLE mysqltest.transtable (id int unsigned NOT NULL PRIMARY KEY, val int DEFAULT 0) ENGINE=InnoDB; - ---disable_query_log -# -# Insert in 1 transaction which needs over 1 page undo record to avoid the insert_undo cached, -# because the cached insert_undo can be reused at "CREATE TABLE" statement later. -# -START TRANSACTION; -let $c = 1024; -while ($c) -{ - eval INSERT INTO mysqltest.transtable (id) VALUES ($c); - dec $c; -} -COMMIT; - -let $c = 32; -while ($c) -{ - # if failed at here, it might be shortage of file descriptors limit. - connect (con$c,localhost,root,,); - dec $c; -} ---enable_query_log - -select count(*) from information_schema.processlist where command != 'Daemon'; - -# -# fill the all undo slots -# ---disable_query_log -let $c = 32; -while ($c) -{ - connection con$c; - START TRANSACTION; - eval UPDATE mysqltest.transtable SET val = 1 WHERE id = 33 - $c; - dec $c; -} ---enable_query_log - -connection default; - ---error ER_CANT_CREATE_TABLE -CREATE TABLE mysqltest.testtable (id int unsigned not null primary key) ENGINE=InnoDB; - -select count(*) from information_schema.processlist where command != 'Daemon'; - ---disable_query_log -let $c = 32; -while ($c) -{ - connection con$c; - ROLLBACK; - dec $c; -} ---enable_query_log - -connection default; -select count(*) from information_schema.processlist where command != 'Daemon'; - ---disable_query_log -let $c = 32; -while ($c) -{ - disconnect con$c; - dec $c; -} ---enable_query_log - -# -# If the isolated .ibd file remained, the drop database should fail. -# -drop database mysqltest; - ---disable_query_log -set global innodb_trx_rseg_n_slots_debug = @old_innodb_trx_rseg_n_slots_debug; ---enable_query_log diff --git a/mysql-test/suite/innodb_gis/r/rtree_split.result b/mysql-test/suite/innodb_gis/r/rtree_split.result index 74b44e8cbc169..4efefdcd66af6 100644 --- a/mysql-test/suite/innodb_gis/r/rtree_split.result +++ b/mysql-test/suite/innodb_gis/r/rtree_split.result @@ -72,4 +72,108 @@ INSERT INTO t1 SELECT POINTFROMTEXT ('POINT(0 0)') FROM seq_1_to_6; ROLLBACK; SET GLOBAL innodb_limit_optimistic_insert_debug=@save_limit; DROP TABLE t1; +# +# MDEV-27675 Incorrect r-tree split after group +# assignment causes page overflow +# +CREATE TABLE t1 (f1 INT, f2 INT, f3 VARCHAR(2500), +f4 MULTIPOLYGON NOT NULL, +PRIMARY KEY (f1,f2,f3), SPATIAL(f4)) ENGINE=InnoDB; +INSERT INTO t1 VALUES +(1,1,'id',MULTIPOLYGONFromText('MULTIPOLYGON(((0.12 0.53,0.23 0.92,0.12 0.53)))')), +(2,2,REPEAT('s',853),MULTIPOLYGONFromText('MULTIPOLYGON(((0.09 0.71,0.92 0.49,0.09 0.71)))')), +(3,3,'',MULTIPOLYGONFromText('MULTIPOLYGON(((0.62 0.71,0.62 0.71)))')), +(4,4,'j',MULTIPOLYGONFromText('MULTIPOLYGON(((0.00 0.06,0.40 0.39,0.61 0.20,0.69 0.91,0.13 0.45,0.71 0.49,0.81 0.52,0.08 0.02,0.00 0.06)))')), +(5,5,'b',MULTIPOLYGONFromText('MULTIPOLYGON(((0.05 0.20,0.45 0.96,0.59 0.46,0.26 0.12,0.45 0.68,0.41 0.10,0.05 0.20)))')), +(6,6,'j',MULTIPOLYGONFromText('MULTIPOLYGON(((0.30 0.09,0.42 0.27,0.96 0.83,0.81 0.89,0.42 0.16,0.89 0.64,0.30 0.09)))')), +(7,7,'f',MULTIPOLYGONFromText('MULTIPOLYGON(((0.62 0.42,0.12 0.70,0.07 0.24,0.10 0.07,0.92 0.29,0.20 0.52,0.62 0.42)))')), +(8,8,'a',MULTIPOLYGONFromText('MULTIPOLYGON(((0.74 0.96,0.80 0.93,0.61 0.40,0.23 0.49,0.79 0.96,0.67 0.30,0.67 0.25,0.74 0.96)))')), +(9,9,'j',MULTIPOLYGONFromText('MULTIPOLYGON(((0.18 0.56,0.03 0.48,0.89 0.30,0.79 0.85,0.40 0.92,0.47 0.34,0.38 0.48,0.18 0.56)))')), +(10,10,'ko',MULTIPOLYGONFromText('MULTIPOLYGON(((0.60 0.23,0.03 0.43,0.33 0.94,0.20 0.37,0.60 0.23)))')), +(11,11,'o',MULTIPOLYGONFromText('MULTIPOLYGON(((0.94 0.33,0.16 0.47,0.94 0.33)))')), +(12,12,'bs',MULTIPOLYGONFromText('MULTIPOLYGON(((0.78 0.81,0.71 0.29,0.03 0.85,0.54 0.16,0.23 0.20,0.86 0.77,0.41 0.96,0.85 0.67,0.78 0.81)))')), +(13,13,'z',MULTIPOLYGONFromText('MULTIPOLYGON(((0.70 0.92,0.61 0.64,0.05 0.75,0.60 1.00,0.47 0.14,0.70 0.92)))')), +(14,14,'',MULTIPOLYGONFromText('MULTIPOLYGON(((0.03 0.78,0.83 0.08,0.18 0.49,0.02 0.88,0.62 0.46,0.25 0.53,0.03 0.78)))')), +(15,15,'oaz',MULTIPOLYGONFromText('MULTIPOLYGON(((0.12 0.22,0.73 0.35,0.08 0.39,0.23 0.31,0.84 0.19,0.46 0.77,0.63 0.69,0.12 0.22)))')), +(16,16,'a',MULTIPOLYGONFromText('MULTIPOLYGON(((0.50 0.49,0.48 0.69,0.25 0.87,0.85 0.62,0.96 0.28,0.07 0.70,0.45 0.79,0.87 0.36,0.50 0.49)))')), +(17,17,'cj',MULTIPOLYGONFromText('MULTIPOLYGON(((0.72 0.93,0.03 0.94,0.77 0.06,0.29 0.76,0.82 0.68,0.16 0.59,0.15 0.73,0.72 0.93)))')), +(18,18,REPEAT('r',149),MULTIPOLYGONFromText('MULTIPOLYGON(((0.02 0.67,0.05 0.90,0.68 0.02,0.02 0.67)))')), +(19,19,'ihb',MULTIPOLYGONFromText('MULTIPOLYGON(((0.61 0.40,0.77 0.06,0.61 0.40)),((0.43 0.52,0.77 0.27,0.31 0.49,0.43 0.52)))')), +(20,20,'h',MULTIPOLYGONFromText('MULTIPOLYGON(((0.37 0.98,0.88 0.84,0.18 0.47,0.15 0.77,0.82 0.92,0.66 0.55,0.60 0.02,0.17 0.09,0.37 0.98)))')), +(21,21,'i',MULTIPOLYGONFromText('MULTIPOLYGON(((0.89 0.55,0.85 0.85,0.68 0.24,0.20 0.42,0.67 0.36,0.35 0.25,0.48 0.20,0.89 0.55)))')), +(22,22,'q',MULTIPOLYGONFromText('MULTIPOLYGON(((0.67 0.40,0.63 0.18,0.80 0.66,0.65 0.47,0.66 0.56,0.64 0.97,0.00 0.92,0.66 0.18,0.67 0.40)))')), +(23,23,'kh',MULTIPOLYGONFromText('MULTIPOLYGON(((0.89 0.31,0.33 0.68,0.75 0.35,0.40 0.57,0.94 0.91,0.88 0.23,0.89 0.31)))')), +(24,24,'hbtgc',MULTIPOLYGONFromText('MULTIPOLYGON(((0.99 0.12,0.73 0.75,0.46 0.85,0.55 0.92,0.12 0.44,0.22 0.13,0.11 0.61,0.99 0.12)))')), +(25,25,REPEAT('t',71),MULTIPOLYGONFromText('MULTIPOLYGON(((0.72 0.06,0.31 0.98,0.95 0.02,0.84 0.77,0.46 0.09,0.63 0.92,0.35 0.90,0.72 0.06)))')), +(26,26,'g',MULTIPOLYGONFromText('MULTIPOLYGON(((0.18 0.27,0.28 0.15,0.18 0.27)),((0.22 0.55,0.22 0.55)),((0.28 0.70,0.28 0.70)))')), +(27,27,'c',MULTIPOLYGONFromText('MULTIPOLYGON(((0.72 0.28,0.62 0.71,0.04 1.00,0.12 0.57,0.72 0.28)))')), +(28,28,REPEAT('q',885),MULTIPOLYGONFromText('MULTIPOLYGON(((0.70 0.04,0.62 0.29,0.42 0.82,0.90 0.87,0.79 0.69,0.59 0.99,0.24 0.24,0.69 0.96,0.70 0.04)))')), +(29,29,'oy',MULTIPOLYGONFromText('MULTIPOLYGON(((0.23 0.87,0.51 0.65,0.70 0.97,0.44 0.14,0.25 0.83,0.23 0.87)))')), +(30,30,REPEAT('k',1684),MULTIPOLYGONFromText('MULTIPOLYGON(((0.99 0.78,0.78 0.99,0.76 0.51,0.25 0.31,0.13 0.86,0.16 0.11,0.45 0.94,0.23 0.98,0.99 0.78)))')), +(31,31,'ylsmiix',MULTIPOLYGONFromText('MULTIPOLYGON(((0.85 0.35,0.03 0.75,0.18 0.31,0.84 0.36,0.92 0.72,0.52 0.93,0.65 0.10,0.55 0.80,0.85 0.35)))')), +(32,32,'ojouw',MULTIPOLYGONFromText('MULTIPOLYGON(((0.72 0.00,0.83 0.45,0.32 0.62,0.36 0.40,0.19 0.95,0.50 0.38,0.30 0.76,0.72 0.00)))')), +(33,33,'ou',MULTIPOLYGONFromText('MULTIPOLYGON(((0.98 0.02,0.01 0.23,0.27 0.11,0.98 0.02)),((0.44 0.54,0.44 0.54)),((0.86 0.97,0.86 0.97)))')), +(34,34,'u',MULTIPOLYGONFromText('MULTIPOLYGON(((0.13 0.07,0.29 0.09,0.53 0.79,0.85 0.66,0.64 0.17,0.22 0.18,0.35 0.39,0.30 0.28,0.13 0.07)))')), +(35,35,'sax',MULTIPOLYGONFromText('MULTIPOLYGON(((0.26 0.03,0.24 0.93,0.15 0.48,0.26 0.03)),((0.73 0.46,0.35 0.63,0.73 0.46)))')), +(36,36,'xmet',MULTIPOLYGONFromText('MULTIPOLYGON(((0.23 0.35,0.35 0.82,0.23 0.35)),((0.29 0.61,0.82 0.54,0.29 0.61)))')), +(37,37,REPEAT('e',276),MULTIPOLYGONFromText('MULTIPOLYGON(((0.65 0.67,0.65 0.67)))')), +(38,38,'ty',MULTIPOLYGONFromText('MULTIPOLYGON(((0.43 0.44,0.64 0.76,0.92 0.59,0.73 0.23,0.43 0.44)))')), +(39,39,'yq',MULTIPOLYGONFromText('MULTIPOLYGON(((0.84 0.27,0.19 0.67,0.84 0.27)),((0.55 0.13,0.39 0.64,0.21 0.70,0.18 0.45,0.55 0.13)))')), +(40,40,'hcsv',MULTIPOLYGONFromText('MULTIPOLYGON(((0.61 0.79,0.83 0.16,0.63 0.80,0.78 0.28,0.88 0.66,0.61 0.79)))')), +(41,41,'csvhlr',MULTIPOLYGONFromText('MULTIPOLYGON(((0.82 0.24,0.31 0.52,0.61 0.67,0.99 0.90,0.05 0.73,0.52 0.18,0.71 0.87,0.82 0.24)))')), +(42,42,'b',MULTIPOLYGONFromText('MULTIPOLYGON(((0.09 0.21,0.37 0.57,0.81 0.75,0.61 0.16,0.48 0.17,0.29 0.28,0.72 0.46,0.09 0.21)))')), +(43,43,'wd',MULTIPOLYGONFromText('MULTIPOLYGON(((0.06 0.25,0.52 0.23,0.02 0.05,0.06 0.25)),((0.70 0.52,0.44 0.46,0.95 0.47,0.70 0.52)))')), +(44,44,'dg',MULTIPOLYGONFromText('MULTIPOLYGON(((0.81 0.28,0.19 0.17,0.81 0.28)))')), +(45,45,'qtqkyyhkayeoopxmexd',MULTIPOLYGONFromText('MULTIPOLYGON(((0.80 0.66,0.81 0.12,0.83 0.31,0.52 0.29,0.08 0.04,0.80 0.66)))')), +(46,46,'tqk',MULTIPOLYGONFromText('MULTIPOLYGON(((0.95 0.08,0.95 0.08)),((0.09 0.31,0.09 0.31)),((0.38 0.75,0.30 0.04,0.38 0.75)))')), +(47,47,REPEAT('q',925),MULTIPOLYGONFromText('MULTIPOLYGON(((0.56 0.73,0.87 0.11,0.37 0.86,0.48 0.05,0.82 0.55,0.25 0.06,0.19 0.85,0.10 0.75,0.56 0.73)))')), +(48,48,'yhk',MULTIPOLYGONFromText('MULTIPOLYGON(((0.06 0.67,0.41 0.51,0.03 0.83,0.40 0.20,0.16 0.87,0.16 0.07,0.29 0.52,0.06 0.67)))')), +(49,49,'k',MULTIPOLYGONFromText('MULTIPOLYGON(((0.16 0.14,0.16 0.14)),((0.97 0.69,0.45 0.32,0.45 0.38,0.97 0.69)))')), +(50,50,'b',MULTIPOLYGONFromText('MULTIPOLYGON(((0.70 0.00,0.70 0.00)),((0.88 0.53,0.90 0.16,0.88 0.53)))')), +(51,51,'',MULTIPOLYGONFromText('MULTIPOLYGON(((0.48 0.06,0.45 0.05,0.03 0.12,0.27 0.80,0.22 0.75,0.53 0.55,0.48 0.06)))')), +(52,52,'o',MULTIPOLYGONFromText('MULTIPOLYGON(((0.32 0.76,0.17 0.43,0.32 0.76)),((0.40 0.79,0.40 0.79)),((0.42 0.34,0.42 0.34)))')), +(53,53,'pxme',MULTIPOLYGONFromText('MULTIPOLYGON(((0.44 0.08,0.02 0.74,0.26 0.21,0.75 0.42,0.91 0.32,0.24 0.65,0.67 0.50,0.44 0.08)))')), +(54,54,'m',MULTIPOLYGONFromText('MULTIPOLYGON(((0.86 0.13,0.21 0.34,0.00 0.87,0.76 0.23,0.69 0.73,0.13 0.63,0.86 0.13)))')), +(55,55,'mex',MULTIPOLYGONFromText('MULTIPOLYGON(((0.84 0.11,0.63 0.13,0.51 0.81,0.58 0.25,0.53 0.29,0.53 0.42,0.84 0.11)))')), +(56,56,REPEAT('e',504),MULTIPOLYGONFromText('MULTIPOLYGON(((0.27 0.84,0.65 0.26,0.75 0.44,0.29 0.52,0.27 0.84)))')), +(57,57,'i',MULTIPOLYGONFromText('MULTIPOLYGON(((0.71 0.84,0.77 0.27,0.45 0.71,0.91 0.01,0.84 0.35,0.71 0.84)))')), +(58,58,'b',MULTIPOLYGONFromText('MULTIPOLYGON(((0.12 0.36,0.02 0.47,0.57 0.76,0.15 0.54,0.12 0.36)))')), +(59,59,'',MULTIPOLYGONFromText('MULTIPOLYGON(((0.77 0.80,0.25 0.69,0.34 0.68,0.77 0.80)))')), +(60,60,'',MULTIPOLYGONFromText('MULTIPOLYGON(((0.57 0.30,0.58 0.81,0.57 0.30)))')), +(61,61,'nh',MULTIPOLYGONFromText('MULTIPOLYGON(((0.42 0.99,0.42 0.99)))')), +(62,62,'hwi',MULTIPOLYGONFromText('MULTIPOLYGON(((0.40 0.50,0.97 0.34,0.60 0.75,0.26 0.74,0.40 0.50)))')), +(63,63,'id',MULTIPOLYGONFromText('MULTIPOLYGON(((0.30 0.67,0.13 0.43,0.16 0.64,0.04 0.72,0.95 0.87,0.83 0.24,0.17 0.82,0.30 0.67)))')), +(64,64,'toy',MULTIPOLYGONFromText('MULTIPOLYGON(((0.68 0.75,0.92 0.90,0.68 0.75)),((0.58 0.03,0.41 0.09,0.62 0.05,0.58 0.03)))')), +(65,65,'yhawdptl',MULTIPOLYGONFromText('MULTIPOLYGON(((0.95 0.50,0.61 0.35,0.78 0.07,0.67 0.43,0.50 0.70,0.48 0.98,0.95 0.50)))')), +(66,66,'gs',MULTIPOLYGONFromText('MULTIPOLYGON(((0.59 0.06,0.12 0.94,0.05 0.90,0.99 0.22,0.13 0.55,0.59 0.06)))')), +(67,67,'bplb',MULTIPOLYGONFromText('MULTIPOLYGON(((0.33 0.90,0.54 0.11,0.05 0.04,0.59 0.66,0.33 0.90)))')), +(68,68,'b',MULTIPOLYGONFromText('MULTIPOLYGON(((0.50 0.52,0.23 0.54,0.80 0.14,0.88 0.70,0.13 0.67,0.68 0.66,0.50 0.52)))')), +(69,69,'p',MULTIPOLYGONFromText('MULTIPOLYGON(((0.07 0.99,0.11 0.79,0.07 0.99)),((0.50 0.22,0.77 0.58,0.50 0.22)))')), +(70,70,'l',MULTIPOLYGONFromText('MULTIPOLYGON(((0.21 0.75,0.21 0.75)))')), +(71,71,'rwkqhip',MULTIPOLYGONFromText('MULTIPOLYGON(((0.99 0.89,0.25 0.77,0.99 0.89)))')), +(72,72,'n',MULTIPOLYGONFromText('MULTIPOLYGON(((0.01 0.10,0.01 0.20,0.01 0.10)),((0.83 0.75,0.29 0.21,0.83 0.75)))')), +(73,73,'q',MULTIPOLYGONFromText('MULTIPOLYGON(((0.12 0.03,0.51 0.05,0.27 0.77,0.74 0.06,0.12 0.03)))')), +(74,74,'hipd',MULTIPOLYGONFromText('MULTIPOLYGON(((0.89 0.94,0.54 0.92,0.37 0.71,0.89 0.94)))')), +(75,75,'ipdec',MULTIPOLYGONFromText('MULTIPOLYGON(((0.50 0.48,0.07 0.31,0.19 0.23,0.51 0.74,0.50 0.48)))')), +(76,76,'pde',MULTIPOLYGONFromText('MULTIPOLYGON(((0.79 0.42,0.61 0.98,0.13 0.85,0.52 0.16,0.79 0.42)))')), +(77,77,REPEAT('e',1432),MULTIPOLYGONFromText('MULTIPOLYGON(((0.78 0.29,0.42 0.20,0.88 0.86,0.99 0.81,0.78 0.29)))')), +(78,78,'cyhr',MULTIPOLYGONFromText('MULTIPOLYGON(((0.61 0.16,0.62 0.19,0.61 0.16)),((0.62 0.94,0.65 0.53,0.15 0.25,0.71 0.41,0.62 0.94)),((0.67 0.63,0.86 0.60,0.67 0.63)))')), +(79,79,'n',MULTIPOLYGONFromText('MULTIPOLYGON(((0.39 0.89,0.25 0.77,0.22 0.21,0.51 0.19,0.71 0.51,0.39 0.89)))')), +(80,80,'y',MULTIPOLYGONFromText('MULTIPOLYGON(((0.29 0.36,0.29 0.36)))')), +(81,81,'r',MULTIPOLYGONFromText('MULTIPOLYGON(((0.05 0.94,0.93 0.37,0.22 0.07,0.73 0.75,0.99 0.35,0.05 0.94)))')), +(82,82,'w',MULTIPOLYGONFromText('MULTIPOLYGON(((0.33 0.37,0.06 0.59,0.34 0.82,0.73 0.86,0.18 0.78,0.99 0.03,0.33 0.37)))')), +(83,83,REPEAT('g',74),MULTIPOLYGONFromText('MULTIPOLYGON(((0.60 0.54,0.25 0.31,0.60 0.54)))')), +(84,84,REPEAT('s',214),MULTIPOLYGONFromText('MULTIPOLYGON(((0.80 0.34,0.09 0.74,0.47 0.96,0.55 0.19,0.80 0.34)))')), +(85,85,REPEAT('h',223),MULTIPOLYGONFromText('MULTIPOLYGON(((0.76 0.26,0.16 0.85,0.91 0.75,0.64 0.83,0.47 0.02,0.92 0.58,0.76 0.26)))')), +(86,86,'l',MULTIPOLYGONFromText('MULTIPOLYGON(((0.11 0.64,0.41 0.64,0.64 0.64,0.11 0.64)))')), +(87,87,'hj',MULTIPOLYGONFromText('MULTIPOLYGON(((0.66 1.00,0.21 0.96,0.52 0.44,0.94 0.06,0.80 0.39,0.33 0.57,0.30 0.89,0.66 1.00)))')), +(88,88,'axcs',MULTIPOLYGONFromText('MULTIPOLYGON(((0.20 0.66,0.71 0.41,0.32 0.94,0.30 0.66,0.50 0.49,0.60 0.67,0.20 0.66)))')), +(89,89,'cs',MULTIPOLYGONFromText('MULTIPOLYGON(((0.02 0.69,0.80 0.21,0.09 0.23,0.45 0.66,0.10 0.72,0.02 0.69)))')), +(90,90,'f',MULTIPOLYGONFromText('MULTIPOLYGON(((0.87 0.14,0.54 0.83,0.87 0.42,0.36 0.58,0.87 0.14)))')), +(91,91,'icq',MULTIPOLYGONFromText('MULTIPOLYGON(((0.73 0.57,0.36 0.41,0.86 0.33,0.76 0.49,0.44 0.83,0.73 0.57)))')), +(92,92,REPEAT('z',783),MULTIPOLYGONFromText('MULTIPOLYGON(((0.28 0.98,0.05 0.26,0.09 0.59,1.00 0.17,0.55 0.68,0.12 0.04,0.28 0.98)))')), +(93,93,'z',MULTIPOLYGONFromText('MULTIPOLYGON(((0.05 0.89,0.05 0.89)))')), +(94,94,REPEAT('x',1412),MULTIPOLYGONFromText('MULTIPOLYGON(((0.79 0.83,0.12 0.49,0.54 0.63,0.79 0.83)))')), +(95,95,REPEAT('u',2500),MULTIPOLYGONFromText('MULTIPOLYGON(((0.50 0.55,0.13 0.19,0.72 0.06,0.50 0.55)),((0.73 0.92,0.02 0.48,0.73 0.92)))')); +DROP TABLE t1; # End of 10.6 tests diff --git a/mysql-test/suite/innodb_gis/t/rtree_split.test b/mysql-test/suite/innodb_gis/t/rtree_split.test index 78ca9641e967a..743132856ae4d 100644 --- a/mysql-test/suite/innodb_gis/t/rtree_split.test +++ b/mysql-test/suite/innodb_gis/t/rtree_split.test @@ -87,4 +87,109 @@ ROLLBACK; SET GLOBAL innodb_limit_optimistic_insert_debug=@save_limit; DROP TABLE t1; +--echo # +--echo # MDEV-27675 Incorrect r-tree split after group +--echo # assignment causes page overflow +--echo # +CREATE TABLE t1 (f1 INT, f2 INT, f3 VARCHAR(2500), + f4 MULTIPOLYGON NOT NULL, + PRIMARY KEY (f1,f2,f3), SPATIAL(f4)) ENGINE=InnoDB; +INSERT INTO t1 VALUES +(1,1,'id',MULTIPOLYGONFromText('MULTIPOLYGON(((0.12 0.53,0.23 0.92,0.12 0.53)))')), +(2,2,REPEAT('s',853),MULTIPOLYGONFromText('MULTIPOLYGON(((0.09 0.71,0.92 0.49,0.09 0.71)))')), +(3,3,'',MULTIPOLYGONFromText('MULTIPOLYGON(((0.62 0.71,0.62 0.71)))')), +(4,4,'j',MULTIPOLYGONFromText('MULTIPOLYGON(((0.00 0.06,0.40 0.39,0.61 0.20,0.69 0.91,0.13 0.45,0.71 0.49,0.81 0.52,0.08 0.02,0.00 0.06)))')), +(5,5,'b',MULTIPOLYGONFromText('MULTIPOLYGON(((0.05 0.20,0.45 0.96,0.59 0.46,0.26 0.12,0.45 0.68,0.41 0.10,0.05 0.20)))')), +(6,6,'j',MULTIPOLYGONFromText('MULTIPOLYGON(((0.30 0.09,0.42 0.27,0.96 0.83,0.81 0.89,0.42 0.16,0.89 0.64,0.30 0.09)))')), +(7,7,'f',MULTIPOLYGONFromText('MULTIPOLYGON(((0.62 0.42,0.12 0.70,0.07 0.24,0.10 0.07,0.92 0.29,0.20 0.52,0.62 0.42)))')), +(8,8,'a',MULTIPOLYGONFromText('MULTIPOLYGON(((0.74 0.96,0.80 0.93,0.61 0.40,0.23 0.49,0.79 0.96,0.67 0.30,0.67 0.25,0.74 0.96)))')), +(9,9,'j',MULTIPOLYGONFromText('MULTIPOLYGON(((0.18 0.56,0.03 0.48,0.89 0.30,0.79 0.85,0.40 0.92,0.47 0.34,0.38 0.48,0.18 0.56)))')), +(10,10,'ko',MULTIPOLYGONFromText('MULTIPOLYGON(((0.60 0.23,0.03 0.43,0.33 0.94,0.20 0.37,0.60 0.23)))')), +(11,11,'o',MULTIPOLYGONFromText('MULTIPOLYGON(((0.94 0.33,0.16 0.47,0.94 0.33)))')), +(12,12,'bs',MULTIPOLYGONFromText('MULTIPOLYGON(((0.78 0.81,0.71 0.29,0.03 0.85,0.54 0.16,0.23 0.20,0.86 0.77,0.41 0.96,0.85 0.67,0.78 0.81)))')), +(13,13,'z',MULTIPOLYGONFromText('MULTIPOLYGON(((0.70 0.92,0.61 0.64,0.05 0.75,0.60 1.00,0.47 0.14,0.70 0.92)))')), +(14,14,'',MULTIPOLYGONFromText('MULTIPOLYGON(((0.03 0.78,0.83 0.08,0.18 0.49,0.02 0.88,0.62 0.46,0.25 0.53,0.03 0.78)))')), +(15,15,'oaz',MULTIPOLYGONFromText('MULTIPOLYGON(((0.12 0.22,0.73 0.35,0.08 0.39,0.23 0.31,0.84 0.19,0.46 0.77,0.63 0.69,0.12 0.22)))')), +(16,16,'a',MULTIPOLYGONFromText('MULTIPOLYGON(((0.50 0.49,0.48 0.69,0.25 0.87,0.85 0.62,0.96 0.28,0.07 0.70,0.45 0.79,0.87 0.36,0.50 0.49)))')), +(17,17,'cj',MULTIPOLYGONFromText('MULTIPOLYGON(((0.72 0.93,0.03 0.94,0.77 0.06,0.29 0.76,0.82 0.68,0.16 0.59,0.15 0.73,0.72 0.93)))')), +(18,18,REPEAT('r',149),MULTIPOLYGONFromText('MULTIPOLYGON(((0.02 0.67,0.05 0.90,0.68 0.02,0.02 0.67)))')), +(19,19,'ihb',MULTIPOLYGONFromText('MULTIPOLYGON(((0.61 0.40,0.77 0.06,0.61 0.40)),((0.43 0.52,0.77 0.27,0.31 0.49,0.43 0.52)))')), +(20,20,'h',MULTIPOLYGONFromText('MULTIPOLYGON(((0.37 0.98,0.88 0.84,0.18 0.47,0.15 0.77,0.82 0.92,0.66 0.55,0.60 0.02,0.17 0.09,0.37 0.98)))')), +(21,21,'i',MULTIPOLYGONFromText('MULTIPOLYGON(((0.89 0.55,0.85 0.85,0.68 0.24,0.20 0.42,0.67 0.36,0.35 0.25,0.48 0.20,0.89 0.55)))')), +(22,22,'q',MULTIPOLYGONFromText('MULTIPOLYGON(((0.67 0.40,0.63 0.18,0.80 0.66,0.65 0.47,0.66 0.56,0.64 0.97,0.00 0.92,0.66 0.18,0.67 0.40)))')), +(23,23,'kh',MULTIPOLYGONFromText('MULTIPOLYGON(((0.89 0.31,0.33 0.68,0.75 0.35,0.40 0.57,0.94 0.91,0.88 0.23,0.89 0.31)))')), +(24,24,'hbtgc',MULTIPOLYGONFromText('MULTIPOLYGON(((0.99 0.12,0.73 0.75,0.46 0.85,0.55 0.92,0.12 0.44,0.22 0.13,0.11 0.61,0.99 0.12)))')), +(25,25,REPEAT('t',71),MULTIPOLYGONFromText('MULTIPOLYGON(((0.72 0.06,0.31 0.98,0.95 0.02,0.84 0.77,0.46 0.09,0.63 0.92,0.35 0.90,0.72 0.06)))')), +(26,26,'g',MULTIPOLYGONFromText('MULTIPOLYGON(((0.18 0.27,0.28 0.15,0.18 0.27)),((0.22 0.55,0.22 0.55)),((0.28 0.70,0.28 0.70)))')), +(27,27,'c',MULTIPOLYGONFromText('MULTIPOLYGON(((0.72 0.28,0.62 0.71,0.04 1.00,0.12 0.57,0.72 0.28)))')), +(28,28,REPEAT('q',885),MULTIPOLYGONFromText('MULTIPOLYGON(((0.70 0.04,0.62 0.29,0.42 0.82,0.90 0.87,0.79 0.69,0.59 0.99,0.24 0.24,0.69 0.96,0.70 0.04)))')), +(29,29,'oy',MULTIPOLYGONFromText('MULTIPOLYGON(((0.23 0.87,0.51 0.65,0.70 0.97,0.44 0.14,0.25 0.83,0.23 0.87)))')), +(30,30,REPEAT('k',1684),MULTIPOLYGONFromText('MULTIPOLYGON(((0.99 0.78,0.78 0.99,0.76 0.51,0.25 0.31,0.13 0.86,0.16 0.11,0.45 0.94,0.23 0.98,0.99 0.78)))')), +(31,31,'ylsmiix',MULTIPOLYGONFromText('MULTIPOLYGON(((0.85 0.35,0.03 0.75,0.18 0.31,0.84 0.36,0.92 0.72,0.52 0.93,0.65 0.10,0.55 0.80,0.85 0.35)))')), +(32,32,'ojouw',MULTIPOLYGONFromText('MULTIPOLYGON(((0.72 0.00,0.83 0.45,0.32 0.62,0.36 0.40,0.19 0.95,0.50 0.38,0.30 0.76,0.72 0.00)))')), +(33,33,'ou',MULTIPOLYGONFromText('MULTIPOLYGON(((0.98 0.02,0.01 0.23,0.27 0.11,0.98 0.02)),((0.44 0.54,0.44 0.54)),((0.86 0.97,0.86 0.97)))')), +(34,34,'u',MULTIPOLYGONFromText('MULTIPOLYGON(((0.13 0.07,0.29 0.09,0.53 0.79,0.85 0.66,0.64 0.17,0.22 0.18,0.35 0.39,0.30 0.28,0.13 0.07)))')), +(35,35,'sax',MULTIPOLYGONFromText('MULTIPOLYGON(((0.26 0.03,0.24 0.93,0.15 0.48,0.26 0.03)),((0.73 0.46,0.35 0.63,0.73 0.46)))')), +(36,36,'xmet',MULTIPOLYGONFromText('MULTIPOLYGON(((0.23 0.35,0.35 0.82,0.23 0.35)),((0.29 0.61,0.82 0.54,0.29 0.61)))')), +(37,37,REPEAT('e',276),MULTIPOLYGONFromText('MULTIPOLYGON(((0.65 0.67,0.65 0.67)))')), +(38,38,'ty',MULTIPOLYGONFromText('MULTIPOLYGON(((0.43 0.44,0.64 0.76,0.92 0.59,0.73 0.23,0.43 0.44)))')), +(39,39,'yq',MULTIPOLYGONFromText('MULTIPOLYGON(((0.84 0.27,0.19 0.67,0.84 0.27)),((0.55 0.13,0.39 0.64,0.21 0.70,0.18 0.45,0.55 0.13)))')), +(40,40,'hcsv',MULTIPOLYGONFromText('MULTIPOLYGON(((0.61 0.79,0.83 0.16,0.63 0.80,0.78 0.28,0.88 0.66,0.61 0.79)))')), +(41,41,'csvhlr',MULTIPOLYGONFromText('MULTIPOLYGON(((0.82 0.24,0.31 0.52,0.61 0.67,0.99 0.90,0.05 0.73,0.52 0.18,0.71 0.87,0.82 0.24)))')), +(42,42,'b',MULTIPOLYGONFromText('MULTIPOLYGON(((0.09 0.21,0.37 0.57,0.81 0.75,0.61 0.16,0.48 0.17,0.29 0.28,0.72 0.46,0.09 0.21)))')), +(43,43,'wd',MULTIPOLYGONFromText('MULTIPOLYGON(((0.06 0.25,0.52 0.23,0.02 0.05,0.06 0.25)),((0.70 0.52,0.44 0.46,0.95 0.47,0.70 0.52)))')), +(44,44,'dg',MULTIPOLYGONFromText('MULTIPOLYGON(((0.81 0.28,0.19 0.17,0.81 0.28)))')), +(45,45,'qtqkyyhkayeoopxmexd',MULTIPOLYGONFromText('MULTIPOLYGON(((0.80 0.66,0.81 0.12,0.83 0.31,0.52 0.29,0.08 0.04,0.80 0.66)))')), +(46,46,'tqk',MULTIPOLYGONFromText('MULTIPOLYGON(((0.95 0.08,0.95 0.08)),((0.09 0.31,0.09 0.31)),((0.38 0.75,0.30 0.04,0.38 0.75)))')), +(47,47,REPEAT('q',925),MULTIPOLYGONFromText('MULTIPOLYGON(((0.56 0.73,0.87 0.11,0.37 0.86,0.48 0.05,0.82 0.55,0.25 0.06,0.19 0.85,0.10 0.75,0.56 0.73)))')), +(48,48,'yhk',MULTIPOLYGONFromText('MULTIPOLYGON(((0.06 0.67,0.41 0.51,0.03 0.83,0.40 0.20,0.16 0.87,0.16 0.07,0.29 0.52,0.06 0.67)))')), +(49,49,'k',MULTIPOLYGONFromText('MULTIPOLYGON(((0.16 0.14,0.16 0.14)),((0.97 0.69,0.45 0.32,0.45 0.38,0.97 0.69)))')), +(50,50,'b',MULTIPOLYGONFromText('MULTIPOLYGON(((0.70 0.00,0.70 0.00)),((0.88 0.53,0.90 0.16,0.88 0.53)))')), +(51,51,'',MULTIPOLYGONFromText('MULTIPOLYGON(((0.48 0.06,0.45 0.05,0.03 0.12,0.27 0.80,0.22 0.75,0.53 0.55,0.48 0.06)))')), +(52,52,'o',MULTIPOLYGONFromText('MULTIPOLYGON(((0.32 0.76,0.17 0.43,0.32 0.76)),((0.40 0.79,0.40 0.79)),((0.42 0.34,0.42 0.34)))')), +(53,53,'pxme',MULTIPOLYGONFromText('MULTIPOLYGON(((0.44 0.08,0.02 0.74,0.26 0.21,0.75 0.42,0.91 0.32,0.24 0.65,0.67 0.50,0.44 0.08)))')), +(54,54,'m',MULTIPOLYGONFromText('MULTIPOLYGON(((0.86 0.13,0.21 0.34,0.00 0.87,0.76 0.23,0.69 0.73,0.13 0.63,0.86 0.13)))')), +(55,55,'mex',MULTIPOLYGONFromText('MULTIPOLYGON(((0.84 0.11,0.63 0.13,0.51 0.81,0.58 0.25,0.53 0.29,0.53 0.42,0.84 0.11)))')), +(56,56,REPEAT('e',504),MULTIPOLYGONFromText('MULTIPOLYGON(((0.27 0.84,0.65 0.26,0.75 0.44,0.29 0.52,0.27 0.84)))')), +(57,57,'i',MULTIPOLYGONFromText('MULTIPOLYGON(((0.71 0.84,0.77 0.27,0.45 0.71,0.91 0.01,0.84 0.35,0.71 0.84)))')), +(58,58,'b',MULTIPOLYGONFromText('MULTIPOLYGON(((0.12 0.36,0.02 0.47,0.57 0.76,0.15 0.54,0.12 0.36)))')), +(59,59,'',MULTIPOLYGONFromText('MULTIPOLYGON(((0.77 0.80,0.25 0.69,0.34 0.68,0.77 0.80)))')), +(60,60,'',MULTIPOLYGONFromText('MULTIPOLYGON(((0.57 0.30,0.58 0.81,0.57 0.30)))')), +(61,61,'nh',MULTIPOLYGONFromText('MULTIPOLYGON(((0.42 0.99,0.42 0.99)))')), +(62,62,'hwi',MULTIPOLYGONFromText('MULTIPOLYGON(((0.40 0.50,0.97 0.34,0.60 0.75,0.26 0.74,0.40 0.50)))')), +(63,63,'id',MULTIPOLYGONFromText('MULTIPOLYGON(((0.30 0.67,0.13 0.43,0.16 0.64,0.04 0.72,0.95 0.87,0.83 0.24,0.17 0.82,0.30 0.67)))')), +(64,64,'toy',MULTIPOLYGONFromText('MULTIPOLYGON(((0.68 0.75,0.92 0.90,0.68 0.75)),((0.58 0.03,0.41 0.09,0.62 0.05,0.58 0.03)))')), +(65,65,'yhawdptl',MULTIPOLYGONFromText('MULTIPOLYGON(((0.95 0.50,0.61 0.35,0.78 0.07,0.67 0.43,0.50 0.70,0.48 0.98,0.95 0.50)))')), +(66,66,'gs',MULTIPOLYGONFromText('MULTIPOLYGON(((0.59 0.06,0.12 0.94,0.05 0.90,0.99 0.22,0.13 0.55,0.59 0.06)))')), +(67,67,'bplb',MULTIPOLYGONFromText('MULTIPOLYGON(((0.33 0.90,0.54 0.11,0.05 0.04,0.59 0.66,0.33 0.90)))')), +(68,68,'b',MULTIPOLYGONFromText('MULTIPOLYGON(((0.50 0.52,0.23 0.54,0.80 0.14,0.88 0.70,0.13 0.67,0.68 0.66,0.50 0.52)))')), +(69,69,'p',MULTIPOLYGONFromText('MULTIPOLYGON(((0.07 0.99,0.11 0.79,0.07 0.99)),((0.50 0.22,0.77 0.58,0.50 0.22)))')), +(70,70,'l',MULTIPOLYGONFromText('MULTIPOLYGON(((0.21 0.75,0.21 0.75)))')), +(71,71,'rwkqhip',MULTIPOLYGONFromText('MULTIPOLYGON(((0.99 0.89,0.25 0.77,0.99 0.89)))')), +(72,72,'n',MULTIPOLYGONFromText('MULTIPOLYGON(((0.01 0.10,0.01 0.20,0.01 0.10)),((0.83 0.75,0.29 0.21,0.83 0.75)))')), +(73,73,'q',MULTIPOLYGONFromText('MULTIPOLYGON(((0.12 0.03,0.51 0.05,0.27 0.77,0.74 0.06,0.12 0.03)))')), +(74,74,'hipd',MULTIPOLYGONFromText('MULTIPOLYGON(((0.89 0.94,0.54 0.92,0.37 0.71,0.89 0.94)))')), +(75,75,'ipdec',MULTIPOLYGONFromText('MULTIPOLYGON(((0.50 0.48,0.07 0.31,0.19 0.23,0.51 0.74,0.50 0.48)))')), +(76,76,'pde',MULTIPOLYGONFromText('MULTIPOLYGON(((0.79 0.42,0.61 0.98,0.13 0.85,0.52 0.16,0.79 0.42)))')), +(77,77,REPEAT('e',1432),MULTIPOLYGONFromText('MULTIPOLYGON(((0.78 0.29,0.42 0.20,0.88 0.86,0.99 0.81,0.78 0.29)))')), +(78,78,'cyhr',MULTIPOLYGONFromText('MULTIPOLYGON(((0.61 0.16,0.62 0.19,0.61 0.16)),((0.62 0.94,0.65 0.53,0.15 0.25,0.71 0.41,0.62 0.94)),((0.67 0.63,0.86 0.60,0.67 0.63)))')), +(79,79,'n',MULTIPOLYGONFromText('MULTIPOLYGON(((0.39 0.89,0.25 0.77,0.22 0.21,0.51 0.19,0.71 0.51,0.39 0.89)))')), +(80,80,'y',MULTIPOLYGONFromText('MULTIPOLYGON(((0.29 0.36,0.29 0.36)))')), +(81,81,'r',MULTIPOLYGONFromText('MULTIPOLYGON(((0.05 0.94,0.93 0.37,0.22 0.07,0.73 0.75,0.99 0.35,0.05 0.94)))')), +(82,82,'w',MULTIPOLYGONFromText('MULTIPOLYGON(((0.33 0.37,0.06 0.59,0.34 0.82,0.73 0.86,0.18 0.78,0.99 0.03,0.33 0.37)))')), +(83,83,REPEAT('g',74),MULTIPOLYGONFromText('MULTIPOLYGON(((0.60 0.54,0.25 0.31,0.60 0.54)))')), +(84,84,REPEAT('s',214),MULTIPOLYGONFromText('MULTIPOLYGON(((0.80 0.34,0.09 0.74,0.47 0.96,0.55 0.19,0.80 0.34)))')), +(85,85,REPEAT('h',223),MULTIPOLYGONFromText('MULTIPOLYGON(((0.76 0.26,0.16 0.85,0.91 0.75,0.64 0.83,0.47 0.02,0.92 0.58,0.76 0.26)))')), +(86,86,'l',MULTIPOLYGONFromText('MULTIPOLYGON(((0.11 0.64,0.41 0.64,0.64 0.64,0.11 0.64)))')), +(87,87,'hj',MULTIPOLYGONFromText('MULTIPOLYGON(((0.66 1.00,0.21 0.96,0.52 0.44,0.94 0.06,0.80 0.39,0.33 0.57,0.30 0.89,0.66 1.00)))')), +(88,88,'axcs',MULTIPOLYGONFromText('MULTIPOLYGON(((0.20 0.66,0.71 0.41,0.32 0.94,0.30 0.66,0.50 0.49,0.60 0.67,0.20 0.66)))')), +(89,89,'cs',MULTIPOLYGONFromText('MULTIPOLYGON(((0.02 0.69,0.80 0.21,0.09 0.23,0.45 0.66,0.10 0.72,0.02 0.69)))')), +(90,90,'f',MULTIPOLYGONFromText('MULTIPOLYGON(((0.87 0.14,0.54 0.83,0.87 0.42,0.36 0.58,0.87 0.14)))')), +(91,91,'icq',MULTIPOLYGONFromText('MULTIPOLYGON(((0.73 0.57,0.36 0.41,0.86 0.33,0.76 0.49,0.44 0.83,0.73 0.57)))')), +(92,92,REPEAT('z',783),MULTIPOLYGONFromText('MULTIPOLYGON(((0.28 0.98,0.05 0.26,0.09 0.59,1.00 0.17,0.55 0.68,0.12 0.04,0.28 0.98)))')), +(93,93,'z',MULTIPOLYGONFromText('MULTIPOLYGON(((0.05 0.89,0.05 0.89)))')), +(94,94,REPEAT('x',1412),MULTIPOLYGONFromText('MULTIPOLYGON(((0.79 0.83,0.12 0.49,0.54 0.63,0.79 0.83)))')), +(95,95,REPEAT('u',2500),MULTIPOLYGONFromText('MULTIPOLYGON(((0.50 0.55,0.13 0.19,0.72 0.06,0.50 0.55)),((0.73 0.92,0.02 0.48,0.73 0.92)))')); +DROP TABLE t1; + --echo # End of 10.6 tests diff --git a/mysql-test/suite/perfschema/t/show_sanity.test b/mysql-test/suite/perfschema/t/show_sanity.test index 9e303c58577ab..5e2ac4565b945 100644 --- a/mysql-test/suite/perfschema/t/show_sanity.test +++ b/mysql-test/suite/perfschema/t/show_sanity.test @@ -488,7 +488,6 @@ insert into test.sanity values ("JUNK: GLOBAL-ONLY", "I_S.SESSION_VARIABLES", "INNODB_SYNC_SPIN_LOOPS"), ("JUNK: GLOBAL-ONLY", "I_S.SESSION_VARIABLES", "INNODB_TEMP_DATA_FILE_PATH"), ("JUNK: GLOBAL-ONLY", "I_S.SESSION_VARIABLES", "INNODB_TRX_PURGE_VIEW_UPDATE_ONLY_DEBUG"), - ("JUNK: GLOBAL-ONLY", "I_S.SESSION_VARIABLES", "INNODB_TRX_RSEG_N_SLOTS_DEBUG"), ("JUNK: GLOBAL-ONLY", "I_S.SESSION_VARIABLES", "INNODB_UNDO_DIRECTORY"), ("JUNK: GLOBAL-ONLY", "I_S.SESSION_VARIABLES", "INNODB_UNDO_LOG_TRUNCATE"), ("JUNK: GLOBAL-ONLY", "I_S.SESSION_VARIABLES", "INNODB_UNDO_TABLESPACES"), diff --git a/mysql-test/suite/sql_sequence/other.result b/mysql-test/suite/sql_sequence/other.result index 7ab7f174b26c3..93920f9193988 100644 --- a/mysql-test/suite/sql_sequence/other.result +++ b/mysql-test/suite/sql_sequence/other.result @@ -382,6 +382,35 @@ disconnect con1; connection default; drop sequence s1; drop sequence s2; -# # End of 10.4 tests # +# MDEV-37906 Server crash or UBSAN errors in Item_func_nextval::update_table upon INSERT DELAYED +# +create sequence s engine=myisam; +create table t (id bigint default(nextval(s))) engine=myisam; +insert delayed into t () values(); +drop table t; +drop sequence s; +# +# MDEV-37345 Item_func_nextval::val_int() crash on INSERT...SELECT with subqueries +# +create sequence s; +create table t1 (a int, b int default(nextval(s))); +insert into t1 () values (); +create table t2 (c int); +create procedure p() update t1 set a = 0; +create trigger tr after insert on t2 for each row +begin +insert into t1 () values (); +call p(); +end $ +insert into t2 values (); +drop table t1, t2, s; +drop procedure p; +create sequence s; +create temporary table t (f int); +alter table t modify f int default(nextval(s)); +create or replace sequence s; +insert into t values (default); +drop sequence s; +# End of 10.11 tests diff --git a/mysql-test/suite/sql_sequence/other.test b/mysql-test/suite/sql_sequence/other.test index 0d59596fb1337..4fcf2d6652df4 100644 --- a/mysql-test/suite/sql_sequence/other.test +++ b/mysql-test/suite/sql_sequence/other.test @@ -414,6 +414,43 @@ insert into s1 values (1, 1, 10000, 100, 1, 1000, 0, 0); drop sequence s1; drop sequence s2; ---echo # --echo # End of 10.4 tests + +--echo # +--echo # MDEV-37906 Server crash or UBSAN errors in Item_func_nextval::update_table upon INSERT DELAYED +--echo # +create sequence s engine=myisam; +create table t (id bigint default(nextval(s))) engine=myisam; +insert delayed into t () values(); +drop table t; +drop sequence s; + +--echo # +--echo # MDEV-37345 Item_func_nextval::val_int() crash on INSERT...SELECT with subqueries --echo # +# sequence and prelocking. +create sequence s; +create table t1 (a int, b int default(nextval(s))); +insert into t1 () values (); +create table t2 (c int); +create procedure p() update t1 set a = 0; +--delimiter $ +create trigger tr after insert on t2 for each row +begin + insert into t1 () values (); + call p(); +end $ +--delimiter ; +insert into t2 values (); +drop table t1, t2, s; +drop procedure p; + +# another one, temporary table, ALTER, recreate sequence +create sequence s; +create temporary table t (f int); +alter table t modify f int default(nextval(s)); +create or replace sequence s; +insert into t values (default); +drop sequence s; + +--echo # End of 10.11 tests diff --git a/mysql-test/suite/sys_vars/r/innodb_trx_rseg_n_slots_debug_basic.result b/mysql-test/suite/sys_vars/r/innodb_trx_rseg_n_slots_debug_basic.result deleted file mode 100644 index 7e253c869e3e5..0000000000000 --- a/mysql-test/suite/sys_vars/r/innodb_trx_rseg_n_slots_debug_basic.result +++ /dev/null @@ -1,65 +0,0 @@ -SET @start_global_value = @@global.innodb_trx_rseg_n_slots_debug; -SELECT @start_global_value; -@start_global_value -0 -select @@global.innodb_trx_rseg_n_slots_debug between 0 and 1024; -@@global.innodb_trx_rseg_n_slots_debug between 0 and 1024 -1 -select @@global.innodb_trx_rseg_n_slots_debug; -@@global.innodb_trx_rseg_n_slots_debug -0 -select @@session.innodb_trx_rseg_n_slots_debug; -ERROR HY000: Variable 'innodb_trx_rseg_n_slots_debug' is a GLOBAL variable -show global variables like 'innodb_trx_rseg_n_slots_debug'; -Variable_name Value -innodb_trx_rseg_n_slots_debug 0 -show session variables like 'innodb_trx_rseg_n_slots_debug'; -Variable_name Value -innodb_trx_rseg_n_slots_debug 0 -select * from information_schema.global_variables where variable_name='innodb_trx_rseg_n_slots_debug'; -VARIABLE_NAME VARIABLE_VALUE -INNODB_TRX_RSEG_N_SLOTS_DEBUG 0 -select * from information_schema.session_variables where variable_name='innodb_trx_rseg_n_slots_debug'; -VARIABLE_NAME VARIABLE_VALUE -INNODB_TRX_RSEG_N_SLOTS_DEBUG 0 -set global innodb_trx_rseg_n_slots_debug=1; -select @@global.innodb_trx_rseg_n_slots_debug; -@@global.innodb_trx_rseg_n_slots_debug -1 -select * from information_schema.global_variables where variable_name='innodb_trx_rseg_n_slots_debug'; -VARIABLE_NAME VARIABLE_VALUE -INNODB_TRX_RSEG_N_SLOTS_DEBUG 1 -select * from information_schema.session_variables where variable_name='innodb_trx_rseg_n_slots_debug'; -VARIABLE_NAME VARIABLE_VALUE -INNODB_TRX_RSEG_N_SLOTS_DEBUG 1 -set @@global.innodb_trx_rseg_n_slots_debug=0; -select @@global.innodb_trx_rseg_n_slots_debug; -@@global.innodb_trx_rseg_n_slots_debug -0 -select * from information_schema.global_variables where variable_name='innodb_trx_rseg_n_slots_debug'; -VARIABLE_NAME VARIABLE_VALUE -INNODB_TRX_RSEG_N_SLOTS_DEBUG 0 -select * from information_schema.session_variables where variable_name='innodb_trx_rseg_n_slots_debug'; -VARIABLE_NAME VARIABLE_VALUE -INNODB_TRX_RSEG_N_SLOTS_DEBUG 0 -set session innodb_trx_rseg_n_slots_debug='some'; -ERROR HY000: Variable 'innodb_trx_rseg_n_slots_debug' is a GLOBAL variable and should be set with SET GLOBAL -set @@session.innodb_trx_rseg_n_slots_debug='some'; -ERROR HY000: Variable 'innodb_trx_rseg_n_slots_debug' is a GLOBAL variable and should be set with SET GLOBAL -set global innodb_trx_rseg_n_slots_debug=1.1; -ERROR 42000: Incorrect argument type to variable 'innodb_trx_rseg_n_slots_debug' -set global innodb_trx_rseg_n_slots_debug='foo'; -ERROR 42000: Incorrect argument type to variable 'innodb_trx_rseg_n_slots_debug' -set global innodb_trx_rseg_n_slots_debug=-2; -Warnings: -Warning 1292 Truncated incorrect innodb_trx_rseg_n_slots_debug value: '-2' -set global innodb_trx_rseg_n_slots_debug=1e1; -ERROR 42000: Incorrect argument type to variable 'innodb_trx_rseg_n_slots_debug' -set global innodb_trx_rseg_n_slots_debug=1024; -set global innodb_trx_rseg_n_slots_debug=1025; -Warnings: -Warning 1292 Truncated incorrect innodb_trx_rseg_n_slots_debug value: '1025' -SET @@global.innodb_trx_rseg_n_slots_debug = @start_global_value; -SELECT @@global.innodb_trx_rseg_n_slots_debug; -@@global.innodb_trx_rseg_n_slots_debug -0 diff --git a/mysql-test/suite/sys_vars/r/sysvars_innodb.result b/mysql-test/suite/sys_vars/r/sysvars_innodb.result index 42c795a4d9af3..b9f1e8b68f60c 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_innodb.result +++ b/mysql-test/suite/sys_vars/r/sysvars_innodb.result @@ -1664,18 +1664,6 @@ NUMERIC_BLOCK_SIZE NULL ENUM_VALUE_LIST OFF,ON READ_ONLY NO COMMAND_LINE_ARGUMENT NULL -VARIABLE_NAME INNODB_TRX_RSEG_N_SLOTS_DEBUG -SESSION_VALUE NULL -DEFAULT_VALUE 0 -VARIABLE_SCOPE GLOBAL -VARIABLE_TYPE INT UNSIGNED -VARIABLE_COMMENT Debug flags for InnoDB to limit TRX_RSEG_N_SLOTS for trx_rsegf_undo_find_free() -NUMERIC_MIN_VALUE 0 -NUMERIC_MAX_VALUE 1024 -NUMERIC_BLOCK_SIZE 0 -ENUM_VALUE_LIST NULL -READ_ONLY NO -COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME INNODB_UNDO_DIRECTORY SESSION_VALUE NULL DEFAULT_VALUE diff --git a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result index 3bd202191348a..62a45fd2c5ef4 100644 --- a/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result +++ b/mysql-test/suite/sys_vars/r/sysvars_server_notembedded.result @@ -322,6 +322,16 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY NO COMMAND_LINE_ARGUMENT OPTIONAL +VARIABLE_NAME BACKTRACE_STR +VARIABLE_SCOPE SESSION +VARIABLE_TYPE VARCHAR +VARIABLE_COMMENT Backtrace string when error(s) occur. Empty string means no error occured +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST NULL +READ_ONLY YES +COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME BACK_LOG VARIABLE_SCOPE GLOBAL VARIABLE_TYPE BIGINT UNSIGNED @@ -1052,6 +1062,16 @@ NUMERIC_BLOCK_SIZE 1 ENUM_VALUE_LIST NULL READ_ONLY YES COMMAND_LINE_ARGUMENT NULL +VARIABLE_NAME ERRSTACK_STR +VARIABLE_SCOPE SESSION +VARIABLE_TYPE VARCHAR +VARIABLE_COMMENT Current error stack when error(s) occur. Empty string means no error occured +NUMERIC_MIN_VALUE NULL +NUMERIC_MAX_VALUE NULL +NUMERIC_BLOCK_SIZE NULL +ENUM_VALUE_LIST NULL +READ_ONLY YES +COMMAND_LINE_ARGUMENT NULL VARIABLE_NAME EVENT_SCHEDULER VARIABLE_SCOPE GLOBAL VARIABLE_TYPE ENUM diff --git a/mysql-test/suite/sys_vars/t/innodb_trx_rseg_n_slots_debug_basic.test b/mysql-test/suite/sys_vars/t/innodb_trx_rseg_n_slots_debug_basic.test deleted file mode 100644 index 858e1b6390824..0000000000000 --- a/mysql-test/suite/sys_vars/t/innodb_trx_rseg_n_slots_debug_basic.test +++ /dev/null @@ -1,59 +0,0 @@ ---source include/have_innodb.inc ---source include/have_debug.inc - -SET @start_global_value = @@global.innodb_trx_rseg_n_slots_debug; -SELECT @start_global_value; - -# -# exists as global only -# -select @@global.innodb_trx_rseg_n_slots_debug between 0 and 1024; -select @@global.innodb_trx_rseg_n_slots_debug; ---error ER_INCORRECT_GLOBAL_LOCAL_VAR -select @@session.innodb_trx_rseg_n_slots_debug; -show global variables like 'innodb_trx_rseg_n_slots_debug'; -show session variables like 'innodb_trx_rseg_n_slots_debug'; ---disable_warnings -select * from information_schema.global_variables where variable_name='innodb_trx_rseg_n_slots_debug'; -select * from information_schema.session_variables where variable_name='innodb_trx_rseg_n_slots_debug'; ---enable_warnings - -# -# show that it's writable -# -set global innodb_trx_rseg_n_slots_debug=1; -select @@global.innodb_trx_rseg_n_slots_debug; ---disable_warnings -select * from information_schema.global_variables where variable_name='innodb_trx_rseg_n_slots_debug'; -select * from information_schema.session_variables where variable_name='innodb_trx_rseg_n_slots_debug'; ---enable_warnings -set @@global.innodb_trx_rseg_n_slots_debug=0; -select @@global.innodb_trx_rseg_n_slots_debug; ---disable_warnings -select * from information_schema.global_variables where variable_name='innodb_trx_rseg_n_slots_debug'; -select * from information_schema.session_variables where variable_name='innodb_trx_rseg_n_slots_debug'; ---enable_warnings ---error ER_GLOBAL_VARIABLE -set session innodb_trx_rseg_n_slots_debug='some'; ---error ER_GLOBAL_VARIABLE -set @@session.innodb_trx_rseg_n_slots_debug='some'; - -# -# incorrect types -# ---error ER_WRONG_TYPE_FOR_VAR -set global innodb_trx_rseg_n_slots_debug=1.1; ---error ER_WRONG_TYPE_FOR_VAR -set global innodb_trx_rseg_n_slots_debug='foo'; -set global innodb_trx_rseg_n_slots_debug=-2; ---error ER_WRONG_TYPE_FOR_VAR -set global innodb_trx_rseg_n_slots_debug=1e1; -set global innodb_trx_rseg_n_slots_debug=1024; -set global innodb_trx_rseg_n_slots_debug=1025; - -# -# Cleanup -# - -SET @@global.innodb_trx_rseg_n_slots_debug = @start_global_value; -SELECT @@global.innodb_trx_rseg_n_slots_debug; diff --git a/mysql-test/suite/sysschema/r/all_sys_objects_exist.result b/mysql-test/suite/sysschema/r/all_sys_objects_exist.result index 81ff6b21454e5..de60fcad577e0 100644 --- a/mysql-test/suite/sysschema/r/all_sys_objects_exist.result +++ b/mysql-test/suite/sysschema/r/all_sys_objects_exist.result @@ -127,6 +127,14 @@ sys_get_config FUNCTION version_major FUNCTION version_minor FUNCTION version_patch FUNCTION +dbms_random PACKAGE +dbms_sql PACKAGE +dbms_utility PACKAGE +UTL_I18N PACKAGE +dbms_random PACKAGE BODY +dbms_sql PACKAGE BODY +dbms_utility PACKAGE BODY +UTL_I18N PACKAGE BODY create_synonym_db PROCEDURE diagnostics PROCEDURE execute_prepared_stmt PROCEDURE diff --git a/mysql-test/suite/sysschema/r/pkg_dbms_random.result b/mysql-test/suite/sysschema/r/pkg_dbms_random.result new file mode 100644 index 0000000000000..0f6c172fb760d --- /dev/null +++ b/mysql-test/suite/sysschema/r/pkg_dbms_random.result @@ -0,0 +1,61 @@ +# +# MDEV-34327: System package SYS.DBMS_RANDOM +# +SET sql_mode= oracle; +SET SESSION note_verbosity = ""; +SELECT SESSION_Value FROM INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE VARIABLE_NAME LIKE 'rand_seed1' INTO @orig_seed1; +SELECT SESSION_Value FROM INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE VARIABLE_NAME LIKE 'rand_seed2' INTO @orig_seed2; +# +# Test INITIALIZE +# +CALL sys.DBMS_RANDOM.INITIALIZE(1); +# +# Test INITIALIZE without an argument +# +CALL sys.DBMS_RANDOM.INITIALIZE(); +ERROR 42000: Incorrect number of arguments for PROCEDURE sys.DBMS_RANDOM.initialize; expected 1, got 0 +# +# Test VALUE +# +SELECT sys.DBMS_RANDOM.VALUE(); +sys.DBMS_RANDOM.VALUE() +0.40540353712197724000000000000000000000 +SELECT sys.DBMS_RANDOM.VALUE(); +sys.DBMS_RANDOM.VALUE() +0.87161418038570710000000000000000000000 +SELECT sys.DBMS_RANDOM.VALUE(); +sys.DBMS_RANDOM.VALUE() +0.14186032129624890000000000000000000000 +# +# Test VALUE with an argument +# +SELECT sys.DBMS_RANDOM.VALUE(1); +ERROR 42000: Incorrect number of arguments for FUNCTION sys.DBMS_RANDOM.value; expected 0, got 1 +# +# Test RANDOM +# +SELECT sys.DBMS_RANDOM.RANDOM(); +sys.DBMS_RANDOM.RANDOM() +-1741784920 +SELECT sys.DBMS_RANDOM.RANDOM(); +sys.DBMS_RANDOM.RANDOM() +-1946846196 +SELECT sys.DBMS_RANDOM.RANDOM(); +sys.DBMS_RANDOM.RANDOM() +1933574855 +# +# Test RANDOM with an argument +# +SELECT sys.DBMS_RANDOM.RANDOM(1); +ERROR 42000: Incorrect number of arguments for FUNCTION sys.DBMS_RANDOM.random; expected 0, got 1 +# +# Test TERMINATE +# +CALL sys.DBMS_RANDOM.TERMINATE(); +# +# Test TERMINATE with an argument +# +CALL sys.DBMS_RANDOM.TERMINATE(1); +ERROR 42000: Incorrect number of arguments for PROCEDURE sys.DBMS_RANDOM.terminate; expected 0, got 1 +SET SESSION rand_seed1 = CAST(@orig_seed1 AS INT); +SET SESSION rand_seed2 = CAST(@orig_seed2 AS INT); diff --git a/mysql-test/suite/sysschema/r/pkg_dbms_sql.result b/mysql-test/suite/sysschema/r/pkg_dbms_sql.result new file mode 100644 index 0000000000000..badf23b42fdf8 --- /dev/null +++ b/mysql-test/suite/sysschema/r/pkg_dbms_sql.result @@ -0,0 +1,310 @@ +# +# MDEV-34330: System package SYS.DBMS_SQL +# +SET sql_mode= oracle; +SET SESSION note_verbosity = ""; +# +# Test OPEN_CURSOR +# +SELECT sys.dbms_sql.OPEN_CURSOR(); +sys.dbms_sql.OPEN_CURSOR() +0 +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; +CREATE TABLE test.t3 (a INT) ENGINE=InnoDB; +Warnings: +Warning 1286 Unknown storage engine 'InnoDB' +Warning 1266 Using storage engine MyISAM for table 't3' +# +# Test PARSE, EXECUTE & CLOSE_CURSOR with an INSERT statement +# +CALL sys.dbms_sql.parse(@cursor_id, +'INSERT INTO test.t3 VALUES (1)', 1); +SELECT sys.dbms_sql.EXECUTE(@cursor_id); +sys.dbms_sql.EXECUTE(@cursor_id) +1 +SELECT * FROM test.t3; +a +1 +CALL sys.dbms_sql.close_cursor(@cursor_id); +# +# Test PARSE with leading whitespace on the input +# +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; +CALL sys.dbms_sql.parse(@cursor_id, +' INSERT INTO test.t3 VALUES (1)', 1); +SELECT sys.dbms_sql.EXECUTE(@cursor_id); +sys.dbms_sql.EXECUTE(@cursor_id) +1 +SELECT * FROM test.t3; +a +1 +1 +CALL sys.dbms_sql.close_cursor(@cursor_id); +# +# Test PARSE with multiple leading whitespace on the input +# +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; +CALL sys.dbms_sql.parse(@cursor_id, +' INSERT INTO test.t3 VALUES (1)', 1); +SELECT sys.dbms_sql.EXECUTE(@cursor_id); +sys.dbms_sql.EXECUTE(@cursor_id) +1 +SELECT * FROM test.t3; +a +1 +1 +1 +CALL sys.dbms_sql.close_cursor(@cursor_id); +# +# Test CLOSE_CURSOR with an already-closed cursor +# +CALL sys.dbms_sql.close_cursor(@cursor_id); +ERROR HY000: Invalid argument error: DBMS_SQL access denied in function close_cursor. +CREATE FUNCTION f1() RETURN VARCHAR2(255) AS +BEGIN +RETURN 'INSERT INTO test.t3 VALUES (3)'; +END; +$$ +# +# Test PARSE with SR func call output as 'input (code)' +# +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; +CALL sys.dbms_sql.parse(@cursor_id, f1(), 1); +SELECT sys.dbms_sql.EXECUTE(@cursor_id); +sys.dbms_sql.EXECUTE(@cursor_id) +1 +SELECT * FROM test.t3; +a +1 +1 +1 +3 +CALL sys.dbms_sql.close_cursor(@cursor_id); +# +# Test PARSE with native func call output as 'input (code)' +# +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; +CALL sys.dbms_sql.parse(@cursor_id, CONCAT('INSERT INTO test.t3 VALUES (3)'), 1); +SELECT sys.dbms_sql.EXECUTE(@cursor_id); +sys.dbms_sql.EXECUTE(@cursor_id) +1 +SELECT * FROM test.t3; +a +1 +1 +1 +3 +3 +CALL sys.dbms_sql.close_cursor(@cursor_id); +# +# Test SP variable as 'input (code)' +# +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; +CREATE PROCEDURE p1(input VARCHAR2(255)) AS +BEGIN +CALL sys.dbms_sql.parse(@cursor_id, input, 1); +END; +$$ +CALL p1('INSERT INTO test.t3 VALUES (3)'); +SELECT sys.dbms_sql.EXECUTE(@cursor_id); +sys.dbms_sql.EXECUTE(@cursor_id) +1 +SELECT * FROM test.t3; +a +1 +1 +1 +3 +3 +3 +CALL sys.dbms_sql.close_cursor(@cursor_id); +# +# Tests where OPEN_CURSOR, CLOSE_CURSOR etc are called within stored routines (functions/procedures) +# +CREATE PROCEDURE start_whole_call() AS +BEGIN +DECLARE +cursor_number INT; +BEGIN +SET cursor_number = sys.dbms_sql.OPEN_CURSOR(); +CALL enclosed_parse_exec_and_close(cursor_number); +END; +END; +CREATE PROCEDURE enclosed_parse_exec_and_close(cursor_number INT) AS +BEGIN +CALL sys.dbms_sql.parse(cursor_number, +'INSERT INTO test.t3 VALUES (1)', 1); +SELECT sys.dbms_sql.EXECUTE(cursor_number); +SELECT * FROM test.t3; +CALL sys.dbms_sql.close_cursor(cursor_number); +END; +$$ +CALL start_whole_call(); +sys.dbms_sql.EXECUTE(cursor_number) +1 +a +1 +1 +1 +3 +3 +3 +1 +CREATE FUNCTION start_flow() RETURN INT AS +BEGIN +RETURN sys.dbms_sql.OPEN_CURSOR(); +END; +CREATE PROCEDURE enclosed_close(cursor_number INT) AS +BEGIN +CALL sys.dbms_sql.close_cursor(cursor_number); +END; +$$ +SELECT start_flow() INTO @cursor_num; +CALL sys.dbms_sql.parse(@cursor_num, +'INSERT INTO test.t3 VALUES (1)', 1); +SELECT sys.dbms_sql.EXECUTE(@cursor_num); +sys.dbms_sql.EXECUTE(@cursor_num) +1 +CALL enclosed_close(@cursor_num); +SELECT * FROM test.t3; +a +1 +1 +1 +3 +3 +3 +1 +1 +# +# Test with DELETE statement +# +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; +CALL sys.dbms_sql.parse(@cursor_id, +'DELETE FROM test.t3 WHERE a=1', 1); +SELECT sys.dbms_sql.EXECUTE(@cursor_id); +sys.dbms_sql.EXECUTE(@cursor_id) +5 +SELECT * FROM test.t3; +a +3 +3 +3 +CALL sys.dbms_sql.close_cursor(@cursor_id); +# +# Test with UPDATE statement +# +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; +CALL sys.dbms_sql.parse(@cursor_id, +'UPDATE test.t3 SET a=2', 1); +SELECT sys.dbms_sql.EXECUTE(@cursor_id); +sys.dbms_sql.EXECUTE(@cursor_id) +3 +SELECT * FROM test.t3; +a +2 +2 +2 +CALL sys.dbms_sql.close_cursor(@cursor_id); +# +# Test with ALTER statement +# +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; +CALL sys.dbms_sql.parse(@cursor_id, 'ALTER TABLE test.t3 ADD b VARCHAR(40)', 1); +SELECT * FROM test.t3; +a b +2 NULL +2 NULL +2 NULL +CALL sys.dbms_sql.close_cursor(@cursor_id); +# +# Test showing no effect calling EXECUTE (again) on DDL statements +# +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; +CALL sys.dbms_sql.parse(@cursor_id, 'ALTER TABLE test.t3 MODIFY b VARCHAR(32)', 1); +SELECT sys.dbms_sql.EXECUTE(@cursor_id); +sys.dbms_sql.EXECUTE(@cursor_id) +NULL +SELECT * FROM test.t3; +a b +2 NULL +2 NULL +2 NULL +CALL sys.dbms_sql.close_cursor(@cursor_id); +# +# Test with ALTER statement that adds multiple columns +# +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; +CALL sys.dbms_sql.parse(@cursor_id, 'ALTER TABLE test.t3 ADD c VARCHAR(40), ADD creation_date DATE', 1); +SELECT * FROM test.t3; +a b c creation_date +2 NULL NULL NULL +2 NULL NULL NULL +2 NULL NULL NULL +CALL sys.dbms_sql.close_cursor(@cursor_id); +# +# Test with RENAME TABLE statement +# +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; +CALL sys.dbms_sql.parse(@cursor_id, 'RENAME TABLE test.t3 TO test.t1', 1); +SELECT * FROM test.t1; +a b c creation_date +2 NULL NULL NULL +2 NULL NULL NULL +2 NULL NULL NULL +CALL sys.dbms_sql.close_cursor(@cursor_id); +# +# Test with CREATE TABLE statement +# +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; +CALL sys.dbms_sql.parse(@cursor_id, 'CREATE TABLE test.t2 (a INT) ENGINE=InnoDB', 1); +Warnings: +Warning 1286 Unknown storage engine 'InnoDB' +Warning 1266 Using storage engine MyISAM for table 't2' +SELECT * FROM test.t2; +a +# +# Test with RENAME TABLES statement +# +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; +CALL sys.dbms_sql.parse(@cursor_id, 'RENAME TABLES test.t1 TO test.t3, test.t2 TO test.t4', 1); +SELECT * FROM test.t3; +a b c creation_date +2 NULL NULL NULL +2 NULL NULL NULL +2 NULL NULL NULL +SELECT * FROM test.t4; +a +# +# Test with DROP statement +# +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; +CALL sys.dbms_sql.parse(@cursor_id, 'DROP TABLE test.t3', 1); +SELECT * FROM test.t3; +ERROR 42S02: Table 'test.t3' doesn't exist +# +# Tests to ensure custom instruction cannot be used outside of the package +# +CALL dbmssql_execute ('s0'); +ERROR 42000: PROCEDURE test.dbmssql_execute does not exist +CREATE PROCEDURE p2() AS +BEGIN +CALL dbmssql_execute ('s0'); +END; +$$ +CALL p2(); +ERROR 42000: PROCEDURE test.dbmssql_execute does not exist +# +# Test giving unsupported SQL statement as code to the PARSE procedure +# +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; +CALL sys.dbms_sql.parse(@cursor_id, 'SET @old_sql_mode = @@session.sql_mode', 1); +ERROR HY000: missing or invalid option +DROP TABLE test.t4; +DROP FUNCTION f1; +DROP PROCEDURE p1; +DROP PROCEDURE p2; +DROP PROCEDURE start_whole_call; +DROP PROCEDURE enclosed_parse_exec_and_close; +DROP FUNCTION start_flow; +DROP PROCEDURE enclosed_close; diff --git a/mysql-test/suite/sysschema/r/pkg_dbms_utility-2k_errstack_limit-zh.result b/mysql-test/suite/sysschema/r/pkg_dbms_utility-2k_errstack_limit-zh.result new file mode 100644 index 0000000000000..810481d3f4cc2 --- /dev/null +++ b/mysql-test/suite/sysschema/r/pkg_dbms_utility-2k_errstack_limit-zh.result @@ -0,0 +1,71 @@ +# +# MDEV-34330: System package SYS.DBMS_UTILITY +# +SET sql_mode= oracle; +SET SESSION note_verbosity = ""; +SET NAMES utf8; +SET lc_messages=ZH_CN; +CREATE OR REPLACE PROCEDURE proc1 +IS +BEGIN +RAISE TOO_MANY_ROWS; +END; +// +CREATE OR REPLACE PACKAGE pkg1 +IS +PROCEDURE proc2; +END pkg1;// +CREATE OR REPLACE PACKAGE BODY pkg1 +IS +PROCEDURE proc2 +IS +BEGIN +proc1_1; +EXCEPTION +WHEN OTHERS +THEN +RAISE DUP_VAL_ON_INDEX; +END; +END pkg1;// +CREATE PROCEDURE proc3( ) +AS +BEGIN +pkg1.proc2; +EXCEPTION +WHEN DUP_VAL_ON_INDEX THEN +SELECT sys.DBMS_UTILITY.FORMAT_ERROR_STACK(); +END;// +SET @identifier := REPEAT('x', 500); +# +# Test FORMAT_ERROR_STACK with very long result string +# +CREATE OR REPLACE PROCEDURE cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc IS BEGIN proc1; EXCEPTION WHEN OTHERS THEN SIGNAL SQLSTATE 'HY000' SET MYSQL_ERRNO=3047, MESSAGE_TEXT=@identifier; END;// +CREATE OR REPLACE PROCEDURE bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb IS BEGIN cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc; EXCEPTION WHEN OTHERS THEN SIGNAL SQLSTATE 'HY000' SET MYSQL_ERRNO=3047, MESSAGE_TEXT=@identifier; END;// +CREATE OR REPLACE PROCEDURE aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa IS BEGIN bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; EXCEPTION WHEN OTHERS THEN SIGNAL SQLSTATE 'HY000' SET MYSQL_ERRNO=3047, MESSAGE_TEXT=@identifier; END;// +CREATE OR REPLACE PROCEDURE proc1_1 +IS +BEGIN +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; +EXCEPTION +WHEN OTHERS +THEN +SIGNAL SQLSTATE 'HY000' SET MYSQL_ERRNO=3047, MESSAGE_TEXT=@identifier; +END;// +CALL proc3( ); +sys.DBMS_UTILITY.FORMAT_ERROR_STACK() +1062: 重复条目'%-.192sT'在索引%d +4094: root.test.pkg1.proc2 at line 9 +3047: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +4094: root.test.proc1_1 at line 8 +3047: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +4094: root.test.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa at line 2 +3047: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +4094: root.test.bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb at line 2 +3047: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +DROP PROCEDURE proc1; +DROP PROCEDURE cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc; +DROP PROCEDURE bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; +DROP PROCEDURE aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; +DROP PROCEDURE proc1_1; +DROP PACKAGE pkg1; +DROP PROCEDURE proc3; diff --git a/mysql-test/suite/sysschema/r/pkg_dbms_utility.result b/mysql-test/suite/sysschema/r/pkg_dbms_utility.result new file mode 100644 index 0000000000000..1390b4414226d --- /dev/null +++ b/mysql-test/suite/sysschema/r/pkg_dbms_utility.result @@ -0,0 +1,347 @@ +# +# MDEV-34330: System package SYS.DBMS_UTILITY +# +SET sql_mode= oracle; +SET SESSION note_verbosity = ""; +# +# Test GET_TIME +# +BEGIN SET timestamp=1216359724; SELECT sys.DBMS_UTILITY.GET_TIME(); END;// +sys.DBMS_UTILITY.GET_TIME() +1216359724 +# +# Test GET_TIME with an argument +# +SELECT sys.DBMS_UTILITY.GET_TIME(1); +ERROR 42000: Incorrect number of arguments for FUNCTION sys.DBMS_UTILITY.get_time; expected 0, got 1 +CREATE OR REPLACE PROCEDURE proc1 +IS +BEGIN +RAISE TOO_MANY_ROWS; +END; +// +CREATE OR REPLACE PROCEDURE proc1_1 +IS +BEGIN +proc1; +EXCEPTION +WHEN OTHERS +THEN +RAISE DUP_VAL_ON_INDEX; +END;// +CREATE OR REPLACE PACKAGE pkg1 +IS +PROCEDURE proc2; +END pkg1;// +CREATE OR REPLACE PACKAGE BODY pkg1 +IS +PROCEDURE proc2 +IS +BEGIN +proc1_1; +EXCEPTION +WHEN OTHERS +THEN +RAISE DUP_VAL_ON_INDEX; +END; +END pkg1;// +CREATE PROCEDURE proc3( ) +AS +BEGIN +pkg1.proc2; +EXCEPTION +WHEN DUP_VAL_ON_INDEX THEN +SELECT sys.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(); +SELECT sys.DBMS_UTILITY.FORMAT_ERROR_STACK(); +END;// +# +# Test FORMAT_BACKTRACE & FORMAT_ERROR_STACK in an exception handler +# +CALL proc3( ); +sys.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE() +4094: root.test.proc1 at line 4 +4094: root.test.proc1_1 at line 4 +4094: root.test.pkg1.proc2 at line 5 +4094: root.test.proc3 at line 4 + +sys.DBMS_UTILITY.FORMAT_ERROR_STACK() +1062: Duplicate entry '%-.192sT' for key %d +4094: root.test.pkg1.proc2 at line 9 +1062: Duplicate entry '%-.192sT' for key %d +4094: root.test.proc1_1 at line 8 +1172: Result consisted of more than one row +4094: root.test.proc1 at line 4 +4094: root.test.proc1_1 at line 4 +4094: root.test.pkg1.proc2 at line 5 +4094: root.test.proc3 at line 4 + +CREATE OR REPLACE PROCEDURE proc1_2_2 +IS +BEGIN +SELECT 'hello'; +END; +// +CREATE OR REPLACE PROCEDURE proc1_2 +IS +BEGIN +proc1_2_2; +proc1; +EXCEPTION +WHEN OTHERS +THEN +RAISE DUP_VAL_ON_INDEX; +END;// +CREATE PROCEDURE proc6( ) +AS +BEGIN +proc1_2; +EXCEPTION +WHEN DUP_VAL_ON_INDEX THEN +SELECT sys.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(); +SELECT sys.DBMS_UTILITY.FORMAT_ERROR_STACK(); +END;// +# +# Test FORMAT_BACKTRACE & FORMAT_ERROR_STACK with called "non-error producing" routines, thereby exclusion from trace +# +CALL proc6( ); +hello +hello +sys.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE() +4094: root.test.proc1 at line 4 +4094: root.test.proc1_2 at line 5 +4094: root.test.proc6 at line 4 + +sys.DBMS_UTILITY.FORMAT_ERROR_STACK() +1062: Duplicate entry '%-.192sT' for key %d +4094: root.test.proc1_2 at line 9 +1172: Result consisted of more than one row +4094: root.test.proc1 at line 4 +4094: root.test.proc1_2 at line 5 +4094: root.test.proc6 at line 4 + +# +# Test FORMAT_BACKTRACE in nested block +# +CREATE PROCEDURE proc3_3( ) +AS +BEGIN +BEGIN +BEGIN +pkg1.proc2; +EXCEPTION +WHEN DUP_VAL_ON_INDEX THEN +SELECT sys.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(); +END; +END; +END;// +CALL proc3_3( ); +sys.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE() + +CREATE PROCEDURE proc4( ) +AS +BEGIN +pkg1.proc2; +EXCEPTION +WHEN DUP_VAL_ON_INDEX THEN +SET @x2 = 2; +END;// +# +# Test FORMAT_BACKTRACE outside SPs +# +CALL proc4( ); +SELECT sys.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(); +sys.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE() + +CREATE OR REPLACE PROCEDURE show_errors +IS +BEGIN +SELECT sys.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(); +END; +// +CREATE OR REPLACE PROCEDURE proc2 +IS +BEGIN +proc1_1; +EXCEPTION +WHEN OTHERS +THEN +RAISE DUP_VAL_ON_INDEX; +END;// +CREATE OR REPLACE PACKAGE TEST_PKG AS +PROCEDURE p2public; +END; +// +CREATE OR REPLACE PACKAGE BODY TEST_PKG AS +PROCEDURE p2public AS +BEGIN +SELECT 'in p2public'; +END; +BEGIN +proc2; +EXCEPTION +WHEN OTHERS +THEN +CALL show_errors(); +END; +// +# +# Test FORMAT_BACKTRACE & FORMAT_ERROR_STACK from a package initialization section +# +CALL TEST_PKG.p2public; +sys.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE() +4094: root.test.proc1 at line 4 +4094: root.test.proc1_1 at line 4 +4094: root.test.proc2 at line 4 +4094: root.test.test_pkg at line 7 + +in p2public +in p2public +SET @session_max_recursion_depth = @@SESSION.max_sp_recursion_depth; +SET @@session.max_sp_recursion_depth = 10; +SELECT @@session.max_sp_recursion_depth; +@@session.max_sp_recursion_depth +10 +DROP PROCEDURE IF EXISTS sp_add_records; +CREATE PROCEDURE sp_add_records (var1 INT,var2 INT) AS +BEGIN +SELECT var1,var2; +IF var1 < var2 THEN +CALL sp_add_records(var1+1,var2); +SELECT var1,var2; +ELSE +proc1; +END IF; +EXCEPTION +WHEN OTHERS +THEN +RAISE DUP_VAL_ON_INDEX; +END;// +CREATE PROCEDURE proc5( ) +AS +BEGIN +CALL sp_add_records(0,8); +EXCEPTION +WHEN DUP_VAL_ON_INDEX THEN +SELECT sys.DBMS_UTILITY.FORMAT_ERROR_STACK(); +END;// +CALL proc5( ); +var1 var2 +0 8 +var1 var2 +1 8 +var1 var2 +2 8 +var1 var2 +3 8 +var1 var2 +4 8 +var1 var2 +5 8 +var1 var2 +6 8 +var1 var2 +7 8 +var1 var2 +8 8 +sys.DBMS_UTILITY.FORMAT_ERROR_STACK() +1062: Duplicate entry '%-.192sT' for key %d +4094: root.test.sp_add_records at line 14 +1062: Duplicate entry '%-.192sT' for key %d +4094: root.test.sp_add_records at line 14 +1062: Duplicate entry '%-.192sT' for key %d +4094: root.test.sp_add_records at line 14 +1062: Duplicate entry '%-.192sT' for key %d +4094: root.test.sp_add_records at line 14 +1062: Duplicate entry '%-.192sT' for key %d +4094: root.test.sp_add_records at line 14 +1062: Duplicate entry '%-.192sT' for key %d +4094: root.test.sp_add_records at line 14 +1062: Duplicate entry '%-.192sT' for key %d +4094: root.test.sp_add_records at line 14 +1062: Duplicate entry '%-.192sT' for key %d +4094: root.test.sp_add_records at line 14 +1062: Duplicate entry '%-.192sT' for key %d +4094: root.test.sp_add_records at line 14 +1172: Result consisted of more than one row +4094: root.test.proc1 at line 4 +4094: root.test.sp_add_records at line 9 +4094: root.test.sp_add_records at line 6 +4094: root.test.sp_add_records at line 6 +4094: root.test.sp_add_records at line 6 +4094: root.test.sp_add_records at line 6 +4094: root.test.sp_add_records at line 6 +4094: root.test.sp_add_records at line 6 +4094: root.test.sp_add_records at line 6 +4094: root.test.sp_add_records at line 6 +4094: root.test.proc5 at line 4 + +SET @identifier := REPEAT('x', 500); +# +# Test FORMAT_ERROR_STACK with very long result string +# +CREATE OR REPLACE PROCEDURE cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc IS BEGIN proc1; EXCEPTION WHEN OTHERS THEN SIGNAL SQLSTATE 'HY000' SET MYSQL_ERRNO=3047, MESSAGE_TEXT=@identifier; END;// +CREATE OR REPLACE PROCEDURE bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb IS BEGIN cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc; EXCEPTION WHEN OTHERS THEN SIGNAL SQLSTATE 'HY000' SET MYSQL_ERRNO=3047, MESSAGE_TEXT=@identifier; END;// +CREATE OR REPLACE PROCEDURE aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa IS BEGIN bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; EXCEPTION WHEN OTHERS THEN SIGNAL SQLSTATE 'HY000' SET MYSQL_ERRNO=3047, MESSAGE_TEXT=@identifier; END;// +CREATE OR REPLACE PROCEDURE proc1_1 +IS +BEGIN +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; +EXCEPTION +WHEN OTHERS +THEN +SIGNAL SQLSTATE 'HY000' SET MYSQL_ERRNO=3047, MESSAGE_TEXT=@identifier; +END;// +CREATE PROCEDURE proc3_2( ) +AS +BEGIN +pkg1.proc2; +EXCEPTION +WHEN DUP_VAL_ON_INDEX THEN +SELECT sys.DBMS_UTILITY.FORMAT_ERROR_STACK(); +END;// +CALL proc3_2( ); +sys.DBMS_UTILITY.FORMAT_ERROR_STACK() +1062: Duplicate entry '%-.192sT' for key %d +4094: root.test.pkg1.proc2 at line 9 +3047: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +4094: root.test.proc1_1 at line 8 +3047: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +4094: root.test.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa at line 2 +3047: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +4094: root.test.bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb at line 2 +3047: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +# +# Test FORMAT_BACKTRACE & FORMAT_ERROR_STACK when no error occurs +# +CREATE PROCEDURE p1() AS +BEGIN +CALL sys.DBMS_TRANSACTION.COMMIT; +EXCEPTION +WHEN OTHERS +THEN +SELECT sys.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(); +END; +$$ +CALL p1(); +sys.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE() + +DROP PROCEDURE proc1_2_2; +DROP PROCEDURE proc1_2; +DROP PROCEDURE proc6; +DROP PROCEDURE p1; +DROP PROCEDURE cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc; +DROP PROCEDURE bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; +DROP PROCEDURE aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; +DROP PROCEDURE proc3_2; +DROP PROCEDURE show_errors; +DROP PROCEDURE proc2; +DROP PACKAGE TEST_PKG; +DROP PROCEDURE proc1; +DROP PROCEDURE proc1_1; +DROP PACKAGE pkg1; +DROP PROCEDURE proc3_3; +DROP PROCEDURE proc3; +DROP PROCEDURE proc4; +DROP PROCEDURE IF EXISTS sp_add_records; +DROP PROCEDURE IF EXISTS proc5; +SET @@SESSION.max_sp_recursion_depth = @session_max_recursion_depth; diff --git a/mysql-test/suite/sysschema/r/pkg_utl_i18n-non_xliterate.result b/mysql-test/suite/sysschema/r/pkg_utl_i18n-non_xliterate.result new file mode 100644 index 0000000000000..ad916e0990fde --- /dev/null +++ b/mysql-test/suite/sysschema/r/pkg_utl_i18n-non_xliterate.result @@ -0,0 +1,21 @@ +SET sql_mode= oracle; +SET NAMES 'utf8mb3'; +# +# Test RAW_TO_CHAR with utf8 charset source +# +SELECT sys.UTL_I18N.RAW_TO_CHAR(x'e38182', 'utf8'); +sys.UTL_I18N.RAW_TO_CHAR(x'e38182', 'utf8') +あ +SET NAMES 'utf8mb4'; +# +# Test RAW_TO_CHAR with utf8mb3 charset source +# +SELECT sys.UTL_I18N.RAW_TO_CHAR(x'e38182', 'utf8mb3'); +sys.UTL_I18N.RAW_TO_CHAR(x'e38182', 'utf8mb3') +あ +# +# Test STRING_TO_RAW +# +SELECT HEX(sys.UTL_I18N.STRING_TO_RAW('あ', 'ucs2')); +HEX(sys.UTL_I18N.STRING_TO_RAW('あ', 'ucs2')) +3042 diff --git a/mysql-test/suite/sysschema/r/pkg_utl_i18n-sjis.result b/mysql-test/suite/sysschema/r/pkg_utl_i18n-sjis.result new file mode 100644 index 0000000000000..3dc091f4c5982 --- /dev/null +++ b/mysql-test/suite/sysschema/r/pkg_utl_i18n-sjis.result @@ -0,0 +1,1122 @@ +# +# MDEV-34331: System package SYS.UTL_I18N +# +# +# transliterate test with sjis +# +SET sql_mode= oracle; +SET NAMES sjis; +# +# Test transliterate with valid input +# +SET collation_connection=sjis_japanese_ci; +CREATE TABLE t1 (b VARCHAR(2)); +INSERT INTO t1 VALUES ('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'); +INSERT INTO t1 VALUES ('8'),('9'),('A'),('B'),('C'),('D'),('E'),('F'); +CREATE TEMPORARY TABLE head AS SELECT CONCAT(b1.b, b2.b) AS head FROM t1 b1, t1 b2; +CREATE TEMPORARY TABLE tail AS SELECT CONCAT(b1.b, b2.b) AS tail FROM t1 b1, t1 b2; +DROP TABLE t1; +CREATE TABLE t1 AS +SELECT CONCAT(head, tail) AS code, ' ' AS a +FROM head, tail +WHERE (head = '82') AND (tail BETWEEN '9F' AND 'F1') +ORDER BY head, tail; +INSERT IGNORE INTO t1 (code) SELECT CONCAT('83', head) FROM head +WHERE (head BETWEEN '40' AND '7E') ORDER BY head; +Warnings: +Warning 1364 Field 'a' doesn't have a default value +INSERT IGNORE INTO t1 (code) SELECT CONCAT('83', head) FROM head +WHERE (head BETWEEN '80' AND '96') ORDER BY head; +Warnings: +Warning 1364 Field 'a' doesn't have a default value +INSERT IGNORE t1 (code) SELECT head FROM head WHERE (head BETWEEN 'A1' AND 'DD'); +Warnings: +Warning 1364 Field 'a' doesn't have a default value +DROP TEMPORARY TABLE head, tail; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE "t1" ( + "code" varchar(8) DEFAULT NULL, + "a" varchar(1) CHARACTER SET sjis COLLATE sjis_japanese_ci NOT NULL +) +UPDATE IGNORE t1 SET a=UNHEX(code) ORDER BY code; +SELECT GROUP_CONCAT(a) FROM t1 WHERE (code BETWEEN 'A1' AND 'DD') INTO @hw_char_arr; +SELECT GROUP_CONCAT(a) FROM t1 WHERE (code BETWEEN '8340' AND '837e') INTO @fw_char_arr; +SELECT GROUP_CONCAT(a) FROM t1 WHERE (code BETWEEN '8380' AND '8396') INTO @fw_char_arr2; +SELECT GROUP_CONCAT(a) FROM t1 WHERE (code BETWEEN '829f' AND '82f1') INTO @hi_char_arr2; +DROP TABLE t1; +SET NAMES sjis; +SET collation_connection=sjis_japanese_ci; +CREATE PROCEDURE f1 (array_string VARCHAR2(255) CHARACTER SET sjis) +AS +BEGIN +DECLARE +array_length INT; +element VARCHAR2(255) CHARACTER SET sjis; +temp_string VARCHAR2(255) CHARACTER SET sjis; +BEGIN +SET array_length = (LENGTH(array_string) - LENGTH(REPLACE(array_string, ',', ''))) + 1; +SET temp_string = array_string; +<> +FOR ia IN 1 .. array_length +LOOP +SET element = SUBSTRING_INDEX(SUBSTRING_INDEX(temp_string, ',', 1), ',', -1); +SELECT element; +SELECT sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana'); +SET temp_string = SUBSTRING(temp_string, LENGTH(element) + 2); +END LOOP la; +END; +END; +/ +# +# feed all halfwidth katakana characters to the transliterate function +# +CALL f1(@hw_char_arr); +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +X +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +^ +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +~ +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +B +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +A +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +` +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +u +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +C +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +c +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +v +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +E +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +e +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +A +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +G +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +g +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +D +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +I +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +i +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +J +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +j +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +@ +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +L +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +k +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +B +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +N +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +l +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +D +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +P +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +m +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +F +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +R +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +n +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +H +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +T +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +q +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +V +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +t +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +X +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +w +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +Z +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +z +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +b +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +\ +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') +} +Warnings: +Note 1585 This function 'transliterate' has the same name as a native function +Note 1585 This function 'transliterate' has the same name as a native function +Note 1246 Converting column 'dst_charset' from VARCHAR to TEXT +Note 1246 Converting column 'sourced_jc' from VARCHAR to TEXT +Note 1246 Converting column 'targeted_sourced_jc' from VARCHAR to TEXT +DROP PROCEDURE f1; +CREATE PROCEDURE f2 (array_string VARCHAR2(255) CHARACTER SET sjis) +AS +BEGIN +DECLARE +array_length INT; +element VARCHAR2(255) CHARACTER SET sjis; +temp_string VARCHAR2(255) CHARACTER SET sjis; +BEGIN +SET array_length = (LENGTH(array_string) - LENGTH(REPLACE(array_string, ',', ''))) + 1; +SET temp_string = array_string; +<> +FOR ia IN 1 .. array_length +LOOP +SET element = SUBSTRING_INDEX(SUBSTRING_INDEX(temp_string, ',', 1), ',', -1); +SELECT element; +SELECT sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana'); +SET temp_string = SUBSTRING(temp_string, LENGTH(element) + 2); +END LOOP la; +END; +END; +/ +# +# feed fullwidth katakana characters with codepoints '8340' upto '837e' to the transliterate function +# +CALL f2(@fw_char_arr); +element +@ +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +A +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +B +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +C +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +D +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +E +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +F +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +G +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +H +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +I +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +J +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +K +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +L +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +M +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +N +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +O +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +P +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +Q +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +R +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +S +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +T +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +U +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +V +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +W +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +X +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +Y +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +Z +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +[ +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +\ +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +] +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +^ +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +_ +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +` +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +a +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +b +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +c +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +d +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +e +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +f +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +g +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +h +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +i +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +j +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +k +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +l +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +m +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +n +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +o +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +p +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +q +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +r +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +s +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +t +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +u +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +v +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +w +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +x +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +y +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +z +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +{ +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +| +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +} +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element +~ +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +Warnings: +Note 1585 This function 'transliterate' has the same name as a native function +Note 1585 This function 'transliterate' has the same name as a native function +Note 1246 Converting column 'dst_charset' from VARCHAR to TEXT +Note 1246 Converting column 'sourced_jc' from VARCHAR to TEXT +Note 1246 Converting column 'targeted_sourced_jc' from VARCHAR to TEXT +# +# feed fullwidth katakana characters with codepoints '8380' upto '8396' to the transliterate function +# +CALL f2(@fw_char_arr2); +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +# +# feed all hiragana characters to the transliterate function +# +CALL f2(@hi_char_arr2); +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +DROP PROCEDURE f2; +# +# Test combination of fullwidth, hiragana & halfwidth characters with the 'fwkatakana_hwkatakana' (mode) name +# +SELECT sys.UTL_I18N.TRANSLITERATE('A', 'fwkatakana_hwkatakana'); +sys.UTL_I18N.TRANSLITERATE('A', 'fwkatakana_hwkatakana') + +# +# Test Latin 'a' character with the 'kana_hwkatakana' (mode) name +# +SELECT sys.UTL_I18N.TRANSLITERATE('a', 'kana_hwkatakana'); +sys.UTL_I18N.TRANSLITERATE('a', 'kana_hwkatakana') +a +# +# Test Latin 'a' character with the 'hwkatakana_fwkatakana' (mode) name +# +SELECT sys.UTL_I18N.TRANSLITERATE('a', 'hwkatakana_fwkatakana'); +sys.UTL_I18N.TRANSLITERATE('a', 'hwkatakana_fwkatakana') +a +# +# Test the 'kana_hwkatakana' (mode) name +# +SELECT sys.UTL_I18N.TRANSLITERATE('', 'kana_hwkatakana'); +sys.UTL_I18N.TRANSLITERATE('', 'kana_hwkatakana') + +# +# Test the 'hwkatakana_fwkatakana' (mode) name +# +SELECT sys.UTL_I18N.TRANSLITERATE('', 'hwkatakana_fwkatakana'); +sys.UTL_I18N.TRANSLITERATE('', 'hwkatakana_fwkatakana') +A +# +# Test the 'hwkatakana_fwkatakana' (mode) name +# +SELECT sys.UTL_I18N.TRANSLITERATE('A1', 'hwkatakana_fwkatakana'); +sys.UTL_I18N.TRANSLITERATE('A1', 'hwkatakana_fwkatakana') +A1 +# +# Test input string with introducer +# +SELECT sys.UTL_I18N.TRANSLITERATE(_sjis'', 'kana_hwkatakana'); +sys.UTL_I18N.TRANSLITERATE(_sjis'', 'kana_hwkatakana') + +# +# Test input string with collate clause +# +SELECT sys.UTL_I18N.TRANSLITERATE('' COLLATE sjis_japanese_ci, 'kana_hwkatakana'); +sys.UTL_I18N.TRANSLITERATE('' COLLATE sjis_japanese_ci, 'kana_hwkatakana') + +# +# Test input string with introducer & collate clause +# +SELECT sys.UTL_I18N.TRANSLITERATE(_sjis'' COLLATE sjis_japanese_ci, 'kana_hwkatakana'); +sys.UTL_I18N.TRANSLITERATE(_sjis'' COLLATE sjis_japanese_ci, 'kana_hwkatakana') + +# +# Test with blank (mode) name +# +SELECT sys.UTL_I18N.TRANSLITERATE('', ' '); +ERROR HY000: Invalid argument error: This features was not implemented. in function transliterate. +# +# Test with empty input string +# +SELECT sys.UTL_I18N.TRANSLITERATE('', 'hwkatakana_fwkatakana'); +sys.UTL_I18N.TRANSLITERATE('', 'hwkatakana_fwkatakana') + +# +# Test TRANSLITERATE with empty name +# +SELECT sys.UTL_I18N.TRANSLITERATE('', ''); +ERROR HY000: Invalid argument error: This features was not implemented. in function transliterate. +# +# Test TRANSLITERATE with null name +# +SELECT sys.UTL_I18N.TRANSLITERATE(NULL, 'hwkatakana_fwkatakana'); +sys.UTL_I18N.TRANSLITERATE(NULL, 'hwkatakana_fwkatakana') +NULL +# +# Test TRANSLITERATE with non sjis & EUC-JP characters +# +SELECT sys.UTL_I18N.TRANSLITERATE(_utf8'', 'hwkatakana_fwkatakana'); +ERROR HY000: Invalid argument error: wrong number or types of argument/s in function transliterate. diff --git a/mysql-test/suite/sysschema/r/pkg_utl_i18n-ujis.result b/mysql-test/suite/sysschema/r/pkg_utl_i18n-ujis.result new file mode 100644 index 0000000000000..f4ea414bab3f9 --- /dev/null +++ b/mysql-test/suite/sysschema/r/pkg_utl_i18n-ujis.result @@ -0,0 +1,1114 @@ +# +# MDEV-34331: System package SYS.UTL_I18N +# +# +# transliterate Tests with ujis +# +SET sql_mode= oracle; +SET NAMES ujis; +# +# Test transliterate with valid input +# +SET collation_connection=ujis_japanese_ci; +CREATE TABLE t1 (b VARCHAR(2)); +INSERT INTO t1 VALUES ('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'); +INSERT INTO t1 VALUES ('8'),('9'),('A'),('B'),('C'),('D'),('E'),('F'); +CREATE TEMPORARY TABLE head AS SELECT CONCAT(b1.b, b2.b) AS head FROM t1 b1, t1 b2; +CREATE TEMPORARY TABLE tail AS SELECT CONCAT(b1.b, b2.b) AS tail FROM t1 b1, t1 b2; +DROP TABLE t1; +CREATE TABLE t1 AS SELECT 'XXXXXX' AS code, ' ' AS a LIMIT 0; +INSERT IGNORE INTO t1 (code) SELECT CONCAT('8E', head) FROM head +WHERE (head BETWEEN 'A1' AND 'DD') ORDER BY head; +Warnings: +Warning 1364 Field 'a' doesn't have a default value +INSERT IGNORE INTO t1 (code) SELECT CONCAT('A4', head) FROM head +WHERE (head BETWEEN 'A1' AND 'F3') ORDER BY head; +Warnings: +Warning 1364 Field 'a' doesn't have a default value +INSERT IGNORE INTO t1 (code) SELECT CONCAT('A5', head) FROM head +WHERE (head BETWEEN 'A1' AND 'F6') ORDER BY head; +Warnings: +Warning 1364 Field 'a' doesn't have a default value +DROP TEMPORARY TABLE head, tail; +SHOW CREATE TABLE t1; +Table Create Table +t1 CREATE TABLE "t1" ( + "code" varchar(6) CHARACTER SET ujis COLLATE ujis_japanese_ci NOT NULL, + "a" varchar(1) CHARACTER SET ujis COLLATE ujis_japanese_ci NOT NULL +) +UPDATE IGNORE t1 SET a=UNHEX(code) ORDER BY code; +SELECT GROUP_CONCAT(a) FROM t1 WHERE (code BETWEEN '8eA1' AND '8eDD') INTO @hw_char_arr; +SELECT GROUP_CONCAT(a) FROM t1 WHERE (code BETWEEN 'a5a1' AND 'a5f6') INTO @fw_char_arr; +SELECT GROUP_CONCAT(a) FROM t1 WHERE (code BETWEEN 'a4a1' AND 'a4f3') INTO @hi_char_arr; +DROP TABLE t1; +SET NAMES ujis; +SET collation_connection=ujis_japanese_ci; +CREATE PROCEDURE f1 (array_string VARCHAR2(255) CHARACTER SET ujis) +AS +BEGIN +DECLARE +array_length INT; +element VARCHAR2(255) CHARACTER SET ujis; +temp_string VARCHAR2(255) CHARACTER SET ujis; +BEGIN +SET array_length = (LENGTH(array_string) - LENGTH(REPLACE(array_string, ',', ''))) + 1; +SET temp_string = array_string; +<> +FOR ia IN 1 .. array_length +LOOP +SET element = SUBSTRING_INDEX(SUBSTRING_INDEX(temp_string, ',', 1), ',', -1); +SELECT element; +SELECT sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana'); +SET temp_string = SUBSTRING(temp_string, LENGTH(element) + 2); +END LOOP la; +END; +END; +/ +# +# Test transliterate function with all EUC-JP halfwidth katakana characters +# +CALL f1(@hw_char_arr); +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana') + +Warnings: +Note 1585 This function 'transliterate' has the same name as a native function +Note 1585 This function 'transliterate' has the same name as a native function +Note 1246 Converting column 'dst_charset' from VARCHAR to TEXT +Note 1246 Converting column 'sourced_jc' from VARCHAR to TEXT +Note 1246 Converting column 'targeted_sourced_jc' from VARCHAR to TEXT +DROP PROCEDURE f1; +CREATE PROCEDURE f2 (array_string VARCHAR2(255) CHARACTER SET ujis) +AS +BEGIN +DECLARE +array_length INT; +element VARCHAR2(255) CHARACTER SET ujis; +temp_string VARCHAR2(255) CHARACTER SET ujis; +BEGIN +SET array_length = (LENGTH(array_string) - LENGTH(REPLACE(array_string, ',', ''))) + 1; +SET temp_string = array_string; +<> +FOR ia IN 1 .. array_length +LOOP +SET element = SUBSTRING_INDEX(SUBSTRING_INDEX(temp_string, ',', 1), ',', -1); +SELECT element; +SELECT sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana'); +SET temp_string = SUBSTRING(temp_string, LENGTH(element) + 2); +END LOOP la; +END; +END; +/ +# +# Test transliterate function with all EUC-JP fullwidth katakana characters +# +CALL f2(@fw_char_arr); +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') +Ž +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') +Î +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') +Ď +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') +ʎ +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') +ʎ +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') +ˎ +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') +ˎ +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') +̎ +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') +̎ +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') +͎ +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') +͎ +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') +Ύ +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') +Ύ +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +Warnings: +Note 1585 This function 'transliterate' has the same name as a native function +Note 1585 This function 'transliterate' has the same name as a native function +Note 1246 Converting column 'dst_charset' from VARCHAR to TEXT +Note 1246 Converting column 'sourced_jc' from VARCHAR to TEXT +Note 1246 Converting column 'targeted_sourced_jc' from VARCHAR to TEXT +# +# Test transliterate function with all EUC-JP hiragana characters +# +CALL f2(@hi_char_arr); +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') +Ž +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') +Î +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') +Ď +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') +ʎ +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') +ʎ +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') +ˎ +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') +ˎ +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') +̎ +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') +̎ +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') +͎ +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') +͎ +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') +Ύ +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') +Ύ +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +element + +sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana') + +DROP PROCEDURE f2; +# +# Test combination of fullwidth, hiragana & halfwidth characters with the 'fwkatakana_hwkatakana' (mode) name +# +SELECT sys.UTL_I18N.TRANSLITERATE('', 'fwkatakana_hwkatakana'); +sys.UTL_I18N.TRANSLITERATE('', 'fwkatakana_hwkatakana') + +# +# Test Latin 'a' character with the 'kana_hwkatakana' (mode) name +# +SELECT sys.UTL_I18N.TRANSLITERATE('a', 'kana_hwkatakana'); +sys.UTL_I18N.TRANSLITERATE('a', 'kana_hwkatakana') +a +# +# Test Latin 'a' character with the 'hwkatakana_fwkatakana' (mode) name +# +SELECT sys.UTL_I18N.TRANSLITERATE('a', 'hwkatakana_fwkatakana'); +sys.UTL_I18N.TRANSLITERATE('a', 'hwkatakana_fwkatakana') +a +# +# Test the 'kana_hwkatakana' (mode) name +# +SELECT sys.UTL_I18N.TRANSLITERATE('', 'kana_hwkatakana'); +sys.UTL_I18N.TRANSLITERATE('', 'kana_hwkatakana') + +# +# Test the 'hwkatakana_fwkatakana' (mode) name +# +SELECT sys.UTL_I18N.TRANSLITERATE('', 'hwkatakana_fwkatakana'); +sys.UTL_I18N.TRANSLITERATE('', 'hwkatakana_fwkatakana') + +# +# Test the 'hwkatakana_fwkatakana' (mode) name +# +SELECT sys.UTL_I18N.TRANSLITERATE('1', 'hwkatakana_fwkatakana'); +sys.UTL_I18N.TRANSLITERATE('1', 'hwkatakana_fwkatakana') +1 +# +# Test input string with introducer +# +SELECT sys.UTL_I18N.TRANSLITERATE(_ujis'', 'kana_hwkatakana'); +sys.UTL_I18N.TRANSLITERATE(_ujis'', 'kana_hwkatakana') + +# +# Test input string with collate clause +# +SELECT sys.UTL_I18N.TRANSLITERATE('' COLLATE ujis_japanese_ci, 'kana_hwkatakana'); +sys.UTL_I18N.TRANSLITERATE('' COLLATE ujis_japanese_ci, 'kana_hwkatakana') + +# +# Test input string with introducer & collate clause +# +SELECT sys.UTL_I18N.TRANSLITERATE(_ujis'' COLLATE ujis_japanese_ci, 'kana_hwkatakana'); +sys.UTL_I18N.TRANSLITERATE(_ujis'' COLLATE ujis_japanese_ci, 'kana_hwkatakana') + +# +# Test with blank (mode) name +# +SELECT sys.UTL_I18N.TRANSLITERATE('', ' '); +ERROR HY000: Invalid argument error: This features was not implemented. in function transliterate. +# +# Test with empty input string +# +SELECT sys.UTL_I18N.TRANSLITERATE('', 'hwkatakana_fwkatakana'); +sys.UTL_I18N.TRANSLITERATE('', 'hwkatakana_fwkatakana') + +# +# Test TRANSLITERATE with empty name +# +SELECT sys.UTL_I18N.TRANSLITERATE('', ''); +ERROR HY000: Invalid argument error: This features was not implemented. in function transliterate. +# +# Test TRANSLITERATE with null name +# +SELECT sys.UTL_I18N.TRANSLITERATE(NULL, 'hwkatakana_fwkatakana'); +sys.UTL_I18N.TRANSLITERATE(NULL, 'hwkatakana_fwkatakana') +NULL +# +# Test TRANSLITERATE with non sjis & EUC-JP characters +# +SELECT sys.UTL_I18N.TRANSLITERATE(_utf8'', 'hwkatakana_fwkatakana'); +ERROR HY000: Invalid argument error: wrong number or types of argument/s in function transliterate. diff --git a/mysql-test/suite/sysschema/r/pkg_utl_i18n.result b/mysql-test/suite/sysschema/r/pkg_utl_i18n.result new file mode 100644 index 0000000000000..9d96ea6101989 --- /dev/null +++ b/mysql-test/suite/sysschema/r/pkg_utl_i18n.result @@ -0,0 +1,52 @@ +# +# MDEV-34331: System package SYS.UTL_I18N +# +SET sql_mode= oracle; +SET NAMES ujis; +# +# Test assigning ANY_CS charset to a local variable +# +CREATE FUNCTION f1 () RETURN VARCHAR2(10) AS +BEGIN +DECLARE +b VARCHAR2(10) CHARACTER SET ANY_CS DEFAULT 'a'; +BEGIN +RETURN b; +END; +END; +/ +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'ANY_CS DEFAULT 'a'; +BEGIN +RETURN b; +END; +END' at line 4 +# +# Test assigning ANY_CS charset to a local variable of row type +# +DROP PROCEDURE IF EXISTS p1; +Warnings: +Note 1305 PROCEDURE test.p1 does not exist +CREATE PROCEDURE p1 AS +rec ROW(a INT, b VARCHAR2(32) CHARACTER SET ANY_CS); +BEGIN +END; +/ +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'ANY_CS); +BEGIN +END' at line 2 +DROP PROCEDURE IF EXISTS p1; +Warnings: +Note 1305 PROCEDURE test.p1 does not exist +# +# Test row type as SP parameter +# +CREATE PROCEDURE p2(r ROW(a INT, b VARCHAR2(32) CHARACTER SET ANY_CS)) AS +BEGIN +END; +/ +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'ANY_CS)) AS +BEGIN +END' at line 1 +DROP PROCEDURE IF EXISTS p2; +Warnings: +Note 1305 PROCEDURE test.p2 does not exist diff --git a/mysql-test/suite/sysschema/t/pkg_dbms_random.test b/mysql-test/suite/sysschema/t/pkg_dbms_random.test new file mode 100644 index 0000000000000..77f11f3eaddad --- /dev/null +++ b/mysql-test/suite/sysschema/t/pkg_dbms_random.test @@ -0,0 +1,65 @@ +-- source include/have_perfschema.inc + +--echo # +--echo # MDEV-34327: System package SYS.DBMS_RANDOM +--echo # + +SET sql_mode= oracle; + +SET SESSION note_verbosity = ""; + +SELECT SESSION_Value FROM INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE VARIABLE_NAME LIKE 'rand_seed1' INTO @orig_seed1; +SELECT SESSION_Value FROM INFORMATION_SCHEMA.SYSTEM_VARIABLES WHERE VARIABLE_NAME LIKE 'rand_seed2' INTO @orig_seed2; + +--echo # +--echo # Test INITIALIZE +--echo # +CALL sys.DBMS_RANDOM.INITIALIZE(1); + +--echo # +--echo # Test INITIALIZE without an argument +--echo # +--error ER_SP_WRONG_NO_OF_ARGS +CALL sys.DBMS_RANDOM.INITIALIZE(); + +--disable_ps_protocol +--echo # +--echo # Test VALUE +--echo # +SELECT sys.DBMS_RANDOM.VALUE(); +SELECT sys.DBMS_RANDOM.VALUE(); +SELECT sys.DBMS_RANDOM.VALUE(); + +--echo # +--echo # Test VALUE with an argument +--echo # +--error ER_SP_WRONG_NO_OF_ARGS +SELECT sys.DBMS_RANDOM.VALUE(1); + +--echo # +--echo # Test RANDOM +--echo # +SELECT sys.DBMS_RANDOM.RANDOM(); +SELECT sys.DBMS_RANDOM.RANDOM(); +SELECT sys.DBMS_RANDOM.RANDOM(); +--enable_ps_protocol + +--echo # +--echo # Test RANDOM with an argument +--echo # +--error ER_SP_WRONG_NO_OF_ARGS +SELECT sys.DBMS_RANDOM.RANDOM(1); + +--echo # +--echo # Test TERMINATE +--echo # +CALL sys.DBMS_RANDOM.TERMINATE(); + +--echo # +--echo # Test TERMINATE with an argument +--echo # +--error ER_SP_WRONG_NO_OF_ARGS +CALL sys.DBMS_RANDOM.TERMINATE(1); + +SET SESSION rand_seed1 = CAST(@orig_seed1 AS INT); +SET SESSION rand_seed2 = CAST(@orig_seed2 AS INT); diff --git a/mysql-test/suite/sysschema/t/pkg_dbms_sql.test b/mysql-test/suite/sysschema/t/pkg_dbms_sql.test new file mode 100644 index 0000000000000..25572838a5292 --- /dev/null +++ b/mysql-test/suite/sysschema/t/pkg_dbms_sql.test @@ -0,0 +1,327 @@ +-- source include/have_perfschema.inc + +--echo # +--echo # MDEV-34330: System package SYS.DBMS_SQL +--echo # + +SET sql_mode= oracle; + +SET SESSION note_verbosity = ""; + +--disable_ps_protocol +--echo # +--echo # Test OPEN_CURSOR +--echo # +SELECT sys.dbms_sql.OPEN_CURSOR(); +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; + +CREATE TABLE test.t3 (a INT) ENGINE=InnoDB; + + +--echo # +--echo # Test PARSE, EXECUTE & CLOSE_CURSOR with an INSERT statement +--echo # +CALL sys.dbms_sql.parse(@cursor_id, + 'INSERT INTO test.t3 VALUES (1)', 1); + +SELECT sys.dbms_sql.EXECUTE(@cursor_id); + +SELECT * FROM test.t3; + +CALL sys.dbms_sql.close_cursor(@cursor_id); + + +--echo # +--echo # Test PARSE with leading whitespace on the input +--echo # +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; +CALL sys.dbms_sql.parse(@cursor_id, + ' INSERT INTO test.t3 VALUES (1)', 1); + +SELECT sys.dbms_sql.EXECUTE(@cursor_id); + +SELECT * FROM test.t3; + +CALL sys.dbms_sql.close_cursor(@cursor_id); + + +--echo # +--echo # Test PARSE with multiple leading whitespace on the input +--echo # +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; + +CALL sys.dbms_sql.parse(@cursor_id, + ' INSERT INTO test.t3 VALUES (1)', 1); + +SELECT sys.dbms_sql.EXECUTE(@cursor_id); + +SELECT * FROM test.t3; + +CALL sys.dbms_sql.close_cursor(@cursor_id); + + +--echo # +--echo # Test CLOSE_CURSOR with an already-closed cursor +--echo # +--error ER_STD_INVALID_ARGUMENT +CALL sys.dbms_sql.close_cursor(@cursor_id); + + +DELIMITER $$; +CREATE FUNCTION f1() RETURN VARCHAR2(255) AS +BEGIN + RETURN 'INSERT INTO test.t3 VALUES (3)'; +END; +$$ +DELIMITER ;$$ + + +--echo # +--echo # Test PARSE with SR func call output as 'input (code)' +--echo # +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; + +CALL sys.dbms_sql.parse(@cursor_id, f1(), 1); + +SELECT sys.dbms_sql.EXECUTE(@cursor_id); + +SELECT * FROM test.t3; + +CALL sys.dbms_sql.close_cursor(@cursor_id); + + +--echo # +--echo # Test PARSE with native func call output as 'input (code)' +--echo # +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; + +CALL sys.dbms_sql.parse(@cursor_id, CONCAT('INSERT INTO test.t3 VALUES (3)'), 1); + +SELECT sys.dbms_sql.EXECUTE(@cursor_id); + +SELECT * FROM test.t3; + +CALL sys.dbms_sql.close_cursor(@cursor_id); + + +--echo # +--echo # Test SP variable as 'input (code)' +--echo # +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; + +DELIMITER $$; +CREATE PROCEDURE p1(input VARCHAR2(255)) AS +BEGIN + CALL sys.dbms_sql.parse(@cursor_id, input, 1); +END; +$$ +DELIMITER ;$$ + +CALL p1('INSERT INTO test.t3 VALUES (3)'); + +SELECT sys.dbms_sql.EXECUTE(@cursor_id); + +SELECT * FROM test.t3; + +CALL sys.dbms_sql.close_cursor(@cursor_id); + + + +--echo # +--echo # Tests where OPEN_CURSOR, CLOSE_CURSOR etc are called within stored routines (functions/procedures) +--echo # + +DELIMITER $$; +CREATE PROCEDURE start_whole_call() AS +BEGIN + DECLARE + cursor_number INT; + BEGIN + SET cursor_number = sys.dbms_sql.OPEN_CURSOR(); + CALL enclosed_parse_exec_and_close(cursor_number); + END; +END; + +CREATE PROCEDURE enclosed_parse_exec_and_close(cursor_number INT) AS +BEGIN + CALL sys.dbms_sql.parse(cursor_number, + 'INSERT INTO test.t3 VALUES (1)', 1); + SELECT sys.dbms_sql.EXECUTE(cursor_number); + SELECT * FROM test.t3; + CALL sys.dbms_sql.close_cursor(cursor_number); +END; +$$ +DELIMITER ;$$ + +CALL start_whole_call(); + +DELIMITER $$; +CREATE FUNCTION start_flow() RETURN INT AS +BEGIN + RETURN sys.dbms_sql.OPEN_CURSOR(); +END; + +CREATE PROCEDURE enclosed_close(cursor_number INT) AS +BEGIN + CALL sys.dbms_sql.close_cursor(cursor_number); +END; +$$ +DELIMITER ;$$ + +SELECT start_flow() INTO @cursor_num; +CALL sys.dbms_sql.parse(@cursor_num, + 'INSERT INTO test.t3 VALUES (1)', 1); +SELECT sys.dbms_sql.EXECUTE(@cursor_num); +CALL enclosed_close(@cursor_num); +SELECT * FROM test.t3; + + +--echo # +--echo # Test with DELETE statement +--echo # +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; + +CALL sys.dbms_sql.parse(@cursor_id, + 'DELETE FROM test.t3 WHERE a=1', 1); + +SELECT sys.dbms_sql.EXECUTE(@cursor_id); + +SELECT * FROM test.t3; + +CALL sys.dbms_sql.close_cursor(@cursor_id); + + + +--echo # +--echo # Test with UPDATE statement +--echo # +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; + +CALL sys.dbms_sql.parse(@cursor_id, + 'UPDATE test.t3 SET a=2', 1); + +SELECT sys.dbms_sql.EXECUTE(@cursor_id); + +SELECT * FROM test.t3; + +CALL sys.dbms_sql.close_cursor(@cursor_id); + + +--echo # +--echo # Test with ALTER statement +--echo # +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; + +CALL sys.dbms_sql.parse(@cursor_id, 'ALTER TABLE test.t3 ADD b VARCHAR(40)', 1); + +SELECT * FROM test.t3; + +CALL sys.dbms_sql.close_cursor(@cursor_id); + + +--echo # +--echo # Test showing no effect calling EXECUTE (again) on DDL statements +--echo # +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; + +CALL sys.dbms_sql.parse(@cursor_id, 'ALTER TABLE test.t3 MODIFY b VARCHAR(32)', 1); + +SELECT sys.dbms_sql.EXECUTE(@cursor_id); + +SELECT * FROM test.t3; + +CALL sys.dbms_sql.close_cursor(@cursor_id); + + +--echo # +--echo # Test with ALTER statement that adds multiple columns +--echo # +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; + +CALL sys.dbms_sql.parse(@cursor_id, 'ALTER TABLE test.t3 ADD c VARCHAR(40), ADD creation_date DATE', 1); + +SELECT * FROM test.t3; + +CALL sys.dbms_sql.close_cursor(@cursor_id); + + +--echo # +--echo # Test with RENAME TABLE statement +--echo # +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; + +CALL sys.dbms_sql.parse(@cursor_id, 'RENAME TABLE test.t3 TO test.t1', 1); + +SELECT * FROM test.t1; + +CALL sys.dbms_sql.close_cursor(@cursor_id); + + +--echo # +--echo # Test with CREATE TABLE statement +--echo # +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; + +CALL sys.dbms_sql.parse(@cursor_id, 'CREATE TABLE test.t2 (a INT) ENGINE=InnoDB', 1); + +SELECT * FROM test.t2; + + +--echo # +--echo # Test with RENAME TABLES statement +--echo # +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; + +CALL sys.dbms_sql.parse(@cursor_id, 'RENAME TABLES test.t1 TO test.t3, test.t2 TO test.t4', 1); + +SELECT * FROM test.t3; +SELECT * FROM test.t4; + + +--echo # +--echo # Test with DROP statement +--echo # +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; + +CALL sys.dbms_sql.parse(@cursor_id, 'DROP TABLE test.t3', 1); + +--error ER_NO_SUCH_TABLE +SELECT * FROM test.t3; + + +--echo # +--echo # Tests to ensure custom instruction cannot be used outside of the package +--echo # + +--error ER_SP_DOES_NOT_EXIST +CALL dbmssql_execute ('s0'); + +DELIMITER $$; +CREATE PROCEDURE p2() AS +BEGIN + CALL dbmssql_execute ('s0'); +END; +$$ +DELIMITER ;$$ + +--error ER_SP_DOES_NOT_EXIST +CALL p2(); + + +--echo # +--echo # Test giving unsupported SQL statement as code to the PARSE procedure +--echo # +SELECT sys.dbms_sql.OPEN_CURSOR() INTO @cursor_id; + +--error ER_STD_INVALID_ARGUMENT +CALL sys.dbms_sql.parse(@cursor_id, 'SET @old_sql_mode = @@session.sql_mode', 1); +--enable_ps_protocol + +DROP TABLE test.t4; +DROP FUNCTION f1; +DROP PROCEDURE p1; +DROP PROCEDURE p2; +DROP PROCEDURE start_whole_call; +DROP PROCEDURE enclosed_parse_exec_and_close; +DROP FUNCTION start_flow; +DROP PROCEDURE enclosed_close; \ No newline at end of file diff --git a/mysql-test/suite/sysschema/t/pkg_dbms_utility-2k_errstack_limit-zh.test b/mysql-test/suite/sysschema/t/pkg_dbms_utility-2k_errstack_limit-zh.test new file mode 100644 index 0000000000000..834d7e54aa1a3 --- /dev/null +++ b/mysql-test/suite/sysschema/t/pkg_dbms_utility-2k_errstack_limit-zh.test @@ -0,0 +1,86 @@ +-- source include/have_perfschema.inc + +--echo # +--echo # MDEV-34330: System package SYS.DBMS_UTILITY +--echo # + +SET sql_mode= oracle; + +SET SESSION note_verbosity = ""; + +SET NAMES utf8; + +SET lc_messages=ZH_CN; + +DELIMITER //; + +CREATE OR REPLACE PROCEDURE proc1 +IS +BEGIN + RAISE TOO_MANY_ROWS; +END; +// + +CREATE OR REPLACE PACKAGE pkg1 +IS + PROCEDURE proc2; +END pkg1;// + +CREATE OR REPLACE PACKAGE BODY pkg1 +IS + PROCEDURE proc2 + IS + BEGIN + proc1_1; + EXCEPTION + WHEN OTHERS + THEN + RAISE DUP_VAL_ON_INDEX; + END; +END pkg1;// + +CREATE PROCEDURE proc3( ) +AS +BEGIN + pkg1.proc2; +EXCEPTION + WHEN DUP_VAL_ON_INDEX THEN + SELECT sys.DBMS_UTILITY.FORMAT_ERROR_STACK(); +END;// + +DELIMITER ;// + +SET @identifier := REPEAT('x', 500); +--echo # +--echo # Test FORMAT_ERROR_STACK with very long result string +--echo # +--error ER_DUP_ENTRY + +DELIMITER //; + +CREATE OR REPLACE PROCEDURE cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc IS BEGIN proc1; EXCEPTION WHEN OTHERS THEN SIGNAL SQLSTATE 'HY000' SET MYSQL_ERRNO=3047, MESSAGE_TEXT=@identifier; END;// + +CREATE OR REPLACE PROCEDURE bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb IS BEGIN cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc; EXCEPTION WHEN OTHERS THEN SIGNAL SQLSTATE 'HY000' SET MYSQL_ERRNO=3047, MESSAGE_TEXT=@identifier; END;// + +CREATE OR REPLACE PROCEDURE aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa IS BEGIN bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; EXCEPTION WHEN OTHERS THEN SIGNAL SQLSTATE 'HY000' SET MYSQL_ERRNO=3047, MESSAGE_TEXT=@identifier; END;// + +CREATE OR REPLACE PROCEDURE proc1_1 +IS +BEGIN + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; +EXCEPTION + WHEN OTHERS + THEN + SIGNAL SQLSTATE 'HY000' SET MYSQL_ERRNO=3047, MESSAGE_TEXT=@identifier; +END;// + +DELIMITER ;// +CALL proc3( ); + +DROP PROCEDURE proc1; +DROP PROCEDURE cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc; +DROP PROCEDURE bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; +DROP PROCEDURE aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; +DROP PROCEDURE proc1_1; +DROP PACKAGE pkg1; +DROP PROCEDURE proc3; \ No newline at end of file diff --git a/mysql-test/suite/sysschema/t/pkg_dbms_utility.test b/mysql-test/suite/sysschema/t/pkg_dbms_utility.test new file mode 100644 index 0000000000000..f16118d2308c5 --- /dev/null +++ b/mysql-test/suite/sysschema/t/pkg_dbms_utility.test @@ -0,0 +1,323 @@ +-- source include/have_perfschema.inc + +--echo # +--echo # MDEV-34330: System package SYS.DBMS_UTILITY +--echo # + +SET sql_mode= oracle; + +SET SESSION note_verbosity = ""; + +DELIMITER //; + +--echo # +--echo # Test GET_TIME +--echo # +BEGIN SET timestamp=1216359724; SELECT sys.DBMS_UTILITY.GET_TIME(); END;// + +DELIMITER ;// + +--echo # +--echo # Test GET_TIME with an argument +--echo # +--error ER_SP_WRONG_NO_OF_ARGS +SELECT sys.DBMS_UTILITY.GET_TIME(1); + +DELIMITER //; + +CREATE OR REPLACE PROCEDURE proc1 +IS +BEGIN + RAISE TOO_MANY_ROWS; +END; +// + +CREATE OR REPLACE PROCEDURE proc1_1 +IS +BEGIN + proc1; +EXCEPTION + WHEN OTHERS + THEN + RAISE DUP_VAL_ON_INDEX; +END;// + +CREATE OR REPLACE PACKAGE pkg1 +IS + PROCEDURE proc2; +END pkg1;// + +CREATE OR REPLACE PACKAGE BODY pkg1 +IS + PROCEDURE proc2 + IS + BEGIN + proc1_1; + EXCEPTION + WHEN OTHERS + THEN + RAISE DUP_VAL_ON_INDEX; + END; +END pkg1;// + +CREATE PROCEDURE proc3( ) +AS +BEGIN + pkg1.proc2; +EXCEPTION + WHEN DUP_VAL_ON_INDEX THEN + SELECT sys.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(); + SELECT sys.DBMS_UTILITY.FORMAT_ERROR_STACK(); +END;// + +DELIMITER ;// + +--echo # +--echo # Test FORMAT_BACKTRACE & FORMAT_ERROR_STACK in an exception handler +--echo # +CALL proc3( ); + +DELIMITER //; + +CREATE OR REPLACE PROCEDURE proc1_2_2 +IS +BEGIN + SELECT 'hello'; +END; +// + +CREATE OR REPLACE PROCEDURE proc1_2 +IS +BEGIN + proc1_2_2; + proc1; +EXCEPTION + WHEN OTHERS + THEN + RAISE DUP_VAL_ON_INDEX; +END;// + +CREATE PROCEDURE proc6( ) +AS +BEGIN + proc1_2; +EXCEPTION + WHEN DUP_VAL_ON_INDEX THEN + SELECT sys.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(); + SELECT sys.DBMS_UTILITY.FORMAT_ERROR_STACK(); +END;// + +DELIMITER ;// + +--echo # +--echo # Test FORMAT_BACKTRACE & FORMAT_ERROR_STACK with called "non-error producing" routines, thereby exclusion from trace +--echo # +CALL proc6( ); + +DELIMITER //; + +--echo # +--echo # Test FORMAT_BACKTRACE in nested block +--echo # +CREATE PROCEDURE proc3_3( ) +AS +BEGIN + BEGIN + BEGIN + pkg1.proc2; + EXCEPTION + WHEN DUP_VAL_ON_INDEX THEN + SELECT sys.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(); + END; + END; +END;// + +DELIMITER ;// + +CALL proc3_3( ); + +DELIMITER //; + +CREATE PROCEDURE proc4( ) +AS +BEGIN + pkg1.proc2; +EXCEPTION + WHEN DUP_VAL_ON_INDEX THEN + SET @x2 = 2; +END;// + +DELIMITER ;// + +--echo # +--echo # Test FORMAT_BACKTRACE outside SPs +--echo # +CALL proc4( ); +SELECT sys.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(); + +delimiter //; + +CREATE OR REPLACE PROCEDURE show_errors +IS +BEGIN + SELECT sys.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(); +END; +// + +CREATE OR REPLACE PROCEDURE proc2 +IS +BEGIN + proc1_1; +EXCEPTION + WHEN OTHERS + THEN + RAISE DUP_VAL_ON_INDEX; +END;// + +CREATE OR REPLACE PACKAGE TEST_PKG AS + PROCEDURE p2public; +END; +// + +CREATE OR REPLACE PACKAGE BODY TEST_PKG AS + PROCEDURE p2public AS + BEGIN + SELECT 'in p2public'; + END; +BEGIN + proc2; +EXCEPTION + WHEN OTHERS + THEN + CALL show_errors(); +END; +// + +delimiter ;// + +--echo # +--echo # Test FORMAT_BACKTRACE & FORMAT_ERROR_STACK from a package initialization section +--echo # +CALL TEST_PKG.p2public; + +########################################################## +# Recursive Test # +########################################################## +SET @session_max_recursion_depth = @@SESSION.max_sp_recursion_depth; + + +# Setting session value of variable +SET @@session.max_sp_recursion_depth = 10; +SELECT @@session.max_sp_recursion_depth; +# create procedure to add rows + +--disable_warnings +DROP PROCEDURE IF EXISTS sp_add_records; +--enable_warnings + +DELIMITER //; + +CREATE PROCEDURE sp_add_records (var1 INT,var2 INT) AS +BEGIN +SELECT var1,var2; +IF var1 < var2 THEN + CALL sp_add_records(var1+1,var2); + SELECT var1,var2; +ELSE + proc1; +END IF; +EXCEPTION + WHEN OTHERS + THEN + RAISE DUP_VAL_ON_INDEX; +END;// + +CREATE PROCEDURE proc5( ) +AS +BEGIN + CALL sp_add_records(0,8); +EXCEPTION + WHEN DUP_VAL_ON_INDEX THEN + SELECT sys.DBMS_UTILITY.FORMAT_ERROR_STACK(); +END;// + + +DELIMITER ;// + + +CALL proc5( ); + +SET @identifier := REPEAT('x', 500); +--echo # +--echo # Test FORMAT_ERROR_STACK with very long result string +--echo # +--error ER_DUP_ENTRY + +DELIMITER //; + +CREATE OR REPLACE PROCEDURE cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc IS BEGIN proc1; EXCEPTION WHEN OTHERS THEN SIGNAL SQLSTATE 'HY000' SET MYSQL_ERRNO=3047, MESSAGE_TEXT=@identifier; END;// + +CREATE OR REPLACE PROCEDURE bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb IS BEGIN cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc; EXCEPTION WHEN OTHERS THEN SIGNAL SQLSTATE 'HY000' SET MYSQL_ERRNO=3047, MESSAGE_TEXT=@identifier; END;// + +CREATE OR REPLACE PROCEDURE aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa IS BEGIN bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; EXCEPTION WHEN OTHERS THEN SIGNAL SQLSTATE 'HY000' SET MYSQL_ERRNO=3047, MESSAGE_TEXT=@identifier; END;// + +CREATE OR REPLACE PROCEDURE proc1_1 +IS +BEGIN + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; +EXCEPTION + WHEN OTHERS + THEN + SIGNAL SQLSTATE 'HY000' SET MYSQL_ERRNO=3047, MESSAGE_TEXT=@identifier; +END;// + +CREATE PROCEDURE proc3_2( ) +AS +BEGIN + pkg1.proc2; +EXCEPTION + WHEN DUP_VAL_ON_INDEX THEN + SELECT sys.DBMS_UTILITY.FORMAT_ERROR_STACK(); +END;// + +DELIMITER ;// +CALL proc3_2( ); + +--echo # +--echo # Test FORMAT_BACKTRACE & FORMAT_ERROR_STACK when no error occurs +--echo # +DELIMITER $$; +CREATE PROCEDURE p1() AS +BEGIN + CALL sys.DBMS_TRANSACTION.COMMIT; +EXCEPTION + WHEN OTHERS + THEN + SELECT sys.DBMS_UTILITY.FORMAT_ERROR_BACKTRACE(); +END; +$$ +DELIMITER ;$$ + +CALL p1(); + +DROP PROCEDURE proc1_2_2; +DROP PROCEDURE proc1_2; +DROP PROCEDURE proc6; +DROP PROCEDURE p1; +DROP PROCEDURE cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc; +DROP PROCEDURE bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb; +DROP PROCEDURE aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa; +DROP PROCEDURE proc3_2; +DROP PROCEDURE show_errors; +DROP PROCEDURE proc2; +DROP PACKAGE TEST_PKG; +DROP PROCEDURE proc1; +DROP PROCEDURE proc1_1; +DROP PACKAGE pkg1; +DROP PROCEDURE proc3_3; +DROP PROCEDURE proc3; +DROP PROCEDURE proc4; +DROP PROCEDURE IF EXISTS sp_add_records; +DROP PROCEDURE IF EXISTS proc5; + +SET @@SESSION.max_sp_recursion_depth = @session_max_recursion_depth; \ No newline at end of file diff --git a/mysql-test/suite/sysschema/t/pkg_utl_i18n-non_xliterate.test b/mysql-test/suite/sysschema/t/pkg_utl_i18n-non_xliterate.test new file mode 100644 index 0000000000000..24e2a53fe90eb --- /dev/null +++ b/mysql-test/suite/sysschema/t/pkg_utl_i18n-non_xliterate.test @@ -0,0 +1,21 @@ +SET sql_mode= oracle; +SET NAMES 'utf8mb3'; + +--echo # +--echo # Test RAW_TO_CHAR with utf8 charset source +--echo # +--disable_warnings +SELECT sys.UTL_I18N.RAW_TO_CHAR(x'e38182', 'utf8'); +--enable_warnings + +SET NAMES 'utf8mb4'; + +--echo # +--echo # Test RAW_TO_CHAR with utf8mb3 charset source +--echo # +SELECT sys.UTL_I18N.RAW_TO_CHAR(x'e38182', 'utf8mb3'); + +--echo # +--echo # Test STRING_TO_RAW +--echo # +SELECT HEX(sys.UTL_I18N.STRING_TO_RAW('あ', 'ucs2')); \ No newline at end of file diff --git a/mysql-test/suite/sysschema/t/pkg_utl_i18n-sjis.test b/mysql-test/suite/sysschema/t/pkg_utl_i18n-sjis.test new file mode 100644 index 0000000000000..0f242a26bc37f --- /dev/null +++ b/mysql-test/suite/sysschema/t/pkg_utl_i18n-sjis.test @@ -0,0 +1,201 @@ +-- source include/have_perfschema.inc + +--echo # +--echo # MDEV-34331: System package SYS.UTL_I18N +--echo # + +--echo # +--echo # transliterate test with sjis +--echo # + +SET sql_mode= oracle; +SET NAMES sjis; + +--echo # +--echo # Test transliterate with valid input +--echo # +SET collation_connection=sjis_japanese_ci; +CREATE TABLE t1 (b VARCHAR(2)); +INSERT INTO t1 VALUES ('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'); +INSERT INTO t1 VALUES ('8'),('9'),('A'),('B'),('C'),('D'),('E'),('F'); +# +# Populate tables head and tail with values '00'-'FF' +# +CREATE TEMPORARY TABLE head AS SELECT CONCAT(b1.b, b2.b) AS head FROM t1 b1, t1 b2; +CREATE TEMPORARY TABLE tail AS SELECT CONCAT(b1.b, b2.b) AS tail FROM t1 b1, t1 b2; +DROP TABLE t1; +# +# Populate Hiragana table t1 +# +CREATE TABLE t1 AS +SELECT CONCAT(head, tail) AS code, ' ' AS a +FROM head, tail +WHERE (head = '82') AND (tail BETWEEN '9F' AND 'F1') +ORDER BY head, tail; +# Populate Half Width Kana part 1 +# +INSERT IGNORE INTO t1 (code) SELECT CONCAT('83', head) FROM head +WHERE (head BETWEEN '40' AND '7E') ORDER BY head;# +# Populate Half Width Kana part 2 +# +INSERT IGNORE INTO t1 (code) SELECT CONCAT('83', head) FROM head +WHERE (head BETWEEN '80' AND '96') ORDER BY head;# +# Populate Half Width Kana: [A1..DD] +# +INSERT IGNORE t1 (code) SELECT head FROM head WHERE (head BETWEEN 'A1' AND 'DD'); +DROP TEMPORARY TABLE head, tail; +SHOW CREATE TABLE t1; +UPDATE IGNORE t1 SET a=UNHEX(code) ORDER BY code; +SELECT GROUP_CONCAT(a) FROM t1 WHERE (code BETWEEN 'A1' AND 'DD') INTO @hw_char_arr; +SELECT GROUP_CONCAT(a) FROM t1 WHERE (code BETWEEN '8340' AND '837e') INTO @fw_char_arr; +SELECT GROUP_CONCAT(a) FROM t1 WHERE (code BETWEEN '8380' AND '8396') INTO @fw_char_arr2; +SELECT GROUP_CONCAT(a) FROM t1 WHERE (code BETWEEN '829f' AND '82f1') INTO @hi_char_arr2; + +DROP TABLE t1; + +SET NAMES sjis; +SET collation_connection=sjis_japanese_ci; +DELIMITER /; +CREATE PROCEDURE f1 (array_string VARCHAR2(255) CHARACTER SET sjis) +AS +BEGIN + DECLARE + array_length INT; + element VARCHAR2(255) CHARACTER SET sjis; + temp_string VARCHAR2(255) CHARACTER SET sjis; + BEGIN + SET array_length = (LENGTH(array_string) - LENGTH(REPLACE(array_string, ',', ''))) + 1; + SET temp_string = array_string; + <> + FOR ia IN 1 .. array_length + LOOP + SET element = SUBSTRING_INDEX(SUBSTRING_INDEX(temp_string, ',', 1), ',', -1); + SELECT element; + SELECT sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana'); + SET temp_string = SUBSTRING(temp_string, LENGTH(element) + 2); + END LOOP la; + END; +END; +/ +DELIMITER ;/ + +--echo # +--echo # feed all halfwidth katakana characters to the transliterate function +--echo # +CALL f1(@hw_char_arr); +DROP PROCEDURE f1; + +DELIMITER /; +CREATE PROCEDURE f2 (array_string VARCHAR2(255) CHARACTER SET sjis) +AS +BEGIN + DECLARE + array_length INT; + element VARCHAR2(255) CHARACTER SET sjis; + temp_string VARCHAR2(255) CHARACTER SET sjis; + BEGIN + SET array_length = (LENGTH(array_string) - LENGTH(REPLACE(array_string, ',', ''))) + 1; + SET temp_string = array_string; + <> + FOR ia IN 1 .. array_length + LOOP + SET element = SUBSTRING_INDEX(SUBSTRING_INDEX(temp_string, ',', 1), ',', -1); + SELECT element; + SELECT sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana'); + SET temp_string = SUBSTRING(temp_string, LENGTH(element) + 2); + END LOOP la; + END; +END; +/ +DELIMITER ;/ + +--echo # +--echo # feed fullwidth katakana characters with codepoints '8340' upto '837e' to the transliterate function +--echo # +CALL f2(@fw_char_arr); + +--echo # +--echo # feed fullwidth katakana characters with codepoints '8380' upto '8396' to the transliterate function +--echo # +CALL f2(@fw_char_arr2); + +--echo # +--echo # feed all hiragana characters to the transliterate function +--echo # +CALL f2(@hi_char_arr2); +DROP PROCEDURE f2; + +--echo # +--echo # Test combination of fullwidth, hiragana & halfwidth characters with the 'fwkatakana_hwkatakana' (mode) name +--echo # +--disable_warnings +SELECT sys.UTL_I18N.TRANSLITERATE('A', 'fwkatakana_hwkatakana'); +--enable_warnings + +--echo # +--echo # Test Latin 'a' character with the 'kana_hwkatakana' (mode) name +--echo # +SELECT sys.UTL_I18N.TRANSLITERATE('a', 'kana_hwkatakana'); + +--echo # +--echo # Test Latin 'a' character with the 'hwkatakana_fwkatakana' (mode) name +--echo # +SELECT sys.UTL_I18N.TRANSLITERATE('a', 'hwkatakana_fwkatakana'); + +--echo # +--echo # Test the 'kana_hwkatakana' (mode) name +--echo # +SELECT sys.UTL_I18N.TRANSLITERATE('', 'kana_hwkatakana'); + +--echo # +--echo # Test the 'hwkatakana_fwkatakana' (mode) name +--echo # +SELECT sys.UTL_I18N.TRANSLITERATE('', 'hwkatakana_fwkatakana'); + +--echo # +--echo # Test the 'hwkatakana_fwkatakana' (mode) name +--echo # +SELECT sys.UTL_I18N.TRANSLITERATE('A1', 'hwkatakana_fwkatakana'); + +--echo # +--echo # Test input string with introducer +--echo # +SELECT sys.UTL_I18N.TRANSLITERATE(_sjis'', 'kana_hwkatakana'); + +--echo # +--echo # Test input string with collate clause +--echo # +SELECT sys.UTL_I18N.TRANSLITERATE('' COLLATE sjis_japanese_ci, 'kana_hwkatakana'); + +--echo # +--echo # Test input string with introducer & collate clause +--echo # +SELECT sys.UTL_I18N.TRANSLITERATE(_sjis'' COLLATE sjis_japanese_ci, 'kana_hwkatakana'); + +--echo # +--echo # Test with blank (mode) name +--echo # +--error ER_STD_INVALID_ARGUMENT +SELECT sys.UTL_I18N.TRANSLITERATE('', ' '); + +--echo # +--echo # Test with empty input string +--echo # +SELECT sys.UTL_I18N.TRANSLITERATE('', 'hwkatakana_fwkatakana'); + +--echo # +--echo # Test TRANSLITERATE with empty name +--echo # +--error ER_STD_INVALID_ARGUMENT +SELECT sys.UTL_I18N.TRANSLITERATE('', ''); + +--echo # +--echo # Test TRANSLITERATE with null name +--echo # +SELECT sys.UTL_I18N.TRANSLITERATE(NULL, 'hwkatakana_fwkatakana'); + +--echo # +--echo # Test TRANSLITERATE with non sjis & EUC-JP characters +--echo # +--error ER_STD_INVALID_ARGUMENT +SELECT sys.UTL_I18N.TRANSLITERATE(_utf8'', 'hwkatakana_fwkatakana'); \ No newline at end of file diff --git a/mysql-test/suite/sysschema/t/pkg_utl_i18n-ujis.test b/mysql-test/suite/sysschema/t/pkg_utl_i18n-ujis.test new file mode 100644 index 0000000000000..065c20855eac2 --- /dev/null +++ b/mysql-test/suite/sysschema/t/pkg_utl_i18n-ujis.test @@ -0,0 +1,194 @@ +-- source include/have_perfschema.inc + +--echo # +--echo # MDEV-34331: System package SYS.UTL_I18N +--echo # + +--echo # +--echo # transliterate Tests with ujis +--echo # + +SET sql_mode= oracle; +SET NAMES ujis; + +--echo # +--echo # Test transliterate with valid input +--echo # +SET collation_connection=ujis_japanese_ci; +CREATE TABLE t1 (b VARCHAR(2)); +INSERT INTO t1 VALUES ('0'),('1'),('2'),('3'),('4'),('5'),('6'),('7'); +INSERT INTO t1 VALUES ('8'),('9'),('A'),('B'),('C'),('D'),('E'),('F'); +# +# Populate tables head and tail with values '00'-'FF' +# +CREATE TEMPORARY TABLE head AS SELECT CONCAT(b1.b, b2.b) AS head FROM t1 b1, t1 b2; +CREATE TEMPORARY TABLE tail AS SELECT CONCAT(b1.b, b2.b) AS tail FROM t1 b1, t1 b2; +DROP TABLE t1; +# +# Populate table t1 with all ujis codes. +# +# +CREATE TABLE t1 AS SELECT 'XXXXXX' AS code, ' ' AS a LIMIT 0; +# +# Pupulate JIS-X-0201 range (Half Width Kana) +# +INSERT IGNORE INTO t1 (code) SELECT CONCAT('8E', head) FROM head +WHERE (head BETWEEN 'A1' AND 'DD') ORDER BY head; +# +# Populate JIS-X-0208 Hiragana & Katakana ranges +# +INSERT IGNORE INTO t1 (code) SELECT CONCAT('A4', head) FROM head +WHERE (head BETWEEN 'A1' AND 'F3') ORDER BY head; +INSERT IGNORE INTO t1 (code) SELECT CONCAT('A5', head) FROM head +WHERE (head BETWEEN 'A1' AND 'F6') ORDER BY head; +DROP TEMPORARY TABLE head, tail; +SHOW CREATE TABLE t1; + +UPDATE IGNORE t1 SET a=UNHEX(code) ORDER BY code; +SELECT GROUP_CONCAT(a) FROM t1 WHERE (code BETWEEN '8eA1' AND '8eDD') INTO @hw_char_arr; +SELECT GROUP_CONCAT(a) FROM t1 WHERE (code BETWEEN 'a5a1' AND 'a5f6') INTO @fw_char_arr; +SELECT GROUP_CONCAT(a) FROM t1 WHERE (code BETWEEN 'a4a1' AND 'a4f3') INTO @hi_char_arr; + +DROP TABLE t1; + +SET NAMES ujis; +SET collation_connection=ujis_japanese_ci; +DELIMITER /; +CREATE PROCEDURE f1 (array_string VARCHAR2(255) CHARACTER SET ujis) +AS +BEGIN + DECLARE + array_length INT; + element VARCHAR2(255) CHARACTER SET ujis; + temp_string VARCHAR2(255) CHARACTER SET ujis; + BEGIN + SET array_length = (LENGTH(array_string) - LENGTH(REPLACE(array_string, ',', ''))) + 1; + SET temp_string = array_string; + <> + FOR ia IN 1 .. array_length + LOOP + SET element = SUBSTRING_INDEX(SUBSTRING_INDEX(temp_string, ',', 1), ',', -1); + SELECT element; + SELECT sys.UTL_I18N.TRANSLITERATE(element, 'hwkatakana_fwkatakana'); + SET temp_string = SUBSTRING(temp_string, LENGTH(element) + 2); + END LOOP la; + END; +END; +/ +DELIMITER ;/ + +--echo # +--echo # Test transliterate function with all EUC-JP halfwidth katakana characters +--echo # +CALL f1(@hw_char_arr); +DROP PROCEDURE f1; + +DELIMITER /; +CREATE PROCEDURE f2 (array_string VARCHAR2(255) CHARACTER SET ujis) +AS +BEGIN + DECLARE + array_length INT; + element VARCHAR2(255) CHARACTER SET ujis; + temp_string VARCHAR2(255) CHARACTER SET ujis; + BEGIN + SET array_length = (LENGTH(array_string) - LENGTH(REPLACE(array_string, ',', ''))) + 1; + SET temp_string = array_string; + <> + FOR ia IN 1 .. array_length + LOOP + SET element = SUBSTRING_INDEX(SUBSTRING_INDEX(temp_string, ',', 1), ',', -1); + SELECT element; + SELECT sys.UTL_I18N.TRANSLITERATE(element, 'kana_hwkatakana'); + SET temp_string = SUBSTRING(temp_string, LENGTH(element) + 2); + END LOOP la; + END; +END; +/ +DELIMITER ;/ + +--echo # +--echo # Test transliterate function with all EUC-JP fullwidth katakana characters +--echo # +CALL f2(@fw_char_arr); + +--echo # +--echo # Test transliterate function with all EUC-JP hiragana characters +--echo # +CALL f2(@hi_char_arr); +DROP PROCEDURE f2; + +--echo # +--echo # Test combination of fullwidth, hiragana & halfwidth characters with the 'fwkatakana_hwkatakana' (mode) name +--echo # +--disable_warnings +SELECT sys.UTL_I18N.TRANSLITERATE('', 'fwkatakana_hwkatakana'); +--enable_warnings + +--echo # +--echo # Test Latin 'a' character with the 'kana_hwkatakana' (mode) name +--echo # +SELECT sys.UTL_I18N.TRANSLITERATE('a', 'kana_hwkatakana'); + +--echo # +--echo # Test Latin 'a' character with the 'hwkatakana_fwkatakana' (mode) name +--echo # +SELECT sys.UTL_I18N.TRANSLITERATE('a', 'hwkatakana_fwkatakana'); + +--echo # +--echo # Test the 'kana_hwkatakana' (mode) name +--echo # +SELECT sys.UTL_I18N.TRANSLITERATE('', 'kana_hwkatakana'); + +--echo # +--echo # Test the 'hwkatakana_fwkatakana' (mode) name +--echo # +SELECT sys.UTL_I18N.TRANSLITERATE('', 'hwkatakana_fwkatakana'); + +--echo # +--echo # Test the 'hwkatakana_fwkatakana' (mode) name +--echo # +SELECT sys.UTL_I18N.TRANSLITERATE('1', 'hwkatakana_fwkatakana'); + +--echo # +--echo # Test input string with introducer +--echo # +SELECT sys.UTL_I18N.TRANSLITERATE(_ujis'', 'kana_hwkatakana'); + +--echo # +--echo # Test input string with collate clause +--echo # +SELECT sys.UTL_I18N.TRANSLITERATE('' COLLATE ujis_japanese_ci, 'kana_hwkatakana'); + +--echo # +--echo # Test input string with introducer & collate clause +--echo # +SELECT sys.UTL_I18N.TRANSLITERATE(_ujis'' COLLATE ujis_japanese_ci, 'kana_hwkatakana'); + +--echo # +--echo # Test with blank (mode) name +--echo # +--error ER_STD_INVALID_ARGUMENT +SELECT sys.UTL_I18N.TRANSLITERATE('', ' '); + +--echo # +--echo # Test with empty input string +--echo # +SELECT sys.UTL_I18N.TRANSLITERATE('', 'hwkatakana_fwkatakana'); + +--echo # +--echo # Test TRANSLITERATE with empty name +--echo # +--error ER_STD_INVALID_ARGUMENT +SELECT sys.UTL_I18N.TRANSLITERATE('', ''); + +--echo # +--echo # Test TRANSLITERATE with null name +--echo # +SELECT sys.UTL_I18N.TRANSLITERATE(NULL, 'hwkatakana_fwkatakana'); + +--echo # +--echo # Test TRANSLITERATE with non sjis & EUC-JP characters +--echo # +--error ER_STD_INVALID_ARGUMENT +SELECT sys.UTL_I18N.TRANSLITERATE(_utf8'', 'hwkatakana_fwkatakana'); \ No newline at end of file diff --git a/mysql-test/suite/sysschema/t/pkg_utl_i18n.test b/mysql-test/suite/sysschema/t/pkg_utl_i18n.test new file mode 100644 index 0000000000000..a0304bdbe0bec --- /dev/null +++ b/mysql-test/suite/sysschema/t/pkg_utl_i18n.test @@ -0,0 +1,50 @@ +-- source include/have_perfschema.inc + +--echo # +--echo # MDEV-34331: System package SYS.UTL_I18N +--echo # + +SET sql_mode= oracle; +SET NAMES ujis; + +--echo # +--echo # Test assigning ANY_CS charset to a local variable +--echo # +DELIMITER /; +--error ER_PARSE_ERROR +CREATE FUNCTION f1 () RETURN VARCHAR2(10) AS +BEGIN + DECLARE + b VARCHAR2(10) CHARACTER SET ANY_CS DEFAULT 'a'; + BEGIN + RETURN b; + END; +END; +/ +DELIMITER ;/ + +--echo # +--echo # Test assigning ANY_CS charset to a local variable of row type +--echo # +DROP PROCEDURE IF EXISTS p1; +DELIMITER /; +--error ER_PARSE_ERROR +CREATE PROCEDURE p1 AS + rec ROW(a INT, b VARCHAR2(32) CHARACTER SET ANY_CS); +BEGIN +END; +/ +DELIMITER ;/ +DROP PROCEDURE IF EXISTS p1; + +--echo # +--echo # Test row type as SP parameter +--echo # +DELIMITER /; +--error ER_PARSE_ERROR +CREATE PROCEDURE p2(r ROW(a INT, b VARCHAR2(32) CHARACTER SET ANY_CS)) AS + BEGIN + END; +/ +DELIMITER ;/ +DROP PROCEDURE IF EXISTS p2; diff --git a/scripts/sys_schema/CMakeLists.txt b/scripts/sys_schema/CMakeLists.txt index 26256c5c9dd73..5cbd948e27ba1 100644 --- a/scripts/sys_schema/CMakeLists.txt +++ b/scripts/sys_schema/CMakeLists.txt @@ -157,6 +157,10 @@ ${CMAKE_CURRENT_SOURCE_DIR}/procedures/ps_setup_show_enabled_instruments.sql ${CMAKE_CURRENT_SOURCE_DIR}/procedures/ps_truncate_all_tables.sql ${CMAKE_CURRENT_SOURCE_DIR}/procedures/statement_performance_analyzer.sql ${CMAKE_CURRENT_SOURCE_DIR}/procedures/table_exists.sql +${CMAKE_CURRENT_SOURCE_DIR}/packages/dbms_random.sql +${CMAKE_CURRENT_SOURCE_DIR}/packages/dbms_utility.sql +${CMAKE_CURRENT_SOURCE_DIR}/packages/dbms_sql.sql +${CMAKE_CURRENT_SOURCE_DIR}/packages/utl_i18n.sql ${CMAKE_CURRENT_SOURCE_DIR}/after_setup.sql ) ELSE() @@ -165,7 +169,11 @@ SET(files ${CMAKE_CURRENT_SOURCE_DIR}/tables/sys_config.sql ${CMAKE_CURRENT_SOURCE_DIR}/tables/sys_config_data_57.sql ${CMAKE_CURRENT_SOURCE_DIR}/triggers/sys_config_insert_set_user.sql - ${CMAKE_CURRENT_SOURCE_DIR}/triggers/sys_config_update_set_user.sql + ${CMAKE_CURRENT_SOURCE_DIR}/triggers/sys_config_update_set_user.sql + ${CMAKE_CURRENT_SOURCE_DIR}/packages/dbms_random.sql + ${CMAKE_CURRENT_SOURCE_DIR}/packages/dbms_utility.sql + ${CMAKE_CURRENT_SOURCE_DIR}/packages/dbms_sql.sql + ${CMAKE_CURRENT_SOURCE_DIR}/packages/utl_i18n.sql ${CMAKE_CURRENT_SOURCE_DIR}/after_setup.sql) ENDIF() diff --git a/scripts/sys_schema/packages/dbms_random.sql b/scripts/sys_schema/packages/dbms_random.sql new file mode 100644 index 0000000000000..598883a38a1d0 --- /dev/null +++ b/scripts/sys_schema/packages/dbms_random.sql @@ -0,0 +1,185 @@ +DROP PACKAGE IF EXISTS dbms_random; + +SET @old_sql_mode = @@session.sql_mode, @@session.sql_mode = oracle; + +DELIMITER $$ + +CREATE DEFINER='mariadb.sys'@'localhost' PACKAGE dbms_random + SQL SECURITY INVOKER + COMMENT 'Collection of random routines' + AS + PROCEDURE initialize (input INT) + SQL SECURITY INVOKER + COMMENT ' + Description + ----------- + Initializes the seed + + Raises + ------ + + ' + ; + PROCEDURE terminate + SQL SECURITY INVOKER + COMMENT ' + Description + ----------- + Terminates package + + Raises + ------ + + ' + ; + FUNCTION value RETURN DECIMAL(65,38) + SQL SECURITY INVOKER + COMMENT ' + Description + ----------- + Gets a random number greater than or equal to 0 and less than 1, + with 38 digits to the right of the decimal point (38-digit + precision) + + Raises + ------ + + ' + ; + FUNCTION random RETURN INT + SQL SECURITY INVOKER + COMMENT ' + Description + ----------- + Generates a random number + + Raises + ------ + + ' + ; +END +$$ + +CREATE DEFINER='mariadb.sys'@'localhost' PACKAGE BODY dbms_random + SQL SECURITY INVOKER + AS + FUNCTION get_seed_from_session() RETURN INTEGER + AS + v_user_hash INTEGER; + v_time_num INTEGER; + v_process_id INTEGER; + v_seed INTEGER; + v_username VARCHAR(128); + v_i INTEGER; + BEGIN + -- Get current user name + v_username := USER(); + -- Convert username to numeric hash (sum of ASCII values * position) + v_user_hash := 0; + FOR v_i IN 1..LENGTH(v_username) LOOP + v_user_hash := v_user_hash + (ASCII(SUBSTR(v_username, v_i, 1)) * v_i); + END LOOP; + -- Get current time as Unix timestamp (seconds since epoch) + v_time_num := UNIX_TIMESTAMP(); + -- Get process/connection ID + v_process_id := CONNECTION_ID(); + -- Combine all three components into a single integer + -- Using bit shifting and XOR to mix the values + v_seed := MOD( + (v_user_hash * 31) + + (v_time_num * 17) + + (v_process_id * 13), + 2147483647 -- Max 32-bit signed integer + ); + RETURN v_seed; + END; + + PROCEDURE initialize (input INT) + SQL SECURITY INVOKER + COMMENT ' + Description + ----------- + Initializes the seed + + Raises + ------ + + ' + IS + BEGIN + SET @@rand_seed1 = input * 0x10001 + 55555555; + SET @@rand_seed2 = input * 0x10000001; + END; + PROCEDURE terminate + SQL SECURITY INVOKER + COMMENT ' + Description + ----------- + Terminates package + + Raises + ------ + + ' + IS + BEGIN + END; + FUNCTION value RETURN DECIMAL(65,38) + SQL SECURITY INVOKER + COMMENT ' + Description + ----------- + Gets a random number greater than or equal to 0 and less than 1, with + 38 digits to the right of the decimal point (38-digit precision) + + Raises + ------ + + ' + IS + BEGIN + RETURN CAST(RAND() AS DECIMAL(65, 38)); + END; + FUNCTION random RETURN INT + SQL SECURITY INVOKER + COMMENT ' + Description + ----------- + Generates a random number + + Raises + ------ + + ' + IS + BEGIN + RETURN CONVERT(RAND() * (POW(2, 31) - 1 + POW(2, 31)) - POW(2, 31), DECIMAL(65, 0)); + END; + PROCEDURE set_seed + SQL SECURITY INVOKER + COMMENT ' + Description + ----------- + Terminates package + + Raises + ------ + + ' + IS + BEGIN + SET @seed = get_seed_from_session(); + -- Set session-level random seed + SET @@rand_seed1 = @seed * 0x10001 + 55555555; + SET @@rand_seed2 = @seed * 0x10001; + END; + +BEGIN + set_seed; +END +$$ + +DELIMITER ; + +SET @@session.sql_mode = @old_sql_mode; diff --git a/scripts/sys_schema/packages/dbms_sql.sql b/scripts/sys_schema/packages/dbms_sql.sql new file mode 100644 index 0000000000000..1a4f8d9434ec4 --- /dev/null +++ b/scripts/sys_schema/packages/dbms_sql.sql @@ -0,0 +1,194 @@ +DROP PACKAGE IF EXISTS dbms_sql; + +SET @old_sql_mode = @@session.sql_mode, @@session.sql_mode = oracle; + +DELIMITER $$ +CREATE DEFINER='mariadb.sys'@'localhost' PACKAGE dbms_sql + SQL SECURITY INVOKER + COMMENT 'Collection of sql routines' + AS + FUNCTION open_cursor RETURN INT + SQL SECURITY INVOKER + COMMENT ' + Description + ----------- + This function opens a new cursor. + + Raises + ------ + + ' + ; + PROCEDURE parse (cursor_id INT, input VARCHAR2(65511), language_flag INT) + SQL SECURITY INVOKER + COMMENT ' + Description + ----------- + This procedure parses the given statement in the given cursor. All statements are parsed immediately. In addition, DDL statements are run immediately when parsed. + + Raises + ------ + + ' + ; + FUNCTION execute (cursor_id INT) RETURN INT + SQL SECURITY INVOKER + COMMENT ' + Description + ----------- + This function executes a given cursor. This function accepts the ID number of the cursor and returns the number of rows processed. + + Raises + ------ + + ' + ; + PROCEDURE close_cursor (cursor_id INT) + SQL SECURITY INVOKER + COMMENT ' + Description + ----------- + When you no longer need a cursor for a session, close the cursor by calling the CLOSE_CURSOR Procedure. + + Raises + ------ + + ' + ; +END +$$ + +CREATE DEFINER='mariadb.sys'@'localhost' PACKAGE BODY dbms_sql + SQL SECURITY INVOKER + AS + FUNCTION open_cursor RETURN INT + SQL SECURITY INVOKER + COMMENT ' + Description + ----------- + This function opens a new cursor. + + Raises + ------ + + ' + AS + BEGIN + DECLARE + cursor_id INT; + BEGIN + SET cursor_id = dbms_sql_open_cursor(); + RETURN cursor_id; + END; + END; + PROCEDURE parse (cursor_id INT, input VARCHAR2(65511), language_flag INT) + SQL SECURITY INVOKER + COMMENT ' + Description + ----------- + This procedure parses the given statement in the given cursor. All statements are parsed immediately. In addition, DDL statements are run immediately when parsed. + + Raises + ------ + + ' + AS + BEGIN + DECLARE + first_word VARCHAR2(64); + second_word VARCHAR2(64); + final_ps VARCHAR2(256); + first_word_id INT; + parse_result INT; + BEGIN + SET first_word = LOWER(SUBSTRING_INDEX(LTRIM(input), ' ', 1)); + SET second_word = SUBSTRING_INDEX(SUBSTRING_INDEX(input, ' ', 2), ' ', -1); + IF first_word IN ('create', 'alter', 'drop', 'insert', 'update', 'delete') OR + (first_word = 'rename' AND second_word IN ('table', 'tables')) THEN + IF first_word IN ('create', 'alter', 'drop') OR + (first_word = 'rename' AND second_word IN ('table', 'tables')) THEN + SET final_ps = CONCAT('CREATE PROCEDURE final_NESTED_PROC() AS BEGIN PREPARE s', cursor_id, ' FROM \'', input, '\'; EXECUTE s', cursor_id, '; END'); + CASE first_word + WHEN 'create' THEN + SET first_word_id = 0; + WHEN 'alter' THEN + SET first_word_id = 1; + WHEN 'drop' THEN + SET first_word_id = 2; + WHEN 'rename' THEN + SET first_word_id = 3; + END CASE; + ELSIF first_word IN ('insert', 'update', 'delete') THEN + SET final_ps = CONCAT('CREATE PROCEDURE final_NESTED_PROC() AS BEGIN PREPARE s', cursor_id, ' FROM \'', input, '\'; END');CASE first_word + WHEN 'insert' THEN + SET first_word_id = 4; + WHEN 'update' THEN + SET first_word_id = 5; + WHEN 'delete' THEN + SET first_word_id = 6; + END CASE; + END IF; + EXECUTE IMMEDIATE final_ps; + EXECUTE IMMEDIATE 'CALL final_NESTED_PROC()'; + EXECUTE IMMEDIATE 'DROP PROCEDURE final_NESTED_PROC'; + SET parse_result = dbms_sql_parse(cursor_id, first_word_id); + ELSE + SIGNAL SQLSTATE 'HY000' set mysql_errno=3047, message_text='missing or invalid option'; + END IF; + END; + + END; + FUNCTION execute (cursor_id INT) RETURN INT + SQL SECURITY INVOKER + COMMENT ' + Description + ----------- + This function executes a given cursor. This function accepts the ID number of the cursor and returns the number of rows processed. + + Raises + ------ + + ' + AS + BEGIN + DECLARE + element VARCHAR2(32); + BEGIN + SET element = CONCAT('s', cursor_id); + CALL dbmssql_execute (element); + RETURN ROW_COUNT(); + END; + + END; + PROCEDURE close_cursor (cursor_id INT) + SQL SECURITY INVOKER + COMMENT ' + Description + ----------- + When you no longer need a cursor for a session, close the cursor by calling the CLOSE_CURSOR Procedure. + + Raises + ------ + + ' + AS + BEGIN + DECLARE + final_ps VARCHAR2(256); + res INT; + BEGIN + set res = dbms_sql_close_cursor(cursor_id); + SET final_ps = CONCAT('CREATE PROCEDURE NESTED_PROC() AS BEGIN DEALLOCATE PREPARE s', cursor_id, '; END'); + EXECUTE IMMEDIATE final_ps; + EXECUTE IMMEDIATE 'CALL NESTED_PROC()'; + EXECUTE IMMEDIATE 'DROP PROCEDURE NESTED_PROC'; + END; + + END; + +END +$$ + +DELIMITER ; + +SET @@session.sql_mode = @old_sql_mode; diff --git a/scripts/sys_schema/packages/dbms_utility.sql b/scripts/sys_schema/packages/dbms_utility.sql new file mode 100644 index 0000000000000..54dafe4a84988 --- /dev/null +++ b/scripts/sys_schema/packages/dbms_utility.sql @@ -0,0 +1,103 @@ +DROP PACKAGE IF EXISTS dbms_utility; + +SET @old_sql_mode = @@session.sql_mode, @@session.sql_mode = oracle; + +DELIMITER $$ + +CREATE DEFINER='mariadb.sys'@'localhost' PACKAGE dbms_utility + SQL SECURITY INVOKER + COMMENT 'Collection of utility routines' + AS + FUNCTION format_error_backtrace RETURN VARCHAR(65532) + SQL SECURITY INVOKER + COMMENT ' + Description + ----------- + This procedure displays the call stack at the point where an exception was raised, even if the procedure is called from an exception handler in an outer scope. + + Raises + ------ + + ' + ; + FUNCTION format_error_stack RETURN VARCHAR(65532) + SQL SECURITY INVOKER + COMMENT ' + Description + ----------- + This function formats the current error stack. It can be used in exception handlers to look at the full error stack + + Raises + ------ + + ' + ; + FUNCTION get_time RETURN INT + SQL SECURITY INVOKER + COMMENT ' + Description + ----------- + This function returns a measure of current time in hundredths of a second + + Raises + ------ + + ' + ; +END +$$ + +CREATE DEFINER='mariadb.sys'@'localhost' PACKAGE BODY dbms_utility + SQL SECURITY INVOKER + AS + FUNCTION format_error_backtrace RETURN VARCHAR(65532) + SQL SECURITY INVOKER + COMMENT ' + Description + ----------- + This procedure displays the call stack at the point where an exception was raised, even if the procedure is called from an exception handler in an outer scope. + + Raises + ------ + + ' + IS + BEGIN + RETURN @@backtrace_str; + END; + FUNCTION format_error_stack RETURN VARCHAR(65532) + SQL SECURITY INVOKER + COMMENT ' + Description + ----------- + This function formats the current error stack. It can be used in exception handlers to look at the full error stack + + Raises + ------ + + ' + AS + BEGIN + RETURN @@errstack_str; + END; + FUNCTION get_time RETURN INT + SQL SECURITY INVOKER + COMMENT ' + Description + ----------- + This function returns a measure of current time in hundredths of a second + + Raises + ------ + + ' + IS + BEGIN + RETURN UNIX_TIMESTAMP(CURRENT_TIMESTAMP(2)); + END; +END +$$ + +DELIMITER ; + +SET @@session.sql_mode = @old_sql_mode; diff --git a/scripts/sys_schema/packages/utl_i18n.sql b/scripts/sys_schema/packages/utl_i18n.sql new file mode 100644 index 0000000000000..064cc21510674 --- /dev/null +++ b/scripts/sys_schema/packages/utl_i18n.sql @@ -0,0 +1,223 @@ +DROP PACKAGE IF EXISTS UTL_I18N; + +SET @old_sql_mode = @@session.sql_mode, @@session.sql_mode = oracle; + +DELIMITER $$ + +CREATE DEFINER='mariadb.sys'@'localhost' PACKAGE UTL_I18N + SQL SECURITY INVOKER + COMMENT 'Collection of routines to manipulate RAW data' + AS + FUNCTION transliterate(val VARCHAR2(255) CHARACTER SET ANY_CS, name VARCHAR2(255)) RETURN VARCHAR2(255) CHARACTER SET ANY_CS + SQL SECURITY INVOKER + COMMENT ' + Description + ----------- + + This function performs script transliteration. + + Parameters + ----------- + + val (VARCHAR2): + Specifies the data to be converted. + name (VARCHAR2): + Specifies the transliteration name string. + + Returns + ------- + + The converted string. + ' + ; + FUNCTION raw_to_char(jc RAW, charset_or_collation VARCHAR(255)) RETURN VARCHAR2 + SQL SECURITY INVOKER + COMMENT ' + Description + ----------- + + This function converts RAW data from a valid character set to a + VARCHAR2 string in the database character set. + + Parameters + ----------- + + jc (RAW): + Specifies the RAW data to be converted to a VARCHAR2 string + charset_or_collation (VARCHAR): + Specifies the character set that the RAW data was derived from. + + Returns + ------- + + the VARCHAR2 string equivalent in the database character set of + the RAW data. + ' + ; + FUNCTION string_to_raw(jc VARCHAR2, charset_or_collation VARCHAR(255)) RETURN RAW + SQL SECURITY INVOKER + COMMENT ' + Description + ----------- + + This function converts a VARCHAR2 string to another valid + character set and returns the result as RAW data. + + Parameters + ----------- + + jc (VARCHAR2): + Specifies the VARCHAR2 or NVARCHAR2 string to convert. + charset_or_collation (VARCHAR): + Specifies the destination character set. + + Returns + ------- + + RAW data representation of the input string in the new character set + ' + ; +END +$$ + +CREATE DEFINER='mariadb.sys'@'localhost' PACKAGE BODY UTL_I18N + SQL SECURITY INVOKER + AS + FUNCTION transliterate(val VARCHAR2(255) CHARACTER SET ANY_CS, name VARCHAR2(255)) RETURN VARCHAR2(255) CHARACTER SET ANY_CS + SQL SECURITY INVOKER + COMMENT ' + Description + ----------- + + This function performs script transliteration. + + Parameters + ----------- + + val (VARCHAR2): + Specifies the data to be converted. + name (VARCHAR2): + Specifies the transliteration name string. + + Returns + ------- + + The converted string. + ' + AS + BEGIN + RETURN transliterate(val, name); + END; + + FUNCTION raw_to_char(jc RAW, charset_or_collation VARCHAR(255)) RETURN VARCHAR2 + SQL SECURITY INVOKER + COMMENT ' + Description + ----------- + + This function converts RAW data from a valid character set to a + VARCHAR2 string in the database character set. + + Parameters + ----------- + + jc (RAW): + Specifies the RAW data to be converted to a VARCHAR2 string + charset_or_collation (VARCHAR): + Specifies the character set that the RAW data was derived from. + + Returns + ------- + + the VARCHAR2 string equivalent in the database character set of + the RAW data. + ' + IS + BEGIN + DECLARE + dst_charset VARCHAR(65532); + sourced_jc VARCHAR(65532); + targeted_sourced_jc VARCHAR(65532); + unhexed_hexed_data BLOB; + BEGIN + SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME = 'character_set_results' into dst_charset; + + CASE charset_or_collation + WHEN 'utf8' THEN + CASE dst_charset + WHEN 'utf8mb3' THEN + BEGIN + SET sourced_jc = CONVERT(jc USING utf8); + SET targeted_sourced_jc = CONVERT(sourced_jc USING utf8mb3); + END; + ELSE + RETURN NULL; + END CASE; + WHEN 'utf8mb3' THEN + CASE dst_charset + WHEN 'utf8mb4' THEN + BEGIN + SET sourced_jc = CONVERT(jc USING utf8mb3); + SET targeted_sourced_jc = CONVERT(sourced_jc USING utf8mb4); + END; + ELSE + RETURN NULL; + END CASE; + ELSE + RETURN NULL; + END CASE; + + SET unhexed_hexed_data = UNHEX(HEX(targeted_sourced_jc)); + + CASE dst_charset + WHEN 'utf8mb3' THEN + RETURN CONVERT(unhexed_hexed_data USING utf8mb3); + WHEN 'utf8mb4' THEN + RETURN CONVERT(unhexed_hexed_data USING utf8mb4); + END CASE; + RETURN NULL; + END; + + END; + + FUNCTION string_to_raw(jc VARCHAR2, charset_or_collation VARCHAR(255)) RETURN RAW + SQL SECURITY INVOKER + COMMENT ' + Description + ----------- + + This function converts a VARCHAR2 string to another valid + character set and returns the result as RAW data. + + Parameters + ----------- + + jc (VARCHAR2): + Specifies the VARCHAR2 or NVARCHAR2 string to convert. + charset_or_collation (VARCHAR): + Specifies the destination character set. + + Returns + ------- + + RAW data representation of the input string in the new character set + ' + AS + BEGIN + CASE charset_or_collation + WHEN 'utf8' THEN + RETURN CAST(CONVERT(jc USING utf8mb4) AS BINARY); + WHEN 'ucs2' THEN + RETURN CAST(CONVERT(jc USING ucs2) AS BINARY); + ELSE + RETURN NULL; + END CASE; + END; + + +END +$$ + +DELIMITER ; + +SET @@session.sql_mode = @old_sql_mode; diff --git a/sql/backtrace-inl.h b/sql/backtrace-inl.h new file mode 100644 index 0000000000000..4d0a34501c814 --- /dev/null +++ b/sql/backtrace-inl.h @@ -0,0 +1,32 @@ +/* Copyright (c) 2023, MariaDB Corporation. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */ + +#ifndef BACKTRACE_INL_INCLUDED +#define BACKTRACE_INL_INCLUDED + +#include "sql_class.h" + +inline void Backtrace::reset_backtrace_data(THD *thd) +{ + first_call= TRUE; + + thd->variables.backtrace_str= (char*)""; + thd->variables.errstack_str= (char*)""; + errstack_str.set("", 0, system_charset_info); + backtrace_std_str.set("", 0, system_charset_info); + sql_condition_handled= FALSE; +} + +#endif // BACKTRACE_INL_INCLUDED diff --git a/sql/backtrace.h b/sql/backtrace.h new file mode 100644 index 0000000000000..db82a9c1812fe --- /dev/null +++ b/sql/backtrace.h @@ -0,0 +1,71 @@ +/* Copyright (c) 2023, MariaDB Corporation. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */ + +#ifndef BACKTRACE_INCLUDED +#define BACKTRACE_INCLUDED + +#include + +#define ERRSTACK_MAX_LEN 2000 + +class sp_head; +class THD; + +struct Backtrace_info +{ + int line_no; + sp_head* sphead; +}; + +struct Error_info +{ + int err_no; + char msg[MYSQL_ERRMSG_SIZE]; +}; + +class Backtrace +{ +public: + Backtrace() + :error_stack(PSI_INSTRUMENT_MEM), + bt_list(PSI_INSTRUMENT_MEM), + erroring_bt_list(PSI_INSTRUMENT_MEM), + f1_sphead(NULL), + first_call(TRUE), + sql_condition_handled(FALSE) + { + } + + ~Backtrace() + { + bt_list.~Dynamic_array(); + } + + /** + Reset/clear all backtrace data at every start of command execution. + */ + void reset_backtrace_data(THD *thd); + + Dynamic_array error_stack; + Dynamic_array bt_list; + Dynamic_array erroring_bt_list; + sp_head* f1_sphead; + bool first_call; + bool sql_condition_handled; + String backtrace_std_str; + String errstack_str; +}; + +#endif // BACKTRACE_INCLUDED diff --git a/sql/field.h b/sql/field.h index 2797cad5da427..3f96976081685 100644 --- a/sql/field.h +++ b/sql/field.h @@ -4289,12 +4289,13 @@ class Field_varstring :public Field_longstr { uint32 len_arg, uint length_bytes_arg, uchar *null_ptr_arg, uchar null_bit_arg, enum utype unireg_check_arg, const LEX_CSTRING *field_name_arg, - TABLE_SHARE *share, const DTCollation &collation) + TABLE_SHARE *share, const DTCollation &collation, uint32 flags= 0) :Field_longstr(ptr_arg, len_arg, null_ptr_arg, null_bit_arg, unireg_check_arg, field_name_arg, collation), length_bytes(length_bytes_arg) { share->varchar_fields++; + this->flags|= flags; } Field_varstring(uint32 len_arg,bool maybe_null_arg, const LEX_CSTRING *field_name_arg, @@ -5674,6 +5675,9 @@ class Column_definition: public Sql_alloc, flags|= CONTEXT_COLLATION_FLAG; else flags&= ~CONTEXT_COLLATION_FLAG; + if (lc.type() == + Lex_column_charset_collation_attrs_st::TYPE_CHARACTER_SET_ANY_CS) + flags|= ANYCS_COLLATION_FLAG; } Lex_column_charset_collation_attrs charset_collation_attrs() const { diff --git a/sql/integer_cursor.h b/sql/integer_cursor.h new file mode 100644 index 0000000000000..7ce89cfa5547c --- /dev/null +++ b/sql/integer_cursor.h @@ -0,0 +1,87 @@ +/* Copyright (c) 2025, MariaDB Corporation & Rakuten Corp. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1335 USA */ + +#ifndef INTEGER_CURSOR_INCLUDED +#define INTEGER_CURSOR_INCLUDED + +struct cursor_statement_t +{ + int cursor_id; + int cursor_stmt_cmd; +}; + +class Dbms_sql +{ +public: + Dbms_sql() + :cursor_list(PSI_INSTRUMENT_MEM), last_cursor(-1), + in_dbmssql_execute_context(false) + { } + + int cursor_idx(int cursor_id) + { + for (int i= 0; i < (int) cursor_list.elements(); i++) + { + if (cursor_list[i].cursor_id == cursor_id) + return i; + } + return -1; // Not found + } + + int add_cursor() + { + int tmp_cursor= (last_cursor + 1) % INT_MAX; + int cursor_pos= cursor_idx(tmp_cursor); + int elements = (int) cursor_list.elements(); + while (tmp_cursor != last_cursor && cursor_pos != -1 + && cursor_pos < elements) + { + tmp_cursor= (tmp_cursor + 1) % INT_MAX; + cursor_pos= cursor_idx(tmp_cursor); + elements = (int) cursor_list.elements(); + } + + if (tmp_cursor == last_cursor) + { + // Return -1 to indicate all possible cursor integers are used + return -1; + } + last_cursor= tmp_cursor; + cursor_statement_t new_cursor_stmt; + new_cursor_stmt.cursor_id= tmp_cursor; + cursor_list.append(new_cursor_stmt); + return cursor_list.back()->cursor_id; + } + + bool del_cursor(int cursor_id) + { + for (size_t i= 0; i < cursor_list.elements(); i++) + { + if (((cursor_statement_t) cursor_list[i]).cursor_id == cursor_id) + { + cursor_list.del(i); + return 0; + } + } + return 1; + } + + Dynamic_array cursor_list; + int last_cursor; + String dbms_sql_code_str; + bool in_dbmssql_execute_context; +}; + +#endif // INTEGER_CURSOR_INCLUDED diff --git a/sql/item_create.cc b/sql/item_create.cc index 7e4d21584e0a1..1ff4811635d33 100644 --- a/sql/item_create.cc +++ b/sql/item_create.cc @@ -326,6 +326,19 @@ class Create_func_char_length : public Create_func_arg1 }; +class Create_func_dbmssql_close_cursor : public Create_func_arg1 +{ +public: + Item *create_1_arg(THD *thd, Item *arg1) override; + + static Create_func_dbmssql_close_cursor s_singleton; + +protected: + Create_func_dbmssql_close_cursor() = default; + virtual ~Create_func_dbmssql_close_cursor() = default; +}; + + class Create_func_coercibility : public Create_func_arg1 { public: @@ -1568,6 +1581,19 @@ class Create_func_lcase : public Create_func_arg1 }; +class Create_func_transliterate : public Create_func_arg2 +{ +public: + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; + + static Create_func_transliterate s_singleton; + +protected: + Create_func_transliterate() = default; + ~Create_func_transliterate() override = default; +}; + + class Create_func_least : public Create_native_func { public: @@ -1619,6 +1645,19 @@ class Create_func_old_password : public Create_func_arg1 }; +class Create_func_dbmssql_open_cursor : public Create_func_arg0 +{ +public: + Item *create_builder(THD *thd) override; + + static Create_func_dbmssql_open_cursor s_singleton; + +protected: + Create_func_dbmssql_open_cursor() = default; + ~Create_func_dbmssql_open_cursor() override = default; +}; + + class Create_func_password : public Create_func_arg1 { public: @@ -1632,6 +1671,19 @@ class Create_func_password : public Create_func_arg1 }; +class Create_func_dbmssql_parse : public Create_func_arg2 +{ +public: + Item *create_2_arg(THD *thd, Item *arg1, Item *arg2) override; + + static Create_func_dbmssql_parse s_singleton; + +protected: + Create_func_dbmssql_parse() = default; + virtual ~Create_func_dbmssql_parse() = default; +}; + + #ifndef DBUG_OFF class Create_func_like_range_min : public Create_func_arg2 { @@ -3457,6 +3509,14 @@ Create_func_char_length::create_1_arg(THD *thd, Item *arg1) } +Create_func_dbmssql_close_cursor Create_func_dbmssql_close_cursor::s_singleton; + +Item* +Create_func_dbmssql_close_cursor::create_1_arg(THD *thd, Item *arg1) +{ + return new (thd->mem_root) Item_func_dbmssql_close_cursor(thd, arg1); +} + Create_func_coercibility Create_func_coercibility::s_singleton; Item* @@ -4941,6 +5001,15 @@ Create_func_lcase::create_1_arg(THD *thd, Item *arg1) } +Create_func_transliterate Create_func_transliterate::s_singleton; + +Item* +Create_func_transliterate::create_2_arg(THD *thd, Item *arg1, Item *arg2) +{ + return new (thd->mem_root) Item_func_transliterate(thd, arg1, arg2); +} + + Create_func_least Create_func_least::s_singleton; Item* @@ -4979,6 +5048,16 @@ Create_func_old_password::create_1_arg(THD *thd, Item *arg1) Item_func_password::OLD); } +Create_func_dbmssql_open_cursor Create_func_dbmssql_open_cursor::s_singleton; + +Item* +Create_func_dbmssql_open_cursor::create_builder(THD *thd) +{ + thd->lex->safe_to_cache_query= 0; + return new (thd->mem_root) Item_func_dbmssql_open_cursor(thd); +} + + Create_func_password Create_func_password::s_singleton; Item* @@ -4987,6 +5066,14 @@ Create_func_password::create_1_arg(THD *thd, Item *arg1) return new (thd->mem_root) Item_func_password(thd, arg1); } +Create_func_dbmssql_parse Create_func_dbmssql_parse::s_singleton; + +Item* +Create_func_dbmssql_parse::create_2_arg(THD *thd, Item *arg1, Item *arg2) +{ + return new (thd->mem_root) Item_func_dbmssql_parse(thd, arg1, arg2); +} + Create_func_octet_length Create_func_octet_length::s_singleton; Item* @@ -6455,6 +6542,11 @@ const Native_func_registry func_array[] = { { STRING_WITH_LEN("DAYOFMONTH") }, BUILDER(Create_func_dayofmonth)}, { { STRING_WITH_LEN("DAYOFWEEK") }, BUILDER(Create_func_dayofweek)}, { { STRING_WITH_LEN("DAYOFYEAR") }, BUILDER(Create_func_dayofyear)}, + { { STRING_WITH_LEN("DBMS_SQL_CLOSE_CURSOR") }, BUILDER( + Create_func_dbmssql_close_cursor)}, + { { STRING_WITH_LEN("DBMS_SQL_OPEN_CURSOR") }, BUILDER( + Create_func_dbmssql_open_cursor)}, + { { STRING_WITH_LEN("DBMS_SQL_PARSE") }, BUILDER(Create_func_dbmssql_parse)}, { { STRING_WITH_LEN("DECODE") }, BUILDER(Create_func_decode)}, { { STRING_WITH_LEN("DEGREES") }, BUILDER(Create_func_degrees)}, { { STRING_WITH_LEN("DECODE_HISTOGRAM") }, BUILDER(Create_func_decode_histogram)}, @@ -6617,6 +6709,7 @@ const Native_func_registry func_array[] = { { STRING_WITH_LEN("TO_NUMBER") }, &create_func_to_number}, { { STRING_WITH_LEN("TO_DAYS") }, BUILDER(Create_func_to_days)}, { { STRING_WITH_LEN("TO_SECONDS") }, BUILDER(Create_func_to_seconds)}, + { { STRING_WITH_LEN("TRANSLITERATE") }, BUILDER(Create_func_transliterate)}, { { STRING_WITH_LEN("TRUNC") }, BUILDER(Create_func_trunc)}, { { STRING_WITH_LEN("UCASE") }, BUILDER(Create_func_ucase)}, { { STRING_WITH_LEN("UNCOMPRESS") }, BUILDER(Create_func_uncompress)}, diff --git a/sql/item_func.cc b/sql/item_func.cc index 81d514d457f28..e2832362ce43e 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -843,6 +843,45 @@ bool Item_func_connection_id::fix_fields(THD *thd, Item **ref) } +bool Item_func_dbmssql_open_cursor::fix_length_and_dec(THD *thd) +{ + if (Item_long_func::fix_length_and_dec(thd)) + return TRUE; + max_length= 10; + return FALSE; +} + + +bool Item_func_dbmssql_open_cursor::is_cursor_existent(THD *thd, int cursor_id) +{ + int cursor_pos; + int elements = (int) thd->cursor_list.elements(); + if ((cursor_pos= thd->cursor_idx(cursor_id)) > -1 && cursor_pos < elements) + return TRUE; + else + return FALSE; +} + + +bool Item_func_dbmssql_open_cursor::fix_fields(THD *thd, Item **ref) +{ + if (Item_int_func::fix_fields(thd, ref)) + return TRUE; + + if ((value= thd->add_cursor()) == -1) + { + my_printf_error(ER_STD_OVERFLOW_ERROR, + ER(ER_STD_OVERFLOW_ERROR), + MYF(0), + "All available cursors exhausted.", + func_name()); + return TRUE; // Error adding cursor + } + + return FALSE; +} + + bool Item_num_op::fix_type_handler(const Type_aggregator *aggregator) { DBUG_ASSERT(arg_count == 2); @@ -3304,6 +3343,43 @@ void Item_func_locate::print(String *str, enum_query_type query_type) } +longlong Item_func_dbmssql_parse::val_int() +{ + DBUG_ASSERT(fixed()); + longlong cursor_id= args[0]->val_int(); + longlong cursor_stmt_cmd= args[1]->val_int(); + + for (size_t i= 0; i < thd->cursor_list.elements(); i++) + { + if (thd->cursor_list[i].cursor_id == cursor_id) + { + thd->cursor_list[i].cursor_stmt_cmd= + static_cast(cursor_stmt_cmd); + break; + } + } + return 0; +} + + +longlong Item_func_dbmssql_close_cursor::val_int() +{ + DBUG_ASSERT(fixed()); + int cursor_id= static_cast(args[0]->val_int()); + if (thd->del_cursor(cursor_id)) + { + my_printf_error(ER_STD_INVALID_ARGUMENT, + ER(ER_STD_INVALID_ARGUMENT), + MYF(0), + "DBMS_SQL access denied", + func_name()); + return 1; + } + else + return 0; +} + + longlong Item_func_field::val_int() { DBUG_ASSERT(fixed()); diff --git a/sql/item_func.h b/sql/item_func.h index 0be8cf61591b1..2ef9fdad6e5e4 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -1489,6 +1489,34 @@ class Item_func_connection_id :public Item_long_func }; +class Item_func_dbmssql_open_cursor :public Item_long_func +{ + longlong value; + +public: + Item_func_dbmssql_open_cursor(THD *thd): Item_long_func(thd) + { + unsigned_flag= 1; + } + LEX_CSTRING func_name_cstring() const override + { + static LEX_CSTRING name= {STRING_WITH_LEN("open_cursor") }; + return name; + } + bool fix_length_and_dec(THD *thd) override; + bool fix_fields(THD *thd, Item **ref) override; + longlong val_int() override { DBUG_ASSERT(fixed()); return value; } + bool is_cursor_existent(THD *thd, int cursor_id); + bool check_vcol_func_processor(void *arg) override + { + return mark_unsupported_function(func_name(), "()", arg, + VCOL_SESSION_FUNC); + } + Item *do_get_copy(THD *thd) const override + { return get_item_copy(thd, this); } +}; + + class Item_func_signed :public Item_int_func { public: @@ -2725,6 +2753,57 @@ class Item_func_locate :public Item_long_func }; +class Item_func_dbmssql_parse :public Item_long_func +{ + bool check_arguments() const override + { + return check_argument_types_can_return_str(0, 2) || + (arg_count > 2 && args[2]->check_type_can_return_int( + func_name_cstring())); + } + String stmt_cmd_value; + THD* thd; +public: + Item_func_dbmssql_parse(THD *thd, Item *a, Item *b) + :Item_long_func(thd, a, b), thd(thd) {} + LEX_CSTRING func_name_cstring() const override + { + static LEX_CSTRING name= {STRING_WITH_LEN("parse") }; + return name; + } + longlong val_int() override; + Item *do_get_copy(THD *thd) const override + { return get_item_copy(thd, this); } +}; + + +class Item_func_dbmssql_close_cursor :public Item_long_func +{ + bool check_arguments() const override + { + return (arg_count > 1 && args[1]->check_type_can_return_int( + func_name_cstring())); + } + THD* thd; +public: + Item_func_dbmssql_close_cursor(THD *thd, Item *a) + :Item_long_func(thd, a), thd(thd) {} + LEX_CSTRING func_name_cstring() const override + { + static LEX_CSTRING name= {STRING_WITH_LEN("close_cursor") }; + return name; + } + longlong val_int() override; + bool fix_length_and_dec(THD *thd) override + { + max_length= MY_INT32_NUM_DECIMAL_DIGITS; + return false; + } + Item *do_get_copy(THD *thd) const override + { return get_item_copy(thd, this); } +}; + + class Item_func_field :public Item_long_func { String value,tmp; diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc index bd00ec707b5d1..f3fdf808467c7 100644 --- a/sql/item_strfunc.cc +++ b/sql/item_strfunc.cc @@ -1886,6 +1886,155 @@ String *Item_func_regexp_substr::val_str(String *str) } +bool Item_func_transliterate::fix_length_and_dec(THD *thd) +{ + if (agg_arg_charsets_for_string_result(collation, args, 1)) + return TRUE; + fix_char_length(args[0]->max_char_length()); + return FALSE; +} + + +String *Item_func_transliterate::val_str(String *str) +{ + DBUG_ASSERT(fixed()); + char buff0[MAX_FIELD_WIDTH]; + char buff1[MAX_FIELD_WIDTH]; + String tmp0(buff0,sizeof(buff0),&my_charset_bin); + String tmp1(buff1,sizeof(buff1),&my_charset_bin); + String *name= args[1]->val_str(&tmp0); + + // Check if name is NULL + if (!name) + { + null_value= true; + return nullptr; + } + + // Check if name is empty or contains only whitespace + const char *name_str= name->ptr(); + size_t name_len= name->length(); + bool only_whitespace= true; + for (size_t i= 0; i < name_len; i++) + { + if (!my_isspace(&my_charset_bin, name_str[i])) + { + only_whitespace= false; + break; + } + } + + if (name_len == 0 || only_whitespace) + { + my_printf_error(ER_STD_INVALID_ARGUMENT, + ER(ER_STD_INVALID_ARGUMENT), + MYF(0), + "This features was not implemented.", + func_name()); + null_value= true; + return nullptr; + } + + char *name_ptr= const_cast(name->ptr()); + for ( ; *name_ptr; ++name_ptr) *name_ptr= tolower(*name_ptr); + const String *hwkatakana_fwkatakana_mode= new String("hwkatakana_fwkatakana", + 21, name->charset()); + const String *fwkatakana_hwkatakana_mode= new String("fwkatakana_hwkatakana", + 21, name->charset()); + const String *kana_hiragana_mode= new String("kana_hiragana", 13, + name->charset()); + const String *kana_hwkatakana_mode= new String("kana_hwkatakana", 15, + name->charset()); + String *source= args[0]->val_str(&tmp1); + + if (!source) + { + err: + null_value= true; + return nullptr; + } + + if (source->length() == 0) + { + str->length(0); + str->set_charset(collation.collation); + null_value= false; + delete hwkatakana_fwkatakana_mode; + delete fwkatakana_hwkatakana_mode; + delete kana_hiragana_mode; + delete kana_hwkatakana_mode; + return str; + } + + if (args[0]->collation.collation != &my_charset_sjis_japanese_ci && + args[0]->collation.collation != &my_charset_ujis_japanese_ci) + { + my_printf_error(ER_STD_INVALID_ARGUMENT, + ER(ER_STD_INVALID_ARGUMENT), + MYF(0), + "wrong number or types of argument/s", + func_name()); + } + + size_t alloced_length= source->length(); + + if (str->alloc((alloced_length))) + goto err; + + str->set_charset(collation.collation); + + source->set_charset(args[0]->collation.collation); + + if (name->eq(hwkatakana_fwkatakana_mode, name->charset()) || + name->eq(kana_hiragana_mode, name->charset())) + { + to_fullwidth_converter= collation.collation->cset->halfwidth_fullwidth; + if (to_fullwidth_converter) + { + if (name->eq(hwkatakana_fwkatakana_mode, name->charset())) + str->length(to_fullwidth_converter(collation.collation, 0, + (char*) source->ptr(), source->length(), (char*) str->ptr(), + alloced_length)); + else if (name->eq(kana_hiragana_mode, name->charset())) + str->length(to_fullwidth_converter(collation.collation, 1, + (char*) source->ptr(), source->length(), (char*) str->ptr(), + alloced_length)); + } + } + else if (name->eq(fwkatakana_hwkatakana_mode, name->charset()) || + name->eq(kana_hwkatakana_mode, name->charset())) + { + to_halfwidth_converter= collation.collation->cset->fullwidth_halfwidth; + if (to_halfwidth_converter) + { + if (name->eq(fwkatakana_hwkatakana_mode, name->charset())) + str->length(to_halfwidth_converter(collation.collation, 1, + (char*) source->ptr(), source->length(), (char*) str->ptr(), + alloced_length)); + else if (name->eq(kana_hwkatakana_mode, name->charset())) + str->length(to_halfwidth_converter(collation.collation, 0, + (char*) source->ptr(), source->length(), (char*) str->ptr(), + alloced_length)); + } + } + else + { + my_printf_error(ER_STD_INVALID_ARGUMENT, + ER(ER_STD_INVALID_ARGUMENT), + MYF(0), + "This features was not implemented.", + func_name()); + } + delete hwkatakana_fwkatakana_mode; + delete fwkatakana_hwkatakana_mode; + delete kana_hiragana_mode; + delete kana_hwkatakana_mode; + to_fullwidth_converter= NULL; + to_halfwidth_converter= NULL; + return str; +} + + /************************************************************************/ diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index 51816e3eb5255..6dd515ea4eec6 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -682,6 +682,26 @@ class Item_func_lcase :public Item_str_conv { return get_item_copy(thd, this); } }; +class Item_func_transliterate :public Item_str_func +{ +protected: + my_charset_conv_to_halfwidth to_halfwidth_converter; + my_charset_conv_to_fullwidth to_fullwidth_converter; +public: + Item_func_transliterate(THD *thd, Item *a, Item *b): + Item_str_func(thd, a, b) + {} + String *val_str(String *str) override; + bool fix_length_and_dec(THD *thd) override; + LEX_CSTRING func_name_cstring() const override + { + static LEX_CSTRING name= {STRING_WITH_LEN("transliterate") }; + return name; + } + Item *do_get_copy(THD *thd) const override { return 0; } +}; + + class Item_func_ucase :public Item_str_conv { public: diff --git a/sql/lex.h b/sql/lex.h index 41a34ef738989..a274eb3f88de6 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -70,6 +70,7 @@ SYMBOL symbols[] = { { "ANALYZE", SYM(ANALYZE_SYM)}, { "AND", SYM(AND_SYM)}, { "ANY", SYM(ANY_SYM)}, + { "ANY_CS", SYM(ANY_CS_SYM)}, { "AS", SYM(AS)}, { "ASC", SYM(ASC)}, { "ASCII", SYM(ASCII_SYM)}, diff --git a/sql/lex_charset.cc b/sql/lex_charset.cc index 2a016385ed8e1..a0ede577e1c5a 100644 --- a/sql/lex_charset.cc +++ b/sql/lex_charset.cc @@ -20,7 +20,6 @@ #include "lex_charset.h" #include "mysqld_error.h" - static void raise_ER_CONFLICTING_DECLARATIONS(const char *clause1, const char *name1, @@ -484,6 +483,7 @@ CHARSET_INFO *Lex_exact_charset_extended_collation_attrs_st:: case TYPE_EMPTY: return def; case TYPE_CHARACTER_SET: + case TYPE_CHARACTER_SET_ANY_CS: { DBUG_ASSERT(m_ci); return map.get_collation_for_charset(used, m_ci); @@ -505,6 +505,13 @@ CHARSET_INFO *Lex_exact_charset_extended_collation_attrs_st:: } +Lex_exact_charset_extended_collation_attrs + Lex_exact_charset_extended_collation_attrs::any_cs() +{ + return Lex_exact_charset_extended_collation_attrs( + &my_charset_utf8mb3_general_ci, TYPE_CHARACTER_SET_ANY_CS); +} + bool Lex_exact_charset_extended_collation_attrs_st:: merge_exact_collation(const Lex_exact_collation &cl) { @@ -517,6 +524,7 @@ bool Lex_exact_charset_extended_collation_attrs_st:: *this= Lex_exact_charset_extended_collation_attrs(cl); return false; case TYPE_CHARACTER_SET: + case TYPE_CHARACTER_SET_ANY_CS: { // CHARACTER SET latin1 .. COLLATE latin1_swedish_ci Lex_exact_charset_opt_extended_collate tmp(m_ci, false); @@ -560,6 +568,7 @@ bool Lex_exact_charset_extended_collation_attrs_st:: *this= Lex_exact_charset_extended_collation_attrs(cl); return false; case TYPE_CHARACTER_SET: + case TYPE_CHARACTER_SET_ANY_CS: { // CHARACTER SET latin1 .. COLLATE DEFAULT Lex_exact_charset_opt_extended_collate tmp(m_ci, false); @@ -654,6 +663,7 @@ bool Lex_exact_charset_extended_collation_attrs_st:: return false; case TYPE_CHARACTER_SET: + case TYPE_CHARACTER_SET_ANY_CS: // CHARACTER SET cs1 .. CHARACTER SET cs2 return Lex_exact_charset(m_ci).raise_if_not_equal(cs); @@ -739,6 +749,7 @@ Lex_extended_charset_extended_collation_attrs_st:: // With CHARACTER SET DEFAULT switch (type()) { case TYPE_EMPTY: + case TYPE_CHARACTER_SET_ANY_CS: // CHARACTER SET DEFAULT; return ctx.charset_default().charset().charset_info(); diff --git a/sql/lex_charset.h b/sql/lex_charset.h index f176d11878eea..70483c1aed60f 100644 --- a/sql/lex_charset.h +++ b/sql/lex_charset.h @@ -463,7 +463,8 @@ struct Lex_exact_charset_extended_collation_attrs_st TYPE_CHARACTER_SET= 1, TYPE_COLLATE_EXACT= 2, TYPE_CHARACTER_SET_COLLATE_EXACT= 3, - TYPE_COLLATE_CONTEXTUALLY_TYPED= 4 + TYPE_COLLATE_CONTEXTUALLY_TYPED= 4, + TYPE_CHARACTER_SET_ANY_CS= 5 }; // Number of bits required to store enum Type values @@ -573,6 +574,7 @@ struct Lex_exact_charset_extended_collation_attrs_st switch (m_type) { case TYPE_CHARACTER_SET: + case TYPE_CHARACTER_SET_ANY_CS: return map.get_collation_for_charset(used, m_ci); case TYPE_EMPTY: case TYPE_CHARACTER_SET_COLLATE_EXACT: @@ -614,6 +616,7 @@ struct Lex_exact_charset_extended_collation_attrs_st return merge_context_collation(used, map, Lex_context_collation(cl.m_ci)); case TYPE_CHARACTER_SET: case TYPE_CHARACTER_SET_COLLATE_EXACT: + case TYPE_CHARACTER_SET_ANY_CS: break; } DBUG_ASSERT(0); @@ -640,6 +643,7 @@ struct Lex_exact_charset_extended_collation_attrs_st return merge_context_collation(used, map, Lex_context_collation(cl.m_ci)); case TYPE_CHARACTER_SET: case TYPE_CHARACTER_SET_COLLATE_EXACT: + case TYPE_CHARACTER_SET_ANY_CS: break; } DBUG_ASSERT(0); @@ -819,6 +823,7 @@ class Lex_exact_charset_extended_collation_attrs: Lex_exact_charset_extended_collation_attrs(&my_charset_utf8mb3_general_ci, TYPE_CHARACTER_SET); } + static Lex_exact_charset_extended_collation_attrs any_cs(); }; diff --git a/sql/log_event_server.cc b/sql/log_event_server.cc index 750614f7090ca..c195a4c6bebf4 100644 --- a/sql/log_event_server.cc +++ b/sql/log_event_server.cc @@ -1946,7 +1946,16 @@ int Query_log_event::do_apply_event(rpl_group_info *rgi, if (charset_inited) { rpl_sql_thread_info *sql_info= thd->system_thread_info.rpl_sql_info; - if (thd->slave_thread && sql_info->cached_charset_compare(charset)) + const bool applier= +#ifdef WITH_WSREP + WSREP(thd) ? thd->wsrep_applier : +#endif + false; + + // Event charset should be compared for slave thread + // and applier threads + if ((thd->slave_thread || applier) && + sql_info->cached_charset_compare(charset)) { /* Verify that we support the charsets found in the event. */ if (!(thd->variables.character_set_client= diff --git a/sql/opt_range.cc b/sql/opt_range.cc index 9f0b37f835cd7..72b9977fd5db5 100644 --- a/sql/opt_range.cc +++ b/sql/opt_range.cc @@ -10563,8 +10563,6 @@ tree_or(RANGE_OPT_PARAM *param,SEL_TREE *tree1,SEL_TREE *tree2) { bool must_be_ored= sel_trees_must_be_ored(param, tree1, tree2, ored_keys); no_imerge_from_ranges= must_be_ored; - if (param->disable_index_merge_plans) - no_imerge_from_ranges= true; if (no_imerge_from_ranges && no_merges1 && no_merges2) { @@ -10614,6 +10612,13 @@ tree_or(RANGE_OPT_PARAM *param,SEL_TREE *tree1,SEL_TREE *tree2) DBUG_RETURN(result); } + /* + Ok, the result now has the ranges that one gets for (RT1 OR RT2). + If construction of SEL_IMERGE is disabled, stop right here. + */ + if (param->disable_index_merge_plans) + DBUG_RETURN(result); + SEL_IMERGE *imerge_from_ranges; if (!(imerge_from_ranges= new SEL_IMERGE())) result= NULL; @@ -15988,6 +15993,46 @@ TRP_GROUP_MIN_MAX::make_quick(PARAM *param, bool retrieve_full_rows, } +/* + @brief + Return true if the select is using "Using index for group-by" and also + has "ORDER BY ... FETCH FIRST n ROWS WITH TIES" + + @detail + There is a rewrite that removes the ORDER BY (JOIN::order) if the select + also has a GROUP BY that produces a compatible ordering. + However "FETCH FIRST ... WITH TIES" needs an ORDER BY clause (in + JOIN::alloc_order_fields()). + GROUP BY strategies handle it this way: + - For strategies using temporary table, JOIN::make_aggr_tables_info() will + put the ORDER BY clause back. + - OrderedGroupBy in end_send_group() handles WITH TIES with the GROUP BY + clause (note that SQL doesn't allow "GROUP BY ... WITH TIES"). + - The remaining strategy is QUICK_GROUP_MIN_MAX_SELECT, for which + = the grouping strategy in the quick select doesn't handle WITH TIES. + = end_send() would not handle WITH TIES, because JOIN::order is removed. + + The solution is to NOT remove ORDER BY when QUICK_GROUP_MIN_MAX_SELECT is + used. + + Unfortunately, the optimizer then will not recognize that it can skip + sorting and will use filesort, which will prevent short-cutting the + execution when LIMIT is reached. +*/ + +bool using_with_ties_and_group_min_max(JOIN *join) +{ + if (join->unit->lim.is_with_ties()) + { + JOIN_TAB *tab= &join->join_tab[join->const_tables]; + if (tab->select && tab->select->quick && + tab->select->quick->get_type() == + QUICK_SELECT_I::QS_TYPE_GROUP_MIN_MAX) + return true; + } + return false; +} + /* Construct new quick select for group queries with min/max. diff --git a/sql/opt_range.h b/sql/opt_range.h index 823d66be27479..845bf5f845868 100644 --- a/sql/opt_range.h +++ b/sql/opt_range.h @@ -1880,6 +1880,7 @@ class QUICK_GROUP_MIN_MAX_SELECT : public QUICK_SELECT_I Explain_quick_select *get_explain(MEM_ROOT *alloc) override; }; +bool using_with_ties_and_group_min_max(JOIN *join); class QUICK_SELECT_DESC: public QUICK_RANGE_SELECT { diff --git a/sql/sp_head.cc b/sql/sp_head.cc index a6593433a3bc3..164707560197c 100644 --- a/sql/sp_head.cc +++ b/sql/sp_head.cc @@ -48,6 +48,13 @@ #endif /* WITH_WSREP */ #include +#ifndef _WIN32 +#include +#endif +#include +#ifdef _WIN32 +#include +#endif #include "mysql/psi/mysql_statement.h" #include "mysql/psi/mysql_sp.h" @@ -256,8 +263,15 @@ sp_get_flags_for_command(LEX *lex) */ case SQLCOM_EXECUTE: case SQLCOM_EXECUTE_IMMEDIATE: - flags= sp_head::MULTI_RESULTS | sp_head::CONTAINS_DYNAMIC_SQL; + { + if (lex->is_sp_dbmssql_execute(lex->thd)) + { + flags= 0; + } + else + flags= sp_head::MULTI_RESULTS | sp_head::CONTAINS_DYNAMIC_SQL; break; + } case SQLCOM_PREPARE: case SQLCOM_DEALLOCATE_PREPARE: flags= sp_head::CONTAINS_DYNAMIC_SQL; @@ -1217,6 +1231,21 @@ sp_head::execute(THD *thd, bool merge_da_on_success) #endif sp_instr *i; DEBUG_SYNC(thd, "sp_head_execute_before_loop"); + if (!thd->sql_condition_handled) + { + struct Backtrace_info instr_and_lineno; + instr_and_lineno.sphead= this; + + thd->bt_list.push(instr_and_lineno); + + if (thd->first_call) + { + thd->variables.backtrace_str= ""; + thd->variables.errstack_str= ""; + thd->first_call= false; + thd->f1_sphead= this; + } + } do { #if defined(ENABLED_PROFILING) @@ -1240,6 +1269,13 @@ sp_head::execute(THD *thd, bool merge_da_on_success) break; } + if (!thd->sql_condition_handled) + { + if (thd->bt_list.size()) + thd->bt_list.back()->line_no= i->m_lineno; + } + + /* Reset number of warnings for this query. */ thd->get_stmt_da()->reset_for_next_command(); @@ -1396,8 +1432,19 @@ sp_head::execute(THD *thd, bool merge_da_on_success) ctx->handle_sql_condition(thd, &ip, i)) { err_status= FALSE; + thd->sql_condition_handled= TRUE; + if (this == thd->f1_sphead && + !i->m_ctx->parent_context()->parent_context()) + { + construct_dbms_utility_backtrace_string(thd); + construct_dbms_utility_errstack_string(thd); + thd->bt_list.free_memory(); + thd->erroring_bt_list.free_memory(); + thd->error_stack.free_memory(); + } + } - + /* Reset sp_rcontext::end_partial_result_set flag. */ ctx->end_partial_result_set= FALSE; @@ -1415,6 +1462,20 @@ sp_head::execute(THD *thd, bool merge_da_on_success) likely(!thd->is_fatal_error) && !thd->spcont->pause_state); + if (thd->bt_list.size() && !err_status) + { + thd->bt_list.back()->sphead= NULL; + thd->bt_list.del(thd->bt_list.size() - 1); + } + if (this == thd->f1_sphead) + { + thd->variables.backtrace_str= ""; + thd->variables.errstack_str= ""; + thd->bt_list.free_memory(); + thd->erroring_bt_list.free_memory(); + thd->error_stack.free_memory(); + } + #if defined(ENABLED_PROFILING) thd->profiling.finish_current_query(); thd->profiling.start_new_query("tail end of routine"); @@ -1497,12 +1558,17 @@ sp_head::execute(THD *thd, bool merge_da_on_success) da->copy_sql_conditions_from_wi(thd, &sp_wi); da->remove_marked_sql_conditions(); if (i != NULL) + { push_warning_printf(thd, Sql_condition::WARN_LEVEL_NOTE, ER_SP_STACK_TRACE, ER_THD(thd, ER_SP_STACK_TRACE), i->m_lineno, m_qname.str != NULL ? m_qname.str : "anonymous block"); + + //save the erroring part of the error stack + save_dbms_utility_error_info(thd, this, da, i->m_lineno); + } } } @@ -1571,6 +1637,203 @@ sp_head::execute(THD *thd, bool merge_da_on_success) DBUG_RETURN(err_status); } +void sp_head::save_dbms_utility_error_info(THD *thd, sp_head *sphead, + Diagnostics_area *da, const int line_no) const +{ + struct Backtrace_info instr_and_linno; + instr_and_linno.line_no= line_no; + instr_and_linno.sphead= sphead; + thd->erroring_bt_list.push(instr_and_linno); + + struct Error_info msg_and_errno; + msg_and_errno.err_no= da->get_sql_errno(); + if (da->is_set()) + strcpy(msg_and_errno.msg, da->message()); + thd->error_stack.push(msg_and_errno); +} + +bool sp_head::check_errstack_str_length_and_append(THD *thd, const + LEX_CSTRING &str, CHARSET_INFO *cs_info) + const +{ + return (check_errstack_str_length_and_append(thd, str.str, str.length, + cs_info)); +} + +bool sp_head::construct_dbms_utility_errstack_string_line(THD *thd, + Dynamic_array &frames_list, const int loop_ctr, + CHARSET_INFO *cs_info) const +{ + char err[10]= ""; + char line_no_str[20]= ""; + + sprintf(err, "%i", ER_SP_STACK_TRACE); + sprintf(line_no_str, "%i", frames_list[loop_ctr].line_no); + + if (check_errstack_str_length_and_append(thd, err, strlen(err), + cs_info)) + return true; + if (check_errstack_str_length_and_append(thd, {STRING_WITH_LEN(": ")}, + cs_info)) + return true; + if (check_errstack_str_length_and_append(thd, thd->main_security_ctx.user, + strlen(thd->main_security_ctx.user), + cs_info)) + return true; + if (check_errstack_str_length_and_append(thd, {STRING_WITH_LEN(".")}, + cs_info)) + return true; + if (check_errstack_str_length_and_append(thd, + frames_list[loop_ctr].sphead->m_qname.str, + frames_list[loop_ctr].sphead->m_qname.length, + cs_info)) + return true; + if (check_errstack_str_length_and_append(thd, {STRING_WITH_LEN(" at line ")}, + cs_info)) + return true; + if (check_errstack_str_length_and_append(thd, line_no_str, + strlen(line_no_str), cs_info)) + return true; + if (check_errstack_str_length_and_append(thd, {STRING_WITH_LEN("\n")}, + cs_info)) + return true; + return false; +} + +#ifdef _WIN32 +int is_valid_pointer(void *ptr) { + if (!ptr) + return 0; + MEMORY_BASIC_INFORMATION mbi; + if (VirtualQuery(ptr, &mbi, sizeof(mbi)) == 0) + return 0; + if (mbi.State != MEM_COMMIT) + return 0; + if (mbi.Protect & (PAGE_GUARD | PAGE_NOACCESS)) + return 0; + // Strip modifier flags (PAGE_GUARD, PAGE_NOCACHE, etc.) to get base protection + DWORD base_protect = mbi.Protect & 0xFF; + // Reject execute-only pages (all other base protections allow reading) + if (base_protect == PAGE_EXECUTE) + return 0; + + return 1; +} +#else +int is_valid_pointer(void *ptr) { + int fd = open("/dev/random", O_WRONLY); + if (fd < 0) return 0; + int valid = (write(fd, ptr, 1) >= 0); + close(fd); + return valid; +} +#endif + +void sp_head::construct_dbms_utility_backtrace_string_line(THD *thd, + Dynamic_array &frames_list, const int loop_ctr) const +{ + if (is_valid_pointer((void *) frames_list[loop_ctr].sphead->m_qname.str)) + { + char err[10]= ""; + char line_no_str[20]= ""; + + sprintf(err, "%i", ER_SP_STACK_TRACE); + sprintf(line_no_str, "%i", frames_list[loop_ctr].line_no); + + thd->backtrace_std_str.append({err, strlen(err)}); + thd->backtrace_std_str.append({STRING_WITH_LEN(": ")}); + thd->backtrace_std_str.append({thd->main_security_ctx.user, strlen( + thd->main_security_ctx.user)}); + thd->backtrace_std_str.append('.'); + if (frames_list[loop_ctr].sphead->m_qname.length && + frames_list[loop_ctr].sphead->m_qname.length < UINT_MAX32) + thd->backtrace_std_str.append({frames_list[loop_ctr].sphead->m_qname.str, + frames_list[loop_ctr].sphead->m_qname.length}); + thd->backtrace_std_str.append({STRING_WITH_LEN(" at line ")}); + thd->backtrace_std_str.append({line_no_str, strlen(line_no_str)}); + thd->backtrace_std_str.append('\n'); + } +} + +bool sp_head::check_errstack_str_length_and_append(THD *thd, const char *str, + const size_t str_length, CHARSET_INFO *cs_info) const +{ + if (is_valid_pointer((void *) str)) + { + int byte_length= thd->errstack_str.length(); + if (byte_length + str_length < ERRSTACK_MAX_LEN) + { + thd->errstack_str.append(str, str_length, cs_info); + return false; + } + else + { + thd->errstack_str.append(str, ERRSTACK_MAX_LEN- byte_length, cs_info); + return true; + } + } + else + return true; +} + +void sp_head::construct_dbms_utility_errstack_string(THD *thd) const +{ + //construct backtrace_str starting with reversed errframes_strs + int err_frames_strs_size= + static_cast(thd->error_stack.size()); + for (int loop_ctr= err_frames_strs_size - 1; loop_ctr >= 0; + loop_ctr--) + { + //construct string with err msg + char err[10]= ""; + + sprintf(err, "%i", thd->error_stack[loop_ctr].err_no); + if (check_errstack_str_length_and_append(thd, err, strlen(err), + thd->errstack_str.charset())) + break; + if (check_errstack_str_length_and_append(thd, {STRING_WITH_LEN(": ")}, + thd->errstack_str.charset())) + break; + if (check_errstack_str_length_and_append(thd, + thd->error_stack[loop_ctr].msg, + strlen(thd->error_stack[loop_ctr].msg), + thd->errstack_str.charset())) + break; + if (check_errstack_str_length_and_append(thd, {STRING_WITH_LEN("\n")}, + thd->errstack_str.charset())) + break; + + //construct string with no err msg + if (construct_dbms_utility_errstack_string_line(thd, + thd->erroring_bt_list, loop_ctr, thd->errstack_str.charset())) + break; + } + //append the non-erroring frames also in reversed order + int normalframes_strs_size= + static_cast(thd->bt_list.size()); + for (int loop_ctr= normalframes_strs_size - 2; loop_ctr >= 0; + loop_ctr--) + { + if (construct_dbms_utility_errstack_string_line(thd, + thd->bt_list, loop_ctr, thd->errstack_str.charset())) + break; + } + thd->variables.errstack_str= thd->errstack_str.c_ptr(); +} + +void sp_head::construct_dbms_utility_backtrace_string(THD *thd) const +{ + if (thd->erroring_bt_list.size()) + construct_dbms_utility_backtrace_string_line(thd, thd->erroring_bt_list, 0); + int normalframes_strs_size= + static_cast(thd->bt_list.size()); + for (int loop_ctr= normalframes_strs_size - 2; loop_ctr >= 0; + loop_ctr--) + { + construct_dbms_utility_backtrace_string_line(thd, thd->bt_list, loop_ctr); + } + thd->variables.backtrace_str= thd->backtrace_std_str.c_ptr(); +} #ifndef NO_EMBEDDED_ACCESS_CHECKS /** diff --git a/sql/sp_head.h b/sql/sp_head.h index 61df587652522..6007b6e7cf001 100644 --- a/sql/sp_head.h +++ b/sql/sp_head.h @@ -1009,6 +1009,19 @@ class sp_head :private Query_arena, bool execute(THD *thd, bool merge_da_on_success); + bool construct_dbms_utility_errstack_string_line(THD *thd, Dynamic_array< + Backtrace_info> &, const int, CHARSET_INFO *) const; + bool check_errstack_str_length_and_append(THD *thd, + const LEX_CSTRING &, CHARSET_INFO *) const; + bool check_errstack_str_length_and_append(THD *thd, const char *, + const size_t, CHARSET_INFO *) const; + void construct_dbms_utility_errstack_string(THD *thd) const; + void construct_dbms_utility_backtrace_string(THD *thd) const; + void construct_dbms_utility_backtrace_string_line(THD *thd, Dynamic_array< + Backtrace_info> &, const int) const; + void save_dbms_utility_error_info(THD *thd, sp_head*, Diagnostics_area*, + int) const; + /** Perform a forward flow analysis in the generated code. Mark reachable instructions, for the optimizer. diff --git a/sql/sp_instr.cc b/sql/sp_instr.cc index 67ccac85ab973..944e8600d76b4 100644 --- a/sql/sp_instr.cc +++ b/sql/sp_instr.cc @@ -1272,6 +1272,54 @@ sp_instr_stmt::exec_core(THD *thd, uint *nextp) } +int sp_instr_stmt_dbmssql_execute::execute(THD *thd, uint *nextp) +{ + auto lex= m_lex; + Item *it= (Item *) lex->value_list.first_node()->info; + int res; + + it= thd->sp_prepare_func_item(&it, 1); + if (! it || it->check_type_can_return_str({ + STRING_WITH_LEN("dbmssql_execute")})) + { + res= -1; + } + else + { + StringBuffer + buffer(thd->variables.character_set_client); + String *str= it->val_str(&buffer); + if (!str) + { + my_error(ER_INVALID_USE_OF_NULL, MYF(0)); + return true; + } + int cursor_id= atoi(str->ptr() + 1); + int cursor_idx= thd->cursor_idx(cursor_id); + if (thd->cursor_list[cursor_idx].cursor_stmt_cmd > -1 + && thd->cursor_list[cursor_idx].cursor_stmt_cmd < 4) + { + return true; + } + lex->prepared_stmt.set(Lex_ident_sys( + str->ptr(), str->length()), + NULL, NULL); + if (str != &buffer) + buffer.copy(*str); + + LEX *old_lex= thd->lex; + thd->lex= lex; + + res= sp_instr_stmt::execute(thd, nextp); + + thd->lex= old_lex; + thd->in_dbmssql_execute_context= false; + } + + return res; +} + + /* sp_instr_set class functions */ diff --git a/sql/sp_instr.h b/sql/sp_instr.h index 78b7a6c03ad8a..b8c4fbea70ef8 100644 --- a/sql/sp_instr.h +++ b/sql/sp_instr.h @@ -617,6 +617,21 @@ class sp_instr_stmt : public sp_lex_instr }; // class sp_instr_stmt : public sp_lex_instr +class sp_instr_stmt_dbmssql_execute : public sp_instr_stmt +{ +public: + sp_instr_stmt_dbmssql_execute(uint ip, sp_pcontext *ctx, LEX *lex, + const LEX_STRING& query, THD *thd) + :sp_instr_stmt(ip, ctx, lex, query), m_lex(lex) + { + } + + int execute(THD *thd, uint *nextp) override; +private: + LEX *m_lex; +}; + + class sp_instr_set : public sp_lex_instr, public sp_rcontext_addr { diff --git a/sql/sp_rcontext.cc b/sql/sp_rcontext.cc index b360e16b97452..6027deaf1e731 100644 --- a/sql/sp_rcontext.cc +++ b/sql/sp_rcontext.cc @@ -673,10 +673,25 @@ uint sp_rcontext::exit_handler(Diagnostics_area *da) } +void sp_rcontext::fix_anycs_collation( + uint idx, Item **value +) +{ + Item_field *item_field= get_variable(idx); + item_field->collation.collation= (*value)->collation.collation; + Field_str *string_field= dynamic_cast(m_var_table->field[idx]); + if (string_field) + string_field->change_charset((*value)->collation); +} + + int sp_rcontext::set_variable(THD *thd, uint idx, Item **value) { DBUG_ENTER("sp_rcontext::set_variable"); DBUG_ASSERT(value); + if (m_var_table->field[idx]->flags & ANYCS_COLLATION_FLAG) + fix_anycs_collation(idx, value); + auto handler= get_variable(idx)->type_handler()->to_composite(); DBUG_RETURN(thd->sp_eval_expr(m_var_table->field[idx], value) || diff --git a/sql/sp_rcontext.h b/sql/sp_rcontext.h index 484d0e000ff1f..d11904d28212e 100644 --- a/sql/sp_rcontext.h +++ b/sql/sp_rcontext.h @@ -211,6 +211,9 @@ class sp_rcontext : public Sql_alloc Item **value); int set_variable_row(THD *thd, uint var_idx, List &items); + void fix_anycs_collation( + uint var_idx, Item **value); + int set_variable_composite_field_by_key(THD *thd, uint var_idx, const LEX_CSTRING &elem_name, diff --git a/sql/sql_base.cc b/sql/sql_base.cc index bd09730fd75b1..5f371fc885fe0 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -2045,7 +2045,14 @@ bool open_table(THD *thd, TABLE_LIST *table_list, Open_table_context *ot_ctx) table->query_id == 0)) { int distance= ((int) table->reginfo.lock_type - - (int) table_list->lock_type); + (int) table_list->lock_type) * 2; + /* + if we need a table for inserting, make sure it has + its internal tables (a.k.a. sequences) ready + */ + if (table->internal_tables && + table_list->for_insert_data == !table->internal_tables->table) + distance|= 1; /* Find a table that either has the exact lock type requested, @@ -5018,7 +5025,8 @@ bool DML_prelocking_strategy::handle_routine(THD *thd, if (rt != (Sroutine_hash_entry*)prelocking_ctx->sroutines_list.first || rt->mdl_request.key.mdl_namespace() != MDL_key::PROCEDURE) { - *need_prelocking= TRUE; + if (!thd->in_dbmssql_execute_context) + *need_prelocking= TRUE; sp_update_stmt_used_routines(thd, prelocking_ctx, &sp->m_sroutines, rt->belong_to_view); (void)sp->add_used_tables_to_table_list(thd, diff --git a/sql/sql_class.h b/sql/sql_class.h index 478ebc5cdb527..3c3a3daab53ec 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -32,6 +32,8 @@ #include "log.h" #include "rpl_tblmap.h" #include "mdl.h" +#include "backtrace.h" +#include "integer_cursor.h" #include "field.h" // Create_field #include "opt_trace_context.h" #include "probes_mysql.h" @@ -953,6 +955,9 @@ typedef struct system_variables my_bool binlog_alter_two_phase; Charset_collation_map_st character_set_collations; + + const char* backtrace_str; + const char* errstack_str; } SV; /** @@ -2843,13 +2848,6 @@ class Sp_caches DBUG_ASSERT(sp_package_spec_cache == NULL); DBUG_ASSERT(sp_package_body_cache == NULL); } - void sp_caches_swap(Sp_caches &rhs) - { - swap_variables(sp_cache*, sp_proc_cache, rhs.sp_proc_cache); - swap_variables(sp_cache*, sp_func_cache, rhs.sp_func_cache); - swap_variables(sp_cache*, sp_package_spec_cache, rhs.sp_package_spec_cache); - swap_variables(sp_cache*, sp_package_body_cache, rhs.sp_package_body_cache); - } void sp_caches_clear(); /** Clear content of sp related caches. @@ -3086,6 +3084,8 @@ class THD: public THD_count, /* this must be first */ public MDL_context_owner, public Open_tables_state, public Sp_caches, + public Dbms_sql, + public Backtrace, public Statement_rcontext { private: @@ -8579,6 +8579,7 @@ LEX_CSTRING make_string(THD *thd, const char *start_ptr, const char *end_ptr); #include "deprecation.h" +#include "backtrace-inl.h" #endif /* MYSQL_SERVER */ #endif /* SQL_CLASS_INCLUDED */ diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index 807083493119a..d0aa138abd633 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -3476,11 +3476,11 @@ bool Delayed_insert::open_and_lock_table() return TRUE; } - if (table->triggers || table->check_constraints) + if (table->triggers || table->check_constraints || table->internal_tables) { /* - Table has triggers or check constraints. This is not an error, but we do - not support these with delayed insert. Terminate the delayed + Table uses triggers, check constraints or sequences. This is not an error, + but we do not support these with delayed insert. Terminate the delayed thread without an error and thus request lock upgrade. */ return TRUE; diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index c358cd913c0dc..e935afc6c3168 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -2036,6 +2036,12 @@ int Lex_input_stream::lex_one_token(YYSTYPE *yylval, THD *thd) const uchar *const state_map= cs->state_map; const uchar *const ident_map= cs->ident_map; + if (thd->killed) + { + thd->send_kill_message(); + return END_OF_INPUT; + } + start_token(); state= next_state; next_state= MY_LEX_OPERATOR_OR_IDENT; @@ -10182,6 +10188,31 @@ bool LEX::add_create_view(THD *thd, DDL_options_st ddl, } +bool LEX::is_sp_dbmssql_execute(THD *thd) +{ + if (!thd->lex->sphead) + return false; + Sql_cmd_call* cmd_call= dynamic_cast(m_sql_cmd); + if (!cmd_call) + return false; + const Lex_ident_sys keyword_str({STRING_WITH_LEN("dbmssql_execute")}); + const char *spname_cstr= cmd_call->m_name->m_name.str; + const Lex_ident_sys spname_str(spname_cstr, strlen(spname_cstr)); + if (thd->cursor_list.elements() && lex_string_eq(&keyword_str, &spname_str)) + { + const Lex_ident_sys caller_str({STRING_WITH_LEN("sys.dbms_sql.execute")}); + if (!lex_string_eq(&caller_str, &thd->lex->sphead->m_qname)) + return false; + else{ + thd->in_dbmssql_execute_context= true; + return true; + } + } + else + return false; +} + + bool LEX::call_statement_start(THD *thd, sp_name *name) { Database_qualified_name pkgname; @@ -11844,9 +11875,16 @@ bool LEX::new_sp_instr_stmt(THD *thd, */ qbuff.str[prefix.length + suffix.length]= 0; - if (!(i= new (thd->mem_root) sp_instr_stmt(sphead->instructions(), - spcont, this, qbuff))) - return true; + if (is_sp_dbmssql_execute(thd) && thd->cursor_list.elements()) + { + if (!(i= new (thd->mem_root) sp_instr_stmt_dbmssql_execute( + sphead->instructions(), spcont, this, qbuff, thd))) + return true; + } + else + if (!(i= new (thd->mem_root) sp_instr_stmt(sphead->instructions(), + spcont, this, qbuff))) + return true; return sphead->add_instr(i); } @@ -12714,6 +12752,18 @@ bool LEX::stmt_execute(const Lex_ident_sys_st &ident, List *params) } +bool LEX::stmt_execute_dbmssql() +{ + sql_command= SQLCOM_EXECUTE; + prepared_stmt.set(Lex_ident_sys( + "", + 0), + NULL, NULL); + my_hash_reset(&sroutines); + return stmt_prepare_validate("EXECUTE..USING"); +} + + void LEX::stmt_deallocate_prepare(const Lex_ident_sys_st &ident) { sql_command= SQLCOM_DEALLOCATE_PREPARE; diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 83b3c5ae43c8f..007b0e07c1e61 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -3947,6 +3947,7 @@ struct LEX: public Query_tables_list const sp_name *name, const sp_name *name2, const char *cpp_body_end); + bool is_sp_dbmssql_execute(THD *); bool call_statement_start(THD *thd, sp_name *name); bool call_statement_start(THD *thd, const Lex_ident_sys_st *name); bool call_statement_start(THD *thd, const Lex_ident_sys_st *name1, @@ -4974,6 +4975,7 @@ struct LEX: public Query_tables_list bool stmt_prepare(const Lex_ident_sys_st &ident, Item *code); bool stmt_execute(const Lex_ident_sys_st &ident, List *params); bool stmt_execute_immediate(Item *code, List *params); + bool stmt_execute_dbmssql(); void stmt_deallocate_prepare(const Lex_ident_sys_st &ident); bool stmt_alter_table_exchange_partition(Table_ident *table); diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 81ab65e8f2f88..5e3dec7b5bcc4 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -3225,6 +3225,10 @@ bool Sql_cmd_call::execute(THD *thd) { TABLE_LIST *all_tables= thd->lex->query_tables; sp_head *sp; + if (!thd->spcont) + { + thd->reset_backtrace_data(thd); + } /* This will cache all SP and SF and open and lock all tables required for execution. @@ -7483,7 +7487,6 @@ void THD::reset_for_next_command(bool do_clear_error) DBUG_VOID_RETURN; } - /** Used to allocate a new SELECT_LEX object on the current thd mem_root and link it into the relevant lists. diff --git a/sql/sql_select.cc b/sql/sql_select.cc index d5152d5b51566..0e625d4ec0491 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -3275,9 +3275,14 @@ int JOIN::optimize_stage2() (as MariaDB is by default sorting on GROUP BY) or if there is no GROUP BY and aggregate functions are used (as the result will only contain one row). + + (1) - Do not remove ORDER BY if we have WITH TIES and are using + QUICK_GROUP_MIN_MAX_SELECT to handle GROUP BY. See the comment + for using_with_ties_and_group_min_max() for details. */ if (order && (test_if_subpart(group_list, order) || - (!group_list && tmp_table_param.sum_func_count))) + (!group_list && tmp_table_param.sum_func_count)) && + !using_with_ties_and_group_min_max(this)) // (1) order=0; // Can't use sort on head table if using join buffering @@ -8816,7 +8821,26 @@ best_access_path(JOIN *join, ulong key_flags; uint key_parts; key_part_map found_part= 0; - /* key parts which won't have NULL in lookup tuple */ + + /* + Bitmap indicating which key parts are used with NULL-rejecting + conditions. + + A bit is set to 1 for a key part if it's used with a + NULL-rejecting condition (i.e., the condition will never be + satisfied when the indexed column contains NULL). A bit is 0 if + the key part is used with a non-NULL-rejecting condition (i.e., + the condition can be satisfied even when the indexed column + contains NULL, e.g., is NULL or <=>). + + Example: for condition + t1.keypart1 = t2.col1 AND t1.keypart2 <=> t2.col2 AND + t1.keypart3 = t2.col3 + the notnull_part bitmap will be 101 (binary), because: + - keypart1: '=' is NULL-rejecting (bit 1) + - keypart2: '<=>' is NOT NULL-rejecting (bit 0) + - keypart3: '=' is NULL-rejecting (bit 1) + */ key_part_map notnull_part=0; table_map found_ref= 0; uint key= keyuse->key; @@ -9071,7 +9095,8 @@ best_access_path(JOIN *join, } else { - if (!(records= keyinfo->actual_rec_per_key(key_parts-1))) + if (!(records= + keyinfo->rec_per_key_null_aware(key_parts-1, notnull_part))) { /* Prefer longer keys */ trace_access_idx.add("rec_per_key_stats_missing", true); records= @@ -9203,7 +9228,9 @@ best_access_path(JOIN *join, else { /* Check if we have statistic about the distribution */ - if ((records= keyinfo->actual_rec_per_key(max_key_part-1))) + if ((records= + keyinfo->rec_per_key_null_aware(max_key_part-1, + notnull_part))) { /* Fix for the case where the index statistics is too @@ -14763,7 +14790,6 @@ make_join_select(JOIN *join,SQL_SELECT *select,COND *cond) if (build_tmp_join_prefix_cond(join, tab, &sel->cond)) return true; - /* We can't call sel->cond->fix_fields, as it will break tab->on_expr if it's AND condition diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 18d7ad8215afc..0d8ff487bfdc4 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -5490,30 +5490,6 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond) uint table_open_method= tables->table_open_method; bool can_deadlock; MEM_ROOT tmp_mem_root; - /* - We're going to open FRM files for tables. - In case of VIEWs that contain stored function calls, - these stored functions will be parsed and put to the SP cache. - - Suppose we have a view containing a stored function call: - CREATE VIEW v1 AS SELECT f1() AS c1; - and now we're running: - SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME=f1(); - If a parallel thread invalidates the cache, - e.g. by creating or dropping some stored routine, - the SELECT query will re-parse f1() when processing "v1" - and replace the outdated cached version of f1() to a new one. - But the old version of f1() is referenced from the m_sp member - of the Item_func_sp instances used in the WHERE condition. - We cannot destroy it. To avoid such clashes, let's remember - all old routines into a temporary SP cache collection - and process tables with a new empty temporary SP cache collection. - Then restore to the old SP cache collection at the end. - */ - Sp_caches old_sp_caches; - - old_sp_caches.sp_caches_swap(*thd); - bzero(&tmp_mem_root, sizeof(tmp_mem_root)); /* @@ -5739,14 +5715,6 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond) err: thd->restore_backup_open_tables_state(&open_tables_state_backup); free_root(&tmp_mem_root, 0); - - /* - Now restore to the saved SP cache collection - and clear the temporary SP cache collection. - */ - old_sp_caches.sp_caches_swap(*thd); - old_sp_caches.sp_caches_clear(); - DBUG_RETURN(error); } diff --git a/sql/sql_statistics.cc b/sql/sql_statistics.cc index e37df74f538b8..918c6fe8524d0 100644 --- a/sql/sql_statistics.cc +++ b/sql/sql_statistics.cc @@ -3122,7 +3122,10 @@ read_statistics_for_table(THD *thd, TABLE *table, found|= index_stat.get_stat_values(index_statistics); } if (found) + { new_stats_cb->stats_available|= TABLE_STAT_INDEX; + index_statistics->mark_stats_as_read(); + } key_part_map ext_key_part_map= key_info->ext_key_part_map; if (key_info->user_defined_key_parts != key_info->ext_key_parts && @@ -4160,7 +4163,7 @@ void set_statistics_for_table(THD *thd, TABLE *table) (check_eits_preferred(thd) && table->stats_is_read && key_info->read_stats->avg_frequency_is_inited() && - key_info->read_stats->get_avg_frequency(0) > 0.5); + key_info->read_stats->has_stats()); } } diff --git a/sql/sql_statistics.h b/sql/sql_statistics.h index 8f7b55e97e133..6ceb59b88106e 100644 --- a/sql/sql_statistics.h +++ b/sql/sql_statistics.h @@ -603,10 +603,19 @@ class Index_statistics k-component prefixes among them */ ulonglong *avg_frequency; + bool stats_were_read; public: - void init_avg_frequency(ulonglong *ptr) { avg_frequency= ptr; } + void init_avg_frequency(ulonglong *ptr) + { + avg_frequency= ptr; + stats_were_read= false; + } + + void mark_stats_as_read() { stats_were_read= true; } + + bool has_stats() const { return stats_were_read; } bool avg_frequency_is_inited() { return avg_frequency != NULL; } diff --git a/sql/sql_table.cc b/sql/sql_table.cc index 926afe301cbd0..09d8ed284b05f 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -5111,32 +5111,35 @@ bool wsrep_check_sequence(THD* thd, const bool used_engine) { enum legacy_db_type db_type; + const LEX_CSTRING *engine_name; DBUG_ASSERT(WSREP(thd)); if (used_engine) { db_type= thd->lex->create_info.db_type->db_type; + // Currently any dynamic storage engine is not possible to identify + // using DB_TYPE_XXXX and ENGINE=SEQUENCE is one of them. + // Therefore, we get storage engine name from lex. + engine_name= + thd->lex->m_sql_cmd->option_storage_engine_name()->name(); } else { const handlerton *hton= ha_default_handlerton(thd); db_type= hton->db_type; + engine_name= hton_name(hton); } // In Galera cluster we support only InnoDB sequences if (db_type != DB_TYPE_INNODB) { - // Currently any dynamic storage engine is not possible to identify - // using DB_TYPE_XXXX and ENGINE=SEQUENCE is one of them. - // Therefore, we get storage engine name from lex. - const LEX_CSTRING *tb_name= thd->lex->m_sql_cmd->option_storage_engine_name()->name(); // (1) CREATE TABLE ... ENGINE=SEQUENCE OR // (2) ALTER TABLE ... ENGINE= OR // Note in ALTER TABLE table->s->sequence != nullptr // (3) CREATE SEQUENCE ... ENGINE= if ((thd->lex->sql_command == SQLCOM_CREATE_TABLE && - lex_string_eq(tb_name, STRING_WITH_LEN("SEQUENCE"))) || + lex_string_eq(engine_name, STRING_WITH_LEN("SEQUENCE"))) || (thd->lex->sql_command == SQLCOM_ALTER_TABLE) || (thd->lex->sql_command == SQLCOM_CREATE_SEQUENCE)) { @@ -5144,7 +5147,8 @@ bool wsrep_check_sequence(THD* thd, "non-InnoDB sequences in Galera cluster"); push_warning_printf(thd, Sql_condition::WARN_LEVEL_NOTE, ER_NOT_SUPPORTED_YET, - "ENGINE=%s not supported by Galera", tb_name->str); + "ENGINE=%s not supported by Galera", + engine_name->str); return(true); } } @@ -11972,6 +11976,7 @@ do_continue:; } else { + /* MERGE TABLE */ if (!table->s->tmp_table && wait_while_table_is_used(thd, table, HA_EXTRA_FORCE_REOPEN)) goto err_new_table_cleanup; @@ -11980,6 +11985,8 @@ do_continue:; alter_info->keys_onoff); if (trans_commit_stmt(thd) || trans_commit_implicit(thd)) goto err_new_table_cleanup; + /* Ensure that the ALTER is binlogged as a DDL */ + thd->transaction->stmt.mark_trans_did_ddl(); } thd->count_cuted_fields= CHECK_FIELD_IGNORE; diff --git a/sql/sql_type.cc b/sql/sql_type.cc index 3cd712b28d253..b348d9e6acf5e 100644 --- a/sql/sql_type.cc +++ b/sql/sql_type.cc @@ -8565,7 +8565,7 @@ Field *Type_handler_varchar:: Field_varstring(rec.ptr(), (uint32) attr->length, HA_VARCHAR_PACKLENGTH((uint32) attr->length), rec.null_ptr(), rec.null_bit(), - attr->unireg_check, name, share, attr->charset); + attr->unireg_check, name, share, attr->charset, flags); } diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index dd742bc47f523..bd2bbb7d1f609 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -744,6 +744,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); %token RECORD_SYM %token ROWTYPE_MARIADB_SYM // PLSQL-R %token ROWNUM_SYM /* Oracle-R */ +%token ANY_CS_SYM /* SQL functions with a special syntax @@ -1447,6 +1448,10 @@ bool my_yyoverflow(short **a, YYSTYPE **b, size_t *yystacksize); field_type_misc json_table_field_type +%ifdef ORACLE +%type field_type_any_cs +%endif + %ifdef ORACLE %type assoc_array_table_types %endif @@ -3362,6 +3367,9 @@ call: } opt_sp_cparam_list { + if (Lex->is_sp_dbmssql_execute(thd) && thd->cursor_list.elements()) + Lex->stmt_execute_dbmssql(); + if (Lex->check_cte_dependencies_and_resolve_references()) MYSQL_YYABORT; } @@ -19540,6 +19548,11 @@ sf_return_type: if (unlikely(Lex->sf_return_fill_definition($1))) MYSQL_YYABORT; } + | field_type_any_cs + { + if (unlikely(Lex->sf_return_fill_definition($1))) + MYSQL_YYABORT; + } | ROW_SYM row_type_body { if (Lex->sf_return_fill_definition_row($2)) @@ -20133,6 +20146,15 @@ package_specification_element: %ifdef ORACLE +field_type_any_cs: + VARCHAR2_ORACLE_SYM opt_field_length charset ANY_CS_SYM opt_compressed + { + $$.set(&type_handler_varchar, $2, + Lex_exact_charset_extended_collation_attrs::any_cs()); + Lex->map_data_type(Lex_ident_sys(), &$$); + } + ; + sp_decl_variable_list_anchored: sp_decl_idents_init_vars optionally_qualified_column_ident PERCENT_ORACLE_SYM TYPE_SYM @@ -20168,6 +20190,11 @@ sp_param_init_vars: if (unlikely(Lex->sp_param_fill_definition($$= $1, $2))) MYSQL_YYABORT; } + | sp_param_name_and_mode_init_vars field_type_any_cs + { + if (unlikely(Lex->sp_param_fill_definition($$= $1, $2))) + MYSQL_YYABORT; + } | sp_param_name_and_mode_init_vars ROW_SYM row_type_body { if (unlikely(Lex->sphead->spvar_fill_row(thd, $$= $1, $3))) diff --git a/sql/structs.h b/sql/structs.h index 3dda2047d0b6e..8be1a60d9f0ff 100644 --- a/sql/structs.h +++ b/sql/structs.h @@ -173,7 +173,9 @@ typedef struct st_key { engine_option_value *option_list; ha_index_option_struct *option_struct; /* structure with parsed options */ - double actual_rec_per_key(uint i) const; + double actual_rec_per_key(uint last_key_part_in_prefix) const; + double rec_per_key_null_aware(uint last_key_part_in_prefix, + key_part_map notnull_part) const; } KEY; diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc index 18d3436687cf2..258b1810ff16a 100644 --- a/sql/sys_vars.cc +++ b/sql/sys_vars.cc @@ -7427,6 +7427,20 @@ static Sys_var_charptr Sys_redirect_url( SESSION_VAR(redirect_url), CMD_LINE(REQUIRED_ARG), DEFAULT(""), NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(sysvar_validate_redirect_url)); +static Sys_var_charptr Sys_errstack_str( + "errstack_str", + "Current error stack when error(s) occur. " + "Empty string means no error occured", + READ_ONLY SESSION_VAR(errstack_str), NO_CMD_LINE, DEFAULT(""), + NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0)); + +static Sys_var_charptr Sys_backtrace_str( + "backtrace_str", + "Backtrace string when error(s) occur. " + "Empty string means no error occured", + READ_ONLY SESSION_VAR(backtrace_str), NO_CMD_LINE, DEFAULT(""), + NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(0)); + static Sys_var_sesvartrack Sys_track_session_sys_vars( "session_track_system_variables", "Track changes in registered system variables", diff --git a/sql/table.cc b/sql/table.cc index ae25eb396d04e..0b5fb55113564 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -10480,12 +10480,107 @@ uint TABLE_SHARE::actual_n_key_parts(THD *thd) } -double KEY::actual_rec_per_key(uint i) const +/** + Get records-per-key estimate for an index prefix. + + Returns average number of records per key value for the given index prefix. + Prefers engine-independent statistics (EITS) if available and falls back + to engine-dependent statistics otherwise. + + @param max_key_part Index of the last key part in the prefix (0-based) + + @return Estimated records per key value: + - 0.0 if no statistics available + - avg_frequency from EITS if available + - rec_per_key from engine statistics if EITS is not available +*/ +double KEY::actual_rec_per_key(uint last_key_part_in_prefix) const { - if (rec_per_key == 0) - return 0; - return (is_statistics_from_stat_tables ? - read_stats->get_avg_frequency(i) : (double) rec_per_key[i]); + if (is_statistics_from_stat_tables) + { + // Use engine-independent statistics (EITS) + return read_stats->get_avg_frequency(last_key_part_in_prefix); + } + // Fall back to engine-dependent statistics if EITS is not available + return rec_per_key ? (double) rec_per_key[last_key_part_in_prefix] : 0.0; +} + + +/** + Get records-per-key estimate for an index prefix with NULL-aware optimization. + + Returns average number of records per key value for the given index prefix. + When EITS statistics show avg_frequency == 0 (typically all NULL values) and + the query uses NULL-rejecting conditions (e.g., =), returns 1.0 to indicate + high selectivity since NULL = NULL never matches. + + @param max_key_part Index of the last key part in the prefix (0-based) + @param notnull_part Bitmap indicating which key parts have NULL-rejecting + conditions (bit N set means key part N uses =, not <=>) + + @return Estimated records per key value: + - 0.0 if no statistics available + - avg_frequency from EITS if available + - 1.0 if all values are NULL with NULL-rejecting condition + - rec_per_key from engine statistics if EITS is not available +*/ +double KEY::rec_per_key_null_aware(uint last_key_part_in_prefix, + key_part_map notnull_part) const +{ + if (!is_statistics_from_stat_tables) + { + // Fall back to engine-dependent statistics if EITS is not available + return rec_per_key ? (double) rec_per_key[last_key_part_in_prefix] : 0.0; + } + + // Use engine-independent statistics (EITS) + double records= read_stats->get_avg_frequency(last_key_part_in_prefix); + if (records != 0.0) + return records; + + /* + The index statistics show avg_frequency == 0 for this index prefix. + This typically means all values in the indexed columns are NULL. + + For NULL-rejecting conditions like `t1.key_col = t2.col`, we know + there will be no matches (since NULL = NULL is never true). + However, for non-NULL-rejecting conditions like `t1.key_col <=> t2.col`, + matches are possible. + + Check each key part in the prefix: if any key part has a NULL-rejecting + condition (indicated by bit set in `notnull_part`) and the statistics + confirm all values are NULL (nulls_ratio == 1.0), we can return 1.0 + (highly selective estimate) instead of 0.0 (unknown), indicating + no expected matches. + */ + for (int bit= last_key_part_in_prefix; bit >= 0; bit--) + { + key_part_map mask = (key_part_map)1 << bit; + if ((notnull_part & mask) == 0) + { + // Non-NULL-rejecting condition for the key part + continue; + } + + Field *field= table->field[key_part[bit].field->field_index]; + if (!field->read_stats) + { + // No column statistics available + continue; + } + + // Check if all values in this column are NULL according to statistics + double nulls_ratio= field->read_stats->get_nulls_ratio(); + if (nulls_ratio == 1.0) + { + /* + All values are NULL and the condition is NULL-rejecting. + Return 1.0 (highly selective), indicating no expected matches. + */ + return 1.0; + } + } + return records; } /* diff --git a/storage/innobase/btr/btr0sea.cc b/storage/innobase/btr/btr0sea.cc index 7d0921112fb53..05e3d67ae2c7f 100644 --- a/storage/innobase/btr/btr0sea.cc +++ b/storage/innobase/btr/btr0sea.cc @@ -374,18 +374,16 @@ ATTRIBUTE_COLD void btr_search_lazy_free(dict_index_t *index) noexcept UT_LIST_REMOVE(table->freed_indexes, index); index->lock.free(); dict_mem_index_free(index); + const bool destroy= !table->id && !UT_LIST_GET_LEN(table->freed_indexes) && + !UT_LIST_GET_LEN(table->indexes); + table->autoinc_mutex.wr_unlock(); - if (!UT_LIST_GET_LEN(table->freed_indexes) && - !UT_LIST_GET_LEN(table->indexes)) + if (destroy) { - ut_ad(!table->id); - table->autoinc_mutex.wr_unlock(); table->autoinc_mutex.destroy(); dict_mem_table_free(table); return; } - - table->autoinc_mutex.wr_unlock(); } ATTRIBUTE_COLD bool btr_sea::disable_and_lock() noexcept diff --git a/storage/innobase/buf/buf0flu.cc b/storage/innobase/buf/buf0flu.cc index 5f6d677aa8005..4a4cc9e129e61 100644 --- a/storage/innobase/buf/buf0flu.cc +++ b/storage/innobase/buf/buf0flu.cc @@ -2183,10 +2183,24 @@ ATTRIBUTE_COLD void buf_flush_ahead(lsn_t lsn, bool furious) noexcept if (limit < lsn) { limit= lsn; - buf_pool.page_cleaner_set_idle(false); - pthread_cond_signal(&buf_pool.do_flush_list); if (furious) + { + /* Request any concurrent threads to wait for this batch to complete, + in log_free_check(). */ log_sys.set_check_for_checkpoint(); + /* Immediately wake up buf_flush_page_cleaner(), even when it + is in the middle of a 1-second my_cond_timedwait(). */ + wake: + buf_pool.page_cleaner_set_idle(false); + pthread_cond_signal(&buf_pool.do_flush_list); + } + else if (buf_pool.page_cleaner_idle()) + /* In non-furious mode, concurrent writes to the log will remain + possible, and we are gently requesting buf_flush_page_cleaner() + to do more work to avoid a later call with furious=true. + We will only wake the buf_flush_page_cleaner() from an indefinite + my_cond_wait(), but we will not disturb the regular 1-second sleep. */ + goto wake; } mysql_mutex_unlock(&buf_pool.flush_list_mutex); } diff --git a/storage/innobase/gis/gis0geo.cc b/storage/innobase/gis/gis0geo.cc index 4c3ff1881d070..28d39d116108c 100644 --- a/storage/innobase/gis/gis0geo.cc +++ b/storage/innobase/gis/gis0geo.cc @@ -445,7 +445,7 @@ pick_next( double* g1, /*!< in: mbr of group 1. */ double* g2, /*!< in: mbr of group 2. */ rtr_split_node_t** choice, /*!< out: the next node.*/ - int* n_group, /*!< out: group number.*/ + uint16_t* n_group, /*!< out: 1 or 2 */ int n_dim) /*!< in: dimensions. */ { rtr_split_node_t* cur = node; @@ -487,7 +487,7 @@ mark_all_entries( /*=============*/ rtr_split_node_t* node, /*!< in/out: split nodes. */ int n_entries, /*!< in: entries number. */ - int n_group) /*!< in: group number. */ + uint16_t n_group) /*!< in: 1 or 2 */ { rtr_split_node_t* cur = node; rtr_split_node_t* end = node + n_entries; @@ -522,7 +522,7 @@ split_rtree_node( double* g1 = reserve_coords(d_buffer, n_dim); double* g2 = reserve_coords(d_buffer, n_dim); rtr_split_node_t* next = NULL; - int next_node = 0; + uint16_t next_node = 0; int i; int first_rec_group = 1; rtr_split_node_t* end = node + n_entries; @@ -542,9 +542,9 @@ split_rtree_node( b->n_node = 2; copy_coords(g1, a->coords, n_dim); - size1 += key_size; + size1 += a->key_len; copy_coords(g2, b->coords, n_dim); - size2 += key_size; + size2 += b->key_len; for (i = n_entries - 2; i > 0; --i) { /* Can't write into group 2 */ @@ -561,10 +561,10 @@ split_rtree_node( pick_next(node, n_entries, g1, g2, &next, &next_node, n_dim); if (next_node == 1) { - size1 += key_size; + size1 += next->key_len; mbr_join(g1, next->coords, n_dim); } else { - size2 += key_size; + size2 += next->key_len; mbr_join(g2, next->coords, n_dim); } diff --git a/storage/innobase/gis/gis0rtree.cc b/storage/innobase/gis/gis0rtree.cc index 87c0e65e9694b..8046af7e8045e 100644 --- a/storage/innobase/gis/gis0rtree.cc +++ b/storage/innobase/gis/gis0rtree.cc @@ -96,6 +96,7 @@ rtr_page_split_initialize_nodes( for (cur = task; cur < stop - 1; ++cur) { cur->coords = reserve_coords(buf_pos, SPDIMS); cur->key = rec; + cur->key_len = static_cast(len); memcpy(cur->coords, source_cur, DATA_MBR_LEN); @@ -109,11 +110,11 @@ rtr_page_split_initialize_nodes( source_cur = static_cast(dfield_get_data( dtuple_get_nth_field(tuple, 0))); cur->coords = reserve_coords(buf_pos, SPDIMS); - rec = (byte*) mem_heap_alloc( - heap, rec_get_converted_size(cursor->index(), tuple, 0)); - + len = rec_get_converted_size(cursor->index(), tuple, 0); + rec = (byte*) mem_heap_alloc(heap, len); rec = rec_convert_dtuple_to_rec(rec, cursor->index(), tuple, 0); cur->key = rec; + cur->key_len = static_cast(len); memcpy(cur->coords, source_cur, DATA_MBR_LEN); @@ -1102,8 +1103,10 @@ rtr_page_split_and_insert( /* Reposition the cursor for insert and try insertion */ page_cursor = btr_cur_get_page_cur(cursor); - page_cursor->block = cur_split_node->n_node != first_rec_group - ? new_block : block; + buf_block_t *insert_block = (cur_split_node->n_node != first_rec_group) + ? new_block + : block; + page_cursor->block = insert_block; uint16_t up_match = 0, low_match = 0; @@ -1130,7 +1133,7 @@ rtr_page_split_and_insert( attempted this already. */ if (rec == NULL) { if (!is_page_cur_get_page_zip(page_cursor) - && btr_page_reorganize(page_cursor, mtr)) { + && !btr_page_reorganize(page_cursor, mtr)) { rec = page_cur_tuple_insert(page_cursor, tuple, offsets, heap, n_ext, mtr); @@ -1183,11 +1186,11 @@ rtr_page_split_and_insert( IF_DBUG(iterated=true,); rec_t* i_rec = page_rec_get_next(page_get_infimum_rec( - buf_block_get_frame(block))); + buf_block_get_frame(insert_block))); if (UNIV_UNLIKELY(!i_rec)) { goto corrupted; } - btr_cur_position(cursor->index(), i_rec, block, cursor); + btr_cur_position(cursor->index(), i_rec, insert_block, cursor); goto func_start; } diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index a2e21377da1b8..eacde4912b89e 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -19835,11 +19835,6 @@ static MYSQL_SYSVAR_ENUM(default_row_format, innodb_default_row_format, &innodb_default_row_format_typelib); #ifdef UNIV_DEBUG -static MYSQL_SYSVAR_UINT(trx_rseg_n_slots_debug, trx_rseg_n_slots_debug, - PLUGIN_VAR_RQCMDARG | PLUGIN_VAR_NOCMDOPT, - "Debug flags for InnoDB to limit TRX_RSEG_N_SLOTS for trx_rsegf_undo_find_free()", - NULL, NULL, 0, 0, 1024, 0); - static MYSQL_SYSVAR_UINT(limit_optimistic_insert_debug, btr_cur_limit_optimistic_insert_debug, PLUGIN_VAR_RQCMDARG, "Artificially limit the number of records per B-tree page (0=unlimited)", @@ -20120,7 +20115,6 @@ static struct st_mysql_sys_var* innobase_system_variables[]= { MYSQL_SYSVAR(compression_pad_pct_max), MYSQL_SYSVAR(default_row_format), #ifdef UNIV_DEBUG - MYSQL_SYSVAR(trx_rseg_n_slots_debug), MYSQL_SYSVAR(limit_optimistic_insert_debug), MYSQL_SYSVAR(trx_purge_view_update_only_debug), MYSQL_SYSVAR(evict_tables_on_commit_debug), diff --git a/storage/innobase/include/data0type.h b/storage/innobase/include/data0type.h index d48851860879e..98a9984728555 100644 --- a/storage/innobase/include/data0type.h +++ b/storage/innobase/include/data0type.h @@ -342,16 +342,6 @@ inline uint32_t dtype_form_prtype(ulint old_prtype, ulint charset_coll) return uint32_t(old_prtype | (charset_coll << 16)); } -/*********************************************************************//** -Determines if a MySQL string type is a subset of UTF-8. This function -may return false negatives, in case further character-set collation -codes are introduced in MySQL later. -@return whether a subset of UTF-8 */ -UNIV_INLINE -bool -dtype_is_utf8( -/*==========*/ - ulint prtype);/*!< in: precise data type */ /*********************************************************************//** Gets the type length. @return fixed length of the type, in bytes, or 0 if variable-length */ diff --git a/storage/innobase/include/data0type.inl b/storage/innobase/include/data0type.inl index add6c211bb942..4a77a039fb8bc 100644 --- a/storage/innobase/include/data0type.inl +++ b/storage/innobase/include/data0type.inl @@ -27,31 +27,6 @@ Created 1/16/1996 Heikki Tuuri #include "mach0data.h" #include "ha_prototypes.h" -/*********************************************************************//** -Determines if a MySQL string type is a subset of UTF-8. This function -may return false negatives, in case further character-set collation -codes are introduced in MySQL later. -@return whether a subset of UTF-8 */ -UNIV_INLINE -bool -dtype_is_utf8( -/*==========*/ - ulint prtype) /*!< in: precise data type */ -{ - /* These codes have been copied from strings/ctype-extra.c - and strings/ctype-utf8.c. */ - switch (dtype_get_charset_coll(prtype)) { - case 11: /* ascii_general_ci */ - case 65: /* ascii_bin */ - case 33: /* utf8_general_ci */ - case 83: /* utf8_bin */ - case 254: /* utf8_general_cs */ - return true; - } - - return false; -} - /*********************************************************************//** Gets the MySQL type code from a dtype. @return MySQL type code; this is NOT an InnoDB type code! */ diff --git a/storage/innobase/include/gis0geo.h b/storage/innobase/include/gis0geo.h index 3fd01a3ae54d6..906f0507ddeec 100644 --- a/storage/innobase/include/gis0geo.h +++ b/storage/innobase/include/gis0geo.h @@ -70,7 +70,8 @@ rtree_mbr_from_wkb( struct rtr_split_node_t { double square; /* square of the mbr.*/ - int n_node; /* which group in.*/ + uint16_t n_node; /* group: 1 or 2, or 0=unassigned */ + uint16_t key_len; /* key length */ uchar* key; /* key. */ double* coords; /* mbr. */ }; diff --git a/storage/innobase/include/mtr0mtr.h b/storage/innobase/include/mtr0mtr.h index b48b174df6f9b..06e3966db8677 100644 --- a/storage/innobase/include/mtr0mtr.h +++ b/storage/innobase/include/mtr0mtr.h @@ -647,17 +647,6 @@ struct mtr_t { /** Note that log_sys.latch is no longer being held exclusively. */ void flag_wr_unlock() noexcept { ut_ad(m_latch_ex); m_latch_ex= false; } - /** type of page flushing is needed during commit() */ - enum page_flush_ahead - { - /** no need to trigger page cleaner */ - PAGE_FLUSH_NO= 0, - /** asynchronous flushing is needed */ - PAGE_FLUSH_ASYNC, - /** furious flushing is needed */ - PAGE_FLUSH_SYNC - }; - private: /** Handle any pages that were freed during the mini-transaction. */ void process_freed_pages(); @@ -704,29 +693,31 @@ struct mtr_t { /** Commit the mini-transaction log. @tparam pmem log_sys.is_mmap() @param mtr mini-transaction - @param lsns {start_lsn,flush_ahead} */ + @param lsns {start_lsn,flush_ahead_lsn} */ template - static void commit_log(mtr_t *mtr, std::pair lsns) - noexcept; + static void commit_log(mtr_t *mtr, std::pair lsns) noexcept; + + /** Release log_sys.latch. */ + void commit_log_release() noexcept; /** Append the redo log records to the redo log buffer. - @return {start_lsn,flush_ahead} */ - std::pair do_write(); + @return {start_lsn,flush_ahead_lsn} */ + std::pair do_write() noexcept; /** Append the redo log records to the redo log buffer. @tparam mmap log_sys.is_mmap() @param mtr mini-transaction @param len number of bytes to write - @return {start_lsn,flush_ahead} */ + @return {start_lsn,flush_ahead_lsn} */ template static - std::pair finish_writer(mtr_t *mtr, size_t len); + std::pair finish_writer(mtr_t *mtr, size_t len); /** The applicable variant of commit_log() */ - static void (*commit_logger)(mtr_t *, std::pair); + static void (*commit_logger)(mtr_t *, std::pair); /** The applicable variant of finish_writer() */ - static std::pair (*finisher)(mtr_t *, size_t); + static std::pair (*finisher)(mtr_t *, size_t); - std::pair finish_write(size_t len) + std::pair finish_write(size_t len) { return finisher(this, len); } public: /** Update finisher when spin_wait_delay is changing to or from 0. */ diff --git a/storage/innobase/include/trx0sys.h b/storage/innobase/include/trx0sys.h index 256b0b736133e..8487996823690 100644 --- a/storage/innobase/include/trx0sys.h +++ b/storage/innobase/include/trx0sys.h @@ -73,11 +73,6 @@ inline buf_block_t *trx_sysf_get(mtr_t* mtr, bool rw= true) 0, rw ? RW_X_LATCH : RW_S_LATCH, mtr); } -#ifdef UNIV_DEBUG -/* Flag to control TRX_RSEG_N_SLOTS behavior debugging. */ -extern uint trx_rseg_n_slots_debug; -#endif - /** Write DB_TRX_ID. @param[out] db_trx_id the DB_TRX_ID field to be written to @param[in] id transaction ID */ diff --git a/storage/innobase/log/log0log.cc b/storage/innobase/log/log0log.cc index 8ea19514ce6a3..7d7f74a98ebda 100644 --- a/storage/innobase/log/log0log.cc +++ b/storage/innobase/log/log0log.cc @@ -1321,10 +1321,10 @@ ATTRIBUTE_COLD static void log_checkpoint_margin() noexcept } const lsn_t lsn= log_sys.get_lsn(); - const lsn_t checkpoint= log_sys.last_checkpoint_lsn; - const lsn_t sync_lsn= checkpoint + log_sys.max_checkpoint_age; + const lsn_t max_age= log_sys.max_checkpoint_age; + const lsn_t age= lsn_t(lsn - log_sys.last_checkpoint_lsn); - if (lsn <= sync_lsn) + if (age <= max_age) { #ifndef DBUG_OFF skip_checkpoint: @@ -1337,7 +1337,7 @@ ATTRIBUTE_COLD static void log_checkpoint_margin() noexcept log_sys.latch.wr_unlock(); /* We must wait to prevent the tail of the log overwriting the head. */ - buf_flush_wait_flushed(std::min(sync_lsn, checkpoint + (1U << 20))); + buf_flush_wait_flushed(lsn - max_age); /* Sleep to avoid a thundering herd */ std::this_thread::sleep_for(std::chrono::milliseconds(10)); } diff --git a/storage/innobase/mtr/mtr0mtr.cc b/storage/innobase/mtr/mtr0mtr.cc index bea84de6d4735..bffbd6e6ff203 100644 --- a/storage/innobase/mtr/mtr0mtr.cc +++ b/storage/innobase/mtr/mtr0mtr.cc @@ -39,10 +39,10 @@ Created 11/26/1995 Heikki Tuuri #include "my_cpu.h" #ifdef HAVE_PMEM -void (*mtr_t::commit_logger)(mtr_t *, std::pair); +void (*mtr_t::commit_logger)(mtr_t *, std::pair); #endif -std::pair (*mtr_t::finisher)(mtr_t *, size_t); +std::pair (*mtr_t::finisher)(mtr_t *, size_t); void mtr_t::finisher_update() { @@ -335,9 +335,25 @@ void mtr_t::release() m_memo.clear(); } +ATTRIBUTE_NOINLINE void mtr_t::commit_log_release() noexcept +{ + if (m_latch_ex) + { + log_sys.latch.wr_unlock(); + m_latch_ex= false; + } + else + log_sys.latch.rd_unlock(); +} + +static ATTRIBUTE_NOINLINE ATTRIBUTE_COLD +void mtr_flush_ahead(lsn_t flush_lsn) noexcept +{ + buf_flush_ahead(flush_lsn, bool(flush_lsn & 1)); +} + template -void mtr_t::commit_log(mtr_t *mtr, std::pair lsns) - noexcept +void mtr_t::commit_log(mtr_t *mtr, std::pair lsns) noexcept { size_t modified= 0; @@ -378,25 +394,12 @@ void mtr_t::commit_log(mtr_t *mtr, std::pair lsns) buf_pool.page_cleaner_wakeup(); mysql_mutex_unlock(&buf_pool.flush_list_mutex); - if (mtr->m_latch_ex) - { - log_sys.latch.wr_unlock(); - mtr->m_latch_ex= false; - } - else - log_sys.latch.rd_unlock(); - + mtr->commit_log_release(); mtr->release(); } else { - if (mtr->m_latch_ex) - { - log_sys.latch.wr_unlock(); - mtr->m_latch_ex= false; - } - else - log_sys.latch.rd_unlock(); + mtr->commit_log_release(); for (auto it= mtr->m_memo.rbegin(); it != mtr->m_memo.rend(); ) { @@ -458,8 +461,11 @@ void mtr_t::commit_log(mtr_t *mtr, std::pair lsns) if (ha_handler_stats *stats= mtr->trx->active_handler_stats) stats->pages_updated+= modified; - if (UNIV_UNLIKELY(lsns.second != PAGE_FLUSH_NO)) - buf_flush_ahead(mtr->m_commit_lsn, lsns.second == PAGE_FLUSH_SYNC); + if (UNIV_UNLIKELY(lsns.second != 0)) + { + ut_ad(lsns.second < mtr->m_commit_lsn); + mtr_flush_ahead(lsns.second); + } } /** Commit a mini-transaction. */ @@ -481,7 +487,7 @@ void mtr_t::commit() } ut_ad(!srv_read_only_mode); - std::pair lsns{do_write()}; + std::pair lsns{do_write()}; process_freed_pages(); #ifdef HAVE_PMEM commit_logger(this, lsns); @@ -973,24 +979,44 @@ std::pair log_t::append_prepare(size_t size, bool ex) noexcept /** Finish appending data to the log. @param lsn the end LSN of the log record -@return whether buf_flush_ahead() will have to be invoked */ -static mtr_t::page_flush_ahead log_close(lsn_t lsn) noexcept +@return lsn for invoking buf_flush_ahead() on, with "furious" flag in the LSB +@retval 0 if buf_flush_ahead() will not have to be invoked */ +static lsn_t log_close(lsn_t lsn) noexcept { ut_ad(log_sys.latch_have_any()); const lsn_t checkpoint_age= lsn - log_sys.last_checkpoint_lsn; + const lsn_t max_age= log_sys.max_modified_age_async; if (UNIV_UNLIKELY(checkpoint_age >= log_sys.log_capacity) && /* silence message on create_log_file() after the log had been deleted */ checkpoint_age != lsn) log_overwrite_warning(lsn); - else if (UNIV_LIKELY(checkpoint_age <= log_sys.max_modified_age_async)) - return mtr_t::PAGE_FLUSH_NO; - else if (UNIV_LIKELY(checkpoint_age <= log_sys.max_checkpoint_age)) - return mtr_t::PAGE_FLUSH_ASYNC; - - log_sys.set_check_for_checkpoint(); - return mtr_t::PAGE_FLUSH_SYNC; + else if (UNIV_LIKELY(checkpoint_age <= max_age)) + return 0; + + /* The last checkpoint is too old. Let us set an appropriate + checkpoint age target, that is, a checkpoint LSN target that is the + current LSN minus the maximum age. Let us see if are exceeding the + log_checkpoint_margin() limit that will involve a synchronous wait + in each write operation. */ + + const bool furious{checkpoint_age >= log_sys.max_checkpoint_age}; + + /* If furious==true, we could set a less aggressive target + (lsn - log_sys.max_checkpoint_age) instead of what we will be using + in both cases (lsn - log_sys.max_checkpoint_age_async). + + The aim of the more aggressive target is that mtr_flush_ahead() will + request more progress in buf_flush_page_cleaner() sooner, so that it + will be less likely that several threads will end up waiting in + log_checkpoint_margin(). That function will use the less aggressive + limit (lsn - log_sys.max_checkpoint_age) in order to minimize the + synchronous wait time. */ + if (furious) + log_sys.set_check_for_checkpoint(); + + return ((lsn - max_age) & ~lsn_t{1}) | lsn_t{furious}; } inline void mtr_t::page_checksum(const buf_page_t &bpage) @@ -1036,7 +1062,7 @@ inline void mtr_t::page_checksum(const buf_page_t &bpage) m_log.close(l + 4); } -std::pair mtr_t::do_write() +std::pair mtr_t::do_write() noexcept { ut_ad(!recv_no_log_write); ut_ad(is_logged()); @@ -1188,8 +1214,7 @@ inline void log_t::append(byte *&d, const void *s, size_t size) noexcept } template -std::pair -mtr_t::finish_writer(mtr_t *mtr, size_t len) +std::pair mtr_t::finish_writer(mtr_t *mtr, size_t len) { ut_ad(log_sys.is_latest()); ut_ad(!recv_no_log_write); diff --git a/storage/innobase/row/row0row.cc b/storage/innobase/row/row0row.cc index 33aa1f8ccd51f..47c3b92591993 100644 --- a/storage/innobase/row/row0row.cc +++ b/storage/innobase/row/row0row.cc @@ -1366,18 +1366,18 @@ row_raw_format_str( charset_coll = dtype_get_charset_coll(prtype); - if (UNIV_LIKELY(dtype_is_utf8(prtype))) { - + switch (charset_coll) { + case 11: /* ascii_general_ci */ + case 65: /* ascii_bin */ + case 33: /* utf8_general_ci */ + case 83: /* utf8_bin */ + case 254: /* utf8_general_cs */ return(ut_str_sql_format(data, data_len, buf, buf_size)); - } - /* else */ - - if (charset_coll == DATA_MYSQL_BINARY_CHARSET_COLL) { - + case 0: + case DATA_MYSQL_BINARY_CHARSET_COLL: *format_in_hex = TRUE; return(0); } - /* else */ return(innobase_raw_format(data, data_len, charset_coll, buf, buf_size)); @@ -1438,9 +1438,18 @@ row_raw_format( break; case DATA_CHAR: case DATA_VARCHAR: + /* FTS_%_CONFIG.key are incorrectly created with prtype==0. + The DATA_ENGLISH is being used for CHAR columns of the + InnoDB internal SQL parser, such as SYS_FOREIGN.ID. + For these, we will eventually goto format_in_hex. */ + ut_ad(dtype_get_charset_coll(prtype) == 8 + || (mtype == DATA_VARCHAR + && (prtype == 0 || prtype == DATA_ENGLISH))); + goto format_str; case DATA_MYSQL: case DATA_VARMYSQL: - + ut_ad(dtype_get_charset_coll(prtype)); + format_str: ret = row_raw_format_str(data, data_len, prtype, buf, buf_size, &format_in_hex); if (format_in_hex) { diff --git a/storage/innobase/trx/trx0purge.cc b/storage/innobase/trx/trx0purge.cc index b3e0e79a6a9ac..9ba4a8f3e190f 100644 --- a/storage/innobase/trx/trx0purge.cc +++ b/storage/innobase/trx/trx0purge.cc @@ -420,7 +420,6 @@ inline dberr_t purge_sys_t::iterator::free_history_rseg(trx_rseg_t &rseg) const rollback segment. */ if (!(rseg.SKIP & rseg_ref) && !freed && - ut_d(!trx_rseg_n_slots_debug &&) &rseg == &trx_sys.rseg_array[purge_sys.skipped_rseg]) /* If rseg.space == purge_sys.truncate_undo_space.current the following will be a no-op. A possible conflict diff --git a/storage/innobase/trx/trx0sys.cc b/storage/innobase/trx/trx0sys.cc index 8010d32700b43..2f2265a3df1fd 100644 --- a/storage/innobase/trx/trx0sys.cc +++ b/storage/innobase/trx/trx0sys.cc @@ -45,9 +45,6 @@ Created 3/26/1996 Heikki Tuuri trx_sys_t trx_sys; #ifdef UNIV_DEBUG -/* Flag to control TRX_RSEG_N_SLOTS behavior debugging. */ -uint trx_rseg_n_slots_debug = 0; - void rw_trx_hash_t::validate_element(trx_t *trx) { ut_ad(!trx->read_only || !trx->rsegs.m_redo.rseg); diff --git a/storage/innobase/trx/trx0trx.cc b/storage/innobase/trx/trx0trx.cc index 6dbb69f6083b2..987e719d4e9f7 100644 --- a/storage/innobase/trx/trx0trx.cc +++ b/storage/innobase/trx/trx0trx.cc @@ -821,7 +821,6 @@ static void trx_assign_rseg_low(trx_t *trx) undo tablespaces that are scheduled for truncation. */ static Atomic_counter rseg_slot; unsigned slot = rseg_slot++ % TRX_SYS_N_RSEGS; - ut_d(if (trx_rseg_n_slots_debug) slot = 0); ut_d(const auto start_scan_slot = slot); ut_d(bool look_for_rollover = false); trx_rseg_t* rseg; @@ -833,7 +832,6 @@ static void trx_assign_rseg_low(trx_t *trx) rseg = &trx_sys.rseg_array[slot]; ut_ad(!look_for_rollover || start_scan_slot != slot); ut_d(look_for_rollover = true); - ut_d(if (!trx_rseg_n_slots_debug)) slot = (slot + 1) % TRX_SYS_N_RSEGS; if (!rseg->space) { diff --git a/storage/innobase/trx/trx0undo.cc b/storage/innobase/trx/trx0undo.cc index 911c1c98a85cf..6ed3ff27f88a3 100644 --- a/storage/innobase/trx/trx0undo.cc +++ b/storage/innobase/trx/trx0undo.cc @@ -436,11 +436,6 @@ static ulint trx_rsegf_undo_find_free(const buf_block_t *rseg_header) { ulint max_slots= TRX_RSEG_N_SLOTS; -#ifdef UNIV_DEBUG - if (trx_rseg_n_slots_debug) - max_slots= std::min(trx_rseg_n_slots_debug, TRX_RSEG_N_SLOTS); -#endif - for (ulint i= 0; i < max_slots; i++) if (trx_rsegf_get_nth_undo(rseg_header, i) == FIL_NULL) return i; diff --git a/storage/perfschema/table_helper.cc b/storage/perfschema/table_helper.cc index dd5a765f4bf3b..3e0877a194ef4 100644 --- a/storage/perfschema/table_helper.cc +++ b/storage/perfschema/table_helper.cc @@ -547,6 +547,9 @@ void set_field_object_type(Field *f, enum_object_type object_type) case OBJECT_TYPE_SCHEMA: PFS_engine_table::set_field_varchar_utf8(f, "SCHEMA", 6); break; + case OBJECT_TYPE_PACKAGE: + PFS_engine_table::set_field_varchar_utf8(f, "PACKAGE", 7); + break; case OBJECT_TYPE_PACKAGE_BODY: PFS_engine_table::set_field_varchar_utf8(f, "PACKAGE BODY", 12); break; diff --git a/storage/spider/CODING_STADNARDS.org b/storage/spider/CODING_STADNARDS.org new file mode 100644 index 0000000000000..445b92fe42b7a --- /dev/null +++ b/storage/spider/CODING_STADNARDS.org @@ -0,0 +1,81 @@ +#+title Spider Development Documentation + +** Testing + :PROPERTIES: + :UPDATED: [2025-10-15 Wed 15:33] + :END: + +*** Run spider test suites + :PROPERTIES: + :UPDATED: [2025-10-15 Wed 15:39] + :END: + +Spider has sub-suites. Assuming temporary WIP spider tests are placed +under the spider/temp suite, to run a test on all spider tests, do + +#+begin_src sh +./mysql-test/mtr --suite spider,spider/*,spider/*/* \ +--skip-test="spider/temp.*|.*/t\..*" --parallel=auto --big-test \ +--force --max-test-fail=0 +#+end_src + +Tests should be run normally, but also with --ps-protocol, +--view-protocol and ASAN. + +For 10.11+ tests should also be run with +--mysqld=--loose-disable-spider-group-by-handler. This will be done +automatically after MDEV-37810. + +*** Where to place new tests + :PROPERTIES: + :UPDATED: [2025-10-15 Wed 15:35] + :END: + +- spider/bugfix suite for bugfixes +- spider/feature suite for new features +- spider suite for all else, such as generic tests to improve coverage + +*** Use engine defined attributes in tests whenever possible + :PROPERTIES: + :UPDATED: [2025-10-15 Wed 15:52] + :END: + +In versions of at least 10.11, when writing new tests or updating +existing tests, use engine defined attributes for spider table +connection info instead of table comments + +#+begin_src sql +# Do this for 10.11+ +CREATE TABLE t (c int) ENGINE=SPIDER REMOTE_SERVER=s1 REMOTE_TABLE=t1; +# Do this for 10.6 +CREATE TABLE t (c int) ENGINE=SPIDER COMMENT='srv "s1", table "t1"'; +#+end_src + +However, if the spider table has connection info that is not +REMOTE_SERVER, REMOTE_TABLE, or REMOTE_DATABASE, comments are still +needed for 10.11: + +#+begin_src sql +# Do this for 10.6 and 10.11 +CREATE TABLE t (c int) ENGINE=SPIDER COMMENT='srv "s1", table "t1", read_only_mode "1"'; +# Do this for 11.4+ +CREATE TABLE t (c int) ENGINE=SPIDER REMOTE_SERVER=s1 REMOTE_TABLE=t1 READ_ONLY=1; +#+end_src + +Don't mix engine defined attributes with COMMENT, unless the mixing is +part of the test. + +#+begin_src sql +# Don't do this +CREATE TABLE t (c int) ENGINE=SPIDER REMOTE_SERVER=s1 REMOTE_TABLE=t1 COMMENT='read_only_mode "1"'; +#+end_src + +WRAPPER by default is mysql, so it is ok to do the following +conversion in 10.11+: + +#+begin_src sql +# From +CREATE TABLE t (c int) ENGINE=SPIDER COMMENT='wrapper "mysql", srv "s1", table "t1"'; +# to +CREATE TABLE t (c int) ENGINE=SPIDER REMOTE_SERVER=s1 REMOTE_TABLE=t1; +#+end_src diff --git a/storage/spider/ha_spider.h b/storage/spider/ha_spider.h index 9994121ba47d9..cff6cd9d61213 100644 --- a/storage/spider/ha_spider.h +++ b/storage/spider/ha_spider.h @@ -89,8 +89,17 @@ class ha_spider final : public handler bool da_status; bool use_spatial_index; + /* + Index of the table in FROM tables, for the use of direct + execution by gbh + */ uint idx_for_direct_join; + /* + Whether using a spider_fields, only applicable to direct + execution by gbh + */ bool use_fields; + /* If use_fields == true, the spider_fields in use for gbh */ spider_fields *fields; SPIDER_LINK_IDX_CHAIN *link_idx_chain; SPIDER_LINK_IDX_CHAIN *result_link_idx_chain; diff --git a/storage/spider/mysql-test/spider/bg/combinations b/storage/spider/mysql-test/spider/bg/combinations new file mode 120000 index 0000000000000..ae8bc75d267c7 --- /dev/null +++ b/storage/spider/mysql-test/spider/bg/combinations @@ -0,0 +1 @@ +/home/ycp/source/mariadb-server/10.11/src/storage/spider/mysql-test/spider/combinations \ No newline at end of file diff --git a/storage/spider/mysql-test/spider/bg/r/direct_aggregate,usual_handler.rdiff b/storage/spider/mysql-test/spider/bg/r/direct_aggregate,usual_handler.rdiff new file mode 100644 index 0000000000000..2ba8144bc1612 --- /dev/null +++ b/storage/spider/mysql-test/spider/bg/r/direct_aggregate,usual_handler.rdiff @@ -0,0 +1,39 @@ +--- ../src/storage/spider/mysql-test/spider/bg/r/direct_aggregate.result 2024-06-21 13:50:21.429397065 +1000 ++++ ../src/storage/spider/mysql-test/spider/bg/r/direct_aggregate.reject 2025-10-22 17:39:27.706744886 +1100 +@@ -54,31 +54,31 @@ + 5 + SHOW STATUS LIKE 'Spider_direct_aggregate'; + Variable_name Value +-Spider_direct_aggregate 0 ++Spider_direct_aggregate 1 + SELECT MAX(a) FROM ta_l; + MAX(a) + 5 + SHOW STATUS LIKE 'Spider_direct_aggregate'; + Variable_name Value +-Spider_direct_aggregate 0 ++Spider_direct_aggregate 1 + SELECT MIN(a) FROM ta_l; + MIN(a) + 1 + SHOW STATUS LIKE 'Spider_direct_aggregate'; + Variable_name Value +-Spider_direct_aggregate 0 ++Spider_direct_aggregate 1 + SELECT MAX(a) FROM ta_l WHERE a < 5; + MAX(a) + 4 + SHOW STATUS LIKE 'Spider_direct_aggregate'; + Variable_name Value +-Spider_direct_aggregate 0 ++Spider_direct_aggregate 1 + SELECT MIN(a) FROM ta_l WHERE a > 1; + MIN(a) + 2 + SHOW STATUS LIKE 'Spider_direct_aggregate'; + Variable_name Value +-Spider_direct_aggregate 0 ++Spider_direct_aggregate 1 + + deinit + connection master_1; diff --git a/storage/spider/mysql-test/spider/bg/t/basic_sql.test b/storage/spider/mysql-test/spider/bg/t/basic_sql.test index 7b3ec715f86e0..0c9f6ce660d1e 100644 --- a/storage/spider/mysql-test/spider/bg/t/basic_sql.test +++ b/storage/spider/mysql-test/spider/bg/t/basic_sql.test @@ -476,11 +476,8 @@ SELECT count(*) FROM ta_l ORDER BY a; --enable_query_log --enable_result_log --connection master_1 -# MDEV-36357 ---disable_view_protocol SELECT a.a, a.b, date_format(a.c, '%Y-%m-%d %H:%i:%s') FROM tb_l a WHERE EXISTS (SELECT * FROM ta_l b WHERE b.b = a.b) ORDER BY a.a; ---enable_view_protocol --disable_query_log --disable_result_log --connection child2_1 diff --git a/storage/spider/mysql-test/spider/bugfix/combinations b/storage/spider/mysql-test/spider/bugfix/combinations new file mode 120000 index 0000000000000..ae8bc75d267c7 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/combinations @@ -0,0 +1 @@ +/home/ycp/source/mariadb-server/10.11/src/storage/spider/mysql-test/spider/combinations \ No newline at end of file diff --git a/storage/spider/mysql-test/spider/bugfix/disabled.def b/storage/spider/mysql-test/spider/bugfix/disabled.def index 9009cd2565d08..62605347130af 100644 --- a/storage/spider/mysql-test/spider/bugfix/disabled.def +++ b/storage/spider/mysql-test/spider/bugfix/disabled.def @@ -2,4 +2,3 @@ wait_timeout : MDEV-26045 mdev_29676 : MDEV-31138 mdev_27239: MDEV-32046 mdev_27575 : MDEV-32997 -mdev_28739_simple : MDEV-33343 diff --git a/storage/spider/mysql-test/spider/bugfix/r/index.result b/storage/spider/mysql-test/spider/bugfix/r/index.result index a3c6549631c7a..d36d511399439 100644 --- a/storage/spider/mysql-test/spider/bugfix/r/index.result +++ b/storage/spider/mysql-test/spider/bugfix/r/index.result @@ -10,21 +10,29 @@ set global spider_same_server_link= on; select @@spider_auto_increment_mode; @@spider_auto_increment_mode 0 -create or replace table auto_test_local.t (id int primary key) engine=InnoDB; +create or replace table auto_test_local.t (id int, primary key(id desc)) engine=InnoDB; create or replace table t_sp1 (id int auto_increment, primary key(id desc)) engine=Spider COMMENT='wrapper "mysql", srv "s_1", table "t"'; Warnings: Warning 138 Spider table params in COMMENT or CONNECTION strings have been deprecated and will be removed in a future release. Please use table options instead. insert into t_sp1 () values (),(),(); insert into t_sp1 () values (),(),(); -select * from t_sp1; +select * from auto_test_local.t; id -1 -2 -3 -4 +6 5 +4 +3 +2 +1 +select * from t_sp1; +id 6 +5 +4 +3 +2 +1 drop table t_sp1, auto_test_local.t; # # MDEV-27581 Wrong result with DESC key on partitioned Spider table diff --git a/storage/spider/mysql-test/spider/bugfix/r/insert_select,usual_handler.rdiff b/storage/spider/mysql-test/spider/bugfix/r/insert_select,usual_handler.rdiff new file mode 100644 index 0000000000000..a5dc96572eb95 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/insert_select,usual_handler.rdiff @@ -0,0 +1,29 @@ +--- ../src/storage/spider/mysql-test/spider/bugfix/r/insert_select.result 2024-05-01 14:39:20.114241787 +1000 ++++ ../src/storage/spider/mysql-test/spider/bugfix/r/insert_select.reject 2025-10-22 17:39:54.450930274 +1100 +@@ -60,16 +60,16 @@ + connection child2_1; + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; + argument +-select t0.`skey` `skey`,cast((concat(t0.`dt` , _latin1' ' , t0.`tm`)) as datetime) `CAST(CONCAT(dt, ' ', tm) AS datetime)` from `auto_test_remote`.`tbl_a` t0 where ((t0.`skey` = 4) and (t0.`dt` > _latin1'2012-11-21')) lock in share mode +-select t0.`skey` `skey`,cast((concat(t0.`dt` , _latin1' ' , t0.`tm`)) as datetime) `CAST(CONCAT(dt, ' ', tm) AS datetime)` from `auto_test_remote`.`tbl_a` t0 where ((t0.`skey` = 3) and (t0.`dt` > _latin1'2012-11-21')) lock in share mode +-select t0.`skey` `skey`,cast((concat(t0.`dt` , _latin1' ' , t0.`tm`)) as datetime) `CAST(CONCAT(dt, ' ', tm) AS datetime)` from `auto_test_remote`.`tbl_a` t0 where ((t0.`skey` = 2) and (t0.`dt` > _latin1'2012-11-21')) lock in share mode +-select t0.`skey` `skey`,cast((concat(t0.`dt` , _latin1' ' , t0.`tm`)) as datetime) `CAST(CONCAT(dt, ' ', tm) AS datetime)` from `auto_test_remote`.`tbl_a` t0 where ((t0.`skey` = 1) and (t0.`dt` > _latin1'2012-11-21')) lock in share mode +-select t0.`skey` `skey`,cast((concat(t0.`dt` , _latin1' ' , t0.`tm`)) as datetime) `CAST(CONCAT(dt, ' ', tm) AS datetime)` from `auto_test_remote`.`tbl_a` t0 where ((t0.`skey` = 0) and (t0.`dt` > _latin1'2012-11-21')) lock in share mode +-select t0.`skey` `skey`,cast((concat(t0.`dt` , _latin1' ' , t0.`tm`)) as datetime) `CAST(CONCAT(dt, ' ', tm) AS datetime)` from `auto_test_remote`.`tbl_a` t0 where ((t0.`skey` = 9) and (t0.`dt` > _latin1'2012-11-21')) lock in share mode +-select t0.`skey` `skey`,cast((concat(t0.`dt` , _latin1' ' , t0.`tm`)) as datetime) `CAST(CONCAT(dt, ' ', tm) AS datetime)` from `auto_test_remote`.`tbl_a` t0 where ((t0.`skey` = 8) and (t0.`dt` > _latin1'2012-11-21')) lock in share mode +-select t0.`skey` `skey`,cast((concat(t0.`dt` , _latin1' ' , t0.`tm`)) as datetime) `CAST(CONCAT(dt, ' ', tm) AS datetime)` from `auto_test_remote`.`tbl_a` t0 where ((t0.`skey` = 7) and (t0.`dt` > _latin1'2012-11-21')) lock in share mode +-select t0.`skey` `skey`,cast((concat(t0.`dt` , _latin1' ' , t0.`tm`)) as datetime) `CAST(CONCAT(dt, ' ', tm) AS datetime)` from `auto_test_remote`.`tbl_a` t0 where ((t0.`skey` = 6) and (t0.`dt` > _latin1'2012-11-21')) lock in share mode +-select t0.`skey` `skey`,cast((concat(t0.`dt` , _latin1' ' , t0.`tm`)) as datetime) `CAST(CONCAT(dt, ' ', tm) AS datetime)` from `auto_test_remote`.`tbl_a` t0 where ((t0.`skey` = 5) and (t0.`dt` > _latin1'2012-11-21')) lock in share mode ++select `skey`,`dt`,`tm` from `auto_test_remote`.`tbl_a` where `skey` = 4 and `dt` > _latin1'2012-11-21' and ((`skey` = 4) and (`dt` > _latin1'2012-11-21')) order by `dt`,`tm` lock in share mode ++select `skey`,`dt`,`tm` from `auto_test_remote`.`tbl_a` where `skey` = 3 and `dt` > _latin1'2012-11-21' and ((`skey` = 3) and (`dt` > _latin1'2012-11-21')) order by `dt`,`tm` lock in share mode ++select `skey`,`dt`,`tm` from `auto_test_remote`.`tbl_a` where `skey` = 2 and `dt` > _latin1'2012-11-21' and ((`skey` = 2) and (`dt` > _latin1'2012-11-21')) order by `dt`,`tm` lock in share mode ++select `skey`,`dt`,`tm` from `auto_test_remote`.`tbl_a` where `skey` = 1 and `dt` > _latin1'2012-11-21' and ((`skey` = 1) and (`dt` > _latin1'2012-11-21')) order by `dt`,`tm` lock in share mode ++select `skey`,`dt`,`tm` from `auto_test_remote`.`tbl_a` where `skey` = 0 and `dt` > _latin1'2012-11-21' and ((`skey` = 0) and (`dt` > _latin1'2012-11-21')) order by `dt`,`tm` lock in share mode ++select `skey`,`dt`,`tm` from `auto_test_remote`.`tbl_a` where `skey` = 9 and `dt` > _latin1'2012-11-21' and ((`skey` = 9) and (`dt` > _latin1'2012-11-21')) order by `dt`,`tm` lock in share mode ++select `skey`,`dt`,`tm` from `auto_test_remote`.`tbl_a` where `skey` = 8 and `dt` > _latin1'2012-11-21' and ((`skey` = 8) and (`dt` > _latin1'2012-11-21')) order by `dt`,`tm` lock in share mode ++select `skey`,`dt`,`tm` from `auto_test_remote`.`tbl_a` where `skey` = 7 and `dt` > _latin1'2012-11-21' and ((`skey` = 7) and (`dt` > _latin1'2012-11-21')) order by `dt`,`tm` lock in share mode ++select `skey`,`dt`,`tm` from `auto_test_remote`.`tbl_a` where `skey` = 6 and `dt` > _latin1'2012-11-21' and ((`skey` = 6) and (`dt` > _latin1'2012-11-21')) order by `dt`,`tm` lock in share mode ++select `skey`,`dt`,`tm` from `auto_test_remote`.`tbl_a` where `skey` = 5 and `dt` > _latin1'2012-11-21' and ((`skey` = 5) and (`dt` > _latin1'2012-11-21')) order by `dt`,`tm` lock in share mode + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' + SELECT pkey, dt FROM tbl_b ORDER BY pkey; + pkey dt diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_20100,usual_handler.rdiff b/storage/spider/mysql-test/spider/bugfix/r/mdev_20100,usual_handler.rdiff new file mode 100644 index 0000000000000..abfab37f8cb6e --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_20100,usual_handler.rdiff @@ -0,0 +1,23 @@ +--- ../src/storage/spider/mysql-test/spider/bugfix/r/mdev_20100.result 2024-05-01 14:39:20.114241787 +1000 ++++ ../src/storage/spider/mysql-test/spider/bugfix/r/mdev_20100.reject 2025-10-22 17:39:55.494937566 +1100 +@@ -78,16 +78,16 @@ + connection child2_1; + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; + argument +-select t0.`a` `a`,t0.`b` `b`,t0.`c` `c` from `auto_test_remote`.`ta_r3` t0 where (t0.`b` = 'c') ++select `a`,`b`,`c` from `auto_test_remote`.`ta_r3` where (`b` = 'c') + select `a`,`b`,`c` from `auto_test_remote`.`ta_r2` + select `a`,`b`,`c` from `auto_test_remote`.`ta_r3` +-select t0.`a` `a`,t0.`b` `b`,t0.`c` `c` from `auto_test_remote`.`ta_r4` t0 where (t0.`b` = 'c') ++select `a`,`b`,`c` from `auto_test_remote`.`ta_r4` where (`b` = 'c') + select `a`,`b`,`c` from `auto_test_remote`.`ta_r2` + select `a`,`b`,`c` from `auto_test_remote`.`ta_r3` +-select t0.`a` `a`,t0.`b` `b`,t0.`c` `c` from `auto_test_remote`.`ta_r2` t0 where (t0.`b` = 'c') ++select `a`,`b`,`c` from `auto_test_remote`.`ta_r2` where (`b` = 'c') + select `a`,`b`,`c` from `auto_test_remote`.`ta_r2` + select `a`,`b`,`c` from `auto_test_remote`.`ta_r4` +-select t0.`a` `a`,t0.`b` `b`,t0.`c` `c` from `auto_test_remote`.`ta_r2` t0 where (t0.`b` = 'c') ++select `a`,`b`,`c` from `auto_test_remote`.`ta_r2` where (`b` = 'c') + select `a`,`b`,`c` from `auto_test_remote`.`ta_r3` + select `a`,`b`,`c` from `auto_test_remote`.`ta_r4` + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_20502,usual_handler.rdiff b/storage/spider/mysql-test/spider/bugfix/r/mdev_20502,usual_handler.rdiff new file mode 100644 index 0000000000000..fd264d7d9a55c --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_20502,usual_handler.rdiff @@ -0,0 +1,21 @@ +--- ../src/storage/spider/mysql-test/spider/bugfix/r/mdev_20502.result 2025-08-01 15:07:36.416896406 +1000 ++++ ../src/storage/spider/mysql-test/spider/bugfix/r/mdev_20502.reject 2025-10-22 17:39:57.398950875 +1100 +@@ -54,14 +54,14 @@ + connection child2_1; + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; + argument +-select t0.`id` `id`,0 `const`,t0.`val` `val` from `auto_test_remote`.`tbl_a` t0 + select `id`,`val` from `auto_test_remote`.`tbl_a` +-select (t0.`val` + 1) `tbl_a.val+1` from `auto_test_remote`.`tbl_a` t0 ++select `id`,`val` from `auto_test_remote`.`tbl_a` ++select `val` from `auto_test_remote`.`tbl_a` + select `id`,`val` from `auto_test_remote`.`tbl_a` order by `id` desc limit 1 for update + select `val` from `auto_test_remote`.`tbl_a` group by `val` +-select (t0.`val` + 1) `tbl_a.val+1` from `auto_test_remote`.`tbl_a` t0 limit 1 ++select `val` from `auto_test_remote`.`tbl_a` limit 2 + select max(`id`),min(`id`),`val` from `auto_test_remote`.`tbl_a` group by `val` +-select (t0.`val` + 1) `tbl_a.val+1` from `auto_test_remote`.`tbl_a` t0 limit 1 ++select `val` from `auto_test_remote`.`tbl_a` limit 2 + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' + SELECT id, val FROM tbl_a ORDER BY id; + id val diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_27172,usual_handler.rdiff b/storage/spider/mysql-test/spider/bugfix/r/mdev_27172,usual_handler.rdiff new file mode 100644 index 0000000000000..194eecf3b37cf --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_27172,usual_handler.rdiff @@ -0,0 +1,12 @@ +--- ../src/storage/spider/mysql-test/spider/bugfix/r/mdev_27172.result 2024-11-15 17:14:27.541903833 +1100 ++++ ../src/storage/spider/mysql-test/spider/bugfix/r/mdev_27172.reject 2025-10-22 17:40:25.831151167 +1100 +@@ -66,6 +66,9 @@ + connection child2_1; + SELECT argument FROM mysql.general_log WHERE argument LIKE 'select `id`,`greeting` from %'; + argument ++select `id`,`greeting` from `auto_test_remote`.`tbl_a` where `greeting` = 'Aloha!' and ((`greeting` = 'Aloha!') and ((case `greeting` when 'Aloha!' then _latin1'one' else _latin1'more' end) = _latin1'one')) ++select `id`,`greeting` from `auto_test_remote`.`tbl_b` where `greeting` like 'Aloha%' and ((`greeting` = 'Aloha!') and ((case `greeting` when 'Aloha!' then _latin1'one' else _latin1'more' end) = _latin1'one')) ++select `id`,`greeting` from `auto_test_remote`.`tbl_c` where `greeting` like 'Aloha%' and ((`greeting` = 'Aloha!') and ((case `greeting` when 'Aloha!' then _latin1'one' else _latin1'more' end) = _latin1'one')) + connection child2_1; + SET @@global.general_log = @general_log_backup; + SET @@global.log_output = @log_output_backup; diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_29008,usual_handler.rdiff b/storage/spider/mysql-test/spider/bugfix/r/mdev_29008,usual_handler.rdiff new file mode 100644 index 0000000000000..a5dbf0cd49c6e --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_29008,usual_handler.rdiff @@ -0,0 +1,15 @@ +--- ../src/storage/spider/mysql-test/spider/bugfix/r/mdev_29008.result 2025-08-01 15:07:36.416896406 +1000 ++++ ../src/storage/spider/mysql-test/spider/bugfix/r/mdev_29008.reject 2025-10-22 17:40:29.191175025 +1100 +@@ -39,8 +39,10 @@ + connection child2_1; + SELECT argument FROM mysql.general_log WHERE argument LIKE 'select %'; + argument +-select min(t1.`a`) `f1`,t0.`b` `f2` from `auto_test_remote`.`tbl_a` t0 join `auto_test_remote`.`tbl_a` t1 group by `f2` order by `f1`,`f2` +-select min(t1.`a`) `f1`,t0.`b` `f2` from `auto_test_remote`.`tbl_a` t0 join `auto_test_remote`.`tbl_a` t1 group by `f2` order by min(t1.`a`),max(t1.`a`),`f2` ++select `b` from `auto_test_remote`.`tbl_a` ++select `a` from `auto_test_remote`.`tbl_a` ++select `b` from `auto_test_remote`.`tbl_a` ++select `a` from `auto_test_remote`.`tbl_a` + SELECT argument FROM mysql.general_log WHERE argument LIKE 'select %' + set global log_output=@old_log_output; + set global general_log=@old_general_log; diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_29502,usual_handler.rdiff b/storage/spider/mysql-test/spider/bugfix/r/mdev_29502,usual_handler.rdiff new file mode 100644 index 0000000000000..737f5f70c5aec --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_29502,usual_handler.rdiff @@ -0,0 +1,36 @@ +--- ../src/storage/spider/mysql-test/spider/bugfix/r/mdev_29502.result 2025-08-01 15:07:36.416896406 +1000 ++++ ../src/storage/spider/mysql-test/spider/bugfix/r/mdev_29502.reject 2025-10-22 17:40:28.295168659 +1100 +@@ -35,7 +35,7 @@ + 48 48 + SHOW STATUS LIKE 'Spider_direct_aggregate'; + Variable_name Value +-Spider_direct_aggregate 0 ++Spider_direct_aggregate 8 + DROP TABLE t, t1; + CREATE TABLE t (a INT, b INT); + INSERT INTO t VALUES (23, -1),(48, 97); +@@ -45,7 +45,7 @@ + 145 -25 + SHOW STATUS LIKE 'Spider_direct_aggregate'; + Variable_name Value +-Spider_direct_aggregate 0 ++Spider_direct_aggregate 10 + DROP TABLE t, t1; + CREATE TABLE t (a INT); + INSERT INTO t VALUES (23),(97),(42); +@@ -55,13 +55,13 @@ + Y 97 + SHOW STATUS LIKE 'Spider_direct_aggregate'; + Variable_name Value +-Spider_direct_aggregate 2 ++Spider_direct_aggregate 12 + SELECT MAX(a), IF(COUNT(a > 0),'Y','N') FROM t1; + MAX(a) IF(COUNT(a > 0),'Y','N') + 97 Y + SHOW STATUS LIKE 'Spider_direct_aggregate'; + Variable_name Value +-Spider_direct_aggregate 4 ++Spider_direct_aggregate 14 + DROP TABLE t, t1; + set spider_direct_aggregate=@old_spider_direct_aggregate; + DROP SERVER srv_mdev_29502; diff --git a/storage/spider/mysql-test/spider/bugfix/r/mdev_34659.result b/storage/spider/mysql-test/spider/bugfix/r/mdev_34659.result index 5aa6139605188..4cff89d546f03 100644 --- a/storage/spider/mysql-test/spider/bugfix/r/mdev_34659.result +++ b/storage/spider/mysql-test/spider/bugfix/r/mdev_34659.result @@ -2,6 +2,7 @@ for master_1 for child2 for child3 SET spider_same_server_link= on; +SET spider_disable_group_by_handler= 0; SET sql_mode=''; CREATE SERVER srv FOREIGN DATA WRAPPER mysql OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); diff --git a/storage/spider/mysql-test/spider/bugfix/r/select_with_backquote,usual_handler.rdiff b/storage/spider/mysql-test/spider/bugfix/r/select_with_backquote,usual_handler.rdiff new file mode 100644 index 0000000000000..3e6380683ea19 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/select_with_backquote,usual_handler.rdiff @@ -0,0 +1,11 @@ +--- ../src/storage/spider/mysql-test/spider/bugfix/r/select_with_backquote.result 2025-08-01 15:07:36.416896406 +1000 ++++ ../src/storage/spider/mysql-test/spider/bugfix/r/select_with_backquote.reject 2025-10-22 17:40:45.799293526 +1100 +@@ -44,7 +44,7 @@ + SET NAMES utf8; + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; + argument +-select t0.`pkey` `pkey`,(left(t0.`txt_utf8` , 4)) `LEFT(``txt_utf8``, 4)` from `auto_test_remote`.`tbl_a` t0 order by (left(`txt_utf8` , 4)) limit 3 ++select `pkey`,`txt_utf8` from `auto_test_remote`.`tbl_a` order by (left(`txt_utf8` , 4)) limit 3 + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' + SELECT pkey, txt_utf8 FROM tbl_a ORDER BY pkey; + pkey txt_utf8 diff --git a/storage/spider/mysql-test/spider/bugfix/r/wrapper_mariadb,usual_handler.rdiff b/storage/spider/mysql-test/spider/bugfix/r/wrapper_mariadb,usual_handler.rdiff new file mode 100644 index 0000000000000..e1745600f98e3 --- /dev/null +++ b/storage/spider/mysql-test/spider/bugfix/r/wrapper_mariadb,usual_handler.rdiff @@ -0,0 +1,11 @@ +--- ../src/storage/spider/mysql-test/spider/bugfix/r/wrapper_mariadb.result 2024-05-01 14:39:20.118241872 +1000 ++++ ../src/storage/spider/mysql-test/spider/bugfix/r/wrapper_mariadb.reject 2025-10-22 17:40:53.351347717 +1100 +@@ -47,7 +47,7 @@ + connection child2_1; + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; + argument +-select t0.`pkey` `pkey` from `auto_test_remote`.`tbl_a` t0 order by `pkey` ++select `pkey` from `auto_test_remote`.`tbl_a` order by `pkey` + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' + SELECT pkey FROM tbl_a ORDER BY pkey; + pkey diff --git a/storage/spider/mysql-test/spider/bugfix/t/index.test b/storage/spider/mysql-test/spider/bugfix/t/index.test index bef38660a3d51..d7f9b2577b205 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/index.test +++ b/storage/spider/mysql-test/spider/bugfix/t/index.test @@ -12,17 +12,15 @@ set global spider_same_server_link= on; --echo # select @@spider_auto_increment_mode; -create or replace table auto_test_local.t (id int primary key) engine=InnoDB; +create or replace table auto_test_local.t (id int, primary key(id desc)) engine=InnoDB; create or replace table t_sp1 (id int auto_increment, primary key(id desc)) engine=Spider COMMENT='wrapper "mysql", srv "s_1", table "t"'; --disable_ps_protocol insert into t_sp1 () values (),(),(); --enable_ps_protocol insert into t_sp1 () values (),(),(); -# MDEV-37568 ---disable_view_protocol +select * from auto_test_local.t; select * from t_sp1; ---enable_view_protocol drop table t_sp1, auto_test_local.t; --echo # diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_22979.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_22979.test index 7f42bd734c66a..93e210a9e5096 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/mdev_22979.test +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_22979.test @@ -12,7 +12,8 @@ let $PLUGIN_DIR=`select @@plugin_dir`; --write_file $MYSQLTEST_VARDIR/tmp/mdev_22979.sql drop table if exists foo.bar; EOF ---exec $MYSQLD_CMD --datadir=$MYSQLD_DATADIR --bootstrap --plugin-dir=$PLUGIN_DIR --plugin-load-add=ha_spider < $MYSQLTEST_VARDIR/tmp/mdev_22979.sql +--exec $MYSQLD --defaults-group-suffix=.1.1 --defaults-file=$MYSQLTEST_VARDIR/my.cnf --datadir=$MYSQLD_DATADIR --bootstrap --plugin-dir=$PLUGIN_DIR --plugin-load-add=ha_spider < $MYSQLTEST_VARDIR/tmp/mdev_22979.sql --source include/start_mysqld.inc --disable_query_log --source ../../include/clean_up_spider.inc +--remove_file $MYSQLTEST_VARDIR/tmp/mdev_22979.sql diff --git a/storage/spider/mysql-test/spider/bugfix/t/mdev_34659.test b/storage/spider/mysql-test/spider/bugfix/t/mdev_34659.test index 330b96db6f97b..072252eba6682 100644 --- a/storage/spider/mysql-test/spider/bugfix/t/mdev_34659.test +++ b/storage/spider/mysql-test/spider/bugfix/t/mdev_34659.test @@ -5,6 +5,8 @@ --enable_query_log SET spider_same_server_link= on; +# TODO(MDEV-37923) +SET spider_disable_group_by_handler= 0; SET sql_mode=''; evalp CREATE SERVER srv FOREIGN DATA WRAPPER mysql OPTIONS (SOCKET "$MASTER_1_MYSOCK", DATABASE 'test',user 'root'); diff --git a/storage/spider/mysql-test/spider/combinations b/storage/spider/mysql-test/spider/combinations new file mode 100644 index 0000000000000..cad4d1071766c --- /dev/null +++ b/storage/spider/mysql-test/spider/combinations @@ -0,0 +1,5 @@ +[group_by_handler] +loose_spider_disable_group_by_handler=0 + +[usual_handler] +loose_spider_disable_group_by_handler=1 diff --git a/storage/spider/mysql-test/spider/disabled.def b/storage/spider/mysql-test/spider/disabled.def new file mode 100644 index 0000000000000..0c0fe4583e151 --- /dev/null +++ b/storage/spider/mysql-test/spider/disabled.def @@ -0,0 +1 @@ +alter_server : MDEV-37787 diff --git a/storage/spider/mysql-test/spider/feature/combinations b/storage/spider/mysql-test/spider/feature/combinations new file mode 120000 index 0000000000000..ae8bc75d267c7 --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/combinations @@ -0,0 +1 @@ +/home/ycp/source/mariadb-server/10.11/src/storage/spider/mysql-test/spider/combinations \ No newline at end of file diff --git a/storage/spider/mysql-test/spider/feature/r/pushdown_case,usual_handler.rdiff b/storage/spider/mysql-test/spider/feature/r/pushdown_case,usual_handler.rdiff new file mode 100644 index 0000000000000..d88ddf7ad2a62 --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/r/pushdown_case,usual_handler.rdiff @@ -0,0 +1,38 @@ +--- ../src/storage/spider/mysql-test/spider/feature/r/pushdown_case.result 2025-08-01 15:07:36.420896283 +1000 ++++ ../src/storage/spider/mysql-test/spider/feature/r/pushdown_case.reject 2025-10-22 17:40:55.815365439 +1100 +@@ -13,7 +13,7 @@ + insert into t1 values (42), (3), (848), (100); + explain select case c when 3 then "three" when 42 then "answer" else "other" end as exp from t1; + id select_type table type possible_keys key key_len ref rows Extra +-1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY ++1 SIMPLE t1 ALL NULL NULL NULL NULL 2 + select case c when 3 then "three" when 42 then "answer" else "other" end as exp from t1; + exp + answer +@@ -22,7 +22,7 @@ + other + explain select case c when 3 then "three" when 42 then "answer" end from t1; + id select_type table type possible_keys key key_len ref rows Extra +-1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY ++1 SIMPLE t1 ALL NULL NULL NULL NULL 2 + select case c when 3 then "three" when 42 then "answer" end from t1; + case c when 3 then "three" when 42 then "answer" end + answer +@@ -31,7 +31,7 @@ + NULL + explain select case when c = 3 then "three" when c = 42 then "answer" else "other" end as exp from t1; + id select_type table type possible_keys key key_len ref rows Extra +-1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY ++1 SIMPLE t1 ALL NULL NULL NULL NULL 2 + select case when c = 3 then "three" when c = 42 then "answer" else "other" end as exp from t1; + exp + answer +@@ -40,7 +40,7 @@ + other + explain select case when c = 3 then "three" when c = 42 then "answer" end from t1; + id select_type table type possible_keys key key_len ref rows Extra +-1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY ++1 SIMPLE t1 ALL NULL NULL NULL NULL 2 + select case when c = 3 then "three" when c = 42 then "answer" end from t1; + case when c = 3 then "three" when c = 42 then "answer" end + answer diff --git a/storage/spider/mysql-test/spider/feature/r/pushdown_timestamp_diff,usual_handler.rdiff b/storage/spider/mysql-test/spider/feature/r/pushdown_timestamp_diff,usual_handler.rdiff new file mode 100644 index 0000000000000..a0a92747a15e1 --- /dev/null +++ b/storage/spider/mysql-test/spider/feature/r/pushdown_timestamp_diff,usual_handler.rdiff @@ -0,0 +1,83 @@ +--- ../src/storage/spider/mysql-test/spider/feature/r/pushdown_timestamp_diff.result 2024-11-15 17:14:27.545903808 +1100 ++++ ../src/storage/spider/mysql-test/spider/feature/r/pushdown_timestamp_diff.reject 2025-10-22 17:40:58.047381510 +1100 +@@ -26,7 +26,7 @@ + interval year + explain select a, b, timestampdiff(year, '2000-01-01 00:00:00', c) from t1; + id select_type table type possible_keys key key_len ref rows Extra +-1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY ++1 SIMPLE t1 ALL NULL NULL NULL NULL 2 + select a, b, timestampdiff(year, '2000-01-01 00:00:00', c) from t1; + a b timestampdiff(year, '2000-01-01 00:00:00', c) + 1 a 18 +@@ -35,7 +35,7 @@ + interval quarter + explain select a, b, timestampdiff(quarter, '2000-01-01 00:00:00', c) from t1; + id select_type table type possible_keys key key_len ref rows Extra +-1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY ++1 SIMPLE t1 ALL NULL NULL NULL NULL 2 + select a, b, timestampdiff(quarter, '2000-01-01 00:00:00', c) from t1; + a b timestampdiff(quarter, '2000-01-01 00:00:00', c) + 1 a 75 +@@ -44,7 +44,7 @@ + interval month + explain select a, b, timestampdiff(month, '2000-01-01 00:00:00', c) from t1; + id select_type table type possible_keys key key_len ref rows Extra +-1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY ++1 SIMPLE t1 ALL NULL NULL NULL NULL 2 + select a, b, timestampdiff(month, '2000-01-01 00:00:00', c) from t1; + a b timestampdiff(month, '2000-01-01 00:00:00', c) + 1 a 226 +@@ -53,7 +53,7 @@ + interval week + explain select a, b, timestampdiff(week, '2000-01-01 00:00:00', c) from t1; + id select_type table type possible_keys key key_len ref rows Extra +-1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY ++1 SIMPLE t1 ALL NULL NULL NULL NULL 2 + select a, b, timestampdiff(week, '2000-01-01 00:00:00', c) from t1; + a b timestampdiff(week, '2000-01-01 00:00:00', c) + 1 a 982 +@@ -62,7 +62,7 @@ + interval day + explain select a, b, timestampdiff(day, '2000-01-01 00:00:00', c) from t1; + id select_type table type possible_keys key key_len ref rows Extra +-1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY ++1 SIMPLE t1 ALL NULL NULL NULL NULL 2 + select a, b, timestampdiff(day, '2000-01-01 00:00:00', c) from t1; + a b timestampdiff(day, '2000-01-01 00:00:00', c) + 1 a 6879 +@@ -71,7 +71,7 @@ + internal hour + explain select a, b, timestampdiff(hour, '2000-01-01 00:00:00', c) from t1; + id select_type table type possible_keys key key_len ref rows Extra +-1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY ++1 SIMPLE t1 ALL NULL NULL NULL NULL 2 + select a, b, timestampdiff(hour, '2000-01-01 00:00:00', c) from t1; + a b timestampdiff(hour, '2000-01-01 00:00:00', c) + 1 a 165106 +@@ -80,7 +80,7 @@ + internal minute + explain select a, b, timestampdiff(minute, '2000-01-01 00:00:00', c) from t1; + id select_type table type possible_keys key key_len ref rows Extra +-1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY ++1 SIMPLE t1 ALL NULL NULL NULL NULL 2 + select a, b, timestampdiff(minute, '2000-01-01 00:00:00', c) from t1; + a b timestampdiff(minute, '2000-01-01 00:00:00', c) + 1 a 9906381 +@@ -89,7 +89,7 @@ + internal second + explain select a, b, timestampdiff(second, '2000-01-01 00:00:00', c) from t1; + id select_type table type possible_keys key key_len ref rows Extra +-1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY ++1 SIMPLE t1 ALL NULL NULL NULL NULL 2 + select a, b, timestampdiff(second, '2000-01-01 00:00:00', c) from t1; + a b timestampdiff(second, '2000-01-01 00:00:00', c) + 1 a 594382899 +@@ -98,7 +98,7 @@ + internal microsecond + explain select a, b, timestampdiff(microsecond, '2000-01-01 00:00:00', c) from t1; + id select_type table type possible_keys key key_len ref rows Extra +-1 SIMPLE NULL NULL NULL NULL NULL NULL NULL Storage engine handles GROUP BY ++1 SIMPLE t1 ALL NULL NULL NULL NULL 2 + select a, b, timestampdiff(microsecond, '2000-01-01 00:00:00', c) from t1; + a b timestampdiff(microsecond, '2000-01-01 00:00:00', c) + 1 a 594382899000000 diff --git a/storage/spider/mysql-test/spider/r/auto_increment,usual_handler.rdiff b/storage/spider/mysql-test/spider/r/auto_increment,usual_handler.rdiff new file mode 100644 index 0000000000000..cd37810394282 --- /dev/null +++ b/storage/spider/mysql-test/spider/r/auto_increment,usual_handler.rdiff @@ -0,0 +1,11 @@ +--- ../src/storage/spider/mysql-test/spider/r/auto_increment.result 2024-06-21 13:39:03.368040208 +1000 ++++ ../src/storage/spider/mysql-test/spider/r/auto_increment.reject 2025-10-22 17:41:24.231571237 +1100 +@@ -154,7 +154,7 @@ + connection child2_1; + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; + argument +-select t0.`col_a` `col_a`,t0.`col_b` `col_b`,t0.`col_c` `col_c` from `auto_test_remote`.`tbl_a` t0 ++select `col_a`,`col_b`,`col_c` from `auto_test_remote`.`tbl_a` + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' + SELECT col_a, col_b, col_c FROM tbl_a ORDER BY col_a; + col_a col_b col_c diff --git a/storage/spider/mysql-test/spider/r/direct_aggregate,usual_handler.rdiff b/storage/spider/mysql-test/spider/r/direct_aggregate,usual_handler.rdiff new file mode 100644 index 0000000000000..f7662986ab838 --- /dev/null +++ b/storage/spider/mysql-test/spider/r/direct_aggregate,usual_handler.rdiff @@ -0,0 +1,48 @@ +--- ../src/storage/spider/mysql-test/spider/r/direct_aggregate.result 2024-06-21 13:50:21.433397029 +1000 ++++ ../src/storage/spider/mysql-test/spider/r/direct_aggregate.reject 2025-10-22 17:42:04.239865208 +1100 +@@ -54,31 +54,31 @@ + 5 + SHOW STATUS LIKE 'Spider_direct_aggregate'; + Variable_name Value +-Spider_direct_aggregate 0 ++Spider_direct_aggregate 1 + SELECT MAX(a) FROM ta_l; + MAX(a) + 5 + SHOW STATUS LIKE 'Spider_direct_aggregate'; + Variable_name Value +-Spider_direct_aggregate 0 ++Spider_direct_aggregate 1 + SELECT MIN(a) FROM ta_l; + MIN(a) + 1 + SHOW STATUS LIKE 'Spider_direct_aggregate'; + Variable_name Value +-Spider_direct_aggregate 0 ++Spider_direct_aggregate 1 + SELECT MAX(a) FROM ta_l WHERE a < 5; + MAX(a) + 4 + SHOW STATUS LIKE 'Spider_direct_aggregate'; + Variable_name Value +-Spider_direct_aggregate 0 ++Spider_direct_aggregate 1 + SELECT MIN(a) FROM ta_l WHERE a > 1; + MIN(a) + 2 + SHOW STATUS LIKE 'Spider_direct_aggregate'; + Variable_name Value +-Spider_direct_aggregate 0 ++Spider_direct_aggregate 1 + SET spider_direct_aggregate=0; + SELECT COUNT(*) FROM ta_l; + COUNT(*) +@@ -97,7 +97,7 @@ + 2 + SHOW STATUS LIKE 'Spider_direct_aggregate'; + Variable_name Value +-Spider_direct_aggregate 0 ++Spider_direct_aggregate 1 + SET spider_direct_aggregate=1; + + deinit diff --git a/storage/spider/mysql-test/spider/r/direct_join,usual_handler.rdiff b/storage/spider/mysql-test/spider/r/direct_join,usual_handler.rdiff new file mode 100644 index 0000000000000..6d48a46c8a998 --- /dev/null +++ b/storage/spider/mysql-test/spider/r/direct_join,usual_handler.rdiff @@ -0,0 +1,30 @@ +--- ../src/storage/spider/mysql-test/spider/r/direct_join.result 2025-08-01 15:07:36.420896283 +1000 ++++ ../src/storage/spider/mysql-test/spider/r/direct_join.reject 2025-10-22 17:42:14.703942870 +1100 +@@ -76,7 +76,17 @@ + connection child2_1; + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; + argument +-select t0.`a` `a`,t2.`b` `b`,t2.`c` `c` from `auto_test_remote`.`ta_r` t0 join `auto_test_remote`.`ta_r_3` t1 join `auto_test_remote`.`ta_r_int` t2 where ((t0.`a` = t1.`a`) and (t2.`a` = t1.`a`)) order by t0.`b` desc limit 1,2 ++select `a` from `auto_test_remote`.`ta_r_3` where (`a` is not null) limit 6 ++select `a`,`b` from `auto_test_remote`.`ta_r` where `a` = 1 limit 6 ++select `a`,`b`,`c` from `auto_test_remote`.`ta_r_int` where `a` = 1 limit 6 ++select `a`,`b` from `auto_test_remote`.`ta_r` where `a` = 2 limit 6 ++select `a`,`b`,`c` from `auto_test_remote`.`ta_r_int` where `a` = 2 limit 6 ++select `a`,`b` from `auto_test_remote`.`ta_r` where `a` = 3 limit 6 ++select `a`,`b`,`c` from `auto_test_remote`.`ta_r_int` where `a` = 3 limit 6 ++select `a`,`b` from `auto_test_remote`.`ta_r` where `a` = 4 limit 6 ++select `a`,`b`,`c` from `auto_test_remote`.`ta_r_int` where `a` = 4 limit 6 ++select `a`,`b` from `auto_test_remote`.`ta_r` where `a` = 5 limit 6 ++select `a`,`b`,`c` from `auto_test_remote`.`ta_r_int` where `a` = 5 limit 6 + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' + SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a; + a b date_format(c, '%Y-%m-%d %H:%i:%s') +@@ -167,7 +177,7 @@ + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; + argument + select `id`,`hr_status`,`region_code`,`region` from `auto_test_remote`.`tbl_person` where `id` = '24FC3F0A5119432BAE13DD65AABAA39C' and `region` = 510411 +-select count(0) `count(0)` from (select 1) t0 join `auto_test_remote`.`tbl_ncd_cm_person` t1 where ((t1.`person_id` = '24FC3F0A5119432BAE13DD65AABAA39C') and (t1.`diseaseKind_id` = '52A0328740914BCE86ED10A4D2521816')) ++select `person_id`,`diseaseKind_id` from `auto_test_remote`.`tbl_ncd_cm_person` where ((`person_id` = '24FC3F0A5119432BAE13DD65AABAA39C') and (`diseaseKind_id` = '52A0328740914BCE86ED10A4D2521816')) + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' + SELECT * FROM tbl_person; + id hr_status region_code region diff --git a/storage/spider/mysql-test/spider/r/direct_join_using,usual_handler.rdiff b/storage/spider/mysql-test/spider/r/direct_join_using,usual_handler.rdiff new file mode 100644 index 0000000000000..e3c098240be7e --- /dev/null +++ b/storage/spider/mysql-test/spider/r/direct_join_using,usual_handler.rdiff @@ -0,0 +1,21 @@ +--- ../src/storage/spider/mysql-test/spider/r/direct_join_using.result 2025-08-01 15:07:36.420896283 +1000 ++++ ../src/storage/spider/mysql-test/spider/r/direct_join_using.reject 2025-10-22 17:42:20.207983843 +1100 +@@ -79,7 +79,17 @@ + connection child2_1; + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; + argument +-select t0.`a` `a`,t2.`b` `b`,t2.`c` `c` from `auto_test_remote`.`ta_r` t0 join `auto_test_remote`.`ta_r_3` t1 join `auto_test_remote`.`ta_r_int` t2 where ((t0.`a` = t1.`a`) and (t2.`a` = t1.`a`)) order by t0.`b` desc ++select `a`,`b`,`c` from `auto_test_remote`.`ta_r_3` where (`a` is not null) ++select `a`,`b`,`c` from `auto_test_remote`.`ta_r` where `a` = 1 ++select `a`,`b`,`c` from `auto_test_remote`.`ta_r_int` where `a` = 1 ++select `a`,`b`,`c` from `auto_test_remote`.`ta_r` where `a` = 2 ++select `a`,`b`,`c` from `auto_test_remote`.`ta_r_int` where `a` = 2 ++select `a`,`b`,`c` from `auto_test_remote`.`ta_r` where `a` = 3 ++select `a`,`b`,`c` from `auto_test_remote`.`ta_r_int` where `a` = 3 ++select `a`,`b`,`c` from `auto_test_remote`.`ta_r` where `a` = 4 ++select `a`,`b`,`c` from `auto_test_remote`.`ta_r_int` where `a` = 4 ++select `a`,`b`,`c` from `auto_test_remote`.`ta_r` where `a` = 5 ++select `a`,`b`,`c` from `auto_test_remote`.`ta_r_int` where `a` = 5 + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' + SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a; + a b date_format(c, '%Y-%m-%d %H:%i:%s') diff --git a/storage/spider/mysql-test/spider/r/direct_left_join,usual_handler.rdiff b/storage/spider/mysql-test/spider/r/direct_left_join,usual_handler.rdiff new file mode 100644 index 0000000000000..93dc364387d11 --- /dev/null +++ b/storage/spider/mysql-test/spider/r/direct_left_join,usual_handler.rdiff @@ -0,0 +1,17 @@ +--- ../src/storage/spider/mysql-test/spider/r/direct_left_join.result 2025-08-01 15:07:36.420896283 +1000 ++++ ../src/storage/spider/mysql-test/spider/r/direct_left_join.reject 2025-10-22 17:42:25.256021497 +1100 +@@ -79,7 +79,13 @@ + connection child2_1; + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; + argument +-select t0.`a` `a`,t2.`b` `b`,t2.`c` `c` from `auto_test_remote`.`ta_r` t0 left join `auto_test_remote`.`ta_r_3` t1 on (t1.`a` = t0.`a`) left join `auto_test_remote`.`ta_r_int` t2 on (t2.`a` = t0.`a`) where 1 order by t0.`b` desc ++select `a`,`b` from `auto_test_remote`.`ta_r` ++select `a` from `auto_test_remote`.`ta_r_3` ++select `a`,`b`,`c` from `auto_test_remote`.`ta_r_int` where `a` = 1 ++select `a`,`b`,`c` from `auto_test_remote`.`ta_r_int` where `a` = 2 ++select `a`,`b`,`c` from `auto_test_remote`.`ta_r_int` where `a` = 3 ++select `a`,`b`,`c` from `auto_test_remote`.`ta_r_int` where `a` = 4 ++select `a`,`b`,`c` from `auto_test_remote`.`ta_r_int` where `a` = 5 + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' + SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a; + a b date_format(c, '%Y-%m-%d %H:%i:%s') diff --git a/storage/spider/mysql-test/spider/r/direct_left_join_nullable,usual_handler.rdiff b/storage/spider/mysql-test/spider/r/direct_left_join_nullable,usual_handler.rdiff new file mode 100644 index 0000000000000..524e9f7ba2118 --- /dev/null +++ b/storage/spider/mysql-test/spider/r/direct_left_join_nullable,usual_handler.rdiff @@ -0,0 +1,14 @@ +--- ../src/storage/spider/mysql-test/spider/r/direct_left_join_nullable.result 2024-05-01 14:39:20.122241957 +1000 ++++ ../src/storage/spider/mysql-test/spider/r/direct_left_join_nullable.reject 2025-10-22 17:42:31.592068856 +1100 +@@ -87,7 +87,10 @@ + connection child2_1; + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; + argument +-select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_no_idx` t0 left join `auto_test_remote`.`ta_r_auto_inc` t1 on (t1.`a` = t0.`a`) left join `auto_test_remote`.`ta_r_3` t2 on (t2.`c` = t1.`c`) left join `auto_test_remote`.`ta_r` t3 on (t3.`b` = t2.`b`) where 1 order by t0.`a` desc ++select `a` from `auto_test_remote`.`ta_r_no_idx` ++select `a`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `b`,`c` from `auto_test_remote`.`ta_r_3` ++select `a`,`b` from `auto_test_remote`.`ta_r` + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' + SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a; + a b date_format(c, '%Y-%m-%d %H:%i:%s') diff --git a/storage/spider/mysql-test/spider/r/direct_left_right_join_nullable,usual_handler.rdiff b/storage/spider/mysql-test/spider/r/direct_left_right_join_nullable,usual_handler.rdiff new file mode 100644 index 0000000000000..8d883d535ea40 --- /dev/null +++ b/storage/spider/mysql-test/spider/r/direct_left_right_join_nullable,usual_handler.rdiff @@ -0,0 +1,41 @@ +--- ../src/storage/spider/mysql-test/spider/r/direct_left_right_join_nullable.result 2024-11-14 13:59:27.762081104 +1100 ++++ ../src/storage/spider/mysql-test/spider/r/direct_left_right_join_nullable.reject 2025-10-22 17:42:33.452082780 +1100 +@@ -87,7 +87,37 @@ + connection child2_1; + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; + argument +-select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_no_idx` t3 left join (`auto_test_remote`.`ta_r` t0 join `auto_test_remote`.`ta_r_3` t1 join `auto_test_remote`.`ta_r_auto_inc` t2) on ((t2.`b` = t3.`b`) and (t2.`c` = t1.`c`) and (t0.`a` = t1.`a`) and (t1.`a` is not null)) where 1 order by t3.`a` desc ++select `a`,`b` from `auto_test_remote`.`ta_r_no_idx` ++select `a`,`c` from `auto_test_remote`.`ta_r_3` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 1 ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 2 ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 3 ++select `a`,`c` from `auto_test_remote`.`ta_r_3` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 1 ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 2 ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 3 ++select `a`,`c` from `auto_test_remote`.`ta_r_3` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 1 ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 2 ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 3 ++select `a`,`c` from `auto_test_remote`.`ta_r_3` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 1 ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 2 ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 3 ++select `a`,`c` from `auto_test_remote`.`ta_r_3` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 1 ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 2 ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 3 + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' + SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a; + a b date_format(c, '%Y-%m-%d %H:%i:%s') diff --git a/storage/spider/mysql-test/spider/r/direct_left_right_left_join_nullable,usual_handler.rdiff b/storage/spider/mysql-test/spider/r/direct_left_right_left_join_nullable,usual_handler.rdiff new file mode 100644 index 0000000000000..e7c3dee52038b --- /dev/null +++ b/storage/spider/mysql-test/spider/r/direct_left_right_left_join_nullable,usual_handler.rdiff @@ -0,0 +1,19 @@ +--- ../src/storage/spider/mysql-test/spider/r/direct_left_right_left_join_nullable.result 2024-11-14 13:59:27.762081104 +1100 ++++ ../src/storage/spider/mysql-test/spider/r/direct_left_right_left_join_nullable.reject 2025-10-22 17:42:33.560083588 +1100 +@@ -86,7 +86,15 @@ + connection child2_1; + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; + argument +-select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_auto_inc` t2 left join (`auto_test_remote`.`ta_r` t0 join `auto_test_remote`.`ta_r_3` t1) on ((t1.`c` = t2.`c`) and (t0.`a` = t1.`a`) and (t1.`a` is not null)) left join `auto_test_remote`.`ta_r_no_idx` t3 on (t3.`b` = t2.`b`) where 1 order by t3.`a` desc ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a`,`c` from `auto_test_remote`.`ta_r_3` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 1 ++select `a`,`c` from `auto_test_remote`.`ta_r_3` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 2 ++select `a`,`c` from `auto_test_remote`.`ta_r_3` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 3 ++select `a`,`c` from `auto_test_remote`.`ta_r_3` ++select `a`,`b` from `auto_test_remote`.`ta_r_no_idx` + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' + SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a; + a b date_format(c, '%Y-%m-%d %H:%i:%s') diff --git a/storage/spider/mysql-test/spider/r/direct_right_join,usual_handler.rdiff b/storage/spider/mysql-test/spider/r/direct_right_join,usual_handler.rdiff new file mode 100644 index 0000000000000..97e9bc28bb93c --- /dev/null +++ b/storage/spider/mysql-test/spider/r/direct_right_join,usual_handler.rdiff @@ -0,0 +1,21 @@ +--- ../src/storage/spider/mysql-test/spider/r/direct_right_join.result 2025-08-01 15:07:36.420896283 +1000 ++++ ../src/storage/spider/mysql-test/spider/r/direct_right_join.reject 2025-10-22 17:42:42.744152477 +1100 +@@ -79,7 +79,17 @@ + connection child2_1; + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; + argument +-select t0.`a` `a`,t2.`b` `b`,t2.`c` `c` from `auto_test_remote`.`ta_r_int` t2 left join (`auto_test_remote`.`ta_r_3` t1 join `auto_test_remote`.`ta_r` t0) on ((t0.`a` = t2.`a`) and (t1.`a` = t2.`a`)) where 1 order by t0.`b` desc ++select `a`,`b`,`c` from `auto_test_remote`.`ta_r_int` ++select `a`,`b` from `auto_test_remote`.`ta_r` where `a` = 1 ++select `a` from `auto_test_remote`.`ta_r_3` ++select `a`,`b` from `auto_test_remote`.`ta_r` where `a` = 2 ++select `a` from `auto_test_remote`.`ta_r_3` ++select `a`,`b` from `auto_test_remote`.`ta_r` where `a` = 3 ++select `a` from `auto_test_remote`.`ta_r_3` ++select `a`,`b` from `auto_test_remote`.`ta_r` where `a` = 4 ++select `a` from `auto_test_remote`.`ta_r_3` ++select `a`,`b` from `auto_test_remote`.`ta_r` where `a` = 5 ++select `a` from `auto_test_remote`.`ta_r_3` + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' + SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a; + a b date_format(c, '%Y-%m-%d %H:%i:%s') diff --git a/storage/spider/mysql-test/spider/r/direct_right_join_nullable,usual_handler.rdiff b/storage/spider/mysql-test/spider/r/direct_right_join_nullable,usual_handler.rdiff new file mode 100644 index 0000000000000..d419df1016625 --- /dev/null +++ b/storage/spider/mysql-test/spider/r/direct_right_join_nullable,usual_handler.rdiff @@ -0,0 +1,23 @@ +--- ../src/storage/spider/mysql-test/spider/r/direct_right_join_nullable.result 2024-11-14 13:59:27.762081104 +1100 ++++ ../src/storage/spider/mysql-test/spider/r/direct_right_join_nullable.reject 2025-10-22 17:41:24.255571412 +1100 +@@ -87,7 +87,19 @@ + connection child2_1; + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; + argument +-select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_no_idx` t3 left join (`auto_test_remote`.`ta_r_auto_inc` t2 left join (`auto_test_remote`.`ta_r_3` t1 left join `auto_test_remote`.`ta_r` t0 on ((t0.`a` = t1.`a`) and (t1.`a` is not null))) on (t1.`c` = t2.`c`)) on (t2.`b` = t3.`b`) where 1 order by t3.`a` desc ++select `a`,`b` from `auto_test_remote`.`ta_r_no_idx` ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a`,`c` from `auto_test_remote`.`ta_r_3` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 1 ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a`,`c` from `auto_test_remote`.`ta_r_3` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 2 ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a`,`c` from `auto_test_remote`.`ta_r_3` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 3 ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a`,`c` from `auto_test_remote`.`ta_r_3` ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' + SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a; + a b date_format(c, '%Y-%m-%d %H:%i:%s') diff --git a/storage/spider/mysql-test/spider/r/direct_right_left_join_nullable,usual_handler.rdiff b/storage/spider/mysql-test/spider/r/direct_right_left_join_nullable,usual_handler.rdiff new file mode 100644 index 0000000000000..3797ee142f69b --- /dev/null +++ b/storage/spider/mysql-test/spider/r/direct_right_left_join_nullable,usual_handler.rdiff @@ -0,0 +1,19 @@ +--- ../src/storage/spider/mysql-test/spider/r/direct_right_left_join_nullable.result 2024-11-14 13:59:27.762081104 +1100 ++++ ../src/storage/spider/mysql-test/spider/r/direct_right_left_join_nullable.reject 2025-10-22 17:41:31.051621007 +1100 +@@ -86,7 +86,15 @@ + connection child2_1; + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; + argument +-select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_auto_inc` t2 left join (`auto_test_remote`.`ta_r_3` t1 left join `auto_test_remote`.`ta_r` t0 on ((t0.`a` = t1.`a`) and (t1.`a` is not null))) on (t1.`c` = t2.`c`) left join `auto_test_remote`.`ta_r_no_idx` t3 on (t3.`b` = t2.`b`) where 1 order by t3.`a` desc ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a`,`c` from `auto_test_remote`.`ta_r_3` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 1 ++select `a`,`c` from `auto_test_remote`.`ta_r_3` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 2 ++select `a`,`c` from `auto_test_remote`.`ta_r_3` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 3 ++select `a`,`c` from `auto_test_remote`.`ta_r_3` ++select `a`,`b` from `auto_test_remote`.`ta_r_no_idx` + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' + SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a; + a b date_format(c, '%Y-%m-%d %H:%i:%s') diff --git a/storage/spider/mysql-test/spider/r/direct_right_left_right_join_nullable,usual_handler.rdiff b/storage/spider/mysql-test/spider/r/direct_right_left_right_join_nullable,usual_handler.rdiff new file mode 100644 index 0000000000000..e34c75625cb90 --- /dev/null +++ b/storage/spider/mysql-test/spider/r/direct_right_left_right_join_nullable,usual_handler.rdiff @@ -0,0 +1,46 @@ +--- ../src/storage/spider/mysql-test/spider/r/direct_right_left_right_join_nullable.result 2024-11-14 13:59:27.762081104 +1100 ++++ ../src/storage/spider/mysql-test/spider/r/direct_right_left_right_join_nullable.reject 2025-10-22 17:41:38.127672798 +1100 +@@ -87,7 +87,42 @@ + connection child2_1; + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; + argument +-select t0.`a` `a`,t2.`b` `b`,t2.`c` `c`,t3.`a` `a` from `auto_test_remote`.`ta_r_no_idx` t3 left join (`auto_test_remote`.`ta_r_3` t1 left join `auto_test_remote`.`ta_r` t0 on ((t0.`a` = t1.`a`) and (t1.`a` is not null)) join `auto_test_remote`.`ta_r_auto_inc` t2) on ((t2.`b` = t3.`b`) and (t2.`c` = t1.`c`)) where 1 order by t3.`a` desc ++select `a`,`b` from `auto_test_remote`.`ta_r_no_idx` ++select `a`,`c` from `auto_test_remote`.`ta_r_3` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 1 ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 2 ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 3 ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a`,`c` from `auto_test_remote`.`ta_r_3` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 1 ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 2 ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 3 ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a`,`c` from `auto_test_remote`.`ta_r_3` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 1 ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 2 ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 3 ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a`,`c` from `auto_test_remote`.`ta_r_3` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 1 ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 2 ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 3 ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a`,`c` from `auto_test_remote`.`ta_r_3` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 1 ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 2 ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` ++select `a` from `auto_test_remote`.`ta_r` where `a` = 3 ++select `b`,`c` from `auto_test_remote`.`ta_r_auto_inc` + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' + SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a; + a b date_format(c, '%Y-%m-%d %H:%i:%s') diff --git a/storage/spider/mysql-test/spider/r/pushdown_not_like,usual_handler.rdiff b/storage/spider/mysql-test/spider/r/pushdown_not_like,usual_handler.rdiff new file mode 100644 index 0000000000000..c1bdac735cde1 --- /dev/null +++ b/storage/spider/mysql-test/spider/r/pushdown_not_like,usual_handler.rdiff @@ -0,0 +1,11 @@ +--- ../src/storage/spider/mysql-test/spider/r/pushdown_not_like.result 2024-05-01 14:39:20.122241957 +1000 ++++ ../src/storage/spider/mysql-test/spider/r/pushdown_not_like.reject 2025-10-22 17:41:34.179643884 +1100 +@@ -41,7 +41,7 @@ + connection child2_1; + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select%'; + argument +-select t0.`a` `a`,t0.`b` `b`,t0.`c` `c` from `auto_test_remote`.`ta_r` t0 where (t0.`b` not like 'a%') ++select `a`,`b`,`c` from `auto_test_remote`.`ta_r` where (`b` not like 'a%') + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select%' + + deinit diff --git a/storage/spider/mysql-test/spider/r/timestamp,usual_handler.rdiff b/storage/spider/mysql-test/spider/r/timestamp,usual_handler.rdiff new file mode 100644 index 0000000000000..df0f554f43a9e --- /dev/null +++ b/storage/spider/mysql-test/spider/r/timestamp,usual_handler.rdiff @@ -0,0 +1,97 @@ +--- ../src/storage/spider/mysql-test/spider/r/timestamp.result 2025-08-01 15:07:36.420896283 +1000 ++++ ../src/storage/spider/mysql-test/spider/r/timestamp.reject 2025-10-22 17:41:31.819626622 +1100 +@@ -114,7 +114,7 @@ + connection child2_1; + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; + argument +-select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 ++select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' + SELECT col_a, col_dt, col_ts, unix_timestamp(col_ts) FROM tbl_a ORDER BY col_a; + col_a col_dt col_ts unix_timestamp(col_ts) +@@ -140,7 +140,7 @@ + connection child2_1; + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; + argument +-select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 ++select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' + SELECT col_a, col_dt, col_ts, unix_timestamp(col_ts) FROM tbl_a ORDER BY col_a; + col_a col_dt col_ts unix_timestamp(col_ts) +@@ -166,7 +166,7 @@ + connection child2_1; + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; + argument +-select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 ++select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' + SELECT col_a, col_dt, col_ts, unix_timestamp(col_ts) FROM tbl_a ORDER BY col_a; + col_a col_dt col_ts unix_timestamp(col_ts) +@@ -194,7 +194,7 @@ + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; + argument + select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` for update +-select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 ++select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' + SELECT col_a, col_dt, col_ts, unix_timestamp(col_ts) FROM tbl_a ORDER BY col_a; + col_a col_dt col_ts unix_timestamp(col_ts) +@@ -252,13 +252,13 @@ + connection child2_1; + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; + argument +-select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 where (t0.`col_ts` > _latin1'2017-12-31 23:00:00') +-select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 where (t0.`col_ts` < _latin1'2018-10-28 01:30:00') +-select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 where (_latin1'2018-10-28 01:30:00' > t0.`col_ts`) +-select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 where (t0.`col_ts` between _latin1'2018-10-28 00:30:00' and _latin1'2018-10-28 01:30:00') +-select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 where ((t0.`col_ts` >= _latin1'2018-10-28 00:30:00') and (t0.`col_ts` <= _latin1'2018-10-28 01:30:00')) +-select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 where (t0.`col_ts` > '2018-03-25 01:00:00') +-select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 where (t0.`col_ts` > '1970-01-01 00:00:01') ++select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` where (`col_ts` > _latin1'2017-12-31 23:00:00') order by `col_ts` ++select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` where (`col_ts` < _latin1'2018-10-28 01:30:00') order by `col_ts` ++select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` where (_latin1'2018-10-28 01:30:00' > `col_ts`) order by `col_ts` ++select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` where `col_ts` >= _latin1'2018-10-28 00:30:00' and `col_ts` <= _latin1'2018-10-28 01:30:00' and (`col_ts` between _latin1'2018-10-28 00:30:00' and _latin1'2018-10-28 01:30:00') order by `col_ts` ++select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` where `col_ts` >= _latin1'2018-10-28 00:30:00' and `col_ts` <= _latin1'2018-10-28 01:30:00' and ((`col_ts` >= _latin1'2018-10-28 00:30:00') and (`col_ts` <= _latin1'2018-10-28 01:30:00')) order by `col_ts` ++select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` where (`col_ts` > '2018-03-25 01:00:00') order by `col_ts` ++select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` where (`col_ts` > '1970-01-01 00:00:01') order by `col_ts` + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' + SELECT col_a, col_dt, col_ts, unix_timestamp(col_ts) FROM tbl_a ORDER BY col_a; + col_a col_dt col_ts unix_timestamp(col_ts) +@@ -339,13 +339,13 @@ + connection child2_1; + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; + argument +-select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 where (t0.`col_ts` > _latin1'2017-12-31 23:00:00') +-select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 where (t0.`col_ts` < _latin1'2018-10-28 01:30:00') +-select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 where (_latin1'2018-10-28 01:30:00' > t0.`col_ts`) +-select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 where (t0.`col_ts` between _latin1'2018-10-28 00:30:00' and _latin1'2018-10-28 01:30:00') +-select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 where ((t0.`col_ts` >= _latin1'2018-10-28 00:30:00') and (t0.`col_ts` <= _latin1'2018-10-28 01:30:00')) +-select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 where (t0.`col_ts` > '2018-03-25 01:00:00') +-select t0.`col_a` `col_a`,t0.`col_dt` `col_dt`,t0.`col_ts` `col_ts`,(unix_timestamp(t0.`col_ts`)) `unix_timestamp(col_ts)` from `ts_test_remote`.`tbl_a` t0 where (t0.`col_ts` > '1970-01-01 00:00:01') ++select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` where (`col_ts` > _latin1'2017-12-31 23:00:00') ++select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` where (`col_ts` < _latin1'2018-10-28 01:30:00') ++select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` where (_latin1'2018-10-28 01:30:00' > `col_ts`) ++select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` where (`col_ts` between _latin1'2018-10-28 00:30:00' and _latin1'2018-10-28 01:30:00') ++select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` where ((`col_ts` >= _latin1'2018-10-28 00:30:00') and (`col_ts` <= _latin1'2018-10-28 01:30:00')) ++select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` where (`col_ts` > '2018-03-25 01:00:00') ++select `col_a`,`col_dt`,`col_ts` from `ts_test_remote`.`tbl_a` where (`col_ts` > '1970-01-01 00:00:01') + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' + SELECT col_a, col_dt, col_ts, unix_timestamp(col_ts) FROM tbl_a ORDER BY col_a; + col_a col_dt col_ts unix_timestamp(col_ts) +@@ -392,11 +392,11 @@ + connection child2_1; + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; + argument +-select t0.`col_d` `col_d`,t0.`col_t` `col_t` from `ts_test_remote`.`tbl_f` t0 +-select (timestamp(t0.`col_d` , t0.`col_t`)) `TIMESTAMP(col_d, col_t)` from `ts_test_remote`.`tbl_f` t0 +-select (timestamp('2018-06-25' , t0.`col_t`)) `TIMESTAMP('2018-06-25', col_t)` from `ts_test_remote`.`tbl_f` t0 +-select (timestamp(t0.`col_d` , '10:43:21')) `TIMESTAMP(col_d, '10:43:21')` from `ts_test_remote`.`tbl_f` t0 +-select (timestamp('2018-06-25' , '10:43:21')) `TIMESTAMP('2018-06-25', '10:43:21')` from `ts_test_remote`.`tbl_f` t0 ++select `col_d`,`col_t` from `ts_test_remote`.`tbl_f` ++select `col_d`,`col_t` from `ts_test_remote`.`tbl_f` ++select `col_t` from `ts_test_remote`.`tbl_f` ++select `col_d` from `ts_test_remote`.`tbl_f` ++select 1 from `ts_test_remote`.`tbl_f` + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %' + SELECT col_d, col_t FROM tbl_f; + col_d col_t diff --git a/storage/spider/mysql-test/spider/r/udf_pushdown,usual_handler.rdiff b/storage/spider/mysql-test/spider/r/udf_pushdown,usual_handler.rdiff new file mode 100644 index 0000000000000..820599b8280e1 --- /dev/null +++ b/storage/spider/mysql-test/spider/r/udf_pushdown,usual_handler.rdiff @@ -0,0 +1,13 @@ +--- ../src/storage/spider/mysql-test/spider/r/udf_pushdown.result 2022-12-05 17:51:57.843152110 +1100 ++++ ../src/storage/spider/mysql-test/spider/r/udf_pushdown.reject 2025-10-22 17:41:38.167673091 +1100 +@@ -148,8 +148,8 @@ + connection child2_1; + SELECT argument FROM mysql.general_log WHERE argument LIKE "%select%" AND argument NOT LIKE "%argument%"; + argument +-select t0.`id` `id`,t0.`a` `a` from `auto_test_remote`.`ta_r` t0 where (t0.`id` = (`plusone`(1))) +-select t0.`id` `id`,t0.`a` `a` from `auto_test_remote`.`ta_r` t0 where ((t0.`id` in( (`plusone`(1)) , (`plusone`(2)))) and (t0.`a` = (`plusone`(32)))) ++select `id`,`a` from `auto_test_remote`.`ta_r` where (`id` = (`plusone`(1))) ++select `id`,`a` from `auto_test_remote`.`ta_r` where ((`id` in( (`plusone`(1)) , (`plusone`(2)))) and (`a` = (`plusone`(32)))) + + ##### test UPDATEs ##### + connection master_1; diff --git a/storage/spider/mysql-test/spider/regression/e1121/combinations b/storage/spider/mysql-test/spider/regression/e1121/combinations new file mode 120000 index 0000000000000..ae8bc75d267c7 --- /dev/null +++ b/storage/spider/mysql-test/spider/regression/e1121/combinations @@ -0,0 +1 @@ +/home/ycp/source/mariadb-server/10.11/src/storage/spider/mysql-test/spider/combinations \ No newline at end of file diff --git a/storage/spider/mysql-test/spider/regression/e1121/r/direct_join_by_pkey_key,usual_handler.rdiff b/storage/spider/mysql-test/spider/regression/e1121/r/direct_join_by_pkey_key,usual_handler.rdiff new file mode 100644 index 0000000000000..378474bd8d466 --- /dev/null +++ b/storage/spider/mysql-test/spider/regression/e1121/r/direct_join_by_pkey_key,usual_handler.rdiff @@ -0,0 +1,11 @@ +--- ../src/storage/spider/mysql-test/spider/regression/e1121/r/direct_join_by_pkey_key.result 2024-11-14 13:59:27.762081104 +1100 ++++ ../src/storage/spider/mysql-test/spider/regression/e1121/r/direct_join_by_pkey_key.reject 2025-10-22 17:41:34.943649475 +1100 +@@ -46,7 +46,7 @@ + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%`tbl_a`%' ; + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%`tbl_b`%'; + argument +-select t0.`val` `val`,t0.`akey` `akey` from `auto_test_remote`.`tbl_a` t0 join (select 1) t1 where (t0.`akey` = '4') ++select `akey`,`val` from `auto_test_remote`.`tbl_a` where `akey` = 4 + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%`tbl_a`%' ; + SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%`tbl_b`%' + argument diff --git a/storage/spider/mysql-test/spider/regression/e112122/combinations b/storage/spider/mysql-test/spider/regression/e112122/combinations new file mode 120000 index 0000000000000..ae8bc75d267c7 --- /dev/null +++ b/storage/spider/mysql-test/spider/regression/e112122/combinations @@ -0,0 +1 @@ +/home/ycp/source/mariadb-server/10.11/src/storage/spider/mysql-test/spider/combinations \ No newline at end of file diff --git a/storage/spider/mysql-test/spider/t/direct_join_using.test b/storage/spider/mysql-test/spider/t/direct_join_using.test index fcc273e5d1e70..0a35d719570d8 100644 --- a/storage/spider/mysql-test/spider/t/direct_join_using.test +++ b/storage/spider/mysql-test/spider/t/direct_join_using.test @@ -126,7 +126,7 @@ insert into tbl_c values (1,10,100),(2,20,200),(3,30,300),(4,40,400),(5,50,500); TRUNCATE TABLE mysql.general_log; --connection master_1 ---disable_ps2_protocol +--disable_ps_protocol --disable_view_protocol SELECT a.a, c.b, c.c FROM tbl_a a join tbl_b b using(a) join tbl_c c using(a) ORDER BY a.b DESC; --enable_view_protocol @@ -135,7 +135,7 @@ SELECT a.a, c.b, c.c FROM tbl_a a join tbl_b b using(a) join tbl_c c using(a) OR SELECT argument FROM mysql.general_log WHERE command_type != 'Execute' AND argument LIKE '%select %'; --enable_view_protocol SELECT a, b, date_format(c, '%Y-%m-%d %H:%i:%s') FROM ta_r ORDER BY a; ---enable_ps2_protocol +--enable_ps_protocol --echo --echo deinit diff --git a/storage/spider/spd_db_conn.cc b/storage/spider/spd_db_conn.cc index f55458ab1e1f3..667f97e0dd0d5 100644 --- a/storage/spider/spd_db_conn.cc +++ b/storage/spider/spd_db_conn.cc @@ -3104,7 +3104,7 @@ int spider_db_store_result( result_list->quick_phase == 2 ) { if (result_list->low_mem_read && - result_list->current->result->limit_mode() == 0) + conn->db_conn->limit_mode() == 0) { do { spider_db_free_one_result(result_list, diff --git a/storage/spider/spd_db_include.cc b/storage/spider/spd_db_include.cc index 0531f8a8ed9bc..8f3f6721ba6eb 100644 --- a/storage/spider/spd_db_include.cc +++ b/storage/spider/spd_db_include.cc @@ -47,13 +47,6 @@ int spider_db_result::fetch_table_checksum( DBUG_RETURN(0); } -uint spider_db_result::limit_mode() -{ - DBUG_ENTER("spider_db_result::limit_mode"); - DBUG_PRINT("info",("spider this=%p", this)); - DBUG_RETURN(spider_dbton[dbton_id].db_util->limit_mode()); -} - spider_db_conn::spider_db_conn( SPIDER_CONN *in_conn ) : conn(in_conn), dbton_id(in_conn->dbton_id) diff --git a/storage/spider/spd_db_include.h b/storage/spider/spd_db_include.h index ef49b2d0ef8f8..1e7406797a4eb 100644 --- a/storage/spider/spd_db_include.h +++ b/storage/spider/spd_db_include.h @@ -609,7 +609,7 @@ class spider_fields ); SPIDER_CONN_HOLDER *create_conn_holder(); bool has_conn_holder(); - void clear_conn_holder_from_conn(); + void clear_conn_holder_checked(); bool check_conn_same_conn( SPIDER_CONN *conn_arg ); @@ -887,7 +887,6 @@ class spider_db_result SPIDER_SHARE *spider_share, CHARSET_INFO *access_charset ) = 0; - virtual uint limit_mode(); }; class spider_db_conn diff --git a/storage/spider/spd_group_by_handler.cc b/storage/spider/spd_group_by_handler.cc index 423f493262ede..e907d4de33ac9 100644 --- a/storage/spider/spd_group_by_handler.cc +++ b/storage/spider/spd_group_by_handler.cc @@ -631,7 +631,8 @@ bool spider_fields::has_conn_holder( DBUG_RETURN(first_conn_holder); } -void spider_fields::clear_conn_holder_from_conn( +/* Mark checked_for_same_conn to false for all conn holders */ +void spider_fields::clear_conn_holder_checked( ) { DBUG_ENTER("spider_fields::clear_conn_checked_for_same_conn"); DBUG_PRINT("info",("spider this=%p", this)); @@ -643,6 +644,9 @@ void spider_fields::clear_conn_holder_from_conn( DBUG_VOID_RETURN; } +/* Set current conn holder to be the first conn holder with a matching + conn and mark its checked_for_same_conn to be true. Return true if + one is found and vice versa. */ bool spider_fields::check_conn_same_conn( SPIDER_CONN *conn_arg ) { @@ -660,6 +664,7 @@ bool spider_fields::check_conn_same_conn( DBUG_RETURN(FALSE); } +/* Remove all conn holders with false checked_for_same_conn */ bool spider_fields::remove_conn_if_not_checked( ) { SPIDER_CONN_HOLDER *conn_holder; @@ -1457,6 +1462,7 @@ group_by_handler *spider_create_group_by_handler( goto skip_free_table_holder; } memset(dbton_bitmap, 0, spider_bitmap_size(SPIDER_DBTON_SIZE)); + /* Find all backends used by the first table. */ for (roop_count = 0; roop_count < (int) share->use_dbton_count; ++roop_count) { dbton_id = share->use_sql_dbton_ids[roop_count]; @@ -1487,6 +1493,7 @@ group_by_handler *spider_create_group_by_handler( DBUG_PRINT("info",("spider can not add a table")); goto skip_free_table_holder; } + /* Find all backends used by the current table */ memset(dbton_bitmap_tmp, 0, spider_bitmap_size(SPIDER_DBTON_SIZE)); for (roop_count = 0; roop_count < (int) share->use_dbton_count; ++roop_count) { @@ -1498,6 +1505,7 @@ group_by_handler *spider_create_group_by_handler( spider_set_bit(dbton_bitmap_tmp, dbton_id); } } + /* Intersect to get common backends used by all tables (so far) */ for (roop_count = 0; roop_count < spider_bitmap_size(SPIDER_DBTON_SIZE); ++roop_count) { @@ -1740,7 +1748,7 @@ group_by_handler *spider_create_group_by_handler( while ((from = from->next_local)) { - fields->clear_conn_holder_from_conn(); + fields->clear_conn_holder_checked(); if (from->table->part_info) { @@ -1774,10 +1782,13 @@ group_by_handler *spider_create_group_by_handler( DBUG_PRINT("info",("spider conn=%p", conn)); if (!fields->check_conn_same_conn(conn)) { - DBUG_PRINT("info",("spider connection %p can not be used for this query with locking", - conn)); if (lock_mode) + { + DBUG_PRINT("info", ("spider connection %p can not be used for this " + "query with locking", + conn)); goto skip_free_fields; + } continue; } if (fields->add_link_idx(conn->conn_holder_for_direct_join, spider, roop_count)) @@ -1795,6 +1806,10 @@ group_by_handler *spider_create_group_by_handler( goto skip_free_fields; } } + /* Do not create if all conn holders have been removed. This + happens if the current table does not share usable conns with + the first table. One typical example is when the current table + is located on a different server from the first table. */ if (!fields->has_conn_holder()) { goto skip_free_fields; diff --git a/strings/ctype-big5.c b/strings/ctype-big5.c index dd9da47a5a1b6..b50a0a213ab15 100644 --- a/strings/ctype-big5.c +++ b/strings/ctype-big5.c @@ -6827,7 +6827,9 @@ static MY_CHARSET_HANDLER my_charset_big5_handler= my_native_to_mb_big5, my_wc_to_printable_generic, my_casefold_multiply_1, - my_casefold_multiply_1 + my_casefold_multiply_1, + NULL, + NULL }; struct charset_info_st my_charset_big5_chinese_ci= diff --git a/strings/ctype-bin.c b/strings/ctype-bin.c index 5e04655dda412..d66a8aaf9aa6e 100644 --- a/strings/ctype-bin.c +++ b/strings/ctype-bin.c @@ -603,7 +603,9 @@ static MY_CHARSET_HANDLER my_charset_handler= my_wc_mb_bin, my_wc_to_printable_generic, my_casefold_multiply_1, - my_casefold_multiply_1 + my_casefold_multiply_1, + NULL, + NULL }; diff --git a/strings/ctype-cp932.c b/strings/ctype-cp932.c index f3f86d473cba6..ac9b13689a961 100644 --- a/strings/ctype-cp932.c +++ b/strings/ctype-cp932.c @@ -34784,7 +34784,9 @@ static MY_CHARSET_HANDLER my_charset_handler= my_native_to_mb_cp932, my_wc_to_printable_generic, my_casefold_multiply_1, - my_casefold_multiply_1 + my_casefold_multiply_1, + NULL, + NULL }; diff --git a/strings/ctype-euc_kr.c b/strings/ctype-euc_kr.c index 6c4dda602ee70..93e95441c4614 100644 --- a/strings/ctype-euc_kr.c +++ b/strings/ctype-euc_kr.c @@ -10074,7 +10074,9 @@ static MY_CHARSET_HANDLER my_charset_handler= my_native_to_mb_euckr, my_wc_to_printable_generic, my_casefold_multiply_1, - my_casefold_multiply_1 + my_casefold_multiply_1, + NULL, + NULL }; diff --git a/strings/ctype-eucjpms.c b/strings/ctype-eucjpms.c index 9a5b442deae57..ab9a721ad2686 100644 --- a/strings/ctype-eucjpms.c +++ b/strings/ctype-eucjpms.c @@ -67612,7 +67612,9 @@ static MY_CHARSET_HANDLER my_charset_handler= my_native_to_mb_eucjpms, my_wc_to_printable_generic, my_casefold_multiply_1, - my_casefold_multiply_2 + my_casefold_multiply_2, + NULL, + NULL }; diff --git a/strings/ctype-gb2312.c b/strings/ctype-gb2312.c index 518fe3a4dbecd..0a754e0008b18 100644 --- a/strings/ctype-gb2312.c +++ b/strings/ctype-gb2312.c @@ -6478,7 +6478,9 @@ static MY_CHARSET_HANDLER my_charset_handler= my_native_to_mb_gb2312, my_wc_to_printable_generic, my_casefold_multiply_1, - my_casefold_multiply_1 + my_casefold_multiply_1, + NULL, + NULL }; diff --git a/strings/ctype-gbk.c b/strings/ctype-gbk.c index ce7b079a48d88..dc5491a1eb16f 100644 --- a/strings/ctype-gbk.c +++ b/strings/ctype-gbk.c @@ -10759,7 +10759,9 @@ static MY_CHARSET_HANDLER my_charset_handler= my_native_to_mb_gbk, my_wc_to_printable_generic, my_casefold_multiply_1, - my_casefold_multiply_1 + my_casefold_multiply_1, + NULL, + NULL }; diff --git a/strings/ctype-latin1.c b/strings/ctype-latin1.c index b507b15a6863a..3fef8b1d5bc2f 100644 --- a/strings/ctype-latin1.c +++ b/strings/ctype-latin1.c @@ -427,7 +427,9 @@ static MY_CHARSET_HANDLER my_charset_handler= my_wc_mb_bin, /* native_to_mb */ my_wc_to_printable_generic, my_casefold_multiply_1, - my_casefold_multiply_1 + my_casefold_multiply_1, + NULL, + NULL }; diff --git a/strings/ctype-mb.c b/strings/ctype-mb.c index 93edb1d359332..8798a60ecddc4 100644 --- a/strings/ctype-mb.c +++ b/strings/ctype-mb.c @@ -21,6 +21,381 @@ #ifdef USE_MB +const MY_HALFWIDTH_FULLWIDTH_TUPLE my_fullwidth[]= +{ + /* 00 - 06*/ + {0,0,0,0,0,0,0,0,0,0,0,0}, + {0x8142,0,0,0x8142,0,0,0xa1a3,0,0,0xa1a3,0,0}, + {0x8175,0,0,0x8175,0,0,0xa1d6,0,0,0xa1d6,0,0}, + {0x8176,0,0,0x8176,0,0,0xa1d7,0,0,0xa1d7,0,0}, + {0x8141,0,0,0x8141,0,0,0xa1a2,0,0,0xa1a2,0,0}, + {0x8144,0,0,0x8144,0,0,0xa1a5,0,0,0xa1a5,0,0}, + {0x8392,0,0,0x82f0,0,0,0xa5f2,0,0,0xa4f2,0,0}, + //ァ + {0x8340,0,0,0x829f,0,0,0xa5a1,0,0,0xa4a1,0,0}, + {0x8342,0,0,0x82a1,0,0,0xa5a3,0,0,0xa4a3,0,0}, + {0x8344,0,0,0x82a3,0,0,0xa5a5,0,0,0xa4a5,0,0}, + {0x8346,0,0,0x82a5,0,0,0xa5a7,0,0,0xa4a7,0,0}, + {0x8348,0,0,0x82a7,0,0,0xa5a9,0,0,0xa4a9,0,0}, + //ャ + {0x8383,0,0,0x82e1,0,0,0xa5e3,0,0,0xa4e3,0,0}, + {0x8385,0,0,0x82e3,0,0,0xa5e5,0,0,0xa4e5,0,0}, + {0x8387,0,0,0x82e5,0,0,0xa5e7,0,0,0xa4e7,0,0}, + //ッ + {0x8362,0,0,0x82c2,0,0,0xa5c3,0,0,0xa4c3,0,0}, + //ー + {0x8158,0,0,0x8158,0,0,0xa1bc,0,0,0xa1bc,0,0}, + //ア + {0x8341,0,0,0x82a0,0,0,0xa5a2,0,0,0xa4a2,0,0}, + {0x8343,0,0,0x82a2,0,0,0xa5a4,0,0,0xa4a4,0,0}, + {0x8345,0x833f,0,0x82a4,0,0,0xa5a6,0,0,0xa4a6,0,0}, + {0x8347,0,0,0x82a6,0,0,0xa5a8,0,0,0xa4a8,0,0}, + {0x8349,0,0,0x82a8,0,0,0xa5aa,0,0,0xa4aa,0,0}, + //カ + {0x834a,0x834B,0,0x82a9,0x82aa,0,0xa5ab,0xa5ac,0,0xa4ab,0xa4ac,0}, + {0x834c,0x834d,0,0x82ab,0x82ac,0,0xa5ad,0xa5ae,0,0xa4ad,0xa4ae,0}, + {0x834e,0x834f,0,0x82ad,0x82ae,0,0xa5af,0xa5b0,0,0xa4af,0xa4b0,0}, + {0x8350,0x8351,0,0x82af,0x82b0,0,0xa5b1,0xa5b2,0,0xa4b1,0xa4b2,0}, + {0x8352,0x8353,0,0x82b1,0x82b2,0,0xa5b3,0xa5b4,0,0xa4b3,0xa4b4,0}, + //サ + {0x8354,0x8355,0,0x82b3,0x82b4,0,0xa5b5,0xa5b6,0,0xa4b5,0xa4b6,0}, + {0x8356,0x8357,0,0x82b5,0x82b6,0,0xa5b7,0xa5b8,0,0xa4b7,0xa4b8,0}, + {0x8358,0x8359,0,0x82b7,0x82b8,0,0xa5b9,0xa5ba,0,0xa4b9,0xa4ba,0}, + {0x835a,0x835b,0,0x82b9,0x82ba,0,0xa5bb,0xa5bc,0,0xa4bb,0xa4bc,0}, + {0x835c,0x835d,0,0x82bb,0x82bc,0,0xa5bd,0xa5be,0,0xa4bd,0xa4be,0}, + //タ + {0x835e,0x835f,0,0x82bd,0x82be,0,0xa5bf,0xa5c0,0,0xa4bf,0xa4c0,0}, + {0x8360,0x8361,0,0x82bf,0x82c0,0,0xa5c1,0xa5c2,0,0xa4c1,0xa4c2,0}, + {0x8363,0x8364,0,0x82c2,0x82c3,0,0xa5c4,0xa5c5,0,0xa4c4,0xa4c5,0}, + {0x8365,0x8366,0,0x82c4,0x82c5,0,0xa5c6,0xa5c7,0,0xa4c6,0xa4c7,0}, + {0x8367,0x8368,0,0x82c6,0x82c7,0,0xa5c8,0xa5c9,0,0xa4c8,0xa4c9,0}, + //ナ + {0x8369,0,0,0x82c8,0,0,0xa5ca,0,0,0xa4ca,0,0}, + {0x836a,0,0,0x82c9,0,0,0xa5cb,0,0,0xa4cb,0,0}, + {0x836b,0,0,0x82ca,0,0,0xa5cc,0,0,0xa4cc,0,0}, + {0x836c,0,0,0x82cb,0,0,0xa5cd,0,0,0xa4cd,0,0}, + {0x836d,0,0,0x82cc,0,0,0xa5ce,0,0,0xa4ce,0,0}, + //ハ + {0x836e,0x836f,0x8370,0x82cd,0x82ce,0x82cf,0xa5cf,0xa5d0,0xa5d1,0xa4cf,0xa4d0,0xa4d1}, + {0x8371,0x8372,0x8373,0x82d0,0x82d1,0x82d2,0xa5d2,0xa5d3,0xa5d4,0xa4d2,0xa4d3,0xa4d4}, + {0x8374,0x8375,0x8376,0x82d3,0x82d4,0x82d5,0xa5d5,0xa5d6,0xa5d7,0xa4d5,0xa4d6,0xa4d7}, + {0x8377,0x8378,0x8379,0x82d6,0x82d7,0x82d8,0xa5d8,0xa5d9,0xa5da,0xa4d8,0xa4d9,0xa4da}, + {0x837a,0x837b,0x837c,0x82d9,0x82da,0x82db,0xa5db,0xa5dc,0xa5dd,0xa4db,0xa4dc,0xa4dd}, + //マ + {0x837d,0,0,0x82dc,0,0,0xa5de,0,0,0xa4de,0,0}, + {0x837e,0,0,0x82dd,0,0,0xa5df,0,0,0xa4df,0,0}, + {0x8380,0,0,0x82de,0,0,0xa5e0,0,0,0xa4e0,0,0}, + {0x8381,0,0,0x82df,0,0,0xa5e1,0,0,0xa4e1,0,0}, + {0x8382,0,0,0x82e0,0,0,0xa5e2,0,0,0xa4e2,0,0}, + //ヤ + {0x8384,0,0,0x82e2,0,0,0xa5e4,0,0,0xa4e4,0,0}, + {0x8386,0,0,0x82e4,0,0,0xa5e6,0,0,0xa4e6,0,0}, + {0x8388,0,0,0x82e6,0,0,0xa5e8,0,0,0xa4e8,0,0}, + //ラ + {0x8389,0,0,0x82e7,0,0,0xa5e9,0,0,0xa4e9,0,0}, + {0x838a,0,0,0x82e8,0,0,0xa5ea,0,0,0xa4ea,0,0}, + {0x838b,0,0,0x82e9,0,0,0xa5eb,0,0,0xa4eb,0,0}, + {0x838c,0,0,0x82ea,0,0,0xa5ec,0,0,0xa4ec,0,0}, + {0x838d,0,0,0x82eb,0,0,0xa5ed,0,0,0xa4ed,0,0}, + //ワ, ン + {0x838f,0,0,0x82ed,0,0,0xa5ef,0,0,0xa4ef,0,0}, + {0x8393,0,0,0x82f1,0,0,0xa5f3,0,0,0xa4f3,0,0} +}; + + +const MY_FULLWIDTH_HALFWIDTH_TUPLE my_halfwidth[]= +{ + //ァ,ア,.. + {0xa7,0}, + {0xb1,0}, + {0xa8,0}, + {0xb2,0}, + {0xa9,0}, + {0xb3,0}, + {0xaa,0}, + {0xb4,0}, + {0xab,0}, + {0xb5,0}, + //カ + {0xb6,0}, + {0xb6,0xde}, + {0xb7,0}, + {0xb7,0xde}, + {0xb8,0}, + {0xb8,0xde}, + {0xb9,0}, + {0xb9,0xde}, + {0xba,0}, + {0xba,0xde}, + //サ + {0xbb,0}, + {0xbb,0xde}, + {0xbc,0}, + {0xbc,0xde}, + {0xbd,0}, + {0xbd,0xde}, + {0xbe,0}, + {0xbe,0xde}, + {0xbf,0}, + {0xbf,0xde}, + //タ + {0xc0,0}, + {0xc0,0xde}, + {0xc1,0}, + {0xc1,0xde}, + {0xaf,0}, + {0xc2,0}, + {0xc2,0xde}, + {0xc3,0}, + {0xc3,0xde}, + {0xc4,0}, + {0xc4,0xde}, + //ナ + {0xc5,0}, + {0xc6,0}, + {0xc7,0}, + {0xc8,0}, + {0xc9,0}, + //ハ + {0xca,0}, + {0xca,0xde}, + {0xca,0xdf}, + {0xcb,0}, + {0xcb,0xde}, + {0xcb,0xdf}, + {0xcc,0}, + {0xcc,0xde}, + {0xcc,0xdf}, + {0xcd,0}, + {0xcd,0xde}, + {0xcd,0xdf}, + {0xce,0}, + {0xce,0xde}, + {0xce,0xdf}, + //マ + {0xcf,0}, + {0xd0,0}, + {0xd1,0}, + {0xd2,0}, + {0xd3,0}, + //ャ, ヤ + {0xac,0}, + {0xd4,0}, + {0xad,0}, + {0xd5,0}, + {0xae,0}, + {0xd6,0}, + //ラ + {0xd7,0}, + {0xd8,0}, + {0xd9,0}, + {0xda,0}, + {0xdb,0}, + //ヮ, ワ + {0xdc,0}, + {0xdc,0}, + //ヰ, ヱ, ヲ, ン, ヴ, ヵ, ヶ + {0xb2,0}, + {0xb4,0}, + {0xa6,0}, + {0xdd,0}, + {0xb3,0xde}, + {0xb6,0}, + {0xb9,0}, +}; + + +/* + sjis & ujis halfwidth to fullwidth katakana and hiragana conversion +*/ +size_t +my_halfwidth_fullwidth(CHARSET_INFO *cs, int to_hiragana, const char *src, + size_t srclen, char *dst, size_t dstlen) +{ + const char *srcend= src + srclen; + char *dst0= dst; + + while (src < srcend) + { + int hi; + + int page; + + //ujis & sjis charset for source only + if (((cs == &my_charset_ujis_japanese_ci && (page= (uchar) *src) == 0x8e) && + (hi= (uchar) src[1]) >= 0xA1 && hi <= 0xDF) || + (cs == &my_charset_sjis_japanese_ci && + (hi= (uchar) *src) >= 0xA1 && hi <= 0xDF)) + { + /* ujis half width Katakana: [..] */ + if (cs == &my_charset_ujis_japanese_ci && (page= (uchar) *src) == 0x8e) + src++; + /* JIS-X-0201 Half width Katakana: [A1..DF] -> [U+FF61..U+FF9F] */ + if ((hi= (uchar) *src) >= 0xA1 && hi <= 0xDF) + { + if (((hi >= 0xB6 && hi <= 0xc4) || + (hi >= 0xca && hi <= 0xce)) && + ((uchar) src[cs == &my_charset_ujis_japanese_ci ? 3 : 1] == 0xDE || + (uchar) src[cs == &my_charset_ujis_japanese_ci ? 3 : 1] == 0xDF)) + { + if ((uchar) src[cs == &my_charset_ujis_japanese_ci ? 3 : 1] == 0xDE) + { + *dst++= (to_hiragana ? + (cs == &my_charset_ujis_japanese_ci ? + my_fullwidth[hi - 0xa0].h_uj_voiced_mark_variant : + my_fullwidth[hi - 0xa0].h_sj_voiced_mark_variant) : + (cs == &my_charset_ujis_japanese_ci ? + my_fullwidth[hi - 0xa0].k_uj_voiced_mark_variant : + my_fullwidth[hi - 0xa0].k_sj_voiced_mark_variant)) >> 8; + *dst++= to_hiragana ? + (cs == &my_charset_ujis_japanese_ci ? + my_fullwidth[hi - 0xa0].h_uj_voiced_mark_variant : + my_fullwidth[hi - 0xa0].h_sj_voiced_mark_variant) : + (cs == &my_charset_ujis_japanese_ci ? + my_fullwidth[hi - 0xa0].k_uj_voiced_mark_variant : + my_fullwidth[hi - 0xa0].k_sj_voiced_mark_variant) & 0xff; + } + else //src[cs == &my_charset_ujis_japanese_ci ? 3 : 1] == 0xDF + { + *dst++= (to_hiragana ? + (cs == &my_charset_ujis_japanese_ci ? + my_fullwidth[hi - 0xa0].h_uj_semi_voiced_mark_variant : + my_fullwidth[hi - 0xa0].h_sj_semi_voiced_mark_variant) : + (cs == &my_charset_ujis_japanese_ci ? + my_fullwidth[hi - 0xa0].k_uj_semi_voiced_mark_variant : + my_fullwidth[hi - 0xa0].k_sj_semi_voiced_mark_variant)) >> 8; + *dst++= to_hiragana ? + (cs == &my_charset_ujis_japanese_ci ? + my_fullwidth[hi - 0xa0].h_uj_semi_voiced_mark_variant : + my_fullwidth[hi - 0xa0].h_sj_semi_voiced_mark_variant) : + (cs == &my_charset_ujis_japanese_ci ? + my_fullwidth[hi - 0xa0].k_uj_semi_voiced_mark_variant : + my_fullwidth[hi - 0xa0].k_sj_semi_voiced_mark_variant) & 0xff; + } + src+= cs == &my_charset_ujis_japanese_ci ? 3 : 2; + } + else if (hi == 0xB3 && + (uchar) src[cs == &my_charset_ujis_japanese_ci ? 3 : 1] == 0xDE) + { + *dst++= (to_hiragana ? + (cs == &my_charset_ujis_japanese_ci ? + my_fullwidth[hi - 0xa0].h_uj_voiced_mark_variant : + my_fullwidth[hi - 0xa0].h_sj_voiced_mark_variant) : + (cs == &my_charset_ujis_japanese_ci ? + my_fullwidth[hi - 0xa0].k_uj_voiced_mark_variant : + my_fullwidth[hi - 0xa0].k_sj_voiced_mark_variant)) >> 8; + *dst++= to_hiragana ? + (cs == &my_charset_ujis_japanese_ci ? + my_fullwidth[hi - 0xa0].h_uj_voiced_mark_variant : + my_fullwidth[hi - 0xa0].h_sj_voiced_mark_variant) : + (cs == &my_charset_ujis_japanese_ci ? + my_fullwidth[hi - 0xa0].k_uj_voiced_mark_variant : + my_fullwidth[hi - 0xa0].k_sj_voiced_mark_variant) & 0xff; + src+= cs == &my_charset_ujis_japanese_ci ? 3 : 2; + } + else + { + *dst++= (to_hiragana ? + (cs == &my_charset_ujis_japanese_ci ? + my_fullwidth[hi - 0xa0].h_uj_orig: + my_fullwidth[hi - 0xa0].h_sj_orig) : + (cs == &my_charset_ujis_japanese_ci ? + my_fullwidth[hi - 0xa0].k_uj_orig : + my_fullwidth[hi - 0xa0].k_sj_orig)) >> 8; + *dst++= to_hiragana ? + (cs == &my_charset_ujis_japanese_ci ? + my_fullwidth[hi - 0xa0].h_uj_orig : + my_fullwidth[hi - 0xa0].h_sj_orig) : + (cs == &my_charset_ujis_japanese_ci ? + my_fullwidth[hi - 0xa0].k_uj_orig : + my_fullwidth[hi - 0xa0].k_sj_orig) & 0xff; + src++; + } + } + } + else + *dst++= *src++; + } + return (size_t) (dst - dst0); +} + + +void from_fullwidth(const char *src, char **dst) +{ + int offset; + + //sjis 0x7f offsest is skipped + if ((offset= (uchar) src[1]) >= 0x80 && offset <= 0x96) + { + **dst= my_halfwidth[offset - 0x41].orig; + (*dst)++; + } + else if (offset >= 0x40 && offset <= 0x7e) + { + **dst= my_halfwidth[offset - 0x40].orig; + (*dst)++; + if (my_halfwidth[offset - 0x40].mark) + { + **dst= my_halfwidth[offset - 0x40].mark; + (*dst)++; + } + } +} + + +/* + fullwidth katakana and hiragana to halfwidth katakana converter +*/ +size_t +my_fullwidth_halfwidth(CHARSET_INFO *cs, int from_fullwidth_only, + const char *src, size_t srclen, char *dst, size_t dstlen) +{ + const char *srcend= src + srclen; + char *dst0= dst; + + DBUG_ASSERT(cs->mbmaxlen == 2); + + while (src < srcend) + { + int page; + int offset; + + //process fullwidth only for fwkatakana_hwkatakana mode + if (from_fullwidth_only && (page= (uchar) *src) == 0x83 && + src + 1 < srcend && + (((offset= (uchar) src[1]) >= 0x80 && offset <= 0x96) || + (offset >= 0x40 && offset <= 0x7e))) + { + from_fullwidth(src, &dst); + src+= 2; + } + //process fullwidth katakana and hiragana for kana_hwkatakana mode + else if (!from_fullwidth_only && + (((page= (uchar) *src) == 0x83 && src + 1 < srcend && + (((offset= (uchar) src[1]) >= 0x80 && offset <= 0x96) || + (offset >= 0x40 && offset <= 0x7e))) || + ((page= (uchar) *src) == 0x82 && src + 1 < srcend && + ((offset= (uchar) src[1]) >= 0x9f && offset <= 0xf1)))) + { + if (page == 0x83) + from_fullwidth(src, &dst); + //hiragana + else + { + *dst++= my_halfwidth[offset - 0x9f].orig; + if (my_halfwidth[offset - 0x9f].mark) + *dst++= my_halfwidth[offset - 0x9f].mark; + } + src+= 2; + } + //let everything else pass through + else + *dst++= *src++; + } + return (size_t) (dst - dst0); +} + + static inline const MY_CASEFOLD_CHARACTER* get_case_info_for_ch(CHARSET_INFO *cs, uint page, uint offs) { diff --git a/strings/ctype-simple.c b/strings/ctype-simple.c index 4cbd5bc301622..af8464939eeed 100644 --- a/strings/ctype-simple.c +++ b/strings/ctype-simple.c @@ -2201,7 +2201,9 @@ MY_CHARSET_HANDLER my_charset_8bit_handler= my_wc_mb_bin, /* native_to_mb */ my_wc_to_printable_8bit, my_casefold_multiply_1, - my_casefold_multiply_1 + my_casefold_multiply_1, + NULL, + NULL }; MY_COLLATION_HANDLER my_collation_8bit_simple_ci_handler = diff --git a/strings/ctype-sjis.c b/strings/ctype-sjis.c index ce839e025fe1c..d1a525d083484 100644 --- a/strings/ctype-sjis.c +++ b/strings/ctype-sjis.c @@ -23,6 +23,16 @@ #ifdef HAVE_CHARSET_sjis +extern size_t +my_halfwidth_fullwidth(CHARSET_INFO *cs, int to_hiragana, const char *src, + size_t srclen, char *dst, size_t dstlen); + +extern size_t +my_fullwidth_halfwidth(CHARSET_INFO *cs, int from_fullwidth_only, + const char *src, size_t srclen, char *dst, size_t dstlen); + +extern const MY_FULLWIDTH_HALFWIDTH_TUPLE my_halfwidth[]; + const char charset_name_sjis[]= "sjis"; #define charset_name_sjis_length (sizeof(charset_name_sjis)-1) @@ -34172,7 +34182,9 @@ static MY_CHARSET_HANDLER my_charset_handler= my_native_to_mb_sjis, my_wc_to_printable_sjis, my_casefold_multiply_1, - my_casefold_multiply_1 + my_casefold_multiply_1, + my_halfwidth_fullwidth, + my_fullwidth_halfwidth }; diff --git a/strings/ctype-tis620.c b/strings/ctype-tis620.c index a3a3bbde3c35a..61ce181130d2b 100644 --- a/strings/ctype-tis620.c +++ b/strings/ctype-tis620.c @@ -951,7 +951,9 @@ static MY_CHARSET_HANDLER my_charset_handler= my_wc_mb_bin, /* native_to_mb */ my_wc_to_printable_generic, my_casefold_multiply_1, - my_casefold_multiply_1 + my_casefold_multiply_1, + NULL, + NULL }; diff --git a/strings/ctype-uca-scanner_next.inl b/strings/ctype-uca-scanner_next.inl index e8489ddf19165..5c78d751890d0 100644 --- a/strings/ctype-uca-scanner_next.inl +++ b/strings/ctype-uca-scanner_next.inl @@ -81,7 +81,7 @@ MY_FUNCTION_NAME(scanner_next)(my_uca_scanner *scanner, const uint16 *cweight; #if MY_UCA_ASCII_OPTIMIZE && !defined(SCANNER_NEXT_NCHARS) - if (scanner->sbeg + 1 < scanner->send) + if (scanner->send - scanner->sbeg > 1) { const MY_UCA_2BYTES_ITEM *ww; ww= my_uca_level_booster_2bytes_item_addr_const(param->level->booster, diff --git a/strings/ctype-ucs2.c b/strings/ctype-ucs2.c index 540448b9ddc22..6bc9d39463f4e 100644 --- a/strings/ctype-ucs2.c +++ b/strings/ctype-ucs2.c @@ -1611,7 +1611,9 @@ MY_CHARSET_HANDLER my_charset_utf16_handler= my_uni_utf16, my_wc_to_printable_generic, my_casefold_multiply_1, - my_casefold_multiply_1 + my_casefold_multiply_1, + NULL, + NULL }; @@ -1962,7 +1964,9 @@ static MY_CHARSET_HANDLER my_charset_utf16le_handler= my_uni_utf16le, my_wc_to_printable_generic, my_casefold_multiply_1, - my_casefold_multiply_1 + my_casefold_multiply_1, + NULL, + NULL }; @@ -2742,7 +2746,9 @@ MY_CHARSET_HANDLER my_charset_utf32_handler= my_uni_utf32, my_wc_to_printable_generic, my_casefold_multiply_1, - my_casefold_multiply_1 + my_casefold_multiply_1, + NULL, + NULL }; @@ -3338,7 +3344,9 @@ MY_CHARSET_HANDLER my_charset_ucs2_handler= my_uni_ucs2, my_wc_to_printable_generic, my_casefold_multiply_1, - my_casefold_multiply_1 + my_casefold_multiply_1, + NULL, + NULL }; diff --git a/strings/ctype-ujis.c b/strings/ctype-ujis.c index cb72ca19664c5..223d53cf9b1d5 100644 --- a/strings/ctype-ujis.c +++ b/strings/ctype-ujis.c @@ -33,6 +33,12 @@ #ifdef HAVE_CHARSET_ujis +extern size_t +my_halfwidth_fullwidth(CHARSET_INFO *cs, int to_hiragana, const char *src, + size_t srclen, char *dst, size_t dstlen); + +extern const MY_FULLWIDTH_HALFWIDTH_TUPLE my_halfwidth[]; + const char charset_name_ujis[]= "ujis"; #define charset_name_ujis_length (sizeof(charset_name_ujis) - 1) @@ -67145,6 +67151,64 @@ static MY_CASEFOLD_INFO my_casefold_info_ujis= }; +void from_fullwidth_and_hiragana(const char **src, char **dst, int offset) +{ + **dst= 0x8e; + (*dst)++; + **dst= my_halfwidth[offset - 0xa1].orig; + (*dst)++; + if (my_halfwidth[offset - 0xa1].mark) + { + **dst= 0x8e; + (*dst)++; + **dst= my_halfwidth[offset - 0xa1].mark; + (*dst)++; + } + (*src)+= 2; +} + + +static size_t +my_fullwidth_halfwidth(CHARSET_INFO *cs, int from_fullwidth_only, + const char *src, size_t srclen, char *dst, + size_t dstlen) +{ + const char *srcend= src + srclen; + char *dst0= dst; + + while (src < srcend) + { + int page; + int offset; + + /* + process fullwidth only for fwkatakana_hwkatakana mode but + process fullwidth katakana and hiragana for kana_hwkatakana mode + */ + // Full width Katakana: [0xa5a1..0xa5f6] & hiragana: [0xa4a1..0xa4f3] + if ((from_fullwidth_only && (page= (uchar) *src) == 0xa5 && + (offset= (uchar) src[1]) <= 0xf6 && offset >= 0xa1) || + (!from_fullwidth_only && + (((page= (uchar) *src) == 0xa5 && (offset= (uchar) src[1]) <= 0xf6) || + (page == 0xa4 && (offset= (uchar) src[1]) <= 0xf3))&& offset >= 0xa1)) + { + *dst++= 0x8e; + *dst++= my_halfwidth[offset - 0xa1].orig; + if (my_halfwidth[offset - 0xa1].mark) + { + *dst++= 0x8e; + *dst++= my_halfwidth[offset - 0xa1].mark; + } + src+= 2; + } + //let everything else pass through + else + *dst++= *src++; + } + return (size_t) (dst - dst0); +} + + #endif /* HAVE_CHARSET_ujis */ @@ -67358,7 +67422,9 @@ static MY_CHARSET_HANDLER my_charset_handler= my_native_to_mb_ujis, my_wc_to_printable_generic, my_casefold_multiply_1, - my_casefold_multiply_2 + my_casefold_multiply_2, + my_halfwidth_fullwidth, + my_fullwidth_halfwidth }; diff --git a/strings/ctype-utf8.c b/strings/ctype-utf8.c index 8fbfa17224e4f..252717f4e4b76 100644 --- a/strings/ctype-utf8.c +++ b/strings/ctype-utf8.c @@ -1042,7 +1042,9 @@ MY_CHARSET_HANDLER my_charset_utf8mb3_handler= my_uni_utf8mb3, my_wc_to_printable_generic, my_casefold_multiply_utf8mbx, - my_casefold_multiply_utf8mbx + my_casefold_multiply_utf8mbx, + NULL, + NULL }; @@ -2715,7 +2717,9 @@ static MY_CHARSET_HANDLER my_charset_filename_handler= my_wc_mb_filename, my_wc_to_printable_filename, my_casefold_multiply_1, - my_casefold_multiply_1 + my_casefold_multiply_1, + NULL, + NULL }; @@ -3331,7 +3335,9 @@ MY_CHARSET_HANDLER my_charset_utf8mb4_handler= my_wc_mb_utf8mb4, my_wc_to_printable_generic, my_casefold_multiply_utf8mbx, - my_casefold_multiply_utf8mbx + my_casefold_multiply_utf8mbx, + NULL, + NULL }; diff --git a/support-files/mariadb.service.in b/support-files/mariadb.service.in index f1c87b2a700fb..e9edba4275a4c 100644 --- a/support-files/mariadb.service.in +++ b/support-files/mariadb.service.in @@ -68,6 +68,12 @@ EnvironmentFile=-@mysqlunixdir@/wsrep-new-cluster # Use an environment file to pass variable _WSREP_START_POSITION EnvironmentFile=-@mysqlunixdir@/wsrep-start-position +# Use an environment file to pass variable _WSREP_NEW_CLUSTER +EnvironmentFile=-@mysqlunixdir@/wsrep-new-cluster + +# Use an environment file to pass variable _WSREP_START_POSITION +EnvironmentFile=-@mysqlunixdir@/wsrep-start-position + @SYSTEMD_EXECSTARTPRE@ # Perform automatic wsrep recovery. When server is started without wsrep, diff --git a/support-files/rpm/server-postin.sh b/support-files/rpm/server-postin.sh index afaba2cecade6..8d7e8a3166c28 100644 --- a/support-files/rpm/server-postin.sh +++ b/support-files/rpm/server-postin.sh @@ -1,5 +1,6 @@ if [ -f /usr/lib/systemd/system/mariadb.service -a -x /usr/bin/systemctl ]; then systemd_conf=/etc/systemd/system/mariadb.service.d/migrated-from-my.cnf-settings.conf + systemd-tmpfiles --create mariadb.conf if [ -x %{_bindir}/mariadb-service-convert -a ! -f "${systemd_conf}" ]; then # Either fresh install or upgrade non-systemd -> systemd mkdir -p /etc/systemd/system/mariadb.service.d diff --git a/support-files/rpm/server-posttrans.sh b/support-files/rpm/server-posttrans.sh index d91ff65e04fa1..e6c411e4aae82 100644 --- a/support-files/rpm/server-posttrans.sh +++ b/support-files/rpm/server-posttrans.sh @@ -3,7 +3,7 @@ if [ -r %{restart_flag} ] ; then # only restart the server if it was already running if [ -x /usr/bin/systemctl ] ; then /usr/bin/systemctl daemon-reload > /dev/null 2>&1 - if /usr/bin/systemctl is-active mysql; then + if /usr/bin/systemctl -q is-active mysql; then /usr/bin/systemctl restart mysql > /dev/null 2>&1 else /usr/bin/systemctl try-restart mariadb.service > /dev/null 2>&1