From 8d616390e9b31a185110209ea7ff01ade8e73bc1 Mon Sep 17 00:00:00 2001
From: "monty@mysql.com" <>
Date: Sat, 15 Jan 2005 17:38:43 +0200
Subject: [PATCH] After merge fixes Fix for BIT(X) field as string

---
 mysql-test/r/func_gconcat.result | 10 +++++-----
 mysql-test/r/func_sapdb.result   |  6 +++---
 mysql-test/r/innodb.result       |  8 ++++----
 mysql-test/r/ps_1general.result  |  1 +
 mysql-test/r/type_bit.result     | 11 +++++++++++
 mysql-test/t/ps_1general.test    |  1 +
 mysql-test/t/type_bit.test       |  9 +++++++++
 sql/field.cc                     |  6 ++++--
 sql/item.h                       | 10 ++++++----
 sql/item_func.h                  | 14 +++++++++-----
 sql/item_sum.h                   | 10 ++++++----
 sql/procedure.h                  | 17 +++++++++++++----
 sql/sql_base.cc                  | 14 ++++++++------
 13 files changed, 80 insertions(+), 37 deletions(-)

diff --git a/mysql-test/r/func_gconcat.result b/mysql-test/r/func_gconcat.result
index 272f6f592b1..06c1759bf1d 100644
--- a/mysql-test/r/func_gconcat.result
+++ b/mysql-test/r/func_gconcat.result
@@ -457,6 +457,11 @@ group_concat(distinct b order by b)
 Warnings:
 Warning	1260	2 line(s) were cut by GROUP_CONCAT()
 drop table t1;
+CREATE TABLE t1 (id int);
+SELECT GROUP_CONCAT(id) AS gc FROM t1 HAVING gc IS NULL;
+gc
+NULL
+DROP TABLE t1;
 create table t1 (a char(3), b char(20), primary key (a, b));
 insert into t1 values ('ABW', 'Dutch'), ('ABW', 'English');
 select group_concat(a) from t1 group by b;
@@ -464,8 +469,3 @@ group_concat(a)
 ABW
 ABW
 drop table t1;
-CREATE TABLE t1 (id int);
-SELECT GROUP_CONCAT(id) AS gc FROM t1 HAVING gc IS NULL;
-gc
-NULL
-DROP TABLE t1;
diff --git a/mysql-test/r/func_sapdb.result b/mysql-test/r/func_sapdb.result
index 6556d2be6ad..a2918e71d68 100644
--- a/mysql-test/r/func_sapdb.result
+++ b/mysql-test/r/func_sapdb.result
@@ -107,7 +107,7 @@ timediff("1997-12-31 23:59:59.000001","1997-12-30 01:01:01.000002")
 46:58:57.999999
 select timediff("1997-12-30 23:59:59.000001","1997-12-31 23:59:59.000002");
 timediff("1997-12-30 23:59:59.000001","1997-12-31 23:59:59.000002")
--24:00:00.000001
+-23:59:59.999999
 select timediff("1997-12-31 23:59:59.000001","23:59:59.000001");
 timediff("1997-12-31 23:59:59.000001","23:59:59.000001")
 NULL
@@ -116,7 +116,7 @@ timediff("2000:01:01 00:00:00", "2000:01:01 00:00:00.000001")
 -00:00:00.000001
 select timediff("2005-01-11 15:48:49.999999", "2005-01-11 15:48:50");
 timediff("2005-01-11 15:48:49.999999", "2005-01-11 15:48:50")
--00:00:00.000001
+-00:00:01.999999
 select maketime(10,11,12);
 maketime(10,11,12)
 10:11:12
@@ -188,7 +188,7 @@ f8	date	YES		NULL
 f9	time	YES		NULL	
 select * from t1;
 f1	f2	f3	f4	f5	f6	f7	f8	f9
-1997-01-01	1998-01-02 01:01:00	49:01:01	46:58:57	-24:00:00	10:11:12	2001-12-01 01:01:01	1997-12-31	23:59:59
+1997-01-01	1998-01-02 01:01:00	49:01:01	46:58:57	-23:59:59	10:11:12	2001-12-01 01:01:01	1997-12-31	23:59:59
 create table test(t1 datetime, t2 time, t3 time, t4 datetime);
 insert into test values 
 ('2001-01-01 01:01:01', '01:01:01', null, '2001-02-01 01:01:01'),
