diff options
author | kroki@mysql.com <> | 2006-04-13 00:04:22 +0400 |
---|---|---|
committer | kroki@mysql.com <> | 2006-04-13 00:04:22 +0400 |
commit | 2caec302fac0e7f28c661b49b251efcd35d8a3d1 (patch) | |
tree | 8d52ed3e424c23e0f3828d899db30466df254b4a | |
parent | 8881e660d086d639df51ba6948a16c621d7e0838 (diff) | |
parent | c8e22ff70b2e8f26e6e7f5465402d89d7616a2e9 (diff) | |
download | mariadb-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.result | 13 | ||||
-rw-r--r-- | mysql-test/t/trigger.test | 28 | ||||
-rw-r--r-- | sql/item.cc | 16 | ||||
-rw-r--r-- | sql/item.h | 12 | ||||
-rw-r--r-- | sql/item_create.cc | 10 | ||||
-rw-r--r-- | sql/item_func.cc | 25 | ||||
-rw-r--r-- | sql/item_func.h | 12 |
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: |