Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-6128

[PATCH] mysqlcheck wrongly escapes '.' in table names

Details

    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

      Attachments

        Activity

          hholzgra Hartmut Holzgraefe added a comment - - edited

          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 */

          hholzgra Hartmut Holzgraefe added a comment - - edited 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 */

          proposed patch

          hholzgra Hartmut Holzgraefe added a comment - proposed patch

          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

          hholzgra Hartmut Holzgraefe added a comment - 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

          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?

          hholzgra Hartmut Holzgraefe added a comment - 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?

          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`;

          sanja Oleksandr Byelkin added a comment - 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`;

          patch is pushed to 5.5

          sanja Oleksandr Byelkin added a comment - patch is pushed to 5.5

          People

            sanja Oleksandr Byelkin
            hholzgra Hartmut Holzgraefe
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Git Integration

                Error rendering 'com.xiplink.jira.git.jira_git_plugin:git-issue-webpanel'. Please contact your Jira administrators.