Sybase SQL Anywhere Studio 7.0.2 Copyright (c) 2001 Sybase, Inc. and its subsidiaries. All rights reserved. Contents -------- - Updated Components - New Features in SQL Anywhere Studio 7.0.2 - Known issues and limitations - Late additions - dblang command-line utility. - Accessing licensing information and functionality - Limit resolution of timestamp values Updated Components ------------------ The following components have been updated in this version of SQL Anywhere Studio: Adaptive Server Anywhere Version 7.0.2 UltraLite deployment option Version 7.0.2 MobiLink synchronization Version 7.0.2 SQL Remote replication Version 7.0.2 InfoMaker Version 7.0.2 (not updated from 7.0.1) Open Client/Open Server Version 12.0 EBF 8879 PowerDesigner PhysicalArchitect Version 7.0.2 (not updated from 7.0.1) jConnect for JDBC Version 4.2 and 5.2 EBF 9007 PowerDynamo Version 3.5.0.3 Sybase Central Version 4.0.1 New Features in SQL Anywhere Studio 7.0.2 ----------------------------------------- For information on the new features in this release of SQL Anywhere Studio, see the following locations: - Chapter 1 of ASA Getting Started - Chapter 2 of Replication and Synchronization Guide Known issues and limitations ---------------------------- Behavior change: The Adaptive Server Anywhere OLE DB provider now defaults the recordset cursorType to ForwardOnly. Previously, the default cursorType was Dynamic. Late additions -------------- The following new features are not listed in the documentation. dblang command-line utility --------------------------- This utility reports and changes the registry settings that control the languages used by ASA and Sybase Central. Usage for the utility is as follows: dblang [switches] [language-code] -d deployment settings only (Sybase Central settings not affected) -q quiet mode (suppresses message box displaying output) Language codes: EN English DE German ES Spanish FR French IT Italian KO Korean JA Japanese PL Polish PT Portuguese RU Russian TW Traditional Chinese UK Ukrainian ZH Simplified Chinese Running dblang without a language code reports the language registry settings for Adaptive Server Anywhere and Sybase Central. It reports only those registry settings that are present, which typically are the local machine settings. The values are two-letter language codes as listed above. In addition, dblang reports the registry setting for the C++ version of Sybase Central, for those users who have this from previous releases. The setting is a number. If you specify dblang with a language code, it reports the current settings, and then modifies those settings to the new language. Output includes both the original and new settings. The current registry settings are reported in the current language, and the new registry settings are reported in the new language. If you specify -d, only the Adaptive Server Anywhere setting is modified. Microsoft SQL Server 2000 supported by MobiLink ----------------------------------------------- Microsoft SQL Server 2000 consolidated databases are now officially supported by the MobiLink synchronization server. Both SQL Server 7 and SQL Server 2000 use the same syncmss.sql script to set up the consolidated database. Accessing licensing information and functionality ------------------------------------------------- The functionality of the license management tool dblic.exe is now accessible through the dbtools interface. The dbtools dll entry point is called DBLicense and has the following prototype: short DBLicense( const a_dblic_info ) For more information, see the dbtools.h header file. In addition, the following license provides the license information for the current database server: NumProcessorsAvail Number of processors on server NumProcessorsMax Maximum number of processors used LicensedCompany Name of the licensed company LicensedUser Name of the licensed user LicenseType License type LicenseCount Number of licensed seats Notes: - NumProcessorsMax is normally 2 for dbeng7.exe and 0 (i.e. unlimited) for dbsrv7.exe. - LicenseType is "concurrent seat" or "networked seat (per-seat)" - The values are displayed by executing the following statement: call sa_eng_properties() or by calling the property function directly, as in: select property( 'LicenseType' ) Limit resolution of timestamp values ------------------------------------ Adaptive Server Anywhere timestamp values can contain times with a resolution in microseconds. This resolution can cause problems when replicating (using SQL Remote or MobiLink) to non-ASA databases such as Oracle, DB2 or ASE, all of which store timestamp values with less precision. To deal with these problems, a new option has been added to limit the resolution Adaptive Server Anywhere uses for timestamp values. When the Truncate_timestamp_values option is set to ON (default value is OFF), timestamp values are truncated based on the setting of the Default_timestamp_increment option. For example, setting Default_timestamp_increment to 100000 will cause truncation after the first decimal place in the seconds component, allowing a value such as '2000/12/05 10:50:53.700' to be stored. The Truncate_timestamp_values option can only be set for PUBLIC, and should _not_ be enabled for databases already containing timestamp data. Bugs fixed in this maintenance release -------------------------------------- This section lists bugs that were fixed in this release. It does not list bugs that were fixed in earlier releases. For bug fix lists from earlier releases, go to MySybase, at http://www.mysybase.com. Note that this maintenance release may not contain all of the bug fixes from recent EBFs (Emergency Bug Fixes) made available from MySybase, since EBFs for earlier releases can occur after this maintenance release. If you are changing from an EBF of an earlier maintenance release and you require a recent bug fix, you may require a recent EBF for this maintenance release. The bug fix descriptions are in English because the list is generated from engineering tools used to track changes to the software. A translated version of the bug list may be available from a local Sybase web site. SYBASE Adaptive Server Anywhere ******************************* Maintenance Release Notes for Version 7.0.2 ******************************************* Description of available downloads ================================== Emergency Bug Fixes =================== A subset of the software with one or more bug fixes. The bug fixes are listed in the "readme" file for the update. A Bug Fix update may only be applied to installed software with the same version number. Some testing has been performed on the software, but full testing has not been performed. Customers are discouraged from distributing these files with their application unless they verify the suitability of the software themselves. Verified Bug Fixes ================== A subset of the software with one or more bug fixes. The bug fixes are listed in the "readme" file for the update. A Bug Fix update may only be applied to installed software with the same version number. Full testing has been performed on the software. Maintenance Release =================== A complete set of software that upgrades installed software from an older version with the same major version number (version number format is major.minor.patch). Bug fixes and other changes are listed in the "readme" file for the upgrade. After the maintenance release upgrade has been applied, the latest Verified or Emergency Bug Fixes update should be applied, if available. Introduction ============ Release 7.0.2 is a regularly-scheduled maintenance release, containing fixes to reported problems with the software as well as some new features. 7.0.2 bug fixes =============== The following is a list of bugs fixed in this version of the software, as compared to the 7.0.1 release. ****************************** ** Adaptive Server Anywhere ** ** ** ** DBLIB Client Library ** ****************************** ================(Release Build - Engineering Case #220212)================ If two separate applications tried to autostart the same database, at the same time, one of two bad things may happen: (1) both connections would eventually succeed, but the engine may crash when they disconnected, or (2) one of the client applications will seem to hang for a while, and then fail with "database not found". ================(Release Build - Engineering Case #220404)================ If 2 separate applications tried to autostart the same database at the same time, one of them would realize this, and attempt to connect again once the database was started. That connection would then be leaked, and a third connection attempt would be made, which would succeed. The leaked connection would eventually be cleaned up on the engine by liveness, but if the engine was shut down before that happened, the shutdown would report an active connection. Also, if all other connections to the autostarted database went away, the database would not be stopped until this leaked connection was cleaned up. ================(Release Build - Engineering Case #220695)================ If the connection string parameters provided by the SQLCONNECT environment variable or an ODBC DSN contained an error, the error message text would contain "near ''". There is also a chance the application would fault. ================(Release Build - Engineering Case #220912)================ If a connection was forcibly removed by the engine (i.e. through use of DROP CONNECTION, due to liveness, or by someone stopping the database that they were connected to), then the connection would not be completely cleaned up by the engine until the application notices that the connection is gone. For example, if an app was connected to a database over TCP, and a different app attempted to unconditionally stop that database, the first app's connection was not cleaned up as long as the app wasn't doing anything, so the database was not closed, and the second app appeared to hang. If the first app maked a database request, or a liveness packet was sent, then the engine finished the connection cleanup, and the database was closed. This could also have be seen if a connection was killed due to liveness (i.e. the app is hung). Attempting to shutdown the engine would hang until the hung client application was killed. Note: This fix requires both new client and server software. ================(Release Build - Engineering Case #221564)================ An application using the threaded client libraries, (libdblib7_r or libdbodbc7_r), on a Unix platform other than Solaris, could have hung while making a TCP/IP connection. The problem would only show up occasionally. This was a problem on all Unix platforms with ASA 6.0.x, but was already fixed for Solaris by ASA 7.0.0. ================(Release Build - Engineering Case #221571)================ Attempting to use the 5.5 isql.exe with the compatibility DLL supplied with ASA 7.x would give the error, "The procedure entry point _db_reset_collation@4 could not be located in the dynamic link library dbl50t.dll." ================(Release Build - Engineering Case #223923)================ A client application running on Windows NT/2000 using tcp/ip Winsock 2 could hang or GPF on disconnect. This problem was very rare, and has only been reproduced when an application continually connects to one server on a remote machine, then a second server on a second remote machine, then disconnect from both servers (and repeats the connects and disconnects). The problem may have been more likely on multiprocessor NT/2000 client machines. ================(Release Build - Engineering Case #224647)================ Poor performance may have been experienced when prefetch was enabled and an application did a commit or rollback after every, (or most), fetches in a result set. Note that many operations (including any SQLExecute) will cause an implicit commit if ODBC auto commit is enabled (the default). ================(Release Build - Engineering Case #226840)================ If a server was started with a name that was already in use on the network, then the NETBIOS port could sometimes have failed to detect it and would start up anyway. Once started the server would then utilize the cpu at 100%. ================(Release Build - Engineering Case #227256)================ The JDBC function, DatabaseMetadata getIndexInfo() would report incorrect results if it was called multiple times. It was accumulating results. ================(Release Build - Engineering Case #227669)================ Running dblocate on a Windows 2000 machine would not list servers running on the same Windows 2000 machine. This change also lists the found servers ordered by server name, (previously they were unsorted). ================(Release Build - Engineering Case #228360)================ The packets used to find ASA servers running the TCP/IP communications link could have been lost. The lost packets would cause connection attempts to fail once in while, especially if the server address was not in the asasrv.ini cache. They could also cause dblocate to occasionally not find a server. ================(Release Build - Engineering Case #228841)================ If a client application running on Windows NT or 2000 shutdown, (eg call db_fini or SQLFreeEnv), with an active TCP/IP connection, the application would hang with 100% CPU usage. This problem would also occur on Windows 98 or Me, if Winsock 2.0 was installed. This problem exists in version 6.0.3 builds 3037 and later, 6.0.4 build 3594 and later, and 7.0.1 build 1101 and later ================(Release Build - Engineering Case #230026)================ If a client application shutdown, (eg called db_fini or SQLFreeEnv), with an active NetBIOS connection, the application could have crashed. ================(Release Build - Engineering Case #230639)================ When an application terminated, it may have aborted for no apparent reason on some Linux distributions, (Mandrake 7.2 was one). ****************************** ** Adaptive Server Anywhere ** ** ** ** ODBC Client Library ** ****************************** ================(Release Build - Engineering Case #221345)================ When using an ODBC escape sequence in a bound parameter input value ( eg. {d '1999-01-01'} ), the engine qould report the error 'Not enough host variables'. ================(Release Build - Engineering Case #222310)================ In some cases, a SCROLL (keyset-driven) cursor could return incorrect values when a row was re-fetched. The following conditions were needed: 1. SCROLL cursor is being used 2. The query contains any of the following: 1) two or more conditions on the same column OR'd together (ie. X = 5 or X = 4) 2) UNION ALL 3) DISTINCT 4) GROUP BY 5) a subselect in the select list 6) a subquery in the query's WHERE or HAVING clause 3. The application re-fetches a row 4. Prefetch is disabled 5. One of the tables in the access plan uses an index where only a subset of the index columns were used in the plan Then, the wrong row could be returned to the application the first time it re-fetches a row, either using a FETCH RELATIVE 0 or an absolute fetch of a row previously fetched. The incorrect values would include values from a row one position beyond the last one matched by the index. ================(Release Build - Engineering Case #225587)================ Opening a cursor using a parameter, fetching some rows, closing the cursor and reopening it using a different parameter would not yield the correct result set after the second open. A workaround to the problem is to disable prefetch. ================(Release Build - Engineering Case #220932)================ The buffer may be truncated when getting the cursor name using SQLGetCursorName(). ================(Release Build - Engineering Case #221010)================ The Unicode ODBC function SQLDriverConnectW was incorrectly reporting that the length of the output buffer was longer than it actually was. The function was returning the length of the Unicode string in bytes, instead of in characters. ================(Release Build - Engineering Case #221616)================ When using SQLSetPos to insert a single record into a result set and then using the SQLParamData function to provide data for the insert, 2 rows would be inserted into the database, one with the parameter data, one without. This problem did not occur when inserting multiple rows. ================(Release Build - Engineering Case #222992)================ SQLGetCursorName should return a name starting with SQL_CUR as indicated in the ODBC specifications. ================(Release Build - Engineering Case #223700)================ When adding a datasource that already exists or modifying a datasource such that its name changes to match an existing datasource we would save the datasource without first prompting the user. This would result in the existing datasource being overwritten. We now prompt the user to overwrite the existing datasource. ================(Release Build - Engineering Case #225632)================ The dbdsn utility was adding links= to the DSN when ever a connection string was provided, even when the connection string contained no Links parameter. Now links= is only added if neither -c or -x is specified. ================(Release Build - Engineering Case #226954)================ The ODBC driver would always override the user's ConnectionName parameter with a unique value of its own. It was requested that we not do this, since the connection name is what is displayed on the server screen, and it was difficult to determine who was connected. ================(Release Build - Engineering Case #228227)================ Attempting to fetch between 32768 and 65535 rows with one call to SQLExtendedFetch was returning no rows. Now the correct number of rows are returned. Both the Microsoft Driver Manager and now the ASA ODBC Driver give an error if an attempt to fetch more than 65535 rows is made. ================(Release Build - Engineering Case #228579)================ The DBDSN utility did not recognize ODBC-specific connection keywords. For instance, attempting to create a datasource with an ODBC-specific keyword such as: dbdsn -w mydsn -c "uid=dba;pwd=sql;isolationlevel=2" would fail. As well, dbdsn did not report the ODBC-specific keywords when using one of the following commands: dbdsn -g mydsn dbdsn -cl ================(Release Build - Engineering Case #229623)================ If the SQLCONNECT environment variable was set when configuring an ODBC datasource, settings in the environment variable would override the settings entered in the configuation dialogs. SQLCONNECT is now ignored. ****************************** ** Adaptive Server Anywhere ** ** ** ** OLEDB Client Library ** ****************************** ================(Release Build - Engineering Case #223967)================ When using ASAProv to connect to an ASA database using the Delphi ADOConnection Object would connect you to the database, but the message "Invalid Enum Value" would be displayed. This is due to a Delphi bug dealing with the MODE property of the ADOConnection object. To work around the problem, the ASAProv provider has been modified to return the same mode value as the MSDASQL provider. ================(Release Build - Engineering Case #224155)================ Executing commands with single byte string input arguments from Delphi using the ASA OLEDB provider (ASAProv) would fail to pass any of the string arguments through to the engine. BSTR and WSTR values would be passed through without problems. ================(Release Build - Engineering Case #223343)================ Strings returned from a result set were sometimes not NULL terminated as expected, and thus could have extra characters at the end. This could be reproduced by creating an OLEDB ATL app. in MS VC++ and adding an ATL consumer object that used the OLEDB driver. The table list would have garbled table names. ================(Release Build - Engineering Case #223642)================ Failure to complete a database connection normally caused a dialog to be displayed, prompting for connection parameters. This was not working on CE devices, instead, the user would see an error "loading dbcon7.dll". On Pocket PC's, this message was hidden behind the ASA window.Workaround for now is to change the default initialization property on CE to be DBPROMPT_NOPROMPT, as dbcon7.dll is not part of ASA CE at this time. ================(Release Build - Engineering Case #225196)================ Using recordset.AddNew could fail subsequent data retrievals. ================(Release Build - Engineering Case #226635)================ After executing .AddNew then .Update on an ADO recordset object, fields in the new row were empty and did not contain the newly set values. Also, after executing .Edit, string fields were not always properly terminated. These problem have been corrected ================(Release Build - Engineering Case #228284)================ Inserting a new row with a BLOB column > 600 bytes, would fail. For example, following VB statements would fail to set the BLOB column of a new Pictures row: Dim rsBlob As New ADODB.Recordset Dim blob() As Byte ReDim blob(FileLen(txtFileName.Text)) blob = GetImageFromFile(txtFileName.Text) rsBlob.Open "Pictures", adoConn, adOpenKeyset, adLockOptimistic, adCmdTable rsBlob.AddNew rsBlob.Fields(1).AppendChunk blob() rsBlob.Update The data column would be null if the blob data was longer then 600 bytes. ================(Release Build - Engineering Case #231478)================ A very large number could have been returned from IRowsetScroll:GetApproximatePosition() as an estimate of the number of rows in a rowset. Error was caused by returning a negative number, (the approximate row number for a SELECT statement, when the the actual number cannot be determined), in an UNSIGNED field. ================(Release Build - Engineering Case #231866)================ The last read of a block of rows at the end of a rowset could contain duplicate rows. ****************************** ** Adaptive Server Anywhere ** ** ** ** Other ** ****************************** ================(Release Build - Engineering Case #220247)================ A minimal client install has been reduced in size from about 60MB to 4MB. Sybase Central and DBISQL can now be removed from the client install. ================(Release Build - Engineering Case #220605)================ When a non-English install was done and WinHelp was selected to be installed, WinHelp files would be installed for both English and selected language. Now, WinHelp files are installed only for the selected language. ================(Release Build - Engineering Case #221087)================ On some (but not all) non-English systems, installing ASA does not properly install the Performance Monitor strings for the server. This has been corrected. ================(Release Build - Engineering Case #223320)================ Some scripts, specifically rstab.sql, reindex.sql, sadebug.sql to asa_nlm_files.sgl, were missing from the 6.0.03 Netware install. This caused dbupgrad to fail when running against the Netware server. The EBF install will add them. ================(Release Build - Engineering Case #228506)================ Attempting to upgrade a 7.0.0 database to 7.0.1 would return a message that no upgrade was necessary. This was due to the fact that when 7.0.1 was released no upgrade was required. However, several new stored procedures were added in 7.0.1 EBFs, as a result, an upgrade path from 7.0.0 to 7.0.1 has now been added. ****************************** ** Adaptive Server Anywhere ** ** ** ** Procedure Debugger ** ****************************** ================(Release Build - Engineering Case #215921)================ The "Login" and "Logout" menu items have been renamed "Connect" and "Disconnect" to be consistent with Sybase Central and ISQL. ================(Release Build - Engineering Case #217364)================ On the Debugger's Connect dialog, the text "The following values are the network address of the database server" had been clipped (ended in an ellipsis.) Also in the "Finding Servers" dialog, the text had also been clipped. Both of these problems have been remedied. This could also happen in international versions of the software. ================(Release Build - Engineering Case #217388)================ Previously, when a database event fired, or when a new database connection was made (by anyone), or when a connection was closed (by anyone), the debugger would change contexts (the red arrow in the "Connections" window would point to a different connection). If you were in the middle of a debugging session, it would appear that you had lost control of the debugger since single stepping would not work until you had set the selected connection back to the connection you were debugging. ================(Release Build - Engineering Case #220849)================ On Windows machines, the File Open/Save dialogs are now implemented using the native Win32 versions of the dialogs rather than the Swing ones. The native dialogs are used when all three of the following are true: 1. The client is running on Windows 9x/NT/2000 2. The "Windows" look and feel is selected 3. The new JSYBLIB.DLL file is in the path If any of these conditions are false, the Swing dialogs are used instead. Problems with the Swing dialogs included: poor handling of the ESCAPE and ENTER keys, other unexpected keyboard navigation behavior, case sensitive file sorting (Windows users expect insensitive sorting) ================(Release Build - Engineering Case #221240)================ If you close the active window (and don't activate any other window), then press F1, the Debugger would try opening help for the window you just closed. If the window just closed was the "help" window, you could get an error stating that "helpwindow.html" could not be found. Otherwise, you could get help for the window that you just closed. Now, the debugger will ring the bell since there is no active window and so no help to display. ================(Release Build - Engineering Case #221569)================ The title of the Source window was not being updated until the window was deactivated. The title should show the name of the window and the currently selected line number. ================(Release Build - Engineering Case #231069)================ The Stored Procedure Debugger now ignores connections made by Sybase Central. This was done to fix a problem which caused both Sybase Central and the Debugger to hang when the Debugger was started from Sybase Central and a breakpoint was set. ****************************** ** Adaptive Server Anywhere ** ** ** ** Server ** ****************************** ================(Release Build - Engineering Case #219647)================ If the LOAD TABLE statement was used with the DEFAULTS ON clause and an error occurred executing the statement, the engine would have crashed. ================(Release Build - Engineering Case #220320)================ If a query in a stored procedure contained an invalid Transact-SQL outer join, an error would be reported the first time the procedure was executed; however, subsequent calls might execute with no error and produce unpredictable results from the query. ================(Release Build - Engineering Case #220577)================ If a cursor was opened, using the WITH HOLD clause, on a temporary table which had ON COMMIT DELETE ROWS specified in its definition, then attempting to fetch from that cursor across a commit would have caused assertion 200601. ***NOTE: In this case, the assertion did not mean that the database is corrupt. eg. Executing the following procedure in DBISQL, followed by a commit and then trying to scroll through the result set would have caused assertion 200601. create procedure sp_x() begin declare local temporary table res( col1 int, col2 varchar(80) ) on commit delete rows; insert into res select emp_id, emp_lname from employee; select * from res; end; call sp_x; commit; Now scrolling through the stored procedure result set in DBISQL would have caused the assertion ================(Release Build - Engineering Case #220999)================ If two aliases in a SELECT list referred to each other (directly or indirectly), the server would hang or crash. The error message: Definition for alias 'alias-name' must appear before its first reference will now be given when an expression refers to an alias defined later in the SELECT list. This may cause an error to be generated for some queries which were previously considered valid. ================(Release Build - Engineering Case #221190)================ The following sequence would cause the server to crash: create table A(a1 int); create table B(b1 int); create table C(c1 int); create view V as select 1 from A left outer join B on A.a1=C.c1, C; Executing the SELECT outside of the view would give the correct error: Correlation name 'C' not found The same query would be accepted but might produce incorrect results in 6.0.x. Refer to issue 213679 for more details. The server will now give the same error during CREATE VIEW as when the SELECT is issued outside of the view. The FROM clause must be rearranged to correct the error. ================(Release Build - Engineering Case #221282)================ If a database already has a consolidated user and an attempt is made to grant consolidated permissions to a user that does not exist, an engine crash will result. ================(Release Build - Engineering Case #221293)================ If a java procedure that accesses the database is called from an scheduled event within the engine, the engine will crash. ================(Release Build - Engineering Case #221461)================ DBTran and DBRemote could fail when scanning a log file containing a delete of a row containing java objects. If the row belonged to a table that had articles or had no primary key, then the log scan would fail if the deleted row contained a java object that contained a reference to a java class that has not been referenced since the previous checkpoint. ================(Release Build - Engineering Case #222608)================ If a key constraint is enforced with a combined index, under some circumstances deleting a primary key that still has foreign references will not return an error immediately (even if wait for commit is off.) The constraint violation is reported at commit time but with a misleading error message (No Primary key value for foreign key.) ================(Release Build - Engineering Case #222624)================ Engine could crash after dropping a primary key or unique constraint if a table containing a referencing foreign key K had been accessed before the drop but not K itself. ================(Release Build - Engineering Case #223097)================ If the database server is started up as a service on Win 95/98 and it finishes starting up before a user has logged on, there will be no icon in the system tray. Now, the icon will appear when the first message is sent to the engine window after a user is logged on. ================(Release Build - Engineering Case #226929)================ After a while, a server running on Windows 2000 may stop accepting TCP connections. ================(Release Build - Engineering Case #229108)================ When returning a java object, the send length is always set to 32K since we do not know the actual length of the object until after we serialize it. Once serialized the send length was being used to send the large object rather than the true length. ================(Release Build - Engineering Case #229301)================ UPDATE .. PUBLICATION stmts might generate an erronenous syntax error or might gpf the asa engine if the subscribe by expressions contain subqueries. ================(Release Build - Engineering Case #183885)================ If the -c (connection string) parameter was used with the dbstop utility, dbstop would return before the server which it was stopping had shutdown. This would have been a problem when the server was shut down in a batch file and the next command tried to access database files. This problem also affected the dblib db_stop_engine function when the userid and password parameters were specified. Note that dbstop with no connection string did not exhibit this problem. ================(Release Build - Engineering Case #217808)================ The collation 819SVE did not properly recognize certain Swedish characters as alphabetic. ================(Release Build - Engineering Case #218365)================ The server would automatically perform statistical sampling of each loaded index during a CHECKPOINT. For databases with large schemas, this could have resulted in poor CHECKPOINT performance. ================(Release Build - Engineering Case #219898)================ An ODBC application performing wide fetches in the forward direction only on a proxy table could still get the error 'Backward scrolling cursors not supported'. ================(Release Build - Engineering Case #220080)================ If a BEFORE UPDATE row-level trigger issued an UPDATE or DELETE which affectd the row which caused the trigger to be fired, and the table was replicated or did not have a primary key, the server would consider the log to be corrupted if recovery was required. The following error is now given: Row in table '' was modified or deleted in BEFORE UPDATE trigger Deleting rows in a BEFORE UPDATE trigger should be avoided. To update the row, the trigger should be re-written to assign the new values using the REFERENCING NEW identifier. ================(Release Build - Engineering Case #220249)================ Queries with user function calls in the WHERE clause may be slow. ================(Release Build - Engineering Case #220336)================ If a 'START JAVA' statement was sent to the database server, and that request was subsequently canceled before the request was complete, then the database server may have crashed. ================(Release Build - Engineering Case #220595)================ If the 'install java' statement is executed with a file name argument, and the specified file does not exist, then if no classpath environment variable exists, then the 'install java' statement will fail but not indicate an error occurred. ================(Release Build - Engineering Case #220669)================ Two new connection parameters, PrefetchRows and PrefetchBuffer, have been added to allow changing cursor prefetch defaults. Prefetching is used to improve performance on cursors which do only fetch relative 1 or fetch relative 0 with either single row fetches or wide fetches, (ESQL array fetches or ODBC block fetches). Increasing the number of rows prefetched may improve performance, particularly if the following conditions are met: 1) the application fetches several hundred rows or more with single row fetches or small array or block fetches (only a few rows in the array or block), with no or very few absolute fetches. 2) the server and client are connected by a slow network (including Dial Up and Wide Area Network). 3) the application fetches rows at a high rate (over 20 rows/second) when both the application and server are run on the same machine (or connected by a fast network). Note that increasing the number of rows prefetched can DECREASE performance, particularly if ANY of the following conditions are met: 1) absolute fetches are done 2) relative negative offset or relative > 1 offset fetches are done 3) only one or the first few rows are fetched when there is a large rowset Performance testing should be done to determine if increasing the number of rows prefetched improves the performance of a particular application, since increasing the number of rows prefetched will decrease performance for some applications. The connection parameter PrefetchRows, (short form PROWS), sets the number of rows, (or number of arrays of rows), to prefetch for all cursors which use the connection. The default is 10. To disable prefetching, use the DisableMultiRowFetch connection parameter. The amount of memory used to buffer all prefetch rows for all cursors of an application is limited to 32K by default. If a prefetch would use more memory than this limit, the number of rows prefetched is reduced, (or no prefetch is done at all). A new connection level debugging message, (enabled by the "Debug=yes; Logfile=filename" connection parameters), has been added to indicate when this memory limit has reduced the number of rows: "The number of prefetch rows has been reduced to due to the prefetch buffer limit. Consider using the PrefetchBuffer connection parameter." If this limit is reducing the number of rows prefetched, the connection parameter PrefetchBuffer (short form PBUF) can be used to set the maximum amount of memory used for buffering rows (in K). Note that for ESQL, the BLOCK parameter to the FETCH statement can be used to control prefetching on a per-fetch basis. A BLOCK value of 0 disables prefetching. If a BLOCK value is specified and greater than 0, then the number of rows prefetched will be the lower of the BLOCK value and the number of rows which would have been prefetched if BLOCK was not specified. For example, the connection string "uid=dba;pwd=sql;prefetchrows=100" increases the number of rows (or arrays of rows) prefetched to 100. The connection string "uid=dba;pwd=sql;prefetchrows=100;debug=yes;logfile=c:\temp\cli.out" could be used to determine if the prefetch buffer memory limit was reducing the number of rows prefetched. If so, the connection string "uid=dba;pwd=sql;prefetchrows=100;prefetchbuffer=256" could be used to increase the maximum prefetch buffer memory limit to 256K. ================(Release Build - Engineering Case #220745)================ If a large blob, (10000 bytes or so), was inserted into a table via TDS, the server would more than likely crash. ================(Release Build - Engineering Case #220750)================ When NULL was required to be implicitly cast to a NUMERIC datatype, due to it's use in an expression or a comparision, the precision and scale used was that set by the PRECISION and SCALE database options. This resulted in other numeric expressions in the comparison to be returned with the default precision and scale as well. Now the precision and scale used will be that of the item it is being compared with or of the other operand in an expression. ================(Release Build - Engineering Case #220858)================ The performance counter for unscheduled requests could display negative values. The problem was more likely to occur on multi-processor machines. ================(Release Build - Engineering Case #221031)================ If GETDATA was performed on a set of columns, where the set was not the entire column list, then performance of the GETDATA was very slow. ================(Release Build - Engineering Case #221241)================ A multithreaded java program could have hung when the java thread was sleeping (if the sleep method of java.lang.Thread was called). ================(Release Build - Engineering Case #221244)================ Connecting over TCP, then unplugging the network cable from either side can cause application or engine crashes on NT. ================(Release Build - Engineering Case #221268)================ Using a java rooted expression in a computed column can result in sql error when describing a prepared statement selecting from the table. The problem would have occurred as follows: Create a table with a computed column containing a reference to a java method call. For example CREATE TABLE tttt ( c1 int, c2 int, c3 int compute( myclass.mymethod() ) ), where myclass is an installed class with method mymethod() that returns an integer. In embedded sql, or using odbc, prepare a select statement on the table containing the computed column with at least one parameter marker. For example PREPARE s FROM 'select c1 from ttt where c2 = ?', where c1 and c2 are any columns in ttt. Describe the given prepared statement. The error 'invalid type for field reference' occurs The problem does not occur if the same sort of logic is used through jdbc. ================(Release Build - Engineering Case #221273)================ An "IF UPDATE(column)" statement in a trigger could fail to execute the statements it controls if it was preceded by a statement in the trigger which caused another trigger to fire. ================(Release Build - Engineering Case #221375)================ When querying the DatabaseMetaData for a column of type bigint, unsigned smallint, unsigned int or unsigned bigint, the type name and data type information is always NULL. This has now been fixed. ================(Release Build - Engineering Case #221396)================ (Version 6.0.3) If a client attempts to connect to a server by specifying UseUDP=NO and a server name of 23 characters or more, the server may crash. (Versoin 7.0.0+) If a client attempts to connect to a server by specifying UseUDP=NO and a server name of 40 characters (the maximum server name length), the server may crash. ================(Release Build - Engineering Case #221425)================ Having duplicate aliases in the SELECT list could have caused a server crash. Eg: The following query would cause a server crash: select dummy_col=dummy_col + 1, dummy_col=dummy_col + 2 from DUMMY The error, "Alias 'dummy_col' is not unique" will now be given. ================(Release Build - Engineering Case #221562)================ If a communication port was unable to start, no error was logged to the debug log file indicating why it failed. Now, if debug (client) or -z (server) is enabled, an error is logged indicating why the port was unable to start. The errors logged now include port option parse errors, and ipx dll missing or mismatch errors. Note that if the client app is attempting to connect but the communication port fails to start, the error -100 "Database server not running" is returned to the app. ================(Release Build - Engineering Case #221563)================ There was a slight chance an application could hang on a database request which was cancelled. The problem occurred rarely on a multi-processor machine, and less often on a single processor machine. ================(Release Build - Engineering Case #221565)================ Using UNLOAD TABLE to unload a zero-length binary value would produce a string containing only 0x in the output file. When reloaded, the column would be set to the value '0x' rather than an empty string. ================(Release Build - Engineering Case #221580)================ If a query in a trigger contained equality comparisons which referred to both the old and new values of a column, the query could have produced incorrect results. For example: SELECT t1.id,t2.id FROM T as t1, T as t2 WHERE "old".c1=t1.id AND "new".c1=t2.id would have been treated as: SELECT t2.id,t2.id FROM T as t2 WHERE "new".c1=t2.id ================(Release Build - Engineering Case #221597)================ If a DTC transaction was initiated on a database that had transaction logging disabled, then the engine would crash. An error is now displayed and the DTC transaction is rejected. Logging is required for DTC support. ================(Release Build - Engineering Case #221598)================ After executing either a user defined or system defined remote procedure, (ex. sp_remote_tables), and then issuing a RESUME statement, the engine was likely to crash. ================(Release Build - Engineering Case #221599)================ When retrieving fixed length character data from a non-blank-padded database, the engine would query the status of the TDS_RES_NOSTRIPBLANKS capability and blank pad the data accordingly. Unfortunately this meant that using the retrieved value of the column in a where clause to find the associated row was not possible . The engine will now turn off blank padding at connect time if the database being connected to is a non-blank-padded database. ================(Release Build - Engineering Case #221600)================ Dropping a primary key (unique constraint) implicitly drops all of the foreign keys referencing it. For split key indexes (7.0 and later databases) the index pages for the foreign keys would not be freed. ================(Release Build - Engineering Case #221603)================ The engine schedules checkpoints based on the checkpoint and recovery urgencies. These scheduled checkpoints should take at most a few seconds (usually under 1s) as the engine has time to flush the cache before hand. If many pages are updated (e.g. as a result of inserting many rows into an indexed table) these checkpoints could take much longer than expected [the time taken being proportional to the number of dirty pages] or (7.0 only) stop occuring altogether until a checkpoint was manually issued (or the engine was restarted.) ================(Release Build - Engineering Case #221625)================ Engine may crash if tables used in EXISTS subqueries have articles defined by CREATE PUBLICATION statements. Example: The following CREATE PUBLICATION statement defines an article on table T: CREATE PUBLICATION myPublication ( TABLE T SUBSCRIBE BY (select id from R key join S) ) The following query crashes the engine: Select * from Z where exists (select * from T) ================(Release Build - Engineering Case #221672)================ A query containing several OR'd conditions in the WHERE clause, and/or several IN-lists of constants or variables, could return incorrect results. ================(Release Build - Engineering Case #221689)================ Aggregating queries with no group-by clause should return a single row, regardless of whether there are any rows in the detail of the query. For some queries, the engine could hang if either a) prefetch was turned on, or b) the application performed more than one fetch (e.g. fetch next then fetch first). The following query would demonstrate the problem if prefetch was turned on: SELECT 1 FROM systable, ( SELECT max(systable.table_id) FROM systable) MT(mx) WHERE systable.table_id = mx and mx = 1 ================(Release Build - Engineering Case #221724)================ It was possible for any asynchronous I/O to cause the NetWare database server to hang. More likely if there was a lot of disk activity happening at the same time, for example, when running without a transaction log file. ================(Release Build - Engineering Case #221837)================ English weekday names, (e.g. Monday, Tuesday, ...), for event schedules were not accepted if the server language was non-English. ================(Release Build - Engineering Case #221840)================ No error was reported when an event start date string could not be converted to a date. For example, the following CREATE EVENT statement will now genereate an error: create event errtest schedule start time '15:00' ON ( 'Tuesday', 'Wednesday' ) start date '17 juxx. 00' handler begin return end ================(Release Build - Engineering Case #221917)================ An alias defined in an EXISTS() subquery could cause an erroneous syntax error under the following conditions: (1) the expression for which the alias is defined contains an aggregation function and (2) the alias is used in the HAVING clause of the subquery Example: select * from R where exists( select max(T.X) as A from T having A > 10); ================(Release Build - Engineering Case #222081)================ The engine could have crashed when using/updating a combined key index. For the engine to have crashed, the value being manipulated must have appeared at the end of the last page in the cache and must have been a short (1 or 2 byte) hash [most likely a null value.] ================(Release Build - Engineering Case #222102)================ The engine could have asserted when deleting a foreign key. For this to have occurred, the corresponding primary key must have been deleted prior to the attempt to delete the foreign key and subsequently rolled back. Assertion 200601 (Page for requested record not a table page or record not present on page) was most likely to appear. ================(Release Build - Engineering Case #222270)================ If a connection uses the ASA java support, about 180K of main heap cache overhead is required. If the connection maded a single request that used java, and then the connection makes no further requests, the associated overhead continued to take up space in the heap until the connection is terminated. Now this space is swapped out, freeing cache. ================(Release Build - Engineering Case #222425)================ In some cases, while creating an index on large tables (directly by DDL, or indirectly by the optimizer choosing to build an index on a temporary table), the database server could hang or crash. ================(Release Build - Engineering Case #222456)================ If a database file has a long filename (i.e. > 8.3 characters), or is contained within a directory with a long name, the NetWare server may report "Permission denied" when attempting to start the database. ================(Release Build - Engineering Case #222610)================ When using ODBC, if statement: update t set c = ? (where t is a remote table) was first SQLPrepare'd and then SQLExecute'd, all was well; but, if instead the statement was simply SQLExecDirect'ed, then the engine may have crashed or the column would be set to NULL. Inserting into a remote table with host variables had a similar problem. ================(Release Build - Engineering Case #222676)================ String constants of length 256 to about page_size - 90 in SQL statements could cause incorrect results to be generated. For version 7.x running on NT (but not 95/98/ME) with dynamic cache sizing enabled, a General Protection Fault (GPF) could have been generated, although it would have been extremely unlikely. ================(Release Build - Engineering Case #222894)================ Executing an ALTER TABLE statement, which attempted to add a column with a default value and then modify the column to NOT NULL in the same statement, would cause the server to crash. Attempting to add and modify a column in the same ALTER TABLE statement will now generate the error "ALTER clause conflict". The changes must be made with separate ALTER TABLE statements. ================(Release Build - Engineering Case #222908)================ If more than one transaction was explictly updating an autoincrement column there was a chance that duplicate column values could result. This was more likely to occur on multi-processor machines. ================(Release Build - Engineering Case #223078)================ If an error occurred starting up a port, (e.g. option error, server with that name already running, etc.), the engine could have crashed. ================(Release Build - Engineering Case #223083)================ A sql statement that referenced a column name, prefixed with a correlation name, followed by function parameter brackets would crash the server. For example, 'select t.c( 123 ) from my_table t' where c is a column in table my_table will crash the server. This has been fixed to give an expression error instead. ================(Release Build - Engineering Case #223136)================ If a statement such as: select * from testuser t1, sysusers t2 where t1.name = t2.name was executed, where testuser was a proxy table, then the engine would most likely crash. The query now executes correctly. ================(Release Build - Engineering Case #223212)================ When global variables like @@error or @@version were being used in a query involving remote tables, the global variables would often be passed on to the remote server if the rest of the query could be entirely processed on the remote server. This resulted in syntax errors and other errors depending on the type of remote server being accessed. ================(Release Build - Engineering Case #223273)================ An event handler for the BackupEnd system event could be created but would not fire. ================(Release Build - Engineering Case #223275)================ The java VM needs a minimum of about 1.6M from cache to start. If the maximum cache size (set via the -ch command line switch) is too small, the vm will fail to start. In certain rare situations the vm not only will fail to start, but it will crash the server. This has been fixed. ================(Release Build - Engineering Case #223384)================ If the ASA server for Netware was attempting to return a non-zero return code to the system during shutdown, there was a chance the ASA server would abend. (A non-zero return code would be returned, for example, if the server was shutdown with a user connected, or if the server reached its stop time.) ================(Release Build - Engineering Case #223409)================ Index corruption could *sometimes* occur if ALL of the follow were true: - A table has two foreign keys to the same primary key - The database was initialized with version 6.x or earlier (combined PK/FK indexes were used) - The WAIT_FOR_COMMIT option was used and either foreign rows were inserted before the associated primary row was inserted or the primary row was deleted before the foreign rows referring to it were deleted (ie. the WAIT_FOR_COMMIT OPTION was necessary). The corruption could cause assertion 200601: "Page for requested record not a table page or record not present on page". ================(Release Build - Engineering Case #223493)================ The statement: LOAD TABLE table_name FROM 'filename' DEFAULTS ON when used with a table having a date/time column with a default of CURRENT [DATE | TIMESTAMP] would cause a NULL value to be inserted when a value was not provided in the data file. If the column was defined as NOT NULL, the table would be corrupted. A workaround to allow the table to be loaded is to change the default for the column to DEFAULT TIMESTAMP, load the table, and then restore the default. ================(Release Build - Engineering Case #223612)================ Executing a set-level update trigger could cause random failures if updated table contains a primary key. Failures are also possible if a unique constraint is temporarily violated during the execution of an update (on a table with a primary key), e.g. update t set pk = pk + 1. For the failure to occur, more than approx. page_size/hash_size rows must be updated. A common symptom of this problem is assertion 101412; another is inexplicable fatal database errors (no error.). ================(Release Build - Engineering Case #223692)================ If a table row containing a java object was being read, and the read was aborted before completion, there was a slight chance the server would crash. In order for the crash to occur, the java object must have contained an object whose class implemented the Serializable interface and the method readObject(), or whose class implemented the Externalizable interface. Even in these circumstances, there was only a slight chance the crash would occur. The problem has been fixed. ================(Release Build - Engineering Case #223773)================ OMNI, in general, turns auto commit off and issues begin/commit/rollback transactions. Unfortunately OMNI still turned auto commit off and issued begin/commit/rollback transactions for read only servers as well. As a result, for certain servers (ASE in particular) an error message would be generated when OMNI issued the begin transaction. OMNI no longer turns auto commit off and no longer issues begin/commit/rollback transactions for read only servers. ================(Release Build - Engineering Case #223810)================ Installation of ASA for CE failed if only the MIPS device was selected, giving the error "An error occurred while trying to license the server Licensing of the server FAILED." This has been corrected. A work-around exists, leaving all device types selected during the install. ================(Release Build - Engineering Case #223813)================ When the DELAYED_COMMITS option was enabled and a COMMIT operation was performed, the commit would not be written to the transaction log immediately (as expected); however, the commit was not written within the DELAYED_COMMIT_TIMEOUT setting either. The commit would only be written during a checkpoint, when the current log page was filled by subsequent operations being appended to the log, or if a subsequent non-delayed commit was performed. ================(Release Build - Engineering Case #223816)================ Compound statements in procedures and triggers can be labeled, and the labels can be referenced by a LEAVE statement, causing execution to exit the labeled compound statement. The outermost BEGIN/END block in a procedure or trigger has a default label which is the same as the procedure or trigger name. A LEAVE statement inside a trigger which uses the name of the trigger would cause a crash. ================(Release Build - Engineering Case #223896)================ Upgrading a 5.x or earlier database could create an improperly formatted row in SYSCOLUMN. Prior to 7.0.0.431 and 6.0.3.3009, (see QTS 218322), an assertion failure could result during the upgrade or after the upgrade. With versions 7.0.0.431 and 6.0.3.3009 or later, no problem would be noticed; however, the one row in SYSCOLUMN may still be benignly formatted incorrectly. ================(Release Build - Engineering Case #223921)================ On Unix platforms, (other than Solaris), one or more SYSV semaphores could have been leaked if: - the server was to terminate abnormally (i.e. crash or abort after a fatal assertion), - the client exited without closing all connections and doing the db_fini / SQLFreeEnv After many SYSV semaphores had been leaked, (and there are no free semaphores left on the system), servers would fail to start and/or clients would be unable to connect to servers. With this change, all SYSV semaphores allocated by the server or ASA client software will be destroyed when the program terminates. ================(Release Build - Engineering Case #223924)================ When attempting to update a proxy table joined with a base table as follows: update p_a,a set p_a.c1 = a.c1 (where p_a is a proxy table and a is a base table) the engine would either crash (7.0.0 and up) or return a correlation name not found error (6.0.x). Now the error "attempted to update a non-updatable remote query" is returned, since the above update requires a temporary table, which are not handled with proxy tables. ================(Release Build - Engineering Case #224008)================ When the alter server command was used to change the server class of a remote server, the capablities list was not being dropped at the same time. The server class usually does nothing more than define the capabilities of the remote server hence altering the server class should also alter the capabilities for that server. The capability list now gets dropped when the server class is altered to allow OMNI to recreate the list the next time a connection is made to the remote server. ================(Release Build - Engineering Case #224015)================ Queries with conjuncts involving subqueries and joins defined on primary-key - foreign-key columns may have returned incorrect result sets. For example: the conjunct involving a subquery is "exists ( select 1 from sales_order_items s1 where p.id = s1.prod_id )", the primary key - foreign key join is defined by the conjunct "p.id = s1.prod_id". select s.id from sales_order_items s, product p where exists ( select 1 from sales_order_items s1 where p.id = s1.prod_id ) union all select 1 ================(Release Build - Engineering Case #224043)================ If a java object is read from a java typed column, and the error JAVA_DESERIALIZATION_ERROR occurs (sqlstate ww018, sqlcode -663) then a memory leak proportional to the size of the object could occur. The memory is recovered when the connection making the request disconnects. ================(Release Build - Engineering Case #224045)================ If two views, accessing the same proxy table with the same correlation name, were used in a query that was to be executed in partial passthrough or no passthrough mode, then the message: "Column 'expr_?' found in more than one table -- need a correlation name where ? is a positive integer was displayed. ================(Release Build - Engineering Case #224046)================ Executing more than one RAISERROR for the same message number within one stored procedure call would cause assertion 100503. The message number must correspond to a message in SYSMESSAGES for the problem to have occurred. ================(Release Build - Engineering Case #224047)================ An event handler for ConnectFailed had no way to determine the userid that was used with the attempted connection, since event_parameter('user') returned NULL. It will now return the userid. ================(Release Build - Engineering Case #224048)================ If several developers were modifying and testing procedures using a single development database, an attempt to ALTER or DROP a procedure that was being used by someone else would not identify who was using the procedure. The error will now include the name of the user. ================(Release Build - Engineering Case #224106)================ When attempting to update a base table joined with a proxy table as follows: update a,p_a set a.c1 = p_a.c1 where a.c2 = p_a.c2 where p_a is a proxy table and a is a base table the engine would end up setting all of the affected c1 columns to null. Now you get an attempted to update a non-updatable remote query error, which is the correct error message since the above update requires a temporary table to be involved and we do not handle temp tables with proxy tables. ================(Release Build - Engineering Case #224109)================ Prior to this change, sending a SIGTERM or SIGQUIT signal to the server process would cause the server to terminate abruptly and generate a core file. The server now handles SIGTERM and SIGQUIT signals in the same way that it handles SIGINT and SIGHUP - it catches the signal and will shutdown the server cleanly. Note that the preferred method to shutting down a server is by using the dbstop utility, or by pressing 'q' on the server console. ================(Release Build - Engineering Case #224216)================ When trying to delete or add a column to a dba-owned table from a user account with dba authority, an error message was reported. This is now possible. ================(Release Build - Engineering Case #224425)================ It was not possible to load both dbsrv6.nlm and dbsrv7.nlm on the same NetWare server at the same time. This was due to a Netware restriction that no two NLMs can export a symbol with the same name. The fix was to change the name of the symbols exported by dbsrv7.nlm. This has the side effect that any applications connecting to the server via shared memory, ie dbisql.nlm or dbremote.nlm, will require a new dblib7.nlm as well ================(Release Build - Engineering Case #224460)================ Queries with group by views in a subquery may have performance degradation comparing to same queries run with a 5.x ASA version. For the problem to occur, an equality conjunct between a view column and a base table column had to be defined in the query. Example: create view V( X , Y) as ( select s.prod_id, s.line_id from sales_order_items s group by s.prod_id, s.line_id ); select size, count(*) from product p where exists ( select 1 from V where V.x = p.id ) group by size ================(Release Build - Engineering Case #224493)================ Fetching and then retrieving column data using GetData, with a data size of greater than 300 bytes, would give poor performance. ================(Release Build - Engineering Case #224645)================ When the ASA database java support was used, the ASA server may have crashed in the java vm while loading a java class if the server did not have enough free cache available to load the class. The work-around was to ensure there was enough cache when loading a class. With the new dynamic cache resizing, this problem will not occur unless the cache cannot be resized any larger. ================(Release Build - Engineering Case #224782)================ At isolation levels 1 & 2 reading a row from a table T would result in an intent lock being placed on [the rows of] T preventing other connections from successfully issuing "lock table T in share mode". Conversely, issuing a "lock table T in share mode" would block transactions from reading rows from T at isolation levels 1 & 2. ================(Release Build - Engineering Case #224818)================ Occasional database server crashes may have occurred when an Omni connection was dropped. ================(Release Build - Engineering Case #224911)================ Fetching a large number of rows in 7.0.1 could take longer than in earlier versions, depending on the datatypes of the values fetched. ================(Release Build - Engineering Case #224923)================ Adding a foreign key constraint to a large, (relative to cache size), table in a 7.x format database could have caused the engine to fault. This was more likely to appear on NT, non-NT Win32 and Unix multi-processor platforms. ================(Release Build - Engineering Case #224927)================ If the query generating the result set for a stored procedure contained an alias in the SELECT list, and the procedure was called simultaneously by several connections, the wrong name could be returned for the aliased column. The name returned would be the expression associated with the alias. Once this problem happened, it would continue to happen until the database was shut down or the procedure was recompiled. The problem would be more likely to occur on multi-processor machines. It is fixedby this change, but a possible workaround may be to ensure that the ODBC datasource describe cursor behavior is defined as "if required" or "never". ================(Release Build - Engineering Case #224966)================ References to new or old values in a trigger could have caused a crash. For example, the following script would have caused the server to crash: drop table t1; CREATE TABLE DBA.t1 (id integer NOT NULL, f integer NULL, PRIMARY KEY (id)); create trigger dba.tI_t1 after insert on dba.t1 referencing new as inserted for each row begin declare @f integer; set @f=1; if exists (select * from t1 where id=inserted.id) then message 'This works well' end if; if exists (select * from t1 where f=@f) then message 'This works as well' end if; if exists (select * from t1 where id=inserted.id and f = @f) then message 'this would crash' end if end; insert into t1 values(1,1); The crash would occur if all of the following were true: - the trigger contained a query which compared a column in the table to a "new" or "old" value - the column reference was not qualified with a correlation name - there was some other ANDed comparison in the WHERE clause ================(Release Build - Engineering Case #224997)================ CREATE VIEW with a query containing a derived table would give the error "More than one table identified as " Example: The following view definition would fail when executed on the ASADEMO database: create view vv as select stuff.region, e.emp_lname from employee e left outer join (select sales_rep, region from sales_order where order_date < '2000-01-01') as stuff(sales_rep, region) on e.emp_id = stuff.sales_rep ================(Release Build - Engineering Case #225013)================ The assertions 105201 and 105202 were not very useful, as each was used to indicate two different events. Assertion 105201 could have either indicated "Unexpected invalid java native handle" or "CE corruption check failed on page 1 write". Assertion 105202 could have either indicated "Java native handle exhausted" or "CE corruption check failed on page 0 write". In the fixed versions, both assertions were removed and replaced such that the java handle problem assertions have been replaced by 105500 and 105501, and the ce problem assertions have been replaced by 105204 and 105205. ================(Release Build - Engineering Case #225034)================ A BEFORE DELETE trigger could modify/delete the row which caused the trigger to fire. This could have caused engine GPFs, invalid redo log entries, (esp. if no primary key was defined, or replication is involved), and other anomalies. For example, if a BEFORE DELETE trigger updated an indexed column a row not found in index error message would have been generated. ================(Release Build - Engineering Case #225050)================ The following event would fire successfully for the first day, then fail to fire the following day: CREATE EVENT test_event SCHEDULE test_sched START TIME '00:21' EVERY 2 HOURS HANDLER BEGIN MESSAGE 'Test message' END As a workaround, change the START TIME clause to: BETWEEN '00:21' AND '22:00' EVERY 2 HOURS (Note that with this change the event will not be fired at 22:21. The last time for the event will be 20:21.) ================(Release Build - Engineering Case #225053)================ If a table t couldn't be accessed during annotation because user u had the table exclusively locked the message returned would have been "User 't' has the row in '???' locked", not "User 'u' has the row in 't' locked". ================(Release Build - Engineering Case #225195)================ Certicom's MobileTrust CA/RA has issued a new (and smaller) root certificate that should be used for new server certificates. The Certicom MobileTrust CA/RA will still issue certificates from the old root if that is preferred. ================(Release Build - Engineering Case #225425)================ When executing queries containing a LIKE predicate in the ON condition of an outer join, the server could crash if the LIKE predicate only referenced the null-supplying side of the outer join. The crash was more likely to occur on 64 bit platforms. ================(Release Build - Engineering Case #225560)================ A query with a FROM clause containing two tables of size 327680, (0x50000), rows each could have crashed the engine. A join predicate of the form "column = column" between the two tables had to be specified in the WHERE clause or a ON clause of the query. ================(Release Build - Engineering Case #225583)================ A corrupt index could have been generated or incorrect result sets returned if all of the following conditions applied: 1. A row in the table required a row extension other than a stub for a relocated row. (i.e. the row is longer than one page in length, excluding string extensions) 2. An index was defined to refer to a column in a row extension 3. The indexed column was NOT hashed in the index 4. All columns in the row extension preceding the indexed column were fixed-length columns, (or the indexed column was the first column in the row extension). ================(Release Build - Engineering Case #225633)================ The values displayed by Performance Monitor for Procedure_Pages, Trigger_Pages and View_Pages were incorrect. ================(Release Build - Engineering Case #225635)================ New server capabilities have been added to allow queries involving proxy tables, with either the char_length or replace function, to be passed on to the remote server instead of being handled in no passthrough mode. Note that the replace function capability is only available in 7.0.0 and up. ================(Release Build - Engineering Case #225693)================ If a Win32 server was licensed for a certain number of concurrent connections, that limit could be exceeded if the connection were by IPX connections. ================(Release Build - Engineering Case #226008)================ If permissions on a table were granted by more than one user, only permissions granted by one of the users were being used. The following query can be used to find cases where this was a problem: select stable_id,grantee, (select table_name from SYSTABLE where table_id=stable_id), from SYSTABLEPERM group by stable_id,grantee having count(*)>1 Although it is now fixed, a workaround is to grant permissions for each table from only one user. ================(Release Build - Engineering Case #226044)================ If a TDS 4.2 client attempted a connection to the server, the server may have crashed while processing the login request. ================(Release Build - Engineering Case #226121)================ Queries on views for which check options/articles are defined for tables used in the views may generate a syntax error. ================(Release Build - Engineering Case #226189)================ If a TDS client connected with the packet size parameter set to a value greater than the default value of 512 bytes, then subsequent requests to get data could result in protocol errors. The packet size is now restricted to 512 bytes (or lower). ================(Release Build - Engineering Case #226190)================ Executing the statement: update DBA.MyTable set MyColumn=111 where tsequal(DBA.MyTable.other,'2000/10/31 23:59:59.999') would result in procedure 'DBA' not found While fixed, a workaround is to not qualify the column with the table and owner name, or enclose the reserved word identifier in double quotes. ================(Release Build - Engineering Case #226316)================ Sometimes a fatal error in the ASA server running on Netware, would cause the ASA server to hang ================(Release Build - Engineering Case #226472)================ A JDBC connection to a remote server, (via Remote Data Access), may have hung on a command that caused a sql error. Other connections to the engine were not affected. ================(Release Build - Engineering Case #226502)================ When the DatabaseMetaData.getColumnSize method is used to obtain the "column size" of either a smallint or int column, the value returned is 2 or 4 (respectively). For fixed data types the column size should be the precision of the data type and not the storage size. Other fixed data types (ex. bit, bigint, unsigned int, ...) properly returned the precision when the column size is queried. The smallint and int "column size" is now 5 and 10 respectively. ================(Release Build - Engineering Case #226529)================ It the statement - print 'var1 = %1!, var2 = %2!', var1, var2 - was executed over a TDS connection, then the resulting print statement was: var1 = %1!, var2 = %2!. The %nn! placeholders were being replaced with the appropriate value for non-TDS connections only. ================(Release Build - Engineering Case #226544)================ Doing a fetch for update relative 0 would not add write lock to the current row, if positioned on a row. ================(Release Build - Engineering Case #226728)================ When upgrading a database, the jcatalog.sql script was only being run if an upgrade was actually required; however, some of the changes in the script need to be made to current databases as well. As a result, jcatalog.sql will now always be run regardless of an upgrade being necessary or not. Note that if the jconnect off option is selected for the upgrade, then the jcatalog.sql script will not be run as expected. ================(Release Build - Engineering Case #226851)================ To reflect changes made to certain Asian character sets, the double-byte ranges for some collations have changed. 936ZHO Double-bytes from 0x81-FE are now recognized, was 0xA1-FE. This collation now supports the "GBK" Chinese character set. 950TWN Double-bytes from 0x81-FE are now recognized, was 0xA1-FE. 932JPN Double-bytes from 0x81-9F and 0xE0-FC are now recognized, was 0x81-9F, 0xE0-EF. ================(Release Build - Engineering Case #226942)================ The -u switch was silently ignored in 6.0.02 - 6.0.04 on all platforms, and in 7.0 - 8.0 on Unix. By default [on platforms that support it], the engine avoids using the file system cache: all I/Os go directly to disk. The -u switch disables this feature. If the database is much larger than physical memory, using direct I/O almost always gives better performance [cf. QTS 213193]. However, on some Unix platforms for small [relative to physical memory] databases, using buffered I/O will give better performance. This is especially true for 6.0.x Unix engines where dynamic cache growth is not very aggressive. ================(Release Build - Engineering Case #226950)================ The 1.1.6 JRE would core dump after loading the odbc driver. Client applications that install signal handlers and relay on signal context information may core dump on a signal.This was a problem on Unix platforms only ================(Release Build - Engineering Case #227143)================ If an index was defined with duplicated columns, a query over the corresponding table could result in the server reaching 100% CPU. ================(Release Build - Engineering Case #227179)================ When using the DTC support in ASA, enlisting a DTC transaction results in a handle leak. The handles are not returned to the system even after the connection is closed. Rather, the handles are only returned when the server is shut down. This bug fix "reduces" the handle leak but does not completely eliminate the problem.There is still a handle leak, but it seems to be in the MS DTC support and results primarily from a transaction abort (rollback) rather than a transaction commit. ================(Release Build - Engineering Case #227247)================ Inserting values into a foreign table could have failed with a spurious key constraint violation err, (eg primary key not found), if the foreign and corresponding primary key hash sizes differed. ================(Release Build - Engineering Case #227249)================ The engine could have crashed after a Drop Connection command, if a NamedPipes connection was being dropped. With version 7.0.1 EBF 1110 or higher, it was possible for the engine to crash on 'dbstop -c "uid=...; pwd=...; links=namedpipes; eng=..."' ================(Release Build - Engineering Case #227250)================ The statement DROP CONNECTION 0, would crash the engine ================(Release Build - Engineering Case #227251)================ Isolation level 3 scans could have seen a deleted row if it was the first row visited. ================(Release Build - Engineering Case #227253)================ Altering an event to change its definition, while its handler was running, could have crashed the server. Altering to enable or disable the event did not cause problems. A workaround for the problem is to disable the event, wait for its handler to complete, then make the desired change and re-enable the event. An error is now reported if ALTER EVENT is executed when the handler for the event is active. ================(Release Build - Engineering Case #227258)================ Results from DatabaseMetadata would vanish after commit. This problem was common for both server-side jdbc or jConnect clients. ================(Release Build - Engineering Case #227260)================ If the get methods of the resultset was called before the resultset was positioned on a row, the get method would return garbage values. With this fix, the get methods will return NULL on object calls and 0 on primitives, the wasNull() method will also return true. ================(Release Build - Engineering Case #227263)================ If an invalid isolation level was set through Connection.setTransactionIsolation(), the database would not change the isolation level, but the jdbc connection object would use the incorrect value. Subsequent getTransactionIsolation method would report the incorrect value. ================(Release Build - Engineering Case #227538)================ A SELECT, UPDATE or INSERT statement containing subqueries, for which a predicate "primary key = foreign key" was specified, might have erroneously returned the error, SQLE_NON_UPDATABLE_VIEW (SQLCODE -192) , when an update or positioned update was attempted. ================(Release Build - Engineering Case #227597)================ Server could have crashed when loading a table. For this to have occurred, the table must have had a foreign key referencing a table that was concurrently being altered (or was locked in exclusive mode.) ================(Release Build - Engineering Case #227665)================ Calling an internal stored procedure more than 65536 times from one connection would have caused the server to report "I/O Error Fatal error: Unknown Device Error" or "I/O Error Fatal error: No such file or directory". Examples of internal procedures include sa_audit_string, sa_server_option, and procedures used by the procedure debugger. ================(Release Build - Engineering Case #227668)================ If an event handler was running when an attempt was made to stop the database on which the event is defined, the server would wait until the handler completed. If the handler did not complete, the server would wait indefinitely and the database would not have shut down. The server will now wait up to 5 seconds for all handlers to complete and then will stop the database. ================(Release Build - Engineering Case #227673)================ When a server-side JDBC Statement executed a batch, that contained multiple interleaving insert/update statements and select statements, and getUpdateCount() was called, (after getMoreResults() to step through the result sets associated with each select statement), it return TRUE. The problem was that the engine was returning the rowcount of the last insert or update statement., rather than the correct value of -1. ================(Release Build - Engineering Case #227674)================ The server could erroneously drop tautological conditions in a Where clause when it was unsafe to do so. Example:Suppose we have a table foo(a int, b int) with the 2 rows a b ----------------- 1 2 NULL 6 The query Select * from foo where a = a would incorrectly return both rows. The correct result should only contain the first row, since for the 2nd row the predicate, NULL = NULL, will evaluate to UNKNOWN, which is interpreted as FALSE. ================(Release Build - Engineering Case #227697)================ The engine/server would not start on Unix machines which had 4GB RAM installed. The message: Memory not available - cache size set to 0K Not enough memory would be displayed. A side-effect of this fix is that an engine/server running on Unix cannot have a cache size larger than 4GB. ================(Release Build - Engineering Case #227868)================ User tables created by the DBO user were not being populated with data when being unloaded or extracted using the -an or -ac switch. ================(Release Build - Engineering Case #228055)================ If database name contained spaces, dbspawn would complain: DBSPAWN ERROR: -84 -- Specified database is invalid. For example, prior to this fix you could not run: dbspawn dbeng6 "c:\Program Files\Sybase\Adaptive Server Anywhere 6.0\asademo.db" or: dbspawn dbeng6 "%ASANY6%\asademo.db" ================(Release Build - Engineering Case #228074)================ If a DDL statement was executed at the same time as other transactions on a database that does not use a transaction log, the server could hang. ================(Release Build - Engineering Case #228229)================ In some cases, a natural join of two tables would fail if the column names were the same but for case. In databases utilizing double-byte character sets, it was likely that the server would fail to match column names. Example: Table R has columns (aa, bb); table S has columns (AA, BB). The Select statement Select * from R Natural Join (Select * from S) as V would fail with a syntax error "no way to join table R and table S", though the statements Select * from R Natural Join (Select * from S) as V(aa,bb) Select * from R Natural Join S would succeed. ================(Release Build - Engineering Case #228343)================ The server might have crashed or sent a garbage message if charset conversion tables could not be found because: -- .uct files in charset\unicode have been removed or corrupted, or -- the full path names of these .uct files contain multibyte characters These tables are needed if the character set of the database is different from the character set of the server's language resource, (which is determined by the language setting on from the operating system). For example, a Japanese NT4.0 system with a SJIS or SJIS2 database. ( Both SJIS and SJIS2 are subsets of the default CP932 character set). The server would crash if you have NT Service Pack 4, (crashes occur less frequently with Service Pack 5). ================(Release Build - Engineering Case #228358)================ If a database file running on NetWare grew to 4GB, it would be truncated before the server returned a fatal error. The server will now return a fatal error complaining that the dbspace had reached its maximum size. ================(Release Build - Engineering Case #228359)================ An expected JDBC SQLException may not have been thrown when using server side JDBC. ================(Release Build - Engineering Case #228527)================ If the update statement was used to update a java-typed column's field's field, a conversion error may have been reported. For example: "update myTable set myJavaColumn.javaField.javaField = 123", may have failed. The problem would not have occurred if the class of the javaField was the same class or super class of the class of myJavaColumn. ================(Release Build - Engineering Case #228580)================ If the table_name parameter of the system procedure sa_locks() specified a non-existent table owner, the database server would have crashed. ================(Release Build - Engineering Case #228969)================ A DYNAMIC query whose result set is restricted through the use of TOP N syntax could suffer from poor performance if any of the tables referenced in the query are being concurrently updated. Previously, the semantics of TOP N were to treat each FETCH RELATIVE request as an ABSOLUTE fetch, to guarantee that the application could not go beyond the limits of the "window" of the result set formed through the specification of TOP N. However, by dynamically changing a RELATIVE fetch request into an ABSOLUTE request, the engine could be forced to recompute some portion of the result if any underlying table data had been modified. As of this modification, the semantics of TOP N for DYNAMIC cursors has been changed so that instead of a "window" of result rows, TOP N specifies a "high water mark" of the Nth row in the result set, which cannot be exceeded. The difference in semantics is subtle; to illustrate, suppose we have the query Select TOP 5 * from product order by product.id over the product table in the ASADEMO database. Further suppose that the application is now positioned on the 5th row of the result, and is about to perform a FETCH RELATIVE -4 to re-retrieve the first row when another connection inserts a row with id "1", so that it is the smallest product identifier in the product table. Under the existing semantics of TOP N, the FETCH RELATIVE request will be interpreted as a FETCH ABSOLUTE 1, and the newly-inserted row will be returned to the application. Under the new semantics, the engine will reverse 4 rows as it would for any other DYNAMIC cursor, and return what was the first row of the cursor prior to the insert (product ID 300). With these new semantics, any ABSOLUTE fetch, or error condition that stems from a result of scrolling too far forwards or backwards in the result set, will "reset" the cursor's high-water mark, and the application may (or may not) see the same rows it did previously, depending exactly on which (if any) rows have been updated/inserted/deleted and if those rows affect the access path chosen by the optimizer for this query. Note that the semantics of TOP N for SCROLL or INSENSITIVE cursors remains unchanged; since their result sets are "fixed" for each result row retrieved, the above problem cannot occur. ================(Release Build - Engineering Case #228986)================ Executing a statement such as "ALTER TABLE t1 ADD newcol int DEFAULT 'string' " where the default value was not appropriate for the domain of the new column, caused a table description corresponding to the ALTERed table to be written to the log, (even though the ALTER did not complete successfully). DBTRAN would still be able to read the log correctly; however, recovery from backup, (using '-a' to apply the log), could cause the engine to report that the log is invalid or, in some cases, ignore the rest of the log beyond the failed ALTER. ================(Release Build - Engineering Case #229236)================ The estimate() function has one mandatory and two optional arguments. If the function was invoked with the mandatory argument only, the engine may have crashed. ================(Release Build - Engineering Case #229250)================ The property('Platform') function would return "WindowsNT" or "Windows95", when the server was running on Windows 2000 or Windows ME respectively. On 6.x, a server running on Windows98 would return "Windows95". ================(Release Build - Engineering Case #229431)================ Prior to this fix, queries of views with DISTINCT, Group By or Union views in the FROM clause and subqueries in the WHERE clause might return incorrect result set. . For example: Given following view: create view V ( select id from product p union all select id from product p1); the following query returns 6 rows before the fix and 11 rows after: select p2.size, V.id from product p2, V where p2.size = 'One size fits all' and V.id = 300 and exists( select prod_id from sales_order_items s where p2.id > 0) union all select 'null', 1 ================(Release Build - Engineering Case #230423)================ On a CHECKPOINT or shutdown, the ASA server would erroneously delete all join selectivity estimates on all tables currently loaded, including system tables. Subsequent queries could suffer from poor performance due to poor plan choices using the default values, until enough queries were run to repopulate the statistics registry. However, with a default checkpoint frequency of 30 minutes, it was quite likely that users would see performance problems throughout the period that the server was running. ****************************** ** Adaptive Server Anywhere ** ** ** ** Sybase Central Plug-in ** ****************************** ================(Release Build - Engineering Case #219445)================ Entering a server commandline longer than 255 characters in the service configuration parameters box would cause a crash. ================(Release Build - Engineering Case #225641)================ dbxtract was only adding 'CREATE DBSPACE' entries to the reload.sql file for thse dbspaces which had tables that were being unloaded as part of the extract. It did not add 'CREATE DBSPACE' statements for any indices that were extracted. ================(Release Build - Engineering Case #216782)================ Using the table editor, if an existing column was deleted that was in the primary key, it would cause an error when the table was saved. ================(Release Build - Engineering Case #216783)================ The Table Properties Misc tab looked like it had editable fields, but they were for display only. They now appear using the normal background color, so that they don't look like they can be edited. ================(Release Build - Engineering Case #220611)================ The restore wizard can only restore archive backups - not image backups. The first page of the Restore wizard now explains this and if an image file (.db file extension) is chosen on page 3 of the wizard, a warning message is displayed. In 7.0.1 English, the wizard page change and the warning message are present. For other languages, only the warning message appears (in English). For 7.0.2 and up, the wizard change and the warning are both present and translated into each supported language. ================(Release Build - Engineering Case #221452)================ On non-English machines, dbisql error messages relating to starting up engines may have been mangled if they contained accented characters. ================(Release Build - Engineering Case #221530)================ Creating a procedure for another user would show an error dialog - this has been fixed. ================(Release Build - Engineering Case #221566)================ Enable/disable checkbox in Event properties dialog was not updating the database properly. This has now been fixed. ================(Release Build - Engineering Case #221570)================ Database object filtering wasn't filtering the objects properly. This has now been fixed. ================(Release Build - Engineering Case #221585)================ Opening the Properties of a SQL Remote Publication, and clicking on the Articles tab, the Tables tab panel had two fields truncated on the left. Also, the two listboxes were too narrow, causing titles to be truncated. The dialog has been made wider, so both of these problems are now resolved. ================(Release Build - Engineering Case #221587)================ If an error occurred creating a publication, a cryptic error message was displayed. The error message has been replaced. ================(Release Build - Engineering Case #221605)================ The Subscribe For dialog displayed by right-clicking on a publication contains truncated text in non-English versions. This has been corrected. ================(Release Build - Engineering Case #221710)================ After making a change to a procedure or function, an explicitly refresh had to be done to update viewer list.The viewer now refreshes the procedure list properly. ================(Release Build - Engineering Case #221711)================ Attempting to delete both a user and group in one operation would have caused an error. ================(Release Build - Engineering Case #221714)================ Membership list now shows the proper comment for all groups. ================(Release Build - Engineering Case #221716)================ Publisher status is now revoked before deleting a user so that the database does not think the deleted user is the publisher. ================(Release Build - Engineering Case #221774)================ The "all connected users" folder was showing connections duplicated. This no longer happens. ================(Release Build - Engineering Case #221776)================ Creating a remote procedure (CREATE PROCEDURE ... AT '...') would fail when using the "Remote Procedure" wizard. This has been corrected. ================(Release Build - Engineering Case #221844)================ On non-English machines or running in a non-English locale, the Create Event wizard for scheduled events created dates in a format that the server could not understand, resulting in an error. The general date format of yyyy-mm-dd is now used to create events. ================(Release Build - Engineering Case #223133)================ The Properties toolbar button was not enabled for server, database, and synchronization templates. ================(Release Build - Engineering Case #223553)================ The wizard for creating procedures and functions had truncated strings. These have been corrected. ================(Release Build - Engineering Case #223557)================ The dialog used to display the domain properties contains truncated text fields in non-English languages. In particular "Allow nulls" field would get truncated. The dialog has been resized. ================(Release Build - Engineering Case #223559)================ In the French software, in the Users&Groups folder, the "Set Remote..." right-click menu item leads to the Set Remote User dialog that appears with the first text field truncated, and the text field that contains the user name is too far to the left. These have been corrected. ================(Release Build - Engineering Case #223790)================ If a null java object was returned from the engine, the TDS layer would not send out the 0 length for the object and would end up causing a TDS protocol error. ================(Release Build - Engineering Case #223972)================ The help button on the Copy Table diaglog is not needed and now does not appear.. ================(Release Build - Engineering Case #224373)================ When the packages folder was refreshed, it did not show all of it's items. This has been fixed. ================(Release Build - Engineering Case #224374)================ If the "log SQL statements" window was left open after a connection was closed and then the log window itself closed, an exception error was reported. This is no longer the case. ================(Release Build - Engineering Case #227254)================ Right-clicking an event, then selecting Trigger.. to trigger it and specifying no parameters in the Event Parameters dialog, would do nothing. The event is now triggered. ================(Release Build - Engineering Case #228230)================ Creating a row-level update trigger that fires on a SQL Remote conflict, would result in an editor window opening with incorrect SQL syntax (two END's in the SQL statement). This has been fixed. ================(Release Build - Engineering Case #228837)================ DBSpace properties showed uniqueness constraints in it's index list. Consequently, trying to show properties on a uniqueness constraint would throw an exception. Uniqueness constraints are no longer listed as indexes for a given dbspace. ================(Release Build - Engineering Case #230937)================ When a domain was created with a check constraint containing an '@' character (to reference the value being put into the domain), the '@' was changed into a ':' (colon). This has been fixed. ================(Release Build - Engineering Case #231330)================ After logging SQL statements for a database and then choosing to stop logging SQL statements, (via the context menu), an exception was being thrown. This has been fixed. ================(Release Build - Engineering Case #231351)================ Using the Ultralite statement wizard would fail if the statement contained single quotes. This has been fixed. A work-around existed, the user had to double the single quotes when typing the statement ================(Release Build - Engineering Case #231397)================ The Java edition of DBISQL and Sybase Central would corrupt characters on operating systems that were not using cp1252, such as Polish and Russian. These languages are now properly supported. ****************************** ** Adaptive Server Anywhere ** ** ** ** Utilities ** ****************************** ================(Release Build - Engineering Case #219877)================ The sp_jdbc_getindexinfo(...) function returned an incorrect result set if a table had multiple indices. It could also return the incorrect ordinal_position and ordering (ie. ASC or DESC) of columns for indices with multiple columns. ================(Release Build - Engineering Case #222599)================ Upgrading a 5.5 database involved in rep. server replication to 7.0 and then unloading the database would unload the schema and data for the rs_* tables, when only the data was necessary. The resulting reload.sql would cause a 'table rs_lastcommit already exists' error when run against a new empty database. ================(Release Build - Engineering Case #224930)================ If DBStop failed to stop a running engine/server, it still would sometimes return SUCCESS. ================(Release Build - Engineering Case #197418)================ By setting the delete_old_logs option to 'Delay', dbremote will delete old log files, but not log files whose name (i.e. 00080900.log) matches today's date (August 9th, 2000). ================(Release Build - Engineering Case #215723)================ The following bugs related to processing INPUT statements have been fixed: 1. DBISQL did not allow quoted identifiers to start with anything other than letters. 2. The INPUT statement did not allow quoted identifiers for the table/owner name. 3. When importing data, values were not actually inserted into the table if the table name did not start with a letter or was an identifier. 4. DBISQL would crash on exit after executing an INPUT statement with the PROMPT option. 5. When executing the INPUT statement with the PROMPT option, if the data cannot be inserted into the table, the error message is now shown to the user. Previously, it was not. ================(Release Build - Engineering Case #216661)================ DBCOLLAT -d would create invalid INSERT statements when processing a custom collation with an apostrophe (single quote) in the collation name, because the apostrophe was not doubled inside the quotes for the values. As a result, the custom collation would cause an error when a database was created using the collation. This has been corrected. ================(Release Build - Engineering Case #218550)================ Sybase Central creates services with both an internal service name of the form "ASANY?_xxx" and a display name of the form "Adaptive Server Anywhere - xxx". When the SC command is used, the optional display name is not specified and it then defaults to "ASANY?_xxx". The code in the Sybase Central "Add Service" wizard assumed that all ASANY services had a display name of the form "Adaptive Server Anywhere - xxx" and created a poorly-formed substring that resulted in an "out-of-memory" error. The wizard now handles both cases. ================(Release Build - Engineering Case #219925)================ When using the dbinit and dbupgrad command line utilities, the -q (quiet) switch did not prevent messages from being displayed. This switch now works as documented. ================(Release Build - Engineering Case #220661)================ The software now performs parameter substitution within single quoted strings (same as DBISQLC). For example, you can once again successfully execute a .SQL file which contains: PARAMETERS value; SELECT * FROM customer WHERE lname = '{value}' by executing the following ISQL statement: READ test.sql Robert Previously, the SELECT statement would return no rows because it would be comparing the "lname" values to the literal string "{value}". ================(Release Build - Engineering Case #220694)================ If the user locked the keyboard, and then entered an invalid password when trying to unlock the keyboard, the message displayed was "Passwords don't match ... keyboard remains unlocked". It has now been corrected to read "... remains locked." ================(Release Build - Engineering Case #220905)================ Fixed the way BLOB data types were handled by ISQL: Changed the way ISQL retrieved BLOB data to be compatible with the JDBC-ODBC bridge. Previously, if you tried to display data in a table that contained BLOB columns, no rows would be displayed (at all). Ensured that the software retrieves only as much BLOB data as it needs to display the BLOB value. Previously, the amount of data fetched was driver-dependent (i.e. unknown). Note that because of limitations of the JDBC-ODBC bridge, null BLOB values are rendered as empty cells in the result table, rather than "(NULL)". Workaround: Use jConnect rather than the JDBC-ODBC bridge. ================(Release Build - Engineering Case #221364)================ Previously, the scale on NUMERIC values was not being respected when the values were displayed in the results table. For example, the result of the statement SELECT CAST( 1.2 AS NUMERIC( 5,2 ) ) was displayed as 1.2 rather than 1.20. Also, large precision numeric values were being displayed with rounding error. For example, SELECT 111111111111111111 was being displayed as 111,111,111,111,111,104 instead of 111111111111111111. Both of these problems have been fixed. Note that the (localized) thousands separators and decimal point character are no longer displayed for these kinds of numbers. This is the same behavior as the ASA 6.0 version of DBISQL. ================(Release Build - Engineering Case #221432)================ The DBCompress function in dbtools always returned 0 (success) to the application even when a different return code was necessary. ================(Release Build - Engineering Case #221458)================ The software used to throw an ArrayIndexOutOfBounds exception if the results table was empty (no column names and no rows), and you clicked on the "Messages" field, pressed TAB, then a letter (e.g. "S"). Now it doesn't. ================(Release Build - Engineering Case #221568)================ dbunload could crash when unloading a database that doesn't support variable hash sizes (pre-7.0.) ================(Release Build - Engineering Case #221572)================ If a database contained proxy or IQ tables, calling sa_validate with a tbl_name of NULL would fail with "Validate Table statement must refer to a base table". Note, the fix required a change to the script sybprc50.sql, so only databases created or upgraded after installing new script files will work correctly. ================(Release Build - Engineering Case #221573)================ When executing SET statements containing CASE expressions, ISQL could enter an endless loop. For example, executing the following statements would hang ISQL: create variable v1 int; create variable v2 int; set v1=1; set v2 = case when( v1 =1 ) then 0 else 1 end; ================(Release Build - Engineering Case #221574)================ When unloading and reloading a database, a column of type VARBINARY(integer) was being converted to type VARBINARY. This resulted in the column being treated as VARBINARY(1), and so, all data after the first digit was lost. This fix now maintains the correct length of the column. ================(Release Build - Engineering Case #221594)================ Previously, if you entered a bad ISQL statement, the error message dialog could show the statement which was executed before the bad one. Now the correct statement is shown in the error dialog. ================(Release Build - Engineering Case #221595)================ Previously, the Import Wizard failed if you told it to create a new table, and that table name contained one or more blanks. You would get the message "Could not create table" when you pressed the "Finish" button on the wizard. The wizard now allows table names with embedded blanks. ================(Release Build - Engineering Case #221596)================ Previously, the keyboard accelerators for "Connect" (F11) and "Disconnect" (F12) would not fire if their corresponding menu items were disabled when the "SQL" menu was last opened. ================(Release Build - Engineering Case #221602)================ Enclosing the argument to the -datasource command line parameter in quotation marks would prevent the Java version of dbisql from being able to connect to the database. The quotation marks, (if present), are now stripped. ================(Release Build - Engineering Case #222109)================ Connecting to a database which used a different character set from the one used on the client workstation, would have caused an unhandled exception to be thrown, (with a message that the class "CharLangWarning" was not found). The problem affected the Java versions of Sybase Central and dbisql, and the Procedure Debugger. ================(Release Build - Engineering Case #222208)================ Rep Agent (DBLTM) would not delete backup mirror logs when the database option, DELETE_OLD_LOGS is ON. ================(Release Build - Engineering Case #222268)================ If a java object A, whose class implements the java.io.Serializable interface, contains a non-static non-transient reference to at least one other java object B whose class does not implement the Serializable interface, then the java object A is not transportable client/server. This would also imply that a table containing the object could not be unloaded. This incorrect behaviour has been fixed. ================(Release Build - Engineering Case #222905)================ The output file generated when using the ">&" operator after a SQL statement included two copies of the plan and execution times. Now the file includes only one. ================(Release Build - Engineering Case #222906)================ Changing the "Maximum number of rows to display" setting in the "Options" dialog did not take effect unless the "Make Permanent" button on the dialog was clicked and a new connection was opened. Now the setting takes effect right away without having to make the change permanent or opening a new connection. ================(Release Build - Engineering Case #222909)================ Previously, when connected to a database using the jConnect driver (version 5.2), using the Java version of dbisql for example, executing certain poorly-formed SQL statements would cause the driver to throw an exception "StringIndexOutOfBoundsException") which would be displayed in the "ISQL Internal Error" dialog. These types of errors are now displayed in the same way that normal syntax errors are shown. An example of a statement which could cause the internal error dialog to open is: SELECT * FROM Workaround: Connect using the JDBC-ODBC bridge. ================(Release Build - Engineering Case #223189)================ When a connection string parameter on the Java ISQL command line contained an embedded comma, a spurious backslash was inserted before the comma. For example, the following command line specifies a connection name of "One,Two": DBISQL -c "CON=One,Two" but the connection name was actually set to "One\,Two", (this string would be seen in the dbisql's title). ================(Release Build - Engineering Case #223190)================ Previously, if you entered a connection parameter on the "Advanced" page of the "Connect" dialog, and that parameter contained a semicolon, the software would truncate that parameter, and/or insert parameters from other pages in the middle of that parameter. For example, LINKS=TCP(HOST=LOCALHOST;DOBROADCAST=NO) had been parsed as two separate parameters: "LINKS=TCP(HOST=LOCALHOST", and "DOBROADCAST=NO)" which was wrong. Connection strings with semicolons enclosed by braces, as well as parentheses, are now handled correctly. ================(Release Build - Engineering Case #223271)================ The INPUT statement without the file name or PROMPT keyword allows data to be read directly from wherever ISQL is getting its commandss. The data is terminated by a single line containing the word "END". A number of bugs related to providing inline data in this way have been fixed: - this feature was only implemented for reading data in the SQL format. Now we support reading data in the ASCII format (same as DBISQLC) as well. Attempting to import inline data in any format other than SQL used to cause an unhandled exception. This has been fixed so you get an error message instead. Previously, if you gave inline data, ISQL assumed there were no more statements in the command stream. This assumption was incorrect, and that limitation has been removed. When using the SQL format, if the preceding SELECT statement had table names in quotation marks, the INPUT statement caused a syntax error. The message would contain a table name with two sets of quotation marks. This has been fixed. If the inlined data could not be imported (because of a duplicate primary key value, for example), and you chose to continue execution, the statement immediately following the data was being ignored. Now it is executed. ================(Release Build - Engineering Case #223274)================ Previously, DBISQL treated the following values of the ON_ERROR option as being equivalent to PROMPT: NOTIFY_CONTINUE, NOTIFY_STOP, and NOTIFY_EXIT. Now DBISQL respects the option setting and takes the selected action when an error occurs while executing statements. The NOTIFY_xxx values are documented. They were left out of the software by mistake. ================(Release Build - Engineering Case #223604)================ During a database upgrade, all system and dbo views are initially dropped and then recreated at the end of the upgrade procedure; however when upgrading a 6.0.03 database to 7.x, the SYSREMOTEOPTIONS and SYSCAPABILITIES views do not get recreated. These views do get recreated now. ================(Release Build - Engineering Case #223694)================ Executing a DISCONNECT ALL statement caused an internal error. It happened regardless of whether ISQL was run in GUI or batch mode. ================(Release Build - Engineering Case #223749)================ DBISQL did not report execution times for READ statements. Now it does, (same as DBISQLC.) ================(Release Build - Engineering Case #224108)================ DBISQL would report a "Lexical error" when it encountered the caret (^) or tilde (~). Now it parses them correctly. ================(Release Build - Engineering Case #224372)================ Previously, the "Execute SQL Statement(s)" toolbar button became disabled if the "SQL Statements" field was blank, you opened the "SQL" menu, then closed the menu. If you subsequently typed a statement into the "SQL Statements" field, then pressed F5 (or clicked the disabled toolbar button), nothing would happen. The workaround is to open the "SQL" menu after you have entered something in the "SQL Statements" field. That will reenable the toolbar button and the accelerator key. ================(Release Build - Engineering Case #224473)================ The logging behavior of DBISQL 7.0 and later had been inadvertently changed from that in 6.0.3. As of this change, DBISQL now emulates the 6.0.3 behavior as follows: -- Error messages are now copied to the log file. -- Logging is now turned on automatically if the saved ISQL_Log option for the user has been set. -- The ISQL_Log option is now set and read by DBISQL. Previously, it was being ignored. ================(Release Build - Engineering Case #224492)================ Pressing ALT+LEFT when the "Recall previous SQL statement" toolbar button was disabled, or pressing ALT+RIGHT when the "Recall next SQL statement" button was disabled used to cause an exception. This has been fixed. ================(Release Build - Engineering Case #224527)================ When DBCOLLAT -d is specified, two output files are created. If -y was not specified, dbcollat would confirm the replacement of only one of the files, instead of both. It will now confirm both replacements, if appropriate. ================(Release Build - Engineering Case #224783)================ Executing the following in the Java version of dbisql: DISCONNECT connectionName caused dbisql to throw an exception (crash). Now the statement is executed correctly. ================(Release Build - Engineering Case #224851)================ Attempting to print a null message to the "Messages" pane caused ISQL to throw an exception. For example, the following would cause a crash: MESSAGE '' TO CLIENT ================(Release Build - Engineering Case #224918)================ The SQL Pre-processor, (sqlpp.exe) faulted when pre-preprocessing lines of the form: "ESQL SQL SELECT CASE WHEN THEN ..." ================(Release Build - Engineering Case #224928)================ A CONNECT statement, without an IDENTIFIED BY clause, would open the "Connect" dialog if when logged in as a DBA. Now the correct behaviour, if the user is a DBA, is to not require a password to connect as a different user. ================(Release Build - Engineering Case #225052)================ The CONNECT statement would always close the current connection, which is not the documented behavior. As a result, the SET CONNECTION statement would, in general, not work. Now, executing a CONNECT statement does NOT close any existing connection. ================(Release Build - Engineering Case #225197)================ Executing an EXIT statement when processing a script file would not cause ISQL to terminate. ================(Release Build - Engineering Case #225626)================ Running the Backup Utility, dbbackup.exe, with the -x switch, (delete and restart transaction log), caused the transaction log to be copied to the backup directory, deleted and a new transaction log started with the same name. This is the correct behaviour, but if the database was running with a mirror log as well, the mirror log was renamed using the name yymmddxx.mlg and a new mirror log was created. The yymmddxx.mlg was not deleted after that even though the -x switch means deletion should be done. Now the mirror log with the name yymmddxx.mlg is deleted. ================(Release Build - Engineering Case #225634)================ The output generated by the ># and >& redirection operators had been inadvertently changed between versions 6.0.x and 7.0.x. They have now been corrected to output the same information as in 6.0.x, albeit in a slightly different format. Specifically, the following defects were fixed: ># Operator: When used with a READ statement: the file did not contain result sets from the included file (it should have). Also, error messages were included in the file (they should not have been). >& Operator: When used following a SQL statement: Error messages and the SQL statement itself were not being copied to the redirection file. Now they are. When used with a READ statement: The SQL statements themselves were not being copied to the redirection file. Also, comments to indicate the name of the file being included were missing. ================(Release Build - Engineering Case #225637)================ ISQL would complain that it was unable to convert data to the correct type when executing an INPUT statement containing immediate data if there were blanks or TAB characters following the "END" keyword which marks the end of the data. ================(Release Build - Engineering Case #225682)================ The Java version of dbisql would fail to connect to a running server if the links connection parameter was specified, but tcpip was not in the list of links. This could have been a problem if an ODBC data source was used to store connection parameters shared by multiple applications, (including dbisql). ================(Release Build - Engineering Case #226136)================ On Windows-based systems, the DBCOLLAT tool would write collation, map and insert files using only linefeed (0x0A) characters at the end of each line, instead of carriage return and linefeed (0x0D and 0x0A) as required. The resulting files were difficult to edit, since the line breaks would usually not occur properly in most text editors. On Windows-based systems, DBCOLLAT will now write carriage return and linefeed at the end of each line. ================(Release Build - Engineering Case #226193)================ If a conversion error occured when importing data, users were asked if they wanted to stop importing or if the program should try to import the rest of the data. If you opted to continue importing, only the next row would be imported; the rest of the data was thrown away. Now, the rest of the data is actually read. ================(Release Build - Engineering Case #226194)================ The INPUT statement would ignore the last line in an input file (ASCII, FIXED, or SQL format) if the line did not end with a carriage return. Now the data is read correctly. ================(Release Build - Engineering Case #226196)================ ISQL would hang, consuming 100% of the CPU time, if an INPUT statement with in-line data was executed which was missing the END keyword. Example: INPUT INTO t; value0 value1 Or in the case where the END keyword is followed by spurious text: INPUT INTO t; value0 END OF DATA Now dbisql reports an error message, or assumes the END keyword if it reaches the EOF. ================(Release Build - Engineering Case #226636)================ The NOSTRIP option of the INPUT statement did not work; blanks were stripped despite use of the NOSTRIP keyword. ================(Release Build - Engineering Case #226637)================ If you specified the BY NAME clause for an INPUT statement, but you did not use the DBASE2, DBASE3, FOXPRO, or LOTUS file formats, ISQL would throw an exception (crash). Now the software reports that the INPUT statement is invalid. ================(Release Build - Engineering Case #226638)================ If you executed more than about 25 INPUT statements on a given connection, executing any subsequent statements would cause either an internal error, or a dialog which reported "ASA Error -685: Resource governor for prepared statements exceeded". This has been fixed. ================(Release Build - Engineering Case #226641)================ The INPUT statement now recognizes "DBASE" as a valid input format. Java dbisql was reporting an error if "DBASE" was specified as a file format, although "DBASEII" and "DBASEIII" worked fine. ================(Release Build - Engineering Case #226727)================ Java dbisql could have hung when importing DBASE files, if the last record in the file was marked as deleted. This problem has been fixed. ================(Release Build - Engineering Case #227257)================ With the ON_ERROR option set to CONTINUE, the INPUT statement should ignore conversion errors and keep on importing without user intervention. Previously, the setting for the ON_ERROR option was being ignored. ================(Release Build - Engineering Case #227259)================ The Java ISQL would throw an exception when processing an INPUT statement if all of the following conditions were true: 1. The format used for the INPUT statment was "SQL" 2. A SELECT statement was executed prior to the INSERT statement, with no intervening INSERT, UPDATE, or DELETE statements. 3. The statments which followed the INPUT statement did not retrieve any result sets. 4. There was at least one statement or comment following the INPUT statement. ================(Release Build - Engineering Case #227261)================ Results from DatabaseMetaData.gettableTypes() are not sorted. To correct existing databases, run dbupgrad. ================(Release Build - Engineering Case #227621)================ If a user created a table named 'EXCLUDEOBJECT' then strange errors could result. For example, attempting to unload the database would result in the error 'SQL Error: SELECT returns more than one row'. This behaviour has been corrected. ================(Release Build - Engineering Case #228225)================ If the database unload utility, dbunload, was given an option that conflicted with -ar, as well as the option -ar, (eg. dbunload -an foo -ar), rather than reporting an error and the usage, it would crash. ================(Release Build - Engineering Case #228333)================ The Database Erase utility, dberase, would crash if used to erase an invalid database file. ================(Release Build - Engineering Case #228346)================ Upgrades on databases created with SQL Anywhere version 5.5.05 and earlier may have had problems when then using Java in the database features. When the upgraded database was used by an ASA server on unix, the java vm would not start, i.e. the java support will not work. The java support would work with a server on Windows, (95, 98, NT, ME, 2000), Netware, Linux, and Intel Solaris, but would have had a limitation on the total number of classes installed. The database would be limited to a maximum of about 32,000 classes installed. Any class installed after this would get the error - primary key for table 'SYSJAVACLASS' is not unique'. The problem has been fixed. Any upgrades on 5.5.05 and earlier will upgrade to support the java support properly. Databases already upgraded prior to this fix will support Java in the database correctly by upgrading again. with this fix. ================(Release Build - Engineering Case #228356)================ DBISQL Java edition did not display full usage message on UNIX, it was truncated after 256 characters ================(Release Build - Engineering Case #228572)================ When using immediate data, the INPUT statement would erroneously add an extra row of NULL values. For example: INPUT INTO t ( c ); 1 2 END would have inserted 3 rows into table "t" instead of 2. Also, when importing ASCII data, if the column names were given, they were being ignored. For example: CREATE TABLE t ( c1 INT, c2 VARCHAR(10) ); INPUT INTO t ( c2, c1 ); 'One', 1 END would have failed because ISQL would interpret 'One' as the data for the first column, "c1". Now it correctly interprets it as the data for "c2" (the first column in the list of columns). ================(Release Build - Engineering Case #228578)================ Executing an OUTPUT statement to export a BINARY value as ASCII with the option HEXADECIMAL OFF caused Java ISQL to throw an exception ================(Release Build - Engineering Case #228594)================ When the stand-alone tools are running in Russian or Ukrainian, any prompt string (such as "replace this file? (y/n)") would display "valid response" (y/n) values that were incorrect. They will now display correctly. This issue did not occur with other languages. ================(Release Build - Engineering Case #228701)================ On some non-English Windows systems that were running a single-byte character set that was not cp1252 (for example, Polish and Russian systems), DBISQLC would start with menus and window titles that contained boxes or other invalid characters. Also, the About box and Table browser (F7) dialogs would be affected. The problem would occur only if a localized language resource DLL (dblg*.dll) was used (for example, dblgpl7.dll), and a database with an incompatible collation (for example, 1252LATIN1) was being used. Starting DBISQLC without a connection (not using -c switch and pressing Cancel in the connect dialog) would avoid this problem. Using -ct on the server would also avoid the problem. The problem would not occur on multi-byte systems, or systems using cp1252 (Western European languages, including English). The main way to avoid this problem was to use a database with the correct collation and character set. Note that it is acceptable for messages from the server to be corrupted in this case, because DBISQLC must translate to a common character set, and the character sets are not compatible. ================(Release Build - Engineering Case #228836)================ In Java ISQL, if the output from a given script file was being redirected by the ># or >& operators, and that file included a READ statement which did not explicitly redirect its output, the READ statement now inherits the redirection. This is now the same behaviour as DBISQL Classic. ================(Release Build - Engineering Case #228886)================ The Java edition of DBISQL and Sybase Central would corrupt characters on operating systems that were not using cp1252, such as Polish and Russian. These languages are now properly supported. ================(Release Build - Engineering Case #228988)================ The OUTPUT statement would write BIT values as the strings "true" and "false", which was not correct. It now writes "1" and "0", same as DBISQLC. ================(Release Build - Engineering Case #229094)================ If an erroneous statement was executed, using Java ISQL, that spanned more than one line, the error statement was reported with spurious blank lines between every source line. These blank lines have been removed. ================(Release Build - Engineering Case #229242)================ When logging was turned on, the START LOGGING or SET OPTION statement which initiated the logging was included in the log. Now the START LOGGING statement does not appear in the log. ================(Release Build - Engineering Case #229258)================ 1. In an INPUT statment, if a column list was specified and some of the table's columns were not listed, (which is allowed), an exception would be thrown 2. An OUTPUT statement would not write out the entire contents of a BINARY field if the data was more than about 30 bytes and the corresponding SELECT statement was preceded by a comment. The entire binary value is now written. ================(Release Build - Engineering Case #230941)================ dbsvc -l would list MobiLink or DBRemote services created with Sybase Central, but is not able to get details on them, delete them, etc. It will now list only database servers. ================(Release Build - Engineering Case #231326)================ On Unix, if you try to erase a database file using "dberase", the confirmation question (do you really want to erase this file?) was supposed to be followed by the string " (Y/N)", however, garbage would appear instead. Couldo also happen in other utilities that prompt. Fixed so the Y/N appears. ================(Release Build - Engineering Case #232395)================ An invalid command line parameter will dump usage text. The usage text for some languages would display corrupted characters. This has been corrected. **************** ** Mobilink ** ** ** ** ASA Client ** **************** ================(Release Build - Engineering Case #221384)================ If a synchronization is scheduled to start at a specified minute and it failed to connect to ML server then dbsync will retry repeatedly until the current minute expires. After this fix, dbmlsync will wait until the minute expires. Retry can be implemented using hooks. ================(Release Build - Engineering Case #221385)================ If a synchronization failed because of an invalid schedule string, dbmlsync will report a general failure only. A new error message is added for if this kind of error. ================(Release Build - Engineering Case #221399)================ When the Mobilink server aborted a download due to a bad download cursor, the interrupted download stream was causing a communication error on the dbsync end. Dbmlsync was supposed to call the download_com_error hook if it was defined on the remote database but it didn't. It now does. ================(Release Build - Engineering Case #225537)================ If the Moblink ASA client (dbmlsync.exe) was started in verbose mode (either on command line with -v, or specified through the dbmlsync dialog) the message ' rows uploaded from table '. The number of rows indicated, however, was incorrect, actually indicating the total number of rows uploaded from all tables. Not only that, but the message was a little too verbose, i.e. why display this message after every row uploaded? We give a summary of the number of rows uploaded per table at the end of the upload anyway. The message has been completely removed. ================(Release Build - Engineering Case #226083)================ If the Moblink ASA client, (dbmlsync.exe), was started in verbose mode, (either on command line with -v, or specified through the dbmlsync dialog), the message ' rows uploaded from table
' was displayed. The number of rows indicated, however, was incorrect, actually indicating the total number of rows uploaded from all tables. Not only that, but the message was a little too verbose, i.e. why display this message after every row uploaded? We give a summary of the number of rows uploaded per table at the end of the upload anyway. The message has been completely removed. ================(Release Build - Engineering Case #226317)================ When a customized user authentication was used on the consolidated database and the authentication script implemented the VALID_PASSWORD_EXPIRES_SOON warning, the Mobilink ASA client, (dbmlsync.exe), would fail to interpret the download stream trailing such warning. The result could have been either be a protocol error or incorrect download of the data. ================(Release Build - Engineering Case #228610)================ If table involved in a synchronization definition required double quotes for the table's name, any of the table's columns, or the table's owner, then the download phase of Mobilink synchronization would fail with a syntax error. With this fix synchronizations involving these tables should work fine, existing synchronization definitions do not need to be altered. ********************************* ** Mobilink ** ** ** ** Charset Conversion (UNILIB) ** ********************************* ================(Release Build - Engineering Case #230940)================ Running dbmluser in non-English languages, in particular European languages, could display incorrect characters. ********************* ** Mobilink ** ** ** ** HotSync Conduit ** ********************* ================(Release Build - Engineering Case #223682)================ Performing synchronization using ULConduitStream (DMC) would result in a larger persistent data store than when using ULPalmDBStream (traditional conduit). (The store size is measured after the application has been relaunched following the synch.) Typically, the difference in size would be proportional to the amount of data synchronized, and possibly as much as 20%. With this change, the store size is about the same for both streams. ================(Release Build - Engineering Case #227838)================ Floating point numbers would appear to be incorrect or garbage characters, after using HotSync to synchronize. ================(Release Build - Engineering Case #228616)================ Hotsync Manager could crash in Palm41.dll during synchronization. ************************************** ** Mobilink ** ** ** ** Java Provider for Sybase Central ** ************************************** ================(Release Build - Engineering Case #216577)================ The security and transport parameters for synchronization are missing. ================(Release Build - Engineering Case #220899)================ In the Connection Scripts pane, boxes appear where the CR/LF from the script appear. These have now been replaced by spaces for display purposes. ================(Release Build - Engineering Case #221295)================ In the Add Version or Add User wizards of the Mobilink plugin for Sybase Central, giving a name which contains a single-quote (apostrophe) would cause a syntax error. This has been corrected. ================(Release Build - Engineering Case #222489)================ User password was changed to unknown value when username is changed. ================(Release Build - Engineering Case #231067)================ Service creation wizard used to display a badly truncated executable or file name on pages 4 and 7. A short filename is now shown instead. For example: c:\program files\sybase\adaptive server anywhere\test.exe becomes c:\...\test.exe. The connected user properties dialog also had this problem. **************************** ** Mobilink ** ** ** ** Synchronization Server ** **************************** ================(Release Build - Engineering Case #220935)================ The help button in CE dbmlsync dialog was disabled. It has been removed. ================(Release Build - Engineering Case #221243)================ When a row containing a BLOB (ie. LONG) column was deleted on an UltraLite remote, then uploaded, the MobiLink synchronization server would fail synchronization, claiming that an error occurred on the remote (and give an invalid SQL error number). A server-based change to this problem has been revoked. Instead, a client-based fix has been deemed as more appropriate. This updated change affects dbmlsv7.dll with a build number within the following ranges: 7.0.0.468 - 7.0.0.478 (95/98/NT/2000) 7.0.0.468 - 7.0.0.476 (Unix) 7.0.1.1122 - 7.0.1.1132 As well, MobiLink servers with build numbers in the ranges above, are incompatible with ASA remotes from build numbers outside the ranges. To restore compatibility, the MobiLink server must be equal to or later than the following builds: 7.0.0.479 (95/98/NT/2000) 7.0.0.477 (Unix) 7.0.1.1133 For UltraLite remotes to successfully upload deleted rows containing BLOBs, the UltraLite runtimes as well must be equal to or later than the above build numbers and relink their UltraLite applications. ================(Release Build - Engineering Case #221359)================ Repeated error messages were displayed and/or logged when an upload communication error occurred while sending the upload header. ================(Release Build - Engineering Case #221567)================ If a deadlock occurred in the begin_connection, begin_synchronization, or prepare_for_download transactions, then MobiLink would have failed the synchronization instead of retrying the transaction. MobiLink now detects the deadlock in these transactions and retries the transaction if deadlock is detected. ================(Release Build - Engineering Case #223616)================ The Mobilink Server could crash if a synchronization was attempted and the consolidated database had gone down. ================(Release Build - Engineering Case #223770)================ Mobilink logs the number of rows conflicted as information and the number of rows ignored as a warning when it is finished uploading the rows for a table, if these numbers are greater than zero. It was only doing this for the last table it uploaded. It It now logs these values for all tables. ================(Release Build - Engineering Case #223771)================ When rows containing one or more BLOB (ie. LONG) columns were synchronized against an Adaptive Server Enterprise (ASE) consolidated database, the MobiLink server would either display an ODBC error or crash. ================(Release Build - Engineering Case #224504)================ If a deadlock occurred in the end_synchronization transaction, then MobiLink would have failed the synchronization instead of retrying the transaction. MobiLink now detects the deadlock in this transaction and retries the transaction. ================(Release Build - Engineering Case #224505)================ If a deadlock recovery was attempted anywhere but in the upload transaction, MobiLink server wouldn't perform a random delay before recovering. The lack of a random delay could increase the probability that deadlock would happen again. MobiLink server now always delays randomly when recovering from deadlock. ================(Release Build - Engineering Case #224506)================ When an updated row was uploaded, and the original row had been deleted from the consolidated, or its primary key was changed, (ie. a conflicting update), the MobiLink Synchronization Server would ignore the row with a warning to the log. ================(Release Build - Engineering Case #226192)================ The MobiLink server could crash when downloading into LONG VARCHAR or LONG BINARY columns using Oracle 8.1.x ODBC drivers. ================(Release Build - Engineering Case #226632)================ When a row was updated at the remote, then synchronized, and the consolidated row no longer existed, the message displayed in the MobiLink server log was (paraphrased) "unable to update row". This has been changed to (paraphrased) "the row could not be updated because it no longer exists". The behaviour has not changed -- just the message. Note that this message will only appear when there are no conflict-resolution scripts defined. ================(Release Build - Engineering Case #226633)================ As of QTS 224506, the MobiLink server triggered a conflict when an uploaded update found that the consolidated had previously deleted the row. The message displayed in the log was misleading: "the will be processed as in-conflict because there is no upload_cursor script defined". The new message is: "the row will be processed as in-conflict because the consolidated row no longer exists". The behaviour hasn't changed, just the message. Note, this new message will only be displayed when conflict-resolution scripts are defined. ================(Release Build - Engineering Case #226823)================ Certain operations that were either rolled back explicitly or were only partially completed and rolled back implicitly would have been uploaded by dbmlsync as if they were not rolled back. For example, any insert/update or delete rolled back using the 'rollback to savepoint' operation would have been uploaded by dbmlsync as if they were not rolled back. As well, any searched update or searched delete, (i.e. has a where clause), that failed sometime during the operation, would have been uploaded by dbmlsync up to the update or delete before the failure. The problem has been fixed. ================(Release Build - Engineering Case #227000)================ If there was more than 4K of primary key data synchronized, there was a, roughly, 1 in (4096 / primary key datum size) chance that dbmlsync would hang. This has been fixed. ================(Release Build - Engineering Case #227252)================ DBMLSync could not be used to replicate trigger actions, even with the extended option of SendTriggers set to 'on'. ================(Release Build - Engineering Case #227262)================ When the MobiLink server processed an uploaded delete and found that the consolidated had already deleted the row, the message displayed in the log that there as an error deleting the row was misleading. The new behaviour is to silently ignore the delete. The behaviour hasn't changed -- the message has been suppressed. ================(Release Build - Engineering Case #227670)================ To reduce database contention, the -wu Synchronization Server command line switch can now be used to set the maximum number of worker threads allowed to upload concurrently. The upload requests are processed in first-come, first-serve order. When the number of worker threads is higher than the number of concurrent uploading threads, some deployments can experience increased throughput. ================(Release Build - Engineering Case #227671)================ A new option, -zt , has been added to the MobiLink Synchronization Server for setting the maximum number of processors to use. A maximum of processors will be used for the MobiLink process. This option was added to give greater control of the resources used by the MobiLink server. It can also help to discover and/or work around an ODBC driver with multi-processor issues. ================(Release Build - Engineering Case #228831)================ The conversion from Unicode to UTF8 converted \u0000 to '\x00' instead of '\xc0','\x80' in LONGVARCHAR blobs for Unicode-based clients, (ie UltraLite, WinCE and Java). This would have manifested tself as truncated blobs or missing characters. ================(Release Build - Engineering Case #228838)================ If one or more connections to the consolidated database went bad or encountered deadlock, the MobiLink Synchronization Server could have crashed. ================(Release Build - Engineering Case #230463)================ The MobiLink server documentation states that when an update conflict is detected during synchronization, and none of the conflict-resolution scripts (new_row_cursor, old_row_cursor, and resolve_conflict) are defined for the table, then the (default) behaviour is "consolidated wins all conflicts". However, the actual behaviour has always been "last synchronized remote update wins". This fix rectifies this discrepancy as follows: 1) The default behaviour remains "last synchronized remote update wins" 2) To change the behaviour to "consolidated wins all conflicts", all you need to do is: i) define a resolve_conflict script ii) do NOT define a new_row_cursor script iii) do NOT define an old_row_cursor script As you would expect, this means that neither the new or old values from the update are uploaded, so the consolidated wins the conflict. Please note that the resolve_conflict script must be valid SQL for your consolidated. If you don't want this SQL to do anything (ie. you just want it present so that the consolidated wins all conflicts) then you should use a small script that does nothing. In ASA, ASE, and Microsoft SQL Server, for example, such a script would be: BEGIN RETURN END In Oracle, a similar script is: BEGIN RETURN; END; In DB2 UDB, a harmless script could be as follows: SELECT 1 FROM SYSIBM.SYSTABLES WHERE 1 = 2 For more ideas, consult the documentation for your consolidated database. ================(Release Build - Engineering Case #230904)================ MobiLink server displayed "MobiLink" in the bitmap and the window title. In Japan, the server is called "Mobile Link". Server changed to display "Mobile Link" when running in Japanese. ************** ** Mobilink ** ** ** ** scripts ** ************** ================(Release Build - Engineering Case #226188)================ MobiLink stored procedures ml_add_table_script and ml_add_connection_script behave as they previously have if the script has not already been defined for the specified version, table (ml_add_table_script only), and event. If the script has already been defined then the procedure will add an entry in the ml_script table. It will then update the script_id column value of the ml_table_script or ml_connection_script table such that it references the new script. For example, in ISQL execute the following: call ml_add_table_script( 'version1', 'table1', 'upload_cursor', 'SELECT name FROM old_table' ); call ml_add_connection_script( 'version1', 'end_download', 'DELETE FROM old_table' ); call ml_add_table_script( 'version1', 'table1', 'upload_cursor', 'SELECT name FROM new_table' ); call ml_add_connection_script( 'version1', 'end_download', 'DELETE FROM new_table' ); These calls will result in an upload_cursor script and a end_download script that both reference the new_table table. The two scripts that refer to the old_table table can still be found in the ml_script table. ********************************************* ** SQL Remote for Adaptive Server Anywhere ** ** ** ** Database Tools Interface ** ********************************************* ================(Release Build - Engineering Case #222209)================ If the engine is killed when it was busy in processing transactions, the transaction log may contain uncompleted operations at its end. Then translating these transaction logs, DBTran may complain transaction log corrupted with an error message like "Log operation at offset N has had data at offset N + delta n". ================(Release Build - Engineering Case #222907)================ SQL Remote could have prematurely exited while receiving messages ================(Release Build - Engineering Case #223586)================ SQL Remote could GPF while sending messages. ================(Release Build - Engineering Case #224224)================ If the engine was killed or the SQL Remote connections were dropped when SQL Remote was running, SQL Remote would generate lots of messages. SQL Remote now generates a proper error message and avoids printing misleading messages. ================(Release Build - Engineering Case #226024)================ When an article contained a "subscribe by" and a "where clause", SQL Remote may not have replicated deletes back to the remote site if the rows were initially inserted by this remote user, but they don't satisfy the subscription value. ================(Release Build - Engineering Case #226099)================ If the command line switch -u "send only backed up transactions", was used, SQL Remote could have sent messages back and forth forever, even though there was no real transaction happenning on both sites. This problem would happen after SQL Remote complained about a missing message and the confirm_received in the sysremoteuser table for this user was NULL. ************************************************ ** SQL Remote for Adaptive Server Anywhere ** ** ** ** Ftp Messaging for Adaptive Server Anywhere ** ************************************************ ================(Release Build - Engineering Case #219496)================ If the FTP message link received an incorrectly formed response to the PWD command, it could have caused dbremote to crash. ********************************************* ** SQL Remote for Adaptive Server Anywhere ** ** ** ** SQL Remote Message Agent ** ********************************************* ================(Release Build - Engineering Case #220693)================ dbremote, dbltm and dbbackup would crash if run agains a database initialized with a page size of 32k. ================(Release Build - Engineering Case #220543)================ On Windows CE, redirecting dbremote's TEMP files to a user-specified directory through the registry key HKEY_CURRENT_USER\Software\Sybase\Adaptive Server Anywhere\6.0 would seem to have stopped working. In some circumstances. a valid path was being interpreted as an invalid path, causing the temp file returned to default to the current directory. *************************** ** UltraLite ** ** ** ** Analyser Java Classes ** *************************** ================(Release Build - Engineering Case #225001)================ In Java Ultralite, the use binary comparison would cause the Analyzer to throw an exception and so no code was generated. ================(Release Build - Engineering Case #227666)================ The Ultralite Analyzer would output a fatal error message for certain UPDATE statements. The type of UPDATE statement that caused this problem involved the updating of multiple tables in a single UPDATE statement. These kinds of UPDATE statements are not supported by UltraLite so now the message, "unsupported form of UPDATE", is issued rather than a unknown fatal error. before: Analyzing access plans Procedure 'parseULPlans' terminated with unhandled exception 'com.sybase.asa.ultralite.ULFatalError' FATAL: Internal error running the analyzer, 14. now: Analyzing access plans Generating source code for SQL statements FATAL: Internal error running the analyzer, unsupported form of UPDATE. In uldatabase.sqc(702) ******************** ** UltraLite ** ** ** ** Code Generator ** ******************** ================(Release Build - Engineering Case #229886)================ The Ultralite plugin for codewarrior will periodically cause CodeWarrior to repeatedly crash during startup on Windows 2000, and possibly on Windows NT machines with the latest MDAC sdk installed. ================(Release Build - Engineering Case #227965)================ Repetition of columns in an UPDATE statement caused the Ultralite analyzer to output code that would not compile correctly. The work-around for this issue is to merge the two separate changes into one change with the same effect. Example: EXEC SQL UPDATE qts227965 SET col1 = col1 + 1, col1 = col1 + 1 WHERE id > 0; change to: EXEC SQL UPDATE qts227965 SET col1 = col1 + 2 WHERE id > 0; ********************* ** UltraLite ** ** ** ** MobiLink Server ** ********************* ================(Release Build - Engineering Case #217910)================ In some circumstances, the MobiLink Synchronization Server worker threads became unavailable when TCP/IP-based connections disappeared during synchronization. The worker threads were stuck waiting for replies from the remote that never come. If all worker threads reached this state, MobiLink could not process synchronizations. Similarly, MobiLink clients could have become blocked if the connection disappeared in such a way that the OS could not detect the loss. The TCP/IP-based streams that are used during MobiLink synchronization now accept a new parameter, both on the client and server side: keep_alive=[0|1] To enable liveness checking in 7.0.0 MobiLink, for example, your command line would contain the following: dbmlsrv7 -x tcpip{keep_alive=1} .... keep_alive=0 turns off TCP/IP liveness checking, and 1 enables it. The default is 1 (liveness detection enabled). If the OS network layer doesn't support TCP/IP liveness checking, this parameter is ignored. NOTE: The initial default for keep_alive on was 0 (OFF), for "backward compatibility". We have found that many customers expect the option to be ON by default, and we now agree. The builds that have 0 (OFF) as a default are as follows 6.0.03 3040 - 3092 6.0.04 0000 - 3697 7.0.0 455 - 496 7.0.1 1103 - 1148 Subsequent builds have 1 (ON) as the default keep_alive value. Consult the documentation for your OS to determine how to configure liveness checking (eg. how often to check, how long to delay between checks, etc.). In particular, look for whether or not the TCP/IP socket option called SO_KEEPALIVE is implemented for your OS and/or network layer, and how to configure its behaviour. For Windows 95 and NT, for example, see the MSDN article Q140325 "How to Determine Loss of Client/Server Connection". *********************** ** UltraLite ** ** ** ** Runtime Libraries ** *********************** ================(Release Build - Engineering Case #219940)================ If HotSync synchronization fails, the sqlcode from synchronization is not reported when the UltraLite application is started using ULPalmLaunch. A common error is trying to HotSync when MobiLink has not been started, resulting in SQLE_COMMUNICATIONS_ERROR (-85). Once an error occurs, you must start the app to retrieve the sqlcode before synchronizing again. ================(Release Build - Engineering Case #221382)================ Inserting a row may cause an exception. On Palm Computing Platform, the exception will appear in the form of "unable to access unallocated memory". ================(Release Build - Engineering Case #222904)================ When using a Java VM in which garbage collection could occur on a separate thread, unpredicable results could have been achieved (usually a NullPointerException or a ClassCastException) because corruption of the internal data structure would have occurred when more than one thread was active. ================(Release Build - Engineering Case #223385)================ The validity start date in a server certificate was set to the Greenwich Mean Time (GMT) that matched the local time the certificate was generated. The PalmOS time() function returns time_t for local time rather than GMT time (like Win32 time()) so this would cause the generated certificate to be invalid for up to 12h depending on the timezone the certificate was generated in (e.g., for EST, a programmer would have to wait 4-5 hours depending on whether daylight savings time is in effect). The work around for this problem is to set the PalmOS clock to GMT during development and to double check the accuracy of the device clock periodically. The gencert utility will now set the start date and time to one day before the actual time the certificate was generated so that the certificate will be immediately usable provided the date is set properly on a device. ================(Release Build - Engineering Case #223772)================ Java UltraLite LIKE function didn't work on some double-byte characters. This has been corrected. ================(Release Build - Engineering Case #223922)================ When updates, inserts or deletes were applied to a nearly-full Ultralite database, in the C/C++ system, memory was unpredictably modified, leading to unpredictable behavior. In the Java system, an IndexOutOfBounds Exception was thrown. ================(Release Build - Engineering Case #225019)================ In Java Ultralite, getBytes for the ResultsSet class, was an unimplemented feature. An exception should have been thrown, as is the case with other unimplemented features. The feature has now been implemented. ================(Release Build - Engineering Case #225051)================ If a thread is terminated while still in ULSynchronize, a new thread could not have been created to restart synchronization. This fix is an attempt to detect this situation.The SQL error SQLE_ENGINE_NOT_MULTIUSER will be returned by ULSynchronize if previous threads have not finished their synchronizations. ================(Release Build - Engineering Case #225481)================ A memory leak could occur if an uncommited row was found during the upload stream phase. The synchronization would fail as expected, but the only side-effect would be some lost memory. Note: the fixed UL runtime library has a build number of 1134, but was included in the 7.0.1 1133 EBF. ================(Release Build - Engineering Case #225631)================ In Java Ultralite, internal Blob (and Clob) assignment was not storing anything under certain conditions, causing update statements to sometine produce erroneous results. ================(Release Build - Engineering Case #225671)================ When using UltraLite on VxWorks, each synchronization using the TCP/IP synchronization stream would reduce the amount of dynamic/system memory available by about 1 Kb. This change fixes the memory leak. ================(Release Build - Engineering Case #226560)================ In Java Ultralite, an application could fail with a NullPointerException if a PreparedStatement were closed when it already was closed. ================(Release Build - Engineering Case #226639)================ The map structure that is used to generate small row identifiers for rows could have entered an inconsistent state. The operations that could cause this problem involved a sequence of inserts followed by a sequence of deletes in turn followed by a sequence of inserts. ================(Release Build - Engineering Case #227825)================ If an application used the DMC, but the first time it was launched the DMC stream wasn't selected, then the application would not have behaved normally. For example, if the application used the Conduit stream, rather than a direct connection, and then exited, the application would have crashed when next run. Also, if HotSync was run after exiting the application, the conduit would not have synchronized. These problems have been fixed. ================(Release Build - Engineering Case #228226)================ In certain circumstances, synchronizing using the secure stream feature could result in larger than normal memory requirements. This could occur in rare cases within the UltraLite runtime and certain multi-threaded cases with MobiLink. ================(Release Build - Engineering Case #228228)================ The Ultralite runtime could miss deleting some rows during a download ,leaving the database in a state that violated referential integrity constraints. The tables affected by this problem had self-referencing foreign keys, (i.e., primary table is the same as the foreign table). ================(Release Build - Engineering Case #231078)================ The usage text of dbcond7.exe would display accented (non-English) characters incorrectly. This has been corrected. ********************** ** UltraLite ** ** ** ** SQL Preprocessor ** ********************** ================(Release Build - Engineering Case #223567)================ The gencert and readcert utilities could display corrupted characters in usage text or other output. In particular, accented or other non-English characters would be corrupted. sqlpp and ulgen could display certificate information with the same problem. The characters will now be displayed correctly.