Commit 2b0a5824 authored by Sergei Golubchik's avatar Sergei Golubchik

portability fix: avoid anonymous structs and unions in C

parent 4bcd78e8
...@@ -79,15 +79,15 @@ struct st_dynamic_column_value ...@@ -79,15 +79,15 @@ struct st_dynamic_column_value
unsigned long long ulong_value; unsigned long long ulong_value;
double double_value; double double_value;
struct { struct {
LEX_STRING string_value; LEX_STRING value;
CHARSET_INFO *charset; CHARSET_INFO *charset;
}; } string;
struct { struct {
decimal_digit_t decimal_buffer[DECIMAL_BUFF_LENGTH]; decimal_digit_t buffer[DECIMAL_BUFF_LENGTH];
decimal_t decimal_value; decimal_t value;
}; } decimal;
MYSQL_TIME time_value; MYSQL_TIME time_value;
}; } x;
}; };
typedef struct st_dynamic_column_value DYNAMIC_COLUMN_VALUE; typedef struct st_dynamic_column_value DYNAMIC_COLUMN_VALUE;
......
...@@ -238,7 +238,7 @@ dynamic_column_uint_read(DYNAMIC_COLUMN_VALUE *store_it_here, ...@@ -238,7 +238,7 @@ dynamic_column_uint_read(DYNAMIC_COLUMN_VALUE *store_it_here,
for (i= 0; i < length; i++) for (i= 0; i < length; i++)
value+= ((ulonglong)data[i]) << (i*8); value+= ((ulonglong)data[i]) << (i*8);
store_it_here->ulong_value= value; store_it_here->x.ulong_value= value;
return ER_DYNCOL_OK; return ER_DYNCOL_OK;
} }
...@@ -297,12 +297,12 @@ dynamic_column_sint_read(DYNAMIC_COLUMN_VALUE *store_it_here, ...@@ -297,12 +297,12 @@ dynamic_column_sint_read(DYNAMIC_COLUMN_VALUE *store_it_here,
{ {
ulonglong val; ulonglong val;
dynamic_column_uint_read(store_it_here, data, length); dynamic_column_uint_read(store_it_here, data, length);
val= store_it_here->ulong_value; val= store_it_here->x.ulong_value;
if (val & 1) if (val & 1)
val= (val >> 1) ^ ULL(0xffffffffffffffff); val= (val >> 1) ^ ULL(0xffffffffffffffff);
else else
val>>= 1; val>>= 1;
store_it_here->long_value= (longlong) val; store_it_here->x.long_value= (longlong) val;
return ER_DYNCOL_OK; return ER_DYNCOL_OK;
} }
...@@ -324,30 +324,30 @@ dynamic_column_value_len(DYNAMIC_COLUMN_VALUE *value) ...@@ -324,30 +324,30 @@ dynamic_column_value_len(DYNAMIC_COLUMN_VALUE *value)
case DYN_COL_NULL: case DYN_COL_NULL:
return 0; return 0;
case DYN_COL_INT: case DYN_COL_INT:
return dynamic_column_sint_bytes(value->long_value); return dynamic_column_sint_bytes(value->x.long_value);
case DYN_COL_UINT: case DYN_COL_UINT:
return dynamic_column_uint_bytes(value->ulong_value); return dynamic_column_uint_bytes(value->x.ulong_value);
case DYN_COL_DOUBLE: case DYN_COL_DOUBLE:
return 8; return 8;
case DYN_COL_STRING: case DYN_COL_STRING:
return (dynamic_column_var_uint_bytes(value->charset->number) + return (dynamic_column_var_uint_bytes(value->x.string.charset->number) +
value->string_value.length); value->x.string.value.length);
case DYN_COL_DECIMAL: case DYN_COL_DECIMAL:
{ {
int precision= value->decimal_value.intg + value->decimal_value.frac; int precision= value->x.decimal.value.intg + value->x.decimal.value.frac;
int scale= value->decimal_value.frac; int scale= value->x.decimal.value.frac;
if (precision == 0 || decimal_is_zero(&value->decimal_value)) if (precision == 0 || decimal_is_zero(&value->x.decimal.value))
{ {
/* This is here to simplify dynamic_column_decimal_store() */ /* This is here to simplify dynamic_column_decimal_store() */
value->decimal_value.intg= value->decimal_value.frac= 0; value->x.decimal.value.intg= value->x.decimal.value.frac= 0;
return 0; return 0;
} }
/* /*
Check if legal decimal; This is needed to not get an assert in Check if legal decimal; This is needed to not get an assert in
decimal_bin_size(). However this should be impossible as all decimal_bin_size(). However this should be impossible as all
decimals entered here should be valid and we have the special check decimals entered here should be valid and we have the special check
above to handle the unlikely but possible case that decimal_value.intg above to handle the unlikely but possible case that decimal.value.intg
and decimal.frac is 0. and decimal.frac is 0.
*/ */
if (scale < 0 || precision <= 0) if (scale < 0 || precision <= 0)
...@@ -355,8 +355,8 @@ dynamic_column_value_len(DYNAMIC_COLUMN_VALUE *value) ...@@ -355,8 +355,8 @@ dynamic_column_value_len(DYNAMIC_COLUMN_VALUE *value)
DBUG_ASSERT(0); /* Impossible */ DBUG_ASSERT(0); /* Impossible */
return (size_t) ~0; return (size_t) ~0;
} }
return (dynamic_column_var_uint_bytes(value->decimal_value.intg) + return (dynamic_column_var_uint_bytes(value->x.decimal.value.intg) +
dynamic_column_var_uint_bytes(value->decimal_value.frac) + dynamic_column_var_uint_bytes(value->x.decimal.value.frac) +
decimal_bin_size(precision, scale)); decimal_bin_size(precision, scale));
} }
case DYN_COL_DATETIME: case DYN_COL_DATETIME:
...@@ -410,7 +410,7 @@ dynamic_column_double_read(DYNAMIC_COLUMN_VALUE *store_it_here, ...@@ -410,7 +410,7 @@ dynamic_column_double_read(DYNAMIC_COLUMN_VALUE *store_it_here,
{ {
if (length != 8) if (length != 8)
return ER_DYNCOL_FORMAT; return ER_DYNCOL_FORMAT;
float8get(store_it_here->double_value, data); float8get(store_it_here->x.double_value, data);
return ER_DYNCOL_OK; return ER_DYNCOL_OK;
} }
...@@ -455,12 +455,12 @@ dynamic_column_string_read(DYNAMIC_COLUMN_VALUE *store_it_here, ...@@ -455,12 +455,12 @@ dynamic_column_string_read(DYNAMIC_COLUMN_VALUE *store_it_here,
uint charset_nr= (uint)dynamic_column_var_uint_get(data, length, &len); uint charset_nr= (uint)dynamic_column_var_uint_get(data, length, &len);
if (len == 0) /* Wrong packed number */ if (len == 0) /* Wrong packed number */
return ER_DYNCOL_FORMAT; return ER_DYNCOL_FORMAT;
store_it_here->charset= get_charset(charset_nr, MYF(MY_WME)); store_it_here->x.string.charset= get_charset(charset_nr, MYF(MY_WME));
if (store_it_here->charset == NULL) if (store_it_here->x.string.charset == NULL)
return ER_DYNCOL_UNKNOWN_CHARSET; return ER_DYNCOL_UNKNOWN_CHARSET;
data+= len; data+= len;
store_it_here->string_value.length= (length-= len); store_it_here->x.string.value.length= (length-= len);
store_it_here->string_value.str= (char*) data; store_it_here->x.string.value.str= (char*) data;
return ER_DYNCOL_OK; return ER_DYNCOL_OK;
} }
...@@ -508,11 +508,11 @@ dynamic_column_decimal_store(DYNAMIC_COLUMN *str, ...@@ -508,11 +508,11 @@ dynamic_column_decimal_store(DYNAMIC_COLUMN *str,
void dynamic_column_prepare_decimal(DYNAMIC_COLUMN_VALUE *value) void dynamic_column_prepare_decimal(DYNAMIC_COLUMN_VALUE *value)
{ {
value->decimal_value.buf= value->decimal_buffer; value->x.decimal.value.buf= value->x.decimal.buffer;
value->decimal_value.len= DECIMAL_BUFF_LENGTH; value->x.decimal.value.len= DECIMAL_BUFF_LENGTH;
/* just to be safe */ /* just to be safe */
value->type= DYN_COL_DECIMAL; value->type= DYN_COL_DECIMAL;
decimal_make_zero(&value->decimal_value); decimal_make_zero(&value->x.decimal.value);
} }
...@@ -553,7 +553,7 @@ dynamic_column_decimal_read(DYNAMIC_COLUMN_VALUE *store_it_here, ...@@ -553,7 +553,7 @@ dynamic_column_decimal_read(DYNAMIC_COLUMN_VALUE *store_it_here,
(int) (length - intg_len - frac_len)) (int) (length - intg_len - frac_len))
return ER_DYNCOL_FORMAT; return ER_DYNCOL_FORMAT;
if (bin2decimal(data, &store_it_here->decimal_value, precision, scale) != if (bin2decimal(data, &store_it_here->x.decimal.value, precision, scale) !=
E_DEC_OK) E_DEC_OK)
return ER_DYNCOL_FORMAT; return ER_DYNCOL_FORMAT;
return ER_DYNCOL_OK; return ER_DYNCOL_OK;
...@@ -607,14 +607,14 @@ dynamic_column_date_time_read(DYNAMIC_COLUMN_VALUE *store_it_here, ...@@ -607,14 +607,14 @@ dynamic_column_date_time_read(DYNAMIC_COLUMN_VALUE *store_it_here,
*/ */
if (length != 9) if (length != 9)
goto err; goto err;
store_it_here->time_value.time_type= MYSQL_TIMESTAMP_DATETIME; store_it_here->x.time_value.time_type= MYSQL_TIMESTAMP_DATETIME;
if ((rc= dynamic_column_date_read_internal(store_it_here, data, 3)) || if ((rc= dynamic_column_date_read_internal(store_it_here, data, 3)) ||
(rc= dynamic_column_time_read_internal(store_it_here, data + 3, 6))) (rc= dynamic_column_time_read_internal(store_it_here, data + 3, 6)))
goto err; goto err;
return ER_DYNCOL_OK; return ER_DYNCOL_OK;
err: err:
store_it_here->time_value.time_type= MYSQL_TIMESTAMP_ERROR; store_it_here->x.time_value.time_type= MYSQL_TIMESTAMP_ERROR;
return rc; return rc;
} }
...@@ -682,9 +682,9 @@ static enum enum_dyncol_func_result ...@@ -682,9 +682,9 @@ static enum enum_dyncol_func_result
dynamic_column_time_read(DYNAMIC_COLUMN_VALUE *store_it_here, dynamic_column_time_read(DYNAMIC_COLUMN_VALUE *store_it_here,
uchar *data, size_t length) uchar *data, size_t length)
{ {
store_it_here->time_value.year= store_it_here->time_value.month= store_it_here->x.time_value.year= store_it_here->x.time_value.month=
store_it_here->time_value.day= 0; store_it_here->x.time_value.day= 0;
store_it_here->time_value.time_type= MYSQL_TIMESTAMP_TIME; store_it_here->x.time_value.time_type= MYSQL_TIMESTAMP_TIME;
return dynamic_column_time_read_internal(store_it_here, data, length); return dynamic_column_time_read_internal(store_it_here, data, length);
} }
...@@ -709,23 +709,23 @@ dynamic_column_time_read_internal(DYNAMIC_COLUMN_VALUE *store_it_here, ...@@ -709,23 +709,23 @@ dynamic_column_time_read_internal(DYNAMIC_COLUMN_VALUE *store_it_here,
1123456789012345612345612345678901234567890 1123456789012345612345612345678901234567890
<123456><123456><123456><123456><123456><123456> <123456><123456><123456><123456><123456><123456>
*/ */
store_it_here->time_value.second_part= (data[0] | store_it_here->x.time_value.second_part= (data[0] |
(data[1] << 8) | (data[1] << 8) |
((data[2] & 0xf) << 16)); ((data[2] & 0xf) << 16));
store_it_here->time_value.second= ((data[2] >> 4) | store_it_here->x.time_value.second= ((data[2] >> 4) |
((data[3] & 0x3) << 4)); ((data[3] & 0x3) << 4));
store_it_here->time_value.minute= (data[3] >> 2); store_it_here->x.time_value.minute= (data[3] >> 2);
store_it_here->time_value.hour= (((((uint)data[5]) & 0x3 ) << 8) | data[4]); store_it_here->x.time_value.hour= (((((uint)data[5]) & 0x3 ) << 8) | data[4]);
store_it_here->time_value.neg= ((data[5] & 0x4) ? 1 : 0); store_it_here->x.time_value.neg= ((data[5] & 0x4) ? 1 : 0);
if (store_it_here->time_value.second > 59 || if (store_it_here->x.time_value.second > 59 ||
store_it_here->time_value.minute > 59 || store_it_here->x.time_value.minute > 59 ||
store_it_here->time_value.hour > 838 || store_it_here->x.time_value.hour > 838 ||
store_it_here->time_value.second_part > 999999) store_it_here->x.time_value.second_part > 999999)
goto err; goto err;
return ER_DYNCOL_OK; return ER_DYNCOL_OK;
err: err:
store_it_here->time_value.time_type= MYSQL_TIMESTAMP_ERROR; store_it_here->x.time_value.time_type= MYSQL_TIMESTAMP_ERROR;
return ER_DYNCOL_FORMAT; return ER_DYNCOL_FORMAT;
} }
...@@ -783,12 +783,12 @@ static enum enum_dyncol_func_result ...@@ -783,12 +783,12 @@ static enum enum_dyncol_func_result
dynamic_column_date_read(DYNAMIC_COLUMN_VALUE *store_it_here, dynamic_column_date_read(DYNAMIC_COLUMN_VALUE *store_it_here,
uchar *data, size_t length) uchar *data, size_t length)
{ {
store_it_here->time_value.neg= 0; store_it_here->x.time_value.neg= 0;
store_it_here->time_value.second_part= 0; store_it_here->x.time_value.second_part= 0;
store_it_here->time_value.hour= 0; store_it_here->x.time_value.hour= 0;
store_it_here->time_value.minute= 0; store_it_here->x.time_value.minute= 0;
store_it_here->time_value.second= 0; store_it_here->x.time_value.second= 0;
store_it_here->time_value.time_type= MYSQL_TIMESTAMP_DATE; store_it_here->x.time_value.time_type= MYSQL_TIMESTAMP_DATE;
return dynamic_column_date_read_internal(store_it_here, data, length); return dynamic_column_date_read_internal(store_it_here, data, length);
} }
...@@ -814,19 +814,19 @@ dynamic_column_date_read_internal(DYNAMIC_COLUMN_VALUE *store_it_here, ...@@ -814,19 +814,19 @@ dynamic_column_date_read_internal(DYNAMIC_COLUMN_VALUE *store_it_here,
12345678901234123412345 12345678901234123412345
<123456><123456><123456> <123456><123456><123456>
*/ */
store_it_here->time_value.day= (data[0] & 0x1f); store_it_here->x.time_value.day= (data[0] & 0x1f);
store_it_here->time_value.month= (((data[1] & 0x1) << 3) | store_it_here->x.time_value.month= (((data[1] & 0x1) << 3) |
(data[0] >> 5)); (data[0] >> 5));
store_it_here->time_value.year= ((((uint)data[2]) << 7) | store_it_here->x.time_value.year= ((((uint)data[2]) << 7) |
(data[1] >> 1)); (data[1] >> 1));
if (store_it_here->time_value.day > 31 || if (store_it_here->x.time_value.day > 31 ||
store_it_here->time_value.month > 12 || store_it_here->x.time_value.month > 12 ||
store_it_here->time_value.year > 9999) store_it_here->x.time_value.year > 9999)
goto err; goto err;
return ER_DYNCOL_OK; return ER_DYNCOL_OK;
err: err:
store_it_here->time_value.time_type= MYSQL_TIMESTAMP_ERROR; store_it_here->x.time_value.time_type= MYSQL_TIMESTAMP_ERROR;
return ER_DYNCOL_FORMAT; return ER_DYNCOL_FORMAT;
} }
...@@ -845,25 +845,25 @@ data_store(DYNAMIC_COLUMN *str, DYNAMIC_COLUMN_VALUE *value) ...@@ -845,25 +845,25 @@ data_store(DYNAMIC_COLUMN *str, DYNAMIC_COLUMN_VALUE *value)
{ {
switch (value->type) { switch (value->type) {
case DYN_COL_INT: case DYN_COL_INT:
return dynamic_column_sint_store(str, value->long_value); return dynamic_column_sint_store(str, value->x.long_value);
case DYN_COL_UINT: case DYN_COL_UINT:
return dynamic_column_uint_store(str, value->ulong_value); return dynamic_column_uint_store(str, value->x.ulong_value);
case DYN_COL_DOUBLE: case DYN_COL_DOUBLE:
return dynamic_column_double_store(str, value->double_value); return dynamic_column_double_store(str, value->x.double_value);
case DYN_COL_STRING: case DYN_COL_STRING:
return dynamic_column_string_store(str, &value->string_value, return dynamic_column_string_store(str, &value->x.string.value,
value->charset); value->x.string.charset);
case DYN_COL_DECIMAL: case DYN_COL_DECIMAL:
return dynamic_column_decimal_store(str, &value->decimal_value); return dynamic_column_decimal_store(str, &value->x.decimal.value);
case DYN_COL_DATETIME: case DYN_COL_DATETIME:
/* date+time in bits: 14 + 4 + 5 + 5 + 6 + 6 40bits = 5 bytes */ /* date+time in bits: 14 + 4 + 5 + 5 + 6 + 6 40bits = 5 bytes */
return dynamic_column_date_time_store(str, &value->time_value); return dynamic_column_date_time_store(str, &value->x.time_value);
case DYN_COL_DATE: case DYN_COL_DATE:
/* date in dits: 14 + 4 + 5 = 23bits ~= 3bytes*/ /* date in dits: 14 + 4 + 5 = 23bits ~= 3bytes*/
return dynamic_column_date_store(str, &value->time_value); return dynamic_column_date_store(str, &value->x.time_value);
case DYN_COL_TIME: case DYN_COL_TIME:
/* time in bits: 5 + 6 + 6 = 17bits ~= 3bytes*/ /* time in bits: 5 + 6 + 6 = 17bits ~= 3bytes*/
return dynamic_column_time_store(str, &value->time_value); return dynamic_column_time_store(str, &value->x.time_value);
case DYN_COL_NULL: case DYN_COL_NULL:
break; /* Impossible */ break; /* Impossible */
} }
......
...@@ -3606,40 +3606,40 @@ void Item_func_dyncol_create::prepare_arguments() ...@@ -3606,40 +3606,40 @@ void Item_func_dyncol_create::prepare_arguments()
DBUG_ASSERT(args[valpos]->field_type() == MYSQL_TYPE_NULL); DBUG_ASSERT(args[valpos]->field_type() == MYSQL_TYPE_NULL);
break; break;
case DYN_COL_INT: case DYN_COL_INT:
vals[i].long_value= args[valpos]->val_int(); vals[i].x.long_value= args[valpos]->val_int();
break; break;
case DYN_COL_UINT: case DYN_COL_UINT:
vals[i].ulong_value= args[valpos]->val_int(); vals[i].x.ulong_value= args[valpos]->val_int();
break; break;
case DYN_COL_DOUBLE: case DYN_COL_DOUBLE:
vals[i].double_value= args[valpos]->val_real(); vals[i].x.double_value= args[valpos]->val_real();
break; break;
case DYN_COL_STRING: case DYN_COL_STRING:
res= args[valpos]->val_str(&tmp); res= args[valpos]->val_str(&tmp);
if (res && if (res &&
(vals[i].string_value.str= my_strndup(res->ptr(), res->length(), (vals[i].x.string.value.str= my_strndup(res->ptr(), res->length(),
MYF(MY_WME)))) MYF(MY_WME))))
{ {
vals[i].string_value.length= res->length(); vals[i].x.string.value.length= res->length();
vals[i].charset= res->charset(); vals[i].x.string.charset= res->charset();
} }
else else
{ {
args[valpos]->null_value= 1; // In case of out of memory args[valpos]->null_value= 1; // In case of out of memory
vals[i].string_value.str= NULL; vals[i].x.string.value.str= NULL;
vals[i].string_value.length= 0; // just to be safe vals[i].x.string.value.length= 0; // just to be safe
} }
break; break;
case DYN_COL_DECIMAL: case DYN_COL_DECIMAL:
if ((dres= args[valpos]->val_decimal(&dtmp))) if ((dres= args[valpos]->val_decimal(&dtmp)))
{ {
dynamic_column_prepare_decimal(&vals[i]); dynamic_column_prepare_decimal(&vals[i]);
DBUG_ASSERT(vals[i].decimal_value.len == dres->len); DBUG_ASSERT(vals[i].x.decimal.value.len == dres->len);
vals[i].decimal_value.intg= dres->intg; vals[i].x.decimal.value.intg= dres->intg;
vals[i].decimal_value.frac= dres->frac; vals[i].x.decimal.value.frac= dres->frac;
vals[i].decimal_value.sign= dres->sign(); vals[i].x.decimal.value.sign= dres->sign();
memcpy(vals[i].decimal_buffer, dres->buf, memcpy(vals[i].x.decimal.buffer, dres->buf,
sizeof(vals[i].decimal_buffer)); sizeof(vals[i].x.decimal.buffer));
} }
else else
{ {
...@@ -3648,13 +3648,13 @@ void Item_func_dyncol_create::prepare_arguments() ...@@ -3648,13 +3648,13 @@ void Item_func_dyncol_create::prepare_arguments()
} }
break; break;
case DYN_COL_DATETIME: case DYN_COL_DATETIME:
args[valpos]->get_date(&vals[i].time_value, TIME_FUZZY_DATE); args[valpos]->get_date(&vals[i].x.time_value, TIME_FUZZY_DATE);
break; break;
case DYN_COL_DATE: case DYN_COL_DATE:
args[valpos]->get_date(&vals[i].time_value, TIME_FUZZY_DATE); args[valpos]->get_date(&vals[i].x.time_value, TIME_FUZZY_DATE);
break; break;
case DYN_COL_TIME: case DYN_COL_TIME:
args[valpos]->get_time(&vals[i].time_value); args[valpos]->get_time(&vals[i].x.time_value);
break; break;
default: default:
DBUG_ASSERT(0); DBUG_ASSERT(0);
...@@ -3663,7 +3663,7 @@ void Item_func_dyncol_create::prepare_arguments() ...@@ -3663,7 +3663,7 @@ void Item_func_dyncol_create::prepare_arguments()
if (vals[i].type != DYN_COL_NULL && args[valpos]->null_value) if (vals[i].type != DYN_COL_NULL && args[valpos]->null_value)
{ {
if (vals[i].type == DYN_COL_STRING) if (vals[i].type == DYN_COL_STRING)
my_free(vals[i].string_value.str, MYF(MY_ALLOW_ZERO_PTR)); my_free(vals[i].x.string.value.str, MYF(MY_ALLOW_ZERO_PTR));
vals[i].type= DYN_COL_NULL; vals[i].type= DYN_COL_NULL;
} }
} }
...@@ -3677,7 +3677,7 @@ void Item_func_dyncol_create::cleanup_arguments() ...@@ -3677,7 +3677,7 @@ void Item_func_dyncol_create::cleanup_arguments()
for (i= 0; i < column_count; i++) for (i= 0; i < column_count; i++)
{ {
if (vals[i].type == DYN_COL_STRING) if (vals[i].type == DYN_COL_STRING)
my_free(vals[i].string_value.str, MYF(MY_ALLOW_ZERO_PTR)); my_free(vals[i].x.string.value.str, MYF(MY_ALLOW_ZERO_PTR));
} }
} }
...@@ -3894,19 +3894,19 @@ String *Item_dyncol_get::val_str(String *str_result) ...@@ -3894,19 +3894,19 @@ String *Item_dyncol_get::val_str(String *str_result)
goto null; goto null;
case DYN_COL_INT: case DYN_COL_INT:
case DYN_COL_UINT: case DYN_COL_UINT:
str_result->set_int(val.long_value, test(val.type == DYN_COL_UINT), str_result->set_int(val.x.long_value, test(val.type == DYN_COL_UINT),
&my_charset_latin1); &my_charset_latin1);
break; break;
case DYN_COL_DOUBLE: case DYN_COL_DOUBLE:
str_result->set_real(val.double_value, NOT_FIXED_DEC, &my_charset_latin1); str_result->set_real(val.x.double_value, NOT_FIXED_DEC, &my_charset_latin1);
break; break;
case DYN_COL_STRING: case DYN_COL_STRING:
if ((char*) tmp.ptr() <= val.string_value.str && if ((char*) tmp.ptr() <= val.x.string.value.str &&
(char*) tmp.ptr() + tmp.length() >= val.string_value.str) (char*) tmp.ptr() + tmp.length() >= val.x.string.value.str)
{ {
/* value is allocated in tmp buffer; We have to make a copy */ /* value is allocated in tmp buffer; We have to make a copy */
str_result->copy(val.string_value.str, val.string_value.length, str_result->copy(val.x.string.value.str, val.x.string.value.length,
val.charset); val.x.string.charset);
} }
else else
{ {
...@@ -3915,24 +3915,24 @@ String *Item_dyncol_get::val_str(String *str_result) ...@@ -3915,24 +3915,24 @@ String *Item_dyncol_get::val_str(String *str_result)
into a field or in a buffer for another item and this buffer into a field or in a buffer for another item and this buffer
is not going to be deleted during expression evaluation is not going to be deleted during expression evaluation
*/ */
str_result->set(val.string_value.str, val.string_value.length, str_result->set(val.x.string.value.str, val.x.string.value.length,
val.charset); val.x.string.charset);
} }
break; break;
case DYN_COL_DECIMAL: case DYN_COL_DECIMAL:
{ {
int res; int res;
int length= int length=
my_decimal_string_length((const my_decimal*)&val.decimal_value); my_decimal_string_length((const my_decimal*)&val.x.decimal.value);
if (str_result->alloc(length)) if (str_result->alloc(length))
goto null; goto null;
if ((res= decimal2string(&val.decimal_value, (char*) str_result->ptr(), if ((res= decimal2string(&val.x.decimal.value, (char*) str_result->ptr(),
&length, 0, 0, ' ')) != E_DEC_OK) &length, 0, 0, ' ')) != E_DEC_OK)
{ {
char buff[40]; char buff[40];
int len= sizeof(buff); int len= sizeof(buff);
DBUG_ASSERT(length < (int)sizeof(buff)); DBUG_ASSERT(length < (int)sizeof(buff));
decimal2string(&val.decimal_value, buff, &len, 0, 0, ' '); decimal2string(&val.x.decimal.value, buff, &len, 0, 0, ' ');
decimal_operation_results(res, buff, "CHAR"); decimal_operation_results(res, buff, "CHAR");
} }
str_result->set_charset(&my_charset_latin1); str_result->set_charset(&my_charset_latin1);
...@@ -3950,7 +3950,7 @@ String *Item_dyncol_get::val_str(String *str_result) ...@@ -3950,7 +3950,7 @@ String *Item_dyncol_get::val_str(String *str_result)
asked to return the time argument as a string. asked to return the time argument as a string.
*/ */
if (str_result->alloc(MAX_DATE_STRING_REP_LENGTH) || if (str_result->alloc(MAX_DATE_STRING_REP_LENGTH) ||
!(length= my_TIME_to_str(&val.time_value, (char*) str_result->ptr(), !(length= my_TIME_to_str(&val.x.time_value, (char*) str_result->ptr(),
AUTO_SEC_PART_DIGITS))) AUTO_SEC_PART_DIGITS)))
goto null; goto null;
str_result->set_charset(&my_charset_latin1); str_result->set_charset(&my_charset_latin1);
...@@ -3980,20 +3980,20 @@ longlong Item_dyncol_get::val_int() ...@@ -3980,20 +3980,20 @@ longlong Item_dyncol_get::val_int()
goto null; goto null;
case DYN_COL_UINT: case DYN_COL_UINT:
unsigned_flag= 1; // Make it possible for caller to detect sign unsigned_flag= 1; // Make it possible for caller to detect sign
return val.long_value; return val.x.long_value;
case DYN_COL_INT: case DYN_COL_INT:
unsigned_flag= 0; // Make it possible for caller to detect sign unsigned_flag= 0; // Make it possible for caller to detect sign
return val.long_value; return val.x.long_value;
case DYN_COL_DOUBLE: case DYN_COL_DOUBLE:
{ {
bool error; bool error;
longlong num; longlong num;
num= double_to_longlong(val.double_value, unsigned_flag, &error); num= double_to_longlong(val.x.double_value, unsigned_flag, &error);
if (error) if (error)
{ {
char buff[30]; char buff[30];
sprintf(buff, "%lg", val.double_value); sprintf(buff, "%lg", val.x.double_value);
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN, push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
ER_DATA_OVERFLOW, ER_DATA_OVERFLOW,
ER(ER_DATA_OVERFLOW), ER(ER_DATA_OVERFLOW),
...@@ -4006,14 +4006,14 @@ longlong Item_dyncol_get::val_int() ...@@ -4006,14 +4006,14 @@ longlong Item_dyncol_get::val_int()
{ {
int error; int error;
longlong num; longlong num;
char *end= val.string_value.str + val.string_value.length, *org_end= end; char *end= val.x.string.value.str + val.x.string.value.length, *org_end= end;
num= my_strtoll10(val.string_value.str, &end, &error); num= my_strtoll10(val.x.string.value.str, &end, &error);
if (end != org_end || error > 0) if (end != org_end || error > 0)
{ {
char buff[80]; char buff[80];
strmake(buff, val.string_value.str, min(sizeof(buff)-1, strmake(buff, val.x.string.value.str, min(sizeof(buff)-1,
val.string_value.length)); val.x.string.value.length));
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN, push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
ER_BAD_DATA, ER_BAD_DATA,
ER(ER_BAD_DATA), ER(ER_BAD_DATA),
...@@ -4026,18 +4026,18 @@ longlong Item_dyncol_get::val_int() ...@@ -4026,18 +4026,18 @@ longlong Item_dyncol_get::val_int()
case DYN_COL_DECIMAL: case DYN_COL_DECIMAL:
{ {
longlong num; longlong num;
my_decimal2int(E_DEC_FATAL_ERROR, &val.decimal_value, unsigned_flag, my_decimal2int(E_DEC_FATAL_ERROR, &val.x.decimal.value, unsigned_flag,
&num); &num);
return num; return num;
} }
case DYN_COL_DATETIME: case DYN_COL_DATETIME:
case DYN_COL_DATE: case DYN_COL_DATE:
case DYN_COL_TIME: case DYN_COL_TIME:
unsigned_flag= !val.time_value.neg; unsigned_flag= !val.x.time_value.neg;
if (unsigned_flag) if (unsigned_flag)
return TIME_to_ulonglong(&val.time_value); return TIME_to_ulonglong(&val.x.time_value);
else else
return -(longlong)TIME_to_ulonglong(&val.time_value); return -(longlong)TIME_to_ulonglong(&val.x.time_value);
} }
null: null:
...@@ -4059,24 +4059,24 @@ double Item_dyncol_get::val_real() ...@@ -4059,24 +4059,24 @@ double Item_dyncol_get::val_real()
case DYN_COL_NULL: case DYN_COL_NULL:
goto null; goto null;
case DYN_COL_UINT: case DYN_COL_UINT:
return ulonglong2double(val.ulong_value); return ulonglong2double(val.x.ulong_value);
case DYN_COL_INT: case DYN_COL_INT:
return (double) val.long_value; return (double) val.x.long_value;
case DYN_COL_DOUBLE: case DYN_COL_DOUBLE:
return (double) val.double_value; return (double) val.x.double_value;
case DYN_COL_STRING: case DYN_COL_STRING:
{ {
int error; int error;
char *end; char *end;
double res= my_strntod(val.charset, (char*) val.string_value.str, double res= my_strntod(val.x.string.charset, (char*) val.x.string.value.str,
val.string_value.length, &end, &error); val.x.string.value.length, &end, &error);
if (end != (char*) val.string_value.str + val.string_value.length || if (end != (char*) val.x.string.value.str + val.x.string.value.length ||
error) error)
{ {
char buff[80]; char buff[80];
strmake(buff, val.string_value.str, min(sizeof(buff)-1, strmake(buff, val.x.string.value.str, min(sizeof(buff)-1,
val.string_value.length)); val.x.string.value.length));
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN, push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
ER_BAD_DATA, ER_BAD_DATA,
ER(ER_BAD_DATA), ER(ER_BAD_DATA),
...@@ -4088,13 +4088,13 @@ double Item_dyncol_get::val_real() ...@@ -4088,13 +4088,13 @@ double Item_dyncol_get::val_real()
{ {
double res; double res;
/* This will always succeed */ /* This will always succeed */
decimal2double(&val.decimal_value, &res); decimal2double(&val.x.decimal.value, &res);
return res; return res;
} }
case DYN_COL_DATETIME: case DYN_COL_DATETIME:
case DYN_COL_DATE: case DYN_COL_DATE:
case DYN_COL_TIME: case DYN_COL_TIME:
return TIME_to_double(&val.time_value); return TIME_to_double(&val.x.time_value);
} }
null: null:
...@@ -4116,22 +4116,22 @@ my_decimal *Item_dyncol_get::val_decimal(my_decimal *decimal_value) ...@@ -4116,22 +4116,22 @@ my_decimal *Item_dyncol_get::val_decimal(my_decimal *decimal_value)
case DYN_COL_NULL: case DYN_COL_NULL:
goto null; goto null;
case DYN_COL_UINT: case DYN_COL_UINT:
int2my_decimal(E_DEC_FATAL_ERROR, val.long_value, TRUE, decimal_value); int2my_decimal(E_DEC_FATAL_ERROR, val.x.long_value, TRUE, decimal_value);
break; break;
case DYN_COL_INT: case DYN_COL_INT:
int2my_decimal(E_DEC_FATAL_ERROR, val.long_value, FALSE, decimal_value); int2my_decimal(E_DEC_FATAL_ERROR, val.x.long_value, FALSE, decimal_value);
break; break;
case DYN_COL_DOUBLE: case DYN_COL_DOUBLE:
double2my_decimal(E_DEC_FATAL_ERROR, val.double_value, decimal_value); double2my_decimal(E_DEC_FATAL_ERROR, val.x.double_value, decimal_value);
break; break;
case DYN_COL_STRING: case DYN_COL_STRING:
{ {
int rc; int rc;
rc= str2my_decimal(0, val.string_value.str, val.string_value.length, rc= str2my_decimal(0, val.x.string.value.str, val.x.string.value.length,
val.charset, decimal_value); val.x.string.charset, decimal_value);
char buff[80]; char buff[80];
strmake(buff, val.string_value.str, min(sizeof(buff)-1, strmake(buff, val.x.string.value.str, min(sizeof(buff)-1,
val.string_value.length)); val.x.string.value.length));
if (rc != E_DEC_OK) if (rc != E_DEC_OK)
{ {
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN, push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
...@@ -4142,14 +4142,14 @@ my_decimal *Item_dyncol_get::val_decimal(my_decimal *decimal_value) ...@@ -4142,14 +4142,14 @@ my_decimal *Item_dyncol_get::val_decimal(my_decimal *decimal_value)
break; break;
} }
case DYN_COL_DECIMAL: case DYN_COL_DECIMAL:
decimal2my_decimal(&val.decimal_value, decimal_value); decimal2my_decimal(&val.x.decimal.value, decimal_value);
break; break;
case DYN_COL_DATETIME: case DYN_COL_DATETIME:
case DYN_COL_DATE: case DYN_COL_DATE:
case DYN_COL_TIME: case DYN_COL_TIME:
decimal_value= seconds2my_decimal(val.time_value.neg, decimal_value= seconds2my_decimal(val.x.time_value.neg,
TIME_to_ulonglong(&val.time_value), TIME_to_ulonglong(&val.x.time_value),
val.time_value.second_part, val.x.time_value.second_part,
decimal_value); decimal_value);
break; break;
} }
...@@ -4178,36 +4178,36 @@ bool Item_dyncol_get::get_date(MYSQL_TIME *ltime, uint fuzzy_date) ...@@ -4178,36 +4178,36 @@ bool Item_dyncol_get::get_date(MYSQL_TIME *ltime, uint fuzzy_date)
signed_value= 1; // For error message signed_value= 1; // For error message
/* fall_trough */ /* fall_trough */
case DYN_COL_UINT: case DYN_COL_UINT:
if (signed_value || val.ulong_value <= LONGLONG_MAX) if (signed_value || val.x.ulong_value <= LONGLONG_MAX)
{ {
if (int_to_datetime_with_warn(val.ulong_value, ltime, fuzzy_date, if (int_to_datetime_with_warn(val.x.ulong_value, ltime, fuzzy_date,
0 /* TODO */)) 0 /* TODO */))
goto null; goto null;
return 0; return 0;
} }
/* let double_to_datetime_with_warn() issue the warning message */ /* let double_to_datetime_with_warn() issue the warning message */
val.double_value= static_cast<double>(ULONGLONG_MAX); val.x.double_value= static_cast<double>(ULONGLONG_MAX);
/* fall_trough */ /* fall_trough */
case DYN_COL_DOUBLE: case DYN_COL_DOUBLE:
if (double_to_datetime_with_warn(val.double_value, ltime, fuzzy_date, if (double_to_datetime_with_warn(val.x.double_value, ltime, fuzzy_date,
0 /* TODO */)) 0 /* TODO */))
goto null; goto null;
return 0; return 0;
case DYN_COL_DECIMAL: case DYN_COL_DECIMAL:
if (decimal_to_datetime_with_warn((my_decimal*)&val.decimal_value, ltime, if (decimal_to_datetime_with_warn((my_decimal*)&val.x.decimal.value, ltime,
fuzzy_date, 0 /* TODO */)) fuzzy_date, 0 /* TODO */))
goto null; goto null;
return 0; return 0;
case DYN_COL_STRING: case DYN_COL_STRING:
if (str_to_datetime_with_warn(val.string_value.str, if (str_to_datetime_with_warn(val.x.string.value.str,
val.string_value.length, val.x.string.value.length,
ltime, fuzzy_date) <= MYSQL_TIMESTAMP_ERROR) ltime, fuzzy_date) <= MYSQL_TIMESTAMP_ERROR)
goto null; goto null;
return 0; return 0;
case DYN_COL_DATETIME: case DYN_COL_DATETIME:
case DYN_COL_DATE: case DYN_COL_DATE:
case DYN_COL_TIME: case DYN_COL_TIME:
*ltime= val.time_value; *ltime= val.x.time_value;
return 0; return 0;
} }
......
...@@ -61,7 +61,7 @@ void test_value_single_uint(ulonglong num, const char *name) ...@@ -61,7 +61,7 @@ void test_value_single_uint(ulonglong num, const char *name)
DYNAMIC_COLUMN str; DYNAMIC_COLUMN str;
/* init values */ /* init values */
val.type= DYN_COL_UINT; val.type= DYN_COL_UINT;
val.ulong_value= num; val.x.ulong_value= num;
dynamic_column_value_init(&res); dynamic_column_value_init(&res);
/* create column */ /* create column */
if (dynamic_column_create(&str, 1, &val)) if (dynamic_column_create(&str, 1, &val))
...@@ -70,8 +70,8 @@ void test_value_single_uint(ulonglong num, const char *name) ...@@ -70,8 +70,8 @@ void test_value_single_uint(ulonglong num, const char *name)
/* read column */ /* read column */
if (dynamic_column_get(&str, 1, &res)) if (dynamic_column_get(&str, 1, &res))
goto err; goto err;
rc= (res.type == DYN_COL_UINT) && (res.ulong_value == num); rc= (res.type == DYN_COL_UINT) && (res.x.ulong_value == num);
num= res.ulong_value; num= res.x.ulong_value;
err: err:
ok(rc, "%s - %llu", name, num); ok(rc, "%s - %llu", name, num);
/* cleanup */ /* cleanup */
...@@ -85,7 +85,7 @@ void test_value_single_sint(longlong num, const char *name) ...@@ -85,7 +85,7 @@ void test_value_single_sint(longlong num, const char *name)
DYNAMIC_COLUMN str; DYNAMIC_COLUMN str;
/* init values */ /* init values */
val.type= DYN_COL_INT; val.type= DYN_COL_INT;
val.long_value= num; val.x.long_value= num;
dynamic_column_value_init(&res); dynamic_column_value_init(&res);
/* create column */ /* create column */
if (dynamic_column_create(&str, 1, &val)) if (dynamic_column_create(&str, 1, &val))
...@@ -94,8 +94,8 @@ void test_value_single_sint(longlong num, const char *name) ...@@ -94,8 +94,8 @@ void test_value_single_sint(longlong num, const char *name)
/* read column */ /* read column */
if (dynamic_column_get(&str, 1, &res)) if (dynamic_column_get(&str, 1, &res))
goto err; goto err;
rc= (res.type == DYN_COL_INT) && (res.long_value == num); rc= (res.type == DYN_COL_INT) && (res.x.long_value == num);
num= res.ulong_value; num= res.x.ulong_value;
err: err:
ok(rc, "%s - %lld", name, num); ok(rc, "%s - %lld", name, num);
/* cleanup */ /* cleanup */
...@@ -110,7 +110,7 @@ void test_value_single_double(double num, const char *name) ...@@ -110,7 +110,7 @@ void test_value_single_double(double num, const char *name)
DYNAMIC_COLUMN str; DYNAMIC_COLUMN str;
/* init values */ /* init values */
val.type= DYN_COL_DOUBLE; val.type= DYN_COL_DOUBLE;
val.double_value= num; val.x.double_value= num;
dynamic_column_value_init(&res); dynamic_column_value_init(&res);
/* create column */ /* create column */
if (dynamic_column_create(&str, 1, &val)) if (dynamic_column_create(&str, 1, &val))
...@@ -119,8 +119,8 @@ void test_value_single_double(double num, const char *name) ...@@ -119,8 +119,8 @@ void test_value_single_double(double num, const char *name)
/* read column */ /* read column */
if (dynamic_column_get(&str, 1, &res)) if (dynamic_column_get(&str, 1, &res))
goto err; goto err;
rc= (res.type == DYN_COL_DOUBLE) && (res.double_value == num); rc= (res.type == DYN_COL_DOUBLE) && (res.x.double_value == num);
num= res.ulong_value; num= res.x.ulong_value;
err: err:
ok(rc, "%s - %lf", name, num); ok(rc, "%s - %lf", name, num);
/* cleanup */ /* cleanup */
...@@ -138,7 +138,7 @@ void test_value_single_decimal(const char *num) ...@@ -138,7 +138,7 @@ void test_value_single_decimal(const char *num)
/* init values */ /* init values */
dynamic_column_prepare_decimal(&val); // special procedure for decimal!!! dynamic_column_prepare_decimal(&val); // special procedure for decimal!!!
if (string2decimal(num, &val.decimal_value, &end) != E_DEC_OK) if (string2decimal(num, &val.x.decimal.value, &end) != E_DEC_OK)
goto err; goto err;
dynamic_column_value_init(&res); dynamic_column_value_init(&res);
...@@ -150,8 +150,8 @@ void test_value_single_decimal(const char *num) ...@@ -150,8 +150,8 @@ void test_value_single_decimal(const char *num)
if (dynamic_column_get(&str, 1, &res)) if (dynamic_column_get(&str, 1, &res))
goto err; goto err;
rc= ((res.type == DYN_COL_DECIMAL) && rc= ((res.type == DYN_COL_DECIMAL) &&
(decimal_cmp(&res.decimal_value, &val.decimal_value) == 0)); (decimal_cmp(&res.x.decimal.value, &val.x.decimal.value) == 0));
decimal2string(&res.decimal_value, buff, &length, 0, 0, ' '); decimal2string(&res.x.decimal.value, buff, &length, 0, 0, ' ');
err: err:
ok(rc, "%s - %s", num, buff); ok(rc, "%s - %s", num, buff);
/* cleanup */ /* cleanup */
...@@ -211,9 +211,9 @@ void test_value_single_string(const char *string, size_t len, ...@@ -211,9 +211,9 @@ void test_value_single_string(const char *string, size_t len,
/* init values */ /* init values */
val.type= DYN_COL_STRING; val.type= DYN_COL_STRING;
val.string_value.str= (char*)string; val.x.string.value.str= (char*)string;
val.string_value.length= len; val.x.string.value.length= len;
val.charset= cs; val.x.string.charset= cs;
dynamic_column_value_init(&res); dynamic_column_value_init(&res);
/* create column */ /* create column */
...@@ -224,15 +224,15 @@ void test_value_single_string(const char *string, size_t len, ...@@ -224,15 +224,15 @@ void test_value_single_string(const char *string, size_t len,
if (dynamic_column_get(&str, 1, &res)) if (dynamic_column_get(&str, 1, &res))
goto err; goto err;
rc= ((res.type == DYN_COL_STRING) && rc= ((res.type == DYN_COL_STRING) &&
(res.string_value.length == len) && (res.x.string.value.length == len) &&
(memcmp(res.string_value.str, string, len) == 0) && (memcmp(res.x.string.value.str, string, len) == 0) &&
(res.charset->number == cs->number)); (res.x.string.charset->number == cs->number));
err: err:
ok(rc, "'%s' - '%s' %u %u-%s", string, ok(rc, "'%s' - '%s' %u %u-%s", string,
res.string_value.str, (uint)res.string_value.length, res.x.string.value.str, (uint)res.x.string.value.length,
(uint)res.charset->number, res.charset->name); (uint)res.x.string.charset->number, res.x.string.charset->name);
/* cleanup */ /* cleanup */
val.string_value.str= NULL; // we did not allocated it val.x.string.value.str= NULL; // we did not allocated it
dynamic_column_column_free(&str); dynamic_column_column_free(&str);
} }
...@@ -243,10 +243,10 @@ void test_value_single_date(uint year, uint month, uint day, const char *name) ...@@ -243,10 +243,10 @@ void test_value_single_date(uint year, uint month, uint day, const char *name)
DYNAMIC_COLUMN str; DYNAMIC_COLUMN str;
/* init values */ /* init values */
val.type= DYN_COL_DATE; val.type= DYN_COL_DATE;
val.time_value.time_type= MYSQL_TIMESTAMP_DATE; val.x.time_value.time_type= MYSQL_TIMESTAMP_DATE;
val.time_value.year= year; val.x.time_value.year= year;
val.time_value.month= month; val.x.time_value.month= month;
val.time_value.day= day; val.x.time_value.day= day;
dynamic_column_value_init(&res); dynamic_column_value_init(&res);
/* create column */ /* create column */
if (dynamic_column_create(&str, 1, &val)) if (dynamic_column_create(&str, 1, &val))
...@@ -256,10 +256,10 @@ void test_value_single_date(uint year, uint month, uint day, const char *name) ...@@ -256,10 +256,10 @@ void test_value_single_date(uint year, uint month, uint day, const char *name)
if (dynamic_column_get(&str, 1, &res)) if (dynamic_column_get(&str, 1, &res))
goto err; goto err;
rc= ((res.type == DYN_COL_DATE) && rc= ((res.type == DYN_COL_DATE) &&
(res.time_value.time_type == MYSQL_TIMESTAMP_DATE) && (res.x.time_value.time_type == MYSQL_TIMESTAMP_DATE) &&
(res.time_value.year == year) && (res.x.time_value.year == year) &&
(res.time_value.month == month) && (res.x.time_value.month == month) &&
(res.time_value.day == day)); (res.x.time_value.day == day));
err: err:
ok(rc, "%s - %04u-%02u-%02u", name, year, month, day); ok(rc, "%s - %04u-%02u-%02u", name, year, month, day);
/* cleanup */ /* cleanup */
...@@ -274,12 +274,12 @@ void test_value_single_time(uint neg, uint hour, uint minute, uint second, ...@@ -274,12 +274,12 @@ void test_value_single_time(uint neg, uint hour, uint minute, uint second,
DYNAMIC_COLUMN str; DYNAMIC_COLUMN str;
/* init values */ /* init values */
val.type= DYN_COL_TIME; val.type= DYN_COL_TIME;
val.time_value.time_type= MYSQL_TIMESTAMP_TIME; val.x.time_value.time_type= MYSQL_TIMESTAMP_TIME;
val.time_value.neg= neg; val.x.time_value.neg= neg;
val.time_value.hour= hour; val.x.time_value.hour= hour;
val.time_value.minute= minute; val.x.time_value.minute= minute;
val.time_value.second= second; val.x.time_value.second= second;
val.time_value.second_part= mic; val.x.time_value.second_part= mic;
dynamic_column_value_init(&res); dynamic_column_value_init(&res);
/* create column */ /* create column */
if (dynamic_column_create(&str, 1, &val)) if (dynamic_column_create(&str, 1, &val))
...@@ -289,12 +289,12 @@ void test_value_single_time(uint neg, uint hour, uint minute, uint second, ...@@ -289,12 +289,12 @@ void test_value_single_time(uint neg, uint hour, uint minute, uint second,
if (dynamic_column_get(&str, 1, &res)) if (dynamic_column_get(&str, 1, &res))
goto err; goto err;
rc= ((res.type == DYN_COL_TIME) && rc= ((res.type == DYN_COL_TIME) &&
(res.time_value.time_type == MYSQL_TIMESTAMP_TIME) && (res.x.time_value.time_type == MYSQL_TIMESTAMP_TIME) &&
(res.time_value.neg == (int)neg) && (res.x.time_value.neg == (int)neg) &&
(res.time_value.hour == hour) && (res.x.time_value.hour == hour) &&
(res.time_value.minute == minute) && (res.x.time_value.minute == minute) &&
(res.time_value.second == second) && (res.x.time_value.second == second) &&
(res.time_value.second_part == mic)); (res.x.time_value.second_part == mic));
err: err:
ok(rc, "%s - %c%02u:%02u:%02u.%06u", name, (neg ? '-' : '+'), ok(rc, "%s - %c%02u:%02u:%02u.%06u", name, (neg ? '-' : '+'),
hour, minute, second, mic); hour, minute, second, mic);
...@@ -312,15 +312,15 @@ void test_value_single_datetime(uint neg, uint year, uint month, uint day, ...@@ -312,15 +312,15 @@ void test_value_single_datetime(uint neg, uint year, uint month, uint day,
DYNAMIC_COLUMN str; DYNAMIC_COLUMN str;
/* init values */ /* init values */
val.type= DYN_COL_DATETIME; val.type= DYN_COL_DATETIME;
val.time_value.time_type= MYSQL_TIMESTAMP_DATETIME; val.x.time_value.time_type= MYSQL_TIMESTAMP_DATETIME;
val.time_value.neg= neg; val.x.time_value.neg= neg;
val.time_value.year= year; val.x.time_value.year= year;
val.time_value.month= month; val.x.time_value.month= month;
val.time_value.day= day; val.x.time_value.day= day;
val.time_value.hour= hour; val.x.time_value.hour= hour;
val.time_value.minute= minute; val.x.time_value.minute= minute;
val.time_value.second= second; val.x.time_value.second= second;
val.time_value.second_part= mic; val.x.time_value.second_part= mic;
dynamic_column_value_init(&res); dynamic_column_value_init(&res);
/* create column */ /* create column */
if (dynamic_column_create(&str, 1, &val)) if (dynamic_column_create(&str, 1, &val))
...@@ -330,15 +330,15 @@ void test_value_single_datetime(uint neg, uint year, uint month, uint day, ...@@ -330,15 +330,15 @@ void test_value_single_datetime(uint neg, uint year, uint month, uint day,
if (dynamic_column_get(&str, 1, &res)) if (dynamic_column_get(&str, 1, &res))
goto err; goto err;
rc= ((res.type == DYN_COL_DATETIME) && rc= ((res.type == DYN_COL_DATETIME) &&
(res.time_value.time_type == MYSQL_TIMESTAMP_DATETIME) && (res.x.time_value.time_type == MYSQL_TIMESTAMP_DATETIME) &&
(res.time_value.neg == (int)neg) && (res.x.time_value.neg == (int)neg) &&
(res.time_value.year == year) && (res.x.time_value.year == year) &&
(res.time_value.month == month) && (res.x.time_value.month == month) &&
(res.time_value.day == day) && (res.x.time_value.day == day) &&
(res.time_value.hour == hour) && (res.x.time_value.hour == hour) &&
(res.time_value.minute == minute) && (res.x.time_value.minute == minute) &&
(res.time_value.second == second) && (res.x.time_value.second == second) &&
(res.time_value.second_part == mic)); (res.x.time_value.second_part == mic));
err: err:
ok(rc, "%s - %c %04u-%02u-%02u %02u:%02u:%02u.%06u", name, (neg ? '-' : '+'), ok(rc, "%s - %c %04u-%02u-%02u %02u:%02u:%02u.%06u", name, (neg ? '-' : '+'),
year, month, day, hour, minute, second, mic); year, month, day, hour, minute, second, mic);
...@@ -368,40 +368,40 @@ void test_value_multi(ulonglong num0, ...@@ -368,40 +368,40 @@ void test_value_multi(ulonglong num0,
DYNAMIC_COLUMN str; DYNAMIC_COLUMN str;
/* init values */ /* init values */
val[0].type= DYN_COL_UINT; val[0].type= DYN_COL_UINT;
val[0].ulong_value= num0; val[0].x.ulong_value= num0;
val[1].type= DYN_COL_INT; val[1].type= DYN_COL_INT;
val[1].long_value= num1; val[1].x.long_value= num1;
val[2].type= DYN_COL_DOUBLE; val[2].type= DYN_COL_DOUBLE;
val[2].double_value= num2; val[2].x.double_value= num2;
dynamic_column_prepare_decimal(val + 3); // special procedure for decimal!!! dynamic_column_prepare_decimal(val + 3); // special procedure for decimal!!!
if (string2decimal(num3, &val[3].decimal_value, &end3) != E_DEC_OK) if (string2decimal(num3, &val[3].x.decimal.value, &end3) != E_DEC_OK)
goto err; goto err;
val[4].type= DYN_COL_STRING; val[4].type= DYN_COL_STRING;
val[4].string_value.str= (char*)string4; val[4].x.string.value.str= (char*)string4;
val[4].string_value.length= len4; val[4].x.string.value.length= len4;
val[4].charset= cs4; val[4].x.string.charset= cs4;
val[5].type= DYN_COL_DATE; val[5].type= DYN_COL_DATE;
val[5].time_value.time_type= MYSQL_TIMESTAMP_DATE; val[5].x.time_value.time_type= MYSQL_TIMESTAMP_DATE;
val[5].time_value.year= year5; val[5].x.time_value.year= year5;
val[5].time_value.month= month5; val[5].x.time_value.month= month5;
val[5].time_value.day= day5; val[5].x.time_value.day= day5;
val[6].type= DYN_COL_TIME; val[6].type= DYN_COL_TIME;
val[6].time_value.time_type= MYSQL_TIMESTAMP_TIME; val[6].x.time_value.time_type= MYSQL_TIMESTAMP_TIME;
val[6].time_value.neg= neg6; val[6].x.time_value.neg= neg6;
val[6].time_value.hour= hour6; val[6].x.time_value.hour= hour6;
val[6].time_value.minute= minute6; val[6].x.time_value.minute= minute6;
val[6].time_value.second= second6; val[6].x.time_value.second= second6;
val[6].time_value.second_part= mic6; val[6].x.time_value.second_part= mic6;
val[7].type= DYN_COL_DATETIME; val[7].type= DYN_COL_DATETIME;
val[7].time_value.time_type= MYSQL_TIMESTAMP_DATETIME; val[7].x.time_value.time_type= MYSQL_TIMESTAMP_DATETIME;
val[7].time_value.neg= neg7; val[7].x.time_value.neg= neg7;
val[7].time_value.year= year7; val[7].x.time_value.year= year7;
val[7].time_value.month= month7; val[7].x.time_value.month= month7;
val[7].time_value.day= day7; val[7].x.time_value.day= day7;
val[7].time_value.hour= hour7; val[7].x.time_value.hour= hour7;
val[7].time_value.minute= minute7; val[7].x.time_value.minute= minute7;
val[7].time_value.second= second7; val[7].x.time_value.second= second7;
val[7].time_value.second_part= mic7; val[7].x.time_value.second_part= mic7;
val[8].type= DYN_COL_NULL; val[8].type= DYN_COL_NULL;
for (i= 0; i < 9; i++) for (i= 0; i < 9; i++)
dynamic_column_value_init(res + i); dynamic_column_value_init(res + i);
...@@ -414,44 +414,44 @@ void test_value_multi(ulonglong num0, ...@@ -414,44 +414,44 @@ void test_value_multi(ulonglong num0,
if (dynamic_column_get(&str, column_numbers[i], res + i)) if (dynamic_column_get(&str, column_numbers[i], res + i))
goto err; goto err;
rc= ((res[0].type == DYN_COL_UINT) && rc= ((res[0].type == DYN_COL_UINT) &&
(res[0].ulong_value == num0) && (res[0].x.ulong_value == num0) &&
(res[1].type == DYN_COL_INT) && (res[1].type == DYN_COL_INT) &&
(res[1].long_value == num1) && (res[1].x.long_value == num1) &&
(res[2].type == DYN_COL_DOUBLE) && (res[2].type == DYN_COL_DOUBLE) &&
(res[2].double_value == num2) && (res[2].x.double_value == num2) &&
(res[3].type == DYN_COL_DECIMAL) && (res[3].type == DYN_COL_DECIMAL) &&
(decimal_cmp(&res[3].decimal_value, &val[3].decimal_value) == 0) && (decimal_cmp(&res[3].x.decimal.value, &val[3].x.decimal.value) == 0) &&
(res[4].type == DYN_COL_STRING) && (res[4].type == DYN_COL_STRING) &&
(res[4].string_value.length == len4) && (res[4].x.string.value.length == len4) &&
(memcmp(res[4].string_value.str, string4, len4) == 0) && (memcmp(res[4].x.string.value.str, string4, len4) == 0) &&
(res[4].charset->number == cs4->number) && (res[4].x.string.charset->number == cs4->number) &&
(res[5].type == DYN_COL_DATE) && (res[5].type == DYN_COL_DATE) &&
(res[5].time_value.time_type == MYSQL_TIMESTAMP_DATE) && (res[5].x.time_value.time_type == MYSQL_TIMESTAMP_DATE) &&
(res[5].time_value.year == year5) && (res[5].x.time_value.year == year5) &&
(res[5].time_value.month == month5) && (res[5].x.time_value.month == month5) &&
(res[5].time_value.day == day5) && (res[5].x.time_value.day == day5) &&
(res[6].type == DYN_COL_TIME) && (res[6].type == DYN_COL_TIME) &&
(res[6].time_value.time_type == MYSQL_TIMESTAMP_TIME) && (res[6].x.time_value.time_type == MYSQL_TIMESTAMP_TIME) &&
(res[6].time_value.neg == (int)neg6) && (res[6].x.time_value.neg == (int)neg6) &&
(res[6].time_value.hour == hour6) && (res[6].x.time_value.hour == hour6) &&
(res[6].time_value.minute == minute6) && (res[6].x.time_value.minute == minute6) &&
(res[6].time_value.second == second6) && (res[6].x.time_value.second == second6) &&
(res[6].time_value.second_part == mic6) && (res[6].x.time_value.second_part == mic6) &&
(res[7].type == DYN_COL_DATETIME) && (res[7].type == DYN_COL_DATETIME) &&
(res[7].time_value.time_type == MYSQL_TIMESTAMP_DATETIME) && (res[7].x.time_value.time_type == MYSQL_TIMESTAMP_DATETIME) &&
(res[7].time_value.neg == (int)neg7) && (res[7].x.time_value.neg == (int)neg7) &&
(res[7].time_value.year == year7) && (res[7].x.time_value.year == year7) &&
(res[7].time_value.month == month7) && (res[7].x.time_value.month == month7) &&
(res[7].time_value.day == day7) && (res[7].x.time_value.day == day7) &&
(res[7].time_value.hour == hour7) && (res[7].x.time_value.hour == hour7) &&
(res[7].time_value.minute == minute7) && (res[7].x.time_value.minute == minute7) &&
(res[7].time_value.second == second7) && (res[7].x.time_value.second == second7) &&
(res[7].time_value.second_part == mic7) && (res[7].x.time_value.second_part == mic7) &&
(res[8].type == DYN_COL_NULL)); (res[8].type == DYN_COL_NULL));
err: err:
ok(rc, "%s", name); ok(rc, "%s", name);
/* cleanup */ /* cleanup */
val[4].string_value.str= NULL; // we did not allocated it val[4].x.string.value.str= NULL; // we did not allocated it
dynamic_column_column_free(&str); dynamic_column_column_free(&str);
} }
...@@ -486,13 +486,13 @@ void test_update_multi(uint *column_numbers, uint *column_values, ...@@ -486,13 +486,13 @@ void test_update_multi(uint *column_numbers, uint *column_values,
DYNAMIC_COLUMN_VALUE val; DYNAMIC_COLUMN_VALUE val;
val.type= DYN_COL_UINT; val.type= DYN_COL_UINT;
val.ulong_value= column_values[0]; val.x.ulong_value= column_values[0];
if (dynamic_column_create(&str, column_numbers[0], &val)) if (dynamic_column_create(&str, column_numbers[0], &val))
goto err; goto err;
for (i= 1; i < all; i++) for (i= 1; i < all; i++)
{ {
val.type= (null_values[i] ? DYN_COL_NULL : DYN_COL_UINT); val.type= (null_values[i] ? DYN_COL_NULL : DYN_COL_UINT);
val.ulong_value= column_values[i]; val.x.ulong_value= column_values[i];
if (dynamic_column_update(&str, column_numbers[i], &val)) if (dynamic_column_update(&str, column_numbers[i], &val))
goto err; goto err;
...@@ -510,7 +510,7 @@ void test_update_multi(uint *column_numbers, uint *column_values, ...@@ -510,7 +510,7 @@ void test_update_multi(uint *column_numbers, uint *column_values,
else else
{ {
if (val.type != DYN_COL_UINT || if (val.type != DYN_COL_UINT ||
val.ulong_value != column_values[j] || val.x.ulong_value != column_values[j] ||
dynamic_column_exists(&str, column_numbers[j]) == ER_DYNCOL_NO) dynamic_column_exists(&str, column_numbers[j]) == ER_DYNCOL_NO)
goto err; goto err;
} }
...@@ -582,12 +582,12 @@ void test_empty_string() ...@@ -582,12 +582,12 @@ void test_empty_string()
"%s", "empty list"); "%s", "empty list");
val.type= DYN_COL_UINT; val.type= DYN_COL_UINT;
val.ulong_value= 1212; val.x.ulong_value= 1212;
rc= dynamic_column_update(&str, 1, &val); rc= dynamic_column_update(&str, 1, &val);
if (rc == ER_DYNCOL_OK) if (rc == ER_DYNCOL_OK)
rc= dynamic_column_get(&str, 1, &res); rc= dynamic_column_get(&str, 1, &res);
ok( (rc == ER_DYNCOL_OK) && ok( (rc == ER_DYNCOL_OK) &&
(res.type == DYN_COL_UINT) && (res.ulong_value == val.ulong_value), (res.type == DYN_COL_UINT) && (res.x.ulong_value == val.x.ulong_value),
"%s", "empty update"); "%s", "empty update");
} }
...@@ -616,7 +616,7 @@ void test_update_many(uint *column_numbers, uint *column_values, ...@@ -616,7 +616,7 @@ void test_update_many(uint *column_numbers, uint *column_values,
for (i= 0; i < column_count; i++) for (i= 0; i < column_count; i++)
{ {
val[i].type= DYN_COL_UINT; val[i].type= DYN_COL_UINT;
val[i].ulong_value= column_values[i]; val[i].x.ulong_value= column_values[i];
} }
for (i= 0; i < update_count; i++) for (i= 0; i < update_count; i++)
{ {
...@@ -625,13 +625,13 @@ void test_update_many(uint *column_numbers, uint *column_values, ...@@ -625,13 +625,13 @@ void test_update_many(uint *column_numbers, uint *column_values,
else else
{ {
upd[i].type= DYN_COL_UINT; upd[i].type= DYN_COL_UINT;
upd[i].ulong_value= update_values[i]; upd[i].x.ulong_value= update_values[i];
} }
} }
for (i= 0; i < result_count; i++) for (i= 0; i < result_count; i++)
{ {
res[i].type= DYN_COL_UINT; res[i].type= DYN_COL_UINT;
res[i].ulong_value= result_values[i]; res[i].x.ulong_value= result_values[i];
} }
if (dynamic_column_create_many(&str1, column_count, column_numbers, val)) if (dynamic_column_create_many(&str1, column_count, column_numbers, val))
goto err; goto err;
......
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