summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <vva@eagle.mysql.r18.ru>2003-09-24 19:30:20 -0400
committerunknown <vva@eagle.mysql.r18.ru>2003-09-24 19:30:20 -0400
commit2d9e4e66981844fec25185660f9164b49fc58126 (patch)
tree3ce78e3ce7a515bd5c583a459bec1fdd3e7e6a35
parentf46ca5fbe905caa7efb3f3cafdbdcc7c0f83a2b0 (diff)
downloadmariadb-git-2d9e4e66981844fec25185660f9164b49fc58126.tar.gz
fixed bug #1194
(changes in Item_func_set_user_var::update, ::val, ::val_str, ::val_int) mysql-test/r/user_var.result: added tests for bug #1194 mysql-test/t/user_var.test: added tests for bug #1194
-rw-r--r--mysql-test/r/user_var.result32
-rw-r--r--mysql-test/t/user_var.test19
-rw-r--r--sql/item_func.cc119
3 files changed, 153 insertions, 17 deletions
diff --git a/mysql-test/r/user_var.result b/mysql-test/r/user_var.result
index 67e55acb29b..d94ab6f57c3 100644
--- a/mysql-test/r/user_var.result
+++ b/mysql-test/r/user_var.result
@@ -42,3 +42,35 @@ select @a:=10, @b:=2, @a > @b, @a < @b;
select @a:="10", @b:="2", @a > @b, @a < @b;
@a:="10" @b:="2" @a > @b @a < @b
10 2 0 1
+select @a:=1;
+@a:=1
+1
+select @a, @a:=1;
+@a @a:=1
+1 1
+create table t1 (id int);
+insert into t1 values (1);
+select @c:=0;
+@c:=0
+0
+update t1 SET id=(@c:=@c+1);
+select @c;
+@c
+1
+select @c:=0;
+@c:=0
+0
+update t1 set id=(@c:=@c+1);
+select @c;
+@c
+1
+select @c:=0;
+@c:=0
+0
+select @c:=@c+1;
+@c:=@c+1
+1
+drop table t1;
+select @a:=10, @b:=2, @a>@b, @a:="10", @b:="2", @a>@b, @a:=10, @b:=2, @a>@b, @a:="10", @b:="2", @a>@b;
+@a:=10 @b:=2 @a>@b @a:="10" @b:="2" @a>@b @a:=10 @b:=2 @a>@b @a:="10" @b:="2" @a>@b
+10 2 1 10 2 0 10 2 1 10 2 0
diff --git a/mysql-test/t/user_var.test b/mysql-test/t/user_var.test
index f5f91a8a680..1e466c149bb 100644
--- a/mysql-test/t/user_var.test
+++ b/mysql-test/t/user_var.test
@@ -23,3 +23,22 @@ select @a:=10, @b:=1, @a > @b, @a < @b;
select @a:="10", @b:="1", @a > @b, @a < @b;
select @a:=10, @b:=2, @a > @b, @a < @b;
select @a:="10", @b:="2", @a > @b, @a < @b;
+
+# Fixed bug #1194
+select @a:=1;
+select @a, @a:=1;
+
+create table t1 (id int);
+insert into t1 values (1);
+select @c:=0;
+update t1 SET id=(@c:=@c+1);
+select @c;
+select @c:=0;
+update t1 set id=(@c:=@c+1);
+select @c;
+select @c:=0;
+select @c:=@c+1;
+drop table t1;
+
+# just fof fun :)
+select @a:=10, @b:=2, @a>@b, @a:="10", @b:="2", @a>@b, @a:=10, @b:=2, @a>@b, @a:="10", @b:="2", @a>@b; \ No newline at end of file
diff --git a/sql/item_func.cc b/sql/item_func.cc
index 3b1a35e4d08..10f267b766d 100644
--- a/sql/item_func.cc
+++ b/sql/item_func.cc
@@ -1903,48 +1903,132 @@ void Item_func_set_user_var::update_hash(void *ptr, uint length,
bool
Item_func_set_user_var::update()
{
+ DBUG_ENTER("Item_func_set_user_var::update");
switch (cached_result_type) {
case REAL_RESULT:
- (void) val();
+ {
+ double value=args[0]->val();
+ update_hash((void*) &value,sizeof(value), REAL_RESULT);
break;
+ }
case INT_RESULT:
- (void) val_int();
+ {
+ longlong value=args[0]->val_int();
+ update_hash((void*) &value,sizeof(longlong),INT_RESULT);
break;
+ }
case STRING_RESULT:
+ {
char buffer[MAX_FIELD_WIDTH];
String tmp(buffer,sizeof(buffer));
- (void) val_str(&tmp);
+ String *res=args[0]->val_str(&tmp);
+ if (!res) // Null value
+ update_hash((void*) 0,0,STRING_RESULT);
+ else
+ update_hash(res->c_ptr(),res->length()+1,STRING_RESULT);
break;
}
- return current_thd->fatal_error;
+ }
+ DBUG_RETURN(current_thd->fatal_error);
}
double
Item_func_set_user_var::val()
{
- double value=args[0]->val();
- update_hash((void*) &value,sizeof(value), REAL_RESULT);
- return value;
+ DBUG_ENTER("Item_func_set_user_var::val");
+ switch (cached_result_type) {
+ case REAL_RESULT:
+ {
+ double value=args[0]->val();
+ update_hash((void*) &value,sizeof(value), REAL_RESULT);
+ return value;
+ }
+ case INT_RESULT:
+ {
+ longlong value=args[0]->val_int();
+ update_hash((void*) &value,sizeof(longlong),INT_RESULT);
+ return value;
+ }
+ case STRING_RESULT:
+ {
+ char buffer[MAX_FIELD_WIDTH];
+ String tmp(buffer,sizeof(buffer));
+ String *res=args[0]->val_str(&tmp);
+ if (!res) // Null value
+ update_hash((void*) 0,0,STRING_RESULT);
+ else
+ update_hash(res->c_ptr(),res->length()+1,STRING_RESULT);
+ return atof(res->c_ptr());
+ }
+ }
+ DBUG_RETURN(args[0]->val());
}
longlong
Item_func_set_user_var::val_int()
{
- longlong value=args[0]->val_int();
- update_hash((void*) &value,sizeof(longlong),INT_RESULT);
- return value;
+ DBUG_ENTER("Item_func_set_user_var::val_int");
+ switch (cached_result_type) {
+ case REAL_RESULT:
+ {
+ double value=args[0]->val();
+ update_hash((void*) &value,sizeof(value), REAL_RESULT);
+ return (longlong)value;
+ }
+ case INT_RESULT:
+ {
+ longlong value=args[0]->val_int();
+ update_hash((void*) &value,sizeof(longlong),INT_RESULT);
+ return value;
+ }
+ case STRING_RESULT:
+ {
+ char buffer[MAX_FIELD_WIDTH];
+ String tmp(buffer,sizeof(buffer));
+ String *res=args[0]->val_str(&tmp);
+ if (!res) // Null value
+ update_hash((void*) 0,0,STRING_RESULT);
+ else
+ update_hash(res->c_ptr(),res->length()+1,STRING_RESULT);
+ return strtoull(res->c_ptr(),NULL,10);
+ }
+ }
+ DBUG_RETURN(args[0]->val_int());
}
String *
Item_func_set_user_var::val_str(String *str)
{
- String *res=args[0]->val_str(str);
- if (!res) // Null value
- update_hash((void*) 0,0,STRING_RESULT);
- else
- update_hash(res->c_ptr(),res->length()+1,STRING_RESULT);
- return res;
+ DBUG_ENTER("Item_func_set_user_var::val_str");
+ switch (cached_result_type) {
+ case REAL_RESULT:
+ {
+ double value=args[0]->val();
+ update_hash((void*) &value,sizeof(value), REAL_RESULT);
+ str->set(value,decimals);
+ return str;
+ }
+ case INT_RESULT:
+ {
+ longlong value=args[0]->val_int();
+ update_hash((void*) &value,sizeof(longlong),INT_RESULT);
+ str->set(value,decimals);
+ return str;
+ }
+ case STRING_RESULT:
+ {
+ char buffer[MAX_FIELD_WIDTH];
+ String tmp(buffer,sizeof(buffer));
+ String *res=args[0]->val_str(&tmp);
+ if (!res) // Null value
+ update_hash((void*) 0,0,STRING_RESULT);
+ else
+ update_hash(res->c_ptr(),res->length()+1,STRING_RESULT);
+ return res;
+ }
+ }
+ DBUG_RETURN(args[0]->val_str(str));
}
@@ -1973,6 +2057,7 @@ user_var_entry *Item_func_get_user_var::get_entry()
String *
Item_func_get_user_var::val_str(String *str)
{
+ DBUG_ENTER("Item_func_get_user_var::val_str");
user_var_entry *entry=get_entry();
if (!entry)
return NULL;
@@ -1991,7 +2076,7 @@ Item_func_get_user_var::val_str(String *str)
}
break;
}
- return str;
+ DBUG_RETURN(str);
}