# Changelog
# $Id: CHANGES,v 1.38.2.158 2004/11/16 03:01:10 mmatthew Exp $

11-15-04 - Version 3.0.16-ga
	- Re-issue character set configuration commands when re-using pooled
	  connections and/or Connection.changeUser() when connected to MySQL-4.1
	  or newer.
	- Fixed ResultSetMetaData.isReadOnly() to detect non-writable columns
	  when connected to MySQL-4.1 or newer, based on existence of 'original'
	  table and column names.
	- Fixed BUG#5664, ResultSet.updateByte() when on insert row
      throws ArrayOutOfBoundsException.
    - Fixed DatabaseMetaData.getTypes() returning incorrect (i.e. non-negative)
      scale for the 'NUMERIC' type.
    - Fixed BUG#6198, off-by-one bug in Buffer.readString(string).
    - Made TINYINT(1) -> BIT/Boolean conversion configurable via 'tinyInt1isBit'
      property (default 'true' to be JDBC compliant out of the box).
    - Only set 'character_set_results' during connection establishment if
      server version >= 4.1.1.
    - Fixed regression where useUnbufferedInput was defaulting to 'false'.
    - Fixed BUG#6231, ResultSet.getTimestamp() on a column with TIME in it
      fails.

09-07-04 - Version 3.0.15-ga
	- Fixed BUG#4010 - StringUtils.escapeEasternUnicodeByteStream is still
	  broken for GBK
	- Fixed BUG#4334 - Failover for autoReconnect not using port #'s for any
	  hosts, and not retrying all hosts. (WARN: This required a change to 
	  the SocketFactory connect() method signature, which is now
	  
	    public Socket connect(String host, int portNumber, Properties props),
	  
	  therefore any third-party socket factories will have to be changed
	  to support this signature.
	- Logical connections created by MysqlConnectionPoolDataSource will
	  now issue a rollback() when they are closed and sent back to the pool.
	  If your application server/connection pool already does this for you, you 
	  can set the 'rollbackOnPooledClose' property to false to avoid the
	  overhead of an extra rollback().
	- Removed redundant calls to checkRowPos() in ResultSet.
	- Fixed BUG#4742, 'DOUBLE' mapped twice in DBMD.getTypeInfo().
	- Added FLOSS license exemption.
	- Fixed BUG#4808, calling .close() twice on a PooledConnection causes NPE.
	- Fixed BUG#4138 and BUG#4860, DBMD.getColumns() returns incorrect JDBC 
	  type for unsigned columns. This affects type mappings for all numeric 
	  types in the RSMD.getColumnType() and RSMD.getColumnTypeNames() methods 
	  as well, to ensure that 'like' types from DBMD.getColumns() match up 
	  with what RSMD.getColumnType() and getColumnTypeNames() return.
	- 'Production' - 'GA' in naming scheme of distributions.
	- Fix for BUG#4880, RSMD.getPrecision() returning 0 for non-numeric types
	  (should return max length in chars for non-binary types, max length
	  in bytes for binary types). This fix also fixes mapping of 
	  RSMD.getColumnType() and RSMD.getColumnTypeName() for the BLOB types based
	  on the length sent from the server (the server doesn't distinguish between
	  TINYBLOB, BLOB, MEDIUMBLOB or LONGBLOB at the network protocol level).
	- Fixed BUG#5022 - ResultSet should release Field[] instance in .close().
	- Fixed BUG#5069 -- ResultSet.getMetaData() should not return 
	  incorrectly-initialized metadata if the result set has been closed, but 
	  should instead throw a SQLException. Also fixed for getRow() and 
	  getWarnings() and traversal methods by calling checkClosed() before
	  operating on instance-level fields that are nullified during .close().
	- Parse new timezone variables from 4.1.x servers.
	- Use _binary introducer for PreparedStatement.setBytes() and 
	  set*Stream() when connected to MySQL-4.1.x or newer to avoid 
	  misinterpretation during character conversion.
	  
05-28-04 - Version 3.0.14-production
	- Fixed URL parsing error
	
05-27-04 - Version 3.0.13-production
	- Fixed BUG#3848 - Using a MySQLDatasource without server name fails
	- Fixed BUG#3920 - "No Database Selected" when using 
	  MysqlConnectionPoolDataSource.
	- Fixed BUG#3873 - PreparedStatement.getGeneratedKeys() method returns only 
	  1 result for batched insertions
	  
05-18-04 - Version 3.0.12-production
	- Add unsigned attribute to DatabaseMetaData.getColumns() output
	  in the TYPE_NAME column.
	- Added 'failOverReadOnly' property, to allow end-user to configure
	  state of connection (read-only/writable) when failed over.
	- Backported 'change user' and 'reset server state' functionality
      from 3.1 branch, to allow clients of MysqlConnectionPoolDataSource
      to reset server state on getConnection() on a pooled connection.
    - Don't escape SJIS/GBK/BIG5 when using MySQL-4.1 or newer.
    - Allow 'url' parameter for MysqlDataSource and MysqlConnectionPool
      DataSource so that passing of other properties is possible from
      inside appservers.
    - Map duplicate key and foreign key errors to SQLState of
      '23000'.
    - Backport documentation tooling from 3.1 branch.
    - Return creating statement for ResultSets created by
      getGeneratedKeys() (BUG#2957)
    - Allow java.util.Date to be sent in as parameter to
      PreparedStatement.setObject(), converting it to a Timestamp
      to maintain full precision (BUG#3103).
    - Don't truncate BLOBs/CLOBs when using setBytes() and/or
      setBinary/CharacterStream() (BUG#2670).
    - Dynamically configure character set mappings for field-level
      character sets on MySQL-4.1.0 and newer using 'SHOW COLLATION'
      when connecting.
    - Map 'binary' character set to 'US-ASCII' to support DATETIME
      charset recognition for servers >= 4.1.2
    - Use 'SET character_set_results" during initialization to allow any 
      charset to be returned to the driver for result sets.
    - Use charsetnr returned during connect to encode queries before
      issuing 'SET NAMES' on MySQL >= 4.1.0.
    - Add helper methods to ResultSetMetaData (getColumnCharacterEncoding()
      and getColumnCharacterSet()) to allow end-users to see what charset
      the driver thinks it should be using for the column.
    - Only set character_set_results for MySQL >= 4.1.0.
    - Fixed BUG#3511, StringUtils.escapeSJISByteStream() not covering all
      eastern double-byte charsets correctly.
    - Renamed StringUtils.escapeSJISByteStream() to more appropriate
      escapeEasternUnicodeByteStream().
    - Fixed BUG#3554 - Not specifying database in URL caused MalformedURL
      exception.
    - Auto-convert MySQL encoding names to Java encoding names if used
      for characterEncoding property.
    - Added encoding names that are recognized on some JVMs to fix case
      where they were reverse-mapped to MySQL encoding names incorrectly.
    - Use junit.textui.TestRunner for all unit tests (to allow them to be
      run from the command line outside of Ant or Eclipse).
    - Fixed BUG#3557 - UpdatableResultSet not picking up default values
      for moveToInsertRow().
    - Fixed BUG#3570 - inconsistent reporting of column type. The server
      still doesn't return all types for *BLOBs *TEXT correctly, so the
      driver won't return those correctly.
    - Fixed BUG#3520 -- DBMD.getSQLStateType() returns incorrect value.
    - Fixed regression in PreparedStatement.setString() and eastern character
      encodings.
    - Made StringRegressionTest 4.1-unicode aware.
     
02-19-04 - Version 3.0.11-stable
	- Trigger a 'SET NAMES utf8' when encoding is forced to 'utf8' _or_
	  'utf-8' via the 'characterEncoding' property. Previously, only the
	  Java-style encoding name of 'utf-8' would trigger this.
	- AutoReconnect time was growing faster than exponentially (BUG#2447).
	- Fixed failover always going to last host in list (BUG#2578)
	- Added 'useUnbufferedInput' parameter, and now use it by default
	  (due to JVM issue 
	  http://developer.java.sun.com/developer/bugParade/bugs/4401235.html)
	- Detect 'on/off' or '1','2','3' form of lower_case_table_names on 
	  server.
	- Return 'java.lang.Integer' for TINYINT and SMALLINT types from
	  ResultSetMetaData.getColumnClassName() (fix for BUG#2852).
	- Return 'java.lang.Double' for FLOAT type from ResultSetMetaData.
	  getColumnClassName() (fix for BUG#2855).
	- Return '[B' instead of java.lang.Object for BINARY, VARBINARY and 
	  LONGVARBINARY types from ResultSetMetaData.getColumnClassName() 
	  (JDBC compliance).
	- Issue connection events on all instances created from a 
	  ConnectionPoolDataSource.
	  
01-13-04 - Version 3.0.10-stable
    - Don't count quoted id's when inside a 'string' in PreparedStatement
      parsing (fix for BUG#1511).
    - 'Friendlier' exception message for PacketTooLargeException
       (BUG#1534).
    - Backported fix for aliased tables and UpdatableResultSets in 
      checkUpdatability() method from 3.1 branch.
    - Fix for ArrayIndexOutOfBounds exception when using Statement.setMaxRows()
      (BUG#1695).
    - Fixed BUG#1576, dealing with large blobs and split packets not being 
      read correctly.
    - Fixed regression of Statement.getGeneratedKeys() and REPLACE statements.
    - Fixed BUG#1630, subsequent call to ResultSet.updateFoo() causes NPE if
      result set is not updatable.
    - Fix for 4.1.1-style auth with no password.
    - Fix for BUG#1731, Foreign Keys column sequence is not consistent in
      DatabaseMetaData.getImported/Exported/CrossReference().
    - Fix for BUG#1775 - DatabaseMetaData.getSystemFunction() returning 
      bad function 'VResultsSion'.
    - Fix for BUG#1592 -- cross-database updatable result sets
      are not checked for updatability correctly.
    - DatabaseMetaData.getColumns() should return Types.LONGVARCHAR for
      MySQL LONGTEXT type.
    - ResultSet.getObject() on TINYINT and SMALLINT columns should return 
      Java type 'Integer' (BUG#1913)
    - Added 'alwaysClearStream' connection property, which causes the driver
      to always empty any remaining data on the input stream before
      each query.
    - Added more descriptive error message 'Server Configuration Denies 
      Access to DataSource', as well as retrieval of message from server.
    - Autoreconnect code didn't set catalog upon reconnect if it had been 
      changed.
    - Implement ResultSet.updateClob().
    - ResultSetMetaData.isCaseSensitive() returned wrong value for CHAR/VARCHAR
      columns.
    - Fix for BUG#1933 -- Connection property "maxRows" not honored.
    - Fix for BUG#1925 -- Statements being created too many times in 
      DBMD.extractForeignKeyFromCreateTable().
    - Fix for BUG#1914 -- Support escape sequence {fn convert ... }
    - Fix for BUG#1958 -- ArrayIndexOutOfBounds when parameter number == 
      number of parameters + 1.
    - Fix for BUG#2006 -- ResultSet.findColumn() should use first matching
      column name when there are duplicate column names in SELECT query 
      (JDBC-compliance).
    - Removed static synchronization bottleneck from 
      PreparedStatement.setTimestamp().
    - Removed static synchronization bottleneck from instance factory 
      method of SingleByteCharsetConverter.
    - Enable caching of the parsing stage of prepared statements via 
      the 'cachePrepStmts', 'prepStmtCacheSize' and 'prepStmtCacheSqlLimit'
      properties (disabled by default).
    - Speed up parsing of PreparedStatements, try to use one-pass whenever
      possible.
    - Fixed security exception when used in Applets (applets can't
      read the system property 'file.encoding' which is needed
      for LOAD DATA LOCAL INFILE).
    - Use constants for SQLStates.
    - Map charset 'ko18_ru' to 'ko18r' when connected to MySQL-4.1.0 or
      newer.
    - Ensure that Buffer.writeString() saves room for the \0.
    - Fixed exception 'Unknown character set 'danish' on connect w/ JDK-1.4.0
    - Fixed mappings in SQLError to report deadlocks with SQLStates of '41000'.
    - 'maxRows' property would affect internal statements, so check it for all 
      statement creation internal to the driver, and set to 0 when it is not.
      
10-07-03 - Version 3.0.9-stable
	- Faster date handling code in ResultSet and PreparedStatement (no longer
	  uses Date methods that synchronize on static calendars).
	- Fixed test for end of buffer in Buffer.readString().
	- Fixed ResultSet.previous() behavior to move current 
	  position to before result set when on first row
	  of result set (bugs.mysql.com BUG#496)
	- Fixed Statement and PreparedStatement issuing bogus queries
	  when setMaxRows() had been used and a LIMIT clause was present
	  in the query.
	- Fixed BUG#661 - refreshRow didn't work when primary key values
	  contained values that needed to be escaped (they ended up being
	  doubly-escaped).
	- Support InnoDB contraint names when extracting foreign key info
	  in DatabaseMetaData BUG#517 and BUG#664
	  (impl. ideas from Parwinder Sekhon)
	- Backported 4.1 protocol changes from 3.1 branch (server-side SQL
	  states, new field info, larger client capability flags, 
	  connect-with-database, etc).
	- Fix UpdatableResultSet to return values for getXXX() when on
	  insert row (BUG#675).
	- The insertRow in an UpdatableResultSet is now loaded with 
	  the default column values when moveToInsertRow() is called
	  (BUG#688)
	- DatabaseMetaData.getColumns() wasn't returning NULL for 
	  default values that are specified as NULL.
	- Change default statement type/concurrency to TYPE_FORWARD_ONLY
	  and CONCUR_READ_ONLY (spec compliance).
	- Don't try and reset isolation level on reconnect if MySQL doesn't
	  support them.
	- Don't wrap SQLExceptions in RowDataDynamic.
	- Don't change timestamp TZ twice if useTimezone==true (BUG#774)
	- Fixed regression in large split-packet handling (BUG#848).
	- Better diagnostic error messages in exceptions for 'streaming'
	  result sets.
	- Issue exception on ResultSet.getXXX() on empty result set (wasn't
	  caught in some cases).
	- Don't hide messages from exceptions thrown in I/O layers.
	- Don't fire connection closed events when closing pooled connections, or
	  on PooledConnection.getConnection() with already open connections (BUG#884).
	- Clip +/- INF (to smallest and largest representative values for the type in 
	  MySQL) and NaN (to 0) for setDouble/setFloat(), and issue a warning on the
	  statement when the server does not support +/- INF or NaN.
	- Fix for BUG#879, double-escaping of '\' when charset is SJIS or GBK and '\'
	  appears in non-escaped input.
	- When emptying input stream of unused rows for 'streaming' result sets,
	  have the current thread yield() every 100 rows in order to not monopolize 
	  CPU time.
	- Fixed BUG#1099, DatabaseMetaData.getColumns() getting confused about the
	  keyword 'set' in character columns.
	- Fixed deadlock issue with Statement.setMaxRows().
	- Fixed CLOB.truncate(), BUG#1130
	- Optimized CLOB.setChracterStream(), BUG#1131
	- Made databaseName, portNumber and serverName optional parameters
	  for MysqlDataSourceFactory (BUG#1246)
	- Fix for BUG#1247 -- ResultSet.get/setString mashing char 127
	- Backported auth. changes for 4.1.1 and newer from 3.1 branch. 
	- Added com.mysql.jdbc.util.BaseBugReport to help creation of testcases
	  for bug reports.
	- Added property to 'clobber' streaming results, by setting the 
	  'clobberStreamingResults' property to 'true' (the default is 'false'). 
	  This will cause a 'streaming' ResultSet to be automatically
	  closed, and any oustanding data still streaming from the server to
	  be discarded if another query is executed before all the data has been
	  read from the server.
	
05-23-03 - Version 3.0.8-stable
	- Allow bogus URLs in Driver.getPropertyInfo().
	- Return list of generated keys when using multi-value INSERTS
	  with Statement.getGeneratedKeys().
	- Use JVM charset with filenames and 'LOAD DATA [LOCAL] INFILE'
	- Fix infinite loop with Connection.cleanup().
	- Changed Ant target 'compile-core' to 'compile-driver', and 
	  made testsuite compilation a separate target.
	- Fixed result set not getting set for Statement.executeUpdate(),
	  which affected getGeneratedKeys() and getUpdateCount() in
	  some cases.
	- Unicode character 0xFFFF in a string would cause the driver to
	  throw an ArrayOutOfBoundsException (Bug #378)
	- Return correct amount of generated keys when using 'REPLACE' 
	  statements.
	- Fix problem detecting server character set in some cases.
	- Fix row data decoding error when using _very_ large packets.
	- Optimized row data decoding.
	- Issue exception when operating on an already-closed
	  prepared statement.
	- Fixed SJIS encoding bug, thanks to Naoto Sato.
	- Optimized usage of EscapeProcessor.
	- Fixed numbering of KEY_SEQ column in DBMD.getImported/Exported keys
	  (thanks to Dave Schoorl).
	- Allow multiple calls to Statement.close()
	- Use hex escaping for PreparedStatement.setBytes()/setBinaryStream()
	  when the character set is Shift_JIS, workaround for parsing bug
	  in server.
	- Added whitespace insensitivity to EscapeProcessor.
	
04-08-03 - Version 3.0.7-stable
	
    - Fixed MysqlPooledConnection.close() calling wrong event type.
    - Fixed StringIndexOutOfBoundsException in PreparedStatement.
      setClob().
    - 4.1 Column Metadata fixes
    - Remove synchronization from Driver.connect() and 
      Driver.acceptsUrl().
    - IOExceptions during a transaction now cause the Connection to 
      be closed.
    - Fixed missing conversion for 'YEAR' type in ResultSetMetaData.
      getColumnTypeName().
    - Don't pick up indexes that start with 'pri' as primary keys
      for DBMD.getPrimaryKeys().
    - Throw SQLExceptions when trying to do operations on a forcefully
      closed Connection (i.e. when a communication link failure occurs).
    - You can now toggle profiling on/off using 
      Connection.setProfileSql(boolean).
    - Fixed charset issues with database metadata (charset was not
      getting set correctly).
    - Updatable ResultSets can now be created for aliased tables/columns
      when connected to MySQL-4.1 or newer.
    - Fixed 'LOAD DATA LOCAL INFILE' bug when file > max_allowed_packet.
    - Fixed escaping of 0x5c ('\') character for GBK and Big5 charsets.
    - Fixed ResultSet.getTimestamp() when underlying field is of type DATE.
    - DatabaseMetaData.dataDefinitionCausesTransactionCommit() now returns
      true.
    - Ensure that packet size from alignPacketSize() does not
      exceed MAX_ALLOWED_PACKET (JVM bug)
    - Don't reset Connection.isReadOnly() when autoReconnecting.
    
02-18-03 - Version 3.0.6-stable

    - Fixed ResultSetMetaData to return "" when catalog not known.
      Fixes NullPointerExceptions with Sun's CachedRowSet.
    - Fixed DBMD.getTypeInfo() and DBMD.getColumns() returning 
      different value for precision in TEXT/BLOB types.
    - Allow ignoring of warning for 'non transactional tables' during
      rollback (compliance/usability) by setting 'ignoreNonTxTables'
      property to 'true'.
    - Fixed SQLExceptions getting swallowed on initial connect.
    - Fixed Statement.setMaxRows() to stop sending 'LIMIT' type queries
      when not needed (performance)
    - Clean up Statement query/method mismatch tests (i.e. INSERT not
      allowed with .executeQuery()).
    - More checks added in ResultSet traversal method to catch
      when in closed state.
    - Fixed ResultSetMetaData.isWritable() to return correct value.
    - Add 'window' of different NULL sorting behavior to 
      DBMD.nullsAreSortedAtStart (4.0.2 to 4.0.10, true, otherwise,
      no).
    - Implemented Blob.setBytes(). You still need to pass the 
      resultant Blob back into an updatable ResultSet or
      PreparedStatement to persist the changes, as MySQL does
      not support 'locators'.
    - Backported 4.1 charset field info changes from Connector/J 3.1
      
01-22-03 - Version 3.0.5-gamma

    - Fixed Buffer.fastSkipLenString() causing ArrayIndexOutOfBounds
      exceptions with some queries when unpacking fields.
    - Implemented an empty TypeMap for Connection.getTypeMap() so that
      some third-party apps work with MySQL (IBM WebSphere 5.0 Connection
      pool).
    - Added missing LONGTEXT type to DBMD.getColumns().
    - Retrieve TX_ISOLATION from database for 
      Connection.getTransactionIsolation() when the MySQL version 
      supports it, instead of an instance variable.
    - Quote table names in DatabaseMetaData.getColumns(),
      getPrimaryKeys(), getIndexInfo(), getBestRowIdentifier()
    - Greatly reduce memory required for setBinaryStream() in
      PreparedStatements.
    - Fixed ResultSet.isBeforeFirst() for empty result sets.
    - Added update options for foreign key metadata.
    - Fixed Connection.getTransactionIsolation() not picking up
      isolation levels for servers older than 4.0.x.
    - Backport 4.1 protocol and authentication changes from 
      Connector/J 3.1.x
      
01-06-03 - Version 3.0.4-gamma
	- Added quoted identifiers to database names for 
	  Connection.setCatalog.
	- Added support for quoted identifiers in PreparedStatement
	  parser.
	- Streamlined character conversion and byte[] handling in 
	  PreparedStatements for setByte().
	- Reduce memory footprint of PreparedStatements by sharing 
	  outbound packet with MysqlIO.
	- Added 'strictUpdates' property to allow control of amount
	  of checking for 'correctness' of updatable result sets. Set this
	  to 'false' if you want faster updatable result sets and you know
	  that you create them from SELECTs on tables with primary keys and
	  that you have selected all primary keys in your query.
	- Added support for 4.0.8-style large packets. 
	- Fixed PreparedStatement.executeBatch() parameter overwriting.
	  
12-17-02 - Version 3.0.3-dev
	- Changed charsToByte in SingleByteCharConverter to be non-static
	- Changed SingleByteCharConverter to use lazy initialization of each
	  converter.
	- Fixed charset handling in Fields.java
	- Implemented Connection.nativeSQL()
	- More robust escape tokenizer -- recognize '--' comments, and allow
	  nested escape sequences (see testsuite.EscapeProcessingTest)
	- DBMD.getImported/ExportedKeys() now handles multiple foreign keys 
	  per table.
	- Fixed ResultSetMetaData.getPrecision() returning incorrect values 
	  for some floating point types.
	- Fixed ResultSetMetaData.getColumnTypeName() returning BLOB for 
	  TEXT and TEXT for BLOB types.
	- Fixed Buffer.isLastDataPacket() for 4.1 and newer servers.
	- Added CLIENT_LONG_FLAG to be able to get more column flags 
	  (isAutoIncrement() being the most important)
	- Because of above, implemented ResultSetMetaData.isAutoIncrement()
	  to use Field.isAutoIncrement().
	- Honor 'lower_case_table_names' when enabled in the server when
	  doing table name comparisons in DatabaseMetaData methods.
	- Some MySQL-4.1 protocol support (extended field info from selects)
	- Use non-aliased table/column names and database names to fullly 
	  qualify tables and columns in UpdatableResultSet (requires 
	  MySQL-4.1 or newer)
	- Allow user to alter behavior of Statement/
	  PreparedStatement.executeBatch() via 'continueBatchOnError' property
	  (defaults to 'true').
	- Check for connection closed in more Connection methods 
	  (createStatement, prepareStatement, setTransactionIsolation,
	   setAutoCommit).
	- More robust implementation of updatable result sets. Checks that
	  _all_ primary keys of the table have been selected.
	- 'LOAD DATA LOCAL INFILE ...' now works, if your server is configured
	  to allow it. Can be turned off with the 'allowLoadLocalInfile' 
	  property (see the README).
	- Substitute '?' for unknown character conversions in single-byte
	  character sets instead of '\0'.
	- NamedPipeSocketFactory now works (only intended for Windows), see
	  README for instructions.
	  
11-08-02 - Version 3.0.2-dev

	- Fixed issue with updatable result sets and PreparedStatements not 
	  working
	- Fixed ResultSet.setFetchDirection(FETCH_UNKNOWN)
	- Fixed issue when calling Statement.setFetchSize() when using 
	  arbitrary values
	- Fixed incorrect conversion in ResultSet.getLong()
	- Implemented ResultSet.updateBlob().
    - Removed duplicate code from UpdatableResultSet (it can be inherited 
      from ResultSet, the extra code for each method to handle updatability
      I thought might someday be necessary has not been needed).
    - Fixed "UnsupportedEncodingException" thrown when "forcing" a 
      character encoding via properties.
    - Fixed various non-ASCII character encoding issues.
    - Added driver property 'useHostsInPrivileges'. Defaults to true. 
      Affects whether or not '@hostname' will be used in 
      DBMD.getColumn/TablePrivileges.
    - All DBMD result set columns describing schemas now return NULL
      to be more compliant with the behavior of other JDBC drivers
      for other databases (MySQL does not support schemas).
    - Added SSL support. See README for information on how to use it.
    - Properly restore connection properties when autoReconnecting
      or failing-over, including autoCommit state, and isolation level.
    - Use 'SHOW CREATE TABLE' when possible for determining foreign key
      information for DatabaseMetaData...also allows cascade options for
      DELETE information to be returned
    - Escape 0x5c character in strings for the SJIS charset.
    - Fixed start position off-by-1 error in Clob.getSubString()
    - Implemented Clob.truncate()
    - Implemented Clob.setString()
    - Implemented Clob.setAsciiStream()
    - Implemented Clob.setCharacterStream()
    - Added com.mysql.jdbc.MiniAdmin class, which allows you to send
      'shutdown' command to MySQL server...Intended to be used when 'embedding'
      Java and MySQL server together in an end-user application.
    - Added 'connectTimeout' parameter that allows users of JDK-1.4 and newer
      to specify a maxium time to wait to establish a connection.
    - Failover and autoReconnect only work when the connection is in a 
      autoCommit(false) state, in order to stay transaction safe
    - Added 'queriesBeforeRetryMaster' property that specifies how many
      queries to issue when failed over before attempting to reconnect 
      to the master (defaults to 50)
    - Fixed DBMD.supportsResultSetConcurrency() so that it returns true
      for ResultSet.TYPE_SCROLL_INSENSITIVE and ResultSet.CONCUR_READ_ONLY or
      ResultSet.CONCUR_UPDATABLE
    - Fixed ResultSet.isLast() for empty result sets (should return false).
    - PreparedStatement now honors stream lengths in setBinary/Ascii/Character
      Stream() unless you set the connection property 
      'useStreamLengthsInPrepStmts' to 'false'.
    - Removed some not-needed temporary object creation by using Strings
      smarter in EscapeProcessor, Connection and DatabaseMetaData classes.
             	
09-21-02 - Version 3.0.1-dev
	
    - Fixed ResultSet.getRow() off-by-one bug.
    - Fixed RowDataStatic.getAt() off-by-one bug.
    - Added limited Clob functionality (ResultSet.getClob(),
      PreparedStatemtent.setClob(), 
      PreparedStatement.setObject(Clob).
    - Added socketTimeout parameter to URL.
    - Connection.isClosed() no longer "pings" the server.
    - Connection.close() issues rollback() when getAutoCommit() == false
    - Added "paranoid" parameter...sanitizes error messages removing
      "sensitive" information from them (i.e. hostnames, ports,
      usernames, etc.), as well as clearing "sensitive" data structures
      when possible.
    - Fixed ResultSetMetaData.isSigned() for TINYINT and BIGINT.
    - Charsets now automatically detected. Optimized code for single-byte
      character set conversion.
    - Implemented ResultSet.getCharacterStream()
    - Added "LOCAL TEMPORARY" to table types in DatabaseMetaData.getTableTypes()
    - Massive code clean-up to follow Java coding conventions (the time had come)
  
	
07-31-02 - Version 3.0.0-dev

	- !!! LICENSE CHANGE !!! The driver is now GPL. If you need
	  non-GPL licenses, please contact me <mark@mysql.com>
	- JDBC-3.0 functionality including 
	  Statement/PreparedStatement.getGeneratedKeys() and
	  ResultSet.getURL()
	- Performance enchancements - driver is now 50-100% faster
	  in most situations, and creates fewer temporary objects
	- Repackaging...new driver name is "com.mysql.jdbc.Driver",
	  old name still works, though (the driver is now provided 
	  by MySQL-AB)
    - Better checking for closed connections in Statement
      and PreparedStatement.
    - Support for streaming (row-by-row) result sets (see README)
      Thanks to Doron.
    - Support for large packets (new addition to MySQL-4.0 protocol),
      see README for more information.
    - JDBC Compliance -- Passes all tests besides stored procedure tests
    - Fix and sort primary key names in DBMetaData (SF bugs 582086 and 582086)
    - Float types now reported as java.sql.Types.FLOAT (SF bug 579573)
    - ResultSet.getTimestamp() now works for DATE types (SF bug 559134)
    - ResultSet.getDate/Time/Timestamp now recognizes all forms of invalid
      values that have been set to all zeroes by MySQL (SF bug 586058)
    - Testsuite now uses Junit (which you can get from www.junit.org)
    - The driver now only works with JDK-1.2 or newer.
    - Added multi-host failover support (see README)
    - General source-code cleanup.
    - Overall speed improvements via controlling transient object
      creation in MysqlIO class when reading packets
    - Performance improvements in  string handling and field 
      metadata creation (lazily instantiated) contributed by
      Alex Twisleton-Wykeham-Fiennes
      
    
05-16-02 - Version 2.0.14

	- More code cleanup
	- PreparedStatement now releases resources on .close() (SF bug 553268)
	- Quoted identifiers not used if server version does not support them. Also,
	  if server started with --ansi or --sql-mode=ANSI_QUOTES then '"' will be 
	  used as an identifier quote, otherwise '`' will be used.
	- ResultSet.getDouble() now uses code built into JDK to be more precise (but slower)
	- LogicalHandle.isClosed() calls through to physical connection
	- Added SQL profiling (to STDERR). Set "profileSql=true" in your JDBC url. 
	  See README for more information.
	- Fixed typo for relaxAutoCommit parameter.
	
04-24-02 - Version 2.0.13

	- More code cleanup.
	- Fixed unicode chars being read incorrectly (SF bug 541088)
	- Faster blob escaping for PrepStmt code contributed by 
	  Pertti Roos (Thanks!)
	- Added set/getPortNumber() to DataSource(s) (SF bug 548167)
	- Added setURL() to MySQLXADataSource (SF bug 546019)
	- PreparedStatement.toString() fixed (SF bug 534026)
	- ResultSetMetaData.getColumnClassName() now implemented
	- Rudimentary version of Statement.getGeneratedKeys() from JDBC-3.0
	  now implemented (you need to be using JDK-1.4 for this to work, I
	  believe)
	- DBMetaData.getIndexInfo() - bad PAGES fixed (SF BUG 542201)
	
04-07-02 - Version 2.0.12

	- General code cleanup. 
	- Added getIdleFor() method to Connection and 
	  MysqlLogicalHandle.
	- Relaxed synchronization in all classes, should fix 520615 and 520393.
	- Added getTable/ColumnPrivileges() to DBMD (fixes 484502).
	- Added new types to getTypeInfo(), fixed existing types thanks to
	  Al Davis and Kid Kalanon.
	- Added support for BIT types (51870) to PreparedStatement.
	- Fixed getRow() bug (527165) in ResultSet
	- Fixes for ResultSet updatability in PreparedStatement.
	- Fixed timezone off by 1-hour bug in PreparedStatement (538286, 528785).
	- ResultSet: Fixed updatability (values being set to null 
	  if not updated).
	- DataSources - fixed setUrl bug (511614, 525565), 
	  wrong datasource class name (532816, 528767)
	- Added identifier quoting to all DatabaseMetaData methods
	  that need them (should fix 518108)
	- Added support for YEAR type (533556)
	- ResultSet.insertRow() should now detect auto_increment fields
	  in most cases and use that value in the new row. This detection
	  will not work in multi-valued keys, however, due to the fact that
	  the MySQL protocol does not return this information.
	- ResultSet.refreshRow() implemented.
	- Fixed testsuite.Traversal afterLast() bug, thanks to Igor Lastric.
	
01-27-02 - Version 2.0.11

	 - Fixed missing DELETE_RULE value in 
	   DBMD.getImported/ExportedKeys() and getCrossReference().
	 - Full synchronization of Statement.java.
	 - More changes to fix "Unexpected end of input stream"
	   errors when reading BLOBs. This should be the last fix.
	   
01-24-02 - Version 2.0.10

     - Fixed spurious "Unexpected end of input stream" errors in 
       MysqlIO (bug 507456).
     - Fixed null-pointer-exceptions when using 
       MysqlConnectionPoolDataSource with Websphere 4 (bug 505839).
       
01-13-02 - Version 2.0.9

	 - Ant build was corrupting included jar files, fixed 
	   (bug 487669).
	 - Fixed extra memory allocation in MysqlIO.readPacket() 
	   (bug 488663).
     - Implementation of DatabaseMetaData.getExported/ImportedKeys() and
       getCrossReference().
     - Full synchronization on methods modifying instance and class-shared
       references, driver should be entirely thread-safe now (please
       let me know if you have problems)
     - DataSource implementations moved to org.gjt.mm.mysql.jdbc2.optional
       package, and (initial) implementations of PooledConnectionDataSource
       and XADataSource are in place (thanks to Todd Wolff for the 
       implementation and testing of PooledConnectionDataSource with 
       IBM WebSphere 4).
     - Added detection of network connection being closed when reading packets
       (thanks to Todd Lizambri).
     - Fixed quoting error with escape processor (bug 486265).
     - Report batch update support through DatabaseMetaData (bug 495101).
     - Fixed off-by-one-hour error in PreparedStatement.setTimestamp() 
       (bug 491577).
     - Removed concatenation support from driver (the '||' operator),
       as older versions of VisualAge seem to be the only thing that
       use it, and it conflicts with the logical '||' operator. You will
       need to start mysqld with the "--ansi" flag to use the '||' 
       operator as concatenation (bug 491680)
     - Fixed casting bug in PreparedStatement (bug 488663).
     
11-25-01 - Version 2.0.8

	 - Batch updates now supported (thanks to some inspiration 
	   from Daniel Rall).
	 - XADataSource/ConnectionPoolDataSource code (experimental)
	 - PreparedStatement.setAnyNumericType() now handles positive
	   exponents correctly (adds "+" so MySQL can understand it).
	 - DatabaseMetaData.getPrimaryKeys() and getBestRowIdentifier()
	   are now more robust in identifying primary keys (matches 
	   regardless of case or abbreviation/full spelling of Primary Key
	   in Key_type column).
	   
10-24-01 - Version 2.0.7

         - PreparedStatement.setCharacterStream() now implemented
         
	 - Fixed dangling socket problem when in high availability
	   (autoReconnect=true) mode, and finalizer for Connection will
	   close any dangling sockets on GC.
	   
         - Fixed ResultSetMetaData.getPrecision() returning one
           less than actual on newer versions of MySQL.
           
         - ResultSet.getBlob() now returns null if column value
           was null.
           
         - Character sets read from database if useUnicode=true
           and characterEncoding is not set. (thanks to 
           Dmitry Vereshchagin)
           
         - Initial transaction isolation level read from 
           database (if avaialable) (thanks to Dmitry Vereshchagin)
           
         - Fixed DatabaseMetaData.supportsTransactions(), and
           supportsTransactionIsolationLevel() and getTypeInfo()
           SQL_DATETIME_SUB and SQL_DATA_TYPE fields not being
           readable.
            
         - Fixed PreparedStatement generating SQL that would end
           up with syntax errors for some queries.
           
         - Fixed ResultSet.isAfterLast() always returning false.
         
         - Fixed timezone issue in PreparedStatement.setTimestamp()
           (thanks to Erik Olofsson)
         
         - Captialize type names when "captializeTypeNames=true"
           is passed in URL or properties (for WebObjects, thanks
           to Anjo Krank)
         
         - Updatable result sets now correctly handle NULL
           values in fields.
           
         - PreparedStatement.setDouble() now uses full-precision
           doubles (reverting a fix made earlier to truncate them).
           
         - PreparedStatement.setBoolean() will use 1/0 for values
           if your MySQL Version >= 3.21.23.

06-16-01 - Fixed PreparedStatement parameter checking
	 
	 - Fixed case-sensitive column names in ResultSet.java

06-13-01 - Fixed ResultSet.getBlob() ArrayIndex out-of-bounds

	 - Fixed ResultSetMetaData.getColumnTypeName for TEXT/BLOB

         - Fixed ArrayIndexOutOfBounds when sending large BLOB queries 
           (Max size packet was not being set)

         - Added ISOLATION level support to Connection.setIsolationLevel()

         - Fixed NPE on PreparedStatement.executeUpdate() when all columns
           have not been set.

         - Fixed data parsing of TIMESTAMPs with 2-digit years

         - Added Byte to PreparedStatement.setObject()

         - ResultSet.getBoolean() now recognizes '-1' as 'true'

         - ResultSet has +/-Inf/inf support

         - ResultSet.insertRow() works now, even if not all columns are
           set (they will be set to "NULL")

         - DataBaseMetaData.getCrossReference() no longer ArrayIndexOOB

         - getObject() on ResultSet correctly does TINYINT->Byte and
           SMALLINT->Short

12-03-00 - Implemented getBigDecimal() without scale component
           for JDBC2.

         - Fixed composite key problem with updateable result sets.

         - Added detection of -/+INF for doubles.

         - Faster ASCII string operations.

         - Fixed incorrect detection of MAX_ALLOWED_PACKET, so sending
           large blobs should work now.

         - Fixed off-by-one error in java.sql.Blob implementation code.

         - Added "ultraDevHack" URL parameter, set to "true" to allow 
           (broken) Macromedia UltraDev to use the driver.

04-06-00 - Fixed RSMD.isWritable() returning wrong value. 
           Thanks to Moritz Maass.

         - Cleaned up exception handling when driver connects

	 - Columns that are of type TEXT now return as Strings
           when you use getObject()

	 - DatabaseMetaData.getPrimaryKeys() now works correctly wrt
	   to key_seq. Thanks to Brian Slesinsky.

         - No escape processing is done on PreparedStatements anymore
           per JDBC spec.

         - Fixed many JDBC-2.0 traversal, positioning bugs, especially
           wrt to empty result sets. Thanks to Ron Smits, Nick Brook,
           Cessar Garcia and Carlos Martinez.

	 - Fixed some issues with updatability support in ResultSet when
           using multiple primary keys.

02-21-00 - Fixed Bad Handshake problem.

01-10-00 - Fixes to ResultSet for insertRow() - Thanks to
           Cesar Garcia

	 - Fix to Driver to recognize JDBC-2.0 by loading a JDBC-2.0
           class, instead of relying on JDK version numbers. Thanks
	   to John Baker.

	 - Fixed ResultSet to return correct row numbers.

	 - Statement.getUpdateCount() now returns rows matched,
	   instead of rows actually updated, which is more SQL-92
	   like.

10-29-99 - Statement/PreparedStatement.getMoreResults() bug fixed. 
           Thanks to Noel J. Bergman.

         - Added Short as a type to PreparedStatement.setObject().
           Thanks to Jeff Crowder

         - Driver now automagically configures maximum/preferred packet
           sizes by querying server.

         - Autoreconnect code uses fast ping command if server supports
           it.

         - Fixed various bugs wrt. to packet sizing when reading from
           the server and when alloc'ing to write to the server.

08-17-99 - Now compiles under JDK-1.2. The driver supports both JDK-1.1
           and JDK-1.2 at the same time through a core set of classes.
           The driver will load the appropriate interface classes at
           runtime by figuring out which JVM version you are using.

         - Fixes for result sets with all nulls in the first row.
           (Pointed out by Tim Endres)

         - Fixes to column numbers in SQLExceptions in ResultSet
           (Thanks to Blas Rodriguez Somoza)

         - The database no longer needs to specified to connect.
           (Thanks to Christian Motschke)

07-04-99 - Better Documentation (in progress), in doc/mm.doc/book1.html

           DBMD now allows null for a column name pattern (not in 
           spec), which it changes to '%'.

           DBMD now has correct types/lengths for getXXX().

           ResultSet.getDate(), getTime(), and getTimestamp() fixes. 
           (contributed by Alan Wilken)

           EscapeProcessor now handles \{ \} and { or } inside quotes
           correctly. (thanks to Alik for some ideas on how to fix it)

           Fixes to properties handling in Connection.
           (contributed by Juho Tikkala)

           ResultSet.getObject() now returns null for NULL columns
           in the table, rather than bombing out.
           (thanks to Ben Grosman)

           ResultSet.getObject() now returns Strings for types
           from MySQL that it doesn't know about. (Suggested by
           Chris Perdue)

           Removed DataInput/Output streams, not needed, 1/2 number
           of method calls per IO operation.

           Use default character encoding if one is not specified. This
           is a work-around for broken JVMs, because according to spec,
           EVERY JVM must support "ISO8859_1", but they don't.

06-03-99 - Fixed Connection to use the platform character encoding
           instead of "ISO8859_1" if one isn't explicitly set. This 
           fixes problems people were having loading the character-
           converter classes that didn't always exist (JVM bug).
           (thanks to Fritz Elfert for pointing out this problem)

05-27-99 - Changed MysqlIO to re-use packets where possible to reduce
           memory usage.

05-13-99 - Fixed escape-processor bugs pertaining to {} inside
           quotes.

04-14-99 - Fixed character-set support for non-Javasoft JVMs
           (thanks to many people for pointing it out)

           Fixed ResultSet.getBoolean() to recognize 'y' & 'n'
           as well as '1' & '0' as boolean flags.
           (thanks to Tim Pizey)

           Fixed ResultSet.getTimestamp() to give better performance.
           (thanks to Richard Swift)

           Fixed getByte() for numeric types.
           (thanks to Ray Bellis)

           Fixed DatabaseMetaData.getTypeInfo() for DATE type.
           (thanks to Paul Johnston)

           Fixed EscapeProcessor for "fn" calls.
	   (thanks to Piyush Shah at locomotive.org)

           Fixed EscapeProcessor to not do extraneous work if there
           are no escape codes.
           (thanks to Ryan Gustafson)

           Fixed Driver to parse URLs of the form "jdbc:mysql://host:port"
           (thanks to Richard Lobb)

03-24-99 - Fixed Timestamps for PreparedStatements
    
           Fixed null pointer exceptions in RSMD and RS

           Re-compiled with jikes for valid class files (thanks ms!)

03-08-99 - Fixed escape processor to deal with un-matched { and }
           (thanks to Craig Coles)
           
           Fixed escape processor to create more portable (between
           DATETIME and TIMESTAMP types) representations so that
           it will work with BETWEEN clauses.
           (thanks to Craig Longman)
           
           MysqlIO.quit() now closes the socket connection. Before,
           after many failed connections some OS's would run out
           of file descriptors. (thanks to Michael Brinkman)
           
           Fixed NullPointerException in Driver.getPropertyInfo.
           (thanks to Dave Potts)
            
           Fixes to MysqlDefs to allow all *text fields to be
           retrieved as Strings.
           (thanks to Chris at Leverage)
           
           Fixed setDouble in PreparedStatement for large numbers
           to avoid sending scientific notation to the database.
           (thanks to J.S. Ferguson)
           
           Fixed getScale() and getPrecision() in RSMD.
           (contrib'd by James Klicman)
           
           Fixed getObject() when field was DECIMAL or NUMERIC
           (thanks to Bert Hobbs)
           
           DBMD.getTables() bombed when passed a null table-name
           pattern. Fixed. (thanks to Richard Lobb)
           
           Added check for "client not authorized" errors during
           connect. (thanks to Hannes Wallnoefer)
           
02-19-99 - Result set rows are now byte arrays. Blobs and Unicode
           work bidriectonally now. The useUnicode and encoding
           options are implemented now.
           
           Fixes to PreparedStatement to send binary set by
           setXXXStream to be sent un-touched to the MySQL server.
           
           Fixes to getDriverPropertyInfo().
           
12-31-98 - Changed all ResultSet fields to Strings, this should allow
           Unicode to work, but your JVM must be able to convert
           between the character sets. This should also make reading
           data from the server be a bit quicker, because there is now
           no conversion from StringBuffer to String.

           Changed PreparedStatement.streamToString() to be more
           efficient (code from Uwe Schaefer).

	     URL parsing is more robust (throws SQL exceptions on errors
           rather than NullPointerExceptions)

           PreparedStatement now can convert Strings to Time/Date values
           via setObject() (code from Robert Currey).

	     IO no longer hangs in Buffer.readInt(), that bug was
           introduced in 1.1d when changing to all byte-arrays for
           result sets. (Pointed out by Samo Login)

11-03-98 - Fixes to DatabaseMetaData to allow both IBM VA and J-Builder
           to work. Let me know how it goes. (thanks to Jac Kersing)

	     Fix to ResultSet.getBoolean() for NULL strings 
	     (thanks to Barry Lagerweij)

	     Beginning of code cleanup, and formatting. Getting ready
	     to branch this off to a parallel JDBC-2.0 source tree.

           Added "final" modifier to critical sections in MysqlIO and
           Buffer to allow compiler to inline methods for speed.

9-29-98 - If object references passed to setXXX() in PreparedStatement are
          null, setNull() is automatically called for you. (Thanks for the
          suggestion goes to Erik Ostrom)

          setObject() in PreparedStatement will now attempt to write a 
          serialized  representation of the object to the database for
          objects of Types.OTHER and objects of unknown type.

          Util now has a static method readObject() which given a ResultSet
          and a column index will re-instantiate an object serialized in
          the above manner.

9-02-98 - Got rid of "ugly hack" in MysqlIO.nextRow(). Rather than
          catch an exception, Buffer.isLastDataPacket() was fixed.
          
          Connection.getCatalog() and Connection.setCatalog()
          should work now.

          Statement.setMaxRows() works, as well as setting
          by property maxRows. Statement.setMaxRows() overrides
          maxRows set via properties or url parameters.

	  Automatic re-connection is available. Because it has
          to "ping" the database before each query, it is
          turned off by default. To use it, pass in "autoReconnect=true"
          in the connection URL. You may also change the number of
          reconnect tries, and the initial timeout value via 
          "maxReconnects=n" (default 3) and "initialTimeout=n" 
          (seconds, default 2) parameters. The timeout is an 
          exponential backoff type of timeout, e.g. if you have initial 
          timeout of 2 seconds, and maxReconnects of 3, then the driver
          will timeout 2 seconds, 4 seconds, then 16 seconds between each
          re-connection attempt.

8-24-98 - Fixed handling of blob data in Buffer.java
	
	  Fixed bug with authentication packet being
	  sized too small.

	  The JDBC Driver is now under the LPGL to allow 
          people to legally include it in their non-GPL'd 
          software.
	
8-14-98 - Fixed Buffer.readLenString() to correctly
          read data for BLOBS.
          
          Fixed PreparedStatement.stringToStream to
          correctly read data for BLOBS.
          
          Fixed PreparedStatement.setDate() to not
          add a day.
          
          (above fixes thanks to Vincent Partington)
          
          Added URL parameter parsing (?user=... etc).
          
          (thanks to Sander Magi).

8-04-98 - Big news! New package name. Tim Endres from ICE
          Engineering is starting a new source tree for
          GNU GPL'd Java software. He's graciously given
          me the org.gjt.mm package directory to use, so now 
          the driver is in the org.gjt.mm.mysql package scheme.
          I'm "legal" now. Look for more information on Tim's
          project soon.
          
          Now using dynamically sized packets to reduce
          memory usage when sending commands to the DB.
          
          Small fixes to getTypeInfo() for parameters, etc.
          
          DatabaseMetaData is now fully implemented. Let me
          know if these drivers work with the various IDEs
          out there. I've heard that they're working with
          JBuilder right now.
          
          Added JavaDoc documentation to the package.
          
          Package now available in .zip or .tar.gz.
          
7-29-98 - Implemented getTypeInfo(). 
          Connection.rollback() now throws an SQLException
          per the JDBC spec.

7-28-98 - Added PreparedStatement that supports all JDBC API
          methods for PreparedStatement including InputStreams.
          Please check this out and let me know if anything is
          broken.
          
          Fixed a bug in ResultSet that would break some
          queries that only returned 1 row.
          
          Fixed bugs in DatabaseMetaData.getTables(), 
          DatabaseMetaData.getColumns() and
          DatabaseMetaData.getCatalogs().
          
          Added functionality to Statement that allows
          executeUpdate() to store values for IDs that are
          automatically generated for AUTO_INCREMENT fields.
          Basically, after an executeUpdate(), look at the
          SQLWarnings for warnings like "LAST_INSERTED_ID =
          'some number', COMMAND = 'your SQL query'".
          
          If you are using AUTO_INCREMENT fields in your
          tables and are executing a lot of executeUpdate()s
          on one Statement, be sure to clearWarnings() every
          so often to save memory.

7-06-98 - Split MysqlIO and Buffer to separate classes. Some
          ClassLoaders gave an IllegalAccess error for some
          fields in those two classes. Now mm.mysql works in 
          applets and all classloaders.

          Thanks to Joe Ennis <jce@mail.boone.com> for pointing
          out the problem and working on a fix with me.

7-01-98 - Fixed DatabaseMetadata problems in getColumns() and
          bug in switch statement in the Field constructor.

          Thanks to Costin Manolache <costin@tdiinc.com> for 
          pointing these out.

5-21-98 - Incorporated efficiency changes from 
          Richard Swift <Richard.Swift@kanatek.ca> in
          MysqlIO.java and ResultSet.java

          We're now 15% faster than gwe's driver.

          Started working on DatabaseMetaData.
          
          The following methods are implemented:
           * getTables() 
           * getTableTypes()
           * getColumns
           * getCatalogs()
