[MDEV-6128] [PATCH] mysqlcheck wrongly escapes '.' in table names Created: 2014-04-17  Updated: 2016-08-08  Resolved: 2015-01-28

Status: Closed
Project: MariaDB Server
Component/s: OTHER
Affects Version/s: 5.5.36, 5.5.37, 10.0.7, 10.0.10
Fix Version/s: 5.5.42, 10.0.17, 10.1.3

Type: Bug Priority: Critical
Reporter: Hartmut Holzgraefe Assignee: Oleksandr Byelkin
Resolution: Fixed Votes: 0
Labels: upstream
Environment:

linux


Attachments: File mdev-6128.patch    

 Description   

mysqlcheck encloses dots in a table in backticks, this doesn't make sense though as never expects to see a db.table combination (database and table names are passed in as separate parameters)

This breaks mysqlcheck, and indirectly mysql_upgrade, for tables with a dot in their name

test case:

  CREATE TABLE test.`foo.bar`(id int primary key);

then run

  mysqlcheck test foo.bar

or

  mysql_upgrade --force

This was introduced in revision 1810.3494.1 ( http://bazaar.launchpad.net/~mysql/mysql-server/5.6/revision/1810.3494.1 ) as part of a fix for http://bugs.mysql.com/bug.php?id=30654



 Comments   
Comment by Hartmut Holzgraefe [ 2014-04-17 ]

proposed fix:

=== modified file 'client/mysqlcheck.c'
--- client/mysqlcheck.c	2013-05-07 11:05:09 +0000
+++ client/mysqlcheck.c	2014-04-17 12:57:31 +0000
@@ -513,8 +513,6 @@
   {
     if (*p == '`')
       extra_length++;
-    else if (*p == '.')
-      extra_length+= 2;
 
   }
   DBUG_RETURN((uint) ((p - name) + extra_length));
@@ -529,11 +527,6 @@
   for (; *src; src++)
   {
     switch (*src) {
-    case '.':            /* add backticks around '.' */
-      *dest++= '`';
-      *dest++= '.';
-      *dest++= '`';
-      break;
     case '`':            /* escape backtick character */
       *dest++= '`';
       /* fall through */

Comment by Hartmut Holzgraefe [ 2014-04-17 ]

proposed patch

Comment by Hartmut Holzgraefe [ 2014-04-18 ]

looks as if this is fixed in 5.7, but something is odd about it on launchpad

check

http://bazaar.launchpad.net/~mysql/mysql-server/5.6/annotate/head:/client/mysqlcheck.c#L52...

and

http://bazaar.launchpad.net/~mysql/mysql-server/5.7/annotate/head:/client/mysqlcheck.c#L52...

the code escaping the '.' is gone in 5.7, but launchpad still lists the old changeset from 2007 for this part of the code?

see also http://bugs.mysql.com/bug.php?id=72382

Comment by Hartmut Holzgraefe [ 2014-04-18 ]

Oracle's actual fix change sets are here:

http://bazaar.launchpad.net/~mysql/mysql-server/5.7/revision/7416
http://bazaar.launchpad.net/~mysql/mysql-server/5.7/revision/7481

looks as if there is a little more work needed as at some point it actually used db.table names internally ...

my local 5.7 checkout also shows the wrong old changeset with "bzr annotate client/mysqlcheck.c",
but "bzr log client/mysqlcheck.c" so there seems to be a bzr bug? Or has Oracle somehow managed to corrupt their 5.7 tree?

Comment by Oleksandr Byelkin [ 2015-01-28 ]

test suite (just for record):

CREATE TABLE test.`t.1` (id int);
 
--echo mysqlcheck test t.1
--exec $MYSQL_CHECK test t.1
 
drop table test.`t.1`;

Comment by Oleksandr Byelkin [ 2015-01-28 ]

patch is pushed to 5.5

Generated at Thu Feb 08 07:09:34 UTC 2024 using Jira 8.20.16#820016-sha1:9d11dbea5f4be3d4cc21f03a88dd11d8c8687422.