On Tue, Jun 23, 2015 at 09:12:16AM +0100, Martin J. Evans wrote:
> I was recently confirming table_info special cases and discovered the case 
> for getting table_types cannot work.
> 
> table_info('','','','%')
> 
> should return a list of table types but it returns a list of empty strings 
> instead:
> 
> my @types = $h->tables('', '', '', '%');
> print "all types:\n", join("xxx\n", @types), "\n";
> # should output something like:
> # "dbo"
> # "INFORMATION_SCHEMA"
> # "sys"
> # and actually outputs:
> xxx
> xxx
> 
> It seems to be down to the following in DBI.pm:
> 
>     sub tables {
>       my ($dbh, @args) = @_;
>       my $sth    = $dbh->table_info(@args[0,1,2,3,4]) or return;
>       my $tables = $sth->fetchall_arrayref or return;
>       my @tables;
>       if ($dbh->get_info(29)) { # SQL_IDENTIFIER_QUOTE_CHAR
>             # problem is missing 3 in the slice below
>           @tables = map { $dbh->quote_identifier( @{$_}[0,1,2] ) } @$tables;
>       }
> 
> My test case missed this because currently it is returning 3 values but they 
> are all ''.
> 
> Adding 3 to the slice fixes the issue but unfortunately changes the data 
> returned from the deprecated tables method which now returns values like this:
> 
> "master"."dbo"."DBD_ODBC_LOB_TEST"."TABLE"
> 
> instead of (before)
> 
> "master"."dbo"."DBD_ODBC_LOB_TEST"
> 
> table_info is ok because it returns a result set and not a set of values 
> pushed through quote_identifier.

Thanks for the great analysis Martin.

> Any comments?

The tables('', '', '', '%') call is a special case so it seems
reasonable to handle it as a special case in the code.

Tim.

Reply via email to