Commit d4b1425b authored by Sergei Golubchik's avatar Sergei Golubchik

cleanup

* make a local variable for target_table->field[col]
* move an often-used bit function to my_bit.h
* remove a non-static and not really needed trivial comparison
  function with a very generic name
parent ab2a9600
...@@ -121,6 +121,15 @@ static inline uint32 my_reverse_bits(uint32 key) ...@@ -121,6 +121,15 @@ static inline uint32 my_reverse_bits(uint32 key)
_my_bits_reverse_table[(key>>24) ]; _my_bits_reverse_table[(key>>24) ];
} }
/*
a number with the n lowest bits set
an overflow-safe version of (1 << n) - 1
*/
static inline uint32 my_set_bits(int n)
{
return (((1UL << (n - 1)) - 1) << 1) | 1;
}
C_MODE_END C_MODE_END
#endif /* MY_BIT_INCLUDED */ #endif /* MY_BIT_INCLUDED */
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
#include <my_global.h> #include <my_global.h>
#include <my_bit.h>
#include "rpl_utility.h" #include "rpl_utility.h"
#include "log_event.h" #include "log_event.h"
...@@ -22,30 +23,6 @@ ...@@ -22,30 +23,6 @@
#include "rpl_rli.h" #include "rpl_rli.h"
#include "sql_select.h" #include "sql_select.h"
/**
Function to compare two size_t integers for their relative
order. Used below.
*/
int compare(size_t a, size_t b)
{
if (a < b)
return -1;
if (b < a)
return 1;
return 0;
}
/**
Max value for an unsigned integer of 'bits' bits.
The somewhat contorted expression is to avoid overflow.
*/
uint32 uint_max(int bits) {
return (((1UL << (bits - 1)) - 1) << 1) | 1;
}
/** /**
Calculate display length for MySQL56 temporal data types from their metadata. Calculate display length for MySQL56 temporal data types from their metadata.
It contains fractional precision in the low 16-bit word. It contains fractional precision in the low 16-bit word.
...@@ -160,10 +137,10 @@ max_display_length_for_field(enum_field_types sql_type, unsigned int metadata) ...@@ -160,10 +137,10 @@ max_display_length_for_field(enum_field_types sql_type, unsigned int metadata)
*/ */
case MYSQL_TYPE_TINY_BLOB: case MYSQL_TYPE_TINY_BLOB:
return uint_max(1 * 8); return my_set_bits(1 * 8);
case MYSQL_TYPE_MEDIUM_BLOB: case MYSQL_TYPE_MEDIUM_BLOB:
return uint_max(3 * 8); return my_set_bits(3 * 8);
case MYSQL_TYPE_BLOB: case MYSQL_TYPE_BLOB:
/* /*
...@@ -171,11 +148,11 @@ max_display_length_for_field(enum_field_types sql_type, unsigned int metadata) ...@@ -171,11 +148,11 @@ max_display_length_for_field(enum_field_types sql_type, unsigned int metadata)
blobs are of type MYSQL_TYPE_BLOB. In that case, we have to look blobs are of type MYSQL_TYPE_BLOB. In that case, we have to look
at the length instead to decide what the max display size is. at the length instead to decide what the max display size is.
*/ */
return uint_max(metadata * 8); return my_set_bits(metadata * 8);
case MYSQL_TYPE_LONG_BLOB: case MYSQL_TYPE_LONG_BLOB:
case MYSQL_TYPE_GEOMETRY: case MYSQL_TYPE_GEOMETRY:
return uint_max(4 * 8); return my_set_bits(4 * 8);
default: default:
return ~(uint32) 0; return ~(uint32) 0;
...@@ -205,7 +182,7 @@ int compare_lengths(Field *field, enum_field_types source_type, uint16 metadata) ...@@ -205,7 +182,7 @@ int compare_lengths(Field *field, enum_field_types source_type, uint16 metadata)
" target_length: %lu, target_type: %u", " target_length: %lu, target_type: %u",
(unsigned long) source_length, source_type, (unsigned long) source_length, source_type,
(unsigned long) target_length, field->real_type())); (unsigned long) target_length, field->real_type()));
int result= compare(source_length, target_length); int result= source_length < target_length ? -1 : source_length > target_length;
DBUG_PRINT("result", ("%d", result)); DBUG_PRINT("result", ("%d", result));
DBUG_RETURN(result); DBUG_RETURN(result);
} }
...@@ -950,6 +927,7 @@ TABLE *table_def::create_conversion_table(THD *thd, rpl_group_info *rgi, ...@@ -950,6 +927,7 @@ TABLE *table_def::create_conversion_table(THD *thd, rpl_group_info *rgi,
{ {
Create_field *field_def= Create_field *field_def=
(Create_field*) alloc_root(thd->mem_root, sizeof(Create_field)); (Create_field*) alloc_root(thd->mem_root, sizeof(Create_field));
Field *target_field= target_table->field[col];
bool unsigned_flag= 0; bool unsigned_flag= 0;
if (field_list.push_back(field_def, thd->mem_root)) if (field_list.push_back(field_def, thd->mem_root))
DBUG_RETURN(NULL); DBUG_RETURN(NULL);
...@@ -964,7 +942,7 @@ TABLE *table_def::create_conversion_table(THD *thd, rpl_group_info *rgi, ...@@ -964,7 +942,7 @@ TABLE *table_def::create_conversion_table(THD *thd, rpl_group_info *rgi,
int precision; int precision;
case MYSQL_TYPE_ENUM: case MYSQL_TYPE_ENUM:
case MYSQL_TYPE_SET: case MYSQL_TYPE_SET:
interval= static_cast<Field_enum*>(target_table->field[col])->typelib; interval= static_cast<Field_enum*>(target_field)->typelib;
pack_length= field_metadata(col) & 0x00ff; pack_length= field_metadata(col) & 0x00ff;
break; break;
...@@ -988,7 +966,7 @@ TABLE *table_def::create_conversion_table(THD *thd, rpl_group_info *rgi, ...@@ -988,7 +966,7 @@ TABLE *table_def::create_conversion_table(THD *thd, rpl_group_info *rgi,
" column Name: %s.%s.%s.", " column Name: %s.%s.%s.",
target_table->s->db.str, target_table->s->db.str,
target_table->s->table_name.str, target_table->s->table_name.str,
target_table->field[col]->field_name); target_field->field_name);
goto err; goto err;
case MYSQL_TYPE_TINY_BLOB: case MYSQL_TYPE_TINY_BLOB:
...@@ -1009,7 +987,7 @@ TABLE *table_def::create_conversion_table(THD *thd, rpl_group_info *rgi, ...@@ -1009,7 +987,7 @@ TABLE *table_def::create_conversion_table(THD *thd, rpl_group_info *rgi,
assume we have same sign on master and slave. This is true when not assume we have same sign on master and slave. This is true when not
using conversions so it should be true also when using conversions. using conversions so it should be true also when using conversions.
*/ */
unsigned_flag= ((Field_num*) target_table->field[col])->unsigned_flag; unsigned_flag= static_cast<Field_num*>(target_field)->unsigned_flag;
break; break;
default: default:
break; break;
...@@ -1017,7 +995,7 @@ TABLE *table_def::create_conversion_table(THD *thd, rpl_group_info *rgi, ...@@ -1017,7 +995,7 @@ TABLE *table_def::create_conversion_table(THD *thd, rpl_group_info *rgi,
DBUG_PRINT("debug", ("sql_type: %d, target_field: '%s', max_length: %d, decimals: %d," DBUG_PRINT("debug", ("sql_type: %d, target_field: '%s', max_length: %d, decimals: %d,"
" maybe_null: %d, unsigned_flag: %d, pack_length: %u", " maybe_null: %d, unsigned_flag: %d, pack_length: %u",
binlog_type(col), target_table->field[col]->field_name, binlog_type(col), target_field->field_name,
max_length, decimals, TRUE, unsigned_flag, max_length, decimals, TRUE, unsigned_flag,
pack_length)); pack_length));
field_def->init_for_tmp_table(type(col), field_def->init_for_tmp_table(type(col),
...@@ -1026,7 +1004,7 @@ TABLE *table_def::create_conversion_table(THD *thd, rpl_group_info *rgi, ...@@ -1026,7 +1004,7 @@ TABLE *table_def::create_conversion_table(THD *thd, rpl_group_info *rgi,
TRUE, // maybe_null TRUE, // maybe_null
unsigned_flag, unsigned_flag,
pack_length); pack_length);
field_def->charset= target_table->field[col]->charset(); field_def->charset= target_field->charset();
field_def->interval= interval; field_def->interval= interval;
} }
......
...@@ -5069,7 +5069,7 @@ static Sys_var_set Sys_log_slow_filter( ...@@ -5069,7 +5069,7 @@ static Sys_var_set Sys_log_slow_filter(
"Log only certain types of queries", "Log only certain types of queries",
SESSION_VAR(log_slow_filter), CMD_LINE(REQUIRED_ARG), SESSION_VAR(log_slow_filter), CMD_LINE(REQUIRED_ARG),
log_slow_filter_names, log_slow_filter_names,
DEFAULT(MAX_SET(array_elements(log_slow_filter_names)-1))); DEFAULT(my_set_bits(array_elements(log_slow_filter_names)-1)));
static const char *default_regex_flags_names[]= static const char *default_regex_flags_names[]=
{ {
......
...@@ -1094,9 +1094,6 @@ public: ...@@ -1094,9 +1094,6 @@ public:
} }
}; };
// overflow-safe (1 << X)-1
#define MAX_SET(X) ((((1UL << ((X)-1))-1) << 1) | 1)
/** /**
The class for flagset variables - a variant of SET that allows in-place The class for flagset variables - a variant of SET that allows in-place
editing (turning on/off individual bits). String representations looks like editing (turning on/off individual bits). String representations looks like
...@@ -1131,7 +1128,7 @@ public: ...@@ -1131,7 +1128,7 @@ public:
global_var(ulonglong)= def_val; global_var(ulonglong)= def_val;
SYSVAR_ASSERT(typelib.count > 1); SYSVAR_ASSERT(typelib.count > 1);
SYSVAR_ASSERT(typelib.count <= 65); SYSVAR_ASSERT(typelib.count <= 65);
SYSVAR_ASSERT(def_val < MAX_SET(typelib.count)); SYSVAR_ASSERT(def_val < my_set_bits(typelib.count));
SYSVAR_ASSERT(strcmp(values[typelib.count-1], "default") == 0); SYSVAR_ASSERT(strcmp(values[typelib.count-1], "default") == 0);
SYSVAR_ASSERT(size == sizeof(ulonglong)); SYSVAR_ASSERT(size == sizeof(ulonglong));
} }
...@@ -1179,7 +1176,7 @@ public: ...@@ -1179,7 +1176,7 @@ public:
{ {
longlong tmp=var->value->val_int(); longlong tmp=var->value->val_int();
if ((tmp < 0 && ! var->value->unsigned_flag) if ((tmp < 0 && ! var->value->unsigned_flag)
|| (ulonglong)tmp > MAX_SET(typelib.count)) || (ulonglong)tmp > my_set_bits(typelib.count))
return true; return true;
else else
var->save_result.ulonglong_value= tmp; var->save_result.ulonglong_value= tmp;
...@@ -1240,7 +1237,7 @@ public: ...@@ -1240,7 +1237,7 @@ public:
global_var(ulonglong)= def_val; global_var(ulonglong)= def_val;
SYSVAR_ASSERT(typelib.count > 0); SYSVAR_ASSERT(typelib.count > 0);
SYSVAR_ASSERT(typelib.count <= 64); SYSVAR_ASSERT(typelib.count <= 64);
SYSVAR_ASSERT(def_val <= MAX_SET(typelib.count)); SYSVAR_ASSERT(def_val <= my_set_bits(typelib.count));
SYSVAR_ASSERT(size == sizeof(ulonglong)); SYSVAR_ASSERT(size == sizeof(ulonglong));
} }
bool do_check(THD *thd, set_var *var) bool do_check(THD *thd, set_var *var)
...@@ -1278,7 +1275,7 @@ public: ...@@ -1278,7 +1275,7 @@ public:
{ {
longlong tmp=var->value->val_int(); longlong tmp=var->value->val_int();
if ((tmp < 0 && ! var->value->unsigned_flag) if ((tmp < 0 && ! var->value->unsigned_flag)
|| (ulonglong)tmp > MAX_SET(typelib.count)) || (ulonglong)tmp > my_set_bits(typelib.count))
return true; return true;
else else
var->save_result.ulonglong_value= tmp; var->save_result.ulonglong_value= tmp;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment