On this page:
6.1 Local Sockets for Postgre  SQL and My  SQL Servers
6.2 Postgre  SQL Database Character Encoding
6.3 Postgre  SQL Authentication
6.4 Postgre  SQL Timestamps and Time Zones
6.5 My  SQL Authentication
6.6 My  SQL CALLing Stored Procedures
6.7 Cassandra Authentication
6.8 SQLite Requirements
6.9 FFI-Based Connections and Concurrency
6.10 ODBC Requirements
6.11 ODBC Status
6.11.1 DB2 ODBC Driver
6.11.2 Oracle ODBC Driver
6.11.3 SQL Server ODBC Driver

6 Notes

This section discusses issues related to specific database systems.

6.1 Local Sockets for PostgreSQL and MySQL Servers

PostgreSQL and MySQL servers are sometimes configured by default to listen only on local sockets (also called “unix domain sockets”). This library provides support for communication over local sockets on Linux and Mac OS. If local socket communication is not available, the server must be reconfigured to listen on a TCP port.

The socket file for a PostgreSQL server is located in the directory specified by the unix_socket_directory variable in the postgresql.conf server configuration file. For example, on Ubuntu 11.04 running PostgreSQL 8.4, the socket directory is /var/run/postgresql and the socket file is /var/run/postgresql/.s.PGSQL.5432. Common socket paths may be searched automatically using the postgresql-guess-socket-path function.

The socket file for a MySQL server is located at the path specified by the socket variable in the my.cnf configuration file. For example, on Ubuntu 11.04 running MySQL 5.1, the socket is located at /var/run/mysqld/mysqld.sock. Common socket paths for MySQL can be searched using the mysql-guess-socket-path function.

6.2 PostgreSQL Database Character Encoding

In most cases, a database’s character encoding is irrelevant, since the connect function always requests translation to Unicode (UTF-8) when creating a connection. If a PostgreSQL database’s character encoding is SQL_ASCII, however, PostgreSQL will not honor the connection encoding; it will instead send untranslated octets, which will cause corrupt data or internal errors in the client connection.

To convert a PostgreSQL database from SQL_ASCII to something sensible, pg_dump the database, recode the dump file (using a utility such as iconv), create a new database with the desired encoding, and pg_restore from the recoded dump file.

6.3 PostgreSQL Authentication

PostgreSQL supports a large variety of authentication mechanisms, controlled by the pg_hba.conf server configuration file. This library currently works with the following authentication methods:
  • plain (and ldap, pam, radius): cleartext password, only if explicitly allowed (see postgresql-connect)

  • md5: MD5-hashed password

  • scram-sha-256: password-based challenge/response protocol

  • peer: only for local sockets

The gss, sspi, krb5, pam, and ldap methods are not supported.

Changed in version 1.2 of package db-lib: Added scram-sha-256 support.

6.4 PostgreSQL Timestamps and Time Zones

PostgreSQL’s timestamp with time zone type is inconsistent with the SQL standard (probably), inconsistent with time with time zone, and potentially confusing to PostgreSQL newcomers.

A time with time zone is essentially a time structure with an additional field storing a time zone offset. In contrast, a timestamp with time zone has no fields beyond those of timestamp. Rather, it indicates that its datetime fields should be interpreted as a UTC time. Thus it represents an absolute point in time, unlike timestamp without time zone, which represents local date and time in some unknown time zone (possibly—hopefully—known the the database designer, but unknown to PostgreSQL).

When a timestamp with time zone is created from a source without time zone information, the session’s TIME ZONE setting is used to adjust the source to UTC time. When the source contains time zone information, it is used to adjust the timestamp to UTC time. In either case, the time zone information is discarded and only the UTC timestamp is stored. When a timestamp with time zone is rendered as text, it is first adjusted to the time zone specified by the TIME ZONE setting (or by AT TIME ZONE) and that offset is included in the rendered text.

This library receives timestamps in binary format, so the time zone adjustment is not applied, nor is the session’s TIME ZONE offset included; thus all sql-timestamp values in a query result have a tz field of 0 (for timestamp with time zone) or #f (for timestamp without time zone). (Previous versions of this library sent and received timestamps as text, so they received timestamps with adjusted time zones.)

6.5 MySQL Authentication

As of version 5.5.7, MySQL supports authentication plugins. The only plugins currently supported by this library are mysql_native_password (the default) and mysql_old_password, which corresponds to the password authentication mechanisms used since version 4.1 and before 4.1, respectively.

6.6 MySQL CALLing Stored Procedures

MySQL CALL statements can be executed only if they return at most one result set and contain no OUT or INOUT parameters.

6.7 Cassandra Authentication

Cassandra, like MySQL, supports authentication plugins. The only plugins currently supported by this library are AllowAllAuthenticator and PasswordAuthenticator.

6.8 SQLite Requirements

SQLite support requires the appropriate native library.

6.9 FFI-Based Connections and Concurrency

Wire-based connections communicate using ports, which do not cause other Racket threads to block. In contrast, an FFI call causes all Racket threads to block until it completes, so FFI-based connections can degrade the interactivity of a Racket program, particularly if long-running queries are performed using the connection. This problem can be avoided by creating the FFI-based connection in a separate place using the #:use-place keyword argument. Such a connection will not block all Racket threads during queries; the disadvantage is the cost of creating and communicating with a separate place.

6.10 ODBC Requirements

ODBC requires the appropriate driver manager native library as well as driver native libraries for each database system you want use ODBC to connect to.

In addition, you must install the appropriate ODBC Drivers and configure Data Sources. Refer to the ODBC documentation for the specific database system for more information.

6.11 ODBC Status

ODBC support is experimental. The behavior of ODBC connections can vary widely depending on the driver in use and even the configuration of a particular data source.

The following sections describe the configurations that this library has been tested with. Reports of success or failure on other platforms or with other drivers would be appreciated.

6.11.1 DB2 ODBC Driver

IBM DB2 ODBC drivers were tested with the following software configuration:

This driver seems to require environment variables to be set using the provided scripts (eg, source /home/db2inst1/sqllib/db2profile).

Known issues:
  • The driver does not support the standard SQL_C_NUMERIC structure for retrieving DECIMAL/NUMERIC fields.

    Fix: Use #:quirks '(no-c-numeric) with odbc-connect.

6.11.2 Oracle ODBC Driver

Oracle ODBC drivers were tested with the following software configuration:

Typical installations of the drivers require the LD_LIBRARY_PATH environment variable to be set to the driver’s installed lib directory (ie, the directory containing libsqora.so) so the driver can find its sibling shared libraries.

Known issues:
  • With the #:strict-parameter-types? #t option, parameters seem to be always assigned the type varchar.

    Fix: Leave strict parameter types off (the default).

  • The driver does not support the SQL_C_BIGINT format for parameters or result fields. Consequently, passing large integers as query parameters may fail.

    Fix: Use #:quirks '(no-c-bigint) with odbc-connect.

  • A field of type TIME causes the driver to return garbage for the typeid and type parameters. This usually causes an error with a message like “unsupported type; typeid: -29936”, but with a random typeid value. (Oracle appears not to have a TIME type, so this bug might only appear when a value is explicitly CAST as TIMEfor some reason, that doesn’t produce an error.)

  • Attempting to quit Racket with a connection still open may cause Racket to hang. Specifically, the problem seems to be in the driver’s _fini function.

    Fix: Close connections before exiting, either explicitly using disconnect or by shutting down their custodians.

6.11.3 SQL Server ODBC Driver

Microsoft SQL Server ODBC drivers were tested with the following software configuration:

Known issues:
  • If queries are nested or interleaved—that is, a second query is executed before the first query’s results are completely consumed—the driver might signal an error “Connection is busy with results for another command (SQLSTATE: HY000)”.

    Fix: Set the MARS_Connection data source option to Yes (see this page). The ODBC Manager GUI does not expose the option, but it can be added by editing the registry.