diff --git a/mysql-test/r/innodb.result b/mysql-test/r/innodb.result
index bdd5ac0bd63..8d1c4e3fc90 100644
--- a/mysql-test/r/innodb.result
+++ b/mysql-test/r/innodb.result
@@ -1326,8 +1326,8 @@ truncate table t1;
 insert into t1 (a) values (NULL),(NULL);
 SELECT * from t1;
 a
-3
-4
+1
+2
 drop table t1;
 CREATE TABLE t1 (`id 1` INT NOT NULL, PRIMARY KEY (`id 1`)) ENGINE=INNODB;
 CREATE TABLE t2 (id INT PRIMARY KEY, t1_id INT, INDEX par_ind (t1_id), FOREIGN KEY (`t1_id`) REFERENCES `t1`(`id 1`)  ON DELETE CASCADE ) ENGINE=INNODB;
@@ -1690,13 +1690,13 @@ Variable_name	Value
 Innodb_page_size	16384
 show status like "Innodb_rows_deleted";
 Variable_name	Value
-Innodb_rows_deleted	2078
+Innodb_rows_deleted	2070
 show status like "Innodb_rows_inserted";
 Variable_name	Value
 Innodb_rows_inserted	31706
 show status like "Innodb_rows_read";
 Variable_name	Value
-Innodb_rows_read	80161
+Innodb_rows_read	80153
 show status like "Innodb_rows_updated";
 Variable_name	Value
 Innodb_rows_updated	29530
diff --git a/mysql-test/r/ps_1general.result b/mysql-test/r/ps_1general.result
index 64cdb76ead8..6df5f633b88 100644
--- a/mysql-test/r/ps_1general.result
+++ b/mysql-test/r/ps_1general.result
@@ -295,6 +295,7 @@ execute stmt4;
 prepare stmt4 from ' show full processlist ';
 execute stmt4;
 Id	User	Host	db	Command	Time	State	Info
+number	root	localhost	test	Query	time	NULL	show full processlist
 prepare stmt4 from ' show grants for user ';
 prepare stmt4 from ' show create table t2 ';
 ERROR HY000: This command is not supported in the prepared statement protocol yet
diff --git a/mysql-test/r/type_bit.result b/mysql-test/r/type_bit.result
index 45f887461e7..88bb04fefba 100644
--- a/mysql-test/r/type_bit.result
+++ b/mysql-test/r/type_bit.result
@@ -368,3 +368,14 @@ a+0
 44
 57
 drop table t1;
+create table t1 (a bit(3), b bit(12));
+insert into t1 values (7,(1<<12)-2), (0x01,0x01ff);
+select hex(a),hex(b) from t1;
+hex(a)	hex(b)
+7	FFE
+1	1FF
+select hex(concat(a)),hex(concat(b)) from t1;
+hex(concat(a))	hex(concat(b))
+07	0FFE
+01	01FF
+drop table t1;
diff --git a/mysql-test/t/ps_1general.test b/mysql-test/t/ps_1general.test
index 569d2f697c7..4b55593fde5 100644
--- a/mysql-test/t/ps_1general.test
+++ b/mysql-test/t/ps_1general.test
@@ -321,6 +321,7 @@ prepare stmt4 from ' show engine bdb logs ';
 execute stmt4;
 --enable_result_log
 prepare stmt4 from ' show full processlist ';
+--replace_column 1 number 6 time
 execute stmt4;
 prepare stmt4 from ' show grants for user ';
 --error 1295
diff --git a/mysql-test/t/type_bit.test b/mysql-test/t/type_bit.test
index 0c1c22099f9..fed15806765 100644
--- a/mysql-test/t/type_bit.test
+++ b/mysql-test/t/type_bit.test
@@ -106,3 +106,12 @@ create table t1 (a bit(7), key(a));
 insert into t1 values (44), (57);
 select a+0 from t1;
 drop table t1;
