diff options
author | Jim Winstead <jimw@mysql.com> | 2009-07-30 17:51:25 -0700 |
---|---|---|
committer | Jim Winstead <jimw@mysql.com> | 2009-07-30 17:51:25 -0700 |
commit | a90bcde091c52cfe72ca3db35cbb08c4a8c1a14d (patch) | |
tree | 5088e4bf133bb114b8dd8939b5bf0a35d9165c3f | |
parent | 69a9d66730f8448d0057e98a65f3cf16ddaf3fc1 (diff) | |
parent | c754b00a1f79d1ea78b1a2d2c51a1b2281500fff (diff) | |
download | mariadb-git-a90bcde091c52cfe72ca3db35cbb08c4a8c1a14d.tar.gz |
Merge bug fix.
-rw-r--r-- | client/mysql.cc | 31 | ||||
-rw-r--r-- | mysql-test/r/mysql.result | 28 | ||||
-rw-r--r-- | mysql-test/t/mysql.test | 14 |
3 files changed, 67 insertions, 6 deletions
diff --git a/client/mysql.cc b/client/mysql.cc index 05f15e3267a..dc7022a0ffa 100644 --- a/client/mysql.cc +++ b/client/mysql.cc @@ -170,6 +170,8 @@ static const char *xmlmeta[] = { "<", "<", ">", ">", "\"", """, + /* Turn \0 into a space. Why not �? That's not valid XML or HTML. */ + "\0", " ", 0, 0 }; static const char *day_names[]={"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; @@ -3502,11 +3504,29 @@ print_table_data_vertically(MYSQL_RES *result) mysql_field_seek(result,0); tee_fprintf(PAGER, "*************************** %d. row ***************************\n", row_count); + + ulong *lengths= mysql_fetch_lengths(result); + for (uint off=0; off < mysql_num_fields(result); off++) { field= mysql_fetch_field(result); tee_fprintf(PAGER, "%*s: ",(int) max_length,field->name); - tee_fprintf(PAGER, "%s\n",cur[off] ? (char*) cur[off] : "NULL"); + if (cur[off]) + { + unsigned int i; + const char *p; + + for (i= 0, p= cur[off]; i < lengths[off]; i+= 1, p+= 1) + { + if (*p == '\0') + tee_putc((int)' ', PAGER); + else + tee_putc((int)*p, PAGER); + } + tee_putc('\n', PAGER); + } + else + tee_fprintf(PAGER, "NULL\n"); } } } @@ -3573,7 +3593,7 @@ xmlencode_print(const char *src, uint length) tee_fputs("NULL", PAGER); else { - for (const char *p = src; *p && length; *p++, length--) + for (const char *p = src; length; *p++, length--) { const char *t; if ((t = array_value(xmlmeta, *p))) @@ -3593,7 +3613,12 @@ safe_put_field(const char *pos,ulong length) else { if (opt_raw_data) - tee_fputs(pos, PAGER); + { + unsigned long i; + /* Can't use tee_fputs(), it stops with NUL characters. */ + for (i= 0; i < length; i++, pos++) + tee_putc(*pos, PAGER); + } else for (const char *end=pos+length ; pos != end ; pos++) { #ifdef USE_MB diff --git a/mysql-test/r/mysql.result b/mysql-test/r/mysql.result index b77d30a4973..4384675152e 100644 --- a/mysql-test/r/mysql.result +++ b/mysql-test/r/mysql.result @@ -162,8 +162,8 @@ ERROR 1049 (42000) at line 1: Unknown database 'invalid' ERROR 1049 (42000) at line 1: Unknown database 'invalid' Test connect with dbname + hostname Test connect with dbname + _invalid_ hostname -ERROR 2005 (HY000) at line 1: Unknown MySQL server host 'invalid_hostname' (errno) -ERROR 2005 (HY000) at line 1: Unknown MySQL server host 'invalid_hostname' (errno) +ERROR 2003 (HY000) at line 1: Can't connect to MySQL server on 'invalid_hostname' (errno) +ERROR 2003 (HY000) at line 1: Can't connect to MySQL server on 'invalid_hostname' (errno) The commands reported in the bug report ERROR 2005 (HY000) at line 1: Unknown MySQL server host 'cyril has found a bug :)XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' (errno) Too long dbname @@ -207,5 +207,27 @@ Warning (Code 1286): Unknown table engine 'nonexistent2' Warning (Code 1266): Using storage engine MyISAM for table 't2' Error (Code 1050): Table 't2' already exists drop tables t1, t2; -<TABLE BORDER=1><TR><TH><</TH></TR><TR><TD>< & ></TD></TR></TABLE> +<TABLE BORDER=1><TR><TH><</TH></TR><TR><TD>< & ></TD></TR></TABLE>create table t1 (a char(5)); +insert into t1 values ('\0b\0'); +a +\0b\0 +a +\0b\0 ++------+ +| a | ++------+ +| b | ++------+ +*************************** 1. row *************************** +a: b +<TABLE BORDER=1><TR><TH>a</TH></TR><TR><TD> b </TD></TR></TABLE><?xml version="1.0"?> + +<resultset statement="select a from t1 +" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <row> + <field name="a"> b </field> + </row> +</resultset> +drop table t1; + End of tests diff --git a/mysql-test/t/mysql.test b/mysql-test/t/mysql.test index 2bb9a02e9d7..cffa6392fa3 100644 --- a/mysql-test/t/mysql.test +++ b/mysql-test/t/mysql.test @@ -387,5 +387,19 @@ drop tables t1, t2; # --exec $MYSQL --html test -e "select '< & >' as '<'" +# +# Bug #27884: mysql client + null byte +# +create table t1 (a char(5)); +insert into t1 values ('\0b\0'); +--exec $MYSQL test -e "select a from t1" +--exec $MYSQL -r test -e "select a from t1" +--exec $MYSQL -s test -e "select a from t1" +--exec $MYSQL --table test -e "select a from t1" +--exec $MYSQL --vertical test -e "select a from t1" +--exec $MYSQL --html test -e "select a from t1" +--exec $MYSQL --xml test -e "select a from t1" +drop table t1; + --echo --echo End of tests |