summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkroki@mysql.com <>2006-04-13 00:04:22 +0400
committerkroki@mysql.com <>2006-04-13 00:04:22 +0400
commit2caec302fac0e7f28c661b49b251efcd35d8a3d1 (patch)
tree8d52ed3e424c23e0f3828d899db30466df254b4a
parent8881e660d086d639df51ba6948a16c621d7e0838 (diff)
parentc8e22ff70b2e8f26e6e7f5465402d89d7616a2e9 (diff)
downloadmariadb-git-2caec302fac0e7f28c661b49b251efcd35d8a3d1.tar.gz
Merge mysql.com:/home/tomash/src/mysql_ab/mysql-5.0
into mysql.com:/home/tomash/src/mysql_ab/mysql-5.0-bug15933
-rw-r--r--mysql-test/r/trigger.result13
-rw-r--r--mysql-test/t/trigger.test28
-rw-r--r--sql/item.cc16
-rw-r--r--sql/item.h12
-rw-r--r--sql/item_create.cc10
-rw-r--r--sql/item_func.cc25
-rw-r--r--sql/item_func.h12
7 files changed, 80 insertions, 36 deletions
diff --git a/mysql-test/r/trigger.result b/mysql-test/r/trigger.result
index 828db549b05..681b805f547 100644
--- a/mysql-test/r/trigger.result
+++ b/mysql-test/r/trigger.result
@@ -952,3 +952,16 @@ load data infile '../std_data_ln/words.dat' into table t1 (a) set b:= f1();
drop table t1;
drop function f1;
drop function f2;
+DROP TABLE IF EXISTS t1;
+CREATE TABLE t1 (
+conn_id INT,
+trigger_conn_id INT
+);
+CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW
+SET NEW.trigger_conn_id = CONNECTION_ID();
+INSERT INTO t1 (conn_id, trigger_conn_id) VALUES (CONNECTION_ID(), -1);
+INSERT INTO t1 (conn_id, trigger_conn_id) VALUES (CONNECTION_ID(), -1);
+SELECT * FROM t1 WHERE conn_id != trigger_conn_id;
+conn_id trigger_conn_id
+DROP TRIGGER t1_bi;
+DROP TABLE t1;
diff --git a/mysql-test/t/trigger.test b/mysql-test/t/trigger.test
index c5925bbd9d5..a0b67b2204d 100644
--- a/mysql-test/t/trigger.test
+++ b/mysql-test/t/trigger.test
@@ -1114,3 +1114,31 @@ load data infile '../std_data_ln/words.dat' into table t1 (a) set b:= f1();
drop table t1;
drop function f1;
drop function f2;
+
+#
+# Test for Bug #16461 connection_id() does not work properly inside trigger
+#
+--disable_warnings
+DROP TABLE IF EXISTS t1;
+--enable_warnings
+
+CREATE TABLE t1 (
+ conn_id INT,
+ trigger_conn_id INT
+);
+CREATE TRIGGER t1_bi BEFORE INSERT ON t1 FOR EACH ROW
+ SET NEW.trigger_conn_id = CONNECTION_ID();
+
+INSERT INTO t1 (conn_id, trigger_conn_id) VALUES (CONNECTION_ID(), -1);
+
+connect (con1,localhost,root,,);
+INSERT INTO t1 (conn_id, trigger_conn_id) VALUES (CONNECTION_ID(), -1);
+connection default;
+disconnect con1;
+
+SELECT * FROM t1 WHERE conn_id != trigger_conn_id;
+
+DROP TRIGGER t1_bi;
+DROP TABLE t1;
+
+# End of 5.0 tests
diff --git a/sql/item.cc b/sql/item.cc
index 45a6b0cef31..4d3ce6071eb 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -644,22 +644,6 @@ Item *Item_num::safe_charset_converter(CHARSET_INFO *tocs)
}
-Item *Item_static_int_func::safe_charset_converter(CHARSET_INFO *tocs)
-{
- Item_string *conv;
- char buf[64];
- String *s, tmp(buf, sizeof(buf), &my_charset_bin);
- s= val_str(&tmp);
- if ((conv= new Item_static_string_func(func_name, s->ptr(), s->length(),
- s->charset())))
- {
- conv->str_value.copy();
- conv->str_value.mark_as_const();
- }
- return conv;
-}
-
-
Item *Item_static_float_func::safe_charset_converter(CHARSET_INFO *tocs)
{
Item_string *conv;
diff --git a/sql/item.h b/sql/item.h
index 3b96091af38..d33e0ae34be 100644
--- a/sql/item.h
+++ b/sql/item.h
@@ -1387,18 +1387,6 @@ public:
};
-class Item_static_int_func :public Item_int
-{
- const char *func_name;
-public:
- Item_static_int_func(const char *str_arg, longlong i, uint length)
- :Item_int(NullS, i, length), func_name(str_arg)
- {}
- Item *safe_charset_converter(CHARSET_INFO *tocs);
- void print(String *str) { str->append(func_name); }
-};
-
-
class Item_uint :public Item_int
{
public:
diff --git a/sql/item_create.cc b/sql/item_create.cc
index 342ef245a76..bfcb2101d60 100644
--- a/sql/item_create.cc
+++ b/sql/item_create.cc
@@ -71,14 +71,8 @@ Item *create_func_ceiling(Item* a)
Item *create_func_connection_id(void)
{
- THD *thd=current_thd;
- thd->lex->safe_to_cache_query= 0;
- return new Item_static_int_func("connection_id()",
- (longlong)
- ((thd->slave_thread) ?
- thd->variables.pseudo_thread_id :
- thd->thread_id),
- 10);
+ current_thd->lex->safe_to_cache_query= 0;
+ return new Item_func_connection_id();
}
Item *create_func_conv(Item* a, Item *b, Item *c)
diff --git a/sql/item_func.cc b/sql/item_func.cc
index f40f868f75f..d4a0e607fc2 100644
--- a/sql/item_func.cc
+++ b/sql/item_func.cc
@@ -559,6 +559,31 @@ String *Item_int_func::val_str(String *str)
}
+void Item_func_connection_id::fix_length_and_dec()
+{
+ Item_int_func::fix_length_and_dec();
+ max_length= 10;
+}
+
+
+bool Item_func_connection_id::fix_fields(THD *thd, Item **ref)
+{
+ if (Item_int_func::fix_fields(thd, ref))
+ return TRUE;
+
+ /*
+ To replicate CONNECTION_ID() properly we should use
+ pseudo_thread_id on slave, which contains the value of thread_id
+ on master.
+ */
+ value= ((thd->slave_thread) ?
+ thd->variables.pseudo_thread_id :
+ thd->thread_id);
+
+ return FALSE;
+}
+
+
/*
Check arguments here to determine result's type for a numeric
function of two arguments.
diff --git a/sql/item_func.h b/sql/item_func.h
index ccbbbab1df4..ed5924e8fe1 100644
--- a/sql/item_func.h
+++ b/sql/item_func.h
@@ -279,6 +279,18 @@ public:
};
+class Item_func_connection_id :public Item_int_func
+{
+ longlong value;
+
+public:
+ const char *func_name() const { return "connection_id"; }
+ void fix_length_and_dec();
+ bool fix_fields(THD *thd, Item **ref);
+ longlong val_int() { DBUG_ASSERT(fixed == 1); return value; }
+};
+
+
class Item_func_signed :public Item_int_func
{
public: