From 74b01ca387f3922dd036d316baa8502f51e16794 Mon Sep 17 00:00:00 2001 From: "bell@sanja.is.com.ua" <> Date: Fri, 25 Jun 2004 15:16:00 +0300 Subject: [PATCH] type of parameter assignment for parameters from variables added (BUG#4280) --- mysql-test/r/ps.result | 14 ++++++++++++++ mysql-test/t/ps.test | 14 ++++++++++++++ sql/item.cc | 4 ++++ sql/item.h | 20 ++++++++++---------- 4 files changed, 42 insertions(+), 10 deletions(-) diff --git a/mysql-test/r/ps.result b/mysql-test/r/ps.result index 7d80d08e663..0ff526fd2fe 100644 --- a/mysql-test/r/ps.result +++ b/mysql-test/r/ps.result @@ -137,3 +137,17 @@ execute stmt1; FOUND_ROWS() 0 deallocate prepare stmt1; +drop table t1; +set @arg00=1; +prepare stmt1 from ' create table t1 (m int) as select 1 as m ' ; +execute stmt1 ; +select m from t1; +m +1 +drop table t1; +prepare stmt1 from ' create table t1 (m int) as select ? as m ' ; +execute stmt1 using @arg00; +select m from t1; +m +1 +drop table t1; diff --git a/mysql-test/t/ps.test b/mysql-test/t/ps.test index 8881d6b9eec..7234da71043 100644 --- a/mysql-test/t/ps.test +++ b/mysql-test/t/ps.test @@ -140,3 +140,17 @@ execute stmt1; # Expect 0 execute stmt1; deallocate prepare stmt1; +drop table t1; + +# +# parameters from variables (for field creation) +# +set @arg00=1; +prepare stmt1 from ' create table t1 (m int) as select 1 as m ' ; +execute stmt1 ; +select m from t1; +drop table t1; +prepare stmt1 from ' create table t1 (m int) as select ? as m ' ; +execute stmt1 using @arg00; +select m from t1; +drop table t1; diff --git a/sql/item.cc b/sql/item.cc index 0e9a73aacb2..658f5c42a43 100644 --- a/sql/item.cc +++ b/sql/item.cc @@ -759,9 +759,13 @@ bool Item_param::set_from_user_var(THD *thd, const user_var_entry *entry) switch (entry->type) { case REAL_RESULT: set_double(*(double*)entry->value); + item_type= Item::REAL_ITEM; + item_result_type= REAL_RESULT; break; case INT_RESULT: set_int(*(longlong*)entry->value, 21); + item_type= Item::INT_ITEM; + item_result_type= INT_RESULT; break; case STRING_RESULT: { diff --git a/sql/item.h b/sql/item.h index fe8c2cb0df1..235b15c56fc 100644 --- a/sql/item.h +++ b/sql/item.h @@ -422,7 +422,7 @@ public: class Item_param :public Item { -public: +public: enum enum_item_param_state { NO_VALUE, NULL_VALUE, INT_VALUE, REAL_VALUE, @@ -442,8 +442,8 @@ public: String str_value_ptr; union { - longlong integer; - double real; + longlong integer; + double real; /* Character sets conversion info for string values. Character sets of client and connection defined at bind time are used @@ -456,7 +456,7 @@ public: /* This points at character set of connection if conversion to it is required (i. e. if placeholder typecode is not BLOB). - Otherwise it's equal to character_set_client (to simplify + Otherwise it's equal to character_set_client (to simplify check in convert_str_value()). */ CHARSET_INFO *final_character_set_of_str_value; @@ -477,10 +477,10 @@ public: supply for this placeholder in mysql_stmt_execute. */ enum enum_field_types param_type; - /* + /* Offset of placeholder inside statement text. Used to create no-placeholders version of this statement for the binary log. - */ + */ uint pos_in_query; Item_param(uint pos_in_query_arg); @@ -515,11 +515,11 @@ public: const String *query_val_str(String *str) const; bool convert_str_value(THD *thd); - + Item *new_item() { return new Item_param(pos_in_query); } - /* - If value for parameter was not set we treat it as non-const - so noone will use parameters value in fix_fields still + /* + If value for parameter was not set we treat it as non-const + so noone will use parameters value in fix_fields still parameter is constant during execution. */ virtual table_map used_tables() const