On Wed, Mar 10, 2010 at 10:25:45AM +0000, Martin Evans wrote:

> 1. the TYPE attribute on a statement is clearly documented as to what it
> should contain - "The values correspond to the international standards
> (ANSI X3.135 and ISO/IEC 9075) which, in general terms, means ODBC".
> 
> However, it is not clear from the docs what TYPE_NAME and DATA_TYPE
> columns should be in the column_info method and how they compare with
> the same named columns returned by the type_info method.
> 
> e.g., for the column_info method:
> 
> DATA_TYPE: The concise data type code
>   this could be the database internal type number or the ODBC type
>   the current opinion is that it should be the ODBC type and extra
>   keys added for the internal type (e.g., ora_type, uni_type depending
>   on DBD prefix) NOTE mysql already adds "mysql_is_auto_increment",
>   "mysql_is_pri_key", "mysql_type_name", "mysql_values" keys.
> TYPE_NAME: A data source dependent data type name.
> 
> for type_info:
> 
> DATA_TYPE (integer) SQL data type number.
> TYPE_NAME (string) Data type name for use in CREATE TABLE statements
> 
> Proposed Solution: document column_info DATA_TYPE as being the same as
> {TYPE}  but allow DBDs to add other keys to the column_info result (some
> already do).

The column_info() method maps to ODBC SQLColumns() function, and the
type_info() method maps to the SQLGetTypeInfo() function.
http://search.cpan.org/~timb/DBI-1.609/DBI.pm#ODBC_and_SQL/CLI_Standards_Reference_Information

How does the proposed solution fit with that model, and is a better fit
possible?

> 2. There is no guarantee that if you find a TYPE_NAME in column_info you
> can map it successfully to the type in type_info - this is annoying and
> difficult to workaround.
> 
> Proposed Solution: document they should be the same

Subject to the standard - see above. An underlying issue here may be
(I'm guessing) that unlike ODBC, the DBI doesn't parse and rewrite
'standard sql' statements to the drivers dialect.

> 3. column_info is not always provided by a DBD and the documentation
> fails to mention that in this case the returned statement handle is undef.
> 
> Proposed Solution: update documentation

Yeap.

> 4. It appears FetchHashKeyName is not honoured in the results of
> column_info though how this occurs does appear to depend on the DBD.
> Merijn got all upper case keys from MySQL when FetchHashKeyName =
> name_lc e.g.,
> 
> {   BUFFER_LENGTH    => undef, # <-- should have been lowercase
>     CHAR_OCTET_LENGTH => undef,# <-- should have been lowercase
>     .
>     .
> }
> 
> and with DBD::ODBC I find the column names follow FetchHashKeyName but
> not the key columns passed to fetchXXX_arrayref e.g.,
> 
> with NAME_lc I get:
> 
> $VAR1 = {
>           'PSDATE' => { # <-- these are as the database returns them
>                         # and not lowercased here
>                         'char_octet_length' => undef, # correctly cased
> 
> and name_uc I get:
> 
> $VAR1 = {
>           'PSDATE' => { # correctly cased by accident - as db returned
>                         'DECIMAL_DIGITS' => '3', # correctly cased
> 
> This does not altogether surprise me since in DBD::ODBC's case the
> result-set is generated by the ODBC driver not by DBD::ODBC.
> 
> Proposed Solution: The MySQL case is plain wrong (needs fixing), the
> DBD::ODBC is only wrong if case of the data_type_name is supposed to
> follow FetchHashKeyName as well. What should it be?

The cause is probably that some drivers use DBD::Sponge but neglect to
pass the value of FetchHashKeyName through.  Even if we wanted to change
it there's a fairly high probability of such a change breaking code.

Tim.

Reply via email to