List:Commits« Previous MessageNext Message »
From:<gshchepa Date:October 6 2007 11:10am
Subject:bk commit into 5.1 tree (gshchepa:1.2582) BUG#30946
View as plain text  
Below is the list of changes that have just been committed into a local
5.1 repository of uchum. When uchum does a push these changes will
be propagated to the main repository and, within 24 hours after the
push, to the public repository.
For information on how to access the public repository
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html

ChangeSet@stripped, 2007-10-06 16:10:17+05:00, gshchepa@stripped +7 -0
  Bug#30946: mysqldump silently ignores --default-character-set
  when used with --tab.
  
  Added optional CHARACTER SET clause to the SELECT ... INTO OUTFILE
  (to complement the same clause in LOAD DATA INFILE).
  mysqldump is updated to use it in --tab mode.

  client/mysqldump.c@stripped, 2007-10-06 15:51:05+05:00, gshchepa@stripped +6 -0
    Fixed bug #30946.
    The dump_table function has been modified to take the
    --default-character-set switch into account when dumpind a table
    into into external file.
    For a backward compatibility the binary character set is used
    by default.

  mysql-test/r/ctype_big5.result@stripped, 2007-10-06 15:52:19+05:00, gshchepa@stripped +1 -1
    Updated test case for bug #26711.

  mysql-test/r/mysqldump.result@stripped, 2007-10-06 15:52:25+05:00, gshchepa@stripped +26 -0
    Added test case for bug #30946.

  mysql-test/t/ctype_big5.test@stripped, 2007-10-06 15:51:09+05:00, gshchepa@stripped +1 -1
    Updated test case for bug #26711.

  mysql-test/t/mysqldump.test@stripped, 2007-10-06 15:52:02+05:00, gshchepa@stripped +42 -0
    Added test case for bug #30946.

  sql/sql_class.cc@stripped, 2007-10-06 15:50:47+05:00, gshchepa@stripped +70 -27
    Fixed bug #30946.
    The select_export::send_data function has been modified to support
    new 'SELECT ... INFO OUTFILE ... CHARACTER SET' syntax.
    Without a presence of the CHARACTER SET closure the behavior of this
    function is unchanged.

  sql/sql_yacc.yy@stripped, 2007-10-06 15:51:00+05:00, gshchepa@stripped +2 -0
    Fixed bug #30946.
    New syntax has been provided:
    Added optional CHARACTER SET clause to the SELECT ... INTO OUTFILE
    (to complement the same clause in LOAD DATA INFILE).
    By default this value is set to the binary character set.