+
+#
+# Test conversion to and from strings
+#
+create table t1 (a bit(3), b bit(12));
+insert into t1 values (7,(1<<12)-2), (0x01,0x01ff);
+select hex(a),hex(b) from t1;
+select hex(concat(a)),hex(concat(b)) from t1;
+drop table t1;
diff --git a/sql/field.cc b/sql/field.cc
index 084232fe2bb..a1dc02eba4a 100644
--- a/sql/field.cc
+++ b/sql/field.cc
@@ -5358,7 +5358,7 @@ double Field_blob::val_real(void)
     return 0.0;
   length= get_length(ptr);
   cs= charset();
-  return my_strntod(cs,blob,length,(char**)0, &not_used);
+  return my_strntod(cs, blob, length, &end_not_used, &not_used);
 }
 
 
@@ -6362,11 +6362,13 @@ longlong Field_bit::val_int(void)
 String *Field_bit::val_str(String *val_buffer,
                            String *val_ptr __attribute__((unused)))
 {
+  char buff[sizeof(longlong)];
   uint length= min(pack_length(), sizeof(longlong));
   ulonglong bits= val_int();
+  mi_int8store(buff,bits);
 
   val_buffer->alloc(length);
-  memcpy_fixed((char*) val_buffer->ptr(), (char*) &bits, length);
+  memcpy_fixed((char*) val_buffer->ptr(), buff+8-length, length);
   val_buffer->length(length);
   val_buffer->set_charset(&my_charset_bin);
   return val_buffer;
diff --git a/sql/item.h b/sql/item.h
index 2503f137355..6857b4acf82 100644
--- a/sql/item.h
+++ b/sql/item.h
@@ -877,9 +877,10 @@ class Item_string :public Item
   double val_real()
   {
     DBUG_ASSERT(fixed == 1);
-    int err;
+    int err_not_used;
+    char *end_not_used;
     return my_strntod(str_value.charset(), (char*) str_value.ptr(),
-		      str_value.length(), (char**) 0, &err);
+		      str_value.length(), &end_not_used, &err_not_used);
   }
   longlong val_int()
   {
@@ -1230,10 +1231,11 @@ class Item_copy_string :public Item
   enum_field_types field_type() const { return cached_field_type; }
   double val_real()
   {
-    int err;
+    int err_not_used;
+    char *end_not_used;
     return (null_value ? 0.0 :
 	    my_strntod(str_value.charset(), (char*) str_value.ptr(),
-		       str_value.length(),NULL,&err));
+		       str_value.length(), &end_not_used, &err_not_used));
   }
   longlong val_int()
   { 
diff --git a/sql/item_func.h b/sql/item_func.h
index 4657ee81dfb..fb8d77d5b83 100644
--- a/sql/item_func.h
+++ b/sql/item_func.h
@@ -834,15 +834,19 @@ class Item_func_udf_str :public Item_udf_func
   String *val_str(String *);
   double val_real()
   {
-    int err;
-    String *res;  res=val_str(&str_value);
-    return res ? my_strntod(res->charset(),(char*) res->ptr(),res->length(),0,&err) : 0.0;
+    int err_not_used;
+    char *end_not_used;
+    String *res;
+    res= val_str(&str_value);
+    return res ? my_strntod(res->charset(),(char*) res->ptr(), 
+                            res->length(), &end_not_used, &err_not_used) : 0.0;
   }
   longlong val_int()
   {
-    int err;
+    int err_not_used;
     String *res;  res=val_str(&str_value);
-    return res ? my_strntoll(res->charset(),res->ptr(),res->length(),10,(char**) 0,&err) : (longlong) 0;
+    return res ? my_strntoll(res->charset(),res->ptr(),res->length(),10,
+                             (char**) 0, &err_not_used) : (longlong) 0;
   }
   enum Item_result result_type () const { return STRING_RESULT; }
   void fix_length_and_dec();
diff --git a/sql/item_sum.h b/sql/item_sum.h
index 4d2bfe739c5..7866a9ae913 100644
--- a/sql/item_sum.h
+++ b/sql/item_sum.h
@@ -643,16 +643,18 @@ class Item_sum_udf_str :public Item_udf_sum
   String *val_str(String *);
   double val_real()
   {
-    int err;
+    int err_not_used;
+    char *end_not_used;
     String *res;  res=val_str(&str_value);
     return res ? my_strntod(res->charset(),(char*) res->ptr(),res->length(),
-			    (char**) 0, &err) : 0.0;
+			    &end_not_used, &err_not_used) : 0.0;
   }
   longlong val_int()
   {
-    int err;
+    int err_not_used;
     String *res;  res=val_str(&str_value);
-    return res ? my_strntoll(res->charset(),res->ptr(),res->length(),10, (char**) 0, &err) : (longlong) 0;
+    return res ? my_strntoll(res->charset(),res->ptr(),res->length(),10,
+                             (char**) 0, &err_not_used) : (longlong) 0;
   }
   enum Item_result result_type () const { return STRING_RESULT; }
   void fix_length_and_dec();
