diff options
-rw-r--r-- | sql/ha_partition.cc | 2 | ||||
-rw-r--r-- | sql/handler.cc | 27 | ||||
-rw-r--r-- | sql/handler.h | 16 | ||||
-rw-r--r-- | sql/sql_base.cc | 4 | ||||
-rw-r--r-- | sql/sql_delete.cc | 4 | ||||
-rw-r--r-- | sql/sql_parse.cc | 2 | ||||
-rw-r--r-- | sql/sql_select.cc | 18 | ||||
-rw-r--r-- | sql/sql_union.cc | 6 | ||||
-rw-r--r-- | sql/sql_view.cc | 4 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 2 | ||||
-rw-r--r-- | sql/table.cc | 6 | ||||
-rw-r--r-- | sql/table.h | 18 | ||||
-rw-r--r-- | sql/unireg.cc | 2 | ||||
-rw-r--r-- | sql/vers_string.h | 134 |
14 files changed, 102 insertions, 143 deletions
diff --git a/sql/ha_partition.cc b/sql/ha_partition.cc index 005f7461425..98174820662 100644 --- a/sql/ha_partition.cc +++ b/sql/ha_partition.cc @@ -4514,7 +4514,7 @@ int ha_partition::delete_row(const uchar *buf) or last historical partition, but DELETE HISTORY can delete from any historical partition. So, skip the check in this case. */ - if (!thd->lex->vers_conditions) // if not DELETE HISTORY + if (!thd->lex->vers_conditions.is_set()) // if not DELETE HISTORY { uint32 part_id; error= get_part_for_buf(buf, m_rec0, m_part_info, &part_id); diff --git a/sql/handler.cc b/sql/handler.cc index be0e82efebf..6ae8b76ef5e 100644 --- a/sql/handler.cc +++ b/sql/handler.cc @@ -4767,7 +4767,8 @@ void handler::update_global_table_stats() if (rows_read + rows_changed == 0) return; // Nothing to update. - DBUG_ASSERT(table->s && table->s->table_cache_key.str); + DBUG_ASSERT(table->s); + DBUG_ASSERT(table->s->table_cache_key.str); mysql_mutex_lock(&LOCK_global_table_stats); /* Gets the global table stats, creating one if necessary. */ @@ -6371,7 +6372,8 @@ void handler::use_hidden_primary_key() Handler_share *handler::get_ha_share_ptr() { DBUG_ENTER("handler::get_ha_share_ptr"); - DBUG_ASSERT(ha_share && table_share); + DBUG_ASSERT(ha_share); + DBUG_ASSERT(table_share); #ifndef DBUG_OFF if (table_share->tmp_table == NO_TMP_TABLE) @@ -6882,8 +6884,8 @@ static bool vers_create_sys_field(THD *thd, const char *field_name, return false; } -const LString_i Vers_parse_info::default_start= "row_start"; -const LString_i Vers_parse_info::default_end= "row_end"; +const Lex_ident Vers_parse_info::default_start= "row_start"; +const Lex_ident Vers_parse_info::default_end= "row_end"; bool Vers_parse_info::fix_implicit(THD *thd, Alter_info *alter_info) { @@ -7077,10 +7079,12 @@ bool Vers_parse_info::fix_alter_info(THD *thd, Alter_info *alter_info, // copy info from existing table create_info->options|= HA_VERSIONED_TABLE; - DBUG_ASSERT(share->vers_start_field() && share->vers_end_field()); - LString_i start(share->vers_start_field()->field_name); - LString_i end(share->vers_end_field()->field_name); - DBUG_ASSERT(start.ptr() && end.ptr()); + DBUG_ASSERT(share->vers_start_field()); + DBUG_ASSERT(share->vers_end_field()); + Lex_ident start(share->vers_start_field()->field_name); + Lex_ident end(share->vers_end_field()->field_name); + DBUG_ASSERT(start.str); + DBUG_ASSERT(end.str); as_row= start_end_t(start, end); system_time= as_row; @@ -7184,8 +7188,8 @@ bool Vers_parse_info::need_check(const Alter_info *alter_info) const alter_info->flags & ALTER_DROP_SYSTEM_VERSIONING || *this; } -bool Vers_parse_info::check_conditions(const LString &table_name, - const LString &db) const +bool Vers_parse_info::check_conditions(const Lex_table_name &table_name, + const Lex_table_name &db) const { if (!as_row.start || !as_row.end) { @@ -7215,7 +7219,8 @@ bool Vers_parse_info::check_conditions(const LString &table_name, return false; } -bool Vers_parse_info::check_sys_fields(const LString &table_name, const LString &db, +bool Vers_parse_info::check_sys_fields(const Lex_table_name &table_name, + const Lex_table_name &db, Alter_info *alter_info, bool native) { if (check_conditions(table_name, db)) diff --git a/sql/handler.h b/sql/handler.h index 9c4766c4f39..648be551f5e 100644 --- a/sql/handler.h +++ b/sql/handler.h @@ -1922,15 +1922,15 @@ struct Vers_parse_info start_end_t(LEX_CSTRING _start, LEX_CSTRING _end) : start(_start), end(_end) {} - LString_i start; - LString_i end; + Lex_ident start; + Lex_ident end; }; start_end_t system_time; start_end_t as_row; vers_sys_type_t check_unit; - void set_system_time(LString start, LString end) + void set_system_time(Lex_ident start, Lex_ident end) { system_time.start= start; system_time.end= end; @@ -1958,16 +1958,18 @@ protected: return as_row.start || as_row.end || system_time.start || system_time.end; } bool need_check(const Alter_info *alter_info) const; - bool check_conditions(const LString &table_name, const LString &db) const; + bool check_conditions(const Lex_table_name &table_name, + const Lex_table_name &db) const; public: - static const LString_i default_start; - static const LString_i default_end; + static const Lex_ident default_start; + static const Lex_ident default_end; bool fix_alter_info(THD *thd, Alter_info *alter_info, HA_CREATE_INFO *create_info, TABLE *table); bool fix_create_like(Alter_info &alter_info, HA_CREATE_INFO &create_info, TABLE_LIST &src_table, TABLE_LIST &table); - bool check_sys_fields(const LString &table_name, const LString &db, + bool check_sys_fields(const Lex_table_name &table_name, + const Lex_table_name &db, Alter_info *alter_info, bool native); /** diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 6f5d4875b04..b6dab95774a 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -199,8 +199,8 @@ uint get_table_def_key(const TABLE_LIST *table_list, const char **key) from key used by MDL subsystem. */ DBUG_ASSERT(!strcmp(table_list->get_db_name(), - table_list->mdl_request.key.db_name()) && - !strcmp(table_list->get_table_name(), + table_list->mdl_request.key.db_name())); + DBUG_ASSERT(!strcmp(table_list->get_table_name(), table_list->mdl_request.key.name())); *key= (const char*)table_list->mdl_request.key.ptr() + 1; diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index af0e167e42d..d4a2f779544 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -305,7 +305,7 @@ bool mysql_delete(THD *thd, TABLE_LIST *table_list, COND *conds, THD_STAGE_INFO(thd, stage_init_update); - bool truncate_history= table_list->vers_conditions; + bool truncate_history= table_list->vers_conditions.is_set(); if (truncate_history) { if (table_list->is_view_or_derived()) @@ -941,7 +941,7 @@ int mysql_prepare_delete(THD *thd, TABLE_LIST *table_list, select_lex->leaf_tables, FALSE, DELETE_ACL, SELECT_ACL, TRUE)) DBUG_RETURN(TRUE); - if (table_list->vers_conditions) + if (table_list->vers_conditions.is_set()) { if (table_list->is_view()) { diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index e821a8f59de..cab433d7196 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -9419,7 +9419,7 @@ bool update_precheck(THD *thd, TABLE_LIST *tables) bool delete_precheck(THD *thd, TABLE_LIST *tables) { DBUG_ENTER("delete_precheck"); - if (tables->vers_conditions) + if (tables->vers_conditions.is_set()) { if (check_one_table_access(thd, DELETE_HISTORY_ACL, tables)) DBUG_RETURN(TRUE); diff --git a/sql/sql_select.cc b/sql/sql_select.cc index 110a68fae45..f5830ff6b14 100644 --- a/sql/sql_select.cc +++ b/sql/sql_select.cc @@ -693,7 +693,7 @@ bool vers_select_conds_t::init_from_sysvar(THD *thd) return false; } -void vers_select_conds_t::print(String *str, enum_query_type query_type) +void vers_select_conds_t::print(String *str, enum_query_type query_type) const { switch (type) { case SYSTEM_TIME_UNSPECIFIED: @@ -765,14 +765,14 @@ int SELECT_LEX::vers_setup_conds(THD *thd, TABLE_LIST *tables) { TABLE_LIST* derived= master_unit()->derived; // inner SELECT may not be a derived table (derived == NULL) - while (derived && outer_slex && !derived->vers_conditions) + while (derived && outer_slex && !derived->vers_conditions.is_set()) { derived= outer_slex->master_unit()->derived; outer_slex= outer_slex->outer_select(); } if (derived && outer_slex) { - DBUG_ASSERT(derived->vers_conditions); + DBUG_ASSERT(derived->vers_conditions.is_set()); outer_table= derived; } } @@ -791,7 +791,7 @@ int SELECT_LEX::vers_setup_conds(THD *thd, TABLE_LIST *tables) */ if (table->partition_names && table->table->part_info->vers_info) { - if (vers_conditions) + if (vers_conditions.is_set()) { #define PART_VERS_ERR_MSG "%s PARTITION (%s)" char buf[NAME_LEN*2 + sizeof(PART_VERS_ERR_MSG)]; @@ -805,7 +805,7 @@ int SELECT_LEX::vers_setup_conds(THD *thd, TABLE_LIST *tables) } #endif - if (outer_table && !vers_conditions) + if (outer_table && !vers_conditions.is_set()) { // propagate system_time from nearest outer SELECT_LEX vers_conditions= outer_table->vers_conditions; @@ -813,15 +813,15 @@ int SELECT_LEX::vers_setup_conds(THD *thd, TABLE_LIST *tables) } // propagate system_time from sysvar - if (!vers_conditions) + if (!vers_conditions.is_set()) { if (vers_conditions.init_from_sysvar(thd)) DBUG_RETURN(-1); } - if (vers_conditions) + if (vers_conditions.is_set()) { - if (vers_conditions == SYSTEM_TIME_ALL) + if (vers_conditions.type == SYSTEM_TIME_ALL) continue; lock_type= TL_READ; // ignore TL_WRITE, history is immutable anyway @@ -837,7 +837,7 @@ int SELECT_LEX::vers_setup_conds(THD *thd, TABLE_LIST *tables) bool timestamps_only= table->table->versioned(VERS_TIMESTAMP); - if (vers_conditions) + if (vers_conditions.is_set()) { /* TODO: do resolve fix_length_and_dec(), fix_fields(). This requires storing vers_conditions as Item and make some magic related to diff --git a/sql/sql_union.cc b/sql/sql_union.cc index b928376a568..9b9418f0d29 100644 --- a/sql/sql_union.cc +++ b/sql/sql_union.cc @@ -990,9 +990,9 @@ bool st_select_lex_unit::prepare(TABLE_LIST *derived_arg, { if (!with_element->is_anchor(sl)) sl->uncacheable|= UNCACHEABLE_UNITED; - if(!is_rec_result_table_created && - (!sl->next_select() || - sl->next_select() == with_element->first_recursive)) + if (!is_rec_result_table_created && + (!sl->next_select() || + sl->next_select() == with_element->first_recursive)) { ulonglong create_options; create_options= (first_sl->options | thd->variables.option_bits | diff --git a/sql/sql_view.cc b/sql/sql_view.cc index 711115cfdad..29c61d4abcc 100644 --- a/sql/sql_view.cc +++ b/sql/sql_view.cc @@ -609,7 +609,7 @@ bool mysql_create_view(THD *thd, TABLE_LIST *views, if (!fld) continue; TABLE_SHARE *s= fld->field->table->s; - const LString_i field_name= fld->field->field_name; + const Lex_ident field_name= fld->field->field_name; if (s->tmp_table || (s->versioned && (field_name.streq(s->vers_start_field()->field_name) || @@ -2040,7 +2040,7 @@ bool insert_view_fields(THD *thd, List<Item> *list, TABLE_LIST *view) if ((fld= entry->item->field_for_view_update())) { TABLE_SHARE *s= fld->context->table_list->table->s; - LString_i field_name= fld->field_name; + Lex_ident field_name= fld->field_name; if (s->versioned && (field_name.streq(s->vers_start_field()->field_name) || field_name.streq(s->vers_end_field()->field_name))) diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index cd79d6cd2c6..9608620d88c 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -6628,7 +6628,7 @@ field_def: Vers_parse_info &info= lex->vers_get_info(); const LEX_CSTRING &field_name= lex->last_field->field_name; - LString_i *p; + Lex_ident *p; switch ($4) { case 1: diff --git a/sql/table.cc b/sql/table.cc index eb9dd24c119..74b4ce3c842 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -8881,7 +8881,7 @@ void vers_select_conds_t::resolve_units(bool timestamps_only) end.resolve_unit(timestamps_only); } -bool vers_select_conds_t::eq(const vers_select_conds_t &conds) +bool vers_select_conds_t::eq(const vers_select_conds_t &conds) const { if (type != conds.type) return false; @@ -8923,13 +8923,13 @@ void Vers_history_point::fix_item() } -bool Vers_history_point::eq(const vers_history_point_t &point) +bool Vers_history_point::eq(const vers_history_point_t &point) const { return unit == point.unit && item->eq(point.item, false); } void Vers_history_point::print(String *str, enum_query_type query_type, - const char *prefix, size_t plen) + const char *prefix, size_t plen) const { const static LEX_CSTRING unit_type[]= { diff --git a/sql/table.h b/sql/table.h index a6a27d21fc3..6fd3f219914 100644 --- a/sql/table.h +++ b/sql/table.h @@ -1827,9 +1827,9 @@ public: fix_item(); } void empty() { unit= VERS_UNDEFINED; item= NULL; } - void print(String *str, enum_query_type, const char *prefix, size_t plen); + void print(String *str, enum_query_type, const char *prefix, size_t plen) const; void resolve_unit(bool timestamps_only); - bool eq(const vers_history_point_t &point); + bool eq(const vers_history_point_t &point) const; }; struct vers_select_conds_t @@ -1858,19 +1858,11 @@ struct vers_select_conds_t end= _end; } - void print(String *str, enum_query_type query_type); + void print(String *str, enum_query_type query_type) const; bool init_from_sysvar(THD *thd); - bool operator== (vers_system_time_t b) - { - return type == b; - } - bool operator!= (vers_system_time_t b) - { - return type != b; - } - operator bool() const + bool is_set() const { return type != SYSTEM_TIME_UNSPECIFIED; } @@ -1879,7 +1871,7 @@ struct vers_select_conds_t { return !from_query && type != SYSTEM_TIME_UNSPECIFIED; } - bool eq(const vers_select_conds_t &conds); + bool eq(const vers_select_conds_t &conds) const; }; /* diff --git a/sql/unireg.cc b/sql/unireg.cc index 5a9555b192e..a9b47c72a4f 100644 --- a/sql/unireg.cc +++ b/sql/unireg.cc @@ -118,7 +118,7 @@ vers_get_field(HA_CREATE_INFO *create_info, List<Create_field> &create_fields, b List_iterator<Create_field> it(create_fields); Create_field *sql_field = NULL; - const LString_i row_field= row_start ? create_info->vers_info.as_row.start + const Lex_ident row_field= row_start ? create_info->vers_info.as_row.start : create_info->vers_info.as_row.end; DBUG_ASSERT(row_field); diff --git a/sql/vers_string.h b/sql/vers_string.h index 5460838510e..75abd40d5fa 100644 --- a/sql/vers_string.h +++ b/sql/vers_string.h @@ -17,125 +17,85 @@ #ifndef VERS_STRING_INCLUDED #define VERS_STRING_INCLUDED -struct Compare_strncmp +/* + LEX_CSTRING with comparison semantics. +*/ + +// db and table names: case sensitive (or insensitive) in table_alias_charset +struct Compare_table_names { int operator()(const LEX_CSTRING& a, const LEX_CSTRING& b) const { - return strncmp(a.str, b.str, a.length); - } - static CHARSET_INFO* charset() - { - return system_charset_info; + DBUG_ASSERT(a.str[a.length] == 0); + DBUG_ASSERT(b.str[b.length] == 0); + return my_strnncoll(table_alias_charset, + (uchar*)a.str, a.length, + (uchar*)b.str, b.length); } }; -template <CHARSET_INFO* &CS= system_charset_info> -struct Compare_my_strcasecmp +// column names and other identifiers: case insensitive in system_charset_info +struct Compare_identifiers { int operator()(const LEX_CSTRING& a, const LEX_CSTRING& b) const { - DBUG_ASSERT(a.str[a.length] == 0 && b.str[b.length] == 0); - return my_strcasecmp(CS, a.str, b.str); - } - static CHARSET_INFO* charset() - { - return CS; + DBUG_ASSERT(a.str[a.length] == 0); + DBUG_ASSERT(b.str[b.length] == 0); + return my_strcasecmp(system_charset_info, a.str, b.str); } }; -typedef Compare_my_strcasecmp<files_charset_info> Compare_fs; -typedef Compare_my_strcasecmp<table_alias_charset> Compare_t; - -template <class Storage= LEX_CSTRING> -struct LEX_STRING_u : public Storage +class Lex_cstring : public LEX_CSTRING { - LEX_STRING_u() - { - Storage::str= NULL; - Storage::length= 0; - } - LEX_STRING_u(const char *_str, size_t _len, CHARSET_INFO *) - { - Storage::str= _str; - Storage::length= _len; - } - uint32 length() const - { - return (uint32)Storage::length; - } - const char *ptr() const - { - return Storage::str; - } - void set(const char *_str, size_t _len, CHARSET_INFO *) + public: + Lex_cstring() { - Storage::str= _str; - Storage::length= _len; + str= NULL; + length= 0; } - const LEX_CSTRING& lex_cstring() const + Lex_cstring(const char *_str, size_t _len) { - return *this; + str= _str; + length= _len; } - const LEX_STRING& lex_string() const + void set(const char *_str, size_t _len) { - return *(LEX_STRING *)this; + str= _str; + length= _len; } }; -template <class Compare= Compare_strncmp, class Storage= LEX_STRING_u<> > -struct XString : public Storage +template <class Compare> +struct Lex_cstring_with_compare : public Lex_cstring { public: - XString() {} - XString(const char *_str, size_t _len) : - Storage(_str, _len, Compare::charset()) - { - } - XString(const LEX_STRING src) : - Storage(src.str, src.length, Compare::charset()) - { - } - XString(const LEX_CSTRING src) : - Storage(src.str, src.length, Compare::charset()) - { - } - XString(const char *_str) : - Storage(_str, strlen(_str), Compare::charset()) - { - } - bool streq(const XString& b) const - { - return Storage::length() == b.length() && 0 == Compare()(this->lex_cstring(), b.lex_cstring()); + Lex_cstring_with_compare() {} + Lex_cstring_with_compare(const char *_str, size_t _len) : + Lex_cstring(_str, _len) + { } + Lex_cstring_with_compare(const LEX_STRING src) : + Lex_cstring(src.str, src.length) + { } + Lex_cstring_with_compare(const LEX_CSTRING src) : Lex_cstring(src.str, src.length) + { } + Lex_cstring_with_compare(const char *_str) : Lex_cstring(_str, strlen(_str)) + { } + bool streq(const Lex_cstring_with_compare& b) const + { + return Lex_cstring::length == b.length && 0 == Compare()(*this, b); } operator const char* () const { - return Storage::ptr(); - } - operator LEX_CSTRING& () const - { - return this->lex_cstring(); - } - operator LEX_STRING () const - { - LEX_STRING res; - res.str= const_cast<char *>(this->ptr()); - res.length= this->length(); - return res; + return str; } operator bool () const { - return Storage::ptr() != NULL; + return str != NULL; } }; -typedef XString<> LString; -typedef XString<Compare_fs> LString_fs; -typedef XString<Compare_my_strcasecmp<> > LString_i; - -typedef XString<Compare_strncmp, String> SString; -typedef XString<Compare_fs, String> SString_fs; -typedef XString<Compare_t, String> SString_t; - +typedef Lex_cstring_with_compare<Compare_identifiers> Lex_ident; +typedef Lex_cstring_with_compare<Compare_table_names> Lex_table_name; #define XSTRING_WITH_LEN(X) (X).ptr(), (X).length() #define DB_WITH_LEN(X) (X).db.str, (X).db.length |