| Bug #14518 | wrong results using variables | ||
|---|---|---|---|
| Submitted: | 31 Oct 2005 19:33 | Modified: | 8 Jul 2006 17:25 |
| Reporter: | Marek Woch | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server | Severity: | S2 (Serious) |
| Version: | 5.0.13 | OS: | Windows (Win98SE) |
| Assigned to: | Alexey Botchkov | CPU Architecture: | Any |
[31 Oct 2005 19:33]
Marek Woch
[1 Nov 2005 23:50]
Jorge del Conde
Thank you for your bug report. I was able to reproduce this bug with 5.0.16bk under FC4: jorge-/my/mysql_code> ./main Query: SELECT @a:=23.00 Result: 23.00 Field Type: 246 Query: SELECT @b:=23.50 Result: 23.50 Field Type: 246 Query: SELECT @a Result: 23.00 Field Type: 253 Query: SELECT @b-@a Result: 0.500000000000000000000000000000 Field Type: 246 jorge-/my/mysql_code>
[1 Nov 2005 23:51]
Jorge del Conde
How to repeat:
#include <stdio.h>
#include <mysql.h>
int do_select(MYSQL *mysql, const char *qry)
{
MYSQL_RES *res;
MYSQL_FIELD *field;
MYSQL_ROW row;
if ((mysql_query(mysql, qry) != 0))
return -1;
else
if ((res = mysql_store_result(mysql)))
{
printf("Query: %s\n", qry);
while ((row = mysql_fetch_row(res)))
{
field = mysql_fetch_field(res);
printf ("Result: %s\n", row[0]);
printf ("Field Type: %d\n\n", field->type);
}
mysql_free_result(res);
return 0;
}
return -1;
}
int main ()
{
MYSQL *mysql;
mysql= mysql_init(NULL);
mysql_real_connect(mysql,"localhost","root",NULL,"test",0,NULL,0);
do_select(mysql, "SELECT @a:=23.00"); // field->type == MYSQL_TYPE_NEWDECIMAL
do_select(mysql, "SELECT @b:=23.50"); // field->type == MYSQL_TYPE_NEWDECIMAL
do_select(mysql, "SELECT @a"); // field->type == MYSQL_TYPE_VAR_STRING
do_select(mysql, "SELECT @b-@a"); // field->type == MYSQL_TYPE_NEWDECIMAL
mysql_close(mysql);
return 0;
}
[4 Jul 2006 9:00]
Alexey Botchkov
Marek, I would really appreciate if you can provide the case with that incorrect result.
[4 Jul 2006 9:01]
Alexey Botchkov
i mean 0.49999... as a result of calculations
[4 Jul 2006 9:08]
Alexey Botchkov
It's NOT A BUG actually, but i think we should make sure this fact is mentioned in documentation.
So.
The value of user variable is always returned as VARSTRING.
Here is the comment i found in the source code:
/*
We must always return variables as strings to guard against selects of type
select @t1:=1,@t1,@t:="hello",@t from foo where (@t1:= t2.b)
*/
[7 Jul 2006 19:12]
Paul DuBois
I've noted in the manual that user variables are returned to clients as strings.
[8 Jul 2006 17:25]
Marek Woch
Such a behaviour is not very convenient, but.... It seems to me that the type of a variable should be always the one when was created. In such a way it will be clear and simple:-). Wrong results disappeared when I recreated table (from old decimal type) with a server version 5.0.18