diff --git a/sql/procedure.h b/sql/procedure.h
index 4212a9246a5..33c1288c88e 100644
--- a/sql/procedure.h
+++ b/sql/procedure.h
@@ -59,10 +59,18 @@ class Item_proc_real :public Item_proc
   void set(double nr) { value=nr; }
   void set(longlong nr) { value=(double) nr; }
   void set(const char *str,uint length,CHARSET_INFO *cs)
-  { int err; value=my_strntod(cs,(char*) str,length,(char**)0,&err); }
+  {
+    int err_not_used;
+    char *end_not_used;
+    value= my_strntod(cs,(char*) str,length, &end_not_used, &err_not_used);
+  }
   double val_real() { return value; }
   longlong val_int() { return (longlong) value; }
-  String *val_str(String *s) { s->set(value,decimals,default_charset()); return s; }
+  String *val_str(String *s)
+  {
+    s->set(value,decimals,default_charset());
+    return s;
+  }
   unsigned int size_of() { return sizeof(*this);}  
 };
 
@@ -98,10 +106,11 @@ class Item_proc_string :public Item_proc
   { str_value.copy(str,length,cs); }
   double val_real()
   { 
-    int err;
+    int err_not_used;
+    char *end_not_used;
     CHARSET_INFO *cs=str_value.charset();
     return my_strntod(cs, (char*) str_value.ptr(), str_value.length(),
-		      (char**) 0, &err);
+		      &end_not_used, &err_not_used);
   }
   longlong val_int()
   { 
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index ab59610f485..d854956325e 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -1853,8 +1853,8 @@ int simple_open_n_lock_tables(THD *thd, TABLE_LIST *tables)
 
 bool open_and_lock_tables(THD *thd, TABLE_LIST *tables)
 {
-  DBUG_ENTER("open_and_lock_tables");
   uint counter;
+  DBUG_ENTER("open_and_lock_tables");
   if (open_tables(thd, tables, &counter) ||
       lock_tables(thd, tables, counter) ||
       mysql_handle_derived(thd->lex, &mysql_derived_prepare) ||
@@ -1883,14 +1883,16 @@ bool open_and_lock_tables(THD *thd, TABLE_LIST *tables)
     data from the tables.
 */
 
-int open_normal_and_derived_tables(THD *thd, TABLE_LIST *tables)
+bool open_normal_and_derived_tables(THD *thd, TABLE_LIST *tables)
 {
   uint counter;
   DBUG_ENTER("open_normal_and_derived_tables");
-  if (open_tables(thd, tables, &counter))
-    DBUG_RETURN(-1);				/* purecov: inspected */
-  relink_tables_for_derived(thd);
-  DBUG_RETURN(mysql_handle_derived(thd->lex));
+  DBUG_ASSERT(!thd->fill_derived_tables());
+  if (open_tables(thd, tables, &counter) ||
+      mysql_handle_derived(thd->lex, &mysql_derived_prepare))
+    DBUG_RETURN(TRUE); /* purecov: inspected */
+  relink_tables_for_multidelete(thd);           // Not really needed, but
+  DBUG_RETURN(0);
 }
 
 
-- 
2.30.9