Bug#36031 Test funcs_1.<engine>_views failing on Windows

The problem is a hack in mysqltest.c::append_field that modifies
the exponential notation of floating point numbers by removing a
zero after the the symbol 'e' (eg: 00001.2e+018 is converted to
00001.2e+18) but does not take into account the zerofill affect
in the start of the string.

The solution is to check if the field was zero filled and insert
a zero at the start of the string if a zero after the exponential
notation symbol is removed.
parent 0c9d8d13
...@@ -5595,7 +5595,7 @@ void fix_win_paths(const char *val, int len) ...@@ -5595,7 +5595,7 @@ void fix_win_paths(const char *val, int len)
*/ */
void append_field(DYNAMIC_STRING *ds, uint col_idx, MYSQL_FIELD* field, void append_field(DYNAMIC_STRING *ds, uint col_idx, MYSQL_FIELD* field,
const char* val, ulonglong len, my_bool is_null) char* val, ulonglong len, my_bool is_null)
{ {
if (col_idx < max_replace_column && replace_column[col_idx]) if (col_idx < max_replace_column && replace_column[col_idx])
{ {
...@@ -5618,9 +5618,18 @@ void append_field(DYNAMIC_STRING *ds, uint col_idx, MYSQL_FIELD* field, ...@@ -5618,9 +5618,18 @@ void append_field(DYNAMIC_STRING *ds, uint col_idx, MYSQL_FIELD* field,
(start[1] == '-' || start[1] == '+') && start[2] == '0') (start[1] == '-' || start[1] == '+') && start[2] == '0')
{ {
start+=2; /* Now points at first '0' */ start+=2; /* Now points at first '0' */
/* Move all chars after the first '0' one step left */ if (field->flags & ZEROFILL_FLAG)
memmove(start, start + 1, strlen(start)); {
len--; /* Move all chars before the first '0' one step right */
memmove(val + 1, val, start - val);
*val= '0';
}
else
{
/* Move all chars after the first '0' one step left */
memmove(start, start + 1, strlen(start));
len--;
}
} }
} }
#endif #endif
...@@ -5659,7 +5668,7 @@ void append_result(DYNAMIC_STRING *ds, MYSQL_RES *res) ...@@ -5659,7 +5668,7 @@ void append_result(DYNAMIC_STRING *ds, MYSQL_RES *res)
lengths = mysql_fetch_lengths(res); lengths = mysql_fetch_lengths(res);
for (i = 0; i < num_fields; i++) for (i = 0; i < num_fields; i++)
append_field(ds, i, &fields[i], append_field(ds, i, &fields[i],
(const char*)row[i], lengths[i], !row[i]); row[i], lengths[i], !row[i]);
if (!display_result_vertically) if (!display_result_vertically)
dynstr_append_mem(ds, "\n", 1); dynstr_append_mem(ds, "\n", 1);
} }
...@@ -5708,7 +5717,7 @@ void append_stmt_result(DYNAMIC_STRING *ds, MYSQL_STMT *stmt, ...@@ -5708,7 +5717,7 @@ void append_stmt_result(DYNAMIC_STRING *ds, MYSQL_STMT *stmt,
while (mysql_stmt_fetch(stmt) == 0) while (mysql_stmt_fetch(stmt) == 0)
{ {
for (i= 0; i < num_fields; i++) for (i= 0; i < num_fields; i++)
append_field(ds, i, &fields[i], (const char *) my_bind[i].buffer, append_field(ds, i, &fields[i], my_bind[i].buffer,
*my_bind[i].length, *my_bind[i].is_null); *my_bind[i].length, *my_bind[i].is_null);
if (!display_result_vertically) if (!display_result_vertically)
dynstr_append_mem(ds, "\n", 1); dynstr_append_mem(ds, "\n", 1);
......
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