Commit 8760acdd authored by Sergei Golubchik's avatar Sergei Golubchik

cleanup: ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED

restore its original semantics by allowing only columns
in the write_set. Generated columns work around the assert
by temporarily updating the write_set.
parent 45dee3fc
...@@ -62,8 +62,12 @@ const char field_separator=','; ...@@ -62,8 +62,12 @@ const char field_separator=',';
#define BLOB_PACK_LENGTH_TO_MAX_LENGH(arg) \ #define BLOB_PACK_LENGTH_TO_MAX_LENGH(arg) \
((ulong) ((1LL << MY_MIN(arg, 4) * 8) - 1)) ((ulong) ((1LL << MY_MIN(arg, 4) * 8) - 1))
#define ASSERT_COLUMN_MARKED_FOR_READ DBUG_ASSERT(!table || (!table->read_set || bitmap_is_set(table->read_set, field_index))) #define ASSERT_COLUMN_MARKED_FOR_READ \
#define ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED DBUG_ASSERT(is_stat_field || !table || (!table->write_set || bitmap_is_set(table->write_set, field_index) || bitmap_is_set(table->read_set, field_index))) DBUG_ASSERT(!table || !table->read_set || \
bitmap_is_set(table->read_set, field_index))
#define ASSERT_COLUMN_MARKED_FOR_WRITE \
DBUG_ASSERT(is_stat_field || !table || !table->write_set || \
bitmap_is_set(table->write_set, field_index))
#define FLAGSTR(S,F) ((S) & (F) ? #F " " : "") #define FLAGSTR(S,F) ((S) & (F) ? #F " " : "")
...@@ -2038,7 +2042,7 @@ longlong Field::convert_decimal2longlong(const my_decimal *val, ...@@ -2038,7 +2042,7 @@ longlong Field::convert_decimal2longlong(const my_decimal *val,
int Field_int::store_decimal(const my_decimal *val) int Field_int::store_decimal(const my_decimal *val)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
int err= 0; int err= 0;
longlong i= convert_decimal2longlong(val, unsigned_flag, &err); longlong i= convert_decimal2longlong(val, unsigned_flag, &err);
return MY_TEST(err | store(i, unsigned_flag)); return MY_TEST(err | store(i, unsigned_flag));
...@@ -2206,7 +2210,7 @@ void Field_num::make_send_field(Send_field *field) ...@@ -2206,7 +2210,7 @@ void Field_num::make_send_field(Send_field *field)
int Field_str::store_decimal(const my_decimal *d) int Field_str::store_decimal(const my_decimal *d)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
double val; double val;
/* TODO: use decimal2string? */ /* TODO: use decimal2string? */
int err= warn_if_overflow(my_decimal2double(E_DEC_FATAL_ERROR & int err= warn_if_overflow(my_decimal2double(E_DEC_FATAL_ERROR &
...@@ -2278,7 +2282,7 @@ bool Field::get_date(MYSQL_TIME *ltime,ulonglong fuzzydate) ...@@ -2278,7 +2282,7 @@ bool Field::get_date(MYSQL_TIME *ltime,ulonglong fuzzydate)
int Field::store_time_dec(const MYSQL_TIME *ltime, uint dec) int Field::store_time_dec(const MYSQL_TIME *ltime, uint dec)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
char buff[MAX_DATE_STRING_REP_LENGTH]; char buff[MAX_DATE_STRING_REP_LENGTH];
uint length= (uint) my_TIME_to_str(ltime, buff, dec); uint length= (uint) my_TIME_to_str(ltime, buff, dec);
/* Avoid conversion when field character set is ASCII compatible */ /* Avoid conversion when field character set is ASCII compatible */
...@@ -2535,7 +2539,7 @@ void Field_decimal::overflow(bool negative) ...@@ -2535,7 +2539,7 @@ void Field_decimal::overflow(bool negative)
int Field_decimal::store(const char *from_arg, size_t len, CHARSET_INFO *cs) int Field_decimal::store(const char *from_arg, size_t len, CHARSET_INFO *cs)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
char buff[STRING_BUFFER_USUAL_SIZE]; char buff[STRING_BUFFER_USUAL_SIZE];
String tmp(buff,sizeof(buff), &my_charset_bin); String tmp(buff,sizeof(buff), &my_charset_bin);
const uchar *from= (uchar*) from_arg; const uchar *from= (uchar*) from_arg;
...@@ -2901,7 +2905,7 @@ int Field_decimal::store(const char *from_arg, size_t len, CHARSET_INFO *cs) ...@@ -2901,7 +2905,7 @@ int Field_decimal::store(const char *from_arg, size_t len, CHARSET_INFO *cs)
int Field_decimal::store(double nr) int Field_decimal::store(double nr)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
if (unsigned_flag && nr < 0) if (unsigned_flag && nr < 0)
{ {
overflow(1); overflow(1);
...@@ -2939,7 +2943,7 @@ int Field_decimal::store(double nr) ...@@ -2939,7 +2943,7 @@ int Field_decimal::store(double nr)
int Field_decimal::store(longlong nr, bool unsigned_val) int Field_decimal::store(longlong nr, bool unsigned_val)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
char buff[22]; char buff[22];
uint length, int_part; uint length, int_part;
char fyllchar; char fyllchar;
...@@ -3160,7 +3164,7 @@ void Field_new_decimal::set_value_on_overflow(my_decimal *decimal_value, ...@@ -3160,7 +3164,7 @@ void Field_new_decimal::set_value_on_overflow(my_decimal *decimal_value,
bool Field_new_decimal::store_value(const my_decimal *decimal_value, bool Field_new_decimal::store_value(const my_decimal *decimal_value,
int *native_error) int *native_error)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
int error= 0; int error= 0;
DBUG_ENTER("Field_new_decimal::store_value"); DBUG_ENTER("Field_new_decimal::store_value");
#ifndef DBUG_OFF #ifndef DBUG_OFF
...@@ -3218,7 +3222,7 @@ bool Field_new_decimal::store_value(const my_decimal *decimal_value) ...@@ -3218,7 +3222,7 @@ bool Field_new_decimal::store_value(const my_decimal *decimal_value)
int Field_new_decimal::store(const char *from, size_t length, int Field_new_decimal::store(const char *from, size_t length,
CHARSET_INFO *charset_arg) CHARSET_INFO *charset_arg)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
my_decimal decimal_value; my_decimal decimal_value;
THD *thd= get_thd(); THD *thd= get_thd();
DBUG_ENTER("Field_new_decimal::store(char*)"); DBUG_ENTER("Field_new_decimal::store(char*)");
...@@ -3302,7 +3306,7 @@ int Field_new_decimal::store(const char *from, size_t length, ...@@ -3302,7 +3306,7 @@ int Field_new_decimal::store(const char *from, size_t length,
int Field_new_decimal::store(double nr) int Field_new_decimal::store(double nr)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
my_decimal decimal_value; my_decimal decimal_value;
int err; int err;
THD *thd= get_thd(); THD *thd= get_thd();
...@@ -3327,7 +3331,7 @@ int Field_new_decimal::store(double nr) ...@@ -3327,7 +3331,7 @@ int Field_new_decimal::store(double nr)
int Field_new_decimal::store(longlong nr, bool unsigned_val) int Field_new_decimal::store(longlong nr, bool unsigned_val)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
my_decimal decimal_value; my_decimal decimal_value;
int err; int err;
...@@ -3349,7 +3353,7 @@ int Field_new_decimal::store(longlong nr, bool unsigned_val) ...@@ -3349,7 +3353,7 @@ int Field_new_decimal::store(longlong nr, bool unsigned_val)
int Field_new_decimal::store_decimal(const my_decimal *decimal_value) int Field_new_decimal::store_decimal(const my_decimal *decimal_value)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
return store_value(decimal_value); return store_value(decimal_value);
} }
...@@ -3608,7 +3612,7 @@ int Field_int::store_time_dec(const MYSQL_TIME *ltime, uint dec_arg) ...@@ -3608,7 +3612,7 @@ int Field_int::store_time_dec(const MYSQL_TIME *ltime, uint dec_arg)
int Field_tiny::store(const char *from,size_t len,CHARSET_INFO *cs) int Field_tiny::store(const char *from,size_t len,CHARSET_INFO *cs)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
int error; int error;
longlong rnd; longlong rnd;
...@@ -3620,7 +3624,7 @@ int Field_tiny::store(const char *from,size_t len,CHARSET_INFO *cs) ...@@ -3620,7 +3624,7 @@ int Field_tiny::store(const char *from,size_t len,CHARSET_INFO *cs)
int Field_tiny::store(double nr) int Field_tiny::store(double nr)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
int error= 0; int error= 0;
nr=rint(nr); nr=rint(nr);
if (unsigned_flag) if (unsigned_flag)
...@@ -3663,7 +3667,7 @@ int Field_tiny::store(double nr) ...@@ -3663,7 +3667,7 @@ int Field_tiny::store(double nr)
int Field_tiny::store(longlong nr, bool unsigned_val) int Field_tiny::store(longlong nr, bool unsigned_val)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
int error= 0; int error= 0;
if (unsigned_flag) if (unsigned_flag)
...@@ -3768,7 +3772,7 @@ void Field_tiny::sql_type(String &res) const ...@@ -3768,7 +3772,7 @@ void Field_tiny::sql_type(String &res) const
int Field_short::store(const char *from,size_t len,CHARSET_INFO *cs) int Field_short::store(const char *from,size_t len,CHARSET_INFO *cs)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
int store_tmp; int store_tmp;
int error; int error;
longlong rnd; longlong rnd;
...@@ -3782,7 +3786,7 @@ int Field_short::store(const char *from,size_t len,CHARSET_INFO *cs) ...@@ -3782,7 +3786,7 @@ int Field_short::store(const char *from,size_t len,CHARSET_INFO *cs)
int Field_short::store(double nr) int Field_short::store(double nr)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
int error= 0; int error= 0;
int16 res; int16 res;
nr=rint(nr); nr=rint(nr);
...@@ -3827,7 +3831,7 @@ int Field_short::store(double nr) ...@@ -3827,7 +3831,7 @@ int Field_short::store(double nr)
int Field_short::store(longlong nr, bool unsigned_val) int Field_short::store(longlong nr, bool unsigned_val)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
int error= 0; int error= 0;
int16 res; int16 res;
...@@ -3942,7 +3946,7 @@ void Field_short::sql_type(String &res) const ...@@ -3942,7 +3946,7 @@ void Field_short::sql_type(String &res) const
int Field_medium::store(const char *from,size_t len,CHARSET_INFO *cs) int Field_medium::store(const char *from,size_t len,CHARSET_INFO *cs)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
int store_tmp; int store_tmp;
int error; int error;
longlong rnd; longlong rnd;
...@@ -3956,7 +3960,7 @@ int Field_medium::store(const char *from,size_t len,CHARSET_INFO *cs) ...@@ -3956,7 +3960,7 @@ int Field_medium::store(const char *from,size_t len,CHARSET_INFO *cs)
int Field_medium::store(double nr) int Field_medium::store(double nr)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
int error= 0; int error= 0;
nr=rint(nr); nr=rint(nr);
if (unsigned_flag) if (unsigned_flag)
...@@ -4002,7 +4006,7 @@ int Field_medium::store(double nr) ...@@ -4002,7 +4006,7 @@ int Field_medium::store(double nr)
int Field_medium::store(longlong nr, bool unsigned_val) int Field_medium::store(longlong nr, bool unsigned_val)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
int error= 0; int error= 0;
if (unsigned_flag) if (unsigned_flag)
...@@ -4140,7 +4144,7 @@ void Field_medium::sql_type(String &res) const ...@@ -4140,7 +4144,7 @@ void Field_medium::sql_type(String &res) const
int Field_long::store(const char *from,size_t len,CHARSET_INFO *cs) int Field_long::store(const char *from,size_t len,CHARSET_INFO *cs)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
long store_tmp; long store_tmp;
int error; int error;
longlong rnd; longlong rnd;
...@@ -4154,7 +4158,7 @@ int Field_long::store(const char *from,size_t len,CHARSET_INFO *cs) ...@@ -4154,7 +4158,7 @@ int Field_long::store(const char *from,size_t len,CHARSET_INFO *cs)
int Field_long::store(double nr) int Field_long::store(double nr)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
int error= 0; int error= 0;
int32 res; int32 res;
nr=rint(nr); nr=rint(nr);
...@@ -4199,7 +4203,7 @@ int Field_long::store(double nr) ...@@ -4199,7 +4203,7 @@ int Field_long::store(double nr)
int Field_long::store(longlong nr, bool unsigned_val) int Field_long::store(longlong nr, bool unsigned_val)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
int error= 0; int error= 0;
int32 res; int32 res;
...@@ -4313,7 +4317,7 @@ void Field_long::sql_type(String &res) const ...@@ -4313,7 +4317,7 @@ void Field_long::sql_type(String &res) const
int Field_longlong::store(const char *from,size_t len,CHARSET_INFO *cs) int Field_longlong::store(const char *from,size_t len,CHARSET_INFO *cs)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
int error= 0; int error= 0;
char *end; char *end;
ulonglong tmp; ulonglong tmp;
...@@ -4336,7 +4340,7 @@ int Field_longlong::store(const char *from,size_t len,CHARSET_INFO *cs) ...@@ -4336,7 +4340,7 @@ int Field_longlong::store(const char *from,size_t len,CHARSET_INFO *cs)
int Field_longlong::store(double nr) int Field_longlong::store(double nr)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
Converter_double_to_longlong conv(nr, unsigned_flag); Converter_double_to_longlong conv(nr, unsigned_flag);
if (unlikely(conv.error())) if (unlikely(conv.error()))
...@@ -4349,7 +4353,7 @@ int Field_longlong::store(double nr) ...@@ -4349,7 +4353,7 @@ int Field_longlong::store(double nr)
int Field_longlong::store(longlong nr, bool unsigned_val) int Field_longlong::store(longlong nr, bool unsigned_val)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
int error= 0; int error= 0;
if (unlikely(nr < 0)) // Only possible error if (unlikely(nr < 0)) // Only possible error
...@@ -4460,7 +4464,7 @@ void Field_longlong::sql_type(String &res) const ...@@ -4460,7 +4464,7 @@ void Field_longlong::sql_type(String &res) const
void Field_longlong::set_max() void Field_longlong::set_max()
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
set_notnull(); set_notnull();
int8store(ptr, unsigned_flag ? ULONGLONG_MAX : LONGLONG_MAX); int8store(ptr, unsigned_flag ? ULONGLONG_MAX : LONGLONG_MAX);
} }
...@@ -4497,7 +4501,7 @@ int Field_float::store(const char *from,size_t len,CHARSET_INFO *cs) ...@@ -4497,7 +4501,7 @@ int Field_float::store(const char *from,size_t len,CHARSET_INFO *cs)
int Field_float::store(double nr) int Field_float::store(double nr)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
int error= truncate_double(&nr, field_length, int error= truncate_double(&nr, field_length,
not_fixed ? NOT_FIXED_DEC : dec, not_fixed ? NOT_FIXED_DEC : dec,
unsigned_flag, FLT_MAX); unsigned_flag, FLT_MAX);
...@@ -4676,7 +4680,7 @@ int Field_double::store(const char *from,size_t len,CHARSET_INFO *cs) ...@@ -4676,7 +4680,7 @@ int Field_double::store(const char *from,size_t len,CHARSET_INFO *cs)
int Field_double::store(double nr) int Field_double::store(double nr)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
int error= truncate_double(&nr, field_length, int error= truncate_double(&nr, field_length,
not_fixed ? NOT_FIXED_DEC : dec, not_fixed ? NOT_FIXED_DEC : dec,
unsigned_flag, DBL_MAX); unsigned_flag, DBL_MAX);
...@@ -5061,7 +5065,7 @@ int Field_timestamp::store_TIME_with_warning(THD *thd, MYSQL_TIME *l_time, ...@@ -5061,7 +5065,7 @@ int Field_timestamp::store_TIME_with_warning(THD *thd, MYSQL_TIME *l_time,
int was_cut, int was_cut,
bool have_smth_to_conv) bool have_smth_to_conv)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
uint error = 0; uint error = 0;
my_time_t timestamp; my_time_t timestamp;
...@@ -5536,7 +5540,7 @@ void Field_timestampf::store_TIME(my_time_t timestamp, ulong sec_part) ...@@ -5536,7 +5540,7 @@ void Field_timestampf::store_TIME(my_time_t timestamp, ulong sec_part)
void Field_timestampf::set_max() void Field_timestampf::set_max()
{ {
DBUG_ENTER("Field_timestampf::set_max"); DBUG_ENTER("Field_timestampf::set_max");
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
DBUG_ASSERT(dec == TIME_SECOND_PART_DIGITS); DBUG_ASSERT(dec == TIME_SECOND_PART_DIGITS);
set_notnull(); set_notnull();
...@@ -5612,7 +5616,7 @@ int Field_temporal_with_date::store_TIME_with_warning(MYSQL_TIME *ltime, ...@@ -5612,7 +5616,7 @@ int Field_temporal_with_date::store_TIME_with_warning(MYSQL_TIME *ltime,
Sql_condition::enum_warning_level trunc_level= Sql_condition::WARN_LEVEL_WARN; Sql_condition::enum_warning_level trunc_level= Sql_condition::WARN_LEVEL_WARN;
int ret= 2; int ret= 2;
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
if (was_cut == 0 && have_smth_to_conv == 0) // special case: zero date if (was_cut == 0 && have_smth_to_conv == 0) // special case: zero date
{ {
...@@ -5795,7 +5799,7 @@ int Field_time::store_TIME_with_warning(MYSQL_TIME *ltime, ...@@ -5795,7 +5799,7 @@ int Field_time::store_TIME_with_warning(MYSQL_TIME *ltime,
int was_cut, int was_cut,
int have_smth_to_conv) int have_smth_to_conv)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
if (!have_smth_to_conv) if (!have_smth_to_conv)
{ {
...@@ -6261,7 +6265,7 @@ bool Field_timef::get_date(MYSQL_TIME *ltime, ulonglong fuzzydate) ...@@ -6261,7 +6265,7 @@ bool Field_timef::get_date(MYSQL_TIME *ltime, ulonglong fuzzydate)
int Field_year::store(const char *from, size_t len,CHARSET_INFO *cs) int Field_year::store(const char *from, size_t len,CHARSET_INFO *cs)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
char *end; char *end;
int error; int error;
longlong nr= cs->cset->strntoull10rnd(cs, from, len, 0, &end, &error); longlong nr= cs->cset->strntoull10rnd(cs, from, len, 0, &end, &error);
...@@ -6309,7 +6313,7 @@ int Field_year::store(double nr) ...@@ -6309,7 +6313,7 @@ int Field_year::store(double nr)
int Field_year::store(longlong nr, bool unsigned_val) int Field_year::store(longlong nr, bool unsigned_val)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
if (nr < 0 || (nr >= 100 && nr <= 1900) || nr > 2155) if (nr < 0 || (nr >= 100 && nr <= 1900) || nr > 2155)
{ {
*ptr= 0; *ptr= 0;
...@@ -7001,7 +7005,7 @@ Field_longstr::report_if_important_data(const char *pstr, const char *end, ...@@ -7001,7 +7005,7 @@ Field_longstr::report_if_important_data(const char *pstr, const char *end,
int Field_string::store(const char *from, size_t length,CHARSET_INFO *cs) int Field_string::store(const char *from, size_t length,CHARSET_INFO *cs)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
uint copy_length; uint copy_length;
int rc; int rc;
...@@ -7047,7 +7051,7 @@ int Field_str::store(longlong nr, bool unsigned_val) ...@@ -7047,7 +7051,7 @@ int Field_str::store(longlong nr, bool unsigned_val)
int Field_str::store(double nr) int Field_str::store(double nr)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
char buff[DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE]; char buff[DOUBLE_TO_STRING_CONVERSION_BUFFER_SIZE];
uint local_char_length= MY_MIN(sizeof(buff), uint local_char_length= MY_MIN(sizeof(buff),
field_length / field_charset->mbmaxlen); field_length / field_charset->mbmaxlen);
...@@ -7551,7 +7555,7 @@ int Field_varstring::save_field_metadata(uchar *metadata_ptr) ...@@ -7551,7 +7555,7 @@ int Field_varstring::save_field_metadata(uchar *metadata_ptr)
int Field_varstring::store(const char *from,size_t length,CHARSET_INFO *cs) int Field_varstring::store(const char *from,size_t length,CHARSET_INFO *cs)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
uint copy_length; uint copy_length;
int rc; int rc;
...@@ -8089,7 +8093,7 @@ String *Field_longstr::uncompress(String *val_buffer, String *val_ptr, ...@@ -8089,7 +8093,7 @@ String *Field_longstr::uncompress(String *val_buffer, String *val_ptr,
int Field_varstring_compressed::store(const char *from, size_t length, int Field_varstring_compressed::store(const char *from, size_t length,
CHARSET_INFO *cs) CHARSET_INFO *cs)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
uint compressed_length; uint compressed_length;
int rc= compress((char*) get_data(), field_length, from, (uint) length, int rc= compress((char*) get_data(), field_length, from, (uint) length,
Field_varstring_compressed::max_display_length(), Field_varstring_compressed::max_display_length(),
...@@ -8221,7 +8225,7 @@ int Field_blob::copy_value(Field_blob *from) ...@@ -8221,7 +8225,7 @@ int Field_blob::copy_value(Field_blob *from)
int Field_blob::store(const char *from,size_t length,CHARSET_INFO *cs) int Field_blob::store(const char *from,size_t length,CHARSET_INFO *cs)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
size_t copy_length, new_length; size_t copy_length, new_length;
uint copy_len; uint copy_len;
char *tmp; char *tmp;
...@@ -8703,7 +8707,7 @@ uint Field_blob::is_equal(Create_field *new_field) ...@@ -8703,7 +8707,7 @@ uint Field_blob::is_equal(Create_field *new_field)
int Field_blob_compressed::store(const char *from, size_t length, int Field_blob_compressed::store(const char *from, size_t length,
CHARSET_INFO *cs) CHARSET_INFO *cs)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
uint compressed_length; uint compressed_length;
uint max_length= max_data_length(); uint max_length= max_data_length();
uint to_length= (uint) MY_MIN(max_length, uint to_length= (uint) MY_MIN(max_length,
...@@ -9046,7 +9050,7 @@ void Field_enum::store_type(ulonglong value) ...@@ -9046,7 +9050,7 @@ void Field_enum::store_type(ulonglong value)
int Field_enum::store(const char *from,size_t length,CHARSET_INFO *cs) int Field_enum::store(const char *from,size_t length,CHARSET_INFO *cs)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
int err= 0; int err= 0;
char buff[STRING_BUFFER_USUAL_SIZE]; char buff[STRING_BUFFER_USUAL_SIZE];
String tmpstr(buff,sizeof(buff), &my_charset_bin); String tmpstr(buff,sizeof(buff), &my_charset_bin);
...@@ -9098,7 +9102,7 @@ int Field_enum::store(double nr) ...@@ -9098,7 +9102,7 @@ int Field_enum::store(double nr)
int Field_enum::store(longlong nr, bool unsigned_val) int Field_enum::store(longlong nr, bool unsigned_val)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
int error= 0; int error= 0;
if ((ulonglong) nr > typelib->count || nr == 0) if ((ulonglong) nr > typelib->count || nr == 0)
{ {
...@@ -9229,7 +9233,7 @@ Field *Field_enum::make_new_field(MEM_ROOT *root, TABLE *new_table, ...@@ -9229,7 +9233,7 @@ Field *Field_enum::make_new_field(MEM_ROOT *root, TABLE *new_table,
int Field_set::store(const char *from,size_t length,CHARSET_INFO *cs) int Field_set::store(const char *from,size_t length,CHARSET_INFO *cs)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
bool got_warning= 0; bool got_warning= 0;
int err= 0; int err= 0;
char *not_used; char *not_used;
...@@ -9269,7 +9273,7 @@ int Field_set::store(const char *from,size_t length,CHARSET_INFO *cs) ...@@ -9269,7 +9273,7 @@ int Field_set::store(const char *from,size_t length,CHARSET_INFO *cs)
int Field_set::store(longlong nr, bool unsigned_val) int Field_set::store(longlong nr, bool unsigned_val)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
int error= 0; int error= 0;
ulonglong max_nr; ulonglong max_nr;
...@@ -9648,7 +9652,7 @@ uint Field_bit::is_equal(Create_field *new_field) ...@@ -9648,7 +9652,7 @@ uint Field_bit::is_equal(Create_field *new_field)
int Field_bit::store(const char *from, size_t length, CHARSET_INFO *cs) int Field_bit::store(const char *from, size_t length, CHARSET_INFO *cs)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
int delta; int delta;
for (; length && !*from; from++, length--) // skip left 0's for (; length && !*from; from++, length--) // skip left 0's
...@@ -10084,7 +10088,7 @@ Field_bit_as_char::Field_bit_as_char(uchar *ptr_arg, uint32 len_arg, ...@@ -10084,7 +10088,7 @@ Field_bit_as_char::Field_bit_as_char(uchar *ptr_arg, uint32 len_arg,
int Field_bit_as_char::store(const char *from, size_t length, CHARSET_INFO *cs) int Field_bit_as_char::store(const char *from, size_t length, CHARSET_INFO *cs)
{ {
ASSERT_COLUMN_MARKED_FOR_WRITE_OR_COMPUTED; ASSERT_COLUMN_MARKED_FOR_WRITE;
int delta; int delta;
uchar bits= (uchar) (field_length & 7); uchar bits= (uchar) (field_length & 7);
......
...@@ -7543,6 +7543,20 @@ class Turn_errors_to_warnings_handler : public Internal_error_handler ...@@ -7543,6 +7543,20 @@ class Turn_errors_to_warnings_handler : public Internal_error_handler
} }
}; };
/*
to satisfy ASSERT_COLUMN_MARKED_FOR_WRITE Field's assert we temporarily
mark field for write before storing the generated value in it
*/
#ifndef DBUG_OFF
#define DBUG_FIX_WRITE_SET(f) bool _write_set_fixed= !bitmap_fast_test_and_set(write_set, (f)->field_index)
#define DBUG_RESTORE_WRITE_SET(f) if (_write_set_fixed) bitmap_clear_bit(write_set, (f)->field_index)
#else
#define DBUG_FIX_WRITE_SET(f)
#define DBUG_RESTORE_WRITE_SET(f)
#endif
/* /*
@brief Compute values for virtual columns used in query @brief Compute values for virtual columns used in query
...@@ -7643,8 +7657,10 @@ int TABLE::update_virtual_fields(handler *h, enum_vcol_update_mode update_mode) ...@@ -7643,8 +7657,10 @@ int TABLE::update_virtual_fields(handler *h, enum_vcol_update_mode update_mode)
{ {
int field_error __attribute__((unused)) = 0; int field_error __attribute__((unused)) = 0;
/* Compute the actual value of the virtual fields */ /* Compute the actual value of the virtual fields */
DBUG_FIX_WRITE_SET(vf);
if (vcol_info->expr->save_in_field(vf, 0)) if (vcol_info->expr->save_in_field(vf, 0))
field_error= error= 1; field_error= error= 1;
DBUG_RESTORE_WRITE_SET(vf);
DBUG_PRINT("info", ("field '%s' - updated error: %d", DBUG_PRINT("info", ("field '%s' - updated error: %d",
vf->field_name.str, field_error)); vf->field_name.str, field_error));
if (swap_values && (vf->flags & BLOB_FLAG)) if (swap_values && (vf->flags & BLOB_FLAG))
...@@ -7678,7 +7694,9 @@ int TABLE::update_virtual_field(Field *vf) ...@@ -7678,7 +7694,9 @@ int TABLE::update_virtual_field(Field *vf)
in_use->set_n_backup_active_arena(expr_arena, &backup_arena); in_use->set_n_backup_active_arena(expr_arena, &backup_arena);
bitmap_clear_all(&tmp_set); bitmap_clear_all(&tmp_set);
vf->vcol_info->expr->walk(&Item::update_vcol_processor, 0, &tmp_set); vf->vcol_info->expr->walk(&Item::update_vcol_processor, 0, &tmp_set);
DBUG_FIX_WRITE_SET(vf);
vf->vcol_info->expr->save_in_field(vf, 0); vf->vcol_info->expr->save_in_field(vf, 0);
DBUG_RESTORE_WRITE_SET(vf);
in_use->restore_active_arena(expr_arena, &backup_arena); in_use->restore_active_arena(expr_arena, &backup_arena);
DBUG_RETURN(in_use->is_error()); DBUG_RETURN(in_use->is_error());
} }
......
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