diff -Nrup a/client/mysqldump.c b/client/mysqldump.c
--- a/client/mysqldump.c	2007-10-03 15:49:31 +05:00
+++ b/client/mysqldump.c	2007-10-06 15:51:05 +05:00
@@ -3090,6 +3090,12 @@ static void dump_table(char *table, char
     dynstr_append_checked(&query_string, filename);
     dynstr_append_checked(&query_string, "'");
 
+    dynstr_append_checked(&query_string, " /*!50123 CHARACTER SET ");
+    dynstr_append_checked(&query_string, default_charset == mysql_universal_client_charset ?
+                                         my_charset_bin.name : /* backward compatibility */
+                                         default_charset);
+    dynstr_append_checked(&query_string, " */");
+
     if (fields_terminated || enclosed || opt_enclosed || escaped)
       dynstr_append_checked(&query_string, " FIELDS");
     
diff -Nrup a/mysql-test/r/ctype_big5.result b/mysql-test/r/ctype_big5.result
--- a/mysql-test/r/ctype_big5.result	2007-07-04 14:21:28 +05:00
+++ b/mysql-test/r/ctype_big5.result	2007-10-06 15:52:19 +05:00
@@ -196,7 +196,7 @@ End of 4.1 tests
 set names big5;
 create table t1 (a blob);
 insert into t1 values (0xEE00);
-select * into outfile 'test/t1.txt' from t1;
+select * into outfile 'test/t1.txt' character set big5 from t1;
 delete from t1;
 select hex(load_file('MYSQLTEST_VARDIR/master-data/test/t1.txt'));;
 hex(load_file('MYSQLTEST_VARDIR/master-data/test/t1.txt'))
diff -Nrup a/mysql-test/r/mysqldump.result b/mysql-test/r/mysqldump.result
--- a/mysql-test/r/mysqldump.result	2007-10-03 15:05:08 +05:00
+++ b/mysql-test/r/mysqldump.result	2007-10-06 15:52:25 +05:00
@@ -4212,5 +4212,31 @@ TRUNCATE mysql.event;
 SHOW EVENTS;
 Db	Name	Definer	Time zone	Type	Execute at	Interval value	Interval field	Starts	Ends	Status	Originator	character_set_client	collation_connection	Database Collation
 #
+# Bug #30946: mysqldump silently ignores --default-character-set
+#             when used with --tab
+#
+CREATE TABLE t1 (a CHAR(10) CHARSET koi8r, b CHAR(10) CHARSET latin1);
+SELECT * INTO OUTFILE 'MYSQLTEST_VARDIR/tmp/t1_default.txt' FROM t1;;
+\N	\N
+SELECT * INTO OUTFILE 'MYSQLTEST_VARDIR/tmp/t1_utf8.txt' CHARACTER SET utf8 FROM t1;;
+abc-абв	abc-ÁÂÃ
+\N	\N
+SET NAMES koi8r;
+SELECT * INTO OUTFILE 'MYSQLTEST_VARDIR/tmp/t1_utf8.txt'
+  CHARACTER SET utf8
+  FROM t1;
+Еabc-абвЕФЕabc-ÁÂÃЕЛ\NФ\NЛ
+SET NAMES default;
+mysqldump without --default-charset
+\N	\N
+mysqldump --default-charset=utf8
+abc-абв	abc-ÁÂÃ
+\N	\N
+DROP TABLE t1;
+#
 # End of 5.1 tests
 #
diff -Nrup a/mysql-test/t/ctype_big5.test b/mysql-test/t/ctype_big5.test
--- a/mysql-test/t/ctype_big5.test	2007-07-04 14:21:28 +05:00
+++ b/mysql-test/t/ctype_big5.test	2007-10-06 15:51:09 +05:00
@@ -71,7 +71,7 @@ select hex(convert(_big5 0xC84041 using 
 set names big5;
 create table t1 (a blob);
 insert into t1 values (0xEE00);
-select * into outfile 'test/t1.txt' from t1;
+select * into outfile 'test/t1.txt' character set big5 from t1;
 delete from t1;
 --replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
 --eval select hex(load_file('$MYSQLTEST_VARDIR/master-data/test/t1.txt'));
diff -Nrup a/mysql-test/t/mysqldump.test b/mysql-test/t/mysqldump.test
--- a/mysql-test/t/mysqldump.test	2007-10-03 14:56:43 +05:00
+++ b/mysql-test/t/mysqldump.test	2007-10-06 15:52:02 +05:00
@@ -1789,5 +1789,47 @@ TRUNCATE mysql.event;
 SHOW EVENTS;
 
 --echo #
+--echo # Bug #30946: mysqldump silently ignores --default-character-set
+--echo #             when used with --tab
+--echo #
+
+CREATE TABLE t1 (a CHAR(10) CHARSET koi8r, b CHAR(10) CHARSET latin1);
+
+--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
+--eval SELECT * INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/t1_default.txt' FROM t1;
+--cat_file $MYSQLTEST_VARDIR/tmp/t1_default.txt
+--remove_file $MYSQLTEST_VARDIR/tmp/t1_default.txt
+
+--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
+--eval SELECT * INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/t1_utf8.txt' CHARACTER SET utf8 FROM t1;
+--cat_file $MYSQLTEST_VARDIR/tmp/t1_utf8.txt
+--remove_file $MYSQLTEST_VARDIR/tmp/t1_utf8.txt
+
+SET NAMES koi8r;
+--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
+eval
+SELECT * INTO OUTFILE '$MYSQLTEST_VARDIR/tmp/t1_utf8.txt'
+  CHARACTER SET utf8
+  FROM t1;
+--cat_file $MYSQLTEST_VARDIR/tmp/t1_utf8.txt
+--echo
+--remove_file $MYSQLTEST_VARDIR/tmp/t1_utf8.txt
+SET NAMES default;
+
+--echo mysqldump without --default-charset
+--exec $MYSQL_DUMP --tab=$MYSQLTEST_VARDIR/tmp/ test t1
+--cat_file $MYSQLTEST_VARDIR/tmp/t1.txt
+--remove_file $MYSQLTEST_VARDIR/tmp/t1.txt
+
+--echo mysqldump --default-charset=utf8
+--exec $MYSQL_DUMP --character-sets-dir=$CHARSETSDIR --default-character-set=utf8 --tab=$MYSQLTEST_VARDIR/tmp/ test t1
+--cat_file $MYSQLTEST_VARDIR/tmp/t1.txt
+--remove_file $MYSQLTEST_VARDIR/tmp/t1.txt
+
+DROP TABLE t1;
+
+--echo #
 --echo # End of 5.1 tests
 --echo #
diff -Nrup a/sql/sql_class.cc b/sql/sql_class.cc
--- a/sql/sql_class.cc	2007-08-31 23:13:22 +05:00
+++ b/sql/sql_class.cc	2007-10-06 15:50:47 +05:00
@@ -1575,9 +1575,26 @@ bool select_export::send_data(List<Item>
 
   DBUG_ENTER("select_export::send_data");
   char buff[MAX_FIELD_WIDTH],null_buff[2],space[MAX_FIELD_WIDTH];
+  char buff2[MAX_FIELD_WIDTH],null_buff2[4];
+  char line_sep_buff[2], enclosed_buff[2], field_term_buff[2];
   bool space_inited=0;
   String tmp(buff,sizeof(buff),&my_charset_bin),*res;
+  CHARSET_INFO *cs= exchange->cs ? exchange->cs :
+                    &my_charset_bin; // backward compatibility
+  /*
+    String to convert an item string value into a value with
+    the exchange->cs chanrset
+  */
+  String item2exch(buff2, sizeof(buff2), cs);
+  String null(null_buff2, sizeof(null_buff2), cs);
+  String line_sep(line_sep_buff, sizeof(line_sep_buff), cs);
+  String enclosed(enclosed_buff, sizeof(enclosed_buff), cs);
+  String field_term(field_term_buff, sizeof(field_term_buff), cs);
+
   tmp.length(0);
+  null.length(0);
+  enclosed.length(0);
+  field_term.length(0);
 
   if (unit->offset_limit_cnt)
   {						// using limit offset,count
@@ -1589,32 +1606,53 @@ bool select_export::send_data(List<Item>
   uint used_length=0,items_left=items.elements;
   List_iterator_fast<Item> li(items);
 
-  if (my_b_write(&cache,(uchar*) exchange->line_start->ptr(),
-		 exchange->line_start->length()))
+
+  line_sep.length(0);
+  line_sep.append(exchange->line_start->ptr(),
+                  exchange->line_start->length(),
+                  exchange->line_start->charset());
+  if (my_b_write(&cache,(uchar*) line_sep.ptr(), line_sep.length()))
     goto err;
   while ((item=li++))
   {
     Item_result result_type=item->result_type();
     res=item->str_result(&tmp);
+    if (res && cs && cs != res->charset() &&
+        cs != &my_charset_bin && res->charset() != &my_charset_bin)
+    {
+      item2exch.length(0);
+      item2exch.append(res->c_ptr(), res->length(), res->charset());
+      res= &item2exch;
+    }
+
     if (res && (!exchange->opt_enclosed || result_type == STRING_RESULT))
     {
-      if (my_b_write(&cache,(uchar*) exchange->enclosed->ptr(),
-		     exchange->enclosed->length()))
+      if (enclosed.is_empty() &&
+          enclosed.append(exchange->enclosed->ptr(),
+                          exchange->enclosed->length(),
+                          exchange->enclosed->charset()))
+        goto err;
+      if (my_b_write(&cache, (uchar*) enclosed.ptr(), enclosed.length()))
 	goto err;
     }
     if (!res)
     {						// NULL
       if (!fixed_row_size)
       {
-	if (escape_char != -1)			// Use \N syntax
-	{
-	  null_buff[0]=escape_char;
-	  null_buff[1]='N';
-	  if (my_b_write(&cache,(uchar*) null_buff,2))
-	    goto err;
-	}
-	else if (my_b_write(&cache,(uchar*) "NULL",4))
-	  goto err;
+        if (null.is_empty())
+        {
+          if (escape_char != -1)		// Use \N syntax
+          {
+            null_buff[0]=escape_char;
+            null_buff[1]='N';
+            if (null.append(null_buff, 2, &my_charset_latin1))
+              goto err;
+          }
+          else if (null.append("NULL", 4, &my_charset_latin1))
+            goto err;
+        }
+        if (my_b_write(&cache, (uchar*) null.ptr(), null.length()))
+          goto err;
       }
       else
       {
@@ -1632,13 +1670,10 @@ bool select_export::send_data(List<Item>
       {
         char *pos, *start, *end;
         CHARSET_INFO *res_charset= res->charset();
-        CHARSET_INFO *character_set_client= thd->variables.
-                                            character_set_client;
         bool check_second_byte= (res_charset == &my_charset_bin) &&
-                                 character_set_client->
-                                 escape_with_backslash_is_dangerous;
-        DBUG_ASSERT(character_set_client->mbmaxlen == 2 ||
-                    !character_set_client->escape_with_backslash_is_dangerous);
+                                 cs->escape_with_backslash_is_dangerous;
+        DBUG_ASSERT(cs->mbmaxlen == 2 ||
+                    !cs->escape_with_backslash_is_dangerous);
 	for (start=pos=(char*) res->ptr(),end=pos+used_length ;
 	     pos != end ;
 	     pos++)
@@ -1689,7 +1724,7 @@ bool select_export::send_data(List<Item>
 
           if (NEED_ESCAPING(*pos) ||
               (check_second_byte &&
-               my_mbcharlen(character_set_client, (uchar) *pos) == 2 &&
+               my_mbcharlen(cs, (uchar) *pos) == 2 &&
                pos + 1 < end &&
                NEED_ESCAPING(pos[1])))
           {
@@ -1732,19 +1767,27 @@ bool select_export::send_data(List<Item>
     }
     if (res && (!exchange->opt_enclosed || result_type == STRING_RESULT))
     {
-      if (my_b_write(&cache, (uchar*) exchange->enclosed->ptr(),
-                     exchange->enclosed->length()))
-        goto err;
+      if (my_b_write(&cache, (uchar*) enclosed.ptr(), enclosed.length()))
+	goto err;
     }
     if (--items_left)
     {
-      if (my_b_write(&cache, (uchar*) exchange->field_term->ptr(),
-                     field_term_length))
+      if (field_term.is_empty() &&
+          field_term.append(exchange->field_term->ptr(),
+                            field_term_length,
+                            exchange->field_term->charset()))
+        goto err;
+      if (my_b_write(&cache, (uchar*) field_term.ptr(),
+                     field_term.length()))
         goto err;
     }
   }
-  if (my_b_write(&cache,(uchar*) exchange->line_term->ptr(),
-		 exchange->line_term->length()))
+  line_sep.length(0);
+  if (line_sep.append(exchange->line_term->ptr(),
+                      exchange->line_term->length(),
+                      exchange->line_term->charset()))
+    goto err;
+  if (my_b_write(&cache, (uchar*) line_sep.ptr(), line_sep.length()))
     goto err;
   DBUG_RETURN(0);
 err:
diff -Nrup a/sql/sql_yacc.yy b/sql/sql_yacc.yy
--- a/sql/sql_yacc.yy	2007-09-13 11:31:41 +05:00
+++ b/sql/sql_yacc.yy	2007-10-06 15:51:00 +05:00
@@ -8511,6 +8511,8 @@ into_destination:
                 !(lex->result= new select_export(lex->exchange)))
               MYSQL_YYABORT;
           }
+          opt_load_data_charset
+          { Lex->exchange->cs= $4; }
           opt_field_term opt_line_term
         | DUMPFILE TEXT_STRING_filesystem
           {
Thread
bk commit into 5.1 tree (gshchepa:1.2582) BUG#30946gshchepa6 Oct