Attached is a small patch for column_info(). $TypeName was set before the test
$ti->{COLUMN_SIZE} >= $ColSize; Thus, if no type has a large enough COLUMN_SIZE (hypothetical case), $TypeName may contain a wrong type name. Now, $TypeName remains undefined in this case. Steffen
*** DBD-ADO-2.4_04-orig/lib/DBD/ADO.pm Tue Apr 09 04:51:22 2002 --- ADO.pm Wed Apr 10 21:12:54 2002 *************** *** 1057,1083 **** if $lastError; while ( ! $RecSet->{EOF} ) { - my @Fields; my $AdoType = $RecSet->Fields('DATA_TYPE' )->{Value}; my $ColFlags = $RecSet->Fields('COLUMN_FLAGS')->{Value}; my $IsLong = ( $ColFlags & $ado_consts->{adFldLong } ) ? 1 : 0; my $IsFixed = ( $ColFlags & $ado_consts->{adFldFixed} ) ? 1 : 0; my @SqlType = DBD::ADO::db::convert_ado_to_odbc( $dbh, $AdoType, $IsFixed, $IsLong ); - # my $TypeInfo = $dbh->type_info( $SqlType[0] ); - # my $TypeName = $TypeInfo ? $TypeInfo->{TYPE_NAME} : undef; - my $TypeName; my $IsNullable = $RecSet->Fields('IS_NULLABLE')->{Value} ? 'YES' : 'NO'; my $ColSize = $RecSet->Fields('NUMERIC_PRECISION' )->{Value} || $RecSet->Fields('CHARACTER_MAXIMUM_LENGTH')->{Value} || 0; # Default value to stop warnings ??? my $ado_tis = DBD::ADO::db::_ado_get_type_info_for( $dbh, $AdoType, $IsFixed, $IsLong ); ! # print '***', $AdoType, $IsFixed, $IsLong, ' => ', $ColSize, $RecSet->Fields('COLUMN_NAME')->{Value}; ! for my $ti ( sort { $a->{COLUMN_SIZE} <=> $b->{COLUMN_SIZE} } @$ado_tis ) ! { $TypeName = $ti->{TYPE_NAME}; ! # print '***', $AdoType, $IsFixed, $IsLong, ' => ', $ti->{TYPE_NAME}, $ti->{COLUMN_SIZE}, $ColSize, $RecSet->Fields('COLUMN_NAME')->{Value}; ! last if $ti->{COLUMN_SIZE} >= $ColSize; } $Fields[ 0] = $RecSet->Fields('TABLE_CATALOG' )->{Value}; # TABLE_CAT $Fields[ 1] = $RecSet->Fields('TABLE_SCHEMA' )->{Value}; # TABLE_SCHEM $Fields[ 2] = $RecSet->Fields('TABLE_NAME' )->{Value}; # TABLE_NAME --- 1057,1085 ---- if $lastError; while ( ! $RecSet->{EOF} ) { my $AdoType = $RecSet->Fields('DATA_TYPE' )->{Value}; my $ColFlags = $RecSet->Fields('COLUMN_FLAGS')->{Value}; my $IsLong = ( $ColFlags & $ado_consts->{adFldLong } ) ? 1 : 0; my $IsFixed = ( $ColFlags & $ado_consts->{adFldFixed} ) ? 1 : 0; my @SqlType = DBD::ADO::db::convert_ado_to_odbc( $dbh, $AdoType, $IsFixed, $IsLong ); my $IsNullable = $RecSet->Fields('IS_NULLABLE')->{Value} ? 'YES' : 'NO'; my $ColSize = $RecSet->Fields('NUMERIC_PRECISION' )->{Value} || $RecSet->Fields('CHARACTER_MAXIMUM_LENGTH')->{Value} || 0; # Default value to stop warnings ??? + my $TypeName; my $ado_tis = DBD::ADO::db::_ado_get_type_info_for( $dbh, $AdoType, $IsFixed, $IsLong ); ! $dbh->trace_msg(' *** ' . $RecSet->Fields('COLUMN_NAME')->{Value} . "($ColSize): $AdoType, $IsFixed, $IsLong\n", 3 ); ! # find the first type which has a large enough COLUMN_SIZE: ! for my $ti ( sort { $a->{COLUMN_SIZE} <=> $b->{COLUMN_SIZE} } @$ado_tis ) { ! $dbh->trace_msg(" * => $ti->{TYPE_NAME}($ti->{COLUMN_SIZE})\n", 3 ); ! if ( $ti->{COLUMN_SIZE} >= $ColSize ) { $TypeName = $ti->{TYPE_NAME}; ! last ; } + } + # unless $TypeName: Standard SQL type name??? + + my @Fields; $Fields[ 0] = $RecSet->Fields('TABLE_CATALOG' )->{Value}; # TABLE_CAT $Fields[ 1] = $RecSet->Fields('TABLE_SCHEMA' )->{Value}; # TABLE_SCHEM $Fields[ 2] = $RecSet->Fields('TABLE_NAME' )->{Value}; # TABLE_NAME