Description:
No overlapping with previously registered error numbers is allowed.
There are some problems with the detection logic of the func my_error_register, overlap may not be detected correctly.
3 /* Search for the right position in the list. */
2 for (search_meh_pp = &my_errmsgs_list; *search_meh_pp;
1 search_meh_pp = &(*search_meh_pp)->meh_next) {
347 if ((*search_meh_pp)->meh_last > first) break;
1 }
2
3 /* Error numbers must be unique. No overlapping is allowed. */
4 if (*search_meh_pp && ((*search_meh_pp)->meh_first <= last)) {
5 my_free(meh_p);
6 return 1;
7 }
How to repeat:
I constructed an overlapping scenario, just add this codes to the end of share/messages_to_clients.txt, ER_SUNASHE_2 and ER_SUNASHE_3 are going to overlap.
+ start-error-number 6000
+
+ ER_SUNASHE_1
+ eng "sunashe error1."
+
+ ER_SUNASHE_2
+ eng "sunashe error2."
+
+ start-error-number 6001
+
+ ER_SUNASHE_3
+ eng "sunashe error3."
+
+ ER_SUNASHE_4
+ eng "sunashe error4."
You can see these new error numbers in the generated header file(include/mysqld_error.h) after compiling, as shown below:
5 #define WARN_UNSUPPORTED_ACL_TABLES_READ 4009
4 #define ER_BINLOG_UNSAFE_ACL_TABLE_READ_IN_DML_DDL 4010
3 #define ER_SUNASHE_1 6000
2 #define ER_SUNASHE_2 6001
1 #define ER_SUNASHE_3 6001
1661 #define ER_SUNASHE_4 6002
my_error_register does not detect this error when starting mysqld
Suggested fix:
diff --git a/mysys/my_error.cc b/mysys/my_error.cc
index 5ff76f1c7b9..476772608a2 100644
--- a/mysys/my_error.cc
+++ b/mysys/my_error.cc
@@ -344,7 +344,7 @@ int my_error_register(const char *(*get_errmsg)(int), int first, int last) {
/* Search for the right position in the list. */
for (search_meh_pp = &my_errmsgs_list; *search_meh_pp;
search_meh_pp = &(*search_meh_pp)->meh_next) {
- if ((*search_meh_pp)->meh_last > first) break;
+ if ((*search_meh_pp)->meh_last >= first) break;
}
/* Error numbers must be unique. No overlapping is allowed. */
Description: No overlapping with previously registered error numbers is allowed. There are some problems with the detection logic of the func my_error_register, overlap may not be detected correctly. 3 /* Search for the right position in the list. */ 2 for (search_meh_pp = &my_errmsgs_list; *search_meh_pp; 1 search_meh_pp = &(*search_meh_pp)->meh_next) { 347 if ((*search_meh_pp)->meh_last > first) break; 1 } 2 3 /* Error numbers must be unique. No overlapping is allowed. */ 4 if (*search_meh_pp && ((*search_meh_pp)->meh_first <= last)) { 5 my_free(meh_p); 6 return 1; 7 } How to repeat: I constructed an overlapping scenario, just add this codes to the end of share/messages_to_clients.txt, ER_SUNASHE_2 and ER_SUNASHE_3 are going to overlap. + start-error-number 6000 + + ER_SUNASHE_1 + eng "sunashe error1." + + ER_SUNASHE_2 + eng "sunashe error2." + + start-error-number 6001 + + ER_SUNASHE_3 + eng "sunashe error3." + + ER_SUNASHE_4 + eng "sunashe error4." You can see these new error numbers in the generated header file(include/mysqld_error.h) after compiling, as shown below: 5 #define WARN_UNSUPPORTED_ACL_TABLES_READ 4009 4 #define ER_BINLOG_UNSAFE_ACL_TABLE_READ_IN_DML_DDL 4010 3 #define ER_SUNASHE_1 6000 2 #define ER_SUNASHE_2 6001 1 #define ER_SUNASHE_3 6001 1661 #define ER_SUNASHE_4 6002 my_error_register does not detect this error when starting mysqld Suggested fix: diff --git a/mysys/my_error.cc b/mysys/my_error.cc index 5ff76f1c7b9..476772608a2 100644 --- a/mysys/my_error.cc +++ b/mysys/my_error.cc @@ -344,7 +344,7 @@ int my_error_register(const char *(*get_errmsg)(int), int first, int last) { /* Search for the right position in the list. */ for (search_meh_pp = &my_errmsgs_list; *search_meh_pp; search_meh_pp = &(*search_meh_pp)->meh_next) { - if ((*search_meh_pp)->meh_last > first) break; + if ((*search_meh_pp)->meh_last >= first) break; } /* Error numbers must be unique. No overlapping is allowed. */