On Mon, Mar 18, 2002 at 12:05:28PM +0100, Steffen Goeldner wrote:
> Tim Bunce wrote:
> > 
> > Thanks.
> > 
> > I think the DBI should follow ODBC where it differs from SQL/CLI
> > in areas where ODBC is not likely to change. This is probably
> > one of those places.
> 
> O.k., I dropped the first 'XXX' (and retained that paragraph).
> I added a note that ODBC and SQL/CLI differ and dropped the
> paragraph with the second 'XXX'.
> 
> FYI, let's look how various ODBC driver handle empty strings!

Thanks.

A more realistic example would be for drivers that return empty
strings or NULL for the catalog portion.

> + =head2 Catalog Methods
> + 
> + An application can retrieve metadata information from the DBMS by issuing
> + appropriate queries on the views of the Information Schema. Unfortunately,
> + C<INFORMATION_SCHEMA> views are seldom supported by the DBMS.
> + Special methods (catalog methods) are available to return result sets
> + for a small but important portion of that metadata:
> + 
> +   column_info
> +   foreign_key_info
> +   primary_key_info
> +   table_info
> + 
> + All catalog methods accept arguments in order to restrict the result sets.
> + Passing C<undef> to an optional argument does not constrain the search for
> + that argument.
> + However, an empty string ('') is treated as a regular search criteria
> + and will only match an empty value.

Does that apply equally ato both ordinary values and search patterns?

> + 
> + B<Note>: SQL/CLI and ODBC differ in the handling of empty strings. An
> + empty string will not restrict the result set in SQL/CLI.
> + 
> + Most arguments in the catalog methods accept only I<ordinary values>, e.g.
> + the arguments of C<primary_key_info()>.
> + Such arguments are treated as a literal string, i.e. the case is significant
> + and quote characters are taken literally.
> + 
> + Some arguments in the catalog methods accept I<search patterns> (strings
> + containing '_' and/or '%'), e.g. the C<$table> argument of C<column_info()>.
> + Passing '%' is equivalent to leaving the argument C<undef>.
> + 
> + B<Caveat>: The underscore ('_') is valid and often used in SQL identifiers.
> + Passing such a value to a search pattern argument may return more rows than
> + expected!
> + To include pattern characters as literals, they must be preceded by an
> + escape character which can be retrieved with
> + 
> +   $esc = $dbh->get_info( 14 );  # SQL_SEARCH_PATTERN_ESCAPE

+       $search_pattern =~ s/([_%])/$esc$1/g;

(not checked, but I think something like that is worth adding.)a

> + The ODBC and SQL/CLI specifications define a way to change the default
> + behavior described above: All arguments (except list value arguments) are
> + treated as identifier if the C<SQL_ATTR_METADATA_ID> attribute is set to
> + C<SQL_TRUE>.

If "identifier" is not the same as "ordinary value" then the difference ought to
be explained here.

> + The DBI (currently) does not support the C<SQL_ATTR_METADATA_ID> attribute,
> + i.e. it behaves like an ODBC driver where C<SQL_ATTR_METADATA_ID> is set to
> + C<SQL_FALSE>.

 ... which is the default setting for most (all?) ODBC drivers?

Tim.

Reply via email to