summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <evgen@moonbone.local>2007-06-02 23:20:54 +0400
committerunknown <evgen@moonbone.local>2007-06-02 23:20:54 +0400
commit7184a5921a07256570705ee6dad158c5e31c9c73 (patch)
tree5fb3743242f46b0f7af1a73d0955e991cc2c49ed
parent211cac244ed87fe799362a47783db82e49de5c0b (diff)
parent26f38860d77732e36af9acef8648ca3cd811870e (diff)
downloadmariadb-git-7184a5921a07256570705ee6dad158c5e31c9c73.tar.gz
Merge epotemkin@bk-internal.mysql.com:/home/bk/mysql-5.0-opt
into moonbone.local:/mnt/gentoo64/work/test-5.0-opt-mysql
-rw-r--r--mysql-test/r/user_var.result14
-rw-r--r--mysql-test/t/user_var.test5
-rw-r--r--sql/item_func.cc34
-rw-r--r--sql/item_func.h4
4 files changed, 52 insertions, 5 deletions
diff --git a/mysql-test/r/user_var.result b/mysql-test/r/user_var.result
index b9f58b60d9b..b90bb1f062b 100644
--- a/mysql-test/r/user_var.result
+++ b/mysql-test/r/user_var.result
@@ -318,9 +318,17 @@ SHOW COUNT(*) ERRORS;
@@session.error_count
1
create table t1(f1 int);
-insert into t1 values(1),(1),(2);
-select @a:=f1, count(f1) from t1 group by 1;
+insert into t1 values(1),(1),(2),(3),(4),(1),(3),(1);
+select @a:=f1, count(f1) from t1 group by 1 desc;
@a:=f1 count(f1)
-1 2
+4 1
+3 2
2 1
+1 4
+select @a:=f1, count(f1) from t1 group by 1 asc;
+@a:=f1 count(f1)
+1 4
+2 1
+3 2
+4 1
drop table t1;
diff --git a/mysql-test/t/user_var.test b/mysql-test/t/user_var.test
index 7919b663a73..3df949ae669 100644
--- a/mysql-test/t/user_var.test
+++ b/mysql-test/t/user_var.test
@@ -227,6 +227,7 @@ SHOW COUNT(*) ERRORS;
# Bug#28494: Grouping by Item_func_set_user_var produces incorrect result.
#
create table t1(f1 int);
-insert into t1 values(1),(1),(2);
-select @a:=f1, count(f1) from t1 group by 1;
+insert into t1 values(1),(1),(2),(3),(4),(1),(3),(1);
+select @a:=f1, count(f1) from t1 group by 1 desc;
+select @a:=f1, count(f1) from t1 group by 1 asc;
drop table t1;
diff --git a/sql/item_func.cc b/sql/item_func.cc
index 95ff432ca5a..aa1d54b0ebd 100644
--- a/sql/item_func.cc
+++ b/sql/item_func.cc
@@ -4208,6 +4208,40 @@ my_decimal *Item_func_set_user_var::val_decimal(my_decimal *val)
}
+double Item_func_set_user_var::val_real_result()
+{
+ DBUG_ASSERT(fixed == 1);
+ check(TRUE);
+ update(); // Store expression
+ return entry->val_real(&null_value);
+}
+
+longlong Item_func_set_user_var::val_int_result()
+{
+ DBUG_ASSERT(fixed == 1);
+ check(TRUE);
+ update(); // Store expression
+ return entry->val_int(&null_value);
+}
+
+String *Item_func_set_user_var::val_str_result(String *str)
+{
+ DBUG_ASSERT(fixed == 1);
+ check(TRUE);
+ update(); // Store expression
+ return entry->val_str(&null_value, str, decimals);
+}
+
+
+my_decimal *Item_func_set_user_var::val_decimal_result(my_decimal *val)
+{
+ DBUG_ASSERT(fixed == 1);
+ check(TRUE);
+ update(); // Store expression
+ return entry->val_decimal(&null_value, val);
+}
+
+
void Item_func_set_user_var::print(String *str)
{
str->append(STRING_WITH_LEN("(@"));
diff --git a/sql/item_func.h b/sql/item_func.h
index 18cd87d2de4..c8ea79b9747 100644
--- a/sql/item_func.h
+++ b/sql/item_func.h
@@ -1208,6 +1208,10 @@ public:
longlong val_int();
String *val_str(String *str);
my_decimal *val_decimal(my_decimal *);
+ double val_real_result();
+ longlong val_int_result();
+ String *val_str_result(String *str);
+ my_decimal *val_decimal_result(my_decimal *);
bool update_hash(void *ptr, uint length, enum Item_result type,
CHARSET_INFO *cs, Derivation dv, bool unsigned_arg);
bool send(Protocol *protocol, String *str_arg);