diff options
author | Monty <monty@mariadb.org> | 2018-04-30 14:24:48 +0300 |
---|---|---|
committer | Monty <monty@mariadb.org> | 2018-04-30 14:24:48 +0300 |
commit | 7d6b55b99aa11bc888bdf7ad1ccdf845909a91c5 (patch) | |
tree | cdd6983b0a7196b8b995076f71aa5d3d2062194a | |
parent | 862e602b5a5bbc79bacdac9722f1ab69d0ccf7c3 (diff) | |
download | mariadb-git-7d6b55b99aa11bc888bdf7ad1ccdf845909a91c5.tar.gz |
Added version of lex_string_eq that compares with const char *
Change all my_stcasecmp() calls that uses lexical keywords to use
lex_string_eq. This is faster as we only call strcasecmp() for
strings of different lengths.
Removed not used function lex_string_syseq()
-rw-r--r-- | sql/item_func.cc | 6 | ||||
-rw-r--r-- | sql/lex_string.h | 14 | ||||
-rw-r--r-- | sql/sql_alter.cc | 14 | ||||
-rw-r--r-- | sql/sql_lex.cc | 4 | ||||
-rw-r--r-- | sql/sql_trigger.cc | 2 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 8 | ||||
-rw-r--r-- | sql/sql_yacc_ora.yy | 8 |
7 files changed, 31 insertions, 25 deletions
diff --git a/sql/item_func.cc b/sql/item_func.cc index 59cf5b53154..46b2d301e4e 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -62,9 +62,9 @@ bool check_reserved_words(const LEX_CSTRING *name) { - if (!my_strcasecmp(system_charset_info, name->str, "GLOBAL") || - !my_strcasecmp(system_charset_info, name->str, "LOCAL") || - !my_strcasecmp(system_charset_info, name->str, "SESSION")) + if (lex_string_eq(name, STRING_WITH_LEN("GLOBAL")) || + lex_string_eq(name, STRING_WITH_LEN("LOCAL")) || + lex_string_eq(name, STRING_WITH_LEN("SESSION"))) return TRUE; return FALSE; } diff --git a/sql/lex_string.h b/sql/lex_string.h index 25f2c83a372..a5209165be0 100644 --- a/sql/lex_string.h +++ b/sql/lex_string.h @@ -21,6 +21,7 @@ typedef struct st_mysql_const_lex_string LEX_CSTRING; /* Functions to compare if two lex strings are equal */ + static inline bool lex_string_cmp(CHARSET_INFO *charset, const LEX_CSTRING *a, const LEX_CSTRING *b) { @@ -30,6 +31,7 @@ static inline bool lex_string_cmp(CHARSET_INFO *charset, const LEX_CSTRING *a, /* Compare to LEX_CSTRING's and return 0 if equal */ + static inline bool cmp(const LEX_CSTRING *a, const LEX_CSTRING *b) { return (a->length != b->length || @@ -40,6 +42,7 @@ static inline bool cmp(const LEX_CSTRING *a, const LEX_CSTRING *b) Compare if two LEX_CSTRING are equal. Assumption is that character set is ASCII (like for plugin names) */ + static inline bool lex_string_eq(const LEX_CSTRING *a, const LEX_CSTRING *b) { if (a->length != b->length) @@ -48,12 +51,15 @@ static inline bool lex_string_eq(const LEX_CSTRING *a, const LEX_CSTRING *b) } /* - Compare if two LEX_CSTRING are equal in system character set - (field names, user variables, etc - but *not* table names) + To be used when calling lex_string_eq with STRING_WITH_LEN() as second + argument */ -static inline bool lex_string_syseq(const LEX_CSTRING *a, const LEX_CSTRING *b) + +static inline bool lex_string_eq(const LEX_CSTRING *a, const char *b, size_t b_length) { - return lex_string_cmp(system_charset_info, a, b) == 0; + if (a->length != b_length) + return 0; /* Different */ + return strcasecmp(a->str, b) == 0; } #endif /* LEX_STRING_INCLUDED */ diff --git a/sql/sql_alter.cc b/sql/sql_alter.cc index 77e0c9d5298..a58ecdcc314 100644 --- a/sql/sql_alter.cc +++ b/sql/sql_alter.cc @@ -54,11 +54,11 @@ Alter_info::Alter_info(const Alter_info &rhs, MEM_ROOT *mem_root) bool Alter_info::set_requested_algorithm(const LEX_CSTRING *str) { // To avoid adding new keywords to the grammar, we match strings here. - if (!my_strcasecmp(system_charset_info, str->str, "INPLACE")) + if (lex_string_eq(str, STRING_WITH_LEN("INPLACE"))) requested_algorithm= ALTER_TABLE_ALGORITHM_INPLACE; - else if (!my_strcasecmp(system_charset_info, str->str, "COPY")) + else if (lex_string_eq(str, STRING_WITH_LEN("COPY"))) requested_algorithm= ALTER_TABLE_ALGORITHM_COPY; - else if (!my_strcasecmp(system_charset_info, str->str, "DEFAULT")) + else if (lex_string_eq(str, STRING_WITH_LEN("DEFAULT"))) requested_algorithm= ALTER_TABLE_ALGORITHM_DEFAULT; else return true; @@ -69,13 +69,13 @@ bool Alter_info::set_requested_algorithm(const LEX_CSTRING *str) bool Alter_info::set_requested_lock(const LEX_CSTRING *str) { // To avoid adding new keywords to the grammar, we match strings here. - if (!my_strcasecmp(system_charset_info, str->str, "NONE")) + if (lex_string_eq(str, STRING_WITH_LEN("NONE"))) requested_lock= ALTER_TABLE_LOCK_NONE; - else if (!my_strcasecmp(system_charset_info, str->str, "SHARED")) + else if (lex_string_eq(str, STRING_WITH_LEN("SHARED"))) requested_lock= ALTER_TABLE_LOCK_SHARED; - else if (!my_strcasecmp(system_charset_info, str->str, "EXCLUSIVE")) + else if (lex_string_eq(str, STRING_WITH_LEN("EXCLUSIVE"))) requested_lock= ALTER_TABLE_LOCK_EXCLUSIVE; - else if (!my_strcasecmp(system_charset_info, str->str, "DEFAULT")) + else if (lex_string_eq(str, STRING_WITH_LEN("DEFAULT"))) requested_lock= ALTER_TABLE_LOCK_DEFAULT; else return true; diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 968c3767780..2c8c4f4bec0 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -7038,9 +7038,9 @@ Item *LEX::create_item_ident_sp(THD *thd, Lex_ident_sys_st *name, if (thd->variables.sql_mode & MODE_ORACLE) { - if (!my_strcasecmp(system_charset_info, name->str, "SQLCODE")) + if (lex_string_eq(name, STRING_WITH_LEN("SQLCODE"))) return new (thd->mem_root) Item_func_sqlcode(thd); - if (!my_strcasecmp(system_charset_info, name->str, "SQLERRM")) + if (lex_string_eq(name, STRING_WITH_LEN("SQLERRM"))) return new (thd->mem_root) Item_func_sqlerrm(thd); } return create_item_ident_nosp(thd, name); diff --git a/sql/sql_trigger.cc b/sql/sql_trigger.cc index 5b218a1e36a..9f913e45744 100644 --- a/sql/sql_trigger.cc +++ b/sql/sql_trigger.cc @@ -431,7 +431,7 @@ bool mysql_create_or_drop_trigger(THD *thd, TABLE_LIST *tables, bool create) /* We don't allow creating triggers on tables in the 'mysql' schema */ - if (create && !my_strcasecmp(system_charset_info, "mysql", tables->db.str)) + if (create && lex_string_eq(&tables->db, STRING_WITH_LEN("mysql"))) { my_error(ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA, MYF(0)); DBUG_RETURN(TRUE); diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 1ff86c777b5..8789b218a8d 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -14106,9 +14106,9 @@ opt_format_json: /* empty */ {} | FORMAT_SYM '=' ident_or_text { - if (!my_strcasecmp(system_charset_info, $3.str, "JSON")) + if (lex_string_eq(&$3, STRING_WITH_LEN("JSON"))) Lex->explain_json= true; - else if (!my_strcasecmp(system_charset_info, $3.str, "TRADITIONAL")) + else if (lex_string_eq(&$3, STRING_WITH_LEN("TRADITIONAL"))) DBUG_ASSERT(Lex->explain_json==false); else my_yyabort_error((ER_UNKNOWN_EXPLAIN_FORMAT, MYF(0), "EXPLAIN", @@ -17466,9 +17466,9 @@ opt_format_xid: /* empty */ { $$= false; } | FORMAT_SYM '=' ident_or_text { - if (!my_strcasecmp(system_charset_info, $3.str, "SQL")) + if (lex_string_eq(&$3, STRING_WITH_LEN("SQL"))) $$= true; - else if (!my_strcasecmp(system_charset_info, $3.str, "RAW")) + else if (lex_string_eq(&$3, STRING_WITH_LEN("RAW"))) $$= false; else { diff --git a/sql/sql_yacc_ora.yy b/sql/sql_yacc_ora.yy index dc0878d7ee7..e84bf4fe5a2 100644 --- a/sql/sql_yacc_ora.yy +++ b/sql/sql_yacc_ora.yy @@ -13848,9 +13848,9 @@ opt_format_json: /* empty */ {} | FORMAT_SYM '=' ident_or_text { - if (!my_strcasecmp(system_charset_info, $3.str, "JSON")) + if (lex_string_eq(&$3, STRING_WITH_LEN("JSON"))) Lex->explain_json= true; - else if (!my_strcasecmp(system_charset_info, $3.str, "TRADITIONAL")) + else if (lex_string_eq(&$3, STRING_WITH_LEN("TRADITIONAL"))) DBUG_ASSERT(Lex->explain_json==false); else my_yyabort_error((ER_UNKNOWN_EXPLAIN_FORMAT, MYF(0), "EXPLAIN", @@ -17332,9 +17332,9 @@ opt_format_xid: /* empty */ { $$= false; } | FORMAT_SYM '=' ident_or_text { - if (!my_strcasecmp(system_charset_info, $3.str, "SQL")) + if (lex_string_eq(&$3, STRING_WITH_LEN("SQL"))) $$= true; - else if (!my_strcasecmp(system_charset_info, $3.str, "RAW")) + else if (lex_string_eq(&$3, STRING_WITH_LEN("RAW"))) $$= false; else { |