diff options
author | unknown <mats@romeo.(none)> | 2007-01-26 19:29:57 +0100 |
---|---|---|
committer | unknown <mats@romeo.(none)> | 2007-01-26 19:29:57 +0100 |
commit | 8a8bb772d4ca23ca01340c8445cf66353bfb58ea (patch) | |
tree | 13076e7da5c507c12489d16a6fa162059cffa979 /sql/rpl_utility.h | |
parent | e1b0f07c740489c75c552fa140a43b73a0ead73c (diff) | |
download | mariadb-git-8a8bb772d4ca23ca01340c8445cf66353bfb58ea.tar.gz |
BUG#19033 (RBR: slave does not handle schema changes correctly):
Since checking table compatibility before locking the table, there were
potential that a table could be locked that did not have a definition
that was compatible with the table on the slave.
This patch adds a check just after the table was locked to ensure that
the table is (still) compatible with the table on the slave.
sql/log.cc:
Moving placement new operators to slave.h since they are used in
several places in the replication code.
Removing some compile warnings.
sql/log_event.cc:
Moving code to check table compatibility to after tables are locked for
writing.
sql/log_event.h:
Doxygenifying comments.
Copying error codes to Rows_log_event hierarchy since they are
now used there as well.
sql/rpl_utility.h:
Doxygenifying some comments.
Changing class table_def to copy the column types given to it.
Adding structure RPL_TABLE_LIST as a subclass of TABLE_LIST to represent
lists of tables for the slave.
sql/slave.h:
Adding placement new and delete operators since the slave uses them
in several places.
sql/sql_insert.cc:
Removing a compiler warning.
Diffstat (limited to 'sql/rpl_utility.h')
-rw-r--r-- | sql/rpl_utility.h | 105 |
1 files changed, 57 insertions, 48 deletions
diff --git a/sql/rpl_utility.h b/sql/rpl_utility.h index df0b0cd2ee1..f36661d42dd 100644 --- a/sql/rpl_utility.h +++ b/sql/rpl_utility.h @@ -24,97 +24,96 @@ #include "mysql_priv.h" uint32 -field_length_from_packed(enum_field_types const field_type, - byte const *const data); +field_length_from_packed(enum_field_types field_type, byte const *data); -/* +/** A table definition from the master. - RESPONSIBILITIES - + The responsibilities of this class is: - Extract and decode table definition data from the table map event - Check if table definition in table map is compatible with table definition on slave - DESCRIPTION - - Currently, the only field type data available is an array of the - type operators that are present in the table map event. - - TODO + Currently, the only field type data available is an array of the + type operators that are present in the table map event. - Add type operands to this structure to allow detection of - difference between, e.g., BIT(5) and BIT(10). + @todo Add type operands to this structure to allow detection of + difference between, e.g., BIT(5) and BIT(10). */ class table_def { public: - /* + /** Convenience declaration of the type of the field type data in a table map event. */ typedef unsigned char field_type; - /* + /** Constructor. - SYNOPSIS - table_def() - types Array of types - size Number of elements in array 'types' + @param types Array of types + @param size Number of elements in array 'types' */ table_def(field_type *types, my_size_t size) - : m_type(types), m_size(size) + : m_type(new unsigned char [size]), m_size(size) { + if (m_type) + memcpy(m_type, types, size); + else + m_size= 0; } - /* - Return the number of fields there is type data for. + ~table_def() { + if (m_type) + delete [] m_type; +#ifndef DBUG_OFF + m_type= 0; + m_size= 0; +#endif + } - SYNOPSIS - size() + /** + Return the number of fields there is type data for. - RETURN VALUE - The number of fields that there is type data for. + @return The number of fields that there is type data for. */ my_size_t size() const { return m_size; } + /* Return a representation of the type data for one field. - SYNOPSIS - type() - i Field index to return data for - - RETURN VALUE + @param index Field index to return data for - Will return a representation of the type data for field - 'i'. Currently, only the type identifier is returned. + @return Will return a representation of the type data for field + <code>index</code>. Currently, only the type identifier is + returned. */ - field_type type(my_ptrdiff_t i) const { return m_type[i]; } + field_type type(my_ptrdiff_t index) const + { + DBUG_ASSERT(0 <= index); + DBUG_ASSERT(static_cast<my_size_t>(index) < m_size); + return m_type[index]; + } - /* + /** Decide if the table definition is compatible with a table. - SYNOPSIS - compatible_with() - rli Pointer to relay log info - table Pointer to table to compare with. - - DESCRIPTION - - Compare the definition with a table to see if it is compatible - with it. A table definition is compatible with a table if: + Compare the definition with a table to see if it is compatible + with it. + A table definition is compatible with a table if: - the columns types of the table definition is a (not necessarily proper) prefix of the column type of the table, or - - the other way around - RETURN VALUE - 1 if the table definition is not compatible with 'table' - 0 if the table definition is compatible with 'table' + @param rli Pointer to relay log info + @param table Pointer to table to compare with. + + @retval 1 if the table definition is not compatible with @c table + @retval 0 if the table definition is compatible with @c table */ int compatible_with(RELAY_LOG_INFO *rli, TABLE *table) const; @@ -123,4 +122,14 @@ private: field_type *m_type; // Array of type descriptors }; +/** + Extend the normal table list with a few new fields needed by the + slave thread, but nowhere else. + */ +struct RPL_TABLE_LIST + : public st_table_list +{ + table_def m_tabledef; +}; + #endif /* RPL_UTILITY_H */ |