Bug #27694 mysqlhotcopy & p5-DBD-mysql51-4.003
Submitted: 7 Apr 2007 8:53 Modified: 9 Oct 2007 0:33
Reporter: Oleg Alexeenkov Email Updates:
Status: Closed Impact on me:
None 
Category:MySQL Server: Command-line Clients Severity:S2 (Serious)
Version:5.0.40-BK OS:Any
Assigned to: Timothy Smith
Tags: Contribution, dbd, mysqlhotcopy

[7 Apr 2007 8:53] Oleg Alexeenkov
Description:

z# mysqlhotcopy a b
Invalid db.table name 'a.a`.`c' at /usr/local/bin/mysqlhotcopy line 855.

How to repeat:
run mysqlhotcopy 

Suggested fix:
z# diff -p mysqlhotcopy mysqlhotcopy.orig
*** mysqlhotcopy        Sat Apr  7 12:52:04 2007
--- mysqlhotcopy.orig   Sat Apr  7 12:33:41 2007
*************** my $raid_dir_regex = '[A-Za-z0-9]{2}';
*** 268,274 ****
  foreach my $rdb ( @db_desc ) {
      my $db = $rdb->{src};
      my @dbh_tables = get_list_of_tables( $db );
!     s/\w+\`\.\`// for @dbh_tables; #p5-DBD-mysql51-4.003 fix#
      ## generate regex for tables/files
      my $t_regex;
      my $negated;
--- 268,274 ----
  foreach my $rdb ( @db_desc ) {
      my $db = $rdb->{src};
      my @dbh_tables = get_list_of_tables( $db );
!
      ## generate regex for tables/files
      my $t_regex;
      my $negated;
[7 Apr 2007 10:04] Valerii Kravchuk
Thank you for a bug report and patch. Verified just as described with latest 5.0.40-BK on Linux.
[7 Apr 2007 11:55] Oleg Alexeenkov
Ups.. Better patch:

# diff -p mysqlhotcopy.orig mysqlhotcopy
*** mysqlhotcopy.orig   Sat Apr  7 12:33:41 2007
--- mysqlhotcopy        Sat Apr  7 15:52:50 2007
*************** sub get_list_of_tables {
*** 838,843 ****
--- 838,844 ----
      my $quote = $dbh->get_info(29); # SQL_IDENTIFIER_QUOTE_CHAR
      if ($quote) {
        foreach (@dbh_tables) {
+         s/$quote.*$quote\.//; #p5-DBD-mysql51-4.003 fix#
          s/^$quote(.*)$quote$/$1/;
          s/$quote$quote/$quote/g;
        }
[14 Jul 2007 14:23] Pavel Gubin
Similar patch [5.1.20 & p5-DBD-mysql51-4.005], but checks that 1st component is really this db -- maybe, unnecessary?

Attachment: mysqlhotcopy.diff (application/octet-stream, text), 443 bytes.

[15 Aug 2007 7:05] Timothy Smith
It looks like this isn't due to DBD::mysql, but DBI itself.  Current documentation for "tables" says "Returns a list of matching table names, possibly including a catalog/schema prefix".

mysqlhotcopy should just use table_info() instead.  DBI just calls the DBD's table_info() anyways, and we don't want the quoting, so table_info() is all around better.
[15 Aug 2007 7:35] Bugs System
A patch for this bug has been committed. After review, it may
be pushed to the relevant source trees for release in the next
version. You can access the patch from:

  http://lists.mysql.com/commits/32539

ChangeSet@1.2513, 2007-08-15 01:35:38-06:00, tsmith@ramayana.hindu.god +1 -0
  Bug #27694: mysqlhotcopy & p5-DBD-mysql51-4.003
  
  The symptom is that, when used with recent versions of DBD::mysql,
  mysqlhotcopy uses a double-qualified table name, for example:
  
  Invalid db.table name 'test.test`.`x' at /usr/bin/mysqlhotcopy line 855.
  
  This is caused by a change in DBD::mysql.  See this diff:
  
  http://svn.perl.org/viewcvs/modules/DBD-mysql/trunk/lib/DBD/mysql.pm?r1=9183&r2=9188
  
  Basically, older DBD::mysql implemented a limited ->table_info method;
  now the full method is implemented, and as a result DBI's ->tables()
  method has access to the schema value, so it uses it.
[15 Aug 2007 9:54] Bugs System
A patch for this bug has been committed. After review, it may
be pushed to the relevant source trees for release in the next
version. You can access the patch from:

  http://lists.mysql.com/commits/32548

ChangeSet@1.2513, 2007-08-15 03:54:39-06:00, tsmith@ramayana.hindu.god +1 -0
  Bug #27694: mysqlhotcopy & p5-DBD-mysql51-4.003
  
  Use "SHOW TABLES FROM `db`" instead of $dbh->tables() in the
  get_list_of_tables() routine.
  
  The symptom is that, when used with recent versions of DBD::mysql,
  mysqlhotcopy uses a double-qualified table name, for example:
  
  Invalid db.table name 'test.test`.`x' at /usr/bin/mysqlhotcopy line 855.
  
  This is caused by a change in DBD::mysql.  See this diff:
  
  http://svn.perl.org/viewcvs/modules/DBD-mysql/trunk/lib/DBD/mysql.pm?r1=9183&r2=9188
  
  Basically, older DBD::mysql implemented a limited ->table_info method;
  now the full method is implemented, and as a result DBI's ->tables()
  method has access to the schema value, so it uses it.
[20 Aug 2007 17:03] Bugs System
A patch for this bug has been committed. After review, it may
be pushed to the relevant source trees for release in the next
version. You can access the patch from:

  http://lists.mysql.com/commits/32765

ChangeSet@1.2513, 2007-08-20 11:00:51-06:00, tsmith@ramayana.hindu.god +1 -0
  Bug #27694: mysqlhotcopy & p5-DBD-mysql51-4.003
  
  Use "SHOW TABLES FROM `db`" instead of $dbh->tables() in the
  get_list_of_tables() routine.
  
  The symptom is that, when used with recent versions of DBD::mysql,
  mysqlhotcopy uses a double-qualified table name, for example:
  
  Invalid db.table name 'test.test`.`x' at /usr/bin/mysqlhotcopy line 855.
  
  This is caused by a change in DBD::mysql.  See this diff:
  
  http://svn.perl.org/viewcvs/modules/DBD-mysql/trunk/lib/DBD/mysql.pm?r1=9183&r2=9188
  
  Basically, older DBD::mysql implemented a limited ->table_info method;
  now the full method is implemented, and as a result DBI's ->tables()
  method has access to the schema value, so it uses it.
[28 Aug 2007 19:31] Timothy Smith
Queued to 5.0- and 5.1-maint
[4 Sep 2007 17:11] Bugs System
Pushed into 5.1.23-beta
[4 Sep 2007 17:13] Bugs System
Pushed into 5.0.50
[9 Oct 2007 0:33] Paul Dubois
Noted in 5.0.50, 5.1.23 changelogs.

With recent versions of DBD::mysql, mysqlhotcopy generated table
names that were doubly qualified with the database name.
[31 Jan 2008 21:57] Sveta Smirnova
Bug #33640 was marked as duplicate of this one.
[12 Aug 2009 5:06] Sveta Smirnova
Bug #46653 and bug #27303 were marked as duplicate of this one.
[11 May 2011 18:47] J Wilson
bug #46653 was not a dupe of this bug but rather bug #46653 revealed the existence of this problem because mysqlhotcopy cannot handle '.' in database or table names (which it should). 

Please reopen it and see it's comments for further explanation as bug #46653 still exists in mysqlhotcopy.
[12 May 2011 10:17] Sveta Smirnova
Bug #46653 set as "Verified"