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.
Any comments?
BTW, all examples were done with DBD::ODBC.
Martin