=============================================================================== 08/15/2012 - jTDS 1.2.6 released =============================================================================== Changes from jTDS 1.2.5 ======================= 08/15/2012 - Holger Rehn o Applied patch [3048203] by amallon, adding a new 'autoCommit' connection property to override the auto commit default for newly created connections. o Commented out tests not compatible with Java 1.4, added since jTDS 1.2.5. 03/22/2012 - Holger Rehn o Applied patch [3476715] for bug [3260570] provided by Apaali, parsing time values containing fractions of seconds may fail. o Applied fix [3436324] suggested by Shane StClair, JtdsStatement.close() failed due to invalid state. 09/04/2011 - Holger Rehn o Applied patch [3290370] by Maarten van der Zwaart, re-send UDP recovery packet when connecting an SQL Server by instance name. o Applied patch [3224480] by Shane StClair, adding support for spatial types geometry/geography for TDS versions greater than 7.0. o Applied patch [3307731] by Rainer Schwarze, ResultSet cancellation may cause connection to be closed. o Applied backport of IPv6 support from 2.0 branch provided by George Dimitrov and his unit test for the URL parser (patch [3402583]). 01/02/2011 - Holger Rehn o Corrected bug [3141458], NPE if ResultSet.next() and ResultSet.close() are called by multiple threads concurrently. 10/07/2010 - Holger Rehn o Corrected bug [3078236], exception chaining time grows exponentially with number of exceptions in chain. o Corrected bug [3081749], SSPIJNIClient.getInstance() isn't thread-safe. o Corrected a bug in JtdsStatement.close(), any RuntimeException would have masked a prior SQLException. o Improved fix for bug [2931326], Statement.close() cannot throw NPE anymore. 05/17/2010 - Holger Rehn o Corrected bug [2931326], NPE if Statement.close() is called by multiple threads concurrently. o Applied fix for bug [3002431] by Rainer Schwarze, improved handling of port discovery errors. o Improved error messages if a value cannot be converted to a given SQL type. o Corrected bug [3000472], TimerThread started when closing last connection. o Fixed method synchronization in TimerThread. =============================================================================== 12/30/2009 - jTDS 1.2.5 released =============================================================================== Changes from jTDS 1.2.4 ======================= 12/30/2009 - Holger Rehn o Corrected bug [2900139], NoClassDefFoundError with C3P0. o Corrected bugs [2856350], [2898905], problems with JDBC4 stubs in GlassFish. o Modified build process to remove JDBC4 stubs, feature request [2905814]. 12/09/2009 - Holger Rehn o Updated JCIFS to version 1.3.12 o Corrected bug [2911266], Default response timeout of 30 seconds if using named pipes via JCIFS. 12/06/2009 - Holger Rehn o Implemented PreparedStatement.toString(), feature request [2909009]. 11/05/2009 - Holger Rehn o Corrected bug [2892493], NullPointException when receiving character NULL values (MS SQL Server 7.0 and later). 11/04/2009 - Holger Rehn o Corrected bug [2891775], fix for [2340241] has broken Java 1.3 compatibility. 10/22/2009 - Holger Rehn o Corrected bug [2883066], Numeric overflow in conversion BigInteger/BIGINT. 10/17/2009 - Holger Rehn o Corrected bug [2871274], no soft kill for TimerThread. o Improved performance by not using Exceptions for controlling the timer, anymore. o Corrected a bug that lead to login errors being masked by later exceptions. =============================================================================== 09/29/2009 - jTDS 1.2.4 released =============================================================================== Changes from jTDS 1.2.3 ======================= 09/28/2009 - Holger Rehn o Corrected bug [2860742], getByte() causes overflow error for negative values. 09/27/2009 - Holger Rehn o Workaround for bug [2856350], JDBC4 method stubs make jTDS unusable. =============================================================================== 09/04/2009 - jTDS 1.2.3 released =============================================================================== Changes from jTDS 1.2.2 ======================= 08/21/2009 - Holger Rehn o Corrected bug [2814376], varchar-type is truncated in non-unicode environment. 08/20/2009 - Holger Rehn o Corrected bug [2349058], DateTime allows invalid dates through 08/14/2009 - Holger Rehn o Corrected bug [2181003], attempt to set a BC date invalidates driver state. 08/11/2009 - Holger Rehn o Corrected bug by backporting patch [2675463], getSchemas() now returns schemas, not database users for MSSQL 2005 and later. 08/10/2009 - Holger Rehn o Corrected bug [1855125], jTDS silently ignores integer overflows in ResultSet's getter methods. 08/08/2009 - Holger Rehn o Corrected bug [1755448], login failure leaves unclosed sockets. o Added missing finalizer in connection class to ensure resources are released if an application fails to close a connection. 08/07/2009 - Holger Rehn o Corrected bug [2340241] by adding a new connection property 'processId'. o Addressed feature request [1778933] by adding a new connection property 'socketKeepAlive'. 08/04/2009 - Holger Rehn o Corrected bug [1845477], Added missing license info. o Resolved issue [1955499], Performance problems with timestamps in multi-threaded applications. o Corrected bug [1793584], Login timeout canceled too early. 08/03/2009 - Holger Rehn o Corrected bug [1802986], incorrect charset mapping between 'MAC' and 'ISO-8859-1'. o Resolved problem [1957748], Java VM is leaking memory in File.deleteOnExit(). See http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6664633. 07/31/2009 - Holger Rehn o Corrected bug [2508201], date field is changed by 3 milliseconds. 07/30/2009 - Holger Rehn o Corrected bug [2796385], running out of UDP sockets. 07/27/2009 - Holger Rehn o Corrected bug [1869156] memory leak of WeakReferences. o Corrected data truncation problem described in bug [2021839]. o Corrected bug [1811383] ArrayIndexOutOfBounds on executeBatch. 07/26/2009 - Holger Rehn o Corrected bug [2021839] savepoint starts 2 transactions if it's the first operation. 07/25/2009 - Holger Rehn o Corrected bug [1843801] infinite loop if DB connection dies during a batch. o Applied patch [1844846] jTDS cannot connect IBM/Netcool Omnibus. o Added JDBC 4 method stubs, feature request [2021848]. 07/24/2009 - Holger Rehn o Corrected bug [2818256] a savepoint is invalid after rollback. 07/23/2009 - Holger Rehn o Corrected bug [1883905] unintentional infinite wait. o Applied patch [1714497] to avoid using Sun's SSL implementation. =============================================================================== 08/22/2007 - jTDS 1.2.2 released =============================================================================== Changes from jTDS 1.2.1 ======================= 08/18/2007 - Brian Heineman o Applied Mike Hutchinson's fix for bug [1774322] Sybase nulled text fields return not null 08/05/2007 - Brian Heineman o Applied patch [1592113] NTLMv2 properties on datasource. o Applied patch [1236417] 64-bit support for Single Sign On (SSO) o Applied patch [1504761] Itanium and AMD64/EM64T 64 bit support for SSO o Implemented feature [1491811] sqlState code for snapshot conflict. o Updated SQL Server sqlState codes. 08/02/2007 - Brian Heineman o Corrected bug [1765905] Driver version miscellanea is incorrect; updated to 1.2.2. =============================================================================== 07/12/2007 - jTDS 1.2.1 released =============================================================================== Changes from jTDS 1.2 ===================== 07/12/2007 - Brian Heineman o Applied patch from Alin Sinpalean for concurrent batch updates. o Corrected Java 1.3/1.4 compile problem. 07/11/2007 - Brian Heineman o Applied patch from Alin Sinpalean for cursor exception handling. 07/08/2007 - Brian Heineman o Corrected bug [1571660] Changed reference from Statement.EXECUTE_FAILED (which was added in Java 1.4) to JtdsStatement.EXECUTE_FAILED. o Applied patch [1567127] Eclipse javadoc warnings. o Applied patch [1567332] Updated build file to work with or without backslashes on Windows. This also fixes the problem of having spaces in the JAVA_HOME path. o Applied patch [1567151] HTML validation patches. o Applied patch [1567994] Updated equality checks. o Corrected bug [1623668] Lost apostrophes in statement parameter values (prepareSQL=0) by applying the patch mentioned in the issue; added test to ensure that there are no regressions. o Corrected bug [1437845] milliseconds are lost under JRE 1.3 by applying the patch attached to the issue. o Corrected bug [1696767] incorrect ResultSetMetaData when useLOBS=false by applying the patch mentioned in the issue. o Corrected bug [1453552] JTDS Driver returns wrong column type with sybase by applying the patch attached to the issue. o Corrected bug [1374518] rollback fails on Sybase 12.5 by applying the patch attached to the issue. o Corrected bug [1460746] Batching of Prepare Statements by applying the patch attached to the issue. o Applied patch [1460207] Connection.setCatalog() has invalid check o Implemented feature [1749962] Temporary directory should be configurable o Corrected bug [1596743] executeQuery absorbs thread interrupt status by applying the patch mentioned in the issue. 06/23/2006 - Matt Brinkley o Oops...checked in some test code. I backed out those changes. 06/23/2006 - Matt Brinkley o Fixed the flags passed for NTLMv2 authentication. Before the fix, authentication would fail in configuration where Minimum Session Security for NTLM SSP based (including secure RPC) Servers setting was set to 'Require NTLM v2 session security'. 05/19/2006 - Alin Sinpalean o Fix the previous changelist. Copy-paste didn't really help there. 05/18/2006 - Alin Sinpalean o Added support for SNAPSHOT transaction isolation, in the same way as the new MS driver -- using setTransactionIsolation(4096). 04/05/2006 - Matt Brinkley o NTLMv2 auth fix: now it doesn't NPE if server fails to send target info. 03/23/2006 - Matt Brinkley o Added NTLMv2 support for windows authentication. 01/12/2006 - David Kilzer o Applied Mike Hutchinson's fix for Bug [1403067] ProtocolException: Invalid table TAB_NAME_TOKEN. TdsCore.tdsTableNameToken() now handles tables referenced using server.database.owner.table syntax. Also modified exception code to include the unknown TAB_NAME_TOKEN value. 12/22/2005 - David Kilzer o Replaced JtdsObjectFactoryUnitTest.testAllProperties() method with an inner class that extends DefaultPropertiesTestLibrary to make this test class fail automatically when a new property is added to the library class. Removed stale comments in JtdsDataSourceUnitTest. o Fixed Bug [1386615] Connecting across domains with named pipes fails on Windows. New 'useJCIFS' boolean parameter added that will force use of the jCIFS library on Windows for named pipe connections. o Updated ConnectionJDBC2UnitTest class to check for both an instance field and a getter for all properties. Added "missing" getters to ConnecionJDBC2 class: getAppName(), getBufferMaxMemory(), getBufferMinPackets(), getDatabaseName(), getMacAddress(), getNamedPipe(), getProgName(), getWsid(). Renamed package-private getters in ConnectionJDBC2 class that returned boolean values to use "get" instead of "is": getLastUpdateCount(), getUseUnicode(). Moved DefaultPropertiesTestLibrary.ucFirst() to UnitTestBase class. o Fixed default path for named pipes on Sybase. (Previous behavior would always default to the SQL Server path!) Added DefaultProperties.getNamedPipePath() method with unit tests. 12/21/2005 - David Kilzer o Extracted the JtdsDataSource.addNonNullProperties() method from getConnection(String, String) method for easier testing. Added inner test class Test_JtdsDataSource_addNonNullProperties to JtdsDataSourceUnitTest to test new addNonNullProperties() method. Replaced call to Exception.getStackTrace() in getConnection(String, String) with a call to Support.linkException(). Fixed addNonNullProperties() to set the serverType parameter if it is not null. Note that this does not affect Driver.parseURL() which ends up (re)setting that property from the URL. 12/20/2005 - David Kilzer o Implemented RFE [1291335] Provide a mechanism for binding to a local IP address. New "bindAddress" parameter introduced (Java 1.4 and newer only). o Updated UnitTestBase.invoke*() methods to link original exceptions to RuntimeExceptions. Added new UnitTestBase.invokeSetInstanceField() method. Added back suite tests to JtdsDataSourceUnitTest that test default values on the JtdsDataSource class and its getReference() method by setting the default values through reflection before testing. This allows one new test method to be added to the DefaultPropertiesTestLibrary class and for tests to fail everywhere a developer hasn't implemented a new driver property yet. 12/19/2005 - David Kilzer o Changed reference to old 'TdsDataSource' class in faq.html to newer 'JtdsDataSource' class. o Alphabetized parameters in faq.html to make them easier to find. o Added missing </code> tag in "badrpc" question in faq.html. o Updated the loginTimeout parameter information in faq.html to document behavior with TCP/IP connections. o Fixed the "What are the class names...?" question to match the TOC entry. 12/19/2005 - Alin Sinpalean o Minor optimization in determining the scale for decimal parameters. 12/05/2005 - Alin Sinpalean o Applied Mike's fix for bug [1371295] executeBatch returns incorrect counts. Batch updates now always return an array of length equal to the batch size, padded up with EXECUTE_FAILED values if necessary. o Applied Mike's fix for a bug related to [1368058] Calling StoredProcedure with functions (identifiers containing special characters not parsed). 11/25/2005 - Alin Sinpalean o Corrected bug [1358059] Memory leak in add/remove statement. The remove statement logic did not remove the WeakReference if the Statement had been garbage collected. o Corrected an issue in TdsData causing CHAR columns containing single blanks to be returned as zero length strings. o Removed redundand call to checkClosed() in TdsCore. o Removed duplicate entries from Charsets.properties. 11/23/2005 - Alin Sinpalean o Made a few modifications to the test suite to accomodate changes in SQL Server 2005. 11/09/2005 - Alin Sinpalean o Corrected bug [1351891] Using JtdsCallableStatement.setFloat causes SQLException. findParameter() was called as if to retrieve parameter values from the setByte(), setDouble() and setFloat() methods, which caused the parameter not to be found. =============================================================================== 10/08/2005 - jTDS 1.2 released =============================================================================== Changes from jTDS 1.1 ===================== 11/03/2005 - Alin Sinpalean o Applied Mike's fix for bug [1346086] Problem with DATABASE name change on Sybase. o Applied patch [1250393] modify getJdbcType() to handle subclass of basic JDBC types, submitted by Joel Schneider (cognophile). o Corrected a minor DatabaseMetaData error: supportsTransactionIsolationLevel returned true for TRANSACTION_NONE or any invalid value. 10/31/2005 - Alin Sinpalean o Corrected bug in JtdsDatabaseMetaData.getBestRowIdentifier(). Statement was closed, causing errors when using the returned result set. 10/27/2005 - Mike Hutchinson o Fixed bug "[1305275] Cursor opens fails when cursor threshold <> -1" by amending MSCursorResultSet. o Fixed bugs "[1283472] Unable to cancel statement with cursor resultset" and "[1323363] Deadlock Exception not reported (SQL Server)" by amending JtdsStatement executeSQL() and executeSQLQuery(). o Fixed a bug in handling output parameters that occurs when invoking remote stored procedures. The TdsCore.tdsOutputParamToken method was amended. o Implement RFE "[1289687] configurable socket setSoTimeout()". This also offers a solution to bug "[1297306] Network problem can cause jTDS hang-up". o Fixed bug "[1246270] Closing a statement after cancelling it throws an exception" by amending JtdsStatement.close(). o [SQL Server 2005] Database meta data has been improved so that getColumns() can distinguish between text and varchar(max), image and varbinary(max) etc. Changes were required to JtdsDatabaseMetaData.getColumns() and a new method getMSTypeName was added to TdsData. A test case has been added to Tds8Test. o [Sybase ASE 15] Added support for new data types unitext, bigint and unsigned smallint, int and bigint. This enhancement required changes to TdsCore, TdsData and ResponseStream. New test cases have been added to Tds5Test. o [Sybase ASE 15] With ASE 15 the default packet size is now 2048 bytes. The ConnectionJDBC and DefaultProperties classes have been amended so that the server default is used when there is no packetSize connection property present. o [Documentation] Modified faq.html to document bug [1260507] CallableStatement Exception and the new soTimeout connection property. o [Documentation] Modified typemap.html to document the new Sybase datatypes. 10/20/2005 - Alin Sinpalean o Corrected bug [1293415] Charset iso_1 is broken for Sybase. For Sybase the server's iso_1 charset maps to the standard ISO-8859-1, rather than Cp1252 as it does for MS SQL Server. o Applied Mike's fix for bug [1330118] SSL fails with SQL 2005 September CTP. o Applied Mike's fix for bug [1329765] Pseudo column ROWSTAT is back with SQL 2005 (September CTP). 10/18/2005 - Alin Sinpalean o Corrected bug [1327029] setFetchSize give incorrect error message. o Corrected bug [1296482] setAutoCommit() behaviour. According to section 10.1.1 of the JDBC 3.0 spec (which takes precedence over the API documentation) the transaction should only be committed if the auto-commit mode is _changed_ during a transaction. 09/27/2005 - David Kilzer o Added info to the FAQ about the jTDS implementation of javax.naming.spi.ObjectFactory. 09/26/2005 - David Kilzer o Applied Mike's patch for bug [1299147] Latest change does not compile with java 1.5. This patch cleans up the use of checkOpen() in a number of methods in JtdsCallableStatement, JtdsPreparedStatement, JtdsStatement and JtdsResultSet. 09/23/2005 - David Kilzer o Fixed compilation on Java 1.5 in MessagesPropertiesUnitTest. Thanks to Mike Hutchinson for the patch in bug [1299147] Latest change does not compile with java 1.5. 09/22/2005 - David Kilzer o Added MessagesPropertiesUnitTest to ensure every prop.* property has a matching prop.desc.* property and vice-versa. 09/21/2005 - David Kilzer o Applied patch for bug [1253127] Improved decimal peformance for MSSQL SP4 by Mike Hutchinson. This patch also fixes bug [1236078] Procedure doesn't get called for some BigDecimal values (in Java 1.5). 09/20/2005 - David Kilzer o Removed RequestStream.setMaxPrecision() and added a 'maxPrecision' argument to the RequestStream constructor. This value should never change during the life of the RequestStream, and thus should be set in the constructor. Updated SharedSocket.getRequestStream() method. o Refactored SharedSocket constructor to take only a single argument of type ConnectionJDBC2. Added some package-private getter methods to ConnectionJDBC2. o Replaced SharedNamedPipe.instance() method with a public constructor. o Simplified SharedNamedPipe and SharedLocalNamedPipe constructors by passing in a ConnectionJDBC2 object instead of a laundry list of data values. Added more package-private getter methods to the ConnectionJDBC2 class. Moved SharedNamedPipe.calculateBufferSize() to Support.calculateNamedPipeBufferSize(). Changed hard-coded buffer values in SharedLocalNamedPipe constructor to use the value returned from Support.calculateNamedPipeBufferSize(). 09/09/2005 - David Kilzer o Applied Mike's patch to fix a small bug with getProcedureColumns() in JtdsDatabaseMetaData and SQL Server 7.0 where the RETURN_VALUE parameter was not prefixed with an '@' character. 09/07/2005 - David Kilzer o Extracted code from the original Support.linkException() method to accept generic Exception objects. Provided linkException() convenience methods for SQLException and SQLWarning classes. Linked IOException thrown from ConnectionJDBC2.createNamedPipe() for connection timeouts using the new method. o Applied Mike's fix for bug [1273988] Insert UTF8 string fails when length is 255 (ASE12.5.2). 09/06/2005 - David Kilzer o Applied patch for bug [1277000] "All pipe instances are busy" error not handled properly. Added TestAllPipInstancesAreBusy tool class which is used to manually reproduce the error. Updated "loginTimeout" entry on FAQ. Added more use of Support.linkException() in ConnectionJDBC2 constructor. o Created new Support.isWindowsOS() method to consolidate duplicate code. Added SupportUnitTest class to test new method. 08/30/2005 - David Kilzer o Updated FAQ to reflect new behavior of the namedPipe parameter since patch [1122494] SQL Server Authentication & Named pipes was applied in jTDS 1.0.3. 07/27/2005 - Alin Sinpalean o Corrected bug [1245775] Column type inconsistency when useLOBs=false. 07/11/2005 - Alin Sinpalean o Applied Mike's fix for bugs [1234531] Dates before 01/01/1900 broken due to DateTime value markers and [1235845] getTimestamp() returns illegal value after getString(). 07/05/2005 - Alin Sinpalean o Applied Mike's fix for bug [1232733] setFetchSize(0) causes exception. o Final fix for bug [1229636] Memory Leak in Prepared Statements. 07/04/2005 - Alin Sinpalean o Corrected some build issues with Java 1.3. 07/01/2005 - Alin Sinpalean o Applied yet another patch for bug [1229636] Memory Leak in Prepared Statements, with a minor change. This seems to finally fix the caching and memory leaks; handles are always cached, even if maxStatements=0, retrieved from the connection cache and the statement list of handles is implemented by a Set, to make sure no memory leaks due to duplicates occur. 06/30/2005 - Alin Sinpalean o Corrected bug [1229636] Memory Leak in Prepared Statements, based on Mike's initial patch. o Realized that my initial fix will not work with maxStatements=0 (as opposed to Mike's) so made some more changes. o Corrected synchronization issue in ConnectionJDBC2.removeStatement() for the ConnectionJDBC2.statements instance variable. 06/29/2005 - Alin Sinpalean o Corrected a bug with prepare handles caching where the usage count was decremented twice when a statement was closed, causing premature release of handles. 06/28/2005 - Alin Sinpalean o Applied Mike's additional patch for bug [1222199] Delayed exception thrown in statement close. "Execution cancelled" exceptions are now only thrown if the cancel was caused by a call to Statement.cancel(); if a timeout is the cause, the exception is masked as an exception was already thrown when the execution timed out. o Corrected a memory leak caused by the prepared statement's handles collection being implemented through an ArrayList rather than a Set. The same handle would be added again and again on each execution and never removed until the statement was closed. 06/27/2005 - Alin Sinpalean o Per Mike's suggestion, changed the SQLState of query cancelled exceptions to HY008 instead of S1008. 06/23/2005 - Alin Sinpalean o Corrected bug [1226210] {fn dayofweek()} depends on the language. Fix submitted by Xavier Poinsard. 06/22/2005 - Alin Sinpalean o Corrected bug [1222199] Delayed exception thrown in statement close. In the current implementation Statement.close() does throw any server side errors (to make sure the user doesn't miss any) but Connection.close() ignores them. o Applied Mike's fix for bug [1222238] Unable to connect to Sybase 10 with TDS 5. 06/21/2005 - Alin Sinpalean o Applied Mike's fix for bug [1222205] getParameterMetaData returns not implemented. =============================================================================== 06/16/2005 - jTDS 1.1 released =============================================================================== Changes from jTDS 1.0.3 ======================= 06/16/2005 - Alin Sinpalean o Added the useLOBs connection property to control whether large types (IMAGE and TEXT/NTEXT) should be mapped by default to LOBs or Java types (String and byte[]). Default is true, i.e. map to LOBs by default. o Updated version number to 1.1. 06/15/2005 - Alin Sinpalean o Applied Mike's fix for bug [1047208] SQLException chaining not implemented correctly, with a few additions in places where exceptions might have gotten lost. o Removed SSPIJNIClient.main() and hexDump() as they weren't used anyway. 06/10/2005 - Alin Sinpalean o Corrected bug [1217786] Moving to "beforeFirst" with ResultSet.absolute(-X) and a number of related absolute() and relative() issues with MSCursorResultSet. 06/03/2005 - Alin Sinpalean o Removed no longer needed cache classes. o Corrected an issue with savepoints, which was causing cached procedures to not be dropped by the driver on a savepoint rollback. o Removed already fixed or outdated TODO comments. 06/02/2005 - Alin Sinpalean o Applied Mike's fix for bug [1212905] PreparedStatement.setFloat issue. o Moved all the "create cursor or use direct execution" logic into a single place and corrected an issue where useCursors=true would cause a cursor prepare to be issued even on executeUpdate(). 06/01/2005 - Alin Sinpalean o Initial implementation for extended scrollability/updatability support (TYPE_SCROLL_SENSITIVE for keyset cursors, TYPE_SCROLL_SENSITIVE + 1 for dynamic cursors, CONCUR_UPDATABLE for optimistic concurrency w/ timestamps, CONCUR_UPDATABLE + 1 for pessimistic concurrency and CONCUR_UPDATABLE + 2 for optimistic concurrency w/ value checking). All the new values work with Sybase too, but the behavior is the same as the default. 05/30/2005 - Alin Sinpalean o Changed the default prepareSQL mode from 1 (temporary stored procedures) to 3 (sp_prepare) for SQL Server. For Sybase, the default is still 1. o Corrected a bug in DateTime that was causing -1 to be stored as the time component of a DATETIME field for a Date value. o Applied Mike's patch [1210936] Change byte array to string conversions; the patch changes the way byte[] to String conversions are made (now hex values are returned) and also a bug with SELECT DISTINCT not working with Sybase. o Added information about the useCursors property (and fast forward-only cursors to the FAQ). o Made the maximum global buffer memory and minimum local buffer packets configurable from the connection properties by adding two new properties: bufferMaxMemory and bufferMinPackets. 05/27/2005 - Alin Sinpalean o Added initial support for fast forward-only cursors. o Corrected yet another cancel synchronization issue caused by the end of response flag not being reset when a cancel packet was sent. o Corrected an issue causing hidden columns to "become visible" in result set meta data obtained from prepared statements. o Corrected bug [1209039] jTDS can deadlock when used with C3P0 connection pooling; unnecessary synchronization on statements caused deadlocks. 05/25/2005 - Alin Sinpalean o Applied Mike's last patch posted in RFE tracker [1172683] Improve the performance of Prepared Statements. The patch implements metadata caching and removes support for sp_prepexec and sp_cursorprepexec (prepareSQL=4). 05/20/2005 - Alin Sinpalean o Corrected bug [1204658] Conversion from Number to BigDecimal causes data corruption. o BigDecimal to String conversion no longer drops insignificant trailing zeroes. 05/11/2005 - Alin Sinpalean o Corrected bug [1200027] Enhancement: Change how Properties keys are determined. o Added serialVersionUID to JtdsDataSource. 05/10/2005 - Alin Sinpalean o Applied Mike's patch [1197446] Optimized handling of datetime values. o Applied Mike's patch with SQLParser improvements, posted in RFE [1172683] Improve the performance of Prepared Statements. o Applied Mike's fix for bug [1197603] Cursor downgrade error in CachedResultSet and added a test case. 05/09/2005 - David Kilzer o Made the error.connection.autocommit message in ConnectionJDBC2 specific to the method being called (commit() or rollback()) by introducing a parameter. 05/06/2005 - Alin Sinpalean o Corrected bug [1195511] Recent change to JtdsStatement breaks Sybase metadata. 05/04/2005 - Alin Sinpalean o Corrected a bug that was causing the ResultSet position to be reset to the beginning of the cached block if a reread was attempted after updateRow(). 04/28/2005 - Alin Sinpalean o Implemented caching of a single TdsCore instance in ConnectionJDBC2. When a statement is closed its TdsCore is cached and reused on the next statement creation. o Made a lot of properties final. o Corrected bug [1180777] collation-related execption on update - if a prepare failed, execution was not retried (unprepared) and failed. o Removed the ConnectionJDBC2 finalizer, as the resources will be freed anyway when garbage collected. 04/25/2005 - Alin Sinpalean o Applied Brett Wooldridge's patch for RFE [1172683] Improve the performance of Prepared Statements. The patch implements a cache for parsed SQL statements (parsed sql and parameter information, where available). 04/22/2005 - Alin Sinpalean o Corrected bug [1187872] Supported CodePage: error in error message. o Corrected bug [1187927] Driver Hangs on Statement.execute(). Versions 1.0.3 and prior entered an infinite loop when parsing an unterminated multi-line comment. 04/20/2005 - Alin Sinpalean o Applied Mike's fix for bug [1184376] Sybase getProcedureColumns bug. 04/19/2005 - Alin Sinpalean o Major code cleanup using various code inspection tools. 04/17/2005 - Alin Sinpalean o Applied Mike's patch for bug [1172405] BLOB/CLOB position methods fail: a BlobBuffer class was introduced to handle LOB buffering to memory/disk and BlobImpl/ClobImpl, as well as other classes, were modified accordingly. =============================================================================== 04/15/2005 - jTDS 1.0.3 released =============================================================================== Changes from jTDS 1.0.2 ======================= 04/15/2005 - Alin Sinpalean o Updated version number to 1.0.3. 04/13/2005 - Alin Sinpalean o Corrected bug [1182066] regression bug resultset: ResultSet.relative() was not working as expected. o Minor performance optimizations in ClobImpl and LOBTest. 04/11/2005 - Alin Sinpalean o Applied Mike's fix for bug [1179773] jTDS fails when used with c3p0 connection pool. o Applied Mike's fix for bug [1180164] NPE in TdsData with mulit-byte charset. o Applied Mike'd fix for bug [1180169] JDBC escapes not allowed with Sybase addBatch. o Updated FAQ listing an additional reason why a ResultSet may be downgraded to update only read only: not a single SELECT statement. o Added DBSolo to the links page per Marko Hantula's request. o Closed bug [991089] INSTANCE parameter does not work with SQL Server 2005 after adding an explanation to the FAQ on how to make it work. 04/07/2005 - Alin Sinpalean o Applied Mike and Dave's combined fix for bug [1176221] JtdsPreparedStatement setTime setTimestamp Daylight DST Bug. 04/04/2005 - David Kilzer o Refactored duplicate code in JtdsPreparedStatement.setDate(int, Date, Calendar), setTime(int, Time, Calendar) and setTimestamp(int, Timestamp, Calendar) into adjustTimeByCalendar(long, Calendar) method in preparation to fix [1176221] JtdsPreparedStatement setTime setTimestamp Daylight DST Bug. 04/04/2005 - Alin Sinpalean o Optimized buffer allocation in RequestStream/ResponseStream. o Moved the Statement.getMoreResults(Statement.KEEP_CURRENT_RESULT) test to a different, JDBC 3.0 only unit test. 03/29/2005 - Alin Sinpalean o Applied a temporary (and highly useless) fix for bug [1172405] BLOB/CLOB position methods fail. position() methods work now, at least in theory. 03/26/2005 - Alin Sinpalean o Applied Mike's patch [1166594] JDBC3 Multiple open result sets. The getMoreResults(int) method is fully implemented and the JtdsResultSet class has been enhanced so that it can cache the remaining result set rows when required by the KEEP_CURRENT_RESULT option. Result sets returned by Statement.execute() are only cached by when required by the getMoreResults() method. A couple of minor bugs in the CachedResultSet class are also fixed; a where clause for updates could include text or image columns which is not allowed and the Sybase syntax for inserting rows containing all default values was incorrect. o Corrected bug [1170777] resultSet.updateRow() fails if no row has been changed. Thanks go to Brett Wooldridge for signalling the bug and providing a fix. 03/18/2005 - Alin Sinpalean o Implemented RFE [1165119] Computername in Connection-URL: added a WSID parameter to the URL properties, to override the host name that is determined automatically. o Corrected bug [1164219] possible incorrect synchronization in BlobImpl.java (removed all synchronizations from BlobImpl and ClobImpl). o Added a description of jTDS' support for multi threading to the FAQ. o Update for bug [1161601] Connection.close() can take a long time when Sybase down. The close timeout has been reduced to 1 second, just to make sure the logout request makes it through to the server. 03/14/2005 - Alin Sinpalean o Applied Mike's additional fix to bug [1158509] Various problems with connect/login timeouts. 03/12/2005 - Mike Hutchinson o Small change to ConnectionJDBC2 to ensure that the server character set is used if none is specified by the user. o TdsCore.closeConnection() has been modified to set a 10 second timeout on the socket. This should address bug report [1161601] Connection.close() can take a long time when Sybase down. o TdsData and TdsCore have been modified to address bug [1161609] Text or image data truncated on Sybase 12.5. A new TDS 5 data type (0x24) is used to send bulk text or image data to the server. o A small bug has been corrected in Support.substituteParameters which caused short InputStreams to be written as a binary parameter rather than text when running with Sybase 11. 03/12/2005 - Alin Sinpalean o Added a fix suggested by rtdog to TimerThread. 03/09/2005 - Alin Sinpalean o Corrected bug [1158509] Various problems with connect/login timeouts. The last problem fixed was concerned with socket connection not timing out (only the login itself was timed and interrupted). o Applied patch [1155902] Implement parameter meta data retrieval, by Oded Arbel. Parameter mode was always returning parameterModeUnknown; now mode is determined based on actual parameters. 03/07/2005 - Alin Sinpalean o Partially fixed bug [1158509] Various problems with connect/login timeouts. FAQ was inexact (stated that loginTimeout was in milliseconds) and DriverManager login timeout was ignored because the default values (0 for login timeout) were set before the null check. 03/06/2005 - Alin Sinpalean o Applied a patch from Mike with a cleaner batch implementation. 03/04/2005 - Alin Sinpalean o Added an extra concurrency test, which runs two Statements in parallel: one doing SELECTs and UPDATEs and the other doing cancel()s. Seems to work fine. 03/03/2005 - Alin Sinpalean o Added a batchSize parameter to control how many statements should be sent at once in a batch execution. Batches are now broken up into pieces on execution if they exceed this size limit. 03/01/2005 - Alin Sinpalean o Following Mike's suggestion, reduced the chunk of code synchronized with cancelMonitor to only TdsCore.cancelPending assignments, to ensure these are atomic. That should be enough, now that SharedSocket is also synced. 02/28/2005 - Alin Sinpalean o Applied Mike's patch [1124854] SSO fixes - prevents error from crashing JVM. o Modified ClobImpl to use UCS-2 encoding for storing/retrieving character data to/from disk. Previously the default system encoding was used, causing characters not in the system encoding to be lost. o Corrected a resource (temp file) leak in ClobImpl and BlobImpl: the file property was set to null before deleting the file, possibly causing it to remain there until the JVM terminated. o Completely synchronized access to cancelPending and endOfResponse in TdsCore and cancelPending and responseOwner in SharedSocket. This should prevent any race conditions when a cancel() is issued. o Applied the rest of Mike's fix for bug [1152329] Spurious output params assigned (TIMESTMP). Missed part of it when doing the merge. o Added FAQ entry about Sybase batching, as discussed in bug report [1123350] Hang when executing performance test. 02/27/2005 - Alin Sinpalean o Enhanced update count caching implementation by always caching update counts up to the end of the response or beginning of the first ResultSet (whichever comes first) whenever the end of the current ResultSet is reached. This means it's no longer necessary to call getMoreResults() after the last ResultSet returned by a CallableStatement to get to the output parameters. Also removed the readAhead flag, which caused the rest of the response to be dumped when the end of the first ResultSet was reached for a CallableStatement.executeQuery. o Corrected a problem in SQLParser causing an error message with the wrong terminator value missing (i.e. ')' instead of '}' missing from "{call proc(?)"). o Corrected a problem with output parameters being defined as Unicode even though sendStringParametersAsUnicode=false was specified. o Applied Mike's fix for bug [1152329] Spurious output params assigned (TIMESTMP). WRITETEXT and UPDATETEXT commands generate spurious output parameter packets, which interfere with the real output parameters. Fix ignores output parameters with names not beginning with '@'. o Synchronized all accesses to the cancelPending flag, to fix any possible issues caused by race conditions. 02/25/2005 - Alin Sinpalean o Added code to close the socket and release any data buffered at the socket level when Connection.setClosed() is called (usually on I/O or protocol errors). o Tried to disable warning messages on database and language change; these are always generated during login, sometimes causing confusion. Problem is, disabling these also disables generation of the associated ENVCHANGE packets making jTDS crash with NPEs because it doesn't know the current database. 02/24/2005 - Alin Sinpalean o Corrected bug [1150880] Character Set getting overwritten. Collation envchange packets altered the charset specified on connection creation. 02/23/2005 - Alin Sinpalean o Implemented feature [1145697] Better handling of OutOfMemoryError. On an OutOfMemoryError, TdsCore.nextToken() now consumes the rest of the server response to ensure no protocol confusion will occur. o Implemented feature [1144733] Make jtds.jar display version no. Now "java -jar jtds-1.x.jar" will display the jTDS version to standard output. 02/23/2005 - David Kilzer o Fix comment in ConnectionJDBC2(String, Properties) constructor. 02/22/2005 - David Kilzer o Added .cvsignore to top-level directory to ignore build and dist directories. 02/19/2005 - Alin Sinpalean o Applied patch [1122494] SQL Server Authentication & Named pipes, submitted by Kartik Shah. On Windows, local named pipes are always used, now, even for remote servers. o Implemented feature request [1124636] Better error message for missing ntlmauth.dll. 02/17/2005 - Alin Sinpalean o Corrected a problem related to cancel synchronization in TdsCore: a race condition occured between the cancelPending assignments that could cause the Connection to fail. Problem was reproducible using testCancel0003() in SAfeTest on a slow client. o Corrected bug [1120168] jTDS 101 - TDS data type 0 invalid, caused by incomplete column info filled in for dummy CachedResultSets. 02/16/2005 - Alin Sinpalean o Applied Mike's fix for bug [1122357] INSERT is executed twice by scrollable Statement on Sybase. CachedResultSets are now created on top of plain ResultSets from scrollable/updateable Statements. The query is only altered (by adding "FOR BROWSE") if executed via executeQuery(). 02/15/2005 - Alin Sinpalean o Altered SQLParser to accept any number of parameters for a PreparedStatement if prepareSql=0, i.e. plain queries rathern than RPC are used to execute the query. Also modified the related test to handle this situation. 02/14/2005 - Alin Sinpalean o Applied patch [1120010] Fixed search string escape handling, submitted by James P. Moring. 02/12/2005 - Alin Sinpalean o Corrected bug [1120442] Statement hangs in socket read after Statement.cancel(). o Applied Mike's fix for bug [1120825] Can't open scrollable ResultSet with Sybase 11.9. o Applied Mike's fix to my fix to bug [1120442] Statement hangs in socket read after Statement.cancel(). :o) 02/10/2005 - Alin Sinpalean o Improved test for bug [1116046] {fn } escape can't handle nested functions. =============================================================================== 02/15/2005 - jTDS 1.0.2 released =============================================================================== Changes from jTDS 1.0.1 ======================= 02/14/2005 - Alin Sinpalean o Corrected bug [1122481] how handle new behavior since 1.0.1. The DataSource factory failed with NPE because the properties are no longer initialized in the constructor. Added tests to ensure no regressions. o Updated version number to 1.0.2. =============================================================================== 02/09/2005 - jTDS 1.0.1 released =============================================================================== Changes from jTDS 1.0 ======================= 02/09/2005 - Alin Sinpalean o Corrected bug [1118956] statement.setMaxFieldSize() sends a statement every time. Max field size is now set at the same time and in the same way as row count. o Applied Mike's patch [1118912] Small enhancements. Extended DataTruncation support, better transaction isolation support for Sybase and a fixed NPE in Logger. 02/08/2005 - Alin Sinpalean o Synchronized JtdsStatement.close(); a race condition could occur between a pool implementation closing Statements after a timeout and finalize(). 02/07/2005 - Alin Sinpalean o Added the explanation for the "Connection refused" error message to the FAQ. o Removed tests that were failing because of the fix for bug [1113709] Connecting via DataSource (the assumptions of these tests were incorrect, to start with). 02/05/2005 - Alin Sinpalean o Applied patch [117010] Instance parameter support for local named pipes, submitted by Matthias Germann. 02/04/2005 - Alin Sinpalean o Applied Mike's fix for bugs [1116113] (SSL fails to build or run under java 1.3) and [1102505] (SSL Resume Failure). TLS resume is now disabled altogether until we find out what the actual cause is and work around it. o Applied Mike's fix for bug [1116046] {fn} escape can't handle nested functions. 02/02/2005 - Alin Sinpalean o Applied patch [1110911] Encryption request causes conn reset, submitted by Mike Hutchinson. SSL negotiation has been implemented to handle the encrypt only login case. o Applied a modified version of patch [1107090] Revised query timeout logic, submitted by Mike. Timeouts should now have millisecond precision, using a single timer thread per VM. o Fixed bug [1113709] Connecting via DataSource. Invalid default TDS version was used by JtdsDataSource when connecting to Sybase. Breaks all default property tests (which relied on DataSource setting default values in the constructor), but the previous behavior was incorrect. o Fixed bug [1113040] Small bug in net.sourceforge.jtds.jdbcx.PooledConnection Thanks go to Marcus Nylander for finding the bug and providing a fix. 02/01/2005 - Alin Sinpalean o Updated FAQ to include information about local named pipes. o Modified SQLParser to only extract table names when requested to, because it was unable to parse function calls. 01/28/2005 - Alin Sinpalean o Added checks for timeout exceptions to JtdsStatement.executeSQLQuery() and executeSQL(); if a cursor creation fails because of a timeout, the exception is thrown back and a direct select is not attempted anymore. o commit() and rollback() now throw SQLException if called in auto-commit mode, per API documentation. o Added checks to setAutoCommit() and setTransactionIsolation() to no longer submit requests to the server if already in the correct mode. 01/27/2005 - Alin Sinpalean o Fixed bug in CharsetInfo, caused by getClassLoader() returning null when the class loader is the bootstrap classloader. =============================================================================== 01/25/2005 - jTDS 1.0 released =============================================================================== Changes from jTDS 0.9.1 ======================= 01/25/2005 - Alin Sinpalean o Updated the HTML content and incremented the version number in both the docs and the code. 01/24/2005 - Alin Sinpalean o Minor clean-up in tests and code. 01/24/2005 - Mike Hutchinson o Fixed bug [1107105] Sybase updateable cursor error (a null pointer exception is thrown in CachedResultSet during an update). o Amended the logic for downgrading the preparesql property values in ConnectionJDBC2 as it was possible to select invalid options for Sybase and SQL 6.5. o Prevent JtdsPreparedStatement.setUnicodeStream from throwing an array index exception when the length of the supplied stream exceeded the declared length. o When using preparesql=0, the driver would send zero length byte arrays as null. This is wrong as the column should have a zero length non null value; however, Sybase/SQL 6.5 do not permit zero length binary columns so the driver has to output a single byte value instead. Amended Support.embedData() to fix this problem. o Related to the point above, TdsData.writeParam and writeTds5Param do the wrong thing and output a zero length byte value as a null. Amended TdsData to fix this problem. o It is possible for Support.embedData to output a decimal literal that exceeds the precision of the server. Amended embedData to truncate value string. o In TdsCore.executeSQL the inbatch flag is reset prematurely causing batched prepared statements to fail to substitute parameters correctly. Amended executeSQL to ensure that flag is reset after last packet sent. 01/21/2005 - Alin Sinpalean o Changed the home page title to "jTDS JDBC Driver". 01/17/2005 - Alin Sinpalean o Updated typemap.html to reflect the mapping of IMAGE to BLOB and TEXT/NTEXT to CLOB. o Added BLOB and CLOB information to JtdsDatabaseMetaData.supportsConvert(). 01/14/2005 - Alin Sinpalean o Applied Mike's fix for bug [1101251] SSL Connection Problem. o Added README.SSL to the build, updated FAQ and feature matrix. o Added "ssl" property to the DataSource. 01/13/2005 - Alin Sinpalean o Added readme for SSL. o Added logging to MSSqlServerInfo if an exception occurs. 01/10/2005 - Alin Sinpalean o Optimization in Support.substituteParamMarkers(): a StringBuffer is used for converting parameter numbers to strings, in order to avoid unnecessary object creation. o Corrected a problem in TdsCore where the inBatch flag was set incorrectly causing sp_executesql to be used for all parameterized queries. o Added a specific error message for the case when an output parameter value is accessed without registerOutParameter() being called first. 01/05/2005 - Alin Sinpalean o Applied patch [1096296] DatabaseMetaData.getTypeInfo() ordering, submitted by David Eaves. o Applied Mike's fix to bug [1096086] Zero length streams generate null values. 01/04/2005 - Alin Sinpalean o Applied patch [1089891] Adding SSL, from Rob Worsnop. Wasn't able to test whether SSL really works (because I was not able to configure SQL Server to handle it) but with a few minor changes at least the old functionality is not affected. o Applied patch [1095057] Positioned updates and improved Sybase cursors. o Applied Mike's fix to bug [1094621] Decimal conversion error. o Some performance improvements. 12/21/2004 - Alin Sinpalean o Included the SSO patch in the build. 12/20/2004 - Alin Sinpalean o Fixed bug [1086477] RETURN_GENERATED_KEYS on select returns 1 row. o Applied patch [1088293] Simplified multi threaded execution with a few minor corrections and modifications (including optimized, single request, batch updating). o DDL statements no longer return update counts. This should make jTDS more compatible with other drivers and the spec. 12/19/2004 - Alin Sinpalean o Fixed bug [1082986] prepareSQL=3 Does Not Function (caused by the separation of input and output values). o Applied Mike's fix for bug [1086494] DatabaseMetaData.getProcedureColumns broken on Sybase. o Fixed bug [1087057] Connection is closed during XA Transaction. Also added check for error severity: if greater than or equal to 20 the Connection is closed (because the server will close the connection after the error). 12/17/2004 - Alin Sinpalean o Applied, with some minor changes and corrections, patch [1086173] Windows Local Named Pipe Support. Thanks go to Stardog33. o Fixed failure of JtdsDataSourceUnitTest.testNoUser() with a runtime error caused by inability to load the ntlmauth DLL. o Added one more test for SharedSocket synchronization, only with RPC requests. Still not able to reproduce the locking read. 12/16/2004 - Alin Sinpalean o Possible fix for bug [1086156] Hang in driver socketRead under load. Could not actually reproduce the exact behavior but found other errors caused by incomplete synchronization on SharedSocket. o Fixed a bug that was causing setSavepoint() to fail when no statements to actually start a transaction were executed before. 12/14/2004 - Alin Sinpalean o Implemented fetching of row blocks with cursor ResultSets, controllable through setFetchSize(). As part of this, also implemented support for sending more than one request in one packet. o Applied Mike's update to patch [1037237] Windows Single Sign On in jTDS. 12/13/2004 - Alin Sinpalean o Applied patch [1037237] Windows Single Sign On in jTDS. Thanks go to Magendran Sathaiah and Mike Hutchinson for the original patch and Java code rewrite, respectively. 12/09/2004 - Alin Sinpalean o Added some tests to verify the behavior of sp_cursorfetch with fetch sizes greater than 1. o Added code to ensure scroll sensitive ResultSet rows are reloaded after updated (delete just marks the row as deleted, while insert adds a row at the end of the ResultSet). o Fixed some cursor ResultSet issues caused by invalid suppositions considered when optimizing (i.e. that updating a row will always delete the current row and create a new one at the end of the ResultSet). This will affect update performance (by making an additional request) but it is necessary to ensure correctness. o Updated DatabaseMetaData boolean getters related to the capabilities of detecting updates/inserts/deletes (only deletes can in fact be detected on SQL Server). 12/08/2004 - Alin Sinpalean o Combined connection properties setup in the ConnectionJDBC2 constructor with the SELECT @@MAX_PRECISION query into a single request, reducing login overhead to only a single request/response. =============================================================================== 12/08/2004 - jTDS 0.9.1 released =============================================================================== Changes from jTDS 0.9 ===================== 12/08/2004 - Alin Sinpalean o Updated the index.html with support information and added a description for the xaEmulation parameter in the FAQ. o Updated version number to 0.9.1 in code and documentation. 12/07/2004 - Alin Sinpalean o Updated the build files to create a binary distribution package containing the readme, license, html documentation, XA DLL and SQL as well as the jar, instead of the plain jar as it was before. o Updated README and README.XA. o Corrected bug [1080659] ParamInfo throws NullPointerException. o Corrected loading of Charsets.properties under a J2EE environment. 12/06/2004 - Alin Sinpalean o Minor code cleanup using FindBugs. 12/05/2004 - Alin Sinpalean o Applied Mike's fix for bug [1078927] Callable statement fails (callable statements with both literal parameters and parameter markers failed to execute). 12/03/2004 - Alin Sinpalean o Corrected bug [1078325] Multithreaded prepared statement errors (or at least I sure do hope so). The problem seems to have been the fact that preparing a statement and executing it was not a single, atomic operation and a rollback() could occur between the two basically "unpreparing" the statement. Also synchronized some methods in ConnectionJDBC2 that looked like they needed some sync. o Corrected some exception error messages that contained incorrect hexadecimal values. o Corrected an issue in SQLParser that prevented CallableStatements from working properly with procedures containing semicolons in their name (e.g. "test;1"). o Modified BlobImpl.getBytes() and ClobImpl.getString() to return as much data as available instead of throwing an SQLException if the length parameter is too big (this is my understanding of the API documentation). o Removed ColData from CVS (forgot to do it when applying the patch). o Applied Mike's patch [1077886] XA Emulation mode. 12/02/2004 - Alin Sinpalean o Added a unit test (and made a couple of minor fixes) for column collation support. Seems to work fine now. o Fixed TimestampTest.testWriteDate() to actually test whether dates are written correctly (i.e. w/o their time component) into the DB. 12/01/2004 - Alin Sinpalean o Applied patch [1076337] Elimination of ColData class. Thanks a lot, Mike for all the effort! o Applied patch [1076383] ResultSetMetaData for more complex statements for SQL Server. 11/30/2004 - Alin Sinpalean o Corrected bug [1075977] setObject() causes SQLException. 11/29/2004 - Alin Sinpalean o Fixed some NPEs caused by the new per column collation support. o Applied Mike's fix for [1074356] TDS 4/5 Login fails with latest CVS code. o Applied Mike's fix for [1074096] Incorrect data type determine on dataset meta data. o Implemented support for reading character data using per column collations for SQL Server 2000. 11/26/2004 - Alin Sinpalean o Corrected a bug which was causing Statement.setMaxRows() to not work with cursor-based ResultSets. 11/24/2004 - Alin Sinpalean o Extracted getConnection(callerReference) out of BlobImpl and ClobImpl and moved it to Support. o Created the CharsetInfo class to hold both information about a character set (non-static fields) and provide support for loading and retrieving character sets (static fields and methods; the logic was moved from Support). o Added comments to highlight possible problem areas with multi-byte character sets. o Started adding support for SQL Server 2000 per column collations. o Other minor cleanups. 11/23/2004 - Alin Sinpalean o Corrected bug [1071397] Error in prepared statement (parameters in outer join escapes are not recognized). 11/19/2004 - Alin Sinpalean o Replaced the ColData copy constructor with clone(). o Added tests to ensure Blob.getBytes(0, length) and Clob.getSubString(0, length) fail. 11/18/2004 - Alin Sinpalean o More performance improvements: instead of creating new ParamInfo instances for each sp_XXX call, the same objects are reused both for fixed parameters (optype, fetchtype etc.) and updated column values; also, for addBatch() the ParamInfo copy constructor was replaced with clone(). o Tweaked initial StringBuffer sizes to prevent reallocation as much as possible. o Corrected a bug that was causing Date values to be inserted just like Timestamps (i.e. including the time component). 11/17/2004 - Alin Sinpalean o Tiny performance tweaks. o Added jta.jar to lib folder to ensure compilation works under Java 1.3. o Corrected a problem in ReaderOutputStream that was causing read(byte[]) to always return the size of the byte array even if less data was read. o Fixed a problem with absolute(-1) (the row position was incorrectly updated). o Improved performance of MSCursorResultSet, by replacing sp_cursor FETCH_INFO calls with simple operations mimicking the behavior of SQL Server (incrementing the row count on INSERT and UPDATE). o Implemented support for ResultSet.insertRow() when no column is updated (i.e. inserting default values) in MSCursorResultSet. o Added charsets GB2312 and GBK as aliases for MS936. o Corrected bug [1067224] getPrimaryKeys does not return PK_NAME column. 11/15/2004 - Mike Hutchinson o Refactored XA support so that the driver will run under JRE 1.3 without requiring jta.jar to be available. o Revised JTdsXA.DLL to make it more compatible with older versions of MSDTC. o Changed XA support so that exception is thrown if not used with SQL 2000. o Use of XA connection forces prepareSQL=2 to prevent problems with temporary stored procedures. o Fixed 'bug' 1062671 SQL Parser unable to parse {ts ?}. o Fixed bug 1047330 prep statement with > 2100 params fails! o Modified callable statement parameters so that IN and OUT values are separated which makes jTDS more compatible with other drivers. o Added additional constructors for ParamInfo to streamline use of parameters in the driver. o Replaced the DummyResultSet class with CachedResultSet. o Additional tests in CallableStatementTest, GenKeyTest, PreparedStatementTest. o Added additional html page to describe jTDS data type mapping. 11/15/2004 - Alin Sinpalean o Remapped TEXT/NTEXT to BLOB and IMAGE to CLOB in TdsData.types. o Partially applied patch [1065036] Problems with connection pooling and jTDS. o Cleaned up default value assignment to URL parameters, moving everything to DefaultProperties and replaced all property key literals with constants. o Corrected bug [1062395] Empty (but not null) blobs should return byte[0]. o Applied Mike's fix for bug [1062549] Build fails under java 1.3. o Corrected bug [1062198] SecurityException not caught in class ConnectionJDBC2 (fix by Andreas Mross - amross). 11/10/2004 - David Kilzer o Fixed case of 'props.tcpnodelay' in JtdsDataSource.getConnection() (two unit tests were failing). o Added test for 'tcpNoDelay' property to DefaultPropertiesTestLibrary. 11/08/2004 - Brian Heineman o Added tcpNoDelay driver property; default is true. 11/05/2004 - Alin Sinpalean o Applied Mike's fix for bug [1060466] SQL Executed twice. o Applied Mike's fix for bug [1059916] Whitespace needed in preparedStatement. o Tiny fix in XaTest to avoid deadlocks in case an SQLException is thrown. 11/03/2004 - Alin Sinpalean o Updated JtdsDatabaseMetaData.getProcedures() to only cut off the ";" at the end of the procedure name for the first procedure (i.e. if it's ";1"). 11/01/2004 - Alin Sinpalean o Corrected bug [1057237] Protocol Exception processing TDS_COLINFO packets. 10/27/2004 - Alin Sinpalean o Ran the FindBugs tool (http://findbugs.sourceforge.net) on the jTDS code base with no major results. Most signalled problems were either in the test suite or minor suggestions on the driver itself. Applied all suggestions that made sense. o Applied Mike's patch [1054878] Improved meta data. In addition to metadata improvements, the patch fixes a number of bugs, including [1049645] DatabaseMetaData getProcedures names have semicolon, [1019707] metaData.getProcedures has missing 8th column on Sybase and [1043569] Handling of unicode data when inserting into a TEXT field (not totally sure about the last one, though). 10/26/2004 - Alin Sinpalean o Reviewed and cleaned up Brian's latest statement cache update. 10/25/2004 - Brian Heineman o Created FastStatementCache for users with a limited number of unique prepared statements who want the fastest performance possible. o Added maxStatements property to control how many simultaneous statements the connection keeps open. o Corrected bug when dropping procedures; the logic for DROP PROC and sp_unprepare was reversed. o Reduced overhead associated with latching. The connection now establishes a NonCachingStatementCache (yes, it is an oxymoron) when maxStatements is 0 and a FastStatementCache when maxStatements is Integer.MAX_VALUE. This prevents the need for the latching methods to check the statement size each time. o These changes address RFE [920825] and bug [1019694]. 10/25/2004 - Alin Sinpalean o Applied Mike's fix for bug [1052942] Error processing JDBC call escape. 10/21/2004 - Alin Sinpalean o Altered the interface of Brian's StatementCache interface to correctly handle both usage counts (searching by SQL string) and searching by key. Still need to do the implementation, though. o One more minor change for bug [1051747] Array out of bounds Exception in ResultSetMetaData (outputting the actual column index in the exception text rather than the column count). o JtdsDataSourceUnitTest.Test_JtdsDataSource_getConnection.testNormal() now uses the new properties in connection.properties to check if connecting through a DataSource actually works (also tests bug [1051595] jtdsDataSource connects only to localhost - could not reproduce). 10/21/2004 - Brian Heineman o Initial work to support controlled statement caching. A latching mechanism is available to ensure two separate statements with the same SQL do not cause a cached statement to be removed prematurely. o Corrected bug [1051747] Array out of bounds Exception in ResultSetMetaData; (thanks to Mike Hutchinson for the patch). 10/20/2004 - Alin Sinpalean o Corrected a bug that was causing Charsets.properties not to be loaded under Db-Visualizer (and in any case when the file could not be loaded via the thread context classloader). o Made some minor modifications to ConnectionJDNC2.setCollation() to correctly translate bytes to ints. o Updated XaTest to drop the test tables on test end. Also prepended "jTDS_" to all non-temporary table names (in all tests) to ensure no conflicts with real tables occur. o Cleaned up Javadoc comments to get rid of build warnings. o Corrected a bug that was preventing the ConnectionPoolDataSource implementation from working correctly with JNDI, by having JtdsDataSource implement this interface, too. o Corrected bug [1050660] PreparedStatement.getMetaData() clears resultset. JtdsPreparedStatement.getMetaData() always submitted a request to obtain the meta data, even if the ResultSet was already available, effectively dumping the ResultSet. Now it tests for a current ResultSet. An even better approach would be to use a different TdsCore instance altogether, in any case, but I think it's unnecessary overhead. 10/15/2004 - Alin Sinpalean o Applied Mike's fix for bug [1047094] Problem with the store procedure's return. 10/13/2004 - Alin Sinpalean o Fixed a couple of errors in Support.convert(), calls to Blob.getBytes() and Clob.getString() with a position of 0. o Fixed a bug that was causing ResultSet retrieval by name to return the last matching column rather than the first. 10/12/2004 - Alin Sinpalean o Applied Mike's fix for bug [1042272] jTDS doesn't allow null value into Boolean. Also fixed the broken test for this bug. 10/10/2004 - Alin Sinpalean o Applied patch [1038937] Support for XA connections. Mike strikes again! :o) o Added a test for bug [1042272] jTDS doesn't allow null value into Boolean. Haven't had the time to look into it, but it's good to have the failing test as a reminder. 10/08/2004 - Alin Sinpalean o Added checkClosed() calls to JtdsPreparedStatement.setObjectBase(), getParameterMetaData() and getMetaData(), which were all using the connection object and could cause NPEs if the statement was closed. 10/07/2004 - Alin Sinpalean o Applied patch [1040214] "Changes to allow use of default charset", with a number of minor modifications, including always throwing an SQLException if the charset cannot be determined or loaded. o Implemented support for SQL Server 2000 collations. The default charset is now determined from the collation in the ENVCHANGE packets sent by the server. Still need to extend this support for collations preceding column and output parameter descriptions. o Cleaned up and fixed some of the unit tests. 10/05/2004 - Alin Sinpalean o Corrected bug [1040475] Possible bug when converting to and from datetime. SQL Server seems to accept datetime values outside the 1753-9999 range as long as they are submitted as SYBDATETIME values and not as Strings and they are read back just fine. Weird. 10/04/2004 - Alin Sinpalean o Corrected a bug in TdsCore causing "java.sql.SQLException: Output parameters have not yet been processed. Call getMoreResults()." to be thrown with Sybase. o Added a lot of LCID and sort order information to Charsets.properties (I hope all of it) in preparation for collation support for TDS 8.0. o Corrected bug [1039876] MS SQL JtdsResultSet.isAfterLast() always returns false. 10/03/2004 - Alin Sinpalean o Corrected yet another charset issue. Charsets should work now. 10/02/2004 - Alin Sinpalean o Corrected a number of charset related issues, the most important of which was causing iso_1 to be mapped to ISO-8859-1 instead of Cp1252, which is the actual charset used (at least by MS SQL Server). o Also cleaned up Charsets.properties and added mappings from Java character set names back to themselves so that they can be used in the URL or Properties with their Java name. 09/30/2004 - Alin Sinpalean o Added some more information (from the FreeTDS mailing list) on sp_cursoroption parameters. 09/29/2004 - Alin Sinpalean o Conversion to LONGVARCHAR from most types was broken. Fixed. =============================================================================== 09/29/2004 - jTDS 0.9 released =============================================================================== Changes from jTDS 0.9-rc2 ========================= 09/28/2004 - Alin Sinpalean o Updated the FAQ, feature matrix and some of the other HTML files. o Updated driver version as returned by Driver and DatabaseMetaData to "0.9". o Minor javadoc cleanup. o Corrected bug [1036059] getTimestamp with Calendar applies tzone offset wrong way. The getTimestamp(), getTime() and getDate() methods with Calendar parameters were applying the time zone difference the same way as the set methods (hope it's not the set methods that were wrong, the JDBC spec is VERY vague about how the Calendar should be used). o Corrected bug [1036058] DataSource implementation broken. Thanks, Mike for finding this before the new release. 09/27/2004 - Alin Sinpalean o Update counts are read and cached completely (either until the end of the response or until a ResultSet is encountered) and exceptions are thrown when an output parameter is read before being set. This means that stored procedures that return only update counts are processed completely when executed and output parameter values are available right away. o Implemented some more support for spcursorprepare (still not complete, so not used yet). o Updated the documentation of sp_cursorprepare in apiCursors.html and some minor things in TDS.html. o prepareSql=3 (sp_prepare) is supported by TDS 7.0, small update to use it in jTDS (until now it was downgraded to sp_executesql -- prepareSql=2). 09/24/2004 - Alin Sinpalean o Updated JtdsDatabaseMetaData.getDriverVersion() to also include misc version information. 09/23/2004 - Alin Sinpalean o Applied Mike's patch [1030475] Scrollable/Updateable result sets for Sybase. 09/23/2004 - Alin Sinpalean o Changed the default TDS version to 8.0 when connecting to SQL Server. o Corrected bug [1032278] metadata.getColumnClassName not match resultset.getObject. Also improved handling of LOB columns in updateable ResultSets: until now, updateObject with a LOB value caused the whole content to be cached into memory. o getObject() (both in JtdsResultSet and JtdsCallableStatement) returned UniqueIdentifier objects for UNIQUEIDENTIFIER columns. Fixed. o Modified some TdsCore.executeSQL() calls to send -1 for maxRows (in order to avoid unnecessary SET ROWCOUNT queries). o JtdsDataSource uses the default values from DefaultProperties instead of duplicating the initialization. Also, for easier handling, all values are kept internally as Strings. 09/16/2004 - Alin Sinpalean o Applied Mike's patch [1028856] Sybase 12 support. Added a Tds5Test class. o Cleaned up some minor things in tests. o Added a test for bug [1028881] statement.execute() causes wrong ResultSet type. Seems like it works, after all. o Corrected a bug that was causing no exception to be thrown when an invalid call escape syntax ("{call ?=...") was used. o Cleaned up some warnings signalled by my IDE again. 09/13/2004 - Alin Sinpalean o Corrected bug [1027304] DatabaseMetaData.getSchemas() returns 1 column (need 2); for JDBC 3.0 getSchemas() now also returns a NULL TABLE_CATALOG column. o Added a simple test case for bug [1010660] 0.9-rc1 setMaxRows causes unlimited temp stored procedures, but was unable to reproduce the behavior. The test is PreparedStatementTest.testMaxRows(). 09/12/2004 - Alin Sinpalean o Implemented automatic TDS protocol version fallback, according to feature request [991689] jTDS should automatically detect TDS protocol. Should work fine with falling back from TDS 8.0 to 7.0 and could work (but I had no way of testing this) with falling back from 5.0 to 4.2 (although I'm not sure what will happen with the capabilities token). 09/10/2004 - Alin Sinpalean o Corrected bug [1023984] Protocol error processing table meta data. Turns out the TABNAME packet is only different for TDS versions 0x71000001 and up (i.e. SQL Server versions 2000 SP1 and newer). Added an internalTdsVersion field to SharedSocket, that should probably replace tdsVersion altogether. 09/07/2004 - Brian Heineman o Corrected bug [1022968] Long SQL expression error; (thanks to Mike Hutchinson for the patch). o Corrected bug [1023984] Protocol error processing table meta data; (thanks to Mike Hutchinson for the bug report and patch). 09/05/2004 - Alin Sinpalean o Fixed some minor issues with LOBs and InputStreams/Readers that don't fill the read buffer. o Fixed BigDecimal handling in Support.embedData() (used when prepareSQL=0). BigDecimal values had their precision changed to 10 for some reason. o Corrected a bug which was causing strings to always be sent as non-unicode (i.e. not preceded by N') by prepared statements with prepareSQL=0, regardless of TDS version and settings. o Corrected bug [1022445] Cursor downgrade warning not raised; thanks Mike for the find and fix. o Corrected bug [1022448] NPE Cursor result set errors with prepareSQL != 1; thanks Mike for the find and fix. o Added a misc component to the driver version, to include release candidate information or any other version information besides major and minor version (e.g. the "-rc2" in 0.9-rc2). 09/02/2004 - Alin Sinpalean o Corrected bug [1020733] Sysbase test failures; (thanks to Mike Hutchinson for the bug report and patch). o Replaced global temporary tables and procedures ("##"-prefixed) with local temporary tables and procedures ("#"-prefixed) in all tests, after a failure in the test suite caused by a CREATE TABLE statement. 09/01/2004 - Alin Sinpalean o Fixed bug #1020324 - "Driver.parseURL method: missing host check". Thanks duccio for the find and fix. o Two simple but very important (in terms of performance) tweaks in Messages (caching the message ResourceBundle and no longer creating and using a MessageFormat instance when the message has no parameters). Before these two changes, over 100k+ allocations were made unnecessarily during a single run of the test suite. o RequestStream.writeStreamBytes() and writeReaderChars() no longer read/write one byte/char at a time, but rather use a buffer. This should considerably improve performance. o Added a simple check and a read loop instead of a single read to BlobImpl and ClobImpl. o Small changes in LargeLOBTest.testLargeBlob1() and TestBase.compareInputStreams()/compareReaders() to improve performance. All three now use buffers instead of reading/writing one byte at a time. LargeLOBTest runs now in just over a minute. o Added a test for bug #1008816 - '"More data in stream ..." error when inserting an image' to LOBTest (testBlobSet8). This seems to have been fixed starting with 0.9-rc1. 08/31/2004 - Alin Sinpalean o Improved BlobImpl internal OutputStream write(byte[], int, int) implementation. No longer uses write(byte). Also cleaned up somewhat ClobImpl. o TestBase.compareInputStreams() and compareReaders() were not checking for EOF on the first input stream/readed. Fixed. o LargeLOBTest now only runs if the 'jTDS.runLargeLOBTest' system property is defined. Should do this with 1.4-only test methods too. o Updated build.sh to work on my development machine (should work better on any *NIX now). o Cleaned up some Javadoc comments that were causing warnings when generating the documentation. o Cleaned up some IntelliJ IDEA warnings, including a possible bug that could cause NPEs in TdsCode.executeSQL70(). =============================================================================== 08/28/2004 - jTDS 0.9-rc2 released =============================================================================== Changes from jTDS 0.9-rc1 ========================= 08/28/2004 - Brian Heineman o Corrected bug [1017957] 9.1 rc1 and resin 3.0.8 incompatibilities?; JtdsDataSource no longer inherits accessors and mutators from another class. o Corrected bug [1017896] Fn convert parameters wrong way round; (thanks to Mike Hutchinson for the bug report and patch). o Corrected bug [1017164] executeQuery fails with > 2 resultsets; (thanks to Mike Hutchinson for the patch). o Applied patch attached to bug [1017616] 0.9-RC1 Threading problem; (thanks to Mike Hutchinson for the patch). o Added test for bug [1008882] Some queries with parameters cannot be executed with 0.9-rc1 o Numerous javadoc corrections for release. 08/24/2004 - Brian Heineman o Corrected JDBC compliance test files per Mike Hutchinson's recommendations: http://sourceforge.net/forum/message.php?msg_id=2724244 o Corrected bug [1009233] ResultSet getColumnName, getColumnLabel return wrong values; (thanks to Mike Hutchinson for the fix). o Added test for bug [1009233] ResultSet getColumnName, getColumnLabel return wrong values. o Corrected bug [1015543] ResultSetMetaData.isNullable always returns columnNoNulls; (thanks to Mike Hutchinson for the bug report and patch). o Miscellaneous test clean up. 08/22/2004 - Brian Heineman o Corrected bug [1013749] Driver does not support params inside escapes; (thanks to Mike Hutchinson for the bug report and patch). o Corrected bug [1013819] Cursor downgraded bug; (thanks to Mike Hutchinson for the bug report and patch). 08/21/2004 - Brian Heineman o Applied patch [1013432] Patches for SUN JDBC Compatibility test; (many thanks again to Hutchinson for the patch. The driver now passes the SUN JDBC compatibility test suite 1.3.1). The following issues were also addressed in this patch: [1012307] PreparedStatement.setObject (java.util.Date) not working; (Server not reporting that java.util.Date is not a supported object type) [1012301] 0.9-rc1: Prepared statement execution error; (Leading spaces cause the parameter marker offsets to be incorrect) [1011650] 0.9-rc1: comments get parsed; (Added Joel Fouse's patch plus modifications to ensure that driver can cope with comments before the first SQL statement). [1002971] TimestampTest failures under JDK 1.3 (Possible class cast exception in TdsData). [1008126] Metadata getTimeDateFunctions() wrong o Corrected bug [1012318] 0.9-rc1 throw NullPointerException if user/password passed; if a null user or password was passed the driver would throw a NullPointerException. o Corrected stored prcedure cursor parameter definitions. 08/17/2004 - Brian Heineman o Additional corrections for bug [966274] Trusted Connections no longer work; (thanks to David Kilzer and Joel Fouse). o Corrected bug [1009234] sp_prepare and sp_prepexec should be limited to TDS 8.0 o Added initial support for sp_cursorprepare, sp_cursorprepexec and sp_cursorexecute; statement handles are not currently cached for reuse. This corrects bug [1008097] 0.9-rc1 prepareSQL=3 - read only cursor. 08/16/2004 - David Kilzer o New JtdsObjectFactoryUnitTest class used to test JtdsObjectFactory class. o Pulled ucFirst() method out of JtdsDataSourceUnitTest class into DefaultPropertiesTestLibrary class. 08/16/2004 - Brian Heineman o Corrected bug [966274] Trusted Connections no longer work; (thanks to Mike Hutchinson for the patch and all the users who helped to find the problem). 08/14/2004 - Brian Heineman o Corrected bug [1006449] 0.9rc1: Driver version broken; (thanks to Mike Hutchinson for the patch). 08/13/2004 - Brian Heineman o Added test for bug [1008208] 0.9-rc1 updateNull doesn't work o Added initial support for prepareSql=4; sp_prepexec used in conjunction with sp_execute. Currently the statement handle is not retrieved and cached so sp_prepexec is being called each time. Update the FAQ to indicate that sp_prepexec functionality is experimental. o Corrected bug [1008208] 0.9-rc1 updateNull doesn't work; updated test to ensure functionality continues to work in the future. 08/13/2004 - David Kilzer o Applied patch to check if connection is null before calling connection.isClosed() in JtdsStatement. Patch posted to [1007962] 0.9-rc1 NullPointerException; was created while debugging an issue with named pipes. 08/12/2004 - Brian Heineman o Added result set tests for min and max values. o Added result set tests for BIGINT. o Corrected conversion errors with Long values that were sent as BigDecimal; the value sent to the database was not the value specified. 08/11/2004 - Brian Heineman o Applied patch in bug [1006845] Stored procedure with 18 parameters; (thanks to Mike Hutchinson for the patch). o Added test for bug [1006845] Stored procedure with 18 parameters 08/10/2004 - Brian Heineman o Applied patch in bug [1006218] getObject returns incorrect Java class; (thanks to Mike Hutchinson for the patch). =============================================================================== 08/09/2004 - jTDS 0.9-rc1 released =============================================================================== Changes from jTDS 0.8.1 ======================= 08/09/2004 - Brian Heineman o Corrected bug [1005881] Typo in Exception message "Uknown server host name abc" o Corrected bug [1005644] Small bug in ant build file; (thanks to Mike Hutchinson for the fix). o Applied patch [1005550] Documentation on sp_cursorprepare etc.; (thanks to Mike Hutchinson for the patch). 08/07/2004 - David Kilzer o Changed AbstractDataSource.getTdsVersion() and setTdsVersion() back to getTds() and setTds() to preserve external interface. Left private data member named tdsVersion to provide consistency with private field in ConnectionJDBC2 and to make testing easier. 08/07/2004 - Brian Heineman o Applied patch [1005207] Modified microsoftPrepare method; (thanks to Mike Hutchinson for the patch). 08/06/2004 - David Kilzer o De-uglified the Driver.getPropertyInfo() method. The code reads much cleaner now. o Revised insert/update/delete-new-property mini-howto in DefaultProperties. o Created overloaded DefaultProperties.getServerType() methods to convert server type from String to Integer and Integer to String. Implemented in Driver and JtdsDataSource classes. o Created JtdsDataSourceUnitTest class. Cleaned up AbstractDataSource to use DefaultProperties defaults, added missing appName and progName properties, fixed type of prepareSql from boolean to int, and renamed isLastUpdateCount() to getLastUpdateCount(). Fixed parsing of new type of prepareSql property in JtdsObjectFactory.getObjectInstance(). o Updated DefaultPropertiesTestLibrary to contain flags for only testing a default setup of SQL Server and/or TDS 7.0. o Updated DriverPropertyInfo choices for prepareSql property. o Cleaned up DefaultPropertiesTestLibrary so it is easier to extend. o Created ConnectionJDBC2UnitTest. o Created DefaultProperties.getTdsVersion() method to convert Tds version string to an integer. Created unit tests in DefaultPropertiesUnitTest. o Created UnitTestBase.invokeGetInstanceField() method for ConnectionJDBC2UnitTest. o On ConnectionJDBC2 class: renamed private field serverPort to portNumber, added private default constructor for testing, and implemented use of DefaultProperties.getTdsVersion(). o INCOMPATIBLE INTERFACE CHANGE: Renamed AbstractDataSource.getTds(), setTds() and private tds field to getTdsVersion(), setTdsVersion() and tdsVersion to match private field in ConnectionJDBC2. This also affects JtdsDataSource. [Reverted: see 08/07/2004] o ConnectionJDBC2.unpackProperties(): Removed code that set default property values since this is now handled in Driver.parseURL() before the method is called. Refactored common code into parseIntegerProperty() and parseLongProperty() methods. o New unit test in ConnectionJDBC2UnitTest for testing that unpackProperties() throws an SQLException when parsing an invalid integer or long property. 08/06/2004 - Brian Heineman o Update the usage of the prepareSql parameter. This parameter is now used to determine how prepared statements are sent to the server. Options include: 0 - SQL is sent to the server each time without any preparation 1 - Temporary stored procedures are created for each unique SQL statement and parameter combination 2 - sp_executesql is used 3 - sp_prepare is used in conjunction with sp_execute 4 (not implemented) - sp_prepexec is used in conjunction with sp_execute Update the FAQ to include this new information. o Corrected bug with sp_prepare/sp_execute logic where statements without parameters were being sent as raw SQL even though the SQL was prepared with sp_prepare. o Corrected bug introduced with early work where the temporary stored procedure name may not have been unique for the connection. 08/05/2004 - David Kilzer o Added missing javadoc to DriverUnitTest methods. o Renamed Messages.defaultResource to Messages.DEFAULT_RESOURCE to reflect its use. o Refactored Driver.getPropertyInfo() so that properties are not hard-coded. Added Messages.loadDriverProperties() method. Wrote additional unit tests for Driver.getPropertyInfo() in DriverUnitTest. Added more utility methods to UnitTestBase. 08/05/2004 - Brian Heineman o Applied Mike Hutchinson's patch for [996631] Refactoring and some performance optimization. o Removed extraneous import statements. o Added check in data conversion for LOB values with a length greater than 2,147,483,647. o Added "and Sybase" to JtdsDatabaseMetaData.getDriverName(). 08/04/2004 - Brian Heineman o Applied patch in bug [1003507] Cursor result set close error; (thanks to Mike Hutchinson for report and the fix). o Removed assertEquals(double,double) to avoid Eclipse execution failures. 08/04/2004 - David Kilzer o Renamed Settings class to DefaultProperties to match its use. Removed redundant "DEFAULT_" prefix from its public static constants. o Refactored DefaultProperties to remove duplicate code. o Created DefaultPropertiesUnitTest to test new methods in DefaultProperties. o Moved methods related to Messages.propertes from Support class to new Messages class. Support.getMessage() is now Messages.get(). o Wrote unit test for Driver.getPropertyInfo() in preparation for future refactoring. 08/03/2004 - Brian Heineman o Applied patch in bug [1002811] Poor performance of cursor result sets; (thanks to Mike Hutchinson for the fix). o Applied patch in bug [1001956] updateBytes() converted to hex string in varchar; (thanks to Mike Hutchinson for the fix). 08/03/2004 - David Kilzer o Swapped descriptions of appName and progName in FAQ. o Renamed internal libName variable to progName to match external property. o Cleaned up Messages.properties to remove prop.libname (prop.progname already existed) and to add prop.desc.appname and prop.desc.progname properties. o Clean up comments to reference Driver.SQLSERVER and Driver.SYBASE instead of TdsCore or old Tds classes. o Add code to check for inherited methods, not just locally declared methods, in UnitTestBase static methods. o Fixed Driver.getPropertyInfo() to parse url when null properties are used. o Created new Settings class to hold default settings values and related utility methods. o Moved port and LOB buffer constants from TdsCore to Settings. o Modified Driver.parseURL() to set default properties using Settings.addDefaultProperties(). o Created DefaultPropertiesTestLibrary class for testing Driver.parseURL(). o Implemented Settings.TDS_VERSION_XX constants in various classes. o Added test suite to DriverUnitTest to test Driver.getPropertyInfo(). o Added missing 'appname' and 'progname' properties to, and removed default setting code (now handled in parseURL()) from, Driver.getPropertyInfo(). 08/01/2004 - Brian Heineman o Partial application of patch [997595] SQL 6.5 Test suite.; general test clean up. o Updated tests so that they compile with the 1.3 JDK. o Updated BlobImpl and ClobImpl so that they compile with the 1.3 JDK. o Corrected bug in Blob and Clob file writes where a NullPointerException was thrown if close() was called twice on a stream. o Corrected bug in JtdsPreparedStatement.getParameter() where the error check would incorrectly allow a 0 value (thanks to Mike Hutchinson for the report and fix). o Corrected bug in TdsData.getVariant() where the SYBUNIQUE case would return an incorrect UID string (thanks to Mike Hutchinson for the report and fix). 07/30/2004 - Brian Heineman o Updated build process to correct bug [999702] LICENSE file not included in source distribution 07/29/2004 - David Kilzer o Changed default Sybase port from 4000 to 7100 in faq.html to match value of TdsCore.DEFAULT_SYBASE_PORT. o Created TdsCore.DEFAULT_LOB_BUFFER_SIZE constant. Replaced use of "magic" values in other classes. o Replaced more "magic" values with TdsCore.MIN_PKT_SIZE and TdsCore.MAX_PKT_SIZE in various classes. o Made TestBase and DatabaseTestCase abstract so that IntelliJ IDEA would not try to instantiate them and run them. o Created new abstract UnitTestBase class to hold reflection methods used by other test classes. o Changed NamedPipeUnitTest to extend UnitTestBase. o Changed CSUnitTest to use UnitTestBase methods. 07/28/2004 - David Kilzer o Moved TdsCore.TDS42, TDS50, TDS70, TDS80, SQLSERVER and SYBASE constants to Driver class per suggestion by Mike Hutchinson. o Made TdsCore.DEFAULT_SQLSERVER_PORT and DEFAULT_SYBASE_PORT public. Removed use of "magic" values in other classes. o Applied patch [997211] Refactor Tds8Test to skip tests if not using TDS 8.0. Removed unused TestBase.connectODBC() and TestBase.getConnectionODBC() methods. Now use loadProperties(ODBC_CONNECTION_PROPERTIES) to switch the connection to use ODBC. o Created new DatabaseTestCase.dropProcedure() method that takes an additional Statement argument. Updated AsTest.testProc1() and testProc2() to use the new dropProcedure() method. 07/27/2004 - David Kilzer o Renamed SharedNamedPipeTest to NamedPipeUnitTest to better reflect its usage. o Added protected getters and setters to SharedSocket so that the in, out, tdsVersion and serverType fields could be made private again. Implemented use of getters and setters in SharedSocket and SharedNamedPipe. o Refactored SharedNamedPipe constructor into an instance() static factory method. Allowed calculateBufferSize() method to be made non-static, and will allow for easier unit testing in the future. o Cleaned up javadoc: fixed spelling and removed unused @throws. o Fixed CallableStatementTest.testCallableRegisterOutParameter1() which was using the '==' operator on String objects. Changed to use assertEquals() instead. Cleaned up two other uses of '==' inside assert*() methods. 07/27/2004 - Brian Heineman o Added test for bug [998765] Exception with Sybase and metaData.getTables() 07/26/2004 - David Kilzer o Made SharedNamedPipe constructor package-private to match SharedSocket constructor. o Made TdsCore.SQLSERVER and TdsCore.SYBASE public. Removed use of "magic" values. o Fixed default value of lobBuffer in AbstractDataSource.getReference(). It was using "portNumber" instead of "lobBuffer" for its default. o Made TdsCore.TDS42, TDS50, TDS70, TDS80 constants public for use with testing. o Made TdsCore.MIN_PKT_SIZE public, and created TdsCore.MAX_PKT_SIZE and TdsCore.DEFAULT_MIN_PKT_SIZE_TDS70. Removed used of "magic" values. o Wrote new SharedNamedPipeTest class for testing new SharedNamedPipe.calculateBufferSize() method. o Fixed bug in SharedNamedPipe that caused it to create a zero-length BufferedInputStream internally when packetSize == 0 (which is common for TDS 7.0 and TDS 8.0 to allow the server to set the packet size). 07/26/2004 - Brian Heineman o Removed extraneous methods from SharedSocket and SharedNamedPipe. 07/25/2004 - David Kilzer o Fixed bug when using instances with named pipes. ConnectJDBC2 constructor was trying to determine the correct serverPort by creating a MSSqlServerInfo object, which is not necessary for named pipes. o Fixed bad message key in ConnectJDBC2.unpackProperties(). Changed "prop.portservertype" to "prop.servertype". 07/25/2004 - Brian Heineman o Applied patch [991684] Implement named pipe IPC for SQL Server 6.5; (Thanks to David Kilzer <ddkilzer@users.sourceforge.net> for the patch) 07/23/2004 - Brian Heineman o Improved ConnectionPoolDataSource exception processing and closed connection handling. o Applied patch [989791] Workaround for null values in properties; (Thanks to Art Gramlich for the original patch) o Corrected documentation for the lastUpdateCount connection property. 07/22/2004 - Brian Heineman o Added lobBuffer parameter to control the memory used by LOB's. o Updated FAQ documentation with new parameter information and TDS protocol support. o Corrected bug in Blob and Clob truncate() methods that caused a NullPointerException to be thrown for disk based LOBs. o Corrected bug in TestBase where InputStreams and Readers were not being closed. o Added test for bug [945462] getResultSet() return null if you use scrollable/updatable 07/21/2004 - Brian Heineman o Added test for bug [994988] Network error when null is returned via int output parm o Corrected bug [994916] datetime decoding in TdsData.java; Added tests to ensure this functionality continues to work in the future. o Added test for bug [983432] Prepared call doesn't work with jTDS 0.8 o Added test for bug [981958] PreparedStatement doesn't work correctly 07/20/2004 - Brian Heineman o Added test for bug [974284] retval on callable statement isn't handled correctly o Added test for bug [994888] Callable statement and Float output parameter 07/19/2004 - Brian Heineman o Applied patch in bug [992971] Decimal testcase fails with sql7 (Thanks to Mike Hutchinson for the patch) o Corrected bug introduced in Clob optimization. o Added test for bug [992715] wasnull() always returns false o Added test for bug [991640] java.sql.Date error and RAISERROR problem 07/17/2004 - Brian Heineman o Applied patch in bug [992971], which corrects bug [992976] Zero length string error on Sybase and MSQL 6.5 (Thanks to Mike Hutchinson for the patch); made a minor change to reduce memory allocation. 07/15/2004 - Brian Heineman o Refactored JtdsDataSource implementation into AbstractDataSource, JtdsDataSource and JtdsConnectionPoolDataSource. o Updated FAQ documentation to reflect current driver and data source class names. o Added test for bug [930305] getGeneratedKeys() does not work with triggers o Added test for bug [974801] stored procedure error in Northwind 07/14/2004 - Brian Heineman o Updated ResultSetMetaData.getColumnType(int) always return Types.BIT for BIT columns. Updated tests to ensure this functionality continues to work in the future. http://sourceforge.net/forum/forum.php?thread_id=1108433&forum_id=129584 o Corrected bug [991033] Data type 0x32 is unknown error with SQL Server 2005; SYBBITN values are now properly formed and are no longer sent as SYBBIT when they are not null. o Corrected bug [991088] Data type 0x3E is unknown error with SQL Server 2005; SYBFLTN values are now properly formed and are no longer sent as SYBFLT8 when they are not null. o Updated documentation to reflect SQL Server 2005 compliance. 07/13/2004 - Brian Heineman o Corrected bug [989963] BigInt becomes Numeric; ResultSetMetaData.getColumnType(int) now returns Types.BIGINT. Added tests to ensure this functionality continues to work in the future. o Added test for bug [989399] bug? blob.getBytes() from 0 o Updated ResultSetMetaData.getColumnType(int) to return Types.BOOLEAN for BIT columns when using a 1.4+ JRE; returns Types.BIT otherwise. Added tests to ensure this functionality continues to work in the future. 07/12/2004 - Brian Heineman o Removed JNetDirect performance results to comply with their licensing. 07/08/2004 - Brian Heineman o Added test for bug [983561] getDatetimeValue truncates fractional milliseconds. 07/07/2004 - Brian Heineman o Added test for bug [974036] Bug in 0.8rc1 DatabaseMetaData method getTableTypes() o Corrected bug [985956] Cannot setObject(null) on image; Added test to ensure this functionality continues to work in the future. o Added test for feature request [956800] setNull(): Not implemented o Corrected bug [919477] Large LOB data causes OutOfMemoryError; Blob/Clob data is now buffered to disk for reads as well as writes if the data exceeds 32KB. o Reduced amount of time Blob/Clob objects are locked due to synchronization. o READTEXT support has been temporarily disabled. This feature will be enabled again once code is in place to control the in-memory buffering via a connection property and WRITETEXT support is added. o Added test for bug [939206] TdsException: can't sent this BigDecimal o Added test for bug [946171] null boolean in CallableStatement bug o Added test for bug [963799] float values change when written to the database o Added test for bug [961594] ResultSet. o Added test for bug [985754] row count is always 0 07/01/2004 - Brian Heineman o Improved Blob and Clob support. Writes done through a Blob or Clob are now buffered in memory if the data size is less than 32KB. If the data size is greater than 32KB, the Blob/Clob will attempt to cache the data to disk. A failed attempt at disk caching due to a SecurityException will be logged and the Blob/Clob data will remain in memory. Also, the READTEXT mechanism will only convert to an in-memory or disk based Blob/Clob if a write attempt is made. o Improved Blob and Clob conversions to/from other data types. 06/29/2004 - Brian Heineman o Corrected bug with cached statements and savepoints. If a statement was cached after a savepoint was set, that statement would not be removed from the cache if the savepoint was rolledback. Added test to ensure this functionality continues to work in the future. 06/23/2004 - Brian Heineman o Applied patch [950028] Jtds enhancement - TDS 5.0 (thanks to code provided by Mike Hutchinson this patch corrects a number of bugs and adds initial support for TDS 8.0 as well). See NEWCODE.TXT for additional information. o Corrected bug with Savepoint id assignment. o Improved performance of data conversions by reducing memory allocations. =============================================================================== 07/08/2004 - jTDS 0.8.1 released =============================================================================== Changes from jTDS 0.8 ===================== 07/08/2004 - Brian Heineman o Corrected bug [983561] getDatetimeValue truncates fractional milliseconds. 07/07/2004 - Brian Heineman o Corrections to compile with the 1.3 JDK; updated Types.BOOLEAN references to Tds.BOOLEAN. 06/27/2004 - Brian Heineman o Corrected bug [974036] Bug in 0.8rc1 DatabaseMetaData method getTableTypes() =============================================================================== 06/22/2004 - jTDS 0.8 released =============================================================================== Changes from jTDS 0.8-rc1 ========================= 06/08/2004 - Brian Heineman o Corrected bug [965018] translateDate is not recognized function name. 05/30/2004 - Brian Heineman o Corrected bug where "Cp" or "MS" was being appended to strings that already started with a different case of the same sequence of characters. o Corrected bug in date time handling (thanks to code provided by Mike Hutchinson). 05/06/2004 - Brian Heineman o Corrected bug [946642] No support for 1.4 java.sql.Types.BOOLEAN. 05/03/2004 - Brian Heineman o Corrected TdsSocket to compile under 1.3. o Added initial (limited) ParameterMetaData support. o Updated DatabaseMetaData.supportsStatementPooling() to return true. 05/02/2004 - Brian Heineman o Updated SQLException handling to set the initCause() method with the initiating exception if the JVM supports it (1.4+). Otherwise, the inital cause of the exception is ignored (JVM's prior to 1.4). 05/01/2004 - Brian Heineman o Consolidated logic for returning data from result sets and callable statements. o Added support for additional data conversions. o Implemented CallableStatement.getBlob(int) o Implemented CallableStatement.getClob(int) o Implemented CallableStatement.getBigDecimal(int) o Implemented CallableStatement.getBigDecimal(int,int) o Implemented CallableStatement.getDate(int) o Implemented CallableStatement.getDate(int,Calendar) o Implemented CallableStatement.getTime(int) o Implemented CallableStatement.getTime(int,Calendar) o Implemented CallableStatement.getTimestamp(int) o Implemented CallableStatement.getTimestamp(int,Calendar) 04/30/2004 - Brian Heineman o Added test for bug [945507] closing statement after selecting a large IMAGE - Exception o Applied second update to patch [934396] better IO error handling; thanks to Fedor Karpelevitch. 04/21/2004 - Brian Heineman o Corrected bug [938632] String index out of bounds error in 0.8rc1; added test to ensure functionality continues to work in the future. o Corrected bug [938494] setObject(i, o, NUMERIC/DECIMAL) cuts off decimal places; added test to ensure functionality continues to work in the future. 04/20/2004 - Brian Heineman o Updated DatabaseMetaData.supportsNamedParameters() to return true. 04/19/2004 - Brian Heineman o Implemented CallableStatement.getMetaData() and PreparedStatement.getMetaData(); both implementations are currently sub-optimal due to the fact they are executing the query to obtain the ResultSetMetaData. o Corrected PreparedStatement caching bug related to changing catalogs. 04/16/2004 - Brian Heineman o Corrected bug [934273] setNull does not set IMAGE type to null; added tests to ensure functionality continues to work in the future. o Corrected NullPointerExceptions thrown from ResultSet.updateBinaryStream(), ResultSet.updateBlob(), ResultSet.updateAsciiStream(), ResultSet.updateCharacterStream() and ResultSet.updateClob() if a null value was passed in. o Improved LOBTest performance; runs in ~1 second now instead of 60+. o Minor optimizations for sending character data. o Improved exception handling throughout the driver to provide the complete stack trace of any nested exception. o Applied part of patch [934396] better IO error handling; thanks to Fedor Karpelevitch. 04/14/2004 - Alin Sinpalean o Applied and improved patch #930076 - Passing parameters to stored procedure by name. Thanks Tommy Sandstrom for the original patch. 04/12/2004 - Brian Heineman o Corrected bug preventing connections to databases with spaces in the name. o Added check to commit() and rollback() to determine if connection is closed to fix bug [931090] ArrayIndexOutOfBoundsException in rollback() o Added test for bug [931090] ArrayIndexOutOfBoundsException in rollback() 04/05/2004 - Brian Heineman o Code clean up - removed unused import statements. 04/04/2004 - Alin Sinpalean o Cleaned up TEXT and IMAGE sending. Now there's only one method for each of them. Also simplified CHAR/VARCHAR and BINARY/VARBINARY sending code. o Added an appendChars method to TdsComm that accepts a char array and a length as parameters. o Moved output logging before the call to TdsSocket.sendNetPacket() to avoid logging zeros (if the method returned a new buffer and buffered the old one). o Created the Tds.handleEndToken() static method to have a unified handling of end token status flags. It's now called for all the end tokens processed. o Modified row count handling in Tds. Now the "valid row count" flag and the operation code flag are checked and only valid update counts not from SELECTs are kept; row counts for DDL statements are always set to 0. Also, update counts are returned for CallableStatements too, as Mike suggested. This seems to be more or less the behavior of the other SQL Server drivers. o CursorResultSet now consumes update counts returned by the sp_cursor stored procedures rather than throwing exceptions. o Updated the TDS documentation with some new information on end token status flags and operation codes. o Updated the unit tests that were failing because of the new way update counts are managed. 04/03/2004 - Brian Heineman o Updated binary data support so that data set via a stream or Blob is not cached entirely in memory before being sent to the server. No more than 1KB of data read from the stream or Blob is buffered in memory at any time. o Updated text data support so that data set via a stream or Clob is not cached entirely in memory before being sent to the server. No more than 1KB of data read from the stream or Clob is buffered in memory at any time. 04/02/2004 - Brian Heineman o Updated Tds.cvtJdbcTypeToNativeType to treat java.sql.Clob as SYBTEXT instead of SYBCHAR. o Added support to TdsUtil for Blob and Clob data types to improve exception reporting. o Cleaned up EncodingHelper in preperation for Clob stream support; removed initialization logic for Microsofts VM (which jTDS is no longer compatible with as it uses Java 2 classes). 04/01/2004 - Alin Sinpalean o Fixed an issue in TdsSocket that was causing queued output not to be flushed when sendNetPacket() was called (i.e. a packet from the middle of the request was sent out first causing SQL Server to close the connection). o Initialized the charset field of TdsDataSource to the empty String (bug #927764). 04/01/2004 - Brian Heineman o Updated ResultSet.updateObject() to work properly with Blob and Clob values. o Corrected ClasCastException when Blob or Clob values were used with cursor result sets. o Updated savepoint SQL to use SAVE TRAN/ROLLBACK TRAN instead of SAVE TRANSACTION/ROLLBACK TRANSACTION. 03/31/2004 - Alin Sinpalean o Added a test for bug #926620 (Too long value for VARCHAR field) and fixed it by adding a test in Tds.executeProcedureInternal(). o Added code to set the maximum length of BINARY/VARBINARY fields in ParameterUtils.createParameterMapping(), because the test added to Tds was causing binary parameters throw exceptions every time. o Reduced the size of the TimestampTest.testNestedStatements0022() and TimestampTest.testNestedStatements0026(), because they were running incredibly slow on my development machine and did not help at all. 03/30/2004 - Alin Sinpalean o Silently updated the JUnit and Ant jars in the 0.8-rc1 source packet. o Moved the Savepoint-related methods from TdsConnection into a new class, TdsConnectionJDBC3. Now new Connections are dynamically created from one of the two classes depending on the Java specification version of the JVM. o Added some more old date tests, still haven't been able to reproduce anything on my machine. o Added patch #926168 (add some meta-info to jar manifest) submitted by Fedor Karpelevitch. o Updated the connection.properties template to include the user property. 03/28/2004 - Brian Heineman o Implemented Savepoint support. o Updated DatabaseMetaData.supportsSavepoints() to return true. o Implemented DatabaseMetaData.supportsMultipleOpenResults(); returns true. o Implemented DatabaseMetaData.supportsNamedParameters(); currently returns false. o Implemented DatabaseMetaData.supportsStatementPooling(); currently returns false. 03/27/2004 - Brian Heineman o Added test to demonstrate bug [924030] EscapeProcesser problem with "{}" brackets =============================================================================== 03/30/2004 - jTDS 0.8-rc1 released =============================================================================== Changes from jTDS 0.7.1 ======================= 03/29/2004 - Alin Sinpalean o jTDS is now licensed under the LGPL. This means that noone will be able to sell jTDS or any derivatives and that any modifications to it must be made public. This decision has been discussed and approved in the jTDS developer forum. o Updated the documentation and README to reflect the license change. o Changed the "Project Home" link to "Project Info" to avoid confusion and reordered the links, placing the local ones first. 03/28/2004 - Alin Sinpalean o Compiled (a lot of) new documentation. o Modified property names in TdsDefinitions and TdsDataSource to match the documentation. 03/27/2004 - Brian Heineman o Corrected parsing bug in EscapeProcessor that occured when "{" or "}" were found in a quoted string. 03/26/2004 - Alin Sinpalean o Fixed the fix for bug #922802. ;o) There was a NPE thrown if the batch was empty at its first execution. o Added a test for bug #582464 (which, although closed, was signalled again with a different date - 06/15/1940 0:00:00). Turns out I couldn't reproduce it. 03/26/2004 - Brian Heineman o Added ResultSet.getObject() support for IMAGE, TEXT and NTEXT fields to return Blob and Clob objects. Added tests for new functionality. o Added Blob and Clob support to ResultSetMetaData.getColumnClassName(). o Corrected bug [887508] getObject returns Integer-Object on Types.Smallint; added test to ensure functionality continues to work in the future. 03/25/2004 - Alin Sinpalean o Fixed bug #922802 (TdsStatement.executeBatch() throws exception if no statements added). Indeed other drivers work just fine with empty batches and the spec doesn't mention anything about throwing an exception if no batch was added. 03/24/2004 - Alin Sinpalean o Applied Mike's "Streamlined stored proc processing" patch (#916084). Seems like all I'm doing lately is answering forum questions and applying Mike's great patches. ;o) 03/21/2004 - Alin Sinpalean o Applied Mike's SqlMessage patch to generate SQL state values based on native error codes, changed the implementation (from sorted array to HashMap) and added a lot of new mappings. 03/20/2004 - Brian Heineman o Corrected bug [919594] Clob support; added setObject support for both java.sql.Blob and java.sql.Clob. Added initial Blob and Clob functional tests. o Corrected SQLException in getBytes() due to invalid length calculation. 03/14/2004 - Alin Sinpalean o Applied Mike's version 4 of the single connection patch fixing a number of issues (see patch #912364 for the exact description). o Updated the home page with a lot of new stuff and added it to the CVS repository. 03/13/2004 - Alin Sinpalean o Applied a patch by jarek_woloszyn fixing the behavior of lastUpdateCount when set. o Fixed yet another bug (#914069) which prevented cursor-based ResultSets from working with PreparedStatements (an update count was returned, which caused an exception to be thrown). Updated SAfeTest to test this. o Fixed and simplified current row and total row count handling in CursorResultSet. 03/08/2004 - Alin Sinpalean o Split up table name from TDS_TABNAME packet into catalog, schema and table, if fully qualified. o Hidden columns (those for which the hidden flag is set in the TDS_COLINFO packet) modify the fake column count; they are (hopefully always) the last ones in the ResultSet. o Updated the details of the TDS_TABNAME and TDS_COLINFO packets in the TDS documentation. 03/07/2004 - Alin Sinpalean o The main Tds instance is now always created even if no cursor ResultSets are used, as it simplifies the internals of TdsConnection and doesn't create an additional physical connection anymore. o Moved connection initialization from Tds to TdsConnection. o Moved the EncodingHelper instance from Tds to TdsConnection. o Removed the 'host' URL parameter as it was only duplicating 'serverName'. o Replaced direct access to Tds instance 0 with synchronized access to the main Tds instance (which now always exists) for database change, commit, rollback or settings change. In the previous implementation access was not synchronized and could interfere with (or completely consume the output of) some Statement. o Moved handling of current database and charset to TdsConnection and handling of buffer size to TdsSocket (via TdsComm) from Tds. 03/06/2004 - Alin Sinpalean o Applied Mike's single connection patch. It's the first time I see jTDS passing ALL the tests. Thanks a million, Mike! :o) o Fixed an issue that rendered the 'macAddress' parameter unusable. o Reformatted TdsComm and cleaned up a bit the javadoc. 03/04/2004 - Brian Heineman o Corrected Blob and Clob methods to be 1 based not 0 based per the JDBC specification. o Numerous minor performance enhancements that reduce memory allocations, assignments and cost of control logic. 03/03/2004 - Brian Heineman o Corrected bug [909169] jTDS 0.7: introduced another bug (Stored Procedure); added test to ensure functionality continues to work in the future. o Updated CallableStatements to parse SQL according to ANSI specifications. =============================================================================== 03/03/2004 - jTDS 0.7.1 released =============================================================================== Changes from jTDS 0.7 ===================== 03/03/2004 - Alin Sinpalean o Added the 'macAddress' URL parameter allowing the user to specify the MAC address of the network interface card. There's no way to determine this from Java code and it can cause problems with licensing limitations. o Fixed an issue affecting SQL Server 6.5 related to binary data. Binary values were defined as 'binary(8000)' while the maximum length for 6.5 is 255. (thank you, Mike) o Fixed bug [907431] (Statement does not return auto-generated keys). In fact, the actual issue was that if a execute was not called with RETURN_GENERATED_KEYS specified and then getGeneratedKeys() was called, an uninitialized ResultSet was returned instead of throwing an exception. o Finally added the API server cursor (sp_cursor procedures) documentation and the test results (excluding JSQLConnect, whose license prohibits this). 02/27/2004 - Alin Sinpalean o Fixed the implementation of cursor-based ResultSets obtained from prepared and callable statements with parameters. Initially I wrote no tests and I just supposed it will work. Well, I was wrong. o Wrote a test for the newly implemented functionality and it finally seems to work. =============================================================================== 02/26/2004 - jTDS 0.7 released =============================================================================== Changes from jTDS 0.6 ===================== 02/26/2004 - Alin Sinpalean o Applied part of a patch from Christian Ullenboom, with various small optimizations. 02/24/2004 - Alin Sinpalean o Applied Mike's changes as a result of testing the cursor-based ResultSets with SQL Server 6.5. o Introduced a serverVer field into TdsConnection to be able to check the DB version when using certain features (in particular SCOPE_IDENTITY as opposed to @@IDENTITY - the first is only available in SQL Server 2000). o Modified PerformanceTest to create (and drop) its own test table. o Added handling for BINARY data in ParameterUtils (for some reason, it wasn't treated the same way as VARBINARY and an exception was thrown). o Fixed PreparedStatement_base.setByte (it was setting the parameter type to SMALLINT instead of TINYINT, which lead to problems with negative values). o Added to the CVS tree a build file customized for JDK 1.3. 02/22/2004 - Brian Heineman o Removed usage of NEWID() for Sybase which does not exist in the 11.x versions; logic was replaced with VM generated unique id. This implementation should perform much faster since no remote calls are required. 02/20/2004 - Brian Heineman o Implemented ResultSet.getDate(int,Calendar) o Implemented ResultSet.getTime(int,Calendar) o Implemented ResultSet.getTimestamp(int,Calendar) o Implemented CallableStatement.setDate(int,Date,Calendar) o Implemented CallableStatement.setTime(int,Time,Calendar) o Implemented CallableStatement.setTimestamp(int,Timestamp,Calendar) o Implemented PreparedStatement.setDate(int,Date,Calendar) o Implemented PreparedStatement.setTime(int,Time,Calendar) o Implemented PreparedStatement.setTimestamp(int,Timestamp,Calendar) 02/19/2004 - Alin Sinpalean o Implemented support for scrollable/updateable ResultSets from prepared/ callable statements. o Implemented a fallback to FORWARD_ONLY ResultSets if cursor creation fails. o Fixed handling of TDS_COLINFO packets (these can contain the actual column name if the SELECT statement contained aliases; the alias/label is returned in the TDS_COLMETADATA packet). o Updated AbstractResultSet to handle requests for columns both by label and name (until now they were the same). o Improved the implementation of generated keys retrieval. o TdsStatement.getMoreResults() no longer returns update counts from end of ResultSets and end of process tokens. o Added a list of cursors-based ResultSets to TdsStatement and the code needed to maintain this list and close them when the Statement closes. This is not really enough, they should be closed on the next execute or close, but we'll see to that some other time. o Made ParameterUtils.verifyThatParametersAreSet() private and had it called from createParameterMapping, as they always appeared together in this order. 02/18/2004 - Alin Sinpalean o Made PacketRowResult.setElementAt much more flexible. It now converts the provided Objects into an acceptable internal type, to support the ResultSet.updateXXX methods (i.e. if the updated object is different than the one used internally by jTDS to represent that particular type, it is first converted into an acceptable type). getElementAt was also partially rewritten to support all these types, not only the fixed ones coming from the Tds. o Fixed a bug in CursorResultSet, which would cause an exception when updating ResultSets with read-only columns. o Improved handling of BINARY/VARBINARY data. o Added a test for out-of-order closes (particularly closing the Connection before the Statement, which caused an ArrayIndexOutOfBoundsException). 02/18/2004 - Brian Heineman o Corrected CallableStatement parsing of stored procedure names containing spaces. 02/17/2004 - Alin Sinpalean o Seems like yesterday I didn't commit part of the files. So here they are. o Fixed the ArrayIndexOutOfBoundsException thrown by TdsConnection.freeTds bug. o Updated the README and added a features.html file containing the feature matrix of jTDS. 02/17/2004 - Brian Heineman o Reduced memory allocated for Callable and Prepared statements by removing unused instance variable created for each SQL parameter. 02/16/2004 - Alin Sinpalean o Implemented updateRow and insertRow in CursorResultSet. Updateable ResultSets are now fully supported. o Updated DatabaseMetaData to reflect the newly added functionality. o Optimized the methods wrapping the sp_cursor calls. o Fixed an issue in TdsStatement where exceptions would get lost when the next result was a ResultSet or there were no more results (the warning chain was only checked in getMoreResults if the next result was an update count). o Small optimization in AbstractResultSet. o Added a simple test for inserting a row in a ResultSet. 02/15/2004 - Brian Heineman o Corrected bug in CallableStatement parsing where [ and " would cause the procedure name to be parsed incorrectly. 02/13/2004 - Brian Heineman o Minor cleanup of CallableStatement and refactoring of PreparedStatement procedure logic. o Removed extraneous UniqueId class, the logic is now handled in Procedure. o Improved performance of CallableStatement and PreparedStatement ~14% by reducing the number of times SQL is parsed. Degraded performance of plain statements using escape processing and the Connection.nativeSQL call by ~6%; for now, the consolidation of parsing logic outweighs the minor degradation. 02/12/2004 - Alin Sinpalean o Fixed a nasty regression introduced by the new DECIMAL/NUMERIC code (null BigDecimals would cause an invalid packet, with scale -1). o Moved the driver class to the connection.properties file, instead of having it hardcoded in TestBase. o Updated a number of tests and added a test for updating a ResultSet (of course, it doesn't pass yet). o Added all the constants defined in the 1.4 Statement to TdsStatement, to make it compile with 1.3. 02/11/2004 - Alin Sinpalean o Implemented CursorResultSet.deleteRow() and wrote a unit test for it. o Added processing for TDS_TABNAME and TDS_COLINFO packets. Table names are now correctly set for SELECTs when the FOR BROWSE clause is specified and for the sp_cursoropen stored procedure. o Found a bug in CallableStatement_base (executeUpdate and executeQuery were in fact executed by PreparedStatement_base and return values/output parameters did not function). Fixed it and extended unit tests to include executeQuery (they only tested execute, before). o Fixed a bug pointed out by Mike Hutchinson in the developer forum (@@MAX_PRECISION does not exist on Sybase). o Corrected some uses of TdsComm.getByte() and getString() in Tds. o Detailed cursor-based ResultSet tests and fixed a number of bugs that were detected while running these tests. o Cursor creation method now sets the cursor type and concurrency options to match the values returned by sp_cursoropen in addition to adding a warning to the chain. o Wrote a test for bug [815348] - CallableStatement truncates varchar to 255. Test ran ok, bug closed. o Added a finally clause to PreparedStatement_base execute, executeQuery and executeUpdate that calls releaseTds. This is useful if an exception occurs while running the methods, but also if the execution only returns an update count (in which case, the result is completely processed and the Tds can be released). 02/11/2004 - Brian Heineman o Updated DatabaseMetaData.supportsBatchUpdates() to return true. 02/10/2004 - Alin Sinpalean o Applied Mike Hutchinson's patch to Tds and TdsComm, replacing CancelController with a boolean flag and fixing some other issues (see developer forum). o Removed unused local variables, made some local variables and class members final in Tds, cleaned up code. o Fixed a subtle bug in TdsConnection.allocateTds() (thanks Mike Hutchinson for pointing it out. o CursorResultSet.relative() now works according to the spec (i.e. same as next/previous), even if the cursor is positioned before the first row or after the last one. 02/10/2004 - Brian Heineman o Corrected bug in Statement.executeBatch() where batch values were not being cleared after execution. o Numerous (minor) optimizations to underlying Tds communication logic: reduced memory allocations and assignments; reduced cost of control logic. 02/09/2004 - Alin Sinpalean o Implemented CursorResultSet.isLast() and added a check to currentRow() to see if there is actually a current row (otherwise a NPE was thrown). o Updated SanityTest and UpdateTest to test the new features implemented in CursorResultSet. 02/09/2004 - Brian Heineman o Implemented ResultSet.updateAsciiStream(). o Implemented ResultSet.updateBinaryStream(). o Implemented ResultSet.updateBlob(). o Implemented ResultSet.updateCharacterStream(). o Implemented ResultSet.updateClob(). o Implemented initial batch support PreparedStatement.addBatch(), Statement.addBatch(String), Statement.clearBatch() and Statement.executeBatch(); the current implementation provides the proper behavior but does not actually send batches of statements to the server (yet). o Corrected RETURN_GENERATED_KEYS usage to compile under 1.3. 02/08/2004 - Brian Heineman o Improved parsing of callable statements to be case-insensitive, allow whitespace between '?=' and support calls of stored procedures when no "exec" is specified. o Updated DatabaseMetaData.supportsGetGeneratedKeys() to return true. o Implemented DatabaseMetaData.supportsSavepoints(). 02/07/2004 - Brian Heineman o Moved TdsStatement.releaseTds() calls into try {} finally {} statements to ensure connections are released back into internal pool even if an exception is thrown. 02/06/2004 - Brian Heineman o Applied patch [884180] Implement getGeneratedKeys() (thanks to Mike Hutchinson for the patch) o Corrected Blob and Clob threading issues that could have occured when streams were flushed. 02/05/2004 - Alin Sinpalean o Added the "lastUpdateCount" parameter to the URL and DataSource properties. If set to true, only the last update count is returned by executeUpdate(), as to avoid update counts returned by triggers being mistaken for the actual update count for PreparedStatements. o Reformatted code in Tds.java, CallableStatement_base.java. o Fixed an issue with update count handling when lastUpdateCount was false. o Fixed bug [729370], caused by BigDecimals with the scale greater than their precision (which is technically possible, but not supported by SQL Server). o Fixed some issues with Long and BigDecimal precision and scale handling, including using the correct precision for DECIMAL/NUMERIC fields, as supported by the server (either 28 or 38 decimals). o Added the "charset" parameter to the DataSource (it worked before, but only with the Driver, in the URL or Properties). o Removed redundant call to ParameterUtils.createParameterMapping() in Procedure. o Fixed a possible string length limitation issue for cursor result sets creation. o Fixed an issue that caused CallableStatement_base.registerOutParameter() to reset any value previously set for the parameter. o CallableStatement.execute now calls ParameterUtils.createParameterMapping() to correctly map parameters to native types. This fixes bug [815348 - CallableStatement truncates varchar to 255] caused by the parameter being sent as a "short" VARCHAR (length up to 255) instead of long (length up to 8000 for VARCHAR and 4000 for NVARCHAR). 02/02/2004 - Brian Heineman o Synchronized Blob and Clob methods for thread safety. o Changed IllegalArgumentExceptions that were being thrown in BlobImpl and ClobImpl to SQLExceptions per JDBC specification recommendations. o Removed extranous DriverVersion class which was only being used to hold two variables. o Added Driver.toString() method that returns the current version per enhancement request [887120] DriverVersion.getDriverVersion(). o TdsDataSource now implements ConnectionPoolDataSource. 01/31/2004 - Brian Heineman o Implemented Driver.getPropertyInfo(). 01/30/2004 - Alin Sinpalean o Completely reimplemented CursorResultSet, to use the sp_cursor stored procedures instead of standard SQL cursors. This should fix a number of issues regarding scrollable result sets. o Cleaned up a lot packet processing. Tds does now all the low-level packet handling, with TdsResultSet no longer directly using packets. 01/30/2004 - Brian Heineman o Improved performance of Driver URL parsing by ~40%. URL's are now case-insensitive and provide better validation of the expected format. o Reduced Driver memory footprint. o Corrected bug in {fn concat()} translation; Sun javadoc shows double quotes but single quotes are expected. o Updated Sybase stored procedure name generation to "jTDS" + last 26 characters of NEWID() [without the dashes]. This should solve the problem referred to in bug [822544] Issue connecting using alias on Sybase 11.9.2, jTDS 0.5.1. o Minor optimization for SQL Server stored procedure name generation. o Removed obsolete Sybase stored procedure generation code that was replaced with another solution. o Slight performance improvement when setting intial database state; reduced memory allocations. o "SET QUOTED_IDENTIFIER ON" and "SET TEXTSIZE 2147483647" is now explicitly sent to SQL Server per Microsofts recommendations: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odbcsql/od_6_015_0tf7.asp 01/29/2004 - Brian Heineman o Corrected bug where {fn concat(column1, column2)} would throw a SQLException. o Minor correction to translateTimestamp() where prefix assumed to be "d " instead of "ts ". o Improved escape sequence translation performance ~11% by reducing memory allocations and comparisions. o Removed translation and validation of {escape ''}; no need for the processor to do this as the database must check it anyhow. o Significant optimization to SQL parsing; new implementation is more than 10x faster. o Applied patch [851982] Client name not set in send70Login(). (thanks to mhilpert for the fix) This also fixed the following issues: [708727] hostname not set [886897] jTDS 0.6: Hostname still not set o Added missing "exec" per bug [822544] Issue connecting using alias on Sybase 11.9.2, jTDS 0.5.1 o Set instance variables to empty strings per bug [886449] TdsDataSource default null values cause issues. 01/28/2004 - Brian Heineman o Implemented mutator methods for BlobImpl and ClobImpl. Changes to LOBs will not be reflected in the database until the LOB reference is passed as a parameter to setBlob() or setClob(). o Implemented getDatabaseMajorVersion(). o Implemented getDatabaseMinorVersion(). o Updated getJDBCMinorVersion() to return 1 instead of 0. 01/27/2004 - Brian Heineman o Added CONCAT to list of return values from DatabaseMetaData.getStringFunctions(). o Implemented DatabaseMetaData.getJDBCMajorVersion(). o Implemented DatabaseMetaData.getJDBCMinorVersion(). o Implemented DatabaseMetaData.locatorsUpdateCopy(). o Implemented DatabaseMetaData.supportsGetGeneratedKeys(). o Corrected bug where {escape '''} was causing parameters to be calulcated incorrectly (this specific escape value is now invalid and an exception is thrown). o Improved parsing of {? = call} in EscapeProcessor to support whitespace around the '=' and to be case-insensitive. o Implemented {fn CONCAT()} o Improved SQL parsing performance when translating JDBC escape sequences. o Improved escape sequence error messages. =============================================================================== 01/25/2004 - jTDS 0.6 released =============================================================================== Changes from jTDS 0.6-rc1 ========================= 01/22/2004 - Alin Sinpalean o Modified again the DatabaseMetaData. Instead of just applying the patch provided by Mike I chose to do it my way, which was REALLY bad, so it finally ended up as it was initially. 01/21/2004 - Alin Sinpalean o Applied patch #880905 (EscapeProcessor does not handle {escape 'x'} properly) submitted by Brian Heineman, with some minor modifications. 01/20/2004 - Alin Sinpalean o Added the "sendStringParametersAsUnicode" parameter, to control whether NVARCHAR/NCHAR should be used when possible. If false, VARCHAR/CHAR are always used to prevent performance degradation under SQL Server 2000. (thanks to Wellington Mariusso for the original patch) o Implemented basic Blob/Clob support. (thanks to Brian Heineman for the patch) o Implemented PreparedStatement.SetAsciiStream and SetUnicodeStream. (again thanks to Brian Heineman for the patch) o Fixed two bugs with DatabaseMetaData on Sybase and SQL Server < 7.0 (thanks Mike Hutchinson for the patch) o Added a method to the Driver implementation to "uppercase" the Properties keys before passing them to inner classes for use. 01/16/2003 - Alin Sinpalean o Applied some patches and fixed some minor bugs. =============================================================================== 12/21/2003 - jTDS 0.6-rc1 released =============================================================================== Changes from jTDS 0.5.2 ======================= 12/21/2003 - Alin Sinpalean o Updated version to 0.6-rc1. o Even more code cleanup: moved result set context handling from TdsResultSet to Tds, which allowed the removal of the statements list (allStatements) in TdsConnection; also replaced all calls to Statement.skipToEnd with calls to Tds.skipToEnd, which is much more effective; database changes, transaction isolation level changes, auto commit mode changes, commits and rollbacks are now run directly on the Tds instance (and on all Tds instances) and TdsResultSet and TdsStatement now always check Tds.moreResults() before any processing to make sure the state was not changed from the outside (i.e. the output was not consumed by TdsConnection executing something). o Included a patch by Mike Hutchinson that completely fixes all issues regarding prepared Statements and fixed parameter types (i.e. executing a PreparedStatement initially with a shorter parameter submits a temporary stored procedure with a short type - e.g. VARCHAR - and a subsequent execution is limited by this type, cutting the parameter's length to its maximum value. The fix only matches temporary procedures by both the SQL string and the parameter types that can best accomodate the actual values. o Included a few small patches, regarding ResultSet.getString on BIT columns (it returned "true"/"false", now it returns "1"/"0"), some misunderstanding in Procedure, which treated backslash as an escape character and a possible issue with TEXT values being cut down to 4k (although not proved, and hard to believe). o Bugs fixed: 837235 (Working with SQuirreL SQL Client - 90% sure), 748856 (jTDS Security error in sandbox), 741637 (Deadlock), 734505 (ArrayIndexOutOfBounds in TdsResultSet.internalFetchRows), 692142 (jTDS autocommits data sometimes - 90% sure), 684567 (Problem with image fields in PreparedStatements), 803570 (java.sql.SQLException: Network error- Field too long). 12/16/2003 - Alin Sinpalean o A lot of code cleanup. 12/11/2003 - Alin Sinpalean o Fixed bug #694541 (ResultSet getDate & getTimestamp). Dates and Times are now normalized (by resetting the hour/minute/second/ms, respectively the day/month/year part). o Also fixed a bug with dates prior to January 1, 1970 (they would get all messed up because of negative values in the calculation). o Added some more flexibility to recognizing character sets (simply by prepending "Cp" respectively "MS", in case the returned character set is only a number). o Started refactoring, by moving the current Context from the ResultSet to the Tds. This way the Tds can skip to the end of the stream without any outside help. This will hopefully also help further refactoring. =============================================================================== 11/29/2003 - jTDS 0.5.2 released =============================================================================== Changes from jTDS 0.5.1 ======================= 11/27/2003 - Alin Sinpalean o Fixed bug #808452 (DatabaseMetaData.getTypeInfo() not JDBC compliant). Also added the @ODBCVer parameter to the other calls that support it. o Moved the "moreResults2 = true" statement to the end of Tds.executeProcedure to avoid the situation when an exception is thrown while building the PROC packet and the close code deadlocks in skipToEnd waiting for results when in fact there aren't any (this situation shouldn't really occur in normal situations, it happened to me because of a mistake I made in CallableStatement_base, which failed to set the type of a parameter). 11/26/2003 - Alin Sinpalean o Added support for CallableStatements with return values. o APPNAME and PROGNAME properties didn't actually work; issue fixed. 11/22/2003 - Alin Sinpalean o Cleaned up some of Matt's code (e.g. replaced calls to methods that were only introduced in Java 1.4 with equivalents to ensure backward compatibility). o Fixed an issue with the case sensitive database names (when changing the database jTDS checks if the old database is the same as what the server has returned and the check was case sensitive). o Removed some weird type checking and matching in TdsResultSetMetaData .getColumnType, which would define NCHAR, NVARCHAR and NTEXT as Types.OTHER rather than the correct Java type (this was causing problems with SQuirreL SQL when the column type of a ResultSet was checked -- particularly when browsing stored procedures and their parameters). o Removed the "synchronized" qualifier from TdsStatement.executeQuery, because it was causing deadlocks between threads creating scrollable result sets and threads closing other scrollable result sets (see unit test TimestampTest .testNestedStatements0026). 11/20/2003 - Matt Brinkley o Added support for Windows authentication for TDS 7.0. 10/02/2003 - Matt Brinkley o Fixed issue related to using catalogs with special characters in name in DatabaseMetaData. 08/30/2003 - Matt Brinkley o Added support for SQL Server 2000 named instances. o Fixed a small bug related to the ordering of the SQLExceptions thrown by TdsConnection.close(). 02/15/2003 - Alin Sinpalean o Fixed bug #679040: database-specified charset preferred over client- specified. o Fixed bug #679041: (possible) charset problems with platform default encoding. Not so sure if all Strings read from the server should be converted using the EncodingHelper, but that's how it works now. o Also removed some checks and prints to System.out in Tds following warnings received (initially this was done because getWarnings was not implemented). =============================================================================== 01/30/2003 - jTDS 0.5.1 released =============================================================================== Changes from jTDS 0.5 ===================== 01/30/2003 - Alin Sinpalean o Hope I fixed the "Tds 0 already allocated" issue (for Tds other than 0 it seems to be a different issue, that has already been solved, but I have to check to make sure). The problem appeared when an exception was thrown while executing a scrollable statement or scrolling through it: Tds 0 was first allocated, but it wasn't freed because the exception would interrupt the normal flow. Moved the Tds freeing into a finally block and seems to work just fine, now. 01/29/2003 - Alin Sinpalean o Fixed CSUnitTest (had a problem because of the MONEY/SMALLMONEY precision issue) and modified build.xml (have no idea why it wouldn't work anymore, some problem with classpaths, had to execute the tests in the same JVM). Removed jakarta-ant-1.3-optional.jar and parser.jar, because they were not needed (jakarta-ant-1.4-optional.jar and crimson.jar contain just the same). 01/27/2003 - Alin Sinpalean o Fixed bug #664507: DatabaseMetaData.getIndexInfo() called sp_statistics with 5 parameters instead of 6 (@index_name was missing). Thanks to Simon Kelly (simonkelly) for submitting the bug and the solution. o Fixed bug #644391: When using PreparedStatement.setObject(Timestamp), the date in database in off by a little more than a second, because the nanos are disregarded (the Timestamp is treated as Date). 01/20/2003 - Alin Sinpalean o jTDS feels completely strange after such a long while. I honestly hope the time will come when I'll be able to go back to real development... :( o Fixed bug #662295: Tds.writeDateTimeValue() adds nanoseconds twice under JDK 1.4.1. The Timestamp.getTime() method adds in the nanos, then writeDateTimeValue() adds them again (line 3232) (Patrick Johnson - pjohnson73). Also some rounding problems when transforming from milliseconds to jiffies. The fix checks if the value returned by getTime() is an integral number of seconds and only in this case adds the nanoseconds (otherwise they were already added by getTime()). For the rounding problem .33 milliseconds are added to the value before converting it to jiffies. Seems to work fine. o Fixed a problem with MONEY and SMALLMONEY datatypes where the third and fourth decimals were intentionally dropped (no idea why). 12/18/2002 - Alin Sinpalean o Long time, no jTDS! Hope I'll have some more time to look after jTDS now that I found a new job... o Fixed bug #653510: the value returned by DatabaseMetaData.getUserName() was different from what the Microsoft driver returned (jTDS was returning "dbo" while the Microsoft driver was returning "sa"). Thanks to Jim McBeath for finding this out and providing a solution. =============================================================================== 11/11/2002 - jTDS 0.5 released =============================================================================== Changes from jTDS 0.4 ===================== 11/11/2002 - Alin Sinpalean o Fixed bug #636110: the warning chain of a result set was instantiated only at the end of the TdsResultSet constructor, but a warnig could have been added during the call to startResultSet() (also in the constructor) so a NullPointerException was thrown if a warning was encountered during loading a warning chain (e.g. if the result set contained no rows but it was returning a warning). 11/07/2002 - Alin Sinpalean o Temporarily fixed bug #632852: There appears to be an error in handling long (>4000/8000 bytes) data items. This occurs where a subsequent attempt to update data, using the same SQL statement, fails when executed via a different PreparedStatement. This situation will occur most often when the database connection is pooled for reuse for example in a web application. The cause of the error is that, when the second SQL statement matches a cached stored procedure, the data types of the parameters are not re-evaluated. This causes the code in TDS.executeProcedure() to pass a long String parameter as a VARCHAR parameter rather than a NTEXT causing the statement to fail on the SQL Server with the message "Error converting data type text to ntext". Thanks go to Mike Hutchinson, for locating and fixing the problem. A final solution, however would imply matching both the statement and the parameter types when searching for a compatible procedure. 11/01/2002 - Alin Sinpalean o Seems like SQL Server 6.5 does not support the extended Transact-SQL syntax for cursor declaration (at least not everything that's documented for SQL Server 7.0). So I make a choice based on the TDS version and use the extended syntax for 7.0+ and the SQL-92 syntax for older versions (and Sybase). I guess it's ok this way. :o) 10/29/2002 - Alin Sinpalean o Fixed CursorResultSet.next(): position was not incremented/decremented (probably since my last update). Anyway, correct position reporting will not work correctly in all cases until the sp_cursorXXX procedures are used instead of the current CREATE CURSOR/FETCH NEXT/FETCH PREVIOUS statements. 10/26/2002 - Alin Sinpalean o Fixed bug #629022 (also signaled in a post in the jTDS Help forum): DatabaseMetaData.getColumns() did not work if null was supplied as schema or table name. This was because a query was used to retrieve this information. Now sp_columns is used. This brings up another tiny issue: type numbers are wrong (e.g. -9 for NVARCHAR; it should be -1111 == unknown) but I guess it's not that bad. 10/23/2002 - Alin Sinpalean o Tiny change in CallableStatement_base constructor where the procedure name was parsed: periods were not considered to be part of a procedure name, so if a procedure name also containing catalog and/or schema was provided, only the first part of the name (up until the first period) was considered to be the procedure name. This meant that the schema or catalog was used as procedure name. 10/22/2002 - Alin Sinpalean o Implemented correctly the DatabaseMetaData methods getNumericFunctions, getStringFunctions and getSystemFunctions and added the corresponding code to EscapeProcessor (to convert the standard function names to SQL Server- specific function names -- I sure hope it works with Sybase, too as I have no way of testing this). o Implemented TdsStatement methods get/setFetchSize and get/setFetchDirection. 10/21/2002 - Alin Sinpalean o Fix in Tds.executeProcedure() if a Boolean was supplied as value for a parameter of type CHAR/VARCHAR, it crashed with a type cast exception. This should be checked when selecting the procedure, anyway (i.e. also check that the parameter types are compatible in addition to the generator string). o Fix in EscapeProcessor: for one reason or another backslash was treated as an escape sequence even inside the 'escape' string (e.g. "{escape '\'}" was incorrect because the backslash was considered an escape character). o Implementede DatabaseMetaData.getUDTs(). It now returns a hand-made empty result set; inspired from the MS driver's docs. :o) o Slight misunderstanding in TimestampTest.testGetBoolean0025(): not sure which VARCHAR/CHAR values are true and which are false with getBoolean(). Have to take a look at this. 10/18/2002 - Alin Sinpalean o Bugfix in PacketResultSet.getLong(): CHAR values were not trimmed before being parsed. o Bugfix in Tds.writeDecimalValue(): if an Object which was not a subclass of Number was supplied (particularly a Boolean) writeDecimalValue crashed. o Bugfix in EscapeProcessor: escapes (all of them) were only recognized in lower case; also outer join escapes were parsed incorrectly (the last letter was cut off). o Bugfix in PreparedStatement_base: procedures were first added to the tds procedure cache and the proceduresOfTra collection and only then submitted to the DB server, which meant that if the submission failed further attempts to use the same (form of) statement would fail with 'procedure not found' which was a bit confusing. o Bugfix in PacketRowResult.getBoolean(): CHAR/VARCHAR/TEXT values were not correctly converted to boolean values. I'm not sure it's correct now either, but it works with the JDBCCTS. :o) Currently anything different from "0" is considered true. 10/17/2002 - Alin Sinpalean o Oooops! There were a lot of problems with my implementation from yesterday. It took me quite a lot of time to figure out where all those problems came from, but I finally managed to get to a state in which it seems to work. I even created a good test for it. 10/16/2002 - Alin Sinpalean o I think I fixed the 'cursor not found' issue with cursor result sets. Still need some testing to make sure it works fine, but it looks quite good. ;o) =============================================================================== 10/14/2002 - jTDS 0.4 released =============================================================================== Changes from jTDS 0.3.2 ======================= 10/14/2002 - Alin Sinpalean o Finally renamed packages from com.internetcds.jdbc to net.sourceforge.jtds. This calls for a new release of jTDS, as I promised. A lot of cosmetic changes took place at the same time, it's really hard to make a list of them. Currently there are 5 subpackages of net.sourceforge.jtds: jdbc (the former tds package, where most of the implementation is), jdbcx (with the TdsDataSource implementation), util (containing the Logger), test (with all the JUnit tests) and tools (containing some TDS reverse engineering tools). Hopefully the new structure will also help in getting more organized. The old sources are still available in the repository with all their history, under the src.old directory. o Bugfix (bug #621842, submitted and fixed by Anton Decusar and Andrei Chafirine): encoding Cp1251 is not recognized by jTDS because it is returned by SQL Server as 'cp1251' (with 'c' instead of 'C'). 10/02/2002 - Alin Sinpalean o Bugfix (bug #617501): URLs of the form "jdbc:freetds:sqlserver://<server>:<port>" not recognized by jTDS. This is because database name was required initially and when I made it optional I did not check the way URLs were parsed. I think all URL forms are accepted now. 09/26/2002 - Alin Sinpalean o Long time, no work! :o) o Implemented PreparesStatement_base.setTime() and optimized a bit Tds handling of Time, Date and Timestamp objects in writeDateTimeValue(). Tried to make something out from bug #614698, but it looks like it's only a misunderstanding of the java.sql.Date type semantics. I'll close it. 09/20/2002 - Alin Sinpalean o Bugfix in CursorResultSet: next() always returned true for the first time, even if there was no data in the ResultSet. Seems to have been there for a long, long time. I added the beforeFirst() implementation but still didn't see it (not to mention that the implementation was broken from the very start because of the first row being prefetched). So, the first row is no longer prefetched, there's a "FETCH PRIOR" call that doesn't do anything but initializing the context. Thanks to wolfgang_a_h@gmx.at for finding the bug. (bug submitted later as #613199) o Bugfix #598679 (TdsConnection.getTypeMap not implemented): just looked at the javadoc comment for the method and it says that it should return an empty Map unless the application has added an entry. So, as the application can't add an entry (setTypeMap throws an SQLException as well :o) ) we'll just return an empty Map each time. :o))) =============================================================================== 09/20/2002 - jTDS 0.3.2 released =============================================================================== Changes from jTDS 0.3.1 ======================= 09/20/2002 - Alin Sinpalean o Bugfix in Tds: when the autocommit flag was set on a Tds, the transaction was automatically committed by Tds.changeSettings(). I think I was the brilliant mind that did that (because I had no idea about what I was doing at the time), but it was completely wrong. Removed. o TdsComm.startPacket throws an exception if there is still data left in the input buffer. The problem is that the data is never consumed, so that Tds is never closed. Temporary fix: dump the buffer contents. Will have to come up with something better. o TdsConnection.setCatalog() was synchronized on the statement while executing the query. The problem was that the statement might have been null. Fix: synchronization is made on the tds (again) if the Statement is null. o Implemented TdsResultSetMetaData.getColumnClassName(). Also much easier than feared. :o) 09/19/2002 - Alin Sinpalean o Created a goToNextResult() method in Tds, that eats up all input until the next relevant result (for a Statement or CallableStatement only ResultSets and TDS_DONE packets, for PreparedStatements also TDS_DONEINPROC packets) that is called in all the places where the processing of a result has just finished (or at least I hope so). This way, Tds objects are no longer held up by PreparedStatement executions, which also contain some end of procedure execution information (a return value, maybe output parameters and a TDS_DONEPROC packet). o Tested jTDS with the J2EE Compliance Test Suite (actually only part of it, because it's *very* slow) and after the fix mentioned above it doesn't hang anymore (it hanged because the J2EE disabled autocommit mode and the first time a DatabaseMetaData method was called -- one that uses PreparedStatement -- the Tds remained allocated to that PreparedStatement, another one was created and this second one deadlocked, waiting for the first one to commit the transaction). There are a few issues, still (e.g. supportsConvert()), but overall it seems to work! (It's also true that the CTS is completely braindead -- does not check anything else except the fact that the methods don't throw exceptions and return non-null ResultSets.) o Implemented DatabaseMetaData.supportsConvert(int, int)! Wasn't as hard as I thought it would be. :o) 09/18/2002 - Alin Sinpalean o Rewrote (or should I say, 'partially deleted') Tds.sendTds70Login() based on the information obtained from packet sniffing I did during the weekend. Much shorter and more concise. o Removed the initialization of the Tds where the default values for transaction isolation level and implicit_transactions were reinstated by jTDS. This way, creating a connection is 'a bit' faster. o Bugfix (#600286): when using TDS 7.0 jTDS sends the database name in the login packet or sends an empty string (like it did until now) if no database is specified in the URL/properties. TDS 4.2 sends a "use <database>" query if the database length is not 0. The database that was selected ultimately by the server is obtained through processing all TDS_ENVCHANGE packets, then TdsConnection gets it from Tds (the relevant TDS_ENVCHANGE packet is parsed in the Tds constructor, so the database name is already there for TdsConnection. This way, Driver TdsDataSource don't have to define a default database name ("master") so they start with an empty string. That's about it! :o) 09/18/2002 - Alin Sinpalean o Lots of changes and improvements here! All of them were done until yesterday but unfortunately I could not commit them last night so I'm going to do it now. I'll also try to do a list of changes, as exact as possible. Here goes. o Removed the main methods from all non-test classes that had one. They were doing some testing, unfortunately I don't have the database structure on which they worked and there are a lot of other tests, so I decided to just wipe them out. And, another thing: they were unnecessarily adding to the size of the .jar file. o Made the cancel mechanism work. I have no idea if it ever worked (or if it did, if it ever worked right) but it sure doesn't seem so. This means changes to CancelController (only one cancel request can be outstanding at a time, no more waiting for the cancel ack), TdsComm (no longer eating up input by simply ignoring it), Tds (processing of any outstanding cancel when executing a query or procedure, throwing an exception when a query times out), Prepared_Statement (this was the only point where data was left for Tds to ignore instead of being processed, so I fixed that by calling skipToEnd before each procedure call), TdsStatement (check for exceptions after each execution to see if it wasn't cancelled, cancel() is no longer synchronized -- this actually prevented it from working). o TdsComm had a static counter for instances for debugging purposes, but each instance used that counter as id instead of having its own member to record the value of the counter at the time of its creation. Fixed. o Changes to Logger in order to close output streams when no longer using them. (Maybe this is not as smart as I thought it would be, I'm not sure what happens if we close System.out.) o Synchronized calls to execute methods from CursorResultSet as this was a pretty subtle source of errors: when a CursorResultSet was finalized it ate all outstanding results on the Statement, which meant trouble for any other concurrent ResultSets. By synchronizing these calls, CursorResultSets will not interfere with each others results, but they will still interfere with any TdsResultSets (however this is not such a big problem, since the probability of having both scrollable and non-scrollable on the same Statement is quite low). o Added a test in SAfeTest for the cancel mechanism and it seems to work just fine. :o) 09/16/2002 - Alin Sinpalean o Even bigger clean-up of most of the base classes: TdsStatement, TdsResultSet, TdsConnection etc. Lots of changes, so it's pretty hard to make a list of them. Anyway, major changes include: synchronization and visibility changes in TdsStatement, Logger no longer throws IOExceptions (it's kind of stupid to do that), TDS_XXX token name changes, processing of database changes in Tds, SQLWarningChain clears the exceptions list when throwing one. That's about it. o Created a "specification" for TDS 7.0 based on 2 days of packet sniffing. Still in preliminary stage, but contains a lot of information. I will have to match it up against existing specifications from FreeTDS and other sources to make sure I wasn't wrong about things, then I'll probably publish it on the documentation page of the project's site. 09/14/2002 - Alin Sinpalean o Fix in TdsResultSetMetaData: getColumnTypeName() crashed on SYBBITN columns. o Fix in TdsConnection: on close(), not all Statements were closed, because the for was going from 1 up but Statements were removed from the Vector as they closed, so every second Statement was skipped. o Moved startResultSet logic from TdsStatement to TdsResultSet. o Massive clean-up of TdsStatement: simplified the way getMoreResults()/ getResultSet() works. There are still some issues with Tds objects remaining allocated, but I will try to fix them. 09/13/2002 - Alin Sinpalean o Fixed DatabaseMetaData.getColumns() (temporarily, the final solution would be to use a system stored procedure as with all the other meta data methods) thanks to Dale Anderson (entraspan), author of the bug, and ultimately, solver. I'm not sure this works on SQL Server 6.5, but it seems like no one is using that anymore. o Implemented CursorResultSet.beforeFirst() and CursorResultSet.afterLast(). There's an even bigger problem with CursorResultSet: a different Tds could be allocated to the Statement than the one on which the cursor was created, which will inevitably lead to a crash. Now I start to understand what the mainTds thing was for. :o) 09/11/2002 - Alin Sinpalean o Optimized TdsComm.getBytes() to use a fixed buffer and not allocate a new one every time if not necessary (e.g. when reading in bytes that will be turned into a String and no longer used). Performance is much better now, although I didn't have the time to do a comparison. o Added tests in all non-private methods of TdsResultSet to see check if it's open or not (an SQLException is now thrown instead of the NullPointerException that was usually thrown when the ResultSet was closed). 09/10/2002 - Alin Sinpalean o EscapeProcessor now accepts all JDBC escape sequences (including stored procedure calls). CallableStatement_base, however, needs some more work in order to "understand" the "{?=call ...}" sequence (a hell lot of work). :o( o Reduced "a bit" (from 2000 to 100) the number of connections created by TimestampTest.testConnection0039 because there was really no justification for that and it took 20 seconds. Really need to write some more tests and reorganize the existing ones... o Just tested jTDS with SQLDeveloper (http://sqldeveloper.solyp.com), a very interesting database manager based on JDBC. The only problem I encountered this far (and fixed) was that AbstractResultSet (and CursorResultSet) got the context from the 'current row' instead of using their own getCursor() method, which meant that when no 'current row' existed, an SQLException got thrown. Now, everything seems to work fine. :o) 09/09/2002 - Alin Sinpalean o Removed relinquish() from ConnectionHelper interface. I don't even know what ConnectionHelper is for... o Chenged Statement.closeResults() and ResultSet.close() by adding a parameter which says if the Tds should be released or not, if possible. o Modified a bit TdsStatement.skipToEnd() to also include a call to closeResults(). This way, skipToEnd() will work regardless of the state the Statement is currently in. 09/08/2002 - Mike Hutchinson, Alin Sinpalean o Alin: First of all I have to thank Mike for the ideas (these were all his) and the patch he sent me. I took the liberty of changing them as I saw fit (there were some small issues, but all in all the ideas are simply great). o Moved the logic for commit/rollback to Tds instead of TdsStatement. This way it's possible to not rollback a Tds when the Statement is closed (which, as Mike noted, is wrong). o TdsConnection.close now rolls back explicitly all Tds objects prior to closing them (this was done until now by TdsStatement.close(), which was wrong). o TdsConnection.commitOrRollback calls directly the commit() and rollback() methods of Tds instead of TdsStatement, due to the changes above. o PreparedStatement_base.execute() only adds the newly created stored procedure to tds.proceduresOfTra if the Connection is not in autoCommit mode. o TdsStatement.releaseTds() releases the Tds even if in manual commit mode. This is possible because we're no longer commiting Statements but the Tds connections themselves. o TdsStatement.close() no longer calls rollback(). This was wrong. o TdsStatement.close() only called Connection.markAsClosed(this) if actTds was not null (which was ok considering the way jTDS worked until now). However, since a TdsStatement can now release the Tds even when in manual commit mode markAsClosed always has to be called. Even if this is sometimes redundant it ensures Statements are removed from the Connection's list of active Statements not causing any memory leakage (which, as I understood from Mike, was pretty serious, leading to VM crashes). o Removed TdsStatement.commit(), TdsStatement.rollback(), TdsStatement.finalize() and TdsResultSet.finalize() as they were no longer needed. =============================================================================== 09/06/2002 - jTDS 0.3.1 released =============================================================================== Changes from jTDS 0.3 ===================== 09/06/2002 - Alin Sinpalean o The modifications to EncodingHelper did not take into account multiple-byte charsets (they were hardcoded before). Now this is automagically determined based on the size of the resulting String (if same, then it's a single-byte charset). o Modifications to the EncodingHelper and Tds for a better encoder management and changed the default encoding to Cp1252 (when SQL Server responds with 'iso_1' - that's inexact, SQL Server is, in fact, using Cp1252). o Tds.discardResultSet fix: if an error or warning was returned immediately after a ResultSet that was not read completely, but discarded, jTDS crashed because it only expected TDS_DONE* tokens. 09/05/2002 - Alin Sinpalean o Added jdbc3_0-ext.jar to the lib folder, containing the .class files for java.sql.Savepoint and java.sql.ParameterMetaData and changed the libraries used by JBuilder to include this jar, too. This allows compilation of the changes made by Justin under JDK 1.3 and should not affect compilation under JDK 1.4. o Fixed CursorResultSet.createCursor(): SCROLL_INSENSITIVE cursors could not be created because of a syntax error. 09/03/2002 - Justin SB o Added stubs to enable compilation with JDK 1.4 (no new functionality) 08/30/2002 - Alin Sinpalean o TdsResultSetMetaData.get* fixed (Bug #598911). Still a couple of incompatibilities with the JDBC-ODBC bridge, due to the fact that I consider their implementation to be incorrect. o Synchronized TdsConnection. Still need to do some similar work on Statements and ResultSets, but it's a good job, anyway (I hope no deadlocks were introduced because of this). o Implemented TdsConnection.setCatalog. The dirty way, but it works. 08/28/2002 - Alin Sinpalean o Modifications to the javadoc comments in a lot of places (warnings were thrown by javadoc). o Beautification of TdsDefinitions. o TdsConnection.getMetaData() no longer allocates a Tds, because it didn't use it anyway. The Tds instance DatabaseMetaData contains is used only for calls to methods returning constant values (for that Tds instance). o Started fixing Bug #598911 (ResultSetMetaData.get* incorrect): Tds.lookupColumnSize() returns the display size rather than the length in bytes for fixed size columns, TdsResultSetMetaData.getColumnTypeName() returns the SQL Server-specific names of columns, rather than INT1, INT2 etc. o DatabaseMetaData changes: implemented getCrossReference(), changed getCatalogs() implementation, removed makeTypeTable() -- no longer used. o Changed the implementation of almost all methods in DatabaseMetaData to use standard stored procedures instead of the custom but unsafe code. Only a couple of methods are still using the old way (getColumns because of custom types and getSchemas because the result would be the second column and it's currently impossible to hide any columns but the last ones). 08/26/2002 - Alin Sinpalean o Database name is no longer explicitly required in the URL for the driver or to be set for the DataSource. The default value for it (if not specified) is "master", which is ok for SQL Server, but of which I'm not so sure of for Sybase (Bug #598886). o Changed the implementation of DatabaseMetaData methods getProcedures, getProcedureColumns and ... to use SQL Server-defined stored procedures, for increased performance and better compatibility with other drivers. 08/23/2002 - Alin Sinpalean o Improved NULL, 0-length and single-space string handling (both when sending parameters and receiving values. o Tds.rollback() just drops all procedures submitted during the last transaction rather than resubmitting them (no one can guarantee they will be used again, so better just drop them). o Removed TdsComm.backup() - wasn't used anymore and was pretty dangerous anyway. o Changes to AsTest and CSUnitTest to reflect the way update counts are returned from PreparedStatements and CallableStatements. o Added a freetds.SAfeTest test to test the NULL, 0-length and single-space string handling. 08/21/2002 - Alin Sinpalean o jTDS officially became "jTDS Type 4 JDBC 2.0 driver for MS SQL Server", as DatabaseMetaData.getDriverName() returns this value. o Not directly related to the development of jTDS, The jTDS Project finally has its own homepage: http://jtds.sourceforge.net 08/20/2002 - Alin Sinpalean o Added a Statement member to the Tds class, that should point to the Statement currently using the object (if any, null if not used). Using this the Tds can decide whether to return update counts from DONEINPROC packets if the current Statement is a PreparedStatement. This way, PreparedStatement can return update counts from inside stored procedures while Statement doesn't. o Fixed the tests that failed because of the fact that more Statements were allocated at once (meaning some of them were not able to create the temporary tables/stored procedures created by others) by closing the Statements when they were no longer needed. o Implemented all methods of ResultSetMetaData except getColumnClassName and used case sensitivity and table name from result packets (both TDS 4.2 and TDS 7.0). (Request #587751) o Fixed TdsStatement.rollback(): calls Tds.rollback() when not in autocommit mode, in order to redefine all missing stored procedures. =============================================================================== 08/19/2002 - jTDS 0.3 released =============================================================================== Changes from jTDS 0.2 ===================== 08/19/2002 - Alin Sinpalean o Check for ENVCHANGE packets in TdsStatement.getMoreResultsImpl (if a query that changed the environment was executed, the driver crashed because of unrecognized packet types - ENVCHANGE). o Added a fakeColumnCount to Columns to mask columns to the end user (e.g. for meta data use). o Implemented methods in DatabaseMetaData: getColumnPrivileges, getTablePrivileges, getTypeInfo, getBestRowIdentifier, getVersionColumns. Also some minor changes to methods returning constant values. o Bugfix (#595022): Hidden the rowstat column returned by CursorResultSets. 08/16/2002 - Alin Sinpalean o DatabaseMetaData.getSchemas() fix: TABLE_CATALOG column was also returned as a result column; removed it. o TdsResultSet.fetchNextRow() fix: the Tds was not released when the end of data was reached; now it is. o TdsConnection.prepareCall() fix: a useless call to allocateTds() was made, which locked a Tds that was never released again; commented out. o Fixes in the tests: AsTest, CSUnitTest, PreparedStatementTest, TestBase, TimestampTest. o Condition in Microsoft7MetaData.getProcedures() to avoid NullPointerExceptions when a null schema pattern was provided. 08/15/2002 - Alin Sinpalean o Rewrote build.xml. 08/14/2002 - Alin Sinpalean o Added support for the UNIQUEIDENTIFIER datatype. o Created a com.internetcds.jdbcx.tds package containing a DataSource implementation and an object factory (alpha version, not even tested with JNDI - I tried to do it but it doesn't seem that easy). Anyway, it's a starting point. 08/13/2002 - Alin Sinpalean o Fix in CursorResultSet: if no rows were returned by the query, loadContext failed with a NullPointerException when trying to get the current row's context. Now the context is loaded in internalFetch -- not very elegant, but at least it works. ;o) 08/08/2002 - Alin Sinpalean o DatabaseMetaData.getInstance() now returns a DatabaseMetaData or Microsoft7MetaData based on the TDS version rather than the server version. 08/06/2002 - Alin Sinpalean o Optimized the implementations of TdsComm.getBytes(int) and TdsComm.peek(); they are no longer using TdsComm.getByte(), which was slowing them down. o Implemented getExportedKeys. o TDS 7.0 is now the default protocol used by jTDS. 08/05/2002 - Alin Sinpalean o Added a databaseMajorVersion member to the Tds class to help make the difference between SQL Server versions (e.g. for DatabaseMetaData usage). o Fixed some of the additions Jason made, most of them due to the fact that he probably used SQLServer 2000 while I am using 7.0 (there could be some even bigger problems for people using SQLServer 6.5, if there are any) and a problem related to getTables - catalog name for tables in other databases (catalogs) were wrong (pubs was used instead of the catalog name). o Added implementations to methods without parameters returning boolean values in DatabaseMetaData (based on values returned by the JDBC-ODBC and some other drivers). o Bugfix 587749: Bit to Int conversion works. So does Binary to String. 08/05/2002 - Jerason Banes (patch) o Fixed the following methods in DatabaseMetaData: getSchemas, getTables, getColumns, supportSchemasInTableDefinitions. o Implemented the following methods of DatabaseMetaData: getIndexes, getPrimaryKeys, getImportedKeys. 07/xx/2002 - Alin Sinpalean o TdsStatement checks if it isn't already closed on a call to close() and the allocated Tds object isn't freed until no more results are available