SAP SQL Anywhere的所有已知BUG列表(2)

随着Sybase被完全整合到SAP下,Sybase原来的支持网站被SAP Support Portal取代。
只有购买了SAP服务的用户才能使用账号登录SAP Support Portal进行介质下载、补丁升级、报Incident等。
考虑到Sybase数据库的初学者或者没有购买原厂服务的Sybase客户情况,现提供SAP ASE/IQ/RS/SDK/SQL Anywhere/PB等产品的BUG信息。
在SAP Support Portal网站或者google上搜索Targeted CR List for ASE,可以看到针对不同版本的CR(CR表示Change Request)简单描述信息列表。
需要注意的是:Targeted CR List for ASE列出的CR虽然绝大多数是BUG,但有一些是更改需求。
以下提供SAP ASE/IQ/RS/SDK/SQL Anywhere/PB等产品的BUG信息!
不仅仅包括BUG的详细描述信息,还包括首次报告BUG的平台、数据库版本以及BUG修复历史过程;有些BUG还提供了Workaround来临时解决该BUG带来问题。

SQL Anywhere的所有已知BUG列表(1)
SQL Anywhere的所有已知BUG列表(2)
SQL Anywhere的所有已知BUG列表(3)
SQL Anywhere的所有已知BUG列表(4)
SQL Anywhere的所有已知BUG列表(5)
SQL Anywhere的所有已知BUG列表(6)
SQL Anywhere的所有已知BUG列表(7)
SQL Anywhere的所有已知BUG列表(8)
 

CR
Number
Description
341769 When Remote Data Access was used to query information from a Lotus Notes database, the column names in queries sent to the Lotus Notes ODBC driver were not always quoted. As a result, querying Notes tables with a column named that was a keyword, would have failed. This problem has now been fixed.
341770 As of 9.0.0, the EXECUTE IMMEDIATE statement supports returning a result set. A side-effect of this change was that procedures that contained an EXECUTE IMMEDIATE statement were marked as returning a result set, even if no result set was returned. This change in behavior has caused compatibility problems for customers moving from prior releases. For this reason, the WITH RESULT SET clause was introduced (see Engineering issue 339798), allowing users to indicate that no result set would be generated. With the present change, the default setting has been changed to OFF, restoring the behavior from earlier versions.

For EXECUTE IMMEDIATE, the new syntax is:

EXECUTE營MMEDIATE燵爀xecute-option燷爏tring-expression

execute-option:

牋WITH燪UOTES燵燨N爘燨FF燷

|燱ITH燛SCAPES爗燨N爘燨FF爙

| WITH RESULT SET { ON | OFF }

Now, if an EXECUTE IMMEDIATE statement is intended to be used to return a result set, it must be specified as follows:

EXECUTE IMMEDIATE WITH RESULT SET ON string-expression

If the "WITH RESULT SET ON" clause is included, the containing procedure is marked as returning a result set. Failure to include this clause will result in an error being reported when the procedure is called if the statement does produce a result set.

341777 When performing an index scan to satisfy a predicate, the server may have also evaluated the predicate on the fetched row. The evaluation of the predicate was not necessary and could have lead to slower execution times. Whether or not the redundant predicate evaluation took place, depended upon some non-deterministic criterion. This problem has now been fixed.
341798 If a foreign key was defined with an ON UPDATE or ON DELETE referential action, and DELETEs or UPDATEs on the table were performed while procedure profiling was enabled, it was difficult or impossible to view the profiling information for the system-defined trigger corresponding to the foreign key. Viewing the profiling information for system triggers in Sybase Central could have shown confusing results. This has been fixed. The definitions of sa_procedure_profile and sa_procedure_profile_summary must be updated in the database in order to benefit from this change.

Note, these procedures now return additional columns, as described below.

sa_procedure_profile now has two additional result set columns:

foreign_owner char(128) // owner of foreign table for system triggers

foreign_table char(128) // name of foreign table for system triggers

As well, the object_type column can now have two additional values:

C - indicates that the object is an ON UPDATE system trigger

D - indicates that the object is an ON DELETE system trigger

If object_type is C or D, object_name is the name of the foreign key for which this system trigger was defined.

sa_procedure_profile_summary has two additional result set columns (same as above):

foreign_owner char(128) // owner of foreign table for system triggers

foreign_table char(128) // name of foreign table for system triggers

The object_type parameter to sa_procedure_profile_summary can now have the value 'S'. If this value is used, only rows corresponding to system triggers are returned.

341814 Creating a foreign key with a different hash size than the primary key it referenced, may have returned the error "No primary key for foreign key..." if the foreign key table already contained rows. This has been fixed
341869 In a details list, a column of data can be sorted by clicking on the column header, but it was not possible to do this via the keyboard. This has been fixed by adding a new menu option, View->Sort, to allow choosing a column to sort via the keyboard.
341887 It was possible for rows inserted by means of a wide insert to contain string values that were longer than the maximums allowed by the definition of the underlying columns. In other words, the server could have failed to truncate inserted column values, as necessary. These un-truncated values were inserted in both the database and the transaction log. Under normal circumstances, it was not likely that any problems with the database would have been noticed, as these values were properly truncated when they were read back later. However, the un-trancated values in the transaction log could have caused problems for utilities that needed to translate and/or replicate the operations from the transaction log. In order for the corruption to occur, a wide insert with the following characteristics must have occurred for one or more columns:

- The column value in the first row must have been NULL,

- A subsequent row must have contained a string value that did not exceed the maximum size allowed for the column,

These must be then been followed at some point by a row containing a column value that needed to be truncated before insertion. This problem has now been fixed and a new server assertion ( number 100910 ) has been added to prevent this corruption from happening in the future.

341910 Calling SQLGetDiagField() with a DiaIdentifier of SQL_DIAG_ROW_NUMBERshould, would have returned the row number in the rowset, not the row number in the result set. For example, after a second SQLFetchScroll (for a rowset of size 1), if a truncation occurred, the record number reported as beaing truncated would have been 2, which was incorrect.

This problem has been fixed, SQLGetDiagField() now returns the rowset number of the row with an error.

341970 Starting a server, with two or more databases specified on the command line, could have caused the server to crash during start-up. This has been fixed.
341989 Starting the Trigger, Procedure or Event wizards, when the Profile page for the corresponding folder was displayed in the right-pane, would have caused an unexpected error when the wizard completed. This has been fixed.
341995 Double-clicking a trigger's profile summary in the Profile tab page in the right-pane, would have done nothing. Now, the trigger is selected in the Triggers folder. This behaviour mirrors what happens when double-clicking the profile summary for a procedure,

function or event.

342000 The system procedure Sa_conn_properties() lists the name, description and value for many properties. Some of the property descriptions were the same as the property name.

Similarly, the system function Property_description() was returning th property name as the description. This function was being used by Sybase Central, so it would have shown the property name instead of a description.

Proper descriptions have now been added for all properties.

342012 Error message text could have appeared garbled due to improper character set conversion. This would have occurred whenever all of the following were true:

- ODBC client was being used

- the application was using the "widechar" ODBC interface

- the application did not explicitly set the character set for the connection

- the database character set was not equal to the OS character set of the server

- the client side was capable of translating from database character set to the client's character set

This has now been fixed.

342028 If a scheduled event is created without an ON or EVERY clause, it will be executed at most once, and the server will automatically delete the event definition after its scheduled time. If such an event was created in a database that did not have a user named DBA, the server would crash when it attempted to delete the event. Attempting to restart the database would cause another crash, as the server would again detect that the event should be deleted. This has been fixed. A server with this fix can be used to start a database that was otherwise unusable as a result of this problem.
342035 The MobiLink client (dbmlsync), or an UltraLite application, when running on Windows did not respect the network_leave_open=1 streams parameter. Note, this did not affect Windows CE. This is now fixed.
342036 The ODBC function SQLGetInfo returns a list of the keywords supported by the database server. The list was incomplete and was missing some recent additions including ROLLUP. This has been fixed.
342125 When creating a proxy procedure to a Microsoft SQL Server procedure, the creation of the proxy procedure would have failed if the version number of the procedure was included. For example, creating a proxy procedure to the procedure "rem_proc" will work, but creation would have failed when attempting to create a proxy procedure to the procedure "rem_proc;1". This problem was most likely to occur when using Sybase Central to create the proxy procedure. The problem has been fixed.
342134 If a CREATE TRIGGER statement included the clause ORDER 0, (this syntax is generated by PowerDesigner), to specify the order in which the trigger was to be fired relative to other triggers on the table, a syntax error would have been generated. This has been fixed.
342139 The MobiLink server would have continued to process new HTTP or HTTPS requests even after a shutdown was requested. A continuous series of new synchronization requests could have prevented the server from shutting down. This has been fixed.
342140 When running the Index Consultant from a non-English version of Interactive SQL, the 'Show Plan With Virtual Indexes' button was disabled, even if a virtual index had been recommended. This has been fixed.

A workaround is to manually issue the 'CREATE VIRTUAL INDEX' statement and then view the plan from dbisql using Shift+F5.

342144 When attempting to create a proxy table to a table on an ASE remote server or migrating from ASE using Sybase Central, querying information about an ASE table or procedure with sp_remote_tables or sp_remote_procedures might have failed with a strange error containing the words "transaction" or "tempdb". The exact error message could have varied. The problem has now been fixed.
342148 The system procedure sa_index_density() could have returned density values for an index that were greater than 1.0 (correct values are between 0 and 1). This has been fixed.
342150 The UNIQUEIDENTIFIER data type is stored in the database as a 16 byte binary value. This value was not being stored correctly on little-endian platforms, such as Intel x86. This problem has been corrected in the ODBC and OLEDB drivers.
342151 Positioned update statements could have failed in one of the following ways:

- the server may have crashed when using an aliased expression, subselect or subquery predicate

- an incorrect 'column not found' error when using a view column on the right-side of a SET item

- the wrong table instance may have been updated, when a table was referenced more than once

- no error returned when no row was updated

The exact behaviour of a positioned update was changed between versions 5.5 and version 6.0 and between 7.0 and 8.0 and later. Until now, none of these versions provided the correct semantics. This has been fixed.

Documentation Change:

The following change should be applied to the "UPDATE (positioned) statement [ESQL] [SP]" topic. Note that this describes only Syntax 2

UPDATE update-table, ...

SET set-item, ...

WHERE CURRENT OF cursor-name

update-table :

[owner-name.]table-or-view-name [[AS] correlation-name]

set-item :

[correlation-name.]column-name = expression

| [owner-name.]table-or-view-name.column-name = expression

Each update-table is matched to a table in the query for the cursor as follows:

If a correlation name is used in the update-table, it is matched to a table in the cursor's query that has the same table-or-view-name and the same correlation-name

Otherwise, if there is a table in the cursor's query that has the same table-or-view-name that does not have a correlation name specified or has a correlation name that is the same as the table-or-view-name, then the update table is matched wit this table in the cursor's query

Otherwise, if there is a single table in the cursor's query that has the same table-or-view-name as the update table, then the update table is matched with this table in the cursor's query.

Otherwise, an error is returned.

Each set-item is associated with a single update-table, and the corresponding column of the matching table in the cursor's query is modified.

The expression on the right-hand side of each set-item can refer to columns of the tables identified in the UPDATE list; they may not refer to aliases of expressions from the cursor's query, nor may they refer to columns of other tables of the cursor's query which do not appear in the UPDATE list. Subselects, subquery predicates, and aggregate expressions can not be used in the set-items.

342167 If a proxy procedure was created such that the owner was a user without DBA permission, then executing that proxy procedure could have resulted in a 'permission denied' error. Note that this only happened if the remote procedure returned a result set. This problem has been fixed.
342173 The server was allowing the creation of multiple indexes with the same name on local temporary tables. This problem has now been resolved, the server will now generate an "Item already exists" error in this situation.
342176 Queries with correlated subqueries may have returned incorrect results if one of the following was true:

- The subquery was a single-row group-by subquery computing the LIST() function (in the HAVING clause or the SELECT list).

- The subquery was a single-row group-by without a HAVING clause, and the subquery was used in an EXISTS() or NOT EXISTS() predicate.

- The subquery was a grouped subquery and the correlated expressions were used in equality predicates and had different domains than the expressions being equated.

These problem have now been fixed.

342265 For request made over an HTTP link, the following properties and statistics were not being updated:

BytesReceivedUncomp,

PacketsReceivedUncomp,

BytesSent,

BytesSentUncomp,

PacketsSent,

PacketSentUncomp

These statistics are now updated on HTTP requests.

342273 When using the SyncProgressDialog class, some SyncParms settings were ignored. The problem would also have occurred when an application implemented its own synchronization progress dialog and used SycParms.CopyFrom() to transfer synchronization parameters from one connection to another. This has been fixed.
342291 When using the SyncProgressDialog class, some SyncParms settings were ignored. The problem would also have occurred when an application implemented its own synchronization progress dialog and used SycParms.CopyFrom() to transfer synchronization parameters from one connection to another. This has been fixed.
342308 On Windows NT, 2000, XP and 2003, when the server is run as a service, or if a fatal error or assertion occurs, one or more message is logged to the Application Event Log.

The Event source could have been "ASA", the server name, or the service name. The error or information message would have been something like:

The description for Event ID ( 1 ) in Source ( ASA ) cannot be found. The local computer may not have the necessary registry information or message DLL files to display messages from a remote computer. You may be able to use the /AUXSOURCE= flag to retrieve this description; see Help and Support for details. The following information is part of the event:

This message is now better formatted. The Event source is "ASA 9.0", and the message may be prefixed by the server name, or service name. The previous text will no longer be displayed.

Note, when deploying ASA servers to Windows NT, 2000. XP or 2003, the following registry key should be added so that Event Log messages are formatted correctly:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Eventlog\Application\ASA 9.0

and within this key, the REG_SZ value name EventMessageFile and value data <path>\dblgen9.dll. (dblgen9.dll can be used regardless of the language being used).

342309 After running the Index Consultant in dbisql, sorting the Summary table by the Value column would have caused an exception and displayed the Stack Trace dialog box. This has now been fixed to sort properly and not cause an exception.
342339 Pressing the HOME key should move the caret to the first non-whitespace character on the current line. Pressing it again should move the caret to column 1. For lines that started with a tab character, pressing the HOME key did not produce the correct results. This has been fixed.
342407 Inserting strings that were approximately 256 bytes in length, into a trie-based index, could have resulted in a corrupt index. Searching a trie-based index for strings that were approximately 256 bytes in length could have resulted in an incorrect result being returned. This has been fixed.
342427 Hiding the display of the Table or Overview via the keyboard could sometimes disable subsequent keyboard access until the mouse was used to restore focus to the MobiLink Monitor window. This has been fixed.
342519 When attempting to connect over the shared memory link, a rare timing dependant situation may have caused the application to hang. This was more likely (although still very rare) to have occurred on multiprocessor machines. This has been fixed.
342538 After a fatal server error, attempting to stop a server with dbstop would not have stopped the server or would have displayed an error.

Now, dbstop with the -y parameter, but without the -c parameter, will stop a server after a fatal error, as long as the server was started with the -gk command line option set to "all", (this is the default for the personal server). If the -y parameter is not used, dbstop will display the fatal error and prompt if the server should be stopped.

342613 If an outer merge join was used with a base table as one of the inputs, without intervening materialization, the results of the join were incorrect. Too few rows were returned from the base table. While the fault that caused this incorrect behaviour was present since 8.0.0, the incorrect results could not be returned for versions before 9.0.1 because a base table would never have appeared below a merge join operator without intervening materialization. This has been fixed.
342643 When unloading a database with a Multi-byte Character Set collation, using the Unload utility dbunload, if a database object, (such as a stored procedure, fuction etc) contained a MBCS character with 0x7b or 0x7d as a follow byte, the character would have been mangled. With 7-bit ASCII, the 0x7b and 0x7d correspond to brace characters.

As well, if the opbject contained more than 100 such MBCS characters with 0x7b or 0x7d as follow-bytes, dbunload could have crashed.

These problems have been fixed.

342652 If an application connected to the server via a secure link, (ie using the Encryption connection parameter), and then did a db_fini(), followed by another db_init(), any subsequent secure connections would have failed. The client log would have displayed the error, "Could not load the TLS library (dbtls9.dll)". This has been fixed.
342659 If the SUBSTR or BYTE_SUBSTR functions were called with negative Length and positive Start values and Start plus Length was less than zero, the result would have been a substring taken from the end of the string. Also, the behavior when the Start parameter was zero was unspecified.

Now, a negative Length parameter means "return at most nnn <characters | bytes> up to and including the start position". If Start is zero and Length is non-negative, a start value of 1 is used. If Start is zero and Length is negative, a start value of -1 is used.

For example:

select substr('abcdefgh',2,-1) ==> b

select substr('abcdefgh',2,-2) ==> ab

select substr('abcdefgh',2,-3) ==> ab

select substr('abcdefgh',2,-4) ==> ab

select substr('abcdefgh',0,2) ==> ab

select substr('abcdefgh',-2,-3) ==> efg

select substr('abcdefgh',-2,2) ==> gh

select substr('abcdefgh',0,-2) ==> gh

342660 Universally Unique IDentifiers, (UUIDs), consists of a 16 byte structure with the following format:

time_low unsigned long

time_mid unsigned short

time_hi_and_version unsigned short

clock_seq_hi_and_reserved unsigned small

clock_seq_low unsigned small

node character(6)

The server stores the unsigned long and unsigned short fields in big-endian byte order, where as the .NET structure stores the unsigned long and unsigned short fields in little-endian byte order.

This requires the byte order of the unsigned long and unsign short fields to be changed when inserting and retrieving UUID values, which was not being done. This problem has been fixed.

342661 The system procedures sa_index_levels() and sa_index_density() will now provide more information in their respective result sets.

The new columns for the two procedures are:

TableId: table id of the table the index is on

IndexId: index id of the new index

= 0 for Primary Keys,

= SYSFOREIGNKEY.foreign_key_id for Foreign Keys

= SYSINDEX.index_id for all other indexes

IndexType: the type of the index

= "PKEY" for primary keys

= "FKEY" for foreign keys

= "UI" for unique indexes

= "UC" for unique constraints

= "NUI" for non unique indexes

The procedures will continue to behave as before for old databases. It will also be possible to revert to the old behaviour on newly created and/or updated databases by simply dropping the corresponding stored procedure and recreating it with the old result set.

The new columns provide more information and also make the result set much more useful for the purposes of joining with other catalog tables.

342664 The DBTools sample could not be compiled as C++ code. The compile error was: error C2197: 'int (__stdcall *)(void)' : too many arguments for call through pointer-to-function

For more details see the Microsoft document Q117428. This problem has been fixed by renaming the file from main.c to main.cpp.

342684 An EBF install would have created the "Sample Applications and Projects" icon in the default "SQL Anywhere 9" folder, even if the original install used a different folder. This has been corrected.
342733 Starting the server with the command-line options -t (set quitting time) and -xs (use http or https protocols) could have caused it to hang with 100% CPU usage. The hang was more likely on multiprocessor machines. This has been fixed.
342817 When using the MobiLink authentication utility (dbmluser), updating a user password may have caused an ODBC error, although the update would have succeeded. This error message is no longer generated.
342821 If an error occurred while the server was creating the system trigger for a foreign key with a referential action, the server could have crashed. This has now been fixed.
342899 When listing indexes not used by the server during the workload capture step of the Index Consultant, indexes owned by "SYS" and "dbo" could also have been listed. Consequently, 'DROP INDEX' statements would have been added to the generated script for these indexes. The indexes would never actually have been dropped, as the server would have report errors when the script was run. This has been fixed.

A workaround is to delete the 'DROP INDEX' statement in the generated script for system tables.

342900 When a cached plan was used in a stored procedure for an UPDATE or INSERT statement, columns marked as DEFAULT TIMESTAMP could have received a stale value from a previous invocation of the statement. This has been fixed.

As a workaround, the database option Max_plans_cached can be set to 0 to get correct behaviour, although this may negatively impact performance.

342902 If a view was created which referenced a stored procedure in the FROM clause, rebuilding the database would have failed. Also, if the procedure name was not qualified with the owner of the procedure, users who were not members of the procedure owner's group would have been unable to reference the view. Now, the catalog definitions of views which reference stored procedures in the FROM clause, will have those references qualified with the procedure owner. An additional calls to dbo.sa_recompile_views() in the reload script will permit views which reference procedures to be recompiled after the procedures have been defined.
342914 Two new connection properties have been added, 'ClientPort' and 'ServerPort'. Calling connection_property( 'ClientPort' ) will return the client's TCP/IP port number, or 0 if the connection is not via the TCP/IP link. Calling connection_property( 'ServerPort' ) will return the server's TCP/IP port number, or 0 if the connection is not via the TCP/IP link.
342915 If Microsoft OLEDB support is not installed, a C++ application that uses the ASA OLEDB driver will fail in the call to CoCreateInstance. The failure code from CoCreateInstance does not give any indication as to the source of the problem.

Below is a sample C++ call to CoCreateInstance to initialize the ASA OLEDB provider.

CLSIDFromProgID(T2COLE(_T("ASAProv")), &clsid);

hr = CoCreateInstance( clsid, NULL,

CLSCTX_INPROC_SERVER,

IID_IDBInitialize,

(void**)&m_pIDBInitialize);

This problem is likely to occur on a Pocket PC 2003 device. The Pocket PC 2003 SDK (eg, \WinCE Tools\wce420\Pocket PC 2003) does not include the Microsoft Data Access 3.1 modules (like msdaer.dll, msdaeren.dll) that are present in older SDKs like the Pocket PC 2002 SDK (e.g., \WinCE Tools\wce300\Pocket PC 2002\dataaccess31\target\arm).

To help diagnose the problem, the ASA OLEDB provider has been changed to display a message box when it cannot access the Microsoft OLE DB Error Collection Service module.

The title of the message box is "Fatal Error".

The interior text of the message box will state something like "CoGetClassObject(CLSID_EXTENDEDERRORINFO) 0x8007007e ProgID: MSDAER.1". The hexadecimal number is the error code returned by CoGetClassObject(). In this example, the programmatic identifier associated with CLSID_EXTENDEDERRORINFO is "MSDAER.1".

The settings for CLSID_EXTENDEDERRORINFO can be examined in the system registry under HKEY_CLASSES_ROOT\CLSID\{C8B522CF-5CF3-11CE-ADE5-00AA0044773D}. Included is the path for the Microsoft OLE DB Error Collection Service module. This information can then be used to help determine if the required module is present on the system.

342927 Describing a column that appeared in both the GROUP BY clause and the null-supplying side of an outer join, may have incorrectly indicated that it is not nullable.

For example, the following query was affected:

select emp_id from employee key right outer join sales_order group by emp_id

This has been fixed.

342929 An internal error (ArrayIndexOutOfBoundsException) would have been reported when setting column breaks in the Import wizard, if the wizard was to create a new table for the data. This has now been fixed.
342968 If a view contained a SELECT list expression which was a CASE expression (syntax 1), then the corresponding expression could have been non-NULL in the query result.

For example:

WITH V AS ( SELECT dept_id, CASE dept_id WHEN 100 THEN 'A' ELSE 'B' END FROM department )

SELECT *

FROM rowgenerator R left outer join V on R.row_num = V.dept_id

WHERE R.row_num IN (99,100)

would have returned 'B' incorrectly instead of NULL for row 99. For the problem to have occurred, a branch of the CASE expression must have returned a non-NULL value when all of the columns from the underlying table were NULL. This problem did not affect Syntax 2 CASE expressions.

Similarly, if a column of a view was a string concatenation of the form " T.x || 'string' ", the resulting column would have been non-NULL, when it should be NULL.

These two problems have been fixed.

342990 If two tables had primary keys that included a signed bigint column and dbmlsync scanned operations in a single run on these two tables, where the values for the primary key were identical, it was then possible, (although rare), to lose or mangle operations. When this situation occurred, the two operations would have been interpreted as occuring on the same table, instead of different tables, thus causing the two operations to be merged into a single operation. This has now been fixed.
343042 Messages sent to the application could have been mangled due to incorrect character set translation or unnecessary translation to the OS charset. For example, the progess messages sent to the client machine during the execution of a CREATE DATABASE statement could have been mangled if the client machine's charset was X and the database charset was Y, where X was not equal to Y or, in some cases, where X and Y were the same, but X was not the OS charset. This has been fixed.
343043 Adding an Ultralite statement by calling the system procedure, ul_add_statement(), could have caused a server crash if the third parameter contained a long constant string embedded within the SQL query. This has now been fixed.
343076 Referencing the built-in function PATINDEX() in upper-cas, on a database using the Turkish collation 1254TRK, could have caused the server to crash. This is now fixed.
343084 Set expression queries, (ie UNION, EXCEPT, or INTERSECT), with grouped queries using correlated subselects, may have crashed the server. This has now been fixed.

The crash would have occurred if the grouped query block was an immediate child of a set expression query, the GROUP BY clause contained a correlated subselect and the outer reference of the subselect was an alias defined in the grouped query

For example:

SELECT file_id A1

FROM SYSTABLE T

GROUP BY file_id, ( select row_num from rowgenerator R where R.row_num=A1 )

UNION ALL

SELECT 1

FROM DUMMY

343085 The UDP listener only processed one message per iteration, rather than processing all queued messages. This is now fixed, so that user will no longer need to adjust to a small interval, even when the notifier send rate can be higher.

A new upper bound of 15 sec is now imposed on the -i polling interval for UDP. So specifying an interval value higher than 15, it will be treated as 15 seconds internally.

343088 When using the Import wizard, if the keyboard was used to traverse between the two radio button options on the second page, the controls on the page did not enable and disable correctly. This has been fixed.
343092 Queries with multiple EXCEPT clauses could have returned incorrect results. In this case, the EXCEPT clauses were incorrectly being treated as EXCEPT ALL and duplicate rows are not eliminated. This has been fixed.
343130 Expression caching is used to avoid re-computing the result of a user-defined function or a subquery within a query. If a function or subquery is evaluated with the identical parameters to a previous invocation, the cache is used to return the previous answer.

Previously, the cache compared arguments for equality using the database comparison rules. For example, in a case-insensitive database, argument 'x' was compared equal to 'X'. This could lead to different answers than expected because the two strings are not identical. Now, arguments to the expression cache are only considered equal if they are identical.

343152 If a "simple query", (see documentation for definition), referenced all primary key

columns in its WHERE clause in a way that the result set could not have had more than one row, then the estimated row count could still have been greater than 1. This has been fixed. Note, estimated row counts are always return as negative numbers.

343155 A LOAD TABLE statement, executed as part of a stored procedure or an event, could have crashed the server when run a second time. This has been fixed.
343176 When using the iAnywhere JDBC Driver, calling the method DatabaseMetaData.getURL() would have returned null, instead of the actual URL used to establish the connection. This problem has been fixed.
343177 Fetching the server's message text lines via PROPERTY( 'MessageText', line_number ) could have crashed the server, if one of the message lines was 256 bytes or longer in length. Note that connecting from Sybase Central fetches all of the message text lines and hence connecting from Sybase Central could have crashed the server. This has now been fixed.
343253 If the database option "Close_on_endtrans" was set to ON, then the server would have failed to close some cursors when executing a COMMIT.

For example, the second fetch should fail with a "cursor not open" error, but does not:

BEGIN

DECLARE c_fetch CURSOR FOR SELECT 1;

SET TEMPORARY OPTION CLOSE_ON_ENDTRANS = 'ON';

OPEN c_fetch;

FETCH c_fetch;

COMMIT;

FETCH c_fetch;

END;

As well, if the database option "Ansi_close_cursors_on_rollback" was set to ON, then the server could have crashed in some situations where a rollback occurred inside a call to a user defined function.

For example, the following would have caused a server crash:

create function DBA.foo()

returns int

begin

grant select on systable to non_existent_user;

return 1

end

create procedure bar()

begin

set temporary option ANSI_CLOSE_CURSORS_ON_ROLLBACK = 'on';

select foo()

end ;

select * from bar()

Both of these problems have now been resolved.

343308 If a query used a blob that was stored in a work table, which was then read from the work table and copied to another expression, and that expression was materialized into a block of rows in memory, then the server could have crashed or reported an assertion failure, when attempting to returning the blob value as part of the result set.

For example, the following query could have generated the failure:

create procedure P_Blob2( @x int )

begin

select @x || repeat('long string',1000) x

from rowgenerator

where row_num = @x

end

select x, sum(row_num)

from (

select row_num, DT.x

from rowgenerator R, lateral( P_Blob2(R.row_num) ) DT

union all

select 1, '' ) DT2

group by x

This has now been fixed.

343343 Executing LOAD TABLE ... FORMAT 'ASCII' ..., where ASCII was in quotes and at least one of the 'I's was in upper case, would have failed with a syntax error when executed on a database using a Turkish collation. This is now fixed, but a work-around is to remove the quotes from 'ASCII'.
343380 The server runninmg on Windows NT, 2000, XP or 2003 could have hung, with 100% CPU on shutdown. The database file and server name were no longer in use by the hung server, so another server could have been started with the same name and on the same database. The hung server had to have been shutdown using the Task Manager. On machines where this hang occurred, it would have happened every time a server was shutdown.

This problem has been fixed by adding a two second wait for the shutdown event. If this two second timeout is reached, the message "The TCP listener failed to shutdown cleanly within the timeout period" will appear in the server's output log, likely more than once and with more than one listener type (for example TCP and UDP).

This problem occurred when the event which normally signals the listener thread to shutdown was lost, or intercepted by other software running on the machine. For personal servers using only shared memory connections, a workaround to this lost event problem is to use the -x none option.

343401 Attempting to query or alter a table with a foreign key that referenced a table in another dbspace, could have caused the server to crash or fail with an assertion error. This has now been fixed.
343445 Preparing statements with the WITH <temporary-views> clause and using question marks '?' as place-holders for bound variables, could have caused the error "Syntax error near 'host variable'". This has been fixed.
343454 When starting a database, UltraLite would have overwritten an existing database file, unless it matched exactly the application, this included files which were not databases. The intention was to simplify the upgrade process: when a new application was deployed, the existing database was automatically recreated to match the new application (schema, options, etc). This rule was relaxed for UltrLite applications using encryption, so that an application without encryption enabled would not erase an existing encrypted database. Instead, an error was returned when starting the database. This case requires an explicit drop databse call if desired.

Now, UltraLite will perform additional checks to ensure a file is actually an UltraLite database before proceeding to overwrite it. This means that UltraLite will no longer overwrite or drop a file which is not actually a database.

New errors reported for this case are as follows:

SQLE_INVALID_DATABASE is signaled when the file is not a database. The file is left as is.

SQLE_CANNOT_ACCESS_FILE is signaled when the nature of the file cannot be determined. The file is left as is. This can only happen if there is an I/O error reading the file (unlikely or symptomatic of much larger problems).

This was motivated by a possible security hole where the ActiveX version of UltraLite could be made to erase arbitrary files using a script in a web page. Note, this does not apply to Palm record-based stores.

343460 If a combination of inserts and updates existed in the upload stream for a given table, and an error occurred when MobiLink was applying these operations, it was possible for the wrong script contents to be written to the MobiLink log when the error context information was being written. The correct script contents are now written to the log.
343472 An attempt to insert a null value into a binary column, would resulted in an access violation. This has been fixed.
343503 A "Connection was terminated" exception would habe been thrown when executing a command with a pooled connection, if the server was no longer available. This problem has been fixed.
343567 A recurring scheduled event could have failed to fire at each of the times specified by its schedule. The interval between scheduled executions needed to exceed one hour for this problem to appear. For servers prior to 8.0.2 build 4335 or 9.0.0 build 1232, the interval needed to exceed one day for the problem to occur. The problem was also dependent upon whether or not the server was restarted between event executions. This has now been fixed.
343573 A query that contained an EXISTS subquery with a large number of outer references, could have caused the server to fail with assertion 101505 - "Memory allocation size too large"

Now, such queries fail with the error message: "Statement size or complexity exceeds server limits", (SQLCode -890). This error can be avoided by reducing the number of outer references from the subquery or by increasing the server page size.

343580 The SetMessageListener method could have been used to register a message listener delegate function only if the queuename syntax was used. The agentid\queuename syntax is now supported.
343581 When a row was inserted into a table with a COMPUTE or CHECK clause that contained a correlated subselect, where the outer references was to a column of the base table, the server may have crashed. This has been fixed.

In the example below, the outer reference T.a is used in a subselect of the COMPUTE clause for the column T.b:

create table T(

a int,

b char(10) not null COMPUTE (left( '0001', (select max(row_num) from rowgenerator where row_num = T.a )) ))

insert into T values (1, '1')

343603 A RESULT clause was added to the definition of a procedure when it was created, if the procedure called another procedure which returned a result set. This made it appear that the RESULT clause was specified explicitly by the creator, and affected how calls to the procedure were handled by dbisql and applications using ODBC. If multiple result sets were returned, the second and subsequent ones may have been missing columns. The RESULT clause is no longer added in this situation.
343613 When using the Data Import wizard to import data into an existing table, an exception could have occurred when selecting a new column in the combobox on page 4 of the wizard. This has been fixed
343618 A very long diagnostic message from a communication link could have caused the client or the server to have crashed. In order for this to have occurred, which would have been rare, the LOGFILE connection parameter or -z server option would have had to have been used. This is now fixed.
343619 The error message text returned to the application after a server fatal error or assertion may have had "???" where it should have had details of what failed. This was always true on subsequent requests to the server after the fatal error occurred. This has been fixed so that details of the fatal error or assertion are now included in the error message text.
343621 When certain collation names or IDs were passed to SORTKEY or COMPARE, the error 'Invalid parameter' would have been reported. These collations include 'turnocs', 'cyrnocs', 'rusnocs', and 'turnoac'. This has been fixed.
343622 The system function db_name() would have returned a database name truncated to 127 bytes, however, it should have returned a name truncated to 128 bytes. In Sybase Central, it could have appeared as though other databases were present on the server, as the name presented was just the truncated name of the database to which Sybase Central was already connected. This has been fixed.
343623 Using the Tools->Options->Overview menu and dialog options to change the Overview colors of the system watches, would have had no effect. This has been fixed. As a workaround, the Overview colors of the system watches could be changed under the Watch Manager (Tools->Watch Manager) and editing the watch.
343627 The server could have failed with assertion 100904 during recovery on a database involved in Mobilink synchronization. This is more likely to occur on a blank padded database. This fix will now allow recovery to complete.
343683 It was possible for the server to fail with a "divide by zero" exception. The chances of this failure taking place were very small. The problem has now been resolved.
343686 Starting with version 8.0.0, it was not possible to connect to a database using a userid which had an empty string for a password, when using jConnect and the "Connect" dialog to specify the connection parameters. This was a bug, and has been fixed.

This problem affected only jConnect connections. A workaround is to use the iAnywhere JDBC Driver which did not suffer from this restriction.

Note, this restriction affects the ASA and Mobilink plug-ins for Sybase Central, dbconsole, and dbprdbg as well.

343687 An attempt to create column statistics on a server running on a multi-CPU machine, could have caused a server crash if the statistics being generated were also being used by other concurrently running queries. The chance of the crash occurring was proportional to the amount of concurrent access to column statistics taking place. This problem has been resolved.
343689 If a checkpoint occurred concurrently with the sending of blob data to an application, the server could deadlock. This is now fixed.
343705 The Histogram utility dbhist would have generated only "00,000" labels in the Excel Sheet if the Windows decimal separator under Regional Options was a comma. This has been fixed.
343813 If the redirector that is shipped with MobiLink was configured for iAnywhere Wireless Server, the redirector would have failed with the error "ERROR: user requesting redirection to unknown server:iaws". This has been fixed, the redirector can now be configured for either MobiLink or iAnywhere Wireless Server.
343815 If the expression for a COMPUTE or DEFAULT clause was very long, it could have resulted in a server crash. An error message is now given if the expression is longer than is supported by the server. The maximun expression length for a COMPUTE or DEFAULT clause is based on the database page size. It is approximately page_size - 64 bytes.
343820 If a subselect that had no outer references, or a non-deterministic function that had no non-constant parameters, was used below a work table and in a prefilter above the work table, as shown in the graphical plan, then the server could have crashed or returned the wrong answer.

For example,the following query shows the problem on the asademo database if the JHO join method is selected:

select ( select '12' from dummy D1, dummy D2 ) SubQ1,

( select '13' from dummy D3, dummy D4 where SubQ1 > 10 ) SubQ2

from rowgenerator R1 left outer join employee E on R1.row_num = E.salary

where (R1.row_num between SubQ1 and 255,100)

and SubQ2 = '13'

This problem has now been fixed.

343839 When exported table data in SQL format using the OUTPUT statement, but without specifying "*" as the column list, then importing the resulting .SQL file using the INPUT statement would have failed with an error message.

For example, running the following statements:

CREATE TABLE test ( c1 INTEGER, c2 INTEGER );

INSERT INTO test VALUES( 123, 456 );

SELECT c1, c2 FROM test;

OUTPUT TO test.sql FORMAT SQL;

READ test.sql

would have caused an error message which included the text "Table FROM not found". Note that there must be a blank in the column list -- "c1, c2" -- for the message to have appeared. As well, if the table contained NULL values, dbisql could have reported an internal error. This has now been fixed.

343849 When starting the MobiLink Server on Windows with an Internet Explorer older than version 4.0, it would have failed with an error that certain entry points could not be found in wininet.dll. The wininet dependency has now been removed from the server. The same dependency has also been weaken on the client side, so that the relatively up-to-date wininet.dll is required only when automatic dialup is invoked.
343923 When run on SuSE 9 or RedHat Advanced Server 3.0, the server could have hung on startup. For this hang to have occurred, the asynchronous I/O library '/usr/lib/libaio.so' must have been installed and the Linux kernel had to have support for asynchronous I/O. This hang has now been fixed. A workaround is to user the server command line option -ua, which disables the use of the Linux kernel asynchronous I/O support.
343935 The server could have crashed when an attempt was made to calibrate the database server using the ALTER DATABASE statement. The crash was most likely to occur when the temporary dbspace had not yet been written out to disk. This has been corrected.
343936 When using the MobiLink Monitor to monitor MobiLink synchronizations with a DB2 consolidated database, the Monitor might unexpectedly disconnect from the MobiLink server. This has been fixed.

A work around is to change the ml_table MobiLink system table to not have a value of 0 for table_id (the primary key), by applying the following SQL commands to your DB2 consolidated database when the MobiLink server is not running (and only after verifying that ml_table has a row with table_id of 0):

create table tmp_id(id integer not null)

create table tmp_name(name varchar(128) not null)

insert into tmp_id select max(table_id)+1 from ml_table

insert into tmp_name select name from ml_table where table_id=0

insert into ml_table (table_id, name) select id, '_placeholder' from tmp_id

update ml_table_script set table_id = (select id from tmp_id) where table_id=0

delete from ml_table where table_id=0

update ml_table set name = (select name from tmp_name) where table_id=(select id from tmp_id)

drop table tmp_id

drop table tmp_name

commit

343952 Executing a query with the following conditions, would have crashed the server:

1) it had a constant or subselect in the select list of a derived table

2) the derived table was on the null supplying side of an outer join

3) the derived table had another derived table in its FROM clause

4) the second derived table was a query expression (ie UNION, INTERSECT or EXCEPT)

5) one of the branches of the query expression had a constant or subselect as the last item of its select list

For example:

select * from employee left outer join

(select 1 from (select emp_id from employee union select 1) dt) dt1(x) on 1=1

This has been fixed.

343962 DBISQL would report an error for valid statements following an actual error.

For example, executing the (following invalid statement:

SET TEMPORARY 123

would result in an error message, which is correct. Then executing the following valid statement:

SELECT CURRENT TIME

would result in a syntax error. The error dialog would contain the two statements run together:

SET TEMPORARY 123SELECT CURRENT TIME

This problem has been fixed.

344018 The MobiLink user authentication utility dbmluser would have crashed if it couldn't determine the default collation from the locale setting. The documentation is incorrect, the default collation does not fall back to 1252LATIN1 on single-byte machines and 932JPN on multi-byte machines. The default collation actually would have become 'unknown', (or in some cases 'ISO_BINENG'), which was a collation that dbmluser did not expect.

Now the problem in determining the default collation has been corrected, as well as the cause of the crash.

344019 Cancelling a CREATE DATABASE or DROP DATABASE statement, could have caused the server to hang, if the cancel occurred concurrently with the cache shrinking. This has been fixed.
344020 Calls to the db_stop_database function would have failed if the server was not found using the shared memory link, even if the LINKS parameter was specified in the connection string or DSN. The LINKS parameter was being ignored.
344023 If a group-by ordered rollup was used to compute results for a ROLLUP query, the server could have crashed or returned an incorrectresult if the input to the GrByOR was not a sort (for example, a clustered index scan instead). This has been fixed.
344052 Attempting to trigger an event from within Sybase Central, by right-clicking the event and selecting the "Trigger..." menu item, would have caused a syntax error when clicking the Trigger Event dialog's OK button if one or more event parameters were specified and the list of event parameters was not enclosed in parentheses. Now, the parentheses no longer need to be included in the event parameter list, since they are added utomatically.
344063 Fully-enumerated plans that included sorts, materialization, etc, may have had incorrect costs reported by the optimization logger. The effect was that plans that were marked as picked by the optimizer, may have had a higher reported cost than plans that had been rejected. This has been fixed.
344137 Using the OLEDB driver, a conversion of a value of type DBTYPE_IUNKNOWN to a value of type DBTYPE_STR would have failed.

This problem could have occured if a column was of type adLongVarWChar as in the following Visual Basic example:

If rsTempSource.Fields(strFieldName).Type = ADOR.DataTypeEnum.adLongVarWChar Then

rsTempTarget.Fields(strFieldName).Value = Trim(rsTempSource.Fields(strFieldName).Value)

rsTempTarget.UpdateBatch()

End If

Binding would have failed for a column of this type resulting in a "Count field incorrect" error. This problem has been corrected.

344159 A hash join with an IF or a CASE expression with a predicate used in a join condition could have caused a request to fail with the error:

"Run time SQL error -- *** ERROR *** Assertion failed: 102501 (10.0.0.1267)

Work table: NULL value inserted into not-NULL column (SQLCODE: -300; SQLSTATE: 40000)"

This also affected INTERSECT implemented with hash join. This problem has been fixed.

344168 Multiple error messages could have been reported when attempting to fetch the results of a SQL statement, if the data could not be fetched for any reason. Now, only the first error message is displayed.

Note, this problem was limited to connections that used the iAnywhere JDBC Driver.

344169 The MobiLink ASA client, dbmlsync, and the Log Transfer Manager for ASA, dbltm, may have crashed, if a transaction spanned multiple transaction logs. This has been fixed.
344171 When using Sybase Central's Log Veiwer, the Newest First and Oldest First sort order was reversed. This has been corrected.
344173 If a new procedure was created after the Breakpoint Creation dialog had been used, it would not have appeared in the drop down list of procedures in the Breakpoint Creation dialog. This has been fixed.
344176 Sybase Central's Log Viewer dialogs (Filter Events, Find etc) were not closed when the escape key was pressed. The escape key will now close these dialogs.
344180 A new connection property LoginTime has been added. It returns the date and time when a connection was established.

Example:

The login time for all connections can be displayed with:

select connection_property('LoginTime',number)

from sa_conn_info()

344205 For a query with a predicate of the form 'EXISTS( subquery)' subquery flattening was always done if the subquery was correlated. However, when the subquery was correlated with the rest of the query only by a Cartesian product, the execution time of the rewritten query could have been much lomger than the execution time for the original query (if the EXISTS subquery had not been flattened). The optimizer now trys to determine if flattening the subquery is beneficial for finding a better plan for the main query block (for example, if the subquery contains equijoins with the tables from the main query block, or it contains sargable or local predicates on the tables from the main query block). The flattening of EXISTS subqueries is now done only if the subquery is correlated and the optimizer can determine that flattening the subquery will result in finding a better access plan for the main query block.

Example of an EXISTS subquery which is not flattened after this fix:

select *

from T

where EXISTS( select 1 from R where R.X LIKE T.X + '%')

344210 For queries with result set expressions of type timestamp, the analyzer could have generated C++ code that would not have compiled. For example, if c1 was a column of type datetime, then C++ code generated for the following query would not have compiled:

SELECT max(c1) FROM T

The C++ code generated included a method on the generated ULResultSet class that returned the column抯 SQL type (GetColumnSQLType()). The symbol generated for some timestamp expressions would have been SQL_TIMESTAMP_STRUCT which was not defined (the valid symbols are defined in ulapi.h).

This has been fixed so that the column SQL type is now defined as SQL_TIMESTAMP.

344211 Subquery flattening is now disallowed in some cases when a procedure call appears in the FROM clause. Specifically, it will not be used when a rowid for a procedure call would be required for a distinct on rowid as in the following example:

CREATE PROCEDURE product_proc()

BEGIN

DECLARE varname integer;

set varname = 1;

SELECT * from product

END;

SELECT description

FROM product_proc() p

WHERE EXISTS

(SELECT *

FROM sales_order_items s

WHERE s.prod_id >= p.id

AND s.id = 2001)

group by description

The symptom was unwanted duplicate rows in the result.

344236 It was not possible to serialize the class iAnywhere.UltraLite.SQLException like other exceptions. This has been fixed for the full .NET Framework. The .NET Compact Framework does not support serialization of exceptions.
344252 Calling the method Connection.StopSynchronizationDelete() would have thrown a missing method exception. This has been fixed.
344257 The ordered distinct operator may have returned duplicate rows. For this to have occured, there must have be a sort immediately below the distinct, the distinct must have been beneath a group-by operator, and the distinct must have included rowid expressions (usually due to the presence of a subquery). Because a hash-based distinct is usually selected over an ordered distinct with a sort, the occurance of this problem will be rare.
344274 If a MobiLink server was run as a Windows service, and it had a dependency on an Oracle service that was the consolidated database server, MobiLink may have failed to start. The error would have mentioned being unable to connect to the consolidated database.

Now, the MobiLink server retries connecting on startup. Retries are once a minute for ten minutes. After this, failure to connect results in startup failure.

344289 When saving a file from the MobiLink Monitor in CSV format, it would have always used commas as the column separators even when the decimal separator (in the start_time column) was also a comma. It would also have used a non-international format for the date part of the start_time column. These problems have been fixed. If the locale's decimal separator is a comma, then the MobiLink Monitor will use semicolons instead of commas for the column separators. (This is consistent with Microsoft Excel behaviour, so that the resulting file can now be read into Excel when Excel is running in a locale that uses comma for the decimal separator.) The MobiLink Monitor now can read either column and decimal separator combination. Also, the start_time column now uses ISO 8601 date and time format (as is used in the rest of the MobiLink Monitor).
344313 A query would have failed with the error "column ... not found" under the following conditions:

1) it contained an outer join

2) the null-supplying table was a grouped derived table

3) one of the select list items of the derived table was a constant or null-tolerant function

4) one of the tables in the FROM clause of the derived table was a view, that could have been flattened

This has been fixed.

344318 When the MobiLink Synchronization Client dbmlsync was run in such a way that more than one synchronization occurs during a single instantiation, (this occurs when more than one -n option is specified on the command line, scheduling options are being used or the restart parameter of the sp_hook_dbmlsync_end hook is used to restart a synchronization), an operation uploaded during one synchronization might have been uploaded again during a later synchronization in the same dbmlsync instantiation. This problem only occurred when the -urc commandline option was used with a value greater than 200060 and was more likely to have occurred when the -urc value was increased. This behaviour has been fixed.
344321 If an online transaction log was truncated, just when dbremote started scanning the online log, dbremote may have resent transactions that had been sent in previous messages. This problem is now fixed.
344347 Creating a view with a deeply nested structure (e.g. a large number of UNIONs) could have caused the server to crash. These types of queries will now return the error -890 "Statement size or complexity exceeds server limits".

A work-around is to increase the size of the server's stack using the -gs or -gss commandline options.

344354 Version 9.0.0 made changes to the rules for when an index can be used to satisfy a search argument with values of different domains. These changes, required for correctness, prevented an index from being considered for comparisons of the form:

numeric_col <comparison operator> double_value

where numeric_col is a column of type NUMERIC (or DECIMAL), <comparison operator> is one of ( <, <=, =, => > ), and double_value is a value of type FLOAT, REAL, or DOUBLE. The server does such comparisons in the DOUBLE domain. The value of numeric_col is converted to a DOUBLE and compared to the double_value (promoted to type DOUBLE if necessary).

Since DOUBLE is an approximate data type, there are NUMERIC values that can not be precisely represented as a DOUBLE. For example, consider the following:

CREATE TABLE T( id int, n NUMERIC(30,6) );

INSERT INTO T VALUES( 1, 9007199254740992 );

INSERT INTO T VALUES( 2, 9007199254740993 );

CREATE VARIABLE double_value DOUBLE;

SET double_value = 9007199254740992;

SELECT * FROM T WHERE n = double_value;

The correct answer to this query is both rows of the table, because both 9007199254740992 and 9007199254740993 convert to the same DOUBLE value, and therefore compare equal to double_value when compared in the DOUBLE domain.

If, on the other hand, the server was to have used an index scan, it was equivalent to the following query:

select * from T where n = CAST( double_value as NUMERIC )

This latter query returned no rows because the value of CAST( double_value as NUMERIC ) is 9007199254740994. When compared as numerics, neither of the rows of T match this value.

The change to avoid selecting an index for this case guaranteed correct results, possibly at the cost of performance. An enhancement has now been implemented for the rules for determining whether an index can be selected, so that an index can be selected for some cases which are guaranteed to give the correct results. After this change, an index can be used if the following conditions are met:

1 the numeric column has a precision that is 15 or lower

2 the comparison operator is equality (=), or the value double_value is known at query open time and can be converted to a NUMERIC value without loss of precision.

That is, the double can be converted to a NUMERIC with precision and scale limited by the connection options PRECISION and SCALE such that CAST( CAST( double_value AS NUMERIC ) AS DOUBLE ) = double_value.

The value 15 is the DBL_DIG quantity for normalized floating point numbers, and represents the number of decimal digits that can be represented by a double without loss of precision. If a column is declared as NUMERIC with a precision higher than 15, then the column can contain values that can not be represented exactly by a DOUBLE type. Therefore, it is possible for an index scan to return the wrong answer in this case, and the server does not consider using an index for these cases.

344384 Removing the PUBLIC group from the SYS group by executing the statement, "REVOKE MEMBERSHIP IN GROUP SYS FROM PUBLIC", would have prevented connections to the database from Sybase Central. The workaround is to add the PUBLIC group back to the SYS group

by executing the statement "GRANT MEMBERSHIP IN GROUP SYS TO PUBLIC"

When Sybase Central connects, it executed a query that references the "SYSPROCPARM" table. This query did not qualify the table by the table owner "SYS", which meant it was not found, which caused the query to fail. This problem was fixed by qualifying the reference to "SYSPROCPARM" by adding the owner "SYS".

344414 Executing a SQL statement containing a string that was larger than the page size of the database, could have caused the server to crash. This problem has now been corrected.
344415 The URL supplied to an HTTP service created with URL ON would have contained HTTP-encoded characters. For example, if there was a space in the URL, the URL supplied to the service would have contained "%20" instead. This has been fixed by removing the HTTP escapes.
344417 If a successful database connection is terminated without first doing a database disconnect, a "connection terminated abnormally" warning message is displayed in the server console. Common reasons for this condition to occur include the application was terminated, the application crashed, or the application ended without correctly closing the connection.  If an ESQL app did a db_string_connect or EXEC SQL CONNECT but did not do a db_string_disconnect or an ESQL SQL DISCONNECT, this warning would have occurred. Similarly if an ODBC application did a SQLConnect or SQLDriverConnect without doing a SQLDisconnect this warning would have occurred.

If the connection was a TCP/IP or an SPX connection and the client end of the connection was closed without first disconnecting, and -z wasn't used, the server would have displayed the message "Connection terminated abnormally; SERVER socket shut down" in the console. This has been fixed so that it displays "Connection terminated abnormally; client socket shut down."

344440 If multiple concurrent connections were made to a database that had just been started (e.g., multiple connections autostart the same database), then it was possible for the server to crash. Although the probably of the crash taking place was extremely low. The problem has now been resolved.
344452 The UltraLite Code Generator, ulgen, could have hung if provided a trusted root certificates file, (via the -r option), which contained PEM objects other than certificates. This has been fixed.
344503 CUBE, ROLLUP, and grouping set queries would have had grouping expressions, that appeared in the select list, incorrectly described as not nullable. This has been fixed. (Note that only ROLLUP was available in 9.0.0).
344544 When using IBM's DB2 ODBC driver, the MobiLink server may not have been able to insert or update BLOBs bigger than 32K. The error in the MobiLink log (using IBM DB2 version 8.1), would have been:

DIAG [22001] [IBM][CLI Driver] CLI0109E String data right truncation. SQLSTATE=22001 (-99999)

This has been fixed.

344566 In some rare situations, it was possible for the method Connection.Synchronize(SyncProgressListener) to have failed without issuing a SyncProgressState.STATE_ERROR or SQLException message. For example, when an application used a large number of connections. It was also possible that the application may have hung. This has been fixed.
344576 It was possible that the SQL displayed for a procedure, function, view or trigger could have been corrupted in the right-pane or in a separate editor window. This would only have occurred if the SQL contained comments before the owner and name, or if the SQL for a

procedure or view did not contain an open parenthesis after the name, which might have been the case if the procedure or view took no parameters and was in the Transact-SQL dialect. This has been fixed.

344596 Specifying the -q commandline option (suppress banner) on the Service Creation utility dbsvc, without the -y commandline option (delete or overwrite without confirmation), would not have prevented prompts when modifying or deleting an existing service. The prompts are now suppressed, and the action will not be carried out unless the -y switch is also specified.
344618 Executing a query where the optimizer had chosen a hash join, could have caused the server to fail with a fatal error, "dynamic memory exhausted". This has been fixed.
344643 Executing a DROP STATISTICS statement with the database option Blocking = 'OFF', that failed because the table being modified was under use by another connection, could have caused the server to crash. This problem has been fixed.
344647 When using the Sybase Central Performance Monitor, if a statistic was added to the chart, the chart was displayed, and then another statistic was added from it's property sheet, the chart will not display the second statistic in it's legend list. This has been fixed.
344653 When performing an update of a cursor using host variables, or the ODBC SQLSetPos( ..., SQL_UPDATE, ... ) function, the server could have incorrectly returned the error:

-121 "Permission denied: you do not have permission to update ... "

if the select list referenced columns of an updatable view. This problem has been fixed.

344703 Queries using predicates with subqueries containing outer joins might have returned incorrect result sets, when the following conditions were true:

(1) the subquery qualifyed for being flattened

(2) the subquery contained an outer join.

(3) the preserved side of the outer join didn't have a join predicate with the null-supplying side beside the ON condition of the outer join.

(4) the preserved side of the outer join had a semijoin (i.e., JE or JHE) in the access plan for the query

For example:

If the following query had the plan: T<seq> JE R<seq> JNLO S<seq> incorrect result set might have been returned for certain instances of the tables T, R, and S.

select *

from T

where exists( select 1

from R left outer join S ON (R.x = S.x)

where S.y is NULL or S.y = T.y )

This has now been fixed.

344705 The system function db_property( 'name' ) could have returned garbled data if the database character set was not equal to the OS character set, but only if the database was created on the command line or autostarted. Databases started by the 'START DATABASE' statement were unaffected.

There were numerous other instances where the character set of various strings was not tracked, converted, or maintained correctly. The following properties were also corrected:

db_property( 'alias' )

db_property( 'file' )

db_property( 'logname' )

db_property( 'logmirrorname' )

db_property( 'tempfilename' )

property( 'name' )

Also, cursor names were not being converted to database charset, but were left in the application's charset. The database name sent for a dbstop request was also left in the application's charset. The database name for a STOP DATABASE statement was left in the database charset, rather than the required OS charset. When autostarting a database, the database filename (DBF connection parameter) was converted to the database charset, rather than OS charset.

These problem have now been corrected.

344712 If a named connection was forcibly dropped by the server, due to a liveness or idle timeout, the next attempt by the same application to make a connection with the same name would have failed. This has been fixed.
344732 If a row was added to a recordset with an autoincremented primary key, the new autoincremented value was not updated in the recordset. This has been fixed for server-side keyset and dynamic cursors. The following server-side cursors support refetching of column values: keyset, dynamic, and static. Forward-only cursors are not supported. Due to the way ADO interacts with the OLEDB provider, no client-server cursors support refetching of the columns.
344761 A java class, running in the server's VM, that attempted to read more columns from a resultset than were available, would fail with an exception. This is expected, but when the class terminated, the server would fail with the assertion "Cursor not being unlocked". This is now fixed, the assertion will no longer occur.
344829 Reloading a database may have failed, if a server with ASLANG=german (or GE) was used by dbunload to created the reload.sql file. The problem was due to an incorrect comment character, one dash was missing. This has been fixed
344838 Performance of the 8.0.2 server when run on Solaris 9 or 10 machines, was poor compared to the server running on Solaris 6, 7 or 8, especially

with large databases. The problem was due to dynamic cache sizing not being enabled for servers running on Solaris 9 or 10, thus the server never grew the cache to accomodate large databases. This has now been fixed, dynamic cache sizing is now enabled when the server is run on Solaris 9 or 10. A work around is to start the server with a sufficiently large cache.

344861 When run on Mac OS X, HP-UX and Compaq Tru64 platforms, the server was not listening to the correct UDP ports, which could have caused applications to fail to find the server when attempting to connect.

The server listens to UDP ports and responds to requests on these ports so that applications can locate the server by server name, even if the server starts on a TCP/IP port other than the default port (2638). Since Mac OS X, HP-UX, and Compaq Tru64 platforms do not allow multiple processes to bind to the same UDP port, connections to server running on these platforms, must specify the TCP/IP port number (via ServerPort) if the server is not using the default TCP/IP port (2638).

If the server's TCP/IP port number is 2638 (the default), the server listens to UDP port 2638, otherwise the server should listen to the same UDP port as the TCP/IP port. For the Mac OS X, HP-UX, and Compaq Tru64 platforms, the server should NOT listen to UDP port 2638, even though servers on other platforms do additionally listen to UDP port 2638. The reason servers on these platforms should not listen to UDP port 2638 is if a second server starts on TCP/IP port 2638, the UDP port 2638 must remain available for the second server.

Note that in order to connect over TCP/IP to a server using a TCP/IP port other than 2638 running on the Mac OS X, HP-UX or Compaq Tru64 platforms, the client must specify the port of the server.

For example, if the server is started with the command "dbsrv8 -n MyASAServer asademo.db", a client on the same subnet can find the server using the connection parameters "eng=MyASAServer;links=tcpip".

If the server is started on Mac OS X, HP-UX or Compaq Tru64 with the command "dbsrv8 -n SecondASAServer -x tcpip(port=7777) asademo.db", a client on the same subnet can find the server using the connection parameters "eng=SecondASAServer;links=tcpip(port=7777)". Note that if the server was running on a different platform, then the client would not need to specify the port TCP/IP parameter.

Additionally, on Mac OS X, HP-UX and Compaq Tru64 platforms, if a server was already using port 2638, and a second network server was started without the ServerPort parameter, this second network server should fail to start. Before this change the second network server would have chosen a different port and started. The reason the network server should fail to start in this case is so that user can specify the server's port number which all clients must also specify (if the server were allowed to start, the port number could change if the second server was restarted, causing clients to fail to connect in the future). Note that personal servers will start even if port 2638 is in use, since shared memory is normally used to connect to personal servers.

This has been fixed so that on Mac OS X, HP-UX and Compaq Tru64, servers listen to the correct UDP ports, and network servers fail to start if TCP/IP port 2638 is in use and no port is specified.

344946 Large or complicated statements could have caused the server to crash with a stack overflow error, or to return a fatal error "memory exhausted". Both situations would have lead to the server failing to respond to further requests.

For example, a statement of the following form could have caused the problem:

select 1

+ (1+1+...+1) -- 10,000 '1' literals in the expression

+ ...

+ (1+1+...+1) -- above parenthesized expression repeated 11 or more times, depending on cache size

Requests could also fail with error -890 - "Statement size or complexity exceeds server limits", if the main heap grew to be near <maximum cache size>/<number of workers>.

These problems have now been fixed.

344958 This is an addendum to the original fix for issue 344313.

Description from issue 344313:

A query would have failed with an incorrect error message, under the following conditions:

1) it contained an outer join

2) the null-supplying table was a grouped derived table

3) one of the select list items of the derived table was a constant or null-tolerant function

4) one of the tables in the FROM clause of the derived table was a view, that could have been flattened

344976 On the last page of the Sybase Central Index Consultant, the button 'Run Script' was active, regardless of whether there was a script to run or not. If no indexes had been recommended for creation or dropping, clicking the button would have caused the server to report a syntax error, but have no other effect. This has now been fixed so that the button is disabled if no recommendations have been made, which is consistent with the ISQL Index Consultant.
345015 When a CHAR or VARCHAR column contained the empty string (a string of length 0) and the data was fetched into a variant of type BSTR, the OLEDB provider did not convert the result into a proper null-length BSTR. The pointer to the string value would have been uninitialized and this could have resulted in an application crash. This has now been fixed.
345060 When in the Code Details panel for a procedure while in debug mode, if the connection was disconnected, a NullPointerException would have been reported. This has been fixed.
345076 If a transaction log directory contained many files that were not transaction log files, or the directory contained some files that were not transaction log files and dbremote was run many times in non-hover mode, dbremote may have reported the errors: "too many open files" or "missing transaction log files" and then stop. Everything would have been fine when restarted. This problem is fixed now.

Note, this problem also affected MobiLink's dbmlsync.

345109 When a Windows WM_DESTROY message was posted to any of the application listed below, the process would not have shutdown and the console for the process would have stopped responding. Although the process was shutdown properly when a Windows WM_CLOSE message was received. It is unusal for a WM_DESTROY message to be posted before a WM_CLOSE message. This problem is now fixed.

Executables affected:

dbmlsync.exe,

dbremote.exe,

ssremote.exe,

ssqueue.exe,

dbltm.exe,

dblsn.exe,

qaagent.exe,

dbmlsrv9.exe

345171 If an application called ResultSet.isLast() prior to calling ResultSet.next() or ResultSet.first() on a ResultSet object, then calling ResultSet.next() afterwards would have incorrectly returned FALSE. This problem has now been fixed.
345174 Complex expressions used in DISTINCT and ORDER BY clauses were not correctly matched, resulting in the syntax error -152 "Invalid order by specification". This has now been fixed.

As a general rule, for query blocks using both ORDER BY and DISTINCT clauses, the ORDER BY expressions must reference only the expressions from the select list with DISTINCT clause.

For example:

select distinct emp_lname, isnull (city, ' ') as address

from employee

order by upper(address)

345185 If the system procedure sa_validate, was called in unchained mode (ie the database option CHAINED='off'), then no information is returned. This problem was most noticeable when using a jConnect or Open Client application. This was due to the local temporary table declared in sa_validate to hold the results, did not have the ON COMMIT PRESERVE ROWS clause. This problem has now been fixed for newly created databases. To correct this problem for existing databases, modify the sa_validate procedure so that the temporary table result_msgs, has the clause ON COMMIT PRESERVE ROWS.
345195 Queries with predicates of the form "constant NOT IN (uncorrelated subquery)" may have taken longer to evaluate in 9.0, compared to earlier versions. This has been fixed.

Example:

select *

from R

where '123' NOT IN (select T.x

from T)

345202 When using Sybase Central to modify a table by adding or removing columns, or changing the size of one or more existing columns, the maximum row width displayed on the Miscellaneous page of the table's property sheet would not have been updated accordingly. This has been fixed.
345221 If the AsaClient was in the process of issuing an error, a native error exception would have been thrown, if a codepage corresponding to the database's charset was not available. Now, if the code page of the database is not available, the AsaClient always returns an English error message to the application.
345223 If a procedure, trigger or view was created with redundant quotes around the object name and the next token started immediately after the trailing quote, the saved source for the object would have contained no separation between the object name and the next token.

For example:

create procedure "p"as begin return end

would have been saved as:

create procedure pas begin return end

This has been fixed.

345234 For some complex expressions used in outer join queries, NULL could have been returned inappropriately, or a non-NULL value could have been returned in place of NULL, due to a non-matching row in the outer join. This has been fixed.

For example, the following query would have given wrong results of this nature:

SELECT T1.*

FROM ( select row_num C1, row_num*1 C2 from rowgenerator) T1

LEFT JOIN ( systable T key join syscolumn C) ON T1.C2=0

345236 Microsoft Windows, for Asian (multi-byte) languages, allows a user to define their own characters, including the glyph that is displayed. As part of defining a character, the user picks an unused code point in the character set. MobiLink and ASA were not aware of this new code point, and character set conversion would substitute the "invalid character" for any user-defined characters.

Now, the mappings for user-defined characters in cp950 (Traditional Chinese) are included.

345284 If the database used a multi-byte character set (eg. UTF8), and a different character set was requested by an HTTP client, the HTTP interface could have returned some characters in the database character set. This has been fixed.
345325 The Information utility, dbinfo, could have returned incorrect results if another table named DUMMY was in the namespace of the connected user, (specified using the -c switch on the DBINFO command line). This has been fixed, by qualifying an unqualified reference to the table DUMMY with the user SYS.
345409 If the MobiLink Listener could not be found (ie not installed or not in the path), then the QAnywhere Client qaagent would have output an error message when it was launched, but then would have hang and not terminate. A work-around is to use the qaagent command line option -push_notifications "disabled", in which case qaagent will not attempt to invoke dblsn. This problem did not occur on supported CE platforms. This hang will now not occur when the QAnywhere Client cannot find the Listener.
345439 This is an addendum to the original fix for issue 339759.

The initial fix introduced a potential incompatibility with older versions of DBISQL. Specifically, when connecting using the iAnywhere JDBC Driver, the values of the following options were always being set as indicated, regardless of the PUBLIC or per-user setting (if any):

Option Value

---------------- ---------

Date_format yyyy-mm-dd

Date_order ymd

Time_format hh:nn:ss

Timestamp_format yyyy-mm-dd hh:nn:ss.sssss

Now, the values of these options are taken from the per user setting (if set), or the PUBLIC setting (if there is no per user setting). If a custom login procedure has been created, these options are NOT explicitly modified by DBISQL.

345450 An unintended side-effect of the changes for issue 332134 to prevent a server crash, was to disallow correlated subselects in COMPUTE and CHECK expressions. This restriction has now been removed.
345558 If an UPDATE statement included an assignment to a local variable and the value being assigned was not of the same type as the variable, a server crash could have resulted. This has been fixed.
345571 In very rare situations, the server could have hung when stopping a database.
345634 If the server issued an error message in response to committing changes, the error message would not be displayed if the commit was a side-effect of shutting down DBISQL. This situation could occur if the dbisql option Wait_for_commit was 'On'. Now the message is always displayed.
345642 The HTML generated for a server generated HTTP error, was partially in the US-ASCII character set and partially in the character set requested by the client. This has been

fixed. Now the entire body of the reply will be in the requested character set.

345644 Dynamic SQL statement errors produced a SQLException with the text "Syntax error near '-n/a-' -n/a-", as the position of the syntax error was not being substituted into the error message.

This has been fixed. The first "parameter" of the error message is now replaced with the token where the error took place, and the second parameter is now replaced with the offset into the SQL statement string.

345723 Dynamic SQL statement errors produced a SQLException with the text "Syntax error near '-n/a-' -n/a-", as the position of the syntax error was not being substituted into the error message.

This has been fixed. The first "parameter" of the error message is now replaced with the token where the error took place, and the second parameter is now replaced with the offset into the SQL statement string.

345734 If a predicate qualified to be pushed into a view, then the process of inferring new predicates in the view query block, might not have used this pushed predicate. This may have resulted in less than optimal access plans, due to the fact that useful sargable predicates were not inferred. This has been fixed.

The following conditions must have been met for a query to have exhibited this problem:

(1) the main query block was a grouped query on a view V1

(2) the main query block contained a local view predicate on V1 (e.g., "V1.col1 = constant")

(3) the view V1 contained other predicates that, with the help of the pushed predicate, could have been used to infer sargable predicates on base tables (e.g., "col1 = T.x")

(4) the view V1 was grouped as well

Example:

select V1.col2, count(*)

from V1

where V1.col1 = c

group by V1.col2

V1: select V2.col3, count(*)

from V2, T

where V2.col1 = T.x

group by V2.col3

V2: select *

form R1

UNION ALL

select *

from R2

345761 If a multi-variable SELECT ... INTO was executed in a procedure and the query returned no rows, calling the procedure simultaneously from several connections could have caused the server to crash. For this to have occurred, the SELECT statement must have been followed by another statement involving a query or expression. The problem was unlikely to occur on single-processor machines. This has been fixed.
345777 The system procedure sa_validate would have returned an empty result set, instead of an error, when run against a version 8 database that had errors. This has been fixed to correctly return the error in the result set.
345783 If no "automatic" rule was specified in the transmission rules file, then it was assumed that no messages were filtered. This meant that even if scheduled rules were specified, they would have had no effect. The work-around is to create an automatic rule of the form "automatic=1=2" to ensure all messages would be filtered, except those satisfying scheduled conditions.

Now there is an implicit rule associated with each user mentioned in the rules file that causes all messages to be filtered, except those explicitly allowed.

Example:

Before this change a rules file containing:

[someUser]

start time '12:00:00' every 6 hours = myPriority in ( 'low', 'medium' )

would have been equivalent to a rules file containing

[someUser]

automatic=

To get the correct behaviour previously, the rules file would have had to have been:

[someUser]

automatic = 1 > 2

start time '12:00:00' every 6 hours = myPriority in ( 'low', 'medium' )

Now, the rules file can be simply:

[someUser]

start time '12:00:00' every 6 hours = myPriority in ( 'low', 'medium' )

Note that before this change, the following rules worked as expected:

[someUser]

automatic = myPriority = 'high'

start time '12:00:00' every 6 hours = myPriority in ( 'low', 'medium' )

That is, there was only a problem when scheduled rules were used without automatic rules.

345785 If a procedure executed by an HTTP connection called sa_set_http_header( 'CharsetConversion', 'OFF' ), the Content-Type header would still have contained the requested character set, even though the data was not converted. This has been fixed, the Content-Type header will now contain the correct character set.
345790 If a transmission rule contained a syntax error, then an error report would have been written to the MobiLink log file, and the rule would have been ignored. Now, the behaviour has been changed so that rules containing errors detected on server start-up are reported and forcing the MobiLink server to fail to start.
345795 If a client-side transmission rule contained a syntax error, an error report would have been written to the QAnywhere log file and the rule would be ignored. Now, the behaviour has been changed such that if errors are detected, they are reported and QAnywhere client will fail to start.
345855 A message statement with a comma-separated list of expressions, could have caused a server crash, (ASA 8.0.x) or a syntax error, (ASA 9.0.x), if the first expression

did not contain a table reference and a subsequent expression did contain a table reference.

For example:

message 'Version: ',string(( select @@version ))

This has been fixed.

345901 For queries with multiple occurances of "column = value" in the WHERE clause, in which the same column occured more than once, and that column was the first item in an index, Ultralite dynamic SQL could have attempted to free memory more than once. This has been corrected.
345909 There was a change in the a_sync_db structure in version 9.0.1, which meant that any application built with 9.0.0, would have failed with an Access Violation crash, when calling the 9.0.1 DBSynchronizeLog function. This problem has now been corrected.

To work around this problem, the 9.0.0 application must be rebuilt with 9.0.1 software. In particular, it is important to specify the correct version of the DBTOOLS library when setting up the a_sync_db structure:

dbSyncStruct.version=9000; // is the wrong way to initialize this field

dbSyncStruct.version=DB_TOOLS_VERSION_NUMBER; // is the correct way

This problem affects any application built with 9.0.0 and deployed with 9.0.1 installed, and any application built with 9.0.1 and deployed with 9.0.1 installed if the wrong version number is specified in the a_sync_db structure. These applications must be re-built with the 9.0.1 dbtools library and they must specify the correct DBTOOLS version number as shown above.

345916 Any attempt to create a procedure, function, trigger or event using the wizards, would have failed if the database was running on a version 7.0.x server. The was due to the wizards creating code templates with BEGIN...END blocks containing only a comment. This syntax was not valid on a version 7.0.x server. Now, if the database is running on a version 7.0.x server, the BEGIN...END block will contain a PRINT statement instead.
345925 With UltraLite dynamic SQL, IN, ANY, ALL, or EXISTS search conditions that contained subqueries with DISTINCT, GROUP BY, or ORDER BY clauses, may have produced incorrect results. This has been fixed.
345927 Queries containing subqueries with DISTINCT aggregates, may have returned incorrect result sets,when the following conditions existed:

- subquery was used in a conjunct of the form 'expr theta (subquery)"

- subquery was a grouped query with DISTINCT aggregates

- subquery referenced only one base or derived table, or view T

- the same object T was used in the main query block

- the access plan chosen for this query used WINDOW operator

This has been fixed.

For example:

Select *

from T, R

where T.z = R.z and T.Y = (select sum(distinct T.X) from T)

The access plan must use WINDOW operator: R<seq> JH* Window [ T<seq>]

345936 If an Embedded SQL or ODBC application connected with an ENG connection parameter containing a dot, and after the dot, a back slash, forward slash, semicolon, or ampersand, the application would have crashed. This has be fixed
345949 If a query contained an IF expression with an ANY, ALL, or IN predicate in the select list, and a keyset-driven (scroll) cursor was opened over the query, the server could have crashed, or returned incorrect results, when fetching from the cursor. This has been fixed.

For example, the following query demonstrates the problem:

create table SQScroll(

pk int primary key,

x char(10),

y int

);

insert into SQScroll

select row_num, row_num, row_num from rowgenerator;

SELECT pk, x,

IF x IN ( SELECT ''||row_num FROM rowgenerator R WHERE S1.pk = R.row_num ) THEN '1' ELSE '0' ENDIF b_in,

IF x = ANY ( SELECT ''||row_num FROM rowgenerator R WHERE S1.pk = R.row_num ) THEN '1' ELSE '0' ENDIF b_any,

IF x = ALL ( SELECT ''||row_num FROM rowgenerator R WHERE S1.pk = R.row_num ) THEN '1' ELSE '0' ENDIF b_all

FROM SQScroll S1

ORDER BY 2,3,4,5

345968 Attempting to cut or copy a procedure, trigger or view to the clipboard, would have caused Sybase Central to appear hung. In actual fact, it was simply taking a very long time to perform the cut or copy operation. This has been fixed.

Note that this problem would only have occurred if the actual object was cut or copied from the Procedures and Functions, Triggers or Views folder, but would not have occurred if the object's source was simply copied from the editor in the right-pane.

345969 The Server Location utility, dblocate, would have ignored the timestamp and listed any server it found in the LDAP directory, regardless of the timestamp. This problem has been fixed.
345972 When using dynamic SQL, an infinite loop could have resulted when deleting a foreign key. This has been corrected.
346024 Query could have failed with the error "Illegal reference to correlation name 'ccc'", when the following conditions occurred:

1) There was an aliased constant in the select list of a derived table on the null supplying side of an outer join ('xxx' in the example below)

2) The derived table must have been joined to three or more tables, and the ON condition for one of the joins must have contained an alias reference to the constant in 1)

For example:

select 1

from systable aaa

牋  left outer join

牋  ( select 1 as xxx

牋牋  from systable eee

牋牋牋牋牋 left outer join

牋牋牋牋牋 systable bbb

牋牋牋牋牋 on 1 = xxx

牋牋牋牋牋牋牋牋牋牋牋 left outer join

牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋 systable ccc on 1 = 1

牋  ) ddd

on 1=1;

This is now fixed, but a workaround is to duplicate the constant in the ON condition rather than making it an alias reference.

346037 If a RAISERROR statement was executed in a procedure and a subsequent statement in the procedure caused a trigger to fire, an error would have been generated when the trigger completed. This would have prevented the statement which fired the trigger from completing successfully, and might have prevented the remainder of the procedure from executing. This has been fixed.

Note that a RAISERROR executed inside a trigger will still cause the triggering statement to fail.

346050 When generating C++ code, the UltraLite analyzer generates class methods that allow the caller to determine the size of a column in a query (ie how much memory needs to be allocated to ensure any value in that column can be stored). For a column of type BINARY(n), the size was returned as (n+1). Since BINARY column values are fetched by using a p_ul_binary datatype (a structure with a length field and an array of bytes for the data), the correct size should have been sizeof(ul_length) + n. This has now been fixed.

Since the size of ul_length is 2, a workaround would be to simply add 1 to the return value of a GetSize<name> method generated for a BINARY column.

346051 When generating C++ code, the UltraLite analyzer generates class methods that allow the caller to determine the size of a column in a query (ie how much memory needs to be allocated to ensure any value in that column can be stored). For a column of type CHAR(n), the size was returned as n. Since CHAR columns are returned as null terminated strings, the null terminator should be accounted for in the size returned, so it should be n + 1. This has now been fixed.
346080 When using UltraLite dynamic SQL, a memory leak could have occurred while creating a table with multiple unnamed indexes or foreign keys. This has been corrected.
346125 When using the Server-initiated Synchronization Listener utility's -l command line option to specify a message handler, it was not possible to specify messages with a space. Now, both the message and the window class name can be optionally single quoted, thus allowing them to have spaces, (ie to enter a single quote in the string, use two single quotes). The entire action string itself can be a string surrounded by single quotes. If that is the case, all single quotes within the action string need to be doubled.

Example 1: Posting my message to my class

-l "action='post ''my message'' to ''my class''';"

Example 2: Posting my'message to my'class

-l "action='post my''''message to my''''class';"

Example 3: Also posting my'message to my'class

-l "action='post ''my''''message'' to ''my''''class''';"

346142 Attempting to unload a database created with a version prior to 7.0.0, with the Unload Database wizard, would have caused Sybase Central to crash, when the table

selection page was about to be displayed. This has been fixed. Now, the table selection page is not available when unloading a pre-7.0.0 database, since the lists of tables and users are not available.

346145 The server allowed, in rare circumstances, a database user with limited permissions to manage to exceed those permissions. This is now fixed.
346149 By default, the maximun number of connections to a server running on NetWare is approximately 108. The actual number depends on the number of network cards in the machine, and the number of IP addresses the ASA server is listening on. The "connections" TCP parameter can be used to change this limit. Once the server reached this limit, the next connection attempt would have caused the NetWare server to abend. This has been fixed, a connection attempt exceeding the limit will now fail with an error.
346245 Selecting blob data from a variable could have caused the server to stop with an assertion failure. This has been resolved.
346247 If a view or derived table that made use of string concatenation using the '+' operator, was used as the NULL-supplying table in an outer join, the column containing the concatenation may not have been NULL-supplied in some cases. This has been fixed.
346263 The following problems could have been seen when launching or running the graphical administration tools (ie, Sybase Central, DBISQL, DBConsole, MobiLink Monitor)

1. A crash on startup -- The Java VM may have reported that an exception occurred in the video card driver.

2. Painting problems -- On Windows XP, the task switcher that comes with Windows XP Powertoys caused the administration tools to paint incorrectly when switching through the list of tasks.

These problems have been fixed, but a workaround is to disable the computer's use of DirectDraw and Direct3D acceleration.

346277 If a Full Outer Nested Loops join were used when processing a query, and one of the inputs to the query was a single-row GroupBy, then the aggregates computed by the GroupBy could have been impropery NULL-supplied.

For example:

SELECT *

FROM

( select count(*)

from dbo.rowgenerator R1

) T1( c1 )

full JOIN (

select * from

rowgenerator R2

where R2.row_num < 2) R2 on R2.row_num = T1.c1

This has been corrected.

346282 If no users were selected in the Filter Objects by Owner dialog, then any attempt to use a wizard to create a table, proxy table, view, procedure, function, remote procedure or publication would have resulted in Sybase Central crashing. This has been fixed.

Note that these objects can still not be created using a wizard when all users are

filtered out, since only unfiltered users can be choosen as the owner of a new object.

346314 A query such as the following:

select 1 from sys.systable having 1 = 0

that created a grouping operator with no aggregate functions or group by columns, would have caused a server crash. This has been fixed.

This is fixed.

346348 ODBC applications running on Compaq Tru64 platforms, using the ODBC driver from version 8.0.2 build 4122 or later, would have hung or crashed. A change was made to the ODBC driver that required recompilation of ODBC applications, but updated header files (in particular odbc.h) were not included. New headers are now included and 64 bit ODBC applications will need to be recompiled.
346362 Some statements, containing outer joins and derived tables or views with constants or complex expressions, could have incorrectly failed with a syntax error "derived table T has no name for column x".

For example, the following query would have failed this way:

SELECT *

FROM dbo.rowgenerator R1 LEFT JOIN

( select T1.a1

from ( select

T.table_name || 'def'

from dbo.rowgenerator R2, sys.systable T

) as T1(a1)

) T2

ON 1=0

This has now been fixed.

346364 If the MYIP tcpip parameter was specified on Unix servers, client applications, (such as the system utility dblocate), may not have been able to find the server. This has been fixed.
346365 Unloading an UltraLite schema using the UltraLite database converter, could have crashed if the conmmand line option -S was specified. This has now been fixed.
346382 If a Transact-SQL SELECT INTO statement referenced a view of a base table that contained at least one CHECK constraint, the SELECT INTO statement could have caused an erroneous syntax error, particularly if the view was a grouped view. In that example, the SQLCODE returned would be -149. This has been fixed.

As a workaround, the Transact-SQL SELECT INTO statement can be split into two separate statements. The first declaring a local temporary table and the second being a non-Transact-SQL SELECT INTO statement.

346416 If a GroupByOrdered method was used to compute a distinct aggregate function with a constant argument, the wrong answer could have been returned. This has now been fixed.

For example:

SELECT T1.a1,

count( DISTINCT T1.a1 ) sumd0

FROM

( SELECT 1 a1

FROM dbo.rowgenerator ) T1

GROUP BY T1.a1

346443 The server was evaluating the expression <empty_string> LIKE <empty_string> as FALSE, when it should, in fact, have been TRUE. The expression is now evaluated correctly.
346477 If a table object was cut or copied to the clipboard, or dragged and dropped into another application, then any column comments would not have been included in the SQL. This has been fixed.
346497 The LDAP timestamp would not have been updated by a server if either the server had no connections, or the server had only remote TCP or SPX connections all of which had liveness disabled. This has been fixed.
346507 In databases using 1253ELL (Greek) collation, identifiers containing Greek letters required double-quotes because the Greek letters were not properly identified as alphabetic. This has been corrected, so that Greek letters can now be used without quotes.
346508 If an EXECUTE IMMEDIATE statement in a stored procedure was used to execute a query involving a UNION, the results of the query would not have been returned as the result set from the procedure. If the query returned a single row, no error would have been reported, nor would a result set have been generated. If the query returned more than one row, the error "SELECT returns more than one row" would have been reported. This has been fixed. A workaround is to define the query such that the UNION is contained within a derived table.
346511 If a tautology was discovered on a null-supplying column of an outer join, the query may have returned incorrect results. This has been fixed.

The following conditions must have occurred for a query to exhibit this problem:

1. the tautology was in the WHERE clause of the main query block, and was not in a conjunction

2. the column referenced in the tautology was declared not NULL

3. the column referenced in the tautology belonged to a NULL supplying table.

For example:

select count( *)

from product p1 left outer join product p2 on (p2.quantity < 0 )

where (p2.id < 10 or p2.id > 5 or p1.quantity > 100)

where "p2.id < 10 or p2.id > 5" is a tautology, p2.id is a column of the null-supplying table "product p2" and p2.id is declared NOT NULL.

346517 When generating values for AUTOINCREMENT columns, if the next available value was out of range, the server's behavior varied based on the datatype of the column. For SMALLINT columns, a "value out of range for destination" was reported. For INT and BIGINT columns, a negative value was generated. For UNSIGNED INT, the value would wrap to 0. For UNSIGNED BIGINT values, the value could wrap past the maximum signed bigint.

The server's behaviour is now consistant, it generates a NULL value for an AUTOINCREMENT column if the next available value is out of range for the column.

346604 Calling the system procedure sa_locks, could have caused a deadlock in the server. This problem was more likely to occur on multiprocessor and unix systems.
346623 Two new behaviors have been added to the Server-initiated Synchronization Listener Utility's message handler:

1. The post action now turns a numeric string into message id implicitly, without going through message registration.

2. The post action will now try to interpret the destination as a window title, if finding a window class with the specified name failed.

New usage:

action=post <window message>|<id> to <window class name>|<window title>

346632 If a statement-level trigger was defined for multiple trigger events, which included DELETE, the "inserted" temporary table available within the trigger would have been populated when a DELETE on the table was performed. Now, the "inserted" temporary table is empty in this case.
346648 Messages that had expired, or had been delivered, would have remained on the server indefinitely. Now, messages will, by default, be deleted when the final state of a message has been synchronized with both the target and originator clients.
346649 The Sybase Central Plugin installed via the Merge Module could not be registered with Sybase Central. This has now been fixed.
346715 If a Watcom-SQL stored procedure or trigger containes a statement like:

execute var;

a syntax error should be reported, but was not. Instead, when the procedure or trigger was executed, the message "Invalid prepared statement type" was reported. A syntax error will now be given when the procedure or trigger is created. If the intent of the original statement was to treat the contents of the string variable "var" as a statement to be executed, EXECUTE IMMEDIATE must be used instead.

346721 Queries with duplicate equijoins predicates, may have returned an incorrect result set. The duplicate predicates could have come from the original query or they could have been inferred. The query must have contained a derived table or view, which is flattened. This has been fixed.
346730 If a procedure called by an HTTP service, set the Content-Type header to NULL (i.e. telling the server not to send this header) by calling sa_set_http_header, the server would still have sent it. This has now been fixed so that the header will not be sent.
346733 The security certificate generation utility, gencert, would have failed to accept input redirection from a file (eg. gencert < input.txt). This has been corrected.
346734 The security certificate generation utility, gencert, would always have returned 0, even when an error occurred. Now, if an error occurs, gencert's exit code is EXIT_FAILURE (as defined in stdlib.h).
346747 When just Sybase Central was installed (including jConnect and one or more plug-ins), some required files and registry entries were missing. This prevented Sybase Central from connecting to a database using the JDBC-ODBC bridge. Also, when shutting down, Sybase Central would report errors about not being able to start ISQL. This problem was initially addressed by engineering issue 314450. These changes complete the fix.
346750 If a Remote Data Access query involved proxy tables on multiple servers and used host variables, then the query may have failed with a "Not enough values for host variables" error. This problem has now been fixed.
346753 Resetting the value of the Min_table_size_for_histogram option to its default, by using "set option public.min_table_size_for_histogram =", would have reset it to 1000, rather than the default value of 100. This has been fixed so that the default value of 100 is now set.
346758 The Index Consultant would generally have not recommended extra indexes, to take advantage of pipelined access plans, when the option Optimization_goal was set to 'First-row'. Although the plans recommended would have had a lower overall cost than plans using indexes, they would not usually have been pipelined, and so the first row could not be returned early. This has been fixed.
346759 The File Hiding utility, dbfhide, can now be used to obfuscated .ini files used by the server, or any of the utilities (ie. util_db.ini, asaldap.ini, etc).
346766 The server could have faulted with an integer divide by zero error, when executing a memory intensive query that causes the cache to grow dynamically to the maximum allowed. This is now fixed, but a work around would be to disable dynamic cache sizing (i.e. specifying -ca 0 on the command line).
346769 If the Synchronization client dbmlsync was set to synchronize on a schedule, and the MobiLink server was shut down when the upload stream was being sent and then started up

again, dbmlsync could have ontinuously failed to synchronize until it was shut down and restarted. The MobiLink server would simple have reported "Synchronization Failed", with no more information. This has now been fixed.

346848 The ODBC driver always described both binary and varbinary columns as SQL_BINARY. Now, a new database option has been added, ODBC_describe_binary_as_varbinary, which when set to 'On', will cause the ODBC driver to describe these datatypes as SQL_VARBINARY. The default value of the option is 'Off'. Note that it is not possible to distinguish between the two types. The option value is queried when a connection is first established, so any connections established after the option is set will see the new behaviour.

This option may be particularly useful when using Delphi, where binary columns are always zero-padded, but varbinary columns are not.

346852 The time interval that the server waited for all transactions to be quiesced for a checkpoint, was longer than necessary. The delay increased linearly with database size , but decreased with increasing page size. The delay was almost always less than one second for databases less than 1 Gigabyte in size, with a page size of 2048 bytes, so was likely not a concern for most users. The unnecessary delay has now been removed.
346865 The following statement is intended to include all non-system tables from the reference database in the UltraLite schema:

ulinit.exe 朿 揹sn=MyDsn� 杅 test.usm 杗 *

It was erroneously attempting to extract tables and views owned by dbo as well, resulting in the following output:

Error: Table sysalternates must have a primary key.

Error: Table syslogs must have a primary key.

Error: Table syscolumns must have a primary key.

Error: Table syscomments must have a primary key.

Error: Table sysconstraints must have a primary key.

Error: Table sysdepends must have a primary key.

Error: Table sysindexes must have a primary key.

Error: Table syskeys must have a primary key.

Error: Table sysobjects must have a primary key.

Error: Table sysprocedures must have a primary key.

Error: Table sysprotects must have a primary key.

Error: Table sysreferences must have a primary key.

Error: Table sysroles must have a primary key.

Error: Table syssegments must have a primary key.

Error: Table systhresholds must have a primary key.

This has now been fixed. A workaround is to define a publication that contains all the tables in the reference database that are to be in the UltraLite schema and specify that publication name after the 杗 command line option.

346881 The PREFETCH database option now has values OFF, CONDITIONAL and ALWAYS. ON is still accepted and is equivalent to CONDITIONAL.

OFF means no prefetching is done.

CONDITIONAL (the default) means prefetching is done unless either the cursor type is sensitive, or the query includes a proxy table. For example, prefetching is done over a forward only cursor, but prefetching is not done over a sensitive cursor or a proxy table.

ALWAYS means prefetching is done even for sensitive cursor types or cursors involving a proxy table. Great care must be taken when using this setting. Using prefetch on a sensitive cursor changes the semantics of the cursor to asensitive (old values may be fetched if the value was updated between the prefetch and application's fetch). Also using prefetch on a cursor using a proxy table could cause the error -668 "Cursor is restricted to FETCH NEXT operations" to occur when the application attempts to re-fetch prefetched rows. The application will re-fetch prefetched rows in a number of cases, including after a rollback, on a fetch relative 0, if a fetch column is re-bound or bound for the first time after the first fetch, or in some cases when GET DATA is used.

If the DisableMultiRowFetch connection parameter is set to YES, the PREFETCH database option is ignored and no prefetching is done.

Note: prefetching is not used by OpenClient or jConnect connections.

346886 If a query contained an expression in the select list using the built-in finction NUMBER(*), (such as NUMBER(*)+1000) or a non-deterministic function, then a wrong answer could have been returned if the query also contained an EXISTS style predicate (or ANY, ALL or IN), where the predicate was re-written as a join with a DISTINCT operation. The wrong answer could have contained more rows than expected or an incorrect value for the expression derived from the NUMBER(*) or a non-deterministic function.

For example, the following query demonstrates the problem, depending on the plan selected by the query optimizer:

select R1.row_num, rand(), number(*)+100

from rowgenerator R1

where exists ( select * from rowgenerator R2

where R2.row_num <> R1.row_num

and R2.row_num <= 2)

This problem has been fixed.

346991 Assigning the result of a string concatenation to a variable could have caused the size limit of the variable to be exceeded. This would only have occurred with the bar ( || ) operator. This is now fixed, the concatenated string is truncated to the maximum size.
347032 If an error occurred in the managed provider, a MessageBox was being displayed even if the underlying application was running as a service and that service was not running in UserInteractive mode. Now, the MessageBox is no longer displayed in this situation.
347045 Queries containing a full outer join and an IS NULL predicate may have returned incorrect results. For this to have occurred, all of the following conditions must have been true:

- the query contained a full outer join above another outer join (potentially with other joins in between).

- the WHERE clause must have been a conjunction containing a predicate, or a single predicate, of the form "expr IS NULL" where expr was a simple expression involving a single base column.

- the affected lower outer join must have been an ON clause of the exact form column=column, where one of the columns involved in the predicate was in the IS NULL expression.

For example:

SELECT * FROM TAB1

LEFT OUTER JOIN TAB2 ON TAB1.COL2 = TAB2.COL2

FULL OUTER JOIN TAB3 ON TAB2.COL3 = TAB3.COL3

WHERE TAB1.COL2 IS NULL

This has now been fixed. A workaround is to rewrite the query so that it does not meet all of the listed conditions.

347049 Sending the HTTP HEAD request to the server should have only returned the HTTP headers and no body, but the body was also being returned. This has been fixed.
347052 When the Dbmlsync Integration Component was placed on a form in Powerbuilder, at design time all that was shown on the form would have been a gray rectangle with the text "ATL Composite Control". This has been fixed, the ActiveX component will now paint itself appropriately when used in Powerbuilder
347053 Attempting to register the Dbmlsync Integration Component using PowerBuilder would have caused a message-box to be displayed with the following message:

dbmlsynccomg.dll is not marked as supporting self-registration. However, the function "DllRegisterServer" was found. Do you wish to attempt to register this file as a control?

If 'yes' was selected to register the control, the registration would succeed with no problems. This behaviour has been corrected, the message-box woll no longer appear.

347054 The visual Dbmlsync Integration Component would not have worked properly if it was placed on a form in a Powerbuilder application, after the target was saved and reloaded. After the reload the component would have appeared on the form as a white rectangle and the "OLE Control Name" on the property sheet for the component would have been blank. If the application was then run, the component would have appeared as a white rectangle as well at runtime. This has been corrected.
347060 An incorrect UTF8 to Unicode conversion that caused a memory overwrite, (specific to Windows CE), and thread synchronization issues, may have caused the QAnywhere Client to crash. Both of these problems have now been fixed.
347068 If a keyset-driven cursor was used, or a keyset was used to compute an UPDATE, INSERT, or DELETE, then NULL could be returned incorrectly for columns returned by the keyset. This is now fixed.

Note, this problem was introduced in 8.0.2 build 4368.

347182 The Create Function wizard allowed for creating a Transact-SQL function when connected to a version 8 or earlier server. This would always have failed, since Transact-SQL functions are only supported on version 9 servers. Now, this option is no longer available when connected to version 8 or earlier servers. In such cases, the dialect page is skipped completely, as Watcom-SQL is the only choice.

In addition, the Translate to Transact-SQL menu item is now disabled for functions when connected to version 8 or earlier servers.

347209 Column comments would be ignored when creating a new table in the table editor. Although column comments for existing tables would have been preserved. This problem has been corrected. Column comments for new tables are now preserved.
347217 A checksum validation operation (for example, the VALIDATE CHECKSUM statement) did not respond to cancel requests appropriately. This has been fixed.
347226 A zero-length HTTP POST would have caused the server to wait indefinately, eventually timing out the connection. This has been fixed.
347269 The calendars displayed in the Event Schedule dialog and the Translate Log File wizard was always using Sunday as the first day of the week. Now, the current locale is used to determine which day should be as the first day of the week. For example, in French,

German, Chinese and Japanese locales, the first day of the week is Monday.

347306 When doing a SQLPutData or SQLSetPos using bound variables, specifying a zero-length string could cause a crash in the ODBC driver. This has been fixed.
347307 A new implementation of a sort algorithm that was added in 9.0.1, could have caused a server crash during query optimization. It was likely that the crash was only possible for queries with a large number of joins, and in the presence of multiple indexes with similar definitions on the tables involved. This has now been fixed.
347314 If a query contained a LIKE predicate with a literal constant pattern, that did not contain a wildcard, the query could have incorrectly returned rows where the expression or column contained additional trailing blanks when run against a database that does blank padding of strings. For example, given the value 'abc' and the LIKE pattern 'abc ' (with a trailing blank), the server would have incorrectly matched the value and caused its row to be returned. This has been fixed.
347324 If the readText method of QATextMessage was called to read n Unicode characters, it would have returned a smaller number (possibly n/2) of the characters read. To read the remaining characters, it was necessary to repeatedly call the method, and it would have returned n/4, n/8, etc. characters on each subsequent call. The exact amount returned on each call would depend on the length of the UTF-8 representation of the data.

This has been fixed. The function will now return n characters, unless there are fewer characters available to return.

347350 Attempting to use the View Creation wizard to create a view with a SQL statement that didn't begin with the keyword SELECT, would have caused the error "You must specify a valid SELECT statement without an ORDER BY clause". This has been fixed so that the

wizard can be used to create any valid view.

347352 When using the UltraLite initialization utility ulinit, to create a .usm file for an UltraLite application, the -t option was ignored. This option is used to specify the file containing the root certificates that the application should accept in an SSL/TLS synchronization. This has been fixed. The -t option will now be respected.
347363 When synchronizing with the Palm HotSync conduit, database corruption could have occurred if a table with no other synchronization activity had rows deleted via the automatic RI cleanup (cascade delete on download). This corruption prevented further successful synchronizations, signaling the SQL code -755. This problem is fixed. Existing databases should be dropped and recreated via synchronization when the patch is deployed.
347468 The UltraLite engine would have always returned -1 for calls to ULSqlca::GetSQLErrorOffset. This has been fixed so that it now returns the correct dynamic SQL error offset, when applicable.
347481 For queries with multiple predicates in the WHERE clause, if one predicate had a very small selectivity, the server could have picked an inefficient plan by choosing an inferior index. This has now been fixed.
347493 The server could have crashed on startup, if a large number of tasks were specified, and they could not all be created due to lack of memory. This problem was more likely to occur on Windows platforms using AWE, with 8.0.2 build 4076, or later. This has been fixed in the Windows server, (a fix for NetWare and Unix servers to follow), now it will fail with an error indicative of excessive memory usage.
347495 The 'restartable download' value passed to the sp_hook_dbmlsync_end hook was set to FALSE, when it should have been TRUE, for cases where an attempt to resume a previously failed download failed. The problem occurred when the attempt to resume the download failed before any more of the download had been received from Mobilink, and in such a way that it was still possible to resume the download in the future.

This has been fixed. The restartable download parameter should now always be correct.

347502 When entering a file name in the Export dialog, and omitting the file extension, an extension which is appropriate to the file type is automatically added. For example, ASCII format files get a "txt" extension. If the file name entered ended with a period, the resulting file name would have contained two periods (e.g. "myFile..txt") Now, only one period is added before the extension.
347503 Calling the LEFT() function on a MultiByte Character Set string, could have caused a server hang. This has been fixed.
347513 If errors occurred during execution of the prepare_for_download or download scripts in MobiLink servers, version 9.0.0 and up, olded clients (ie 8.0.0 and 8.0.1) would have failed with the error "Communication error occurred while receiving data from the MobiLink server". This problem is now fixed.
347536 The TCP/IP-based synchronization streams now support the "Ignore" option. This option specifies a hostname or IP address that MobiLink server will ignore when that host or IP makes a connection. The intent of this option is to ignore requests from load balancers at the lowest possible level. This prevents excessive output in both the MobiLink server log and the MobiLink monitor output files. The option is only valid when used on the dbmlsrv command line, as part of the -x option.

For example:

dbmlsrv9 ... -x tcpip {ignore=lb1;ignore=123.45.56.67) ...

This causes MobiLink server to ignore requests from both the host at "lb1" and the IP address 123.45.56.67

347538 Running a querey at isolation level 1 could have taken significantly longer than at isolation level 0. This was particularly evident when the plan called for repeatedly re-reading the same set of rows. This was due to the cost of obtaining the short term locks for cursor stability and checking the long term lock table for conflicting locks. The time to aquire the cursor stability locks has been reduced by optimizing lookups into the long term lock table.
347591 The result of:

select convert(long varchar,current date,13)

would have returned a string based on the Date_format option, rather than the format represented by the parameter 13. This has been fixed.

347610 The readText method of QATextMessage and the readBinary method of QABinaryMessage could have returned -1 (indicating no more content) before the end of the message content had been reached. In this circumstance, the getLastError method of the receiving QAManager could have indicated no error.

Now, getLastError will return an error code indicating an unexpected end of message has been reached.

347621 When the character set used by a dbunload connection was a Multibyte Character Set, and was different from the OS character set, rebuilding a database using either the -an or -ar command-line options, could have caused the last multibyte character in any comment (for example, a table comment) to have become mangled. When using dbunload without the -an or -ar options, the mangled multibyte characters could have been found in the reload.sql file, with the last byte in the form of hex string (\x??). This has been fixed.
347635 The UploadRow event of the Dbmlsync Integration Component was not being fired for update operations, unless verbosity was enabled that displayed uploaded and downloaded rows (-vr). The event is now called correctly.
347722 Database connections made before switching to Debug mode, sometimes would not have appeared in the connection list of the Debugger details panel. This has now been fixed.
347725 The QAnywhere JMS connector is a bridge between QAnywhere messaging and JMS messaging. If the connection to the external JMS messaging provider was temporarily lost, and the QAnywhere JMS connector subsequently received a message destined to JMS, while the connection was down, the connector would have failed and no longer delivered messages to the external JMS provider. This would not have affected receiving messages from the external JMS message provider, that were destined for QAnywhere. To restore connector functionality, the MobiLink server hosting QAnywhere needed to be restarted. Now, temporary connectivity problems with the external JMS messaging provider will not affect delivery of messages. Once connectivity is restored, the messages will be delivered.
347779 The Unload utility dbunload, or Sybase Central's Unload Database wizard, could have failed with a syntax error if a comment on an integrated login id contained a double quote character. Unlike other types of comments, double quotes are used to enclose the comment string, but any double quotes in the string where not being doubled. Now the comment will be enclosed in single quotes and any single quotee or escape characters will be doubled.
347825 If LOAD TABLE was executed on a Global Temporary table, an exclusive lock was left on the table until a COMMIT was executed. Other connections attempting to reference the table for the first time would block until the lock was released. LOAD TABLE will now execute a COMMIT at the end of the statement in this situation, releasing the lock. If a Global Temporary table was created with ON COMMIT DELETE ROWS, an error will be given on an attempt to use LOAD TABLE with that table.
347905 A long-running query that had a recursive union, may have crashed the server if it was cancelled. This has been fixed.
347910 When run on Windows CE platforms, dbmlsync would have ignored the trusted_certificates synchronization parameter used to specify trusted root certificates for TLS synchronization. This has been fixed.
347984 An incorrect result set (usually extra rows) could have been produced when DISTINCT was specified for a query involving joins. This has been corrected
348071 The synchronization client Dbmlsync, would have used the wrong last download timestamp for a synchronization, possibly resulting in a remote not getting download data that it should have recieved when all of the following were true:

- dbmlsync was being run so that the same subscription was synchronized repeatedly within the same run. This could occur if scheduling options were specified or if the restart parameter in the sp_hook_dbmlsync_end hook were being used.

- hovering was disabled. (ie the -p commandline option was used).

- an error occurred late in the download phase of the synchronization. The error would have had to occur in the sp_hook_download_end hook or later but before the download was committed.

In this case, if the next synchronization of the subscription occurred without shutting dbmlsync down, the last download time used would have indicated that the previous failed synchronization had a successful download, even though the download failed and was rolled back. This would have resulted in the remote not receiving data it required if timestamp based downloads were being used.

This has been fix, but should not have caused problems for systems using snapshot download.

348104 When retrieving data from HTML services, some characters need to be be HTML-encoded (eg. double quotes should be returned as "). In some cases (depending on the character set of database and the value of the Accept-charset header sent by the client), these characters were not being HTML-encoded properly. This has been fixed.

Note, to properly convert data to UTF-16 AND HTML-encode it, both operations have to be done essentially at the same time, which is currently not possible. Because of this, the HTTP server will not send UTF-16 if requested.

348106 In a Visual Basic RDO application, after updating columns in a resultset, calling MoveFirst or MoveLast would then have failed with the error "Not Enough fields allocated in SQLDA".

For example:

Call GResSet.Edit()

GResSet.rdoColumns("Col2").Value = 2

Call GResSet.Update()

GResSet.MoveFirst() < ---- 'Error : Not Enough fields allocated in SQLDA

The same problem was reproducable when calling ODBC functions directly.

For example:

Set rowset size to 100.

SQLExtendedFetch (SQL_FETCH_FIRST) to obtain a rowset.

SQLSetPos (SQL_UPDATE) to change a row in the rowset.

SQLSetPos (SQL_REFRESH) to update a row in the rowset.

SQLExtendedFetch (SQL_FETCH_FIRST) to refetch the rowset. < ---- 'Error : Not Enough fields allocated in SQLDA

This problem has been fixed.

348115 If the Database Unload utility dbunload was run with the -ar command line option (rebuild and replace database), using a database that had already been started on a database server, it may have failed to rebuild the database. The original database would have been deleted and the rebuilt database and log file would still have an extra "R" at the end of the filename. The log offset values would not have been reset to the values in the original database, although the data in the rebuilt database would have been identical to the original database. This has now been fixed.
348166 An application using the DBSynchronizeLog function of the Database Tools interface could have crashed, if the msgqueuertn function pointer in the a_sync_db structure was set to NULL. Now, if the pointer is set to NULL, the function default implementation is to sleep for the requested time period.
348252 The QAnywhere client library failed to free a small amount of memory whenever a message was sent or received. The amount leaked could have been significant for a long-running application. This has now been fixed.
348312 The server could have crashed on startup when run on NetWare.
348348 If the isql option ON_ERROR was set to EXIT, an "Out of Memory" exception could have been reported when attempting to display a long binary column when in console mode. This has been fixed.
348352 The first parameter to the system procedure sp_password() is the caller's password, which is to be verified before modifying the password of the current user or another user. The caller's password was not being checked before changing the user's password. Now, this password is checked, and an error is reported if the password provided does not match the password of the current user.

Note that the previous behaviour would not have allowed a user without dba authority to change another user's password. This change to sp_password() does not prevent someone from changing the current user's password if a DBISQL or Sybase Central session is left unattended, since that person could simply enter a GRANT statement to accomplish the change. An example situation where this change is beneficial is an application which provides a "change my password" feature using sp_password and prompts for the original password.

348353 If an ALTER TABLE statement was used to rename a column and the column was referenced in the column list of an UPDATE OF trigger, or was part of a foreign key defined with an ON UPDATE action, the server could have crashed or reported an assertion failure. The crash or assertion failure could have occurred after deleting the primary key for the table. Now, an error will be given when attempting to rename the column.
348356 If a stored procedure contained a statement like:

BEGIN TRANSACTION trans_name

the string "trans_name" would have been missing in the definition stored in the catalog. If a ROLLBACK TRANSACTION trans_name was executed later in the procedure, the error "Savepoint 'trans_name' not found" would have been issued. The name for the transaction is now included in the BEGIN TRANSACTION statement stored in the procedure's definition in the catalog

348407 The server would have failed to start when run on a Linux system using the 2.6.0 kernel. The Asynchronous I/O (AIO) support in th 2.6.0 kernel is not compatible with the server's usage for the 2.4.x kernel. AIO is now disabled when the server runs with the Linux 2.6 kernel. Note that AIO is still supported by the server when used with the 2.4 kernel.
348469 If a request log that contained statements executed by a Java application, was analyzed by the system procedure sa_get_request_times, any host variable values recorded in the log would have been missing from satmp_request_hostvar. Also, the last character of the host variable value would have been truncated. This has been fixed.
348488 When running on Windoes 9x/ME, the server would pause each tcpip connection for 1 second before succeeding. This has been fixed.
348490 The Data Source utility dbdsn, now respects the Driver= parameter on Windows platforms. If the Driver= parameter is included in the connection string, it will be used to specify the driver to be used for that DSN. The driver name, (i.e. "Adaptive Server Anywhere 9.0"), is the name listed in the HKLM\SOFTWARE\ODBC\ODBCINST.INI section of the registry, which contains an entry pointing to the driver DLL.

Notes:

1. Data source entries created using the Driver= parameter, where the driver is not an ASA driver, cannot then be read or listed by dbdsn

2. The Driver= parameter is already supported on Unix, but has a slightly different format - it simply specifies the fully-qualified path to the driver shared object.

348512 When connected to the utility database, (utility_db), executing a SET OPTION statement would have caused the next statement to fail with a "Connection error". This has been fixed. SET OPTION statements will now return an error, as they are not supported when connected to the utility_db. Subsequent statements will work as expected.
348516 Attempting to generate the plan for an UPDATE or DELETE statement, that involved proxy tables, would have caused the server to crash. A proper error message is now returned.
348517 Dropping a declared temporary table was not permitted if the database was running in read-only mode. This operation is now allowed.
348528 For very expensive queries which returned a large result set, an access plan having materializing operators was likely to be used even when the option Optimization_goal was set to 'First-row'. Now, it will be more likely that if a plan that doesn't contain materialization exists, it will be choosen as the best plan.
348610 Committing a transaction that deleted rows containing blobs, whose aggregate size was larger than the current cache size, could have taken a very long time. The time to do these deletes has been reducedsignificantly. As well, blob columns created by servers containing this change, can be deleted even more efficiently.
348620 A query where a predicate refers to a windowing function in a Union Derived table or view, may have returned incorrect results, or caused a server crash.

For example:

select * from

(select rank() over (order by emp_id) r from employee

union all

select rank() over (order by emp_id) r from employee) dt

where r > 10'

This has been fixed.

348646 Message throughput at the QAnywhere server may have appeared slower than expected. The synchronization of the QAnywhere server with the QAnywhere client included a download ack, that kept a server worker idle for roughly half of each synchronization. The download ack is now no longer used.
348652 If a QAnywhere message was sent to a JMS client through the QAnywhere JMS connector, it was possible that high priority messages would not have taken precedence over lower priority messages. Now, higher priority messages will take precedence over lower priority messages.
348659 The QAnywhere agent can now take a list of MobiLink server connection stream parameters, rather than just one. The list is supplied by specifying the -x command line option multiple times, one for each connection stream parameter, (a maximum of 32 failover servers may be specified).

For example:

qaagent.exe -x tcpip(host=abc.com) -x tcpip(host=def.com) -x tcpip(host=xyz.com)

The specified MobiLink servers are used to implement a failover scheme, such that if qaagent cannot connect to the first mentioned MobiLink server, qaagent will attempt to connect to another "failover" MobiLink server in the order they appear in the list. Qaagent will only connect to a particular MobiLink server, if it fails to connect to all the other MobiLink servers appearing previously in the list. This list traversal will occur every time qaagent attempts to synchronize messages with the server.

Qaagent has a "listener" component (using dblsn) that is used to receive indications from the MobiLink server that messages are available at the serevr for synchronizaton. The listener component only uses the first set of connection stream parameters specified using -x, the listener component does not failover. This means that qaagent can never receive push notifications from failover servers. If the failover servers are indeed different servers, then qaagent should be run with -ra command line option. When -ra is used, qaagent is allowed to sync with a server even if it has synced with another server -- normally this is restricted behaviour.

Note:

The failover capability of QAnywhere Agent does not work in the following situations:

- the agent is running on a cradled Windows CE device,

- the agent is configured to use TCP/IP for communication with the primary MobiLink server,

- the device is using ActiveSync for TCP/IP connections.

Because of the way TCP/IP is implemented for ActiveSync, the QAnywhere Agent believes that the TCP/IP connection to the primary MobiLink server always succeeds, even when the server is unavailable. This results in the failover MobiLink server never being used.

Failover works correctly in the case of a cradled CE device with an ethernet connection, when ActiveSync is not involved.

348670 When server-side translation was enabled (i.e. server command line option -ct), the server could have hung when the string sent by the client application did not conform to the connection character set. For example, reading a SJIS file into dbisqlc, running on a machine with ANSI codepage 1252, without specifying client charset to be SJIS. This is now fixed.
348751 If the server had multiple, memory intensive transactions running concurrently, it may have erroneously failed with an 'out of memory' error'. This would only have occurred on multiprocessor systems. This has been fixed.
348765 The network server, running on Unix platforms, could have incorrectly started even though another server with the same name was also running on the network. This has been fixed.
348773 The server could have crashed when started with a very long command line.
348793 It was possible to edit the result set of a query, even though some, or all, of the primary keys were not included in the result set. Now, the result set can only be edited if all of the primary key columns are included, or the table has no primary key. These conditions have been added in addition to the existing conditions; that columns must all come from one table, and no Java columns are included.

Updating rows without the entire primary key being in the result set, could have inadvertently modified or deleted more than one row.

Some examples, using the sample database (ASADemo):

1. SELECT * FROM customer

The query include all primary key columns from the

"customer" table, so the results are editable.

2. SELECT year, quarter FROM fin_data

The query does not include all of the primary key columns

("code" is missing), so the results are not editable.

348794 Attempting to put a Unicode (wide character) string into a column that had a datatype of char, varchar, binary or varbinary, via a parameterized INSERT statement, would have resulted in garbage characters being placed into the column. A work around is to explicitly set the type to DbType.AnsiString

The following C# fragment illustrates the problem.

IDbCommand cmd = dbConnection.CreateCommand();

cmd.CommandText = "insert into t ( value,value2 ) values (?,?)";

IDbDataParameter param1 = cmd.CreateParameter();

IDbDataParameter param2 = cmd.CreateParameter();

// uncomment this line for workaround

// param1.DbType = DbType.AnsiString

param1.Value = "ABC\x00"+"DEFG";

param2.Value = "ABCD\x00"+"EFG";

cmd.Parameters.Add(param1);

cmd.Parameters.Add(param2);

cmd.ExecuteNonQuery();

cmd.Dispose();

This has been fixed.

348902 If two or more TLS or HTTPS connections to the same server were initiated at the same time (from the same or different clients), it was possible for one or more of the connections to time out during the handshake, or for the server to crash. This has now been fixed.
348906 The character set GB2312 (aka csGB2312 or GB_2312-80) was not supported by the server. This has been fixed - any of the above names is now a valid alias for GB2312.
348922 If a transaction was active when a BACKUP DATABASE statement was executed, and the transaction subsequently rolled back, changes made by the transaction prior to the start of the backup would not have been rolled back in the backed up database. The contents of the transaction log would have been backed up correctly, and this log could have been applied to an earlier copy of the database to produce the correct results. This problem only occurred on databases created with versions 8.0.0 or later, and does not affect client-side backups created with DBBACKUP. Now, uncommitted transactions will be rolled back correctly in backed up databases.
348935 If a multi-threaded client application attempted to make simultaneous TLS connections, one or more of the connection attempts may have failed with a handshake failure or have displayed an error that TLS initialization failed. This has been corrected.
348943 The Multi-byte character set UltraLite runtimes would have compared columns (and sql expressions) incorrectly, (ie. 'foo' != 'foo '). The shorter string was being null padded rather, than blank padded. This is now fixed. The Unicode runtime was not affected.
348944 Attempting to run a query involving proxy tables, in full passthrough mode, where there are a large (more than 300) number of UNIONs, then the server may crash with a stack fault. This problem has now been fixed, regular stack checks are performed when recursing through the UNIONs.
348946 When evaluating the number of rows in a partial index scan of the form 'idx<T.A = constant>' (the index 'idx' is defined only on the column T.A) the optimizer was not using the selectivity estimate of the predicate 'T.A = constant'. Instead the number of distinct values in the index 'idx' was used to estimate the number of rows returned by the partial index scan. Often, in the presence of the skewed data, the selectivity estimate of the predicate 'T.A = constant' is more accurate than using the number of distinct values in an index. This has been fixed.
349014 An application using the ADO.NET provider may have failed to connect to a version 7.0 server. While connecting, the provider attempts to determine the client's character set and the database's character set, so that it can do character set translation. If the provider determined that it could convert to the database's character set, it attempted to turn off character set conversion on the server by sending a 'change character set' command. The 7.0 server does not recognize this command and responds with an error. It was this error that caused the connection failure. In fact, this error is not fatal and the provider will now ignored it, using the client's character set intead.
349036 When using the Database Erase utility dberase, Database Translate utility dbtran, Database Extract utility dbxtract, or Database Unload utility dbunload, and specifying the -q command line option (quiet: do not print messages), without the -y command line option (over write files without confirmation), the user would still have been prompted with a message whether to over write an existing file. The prompts are now suppressed, and the action will not be carried out unless the -y option is also specified.
349043 Selectivity estimates of 0% from histograms, for a predicate of the form "T.x = constant", may have been ignored when a multi-column index was costed.

For example, the number of rows for an unique index on table T, on columns <T.A, T.B>, for which the fence posts were built using two equality predicates - "T.A = constant1" and "T.B = constant2" - was set to 1 row. If the selectivity of the predicate "T.A = constant1" was known to be 0%, that selectivity was incorrectly ignored.

This has been fixed.

349048 The Database Translation utility dbtran, was ignoring the -q (quiet: do not print messages) command line option,. This has now been fixed, no messages will be displayed when -q is used.
349073 If any of the statements listed below did not qualify a table name with an owner, then it was not possible to translate the transaction log and re-execute the generated statements using a different userid than that used to execute the original statements.

CREATE/ALTER VIEW -- affected tables referenced in the view's query

CREATE INDEX

ALTER TABLE

TRUNCATE TABLE

GRANT

REVOKE

DROP VIEW

LOAD TABLE

Now, these statements recorded in the transaction log will now have the table name qualified with its owner name.

349182 If the Transaction Log utility dblog was run with the -il, -ir, -is, -x or -z command line options, or the Database Unload utility dbunload was run with the -ar command line option, they may have crashed and left the database in a state such that it could no longer be started. The server would have reported that the database had been used more recently than the log file and failed to start. These utilities have now been fixed.
349187 If the optimizer chose to use the alternative Nested Loops strategy, inside a Join Hash execution node, then it was possible for the query to return incorrect results. For this to have occurred, certain other conditions had to have been met as well. In particular, the equi-join condition had to involve comparisons of an indexed column with values of different datatypes, so that the server needed to convert the values to the datatype of the indexed column.

For example:

CREATE TABLE foo( c1 NUMERIC(6,0), ... );

CREATE TABLE bar( c1 int, ... );

CREATE INDEX idx on bar( c1 );

...

SELECT * from foo, bar where foo.c1 = bar.c1

The server could have returned incorrect results if all of the following were true:

- The join of foo and bar was done using Join Hash with foo being the build table and bar the probe table,

- The hash join node contained an alternative Join Nested Loops strategy that involved lookups using index bar.idx,

- The actual number of rows on the build side was such that the alternative Join Nested Loops strategy was in fact employed during query execution.

This has been corrected so the the server will return the correct result set.

349198 When two synchronizations, using the HTTP or HTTPS stream from the same remote database, occurred within the time specified by the MobiLink server's contd_timeout value (30 seconds by default), it was possible that the second synchronization would have reported the error "The user name 'rem1' is already synchronizing. Concurrent synchronizations using the same user name are not allowed". It's important to note that in some circumstances it was possible for the initial upload sent by the remote to be discarded by the MobiLink server, and the MobiLink server would ask the remote to resend starting at a different log offset. This would also cause the "already synchronizing" error to occur. This problem has now been fixed.
349219 A Transact-SQL query of the form "SELECT ... INTO #temptable ..." could have failed with the error "Table {tablename} not found" (SQLCODE -141), if a warning occurred when the query was being optimized. The warning most likely to have caused this error is "The result returned is non-deterministic" (SQLCODE 122).

For example:

select first id into #temptab from tab1

Now the query will proceed, but the original warning will be reported. A workaround is to test the query without the INTO clause and resolve the warning (for instance, by adding an ORDER BY clause to resolve the non-deterministic warning).

349238 If a Remote Data Access query, involving FIRST or TOP n, was executed in full passthrough mode, then a "non-deterministic result set" warning may have been incorrectly generated. This problem has now been fixed.
349244 Setting value of a string property to NULL, with QAMessage.setStringProperty, would have resulted in a null pointer dereference. This has been fixed, NULL string property values are now supported by the QAnywhere client library.
349254 If a download conflict error occurred during synchronization, the UltraLite application could possibly have crashed at some point in the future. This has been fixed
349304 ASA 8.0.2.4339 on WIndows 2000.

Getting ASA temp file very large (several GB) which fills up disk and crashes the server.

349321 On CE, when a removable media card containing the UltraLite database was ejected while the application is running, the runtime would have reported the error SQLE_MEMORY_ERROR. If the device was turned off and turned back on again (for example, when it enters and leaves power saving mode), it essentially ejects and reinserts all removable media cards, which would have caused this error.

This problem has now been fixed, the runtime silently re-attempts to access the database file for a few seconds. If it fails after this time, then the card must have been manually ejected and it will return SQL error SQLE_DEVICE_IO_FAILED.

349326 The active procedure context could have been lost if an EXECUTE IMMEDIATE executed a batch, perhaps by a calling another procedure. One symptom of this would be that the global variable @@procid would be 0. This has now been fixed.
349359 When determining the broadcast address to use, the server was using the IP address of the host and ignoring the subnet mask, which was resulting in an incorrect broadcast address. This meant that client applications that used broadcasts to find servers may have failed to find them, and similarily, servers may have fail to find existing servers with the same name. This has now been fixed.
349450 After recovering a database which used no transaction log file, shutting down the server before modifying the database could have caused assertion failures 201810 "Checkpoint log: the database is not clean during truncate" or 201117 "Attempt to close a file marked as dirty". If the server was killed or the machine or server crashed before the database was modified, then subsequently checkpointed, the database could have been corrupt. Only databases created with 8.0.0 or later are affected. This problem has now been corrected.
349467 The following message:

unaligned access to x, ip=y

was being displayed in the system log when the server, or one of the database utilities, was used, where x and y were some hex values.

These messages would not have caused any execution correctness problems, but may have degraded performance slightly.

This has been fixed.

349471 QAnywhere C++ client library APIs, that returned a string to a buffer given a buffer size, could have overwritten the buffer by 1 with the null terminator. This has been changed so that buffer size is now the maximum length of the string plus 1, to include the null terminator.
349473 When in passthrough mode, all EXECUTE IMMEDIATE statements within stored procedures, would have failed with "Statement is not allowed in passthrough mode". This has been fixed.
349486 When text in the editor was printed, if any of the text was selected, the selected text would have been printed with the same foreground and background colors as displayed in the editor. Selected text is now printed as if it was not selected.
349588 The list of property names returned by QAMessage::getPropertyNames could have contained a duplicate name. This would have happened if, for example, setStringProperty( "p1", "x" ) was called, followed by setIntProperty( "p1", 3 ). This has been fixed. Now, the second call to set the value of property "p1" will override the first call.
349620 If one connection was executing a WAITFOR statement, another connections attempting to do DDL and some other database or system-wide operation may have encountered an unexpected five second delay. This delay has now been removed.
349653 When run on Unix platforms, the server could have crashed on startup. This has been fixed.
349655 If a database was started and then shutdown before the cache warming request was picked up by one of the server's worker threads, the server could have crashed, accessing memory that had already been released. This small window was much more likely to have occurred on a very heavily loaded machine. Disabling cache warming would eliminate the problem. This has been fixed.
349675 The QueryEditor dialog was not resizable. This has been fixed so that the dialog can now be resized.
349746 In some rare situations, the server could have updated column statistics incorrectly, which could then have resulted in the optimizer choosing poor query plans. This was more likely to have occurred with a plan that used the alternate Nested Loop Join strategy in a Hash Join operator. This problem has now been fixed.

Additionally, for some predicates on string columns with low selectivity, the server will now make better use of index probes to determine selectivities.

349811 Queries involving ORDER BY and index hints may have unnecessarily included a sort of the output. For this to have occurred, the query must have contained no sargable predicates on the hinted index, and the ORDER BY clause must have been satisfiable with a backwards scan of the hinted index.

For example, the following query was unnecessarily using a sort on top of the hinted index scan:

select id from tab1 with( index( tab1 ) ) order by id desc;

but the following two queries were correctly recognizing that a scan of the index would supply the correct ordering:

select id from tab1 with( index( tab1 ) ) where id > -9999 order by id desc;

select id from tab1 with( index( tab1 ) ) order by id asc;

This problem has now been fixed. A workaround is to include a sargable predicate with 100% selectivity on the index (as in example 2 above).

349901 The server would have crashed during execution of a query that used an index, if all of the following conditions were true:

- the index was a compressed B-tree index

- the index contained a character or binary key column

- the length of the search value for this key column was almost the page size, or was longer

- the search value for this key column was not a constant

This has now been fixed.

349913 A checkpoint occurring during index creation could have caused a server deadlock. For the deadlock to have occurred, the index must have been large relative to the cache size. This has been corrected.
349915 A query, where both join elimination and subquery flattening took place, may have returned too few rows.

For example:

select emp_id

from employee

where emp_id in (select distinct sales_rep

from sales_order key join sales_order_items)

for read only

This has now been fixed.

Note that this will not happen for updateable queries, since join elimination cannot take place in that case. Cases where it may happen include, "for read only" queries and "insert into ... select ..." queries.

A workaround is to prevent join elimination either by specifying "for update", or by using additional columns from the eliminated table in a way that doesn't change the result.

For example:

select emp_id + (manager_id-manager_id)

from employee

where emp_id in (select distinct sales_rep

from sales_order key join sales_order_items)

for read only

349918 SQL Remote may have reported the error "No log operation at offset x" and then exited. After examining all the transaction logs, one may find that the log offset x was in the header page of a transaction log file.

This problem could have occurred if:

1. the last log operation in the latest offline transaction log was a "redo_release"; and

2. in the online transaction log, there is no log operation of commit, rollback, or release and no actual data to be replicated.

This problem is fixed now.

349922 The changes for Engineering Case #347493, where a server crash upon startup if a large number of tasks were specified, and they could not all be created due to lack of memory, has been ported to the NetWare and Unix servers. The server will now fail with an error indicative of excessive memory usage.
349929 Calling the function property( 'LicenseType' ), would have incorrectly returned 'cpu-based' if the server was not licensed. This has been fixed so that 'not licensed' is now returned in this case.
349930 If incorrect options were used with the Unload Database utility dbunload, it could have crashed after displaying the usage. This has been fixed.
349938 If a remote connection has become inactive or is no longer needed, it can now be closed by executing the following:

ALTER SERVER server CONNECTION CLOSE

where "server" is the name of the remote server.

This new feature is most useful in the case where the remote server has gone away or has dropped the connection due to a timeout and the server is not able to detect that the remote connection is no longer useable. Issuing the "ALTER SERVER server CONNECTION CLOSE" statement in such cases will let the server know that the remote connection is no longer useable and should be dropped. Once a remote connection is closed, the server will create a new connection to the remote server when one is needed.

Note that this statement does not drop all connections to the remote server, but only the remote connection associated with the local connection. Also, the user does not require DBA authority to dop a remote connection.

349954 A new connection could have been refused, in very rare timing dependent cases, when it should have been allowed. In order for this to have occurred the network server must have been at its maximum number of licensed clients (Note, each unique client address from a remote machine counts as one license), and the last connection from a client machine must have been disconnecting at the same time a new connection was being made at the same client machine

This has been fixed so that the server calculates licenses used accurately.

349958 When shutting down a server running on Windows 95, 98, ME or NetWare, with a number of active TCP/IP or SPX connections, the server may have unnecessarily paused for several seconds at 100% CPU usage. The unnecessary delay has now been removed. Note that it is not uncommon or incorrect for the server to take several seconds with significant CPU to shutdown.
349975 Blob data, written to a database by an ODBC application using SQLPutData, would have been corrupted if the following conditions were true:

- the application used a different charset than the database

- the server had character set translation enabled

- the length parameter passed to SQLPutData was larger than SQL_ATTR_MAX_LENGTH

In this case the data is send as VARCHAR and the server does character set translation. This has now been fixed.

350038 If the Safari browser for Mac OS X, made an HTTP or HTTPS connection to an ASA server, the server may have failed the second and subsequent requests. This was due to the Safari browser erroneously using keep-alive, which is not supported. This has been fixed, now the "Connection: close" header will be sent to tell the browser that the server is not doing keep-alive.
350058 When run on Windows 95, 98, ME or NetWare, the server could have crashed when receiving BLOBs over TCP/IP or SPX connections. The probability of this crash was a very slight and timing dependent. This has now been fixed.
350084 The QAnywhere client library allowed messages to be queued into the message store until the disk free space was exhausted. When this occurs on a device with limited resources, such as a Pocket PC, applications are terminated by the operating system. Furthermore, the QAnywhere Agent could no longer synchronize messages with the server at this point, because the synchronization process requires disk and memory resources. This has now been fixed, so that the message store does not grow to an unmanageable size. If it is deemed that the message store is too large, QAManagerBase.putMessage() returns false and getLastError() returns QAError::COMMON_MSG_STORE_TOO_LARGE.
350090 In version 8.0, histogram entries are made for a single value only when it has a selectivity less than 1%. This strategy was found to be deficient for some user databases. Consequently, version 9.0.0 was changed to create entries for single values for the top N frequencies in the distribution of a column. No lower bound was placed on the selectivity of frequencies for which single value entries were made. As a result, the histogram became "noisy", with a subsequent degradation in quality. An example of such a scenario was a table that contained a column that was not declared unique, but actually had only unique values. The server then collected too much information in the column statistics, which could have caused an inefficient plan to have been chosen.

Now, a lower bound of 0.01% is enforced on the selectivity of frequencies that will be stored.

350188 If a database created using SQL Anywhere 5.5 included tables and procedures used for jConnect, these tables and procedures would have been included in the reload.sql script generated by the Database Unload utility dbunload. These objects will now be excluded from the reload script.

Note, that upgrading a 5.5 database using the Database Upgrade utility causes the jConnect objects to be replaced with ones owned by dbo, so an upgraded database does not have this problem.

350245 The server could have crashed while a large volumne of data was being fetched through a TDS connection when the '-z' (display debugging information), command line option was used. This has now been fixed.
350252 The Interactive SQL utility dbisql, could have reported an OutOfMemory exception if it encountered a problem fetching a result set. This problem has now been fixed.
350319 When using the Microsoft Query Analyzer with Microsoft SQL Server 2000 to issue a query on a Linked Server definition that referenced an ASA server, an error such as the following would have been reported:

Server: Msg 7317, Level 16, State 1, Line 1

OLE DB provider 'ASAProv.80' returned an invalid schema definition.

For example:

select * from ASA8.asademo.dba.customer

where "ASA8" is the name of the Linked Server, "asademo" is the catalog name, "dba" is the schema name and "customer" is the table name. This problem has been fixed, but the following must also be done in order to support a Linked Server query:

- When the Linked Server is defined, "Provider Options" must be selected. (this button is greyed out and unusable once the Linked Server has been defined). In the Provider Options dialog, the "Allow InProcess" option must be selected.

- ASA does not support catalogs, so the four part table reference must omit the catalog name (two consecutive periods with no intervening characters, ie select * from ASA8..dba.customer). Including a catalog name will result in the error: "Invalid schema or catalog specified for provider 'ASAProv.80'"

- The database must be updated to include the revised stored procedures found in the scripts\oleschem.sql directory. This file includes a new stored procedure dbo.sa_oledb_tables_info that is required for Linked Server support.

350339 Attempting to connect to the utility database, by specifying an ODBC data source, would have caused the database name to not be displayed in the tree and generated the error "The information required to display the database in Sybase Central could not be obtained." This has been fixed.
350348 Nested block joins that used parallel index scans (i.e. on a database server with a RAID array and on which the affected dbspace has been calibrated) may have returned no rows, if there was a cast() expression on the left hand side of the join condition. This expression may have been introduced either explicitly in the text of the query, or automatically by the optimizer. This has been fixed.
350353 Modifying and rebuilding an ASP.Net application, which used the Managed Provider, would have caused the ASP.Net worker process aspnet_wp.exe, to consume 100% CPU time. This has now beed corrected.
350374 If the Synchronization Client dbmlsync, was forced to do Referential Integrity (RI) resolution after applying the download stream, and the parent table had been empty, then every row in the child table would have been erased, even those where there were NULL values in the referencing column(s) of the child table. Now, these rows are no longer erased during RI resolution.
350399 If a binary column was bound as char (SQL_C_CHAR) or wide char (SQL_C_WCHAR) and the rowset size was greater than 1, and more than 1 row was fetched, the calculation for the offset into the data buffer for the column value was incorrect. For SQLBindCol(), BufferLength is the size of a single element in the data buffer array. The calculation for the offset was (BufferLength* row_number )+(column_size * row_number) where row_number is 0, 1, 2, 3, etc. This incorrect calculation was done in an attempt to compensate for the fact that each binary byte results in two character bytes upon conversion.

For example, if the column was BINARY(20) and it was bound as SQL_C_CHAR and the BufferLength value was 20, then the converted values were stored at offset 0, 20*1+20*1, 20*2+20*2, etc. which was 0, 40, 80, etc. This is incorrect. The column values must be stored at offset 0, offset BufferLength * 1, offset BufferLength * 2, etc. which, in the example, is 0, 20, 40, etc.

This problem has been fixed, but as a result. the application must ensure that the value for BufferLength for binary to character conversions, is double that of the actual column length, in order to avoid truncation. For example, if the column is BINARY(20) and it is bound as SQL_C_CHAR then the BufferLength value must be 40 (ie 2*20).

A similar problem also existed for UniqueIdentifier columns, bound as char (SQL_C_CHAR) or wide char (SQL_C_WCHAR), in which a 16-byte binary value is converted to a 36-byte character string complete with hyphens (e.g., "41dfe9e6-db91-11d2-8c43-006008d26a6f" ). The buffer offset calculation for this was also incorrect, and has also has been corrected.

350530 If a mirror log existed, then running the Database Backup utility dbbackup, with the -x (delete and restart the transaction log) command line option, would have failed to delete the renamed mirror log file created during the backup process. This has now been fixed.
350546 A query with multiple columns in the select list of an ANY or ALL subquery is invalid. Such a query would have failed with error -151 - "Subquery allowed only one select list item", or non-fatal assertion 102602 - "Error building ALL subquery" if the select list contained a * that expanded to multiple columns. Now such a query will consistently report error -151.
350551 When data was inserted using the OLEDB provider into a column with a datatype such as "long varchar", "text", "long binary", "image" or "long varbinary", which have a maximum length of 2 Gbytes, the data may have been truncated at 4 bytes. This problem has now been fixed.
350566 When used as a table-expression in the FROM clause, user defined functions would have returned an empty result set. Now this is disallowed with error -872 - "{function name} does not return a result set".
350675 If a procedure was defined to return multiple result sets, debugging the procedure and selecting "Step into", on a statement that returned one of the result sets, would have caused the debugger to report the following message:

"The source could not be shown for the procedure because the database filter is excluding it."

This has now been fixed.

350688 If an application called ResultSet.last(), to scroll to the last row in the result set, and then called ResultSet.isLast(), to check to see if the cursor was positioned on the last row, the iAnywhere JDBC Driver would have incorrectly returned false, rather than true. This problem has now been fixed.
350816 Attempting to use the Foreign Key wizard to create a clustered foreign key, with the 'Check on commit' checkbox checked, or specified an Update and/or Delete referential action, then the wizard would have failed to create the foreign key. Instead, a syntax error dialog would have been displayed. An invalid ALTER TABLE statement was being generated, by placing the CLUSTERED keyword before the referential action clauses. Now, the CLUSTERED keyword is placed at the end of the statement.
350821 The ability to insert or update table data from the results panel, suffered from the following problems:

1. It was not possible to differentiate between NULL and an empty string

2. It was not possible to predictably specify for a column that the DEFAULT value was to have been inserted

3. It was not possible to change a non-NULL value to a NULL value in a BIT column.

These problems have now been fixed. As part of this fix, the user interface controls used to enter table values have changed as follows:

1. BIT fields are now always shown using a text field. Previously, they were shown using a checkbox or a text field, depending on whether the connection was via jConnect or the iAnywhere JDBC Driver, and depending on the nullability of the column.

2. If a column allows NULL values, or has a default value defined, it is edited using a combobox. The drop-down list contains "(NULL)" and/or "(DEFAULT)" if applicable. If the column does not allow NULL values, and does not have a default, a plain text field is used.

3. If the "Return_date_time_as_string" option is OFF, TIME, DATE, and TIMESTAMP columns can now be edited using an optional time and date chooser. Note that this option is usually ON, so the new editors won't normally be see for these types.

Some other changes that were made to the result set display:

1. The table now displays tool tips for the column headers which shows the name of the column, its data type, whether it accepts null values, and its default value (if one is defined).

2. When editing a value, the column can now be resized and the value editor will not close. Previously, it did.

3. In DBISQL, changing the truncation length on the "Results" page of the "Options" dialog now takes effect immediately. Previously, it would not take effect until the next statement was executed.

4. In DBISQL, there is a new option for setting the string displayed to indicate the default value. By default, it is "(DEFAULT)". this can now be changed from the "Options"

dialog.

350823 The Database Unload and Database Extract utilities dbinload and dbxtract, did not recognize temporary tables and avoid generating LOAD TABLE statement for them. The change for Engineering Case 347825 was resulting in an error, when rebuilding a database containing a Global Temporary table if it was created with the ON COMMIT DELETE ROWS clause. Both utilities now avoid generating LOAD TABLE statement for Global Temporary tables.
350836 If a LOAD TABLE statement was executed on a Global Temporary table, an exclusive lock was left on the table until a COMMIT was executed. Other connections attempting to reference the table would have been blocked until the lock was released. This lock is unnecessary, so now, executing a LOAD TABLE statement on a Global Temporary table no longer aquires an exclusive lock.
350857 When more than one SMTP gateway was enabled in ther notifier setting, only one could have been used. Although more than one SMTP gateway is not usually needed, this problem is now fixed.
350949 This is an enhancement to the new feature added in Engineering Case 349938:

If a remote connection has become inactive or is no longer needed, a user can now close the remote connection by executing:

ALTER SERVER server CONNECTION CLOSE [CURRENT|ALL|connection_id]

where "server" is the name of the remote server.

ALTER SERVER server CONNECTION CLOSE, and

ALTER SERVER server CONNECTION CLOSE CURRENT

are the same and will drop the remote connection to the server associated with the local connection. The user does not require DBA authority in this case. Also, both ODBC and JDBC remote connections can be dropped using this syntax.

ALTER SERVER server CONNECTION CLOSE connection_id

will drop the remote ODBC connection associated with the local connection identified by connection_id. If the local connection identified by connection_id is not the current local connection, then the user does require DBA authority in this case. Attempting to drop a remote JDBC connection using this syntax will generate an error. Closing a remote JDBC connection for a local connection that is not the current connection, would require interacting with another connection's VM, which is not possible.

ALTER SERVER server CONNECTION CLOSE ALL

will drop all remote ODBC connections to the server. Attempting to drop all remote JDBC connections using this syntax will generate an error.

This feature is most useful in the case where the remote server has gone away or has dropped the connection(s) due to a timeout. In these cases, the server may not detect that the remote connection(s) is/are no longer useable. Issuing the "ALTER SERVER server CONNECTION CLOSE" statement in such cases will let the local server know that the connection(s) is/are no longer useable and should be discarded. Once a remote connection is closed, the server will create a new connection to the remote server when one is needed.

351001 On CE devoces, queries could have failed with the error "Dynamic memory exhausted", if a Join Hash operator was used in an access plan and the server cache size was too small. This has been fixed by disabling the Join Hash operator for CE devices during optimization if the available cache has less than 2000 pages. Thus resulting in access plans that do not contain such joins.
351009 When using a procedure in place of a table in the FROM clause, that consisted of nothing but a single select statement in the body of the procedure, if the arguments and result columns were the bigint datatype, the server could have crashed.

For example:

create procedure p( rstart bigint )

result ( x bigint )

begin

select row_num from dbo.rowgenerator;

end;

select * from p(1);

This has now been fixed. A workaround is to add some code to the procedure body so that it is not just a single select.

351069 Attempting to print the graphical plan when running in a language other than English, would have caused dbisql to fail with an internal error. This has been fixed.
351094 The OLEDB driver would almost always treat the database as if it was the 1252 codepage charset. In order to determine the character set of the database to which it was connected, the OLEDB driver queried the server for the collation name. It then used this collation name to search a table of codepage charset names. This was incorrect, as for the most part, collation names (e.g., "1252LATIN1") are not the same as charset names (such as "cp936", "cp1252", and so on). There are some exceptions however. The collation names "sjis", "utf8", and "iso_1" are the same as the charset name, so for these character sets, the problem would not appear. When the search routine did not find the collation name, it would default the charset to 1252. All application data is converted from UNICODE to the database charset, thus all application data was being converted to 1252, perhaps incorrectly.

This problem has been corrected, the correct charset is noe used.

351109 When rows were uploaded from a Java UltraLite application to MobiLink, it was possible for MobiLink to download those same rows back to the UltraLite application, even though these rows were not changed and should have been filtered from the download stream. This problem has now been corrected.
351110 This change fixes three problems of a similar nature to that addressed by Engineering Case 344946.

Attempts to execute a statement that contained an IN list with too many elements would have lead to the following assertion failure:

104010, "Internal vector size too large"

This was due to an IN list optimization that was failing. The maximum number of IN-list elements was limited by database page size. Now, IN-list size is limited by cache size. However, if an IN list is larger than the above limit, the IN-list optimization will not be used, which may impact performance, but the statement will not fail.

Attempts to execute a statement that referred to too many tables could have lead the to following assertion failure:

101504, "Memory allocation size too large"

The maximum number of tables is limited by database page size.

Attempts to execute a large statement could have lead to the assertion failure:

101503, "Heap index (%d) and heap header page counts (%d) disagree"

if the size of the associated heap was larger than 2^16 pages.

351130 Calling the trim() function on a string consisting only of whitespace, with a length of less than approximately 30 characters. (The actual length required was platform dependent) could have caused the server to crash. This has now been fixed.
351135 The QAnywhere .NET client library for the .NET Compact Framework now supports Message Listeners.
351144 Statements used in a store procedure, whose plans were not yet cached, (see also database option Max_plans_cached), may have been checked more than once to see if they qualified to be cached sooner than the scheduled training period. This has now been fixed.
351245 The following ADO.Net connection parameters were not allowed to be quoted:

- connect timeout

- connection timeout

- connection lifetime

- connection reset

- enlist

- max pool size

- min pool size

- pooling

- persist security info

This has now been corrected, these parameters can now be quoted.

351247 If the help file dbmaen8.jar was not installed in the ASANY8\java directory, every time a property sheet, dialog or wizard was opened, an error dialog would have been displayed. Now, the error dialog is only displayed when you help is explicitly asked for.
351255 When running on Unix platforms, a Remote Data Access connection via shared memory to another (or the same) ASA server, may have failed if the connection persisted longer than the value set by the -ut server command line option, (30 minutes by default), on the server that made the connection. This problem has been fixed.

Note, both the client libraries and server must be updated.

351298 After calling a procedure that returned more than one result set, attempting to move to the next result set using ADO's NextRecordset() method, would always have returned Null. This problem has been fixed.

The following Visual Basic code fragment illustrates the problem (the stored procedure mysp() returns two result sets):

adors.Open("call mysp()", adocon, ADODB.CursorTypeEnum.adOpenDynamic,

ADODB.LockTypeEnum.adLockReadOnly,

ADODB.CommandTypeEnum.adCmdText)

Label1.Text = adors.Fields(1).Value

adors = adors.NextRecordset() <--- adors was always Null after this

Label1.Text = adors.Fields(1).Value

351306 If the SNMP Extension Agent was connected to a database and the connection was forcibly closed (due to DROP CONNECTION, liveness timeout, or the database or server being unconditionally shut down), the agent may have crashed. This now has been fixed.
351353 If the STRTOUUID function was passed an invalid UUID string, it would have returned a NULL result rather than raising a conversion error. Now a conversion error is given, unless the database option Conversion_error is set to 'OFF', then the function will return NULL when its argument is invalid.
351368 The fix for Engineering Case 350348, might have missed a cast() on multiple columns. There was a chance that this error would have caused the optimizer to hang on machines that have RAID arrays and have had their dbspaces calibrated. This problem has now been corrected.
351379 When installing ASA 9.0 on Solaris or Linux, and only selecting the MobiLink components, the libdbunic9* library files are not installed. Applying an EBF of build 1322 or later will now install the missing libraries if MobiLink has been installed. If the libraries are already present, it will be updated.
351394 If a query had duplicate ORDER BY items, opening it in the Query Editor would have caused its parser to generate an error.

For example:

SELECT emp_fname, emp_lname

FROM employee

ORDER BY emp_fname, emp_fname

SELECT emp_fname, emp_lname

FROM employee

ORDER BY 1, 1

This has now been fixed, the duplicate ORDER BY item will be ignored by the Query Editor's parser.

351396 When installed on CE devices, the OLEDB client library was not self-registering itself. This has been corrected. A work around is to register the library manually using regsrvce.exe.
351416 Dragging a column header, in either the Connection Viewer or the Property V iewer of the Console utility dbconsole, may have caused it to report an error, or even crash. This has now been fixed.
351546 When in the Code Editor, if Auto indent was set to Default or Smart, pressing enter with text selected would have added a new line to the selection, rather than replacing the selection with a new line. The problem does not occur when tab Auto indent is set to none. This problem has now been fixed.
351570 online documentation ASA 901 has wrong link.

In the ASA manual, the link for the variance alias function points to the incorrect aggregate function

ASA SQL Reference

- SQL functions

- Alphabetic list of functions

- VARIANCE function [Aggregate]

An alias for VAR_SAMP. See STDEV_SAMP function [Aggregate].

The link points to the STDEV_SAMP function and not the VAR_SAMP function

351574 hide database scheme for users. Any changes in rights for system tables lead to user can't connect to database. For instance to hide text of stored procedures from users, who is member of Public group.

Possible workaround might be:

ALTER PROCEDURE [ owner.]procedure-name SET HIDDEN

but this is for all users.

351603 In very rare circumstances, the server could have crashed with ambiguous symptoms during query execution. The cause of the crash was likely to have been memory corruption. This problem has now been fixed.
351614 When the Synchronization client dbmlsync was running in the scheduling mode, and the command line option, -p (disable logscan polling) was used, it may have taken longer and longer to complete each synchronization cycle. This would have occurred even if the upload and download data remained the same for each cycle, as the transaction log would have grown. If the command line option -x (rename and restart the transaction log) was also used, and the database option Delete_old_logs was set to ON in the remote database, dbmlsSync could complain with, "Missing transaction log(s) before file ...". This problem is now fixed.
351643 Updating a column over a TDS connection (via ct_send_data) could have failed with a syntax error. This is now fixed. The problem was caused by the server reporting the full file path of the database as the dbname portion of the described column rather than just the database name. For example, the server would have described the column name as "e:\dir\MyDB.db.MyTable.BlobCol" rather than "MyDB.MyTable.BlobCol".
351644 The QAnywhere Agent qaagent.exe now supports the -q (Quiet mode) command line option. With this option, the main window is initially minimized to the system tray on Windows NT/2000/XP, and is completely hidden on WindowsCE. This option also starts the database server with the -qi (do not display database server tray icon or screen) command line option. Because the agent is completely hidden on Windows CE, when started with -q, there is now a Stop utility qastop.exe, that shuts it down gracefully.

The motivation for this change was related to running the QAnywhere Agent on Windows CE devices, in that there is a limitation that there may be at most 32 processes running at one time. When this limit is reached, and a new application is launched, Windows CE will send a WM_CLOSE message to the application that appears in the list of running applications given by Settings/System/Memory/Running Programs. When the QAnywhere Agent is launched without -q, it appears in the list of running applications, and is eligible to receive a WM_CLOSE when another application is launched. Since, the QAnywhere Agent is to behave like a service when run on Windows CE devices, it is recommended that it be launched with -q.

351658 When executing statements that required sorting large result sets, during certain phases of the sort, canceling the request would not have been processed in a timely manner. Extra checks for CANCEL have been added.
351705 It was possible for the QAnywhere client library to have generated duplicate message IDs. Although it was unlikely for distributed systems of less than 10,000 clients with the total number of messages sent less than 100,000,000. However, if the number of clients were to have increased by an order of magnitude, or if the total number of messages were to have increased by several orders of magnitude, there would have been a significant chance of duplicate message IDs being generated. This problem is now fixed.
351709 Executing queries that needed a sort operation, on servers with very little available memory, may have crashed the server. This has been fixed.

This error is likely to have occurred only when the cache size was inadequate for the server's workload. A workaround. which will reduce the chances of the crash occurring, is to increase the cache size (if practical).

351717 The Synchronization Client dbmlsync, did not handle resumable downloads correctly. If a failure occurred after recieving more than 64 K of the download was recieved, and during the resume attempt, more data was recieved, and another error occurred, dbmlsync would not have saved the data it recieved during the resume attempt. As a result it would have had to download that data again if the download was resumed again. This meant that after 64 K had been recieved, restarting a download was essentially an all or nothing process. The download would either have completed successfully, or any data recieved would have been discarded, leaving the remote in the same state it was in before the resume attempt.

This behaviour is now fixed.

351732 Executing a procedure, first with a CALL statement, and then with a SELECT, may have failed if the procedure body was a single select. Any use of grouping, aliases or subqueries in the single select could potentially have lead to the problem, but the exact conditions cannot be simply described. This has been fixed.

A workaround is to execute the procedure using only CALL statements or only SELECT statements. Another workaround is to add some useless code to the procedure body so that it consists of more than a single SELECT. For example, the following code could be added:

declare v int;

set v=1;

351733 If a transaction deleted rows from a table concurrently with another transaction inserting rows, there was a chance of database corruption. While this was more likely to occur on multiprocessor and Unix systems, it was still possible for it to have occurred on single processor and Windows systems. Corruption was also possible solely with concurrent deletes, but only in very rare circumstances. This has been corrected.
351739 The server could have crashed while recovering a database, if the following had occurred:

1 - a connection had begun a transaction with an Insert, Update or Delete

2 - a checkpoint subsequently occurred prior to a commit or rollback of the transaction

3 - another modification was made by the same connection on a table which had a trigger defined

4 - the modification was written to the redo log

5 - the server crashed or was killed prior to the next checkpoint

This has been fixed.

351746 The QAnywhere Agent qaagent.exe, would sometimes have failed to stop the database server on shutdown. This behaviour would most likely have occurred when the agent was shutdown while the Mobilink Client dbmlsync was in the middle of a synchronization, and had an open database connection. It problem only occurred on Windows CE.

Following error message would have appeared in the qaagent logfile:

InternalError: There are still active database connections

QAnywhere Agent shutdown error -109 - shutdown dbeng9 manually

This is now fixed.

351756 An application connecting to the MobiLink redirector, when configured to use multiple MobiLink servers, could hang under the following situation:

The application connected to the redirector, which then selected one of the MobiLink servers to send the request. If this server did not respond, the redirector detected this and marked the server as dead. The request would then have been routed to another MbiLink server. If a second application then connected to the redirector, and it initially happened to select the dead MobiLink server to service the request, it would eventually have been routed to a live MobiLink server, but a third application connecting to the redirector would have caused the application to hang.

Note that this problem could have occurred with a live MobiLink server, but was timing-dependent, in the following case: the live server would have had to have been marked dead, and the background thread that updates liveness state information, would not have updated the state yet. This was unlikely, unless the sleep interval for the background thread was high, and the number of requests was high. In that case, the state information was more likely to be out of date with respect to the MobiLink server when the third client connected.

These issues have been fixed.

351765 The REPLACE() function was slow when operating on long strings. The execution time was O(n^2), where n is the number of characters in the replacement string. The REPLACE() function has now been rewritten to scan the input string only once.
351821 A complex query involving many predicates and outer joins, may have crashed the server. This has been fixed.

Note, cases where this would have happened should have been very rare. Rearranging predicates in the WHERE clause of the query may be a workaround for the problem.

351823 The selectivity estimate for an equijoin predicate of the form "T.X = R.Y" was being set to 0% incorrectly, if the table T had more than one row, and the column T.X was NULL for all rows but one. This has been fixed.

Note that a selectivity of 0% for a predicate may have resulted in a very poor plan for the query, given that all costed plans would have had comparable very low cost.

351851 The Help button on the Connect dialog was not enabled for the Console utility dbconsole. It is now enabled
352032 On Linux platforms, the server's UDP Listener (used by clients to connect to the server and by dblocate) could have stopped with the following -z output:

TCP/IP Link, error on UDP Listener rc=4, er=111, ...

The UDP listener will no longer stop if it receives this error (111 is ECONNREFUSED). The -z message will continue to be displayed though.

352035 If a procedure was called in a FROM clause, and the procedure body was a single SELECT statement with a common table expression and nothing else, then the SELECT statement within the procedure would have failed with the error 'Table {common table expression name} not found'.

For example, given the procedure:

create procedure p1()

begin

with c1(a) as (select 1) select * from c1

end;

The query 'select * from p1()' would have failed with the error 'Table 'c1' not found'.

There are two possible workarounds

1) Add some code like "DECLARE varname integer; set varname = 1;" to the procedure to prevent inlining.

2) If the procedure takes no arguments, use a view instead.

This problem has now been fixed.

352047 If the "Disconnect" User Event was enabled and a connection autostarted a database, and used the connection parameter Autostop=yes, the database may not have been shutdown after the last disconnect. This has been fixed.
352048 The native methods that supported 'java.lang.reflect.Method.invoke()' did not consider the case where a private method was called, using Java Reflection, from a method of that same class. Thus a java class that used reflection to return and invoke a method on itself, would have throw an exception when changing the access of the method being called from public to private. This has been fixed, by examining the class of the caller, and allowing the private method to be invoked if the method's class and the caller's class are the same.
352050 When run on Macintosh systems, the Server startup options dialog did not parse multiple arguments when entered in the "Options" text box, (eg -x tcpip -m). The result was a usage message on the console window. This has now been fixed.
352119 Calling the BeginTransaction() method would have failed with the error "Can not set a temporary option for user 'DBA'", when connected to a database using the Turkish 1254TRK collation. This problem has been fixed.
352129 If a Remote Server did not support correlation names, then there was a chance the Remote Server would have encountered a syntax when an UPDATE statement involving remote tables was executed. This problem has now been fixed.
352147 In some circumstances, parallel index scans may have left some index pages locked when finished. This was more likely to occur with a cold cache. If this problem occurred, the following three symptoms would have resulted:

- The locked index pages would have remained permanently in cache, decreasing the amount of available cache.

- The engine would have hung at shutdown.

- Connections making updates, inserts or deletes to column values contained in the scanned index, such that the locked index pages need to be modified, would have blocked indefinitely.

This problem has now been fixed.

352149 The hash table scan operator has now been implemented.
352159 It was possible for an application to have hung after attempting to cancel a request. This problem would only have occurred very rarely on multiprocessor systems, and was even less likely to have occurred on single processor systems. This has been fixed.
352169 Large messages synchronized over a flaky communications link may have failed many times before successfully downloading. This was because messages had to have been synchronized in a single session, requiring a connection with the server for the duration. Now, when only part of a message is synchronized before the connection breaks down, the next time a connection is made, only unsynchronized parts of the message will be synchronized. Hence, eventually, the entire message will be synchronized and made available to the client.

The partial synchronization is stored in a temporary file, which is deleted when the entire synchronization is downloaded and applied. If new messages become available for a client or are generated by the client in the time between when the last communication failure and the next synchronization, then any partially synchronized data is discarded.

352170 If a column in the right pane contained dates, times or timestamps, then clicking on the columns header to sort the items, would have sorted them according to the string representation of the date, time or timestamp, not according to the actual date, time or timestamp value. For example, if sorting in ascending order the date "April 1, 2004", it

would have appeared before the date "January 1, 2003". This has been fixed, dates, times and timestamps are now sorted by their actual value.

352176 The QAnywhere Agent qaagent sends special system messages to a "system" queue that contains information about the network status of the client. These messages were not getting deleted from the client's message repository, even after they had expired. Now with this change, they are being deleted.
352188 If an HTTP synchronization client encountered a malformed cookie, either in a "set_cookie:" HTTP header received from an HTTP server, or from a "set_cookie" synchronization parameter, it would properly have failed, but it would not have set any stream error. Now, it will set the stream error to STREAM_ERROR_HTTP_UNABLE_TO_PARSE_COOKIE.
352226 If one or more columns in a primary key were renamed, but no other changes were made to the primary key columns, then the primary key would have been dropped and re-created unnecessarily. Since dropping a primary key also drops all foreign keys which reference the primary key, dropping primary keys unnecessarily is to be avoided. Now, a primary key is only dropped and re-created when the data type, size or scale of one or more of its columns is changed, or when columns are added to it or removed from it.
352275 If an application exceeded the limit for prepared statements set by the database option Max_statement_count, but ignored the error returned in this situtation, it could eventually have caused the server to run out of memory. The temporary file would also have grown for each statement prepared. This has been fixed.
352289 The server could have crashed when dynamically growing the cache, if it had previously been shrunk. This problem was unlikely to have occurred on single processor systems. It has now been fixed.
352293 Moving the mouse over an object in the right panel, may have caused an exception to have been thrown when creating the Tooltip string. This has been fixed.
352297 UltraLite applications for Palm devices, containing the generated macro UL_CAST_LONG_DOUBLE, could have incorrectly failed with the SQL error SQLE_OVERFLOW_ERROR. This problem is now fixed.
352416 Message synchronizations between a QAnywhere client and the QAnywhere server may have failed with an error indicating a uniqueness constraint violation on the table ml_qa_repository_staging. It was possible, although rare, that after a server failure all subsequent message synchronizations from a particular client would have failed. This is now fixed.

To work around the problem, execute the following SQL statement, against the consolidated database, with a user having DBA authority:

alter table ml_qa_repository_staging drop unique( seqno )

The unique index being dropped is unnecessary, and is the cause of the problem.

352418 For a given query, the estimation of the number of rows returned by an index scan, where the index was over multiple columns, could have had a large degree of inaccuracy if the data was skewed, (ie some data values occurred significantly more often than others), and sargable equality or IN predicates existed for all columns. This has been fixed.
352434 If a user defined function was referenced in a SELECT statement and the function contained a call to the STUFF() function that returned an empty string, the server would have crashed. This has been fixed.
352456 A service executable path name containing a dash "-", would have been truncated at the character immediately before the dash when the path name was displayed in the Service property sheet. This has now been fixed.
352471 When the server was run on multi-processor Windows plarforms, tasks for connections where the database option Background_priority was set to 'On', would have been scheduled by the OS such that only one was running at a time, even if other processors were idle. This has been corrected.
352482 If the Log Translation utility dbtran was run with the -m ('transaction logs directory')command line option, and any of the log files in the directory were created while auditing was enabled on the database, dbtran would have crashed. This has been fixed.
352561 The logfile for the QAnywhere client store-and-forward database would only have been truncated when the QAnywhere Agent qaagent was shutdown, and hence would have contained some redundant messages already synchronized up to the QAnywhere server. Now, the log file will be truncated periodically during the lifetime of a qaagent instance.
352572 An application that used multiple threads to access the same connection through ODBC could have hung. This has been fixed.
352573 MobiLink Synchronization clients using HTTP, will now recognize all "Set-Cookie" and "Set-Cookie2" HTTP headers that they receive in server replies and will send these cookies back up with all future HTTP requests. If the name of a cookie matches an existing cookie, the client will replace its old value with the new one. Cookies are not remembered between synchronizations, they are discarded at the end of the synchronization.

This behaviour exists in both the HTTP and HTTPS synchronization streams and is always enabled, but is not supported in Java UltraLite.

352576 The QAnywhere Agent, when run on Windows CE, took the path specified by the -dbfile command line option to be relative to the directory where the agent was launched. This has been changed, now the path specified by -dbfile is taken to be an absolute path. The default is unchanged, the directory where the agent was launched from.

The meaning of the -dbfile option for Windows NT, 2000, or XP is unchanged; the standard meaning of a file path for these OS's. The default is also unchanged; the current working directory.

352582 Deleting and recreating the QAnywhere client-side message store-and-forward database would then have prevented synchronizing messages to or from the QAnywhere server. This was due to the QAnywhere server and client doing a sanity check on the store-and-forward database. Since the original database was deleted, the server was seeing the new database as incorrect. A work around for this problem, is to use the -rb command line option on qaagent, which indicates to the QAnywhere server that the store-and-forward database has been re-created.

Another symptom of this problem was if failover had occurred, and new QAnywhere server had a different status of client's store-and-forward database. To work around this problem, use both the -rb and the -ra qaagent command line options, which together tell the QAnywhere server that the store-and-forward database is fine to use.

Now, the qaagent -ra and -rb command line options are implicit.

352626 The QAManagerFactory methods createQATransactionalManager(iniFile) and createQAManager(iniFile) would not have failed if there was an error reading the initialization file. This has been fixed, now these methods return NULL if the file cannot be opened or contains an invalid parameter specification. In order to provide a way for the application developer to discover the cause of an error in these methods, two new methods, getLastError() and getLastErrorMsg() have been added to the C++ QAManagerFactory class, and LastError, LastErrorMessage were added to the C# QAManagerFactory class.
352692 When executing a multi-row UPDATE or DELETE statement, the server could have behaved incorrectly. The server updated or deleted the right rows from the underlying table, but when updating the transaction log and index entries for an affected row, it could have used the data from the previous row modified. This could have caused several symptoms, including:

1. Incorrect row logged into the transaction and the undo logs,

2. Spurious "Index entry not found" errors,

3. Incorrect entries deleted from indexes, and so on.

This problem has now been fixed.

352770 Attempting to re-execute a query using the ADO function Requery(), would have failed with the error "Function Sequence error".

This is illustrated by the following Visual Basic code fragment:

SQLText = "Select * from customer"

myRS.Open(SQLText, myConn, adOpenDynamic, adLockBatchOptimistic, adCmdText)

If myRS.EOF Then

myRS.Close()

Else

myRS.MoveFirst()

End If

myRS.Requery()

This problem has now been fixed.

352793 If the database option Truncate_date_values was set to OFF before populating a row containing a DATE column with a value including both date and time, and the Truncate_date_values option was subsequently set back to its default of ON, updating the row in any way which caused the row to be moved to another page, would have resulted in an assertion failure 105400. This has been fixed.

A workaround is to set the option to OFF, manually update any DATE values to eliminate the time component, then set the option to ON. A statement such as the following could be used:

update t set datecol = date(datecol)

where datepart(hour,datecol)<>0

or datepart(minute,datecol)<>0

Normally this option should be left at its default setting.

352795 If a Unicode (wide character) value was bound with SQLBindParameter, in a database using the UTF8 collation, then the column value may not have been transmitted back to the application properly.

This problem would have occurred under the following conditions:

1. The value must have been bound with SQL_C_WCHAR.

2. The indicator length must have been set to the value's actual length (rather than SQL_NTS).

3. The column must have contained embedded NULL wide characters.

4. The table must reside in a database using the UTF8 collation.

This problem has now been fixed.

352871 created a remote server in ASA8.0 which is referring to a physical

table in Oracle9. When we try to create a proxy table to referring to a physical table

containing large amount of data (approx. 100000 rows) it gives Assertion failed: 102800.

The table on the Oracle db is a partion table

352893 In general, when dbisql is on Windows, if the keyboard focus is a table which is parented to a tabbed pane, pressing TAB should move the focus to the next component, given that a cell value in the table was not being edited. This behavior was broken and has now been fixed.

Note, this problem occurred in all the Java Administration Tools.

352900 If dbisql was connected using the iAnywhere JDBC Driver (which is the default), and the server was shutdown while it was fetching rows from a result set, an endless series of dialogs stating that the connection had been terminated could have resulted. This problem has been fixed, although its occurance would have been rare, as the server would have had to shutdown after a row was fetched, but before the column values were read.
352938 If a query referencing proxy tables, used common table expressions (i.e. the WITH clause), the local server could have crashed or returned incorrect results. The server will now return an error indicating the such statements are no longer supported with remote servers.
352939 If a server listening on multiple IP addresses, that had registered with LDAP, failed to deregister (ie. if it crashed), another server that tried to start up with the same name on the same machine within the next 10 minutes (or the value of search_timeout in asaldap.ini) would have failed with the error "A database server with that name has already started". This has been corrected.
353025 If a statement in a request log contained ASCII the characters 0x1a or 0x1c, the request log could not have been read using sa_get_request_times. This has been fixed.
353026 Calling the system procedure "sa_get_request_times", could have caused a server crash. This has now been fixed.
353047 Toolbar buttons may not have been enabled correctly when multiple items were selected in a details list (right pane). This has been fixed.
353056 The result set of the compatibility procedure dbo.sp_sproc_columns, was not ordered, contrary to ASE's behavior. The results are now ordered by "colid".

A workaround is to edit the procedure definition (e.g. using Sybase Central) and add the following ORDER BY clause:

ORDER BY parm_id

353148 For very expensive queries which returned a large result set, an access plan having materializing operators was more likely to be used when the option Optimization_goal was set to 'First-row'. Now, if a plan that doesn't contain materialization exists, it is more likely to be picked as the best plan when Optimization_goal is 'First-row'.
353151 The QAnywhere Agent would have always started its own database server at startup for its message store, even if a server was already running with a database name specified by the -dbname command line option. The QAnywhere Agent has been fixed to behave as documented. A new command line option, -dbeng, has been added to the QAnywhere Agent, whose default value is the value of -dbname. Now, when the QAnywhere Agent starts, it attempts to connect to the database with name given by the -dbname option, in the server with name given by the -dbeng option. If the connection succeeds, the agent uses this database as its message store, and does not shut down the database server when it shuts down. If the connection fails, the agent launches a database server with the given server name and database name, and uses that database as its message store. In the latter case, the agent shuts down the database server when it shuts down.

Note:

If the QAnywhere Agent is connecting to an already running database server, rather than launching the database server itself, ensure that the database used by the agent as the message store is for the exclusive use of QAnywhere messaging applications. This becuase the QAnywhere Agent will perform operations on the transaction log of this database that assume that no other applications are using the database. It is possible though to have other databases, unrelated to QAnywhere messaging, running in the database server.

353159 Some MobiLink documentation and samples did not show optimal queries for timestamp-based downloads. In the unlikely case of data having the same 'last modified' time as the next 'last download' time and not being selected for synchronization, that data would have been missed in the next synchronization as well, unless the query included matching timestamps. Some of the documentation and samples used WHERE last_modified > ? in the download_cursor or download_delete_cursor scripts. These have now been changed to use WHERE last_modified >= ? instead. Note that there was low probability for a last_modified timestamp to match a last_download timestamp, particularly for ASA consolidated databases where the default timestamp precision is 1 microsecond.
353191 Custom HTTP headers can now be specified for HTTP clients with a new "custom_header" synchronization parameter. The client will include these headers with every HTTP request it sends. The form for this parameter is:

custom_header=<header >

where HTTP headers typically take the form

<header name>: <header value>

To specify multiple custom HTTP headers, use "custom_header" multiple times.

Note, "custom_header" is supported for both the HTTP and HTTPS synchronization streams, but is not supported in Java UltraLite.

353193 Custom HTTP cookies can now be specified for HTTP clients with a new "set_cookie" synchronization parameter. The client will send these cookies with every HTTP request it sends. The form for this parameter is:

set_cookie=<cookie name>=<cookie value> [, <2nd cookie name>=<2nd cookie value>, ... ]

Spaces are permitted between tokens.

The set_cookie parameter can be specified more than once in a synchronization parameters string.

set_cookie is supported for both the HTTP and HTTPS synchronization streams, but is not supported in Java UltraLite.

353195 If a cursor was opened with requested attributes of INSENSITIVE and FOR UPDATE (either using lock, row versions, or values), then a cursor with ASENSITIVE semantics would have been reported. In reality, the cursor used by the engine was implemented using a keyset-driven cursor, which gave INSENSITIVE MEMBERSHIP. The values returned to the application, however, were not necessarily SENSITIVE as prefetch was not disabled (optimistic concurrency prevented lost updates).

Now, prefetch is disabled in this case, and the cursor type is described to the client as INSENSITIVE MEMBERSHIP / SENSITIVE VALUES. In order to more closely match the requested INSENSITIVE semantics, the cursor work table is populated eagerly at open time.

This change allows bookmarks to be supported for the returned cursor.

353208 Referencing columns in a result set by name, rather than by its ordinal postion, may have failed. Since column names are case insensitive, all references to column names are converted to lower case before any comparison. It was this convertion to lower case that was being done incorrectly. This problem has now been fixed.
353294 When the Synchronization Client dbmlsync shut down, it was possible for the database server to have reported that it had terminated abnormally. The client will now gracefully

disconnect from the server on shutdown.

353299 The server could have failed with a "file-system full" error, if more temporary file space was requested than was available on the drive or volume that hosted the temporary file. This has now been fixed. The server will now check the amount of temporary file space that a connection needs, and if it is greater than its allowable quota (see below), it will fail the request. This check is enabled by a new public option 'Temp_space_limit_check', which defaults to 'Off'. When set to 'Off', no limit checking occurs. When set to 'On', if a connection uses more than its quota of temporary file space, then any requests will fail with an SQLSTATE_TEMP_SPACE_LIMIT error.

A connection's temporary file quota is based on two factors: the maximum size of the temp file (i.e., the maximum size it can grow to), and the number of active database connections. The maximum size of the tempfile is calculated as the sum of its current size and the amount of disk space available on the partition containing it. When limit checking is enabled, a connection will be checked for quota violation only after the temp file has grown to 80% or more of its maximum size, AND it requests more temp file space. When this occurs, any connection that uses more than the maximum temp file space divided by the number of active connections will fail.

353334 Calling the system extended procedures xp_scanf, xp_sprintf or xp_startsmtp could, in very rare circumstances, have caused the server to crash. These procedures have now been fixed.
353335 When a "rollback to savepoint" statement was executed, the table operations prior

to the execution of the "savepoint" statement may not have been translated by the Log Translation utility dbtran. This would have occurred if the rollback operations had any trigger actions and the dbtran command line option -t was not used. This problem is now fixed.

353336 If connections were being made concurrently which required a server to be autostarted, in rare timing dependent cases, the server could have crashed. This has now been fixed.
353430 If the transaction log was renamed while one or more connections had open transactions, the log offset of the oldest incomplete transaction could have been recorded incorrectly. This might have prevented the MobiLink client dbmlsync from deleting out-of-date transaction logs. This has been fixed.
353437 The column statistics for string columns with a declared length of up to 7 characters in blank padded databases can be incorrect, resulting in poor query plans. This problem has now been fixed.

For existing databases where incorrect statistics on some columns are suspect, the problem can be rectified by recreating the statistics on the suspect columns. If nothing is done, however, the server will automatically correct the faulty statistics over time.

353442 Calling stored procedures with long varchar or long binary output parameters, would have resulted in the data being corrupted after 32K. The AsaClient was always using a default maximum length of 32K. This problem has been fixed.
353463 If the decrypt() function was passed a zero-length string (not NULL), it would have caused the assertion failure 105001 "Decrypt input is too short". This has been fixed; a decryption error (-851) will now be returned.
353465 When a "rollback to savepoint" statement was executed on a remote database, the table operations prior to the executed of the "savepoint" statement may not have been uploaded. This would have occurred if the rollback operations had:

- table operations that were not involved in synchronization, or

- global temporary table operations, or

- trigger actions that modified synchronization tables, but trigger actions were not requested to be uploaded, or

- trigger actions that modified tables that were not included in any synchronization publications; or

- rows that were deleted after "stop synchronization delete".

This problem is now fixed.

353567 If a connection (or several connections) made multiple requests to a remote server which ran simultaneously, then it was possible that the local server would have crashed. This problem has now been fixed.

Note, that the remote requests must be simultaneous. A connection (or several connections) that make multiple remote requests that are serialized, will not cause a crash.

353595 An invalid JMS destination name supplied by a QAnywhere message, when sent to the JMS connector, would have halted the connector. That is, no more messages could have been sent through the connector. Now, when the connector receives a message containing an invalid JMS destination, an error will be reported, but the JMS connector will continue to process messages.
353667 When the server was running on Windows CE, the encrypt() function may have returned an invalid string, as well, it may have had problems loading strongly-encrypted databases. This could also have ocurred on Unix, and other Windows platforms, though it was extremely

unlikely. This has now been fixed.

Note, as of this change the cryptographic library, (dbaes.dll on Windows, and libdbaes.so or libdbaes.sl on Unix), is no longer used and can be removed.

353678 If either of the -ar or -an command line options was used with Unload utility DBUNLOAD, column statistics from the unloaded database would not have been preserved in the new database. This could have resulted in different query execution plans being chosen when using the new database. This has been fixed.
353681 If an agentid (specified using the command line option -agent_id) contained non-standard characters, and the agent also had some associated transmission rules (specified using -policy <rules-file>), then the QAnywhere Agent would not have started. The non-standard characters would have included any non-alphanumeric characters with the exception of '_', '@', '#', and '$'. Now, only the following characters are not permitted in an agentid:

- Double quotes

- Control characters (any character less than 0x20)

- Double backslashes

Single backslashs can be used in an agentid only if it is used as an escape character.

353712 If connections were being made concurrently which required a server to be autostarted, in rare timing dependent cases, the server could have hung or crashed, or the client could return one of a number of errors including SQLCODEs -832, -816, -308, -100, -85, -82. This has been fixed.

Note it is still possible for the client to get errors when concurrent connects are done which require a server to autostart and different database files are involved, if the EngineName, ServerName or ENG parameter is not specified.

353727 An attempt to upload data via SyncProgressDialog, while the Mobilink server was not running, correctly reported that it encountered a communication error. However, SyncProgressDialog may sometimes report the following message:

Synchronization Error.

Data was uploaded and committed, but an error occurred during download (SQLCode=SQLE_COMMUNICATIONS_ERROR: Communication error).

The SyncProgressDialog was relying on SyncProgressData.SyncResult.UploadOK to determine which message to display, but the SyncResult was only being updated at the end of synchronization. If a successfull synchronization occurred on the same connection, a subsequent synchronization would continue to see the results of the successful synchronization until the synchronization completed (in this case failing), at which time the SyncResult would have been correctly updated to reflect the result of the latter sync.

The SyncResult field of SyncProgressData is now properly updated during SyncProgressed callbacks.

353753 Running the Validation utility dbvalid to validate a read-only database would have caused the error:

A write failed with error code: (5), Access is denied.

Fatal error: Unknown device error

This has been fixed.

353793 When parsing a statements of the type "select rewrite( 'some_string' )" the server may have crashed, if 'some_string' was not a valid SQL statement, for example 'XXXXXXX'. This has now been fixed.
353803 SQL statements in the transaction log containing 128 byte identifiers would have prevented the database from recovering after a dirty shutdown. Identifiers shorter than this would not have caused a problem. This has been fixed. As a side effect of this fix, users can no longer create objects which have a length of zero bytes.
353825 The Database Unload utility dbunload could have failed with the message "SQL Error - Cannot access file ...", if the name of the directory provided contained multibyte characters with \x5c as following bytes. The file name in the error message would have contained extra backslash characters (or the Yen sign character in Japanese). The Unload Wizard in Sybase Central had the same problem. This problem has now been fixed.
353828 When using the Windows Performance Monitor to display MobiLink statistics, the counters were always displayed in English on Japanese, Chinese, French or German Windows. This has now been fixed.
353829 When the Listener utility was installed on Palm devices running Palm OS v5.2, and the MESSAGE or MESSAGE_START keyword was not specified in a message handler, the Listener could have crashed when processing such a message. This problem did not occur when using the older Palm OS v3.5.x. This has now been fixed.
353893 If an event was scheduled to execute only once, and the event completed at the same time as the database was shut down, a server crash could have resulted. This has been fixed.
353902 DBISQL could have reported an out-of-memory exception when executing an OUTPUT statement which attempted to export a large amount of data to an Excel, dBASE II, dBASE III, Foxpro, or Lotus 1-2-3 file. This has been fixed.

In addition, the following performance-related changes were also made:

- A warning message was added to the OUTPUT statement to warn about the inherent limitation of Excel 2.1 and Lotus files, that they cannot contain more than 65534 rows of data. Attempting to write more than this many rows, would have resulted in only the first 65534 rows being written to the file.

- When writing Lotus 1-2-3 files, progress messages are now displayed. Previously, the Lotus exporter worked silently.

- The algorithm which truncates long data when exporting to dBASE2 and Lotus files has been sped up. In one test case, the time taken to output 125 strings 2000 characters long went from about 8.5 seconds to 0.2 seconds

353913 The second and subsequent connections over SPX would not have used PORT connection parameters. PORT options were only read when the port was created, and ignored at all other times, which caused problems with subsequent connections that want to use different options.

For example:

connect using 'con=a;eng=g1;links=spx(dobroadcast=NO;host=host1)'

connect using 'con=b;eng=g2;links=spx(dobroadcast=NO;host=host2)'

If done from the same application, the second connect would not have worked, as the PORT options would have been ignored, so host2 would not have been looked at.

This has now been fixed.

353931 The SMS listener for the Sierra Wireless AirCard 555 network card, (maac555.dll), may have delayed processing of a pre-existing message until a new message arrived. This has now been fixed.
354031 The Schema Painter could have crashed when closed, or when closing an open schema file. This would likely have happened only when the open schema file is very large ( greater than 75K in size). This problem has been corrected.
354096 The server would go into an infinite loop, with nearly 100 percent cpu usage, when executing a query like the following:

select (select systable.first_page from systable where systable.table_id = 1) as id0,

id0 as id1

from syscolumn

group by id1

The problem occurred under the following conditions:

- the query had a subselect in the select list or in the WHERE clause

- the subquery had an alias name ("id0" in the above query) and the alias name was aliased by a second alias name ("id0 as id1" see above), so that both alias names were syntaxtically identical

- the second alias name was part of a GROUP BY element

This problem has been fixed

354101 The documentation for the LDAP search_timeout parameter says that "A value of 0 disables this option so that all entries are assumed to be current". This was not the actual behaviour, specifying a timeout of 0 would have forced all LDAP entries to be ignored. This has been fixed, the behaviour now matches the documentation.
354107 A new collation 1255HEB has been added which provides support for the Windows Hebrew character set cp1255. Ordering is based on byte-by-byte ordering of the Hebrew characters.

On Hebrew Windows systems, the database server will choose 1255HEB as the collation for a new database, if no collation is specified. 1255HEB will now appear in the output from "dbinit -l", and in the list of collations in Sybase Central.

354116 If two transactions perform concurrent operations that involve scanning the table sequentially, and the table contains more than 100 pages of data, there was a chance of database corruption. One of the operations must have been an insert or update, while the other must have performed a sequential scan of the table. Indexed access in conjunction with inserts/updates would not have triggered the problem. This was more likely to occur on multiprocessor and Unix systems [while still possible, it was unlikely to occur on single processor Windows systems].
354117 If the time on the machine running an LDAP server was ahead of the time on a machine running an ASA server or client application, LDAP entries would have been considered stale. Using search_timeout=0 is a workaround. This has been fixed, timestamps in the future are now considered current.
354128 Incorrect results (ie extra rows) could have been produced with non-trivial aggregate expressions, such as "sum(x)-sum(y)". This has been corrected
354138 If an server running on a multi-homed machine, (ie more than one IP address), registered itself through LDAP, ASA clients may not have been able to connect to it, depending on network topology. The clients would only have attempted to use the first IP address listed in LDAP. This has now been fixed, all IP addresses listed will be tried until a successful connection is made.
354147 When the log scanning tools were looking for the log file with the desired starting log offset, if that log file had a transaction in it which began in an earlier log file, but the log file that contained the start of the transaction could not be found, an error would have been reported similar to "Missing transaction log(s) in between file AC.log (ending at offset X) and file AD.log (starting at offset Y)". The offsets reported would have been incorrect, and upon inspection, the ending log offset of AC.log would have likely been the same as the starting log offset of AD.log. The correct error is now reported, "Missing transaction log(s) before file AA.log".
354150 The optimizer may have chosen a less than optimal plan for simple queries, if more than one index candidate existed, and at least one was an unique index. This has been fixed.

For example, for the query:

select * from T

where T.A = c1

and T.B = c2

if there existed an unique index i1 on columns T.A, T.X1, T.X2 and T.X3 and an index i2 on columns T.A and T.B, the query would have used index i1 instead of i2.

354151 A new Arabic collation 1256ARA has been added, which supports the Arabic Windows character set cp1256. The collation will now appear in the list generated by the "dbinit -l" listing, and the Sybase Central Create Database wizard. On an Arabic machine, creating a database without specifying the collation, the default will now be 1256ARA instead of 1252LATIN1.

The collation is a byte-by-byte ordering which should give reasonable ordering for Arabic. It does not produce an ordering that follows all of the standard rules for ordering Arabic, as this is outside the capabilities of existing ASA collation support.

354153 The column statistics in blank padded databases, for string columns with a declared length of up to 7 characters, could have been displayed with unnecessary blank characters. This problem has now been fixed.

For existing databases, where incorrect statistics on some columns are suspected, the problem can be rectified by recreating the statistics on the suspect columns. If nothing is done however, the server will automatically correct the faulty statistics over time.

To avoid potential problems with column statistics, they will be dropped by the server on a column whose declared length is modified via an ALTER TABLE.

354155 The background color of disabled text components (excluding the syntax highlighting editor) was wrong on Windows. For example, the default Windows XP color scheme has a gray background, but Sybase Central had a white background. This has been fixed.

Note, this problem affected all of the graphical administration tools shipped with ASA 9.0.1, including Sybase Central, DBConsole, DBISQL, and the MobiLink Monitor.

354157 When starting a database "read-only" using the "-r" command line option, the server could have failed with assertion 201851, if the database had been created by ASA 8.0.0 or newer. This has now been fixed.
354194 When using the Create Function wizard to create a function in the Transact-SQL dialect, the comment describing the format of the parameter list would have been incorrect. The comment included the "OUTPUT" keyword which is not applicable for functions. This has now been fixed.
354221 The following changes have been made to the OLEDB provider's Rowset property set DBPROPSET_ROWSET.

The following Rowset properties were returning TRUE, indicating that the associated interface was supported. They now return FALSE, to indicate that the corresponding interfaces are not supported.

DBPROP_IChapteredRowset

DBPROP_IParentRowset

DBPROP_IRowsetFind

DBPROP_IRowsetIndex

DBPROP_IRowsetRefresh

DBPROP_IRowsetResynch

The Rowset property DBPROP_IRowsetIdentity, was returning TRUE, although the IRowsetIdentity interface was not supported. The IRowsetIdentity interface is now implemented. The property continues to return TRUE.

The following properties have been removed from the Rowset properties, as they are not Rowset properties, they are View properties.

DBPROP_IViewChapter

DBPROP_IViewFilter

DBPROP_IViewRowset

354282 When creating a column, or changing its type, the list of available system-defined default values for types of binary, varbinary or long binary, included the date, time and timestamp values. However, if one of these values was choosen as the default, attempting to save the changes to the column would have resulted in a "Cannot convert <type> to a binary". This has been fixed, the date, time and timestamp types are now excluded from the list of system-defined default values when choosing a binary data type.
354297 The QAnywhere Agent was not sending network status notification or push notification messages to the "system" queue. This problem was introduced after the 9.0.1 GA release, in build 1855, and is now fixed.
354300 HTTP requests with Message Headers containing empty field-values were rejected with HTTP status code 400 "Bad Request". Since RFC 2616 section 4.2 states that a Message Header field-value is optional, such requests are now allowed.
354317 The following changes have been made to correct problems in metadata reporting:

The Schema Rowset returned for DBSCHEMA_TABLE_CONSTRAINTS has been corrected.

The Schema rowset for DBSCHEMA_PROVIDER_TYPES now includes the types DBTYPE_R4 (FLOAT), DBTYPE_R8 (DOUBLE), and DBTYPE_GUID (UNIQUEIDENTIFIER).

The type TINYINT is now described as signed, previously it was described as unsigned.

The MAXIMUM_SCALE for DECIMAL and NUMERIC was NULL instead of 127. The MAXIMUM_SCALE for the SMALLINIT, TINYINT and INTEGER types is now NULL, not 0.

Schema Rowsets that returned column type information did not include support for the DBTYPE_GUID (UNIQUEIDENTIFIER) type, now they do.

In order to implement these changes, the stored procedures in scripts\oleschem.sql must replace the stored procedures in the database.

354337 An internal error (IllegalArgumentException) could have been reported by dbisql, when an attempt was made to edit the result set of a stored procedure. The result set should not have been editable in the first place. This has now been corrected.

This problem would only have occurred when connecting using the iAnywhere JDBC Driver.

354381 When running on Windows 2003, the server could have crashed on startup, if the machine had no TCP/IP address, or was unplugged from the network. This has been fixed.
354579 The total connection count, listed on a database's property sheet, would not have been updated each time the property sheet was opened. This has now been fixed.
354599 A transaction attempting to checkpoint could have deadlocked with other transactions. The most likely scenario was deadlocking with a transaction attempting a rollback. This was more likely to appear on multi-processor and Unix platforms. This problem has been fixed.
354617 If dbisql reported an internal error, the password used in the current connection (if any) was shown in clear text in the error details. It has now been replaced by three asterisks. Note that passwords given as part of a "-c" command line option are still displayed in clear text in the error details.
354689 The following changes have been made to correct problems in metadata reporting:

The IDBSchemaRowset::GetSchemas method now correctly returns bit masks rather than argument counts to indicate which restriction parameters are supported. When using linked tables with Microsoft SQL Server 2000 Distributed Queries, this problem manifested itself with the message "OLE DB provider 'ASAProv.xxx' returned an invalid schema definition".

The DBSCHEMA_TABLES_INFO Schema Rowset used by Microsoft SQL Server 2000 Distributed Queries is now supported.

To install the revised schema support, the stored procedures in scripts\oleschem.sql must replace the stored procedures in the database.

354766 Normally the BACKUP and RESTORE statements append a line to the backup.syb file each time they are executed. This is done to record the backup or restore operation that was performed. To prevent the backup.syb file from being updated, the HISTORY OFF clause can now be added to the statement.

For example:

BACKUP DATABASE DIRECTORY 'd:\backup' HISTORY OFF

354771 The UltraLite runtime would have ignored all invalid synchronization parameters. If a parameter was misspelt, it would have been ignored and the default value would have been used. Now, if the runtime encounters a parameter it doesn't recognize, synchronization fails and the SQL code SQLE_UNRECOGNIZED_OPTION is set. If an error callback has been provided, it will be called once for each invalid parameter. Duplicates continue to be ignored for now.

This change does not affect Java UltraLite.

354773 If an external procedure attempted to return a string longer than 65535 bytes, via a single call to the set_value callback function, the string would have been truncated. This has been fixed. A workaround is to call set_value multiple times to build up the result in pieces, each being shorter than 65535.
354778 The following changes have been made to correct problems in metadata reporting:

The IDBSchemaRowset::GetSchemas method now correctly returns bit masks rather than argument counts to indicate which restriction parameters are supported. When using linked tables with Microsoft SQL Server 2000 Distributed Queries, this problem manifested itself with the message "OLE DB provider 'ASAProv.xxx' returned an invalid schema definition".

The DBSCHEMA_TABLES_INFO Schema Rowset used by Microsoft SQL Server 2000 Distributed Queries is now supported.

The stored procedures that implement the schema rowsets have been updated so that "uniqueidentifier" is used rather than "UNIQUEIDENTIFIER" .

The phrase "not transactional" in the sa_oledb_tableconstraints stored procedure has been changed to "on commit preserve rows".

To install the revised schema support, the stored procedures in scripts\oleschem.sql must replace the stored procedures in the database.

354822 If the Histogram utility dbhist was not provided with connection arguments (ie -c options), it would have assumed a default connection string of UID=DBA;PWD=SQL. Now, dbhist will no longer assume any default connection arguments, which is consistent with the behaviour of other ASA utilities.
354838 If an error occurred on an embedded SQL EXECUTE statement, and there were bound columns with all NULL data pointers, a communication error could have occurred and the connection would have been dropped.

An example of bound columns will all NULL data pointers from ESQL is:

SQLDA *sqlda = alloc_sqlda( 1 );

sqlda->sqld = 1;

sqlda->sqlvar[0].sqltype = DT_INT;

sqlda->sqlvar[0].sqldata = NULL;

EXEC SQL EXECUTE stmt into descriptor into_sqlda;

This has been fixed so that an error is returned and the connection is not dropped.

354843 QAnywhere client applications are now supported on the Pocket PC 2002 and Pocket PC 2003 x86 emulators. Only the "scheduled" policy for the QAnywhere Agent is supported though.
354948 When the database option Optimization_goal was set to 'First-row', the optimizer did not always respect it for queries with equijoins. This has been fixed.
355012 Calling any of the external mail routines (such as xp_sendmail or xp_startmail) could have caused the server to crash. A problem with passing NULL parameters has been fixed.
355020 On the Macintosh, some COMMAND key combinations did not work in the syntax highlighting editor, although the same CONTROL key combinations do work. On the Macintosh, COMMAND should be used instead of CONTROL. For example, on Windows, CONTROL+G to go to a line. On Macintosh, COMMAND+G to go to a line. This has been fixed.
355098 An ALTER TABLE statement that added, modified or deleted a table's CHECK constraint, a column's CHECK constraint or renamed a column, had no effect on INSERT, UPDATE or DELETE statements inside stored procedures and triggers, if the procedure or trigger was executed at least once prior to the ALTER TABLE statement. This problem has been fixed.
355123 The server could have performed poorly relative to 7.x servers when doing a long sequence of database inserts, updates or deletes. The server was spending longer than necessary cleaning up the cache in preparation for a checkpoint. This time has now been reduced. Also, current servers now estimate the recovery time better. Thus the Recovery_time database option may need to be set to a larger value in order to have the server more closely match the value the 7.x server would have used.
355126 When running on Unix platforms, the server could have stopped transferring data over a TCP/IP connection that was using ecc_tls encryption. This would most likely to have happened while transferring large amounts of data, such as blobs, to slow clients. The server would eventually have disconnected the client if the default idle time-out was used. This has been fixed.
355145 A .NET application, using multiple database connections through separate threads, could have hung when updating the same table in different threads. When this situation occurred, one thread would have been blocked in the server (which is expected, as it is blocked against the other connection which is holding a lock on the table as a result of its update), and the other thread would appear to be hang as well, but it would not have been blocked in the server. What was happening was that the first thread had entered a critical section and was waiting for the server's response, while the second thread was waiting to enter the same critical section, thus caused the application hang. This has been fixed.
355245 Attempting to unload a database created prior to SQL Anywhere version 5 would have resulted in an error that user "dbo" did not exist. If the dbo user was created, a different error would have been given, since the view dbo.sysusers would not have existed. This has been fixed. A workaround is to run the Upgrade utility dbupgrad before unloading the database.
355262 Clicking the "SQL/Start Logging" menu item, and selecting an existing file, would have caused a dialog to be opened which asked if it was OK to overwrite the file. The dialog was misleading as dbisql always appends to the log file, it never overwrites it. This prompt has now been removed.
355292 Updating the version of jConnect to a newer version than the one shipped with ASA (ie newer than 5.5), would have likely have resulted in postioned updates failing with an exception. Versions of jConnect newer than 5.5 support the new status byte that was added to allow distinguishing between a NULL string and an empty string. When performing positioned updates, jConnect sends the KEY column values so that the row being updated can be uniquely identified. This status byte was not supported for KEY columns, but the server was still expecting it, resulting in a protocol error. This has been fixed.
355299 When the server ran databases created with ASA versions 4.x and earlier (or databases upgraded from ASA versions 4.x and earlier), queries that made use of index scans over fully hashed indexes could have returned incorrect results. An optimization for index scans in older databases was incorrect. This optimization has now been removed, so a drop in performance when using older databases will likely be noticed. An unload/reload is recommended if the resulting performance is not acceptable.
355459 When sending or receiving multi-piece strings on a heavily loaded system, the server could have deadlocked, causing a hang. This has been fixed. A work around would be to increase the number of tasks available to service requests (-gn). Alternatively, a dba user could use a pre-existing connection with the DEDICATED_TASK option set, to manually break the deadlock by cancelling one or more executing requests.
355474 When a query with multiple result sets was opened with ExecuteReader(CommandBehavior.SingleRow), calling NextResult would always have returned false. Only the a single row from the first result set could have been fetched. This problem has been fixed so that a single row is now fetched from each result set, which matches the .Net specifications.
355516 When being asked for the name of a new file in the utility wizards (for example, the Create Database wizard), clicking the "Browse..." button and choosing an existing file in the file dialog, would have caused a prompt asking to replace the file. This was erroneous, since once returning to the wizard and clicking Next, a "You must specify a new file" error message would have been displayed. This has been fixed. Now, the file dialog no longer asks to replace the file when a new file is required.
355527 If a server goes down dirty (eg. due to a power failure), there can be a partial operation at the end of the log. If such a log was applied to a database by using the -a (apply named transaction log file) server command line option, restarting the server using that database and log file (without -a) could have caused the server to fail to start with the message "not expecting any operations in transaction log". The problem would only have occurred if the incomplete operation was the first operation of a new transaction and there were no other transactions active after all complete operations had been applied. The problem has been fixed by removing the partial operation from the log after the log is applied (or recovery is completed).
355557 In some circumstances, idle HTTP client connections did not get disconnected from the server after the HTTP Time-out period had expired. This has been fixed.
355574 The SQL Remote Message Agents dbremote and ssremote, the SQL Remote Open Server ssqueue, the Log Transfer Manager dbltm, and MobiLink Client dbmlsync, could have hung when attempting to write a message to the output log that was greater than 64Kb in size. This has now been fixed.
355587 On dual cpu machines, after creating an new prepared AsaCommand and inserting new rows in a loop, a communication error would have occurred after some iterations.

For example, (VB.NET code):

Imports iAnywhere.Data.AsaClient

Module Module1

Sub Main()

Dim conn As AsaConnection

Dim cmd As AsaCommand

Dim i As Int32

Try

conn = New AsaConnection("uid=dba;pwd=sql;eng=asatest")

conn.Open()

for i = 1 to 2000

cmd = New AsaCommand("insert into ian values( 1 )", conn)

cmd.Prepared()

cmd.ExecuteNonQuery()

Next

Console.WriteLine("Inserted {0} rows", i)

conn.Close()

Catch e As Exception

Console.WriteLine(e.ToString())

End Try

End Sub

End Module

This problem has been fixed.

355595 Calling the ODBC function SQLGetData() with a length of 0 would have failed for SQL_WCHAR.

SQLRETURN SQLGetData(

SQLHSTMT StatementHandle,

SQLUSMALLINT ColumnNumber,

SQLSMALLINT TargetType,

SQLPOINTER TargetValuePtr,

SQLINTEGER BufferLength,

SQLINTEGER * IndPtr);

SQLGetData can be used to obtain the amount of data available by passing 0 for the BufferLength argument. The amount of data available is returned in the location pointed to by IndPtr. If the amount available cannot be determined, SQL_NO_TOTAL is returned. When the TargetType was SQL_C_WCHAR, the amount of available data was incorrect (a character count rather than byte count was returned). This has been fixed.

There were also some problems returning correct indicator values for databases using the UTF8 collation. This has also been fixed.

355776 ASA Programming Guide 9.x requires adjustment to remove java features which are no longer supported since version 9.0 (but supported in 8.x).

Examples:

1)

ASA Programming Guide

Introduction to Java in the Database

The runtime environment for Java in the database

Scope and persistence

------------------------------------------------------------------

SELECT java.lang.Math.abs(-342)

------------------------------------------------------------------

2)

ASA Programming Guide

Introduction to Java in the Database

The runtime environment for Java in the database

Java is case sensitive

------------------------------------------------------------------

SeLeCt java.lang.Math.random();

------------------------------------------------------------------

3)

ASA Programming Guide

Using Java in the Database

Special features of Java classes in the database

Returning result sets from Java methods

------------------------------------------------------------------

stmt.executeQuery (

"SELECT CAST( JName.lastName " +

"AS CHAR( 50 ) )" +

"FROM jdba.contact " );

355787 An internal error could have been reported in response to pressing the DELETE key when an uneditable result set was displayed in the "Results" panel and the results table had the focus. This has been fixed.
355830 A NullPointerException could have occurred in the following situation:

- Open a second window, like when editing a stored procedure

- Make a change to the procedure, close the window, when it prompts to save changes, respond NO

- The window closes, but the Sybase Central window does not have focus

- pressing TAB or CTRL-TAB will caused the exception

This has now ben corrected

355831 Executing an ALTER TABLE statement which attempted to modify a column and then drop the column in the same statement would have caused the server to crash. Attempting to modify and drop a column in the same ALTER TABLE statement will now generate the error "ALTER clause conflict". These changes must be made with separate ALTER TABLE statements.
355929 The ASA provider could have loaded the wrong unmanaged dll, (dbdata8.dll or dbdata9.dll), if multiple version of ASA were installed. Now, the ASA provider will search for the unmanaged dll and will continue searching until it finds and loads the right one. If a matching version can not be found, the latest version will be loaded with a warning message.
355965 When run on SMP systems using processors from Intel's P6 family, (as well as Pentium 4 and XEON), the server could have hung when receiving multi-piece strings via shared memory connections. This problem also affected ODBC, OLEDB and Embedded SQL clients as well. It has been fixed.
355982 If an article's property sheet was opened to modify its set of columns, and the Apply button was then clicked, any further changes made to the set of columns in the article would have been ignored until the property sheet was closed and re-opened. This has now been fixed.
356000 The schema painter could have crashed when editing a table's properties and renaming a column.

The following demonstrates the problem:

- Right click an existing table and choose Properties

- Select a column (that isn抰 in an index) and click the Edit button

- Rename the column

- Click OK on the Column property sheet.

- Click OK on the Table dialog and the crash may occur

This has been fixed.

356159 For queries that specified "SELECT *", metadata support for determining a name, given a column number was missing. Consequently, expresions such as:

result_set_schema->GetColumnId( "c4" )

would have resulted in zero being returned. This has been corrected.

356216 The creation or execution of a stored procedure may have caused a server crash if the parameter list contained the special values SQLCODE or SQLSTATE, and in the procedure body a Transact-SQL variable was declared (ie variables that start with @). This has nowbeen fixed.
356223 If the same outer reference in a subquery appeared in both the GROUP BY list and the SELECT list then error -150 (Invalid use of an aggregate function) would have been reported.

For example:

select 1 from employee e1

where 1 = (select e1.emp_id from employee e2 group by e1.emp_id)

This has been fixed.

356262 The string representation of a double value may be generated with too many digits when the server was run on Linux x86 systems.

For example:

select cast( cast( 9.9 as double ) as char(30) )

would have returned '9.90000000000000036' instead of '9.9'. This has been corrected.

356390 The "do not ask again" checkbox, that is shown when deleting a table record, could have been selected and then the "No" button clicked. This would have resulted in the dialog never being shown again. In 8.x versions, "Yes" would always have been assumed, and in 9.x versions, "No" would always have been assumed. This has been changed so that the buttons now say "Ok" and "Cancel", and the checkbox is ignored when "Cancel" is pressed.
356439 The output fields of the ul_synch_info object would not have been updated in the observer callback function when using the UltraLite engine. This has been fixed.

The following are the fields of ul_synch_info that could change during synchronization:

ul_stream_error stream_error;

ul_bool upload_ok;

ul_bool ignored_rows;

ul_auth_status auth_status;

ul_s_long auth_value;

ul_bool partial_download_retained;

356446 The evaluation of the LIKE predicate could have returned incorrect results in some circumstances. For example, the following would have evaluated to FALSE, when it should be TRUE: " '5554' LIKE '%554%' ". This problem has been resolved.
356484 Attempting to create a table in the UltraLite Schema Painter with a name greater than 128 characters would have failed with an error message stating that a table with that name already existed, (although it did display the correct SQLCode). The code was assuming that an error assigning a new table a name could only result from an existing table with the same name, which is not the case. The text of the error message has been improved.
356521 An erroneous error was detected for INSERT-SELECT statements in which the associated SELECT expressions contained an alias name that matched the column name in the insertion list.

For example:

INSERT INTO Tab( col_a, col_b) SELECT x AS col_a, y FROM AnotherTab

would have exhibited this behavior. This has been corrected.

356595 If a RAISERROR or PRINT statement containted a subselect in the format string or in a PRINT expresstion, the server may have crashed or returned an error. This has been fixed.
356604 Compound statements containing Transact-SQL 'SELECT INTO #temptable' syntax would have incorrectly reported error -141 "Table 'temptable' not found", if workload capturing was enabled in the Index Consultant. This has been fixed.
356646 The OLE DB driver did not work well on 64-bit Windows systems. A number of memory alignment issues and problems with bookmarks (which were incorrectly assumed to be 32-bit values) were resolved.
356648 When editing an existing table in the Table Editor, attempting to delete all columns that existed in the table, and adding one or more new columns to the table, would have resulted in the error "More columns are being dropped from table ... than defined" when saving the changes to the database. Now, the Table Editor prohibits deleting all existing columns from a table, as a table must contain at least one column.
356739 If a trigger on table T referred to a column of T that had been dropped or renamed, then the server could have crashed when processing a query referring to T after the server was restarted. For the crash to have occurred, the referencing query must have been sufficiently complicated to allow predicates to be inferred. The cause of the crash has been fixed, and other changes have already made it impossible to rename or drop columns referenced by triggers.
356753 When run on Windows platforms, the ASA Administration tools, (including dbisql and Sybase Central), ignored some keyboard mnemonics when the Windows StickyKeys feature was turned on. This has been fixed so that they mow it work correctly.
356762 A non-fatal assertion failure: 105200 "Unexpected error locking row during fetch" could have been reported when executing an outer join with a temporary table on the null-supplying side of an outer join. This would have appeared to an application as error -300 "Run time SQL error" or -853 "Cursor not in a valid state". This has now been fixed.
356790 An error would have been reported if an UNLOAD TABLE statement was executed that included an APPEND clause. This has been fixed.
356795 On Windows 95, 98 or ME, if a network server had both TCP/IP and SPX connections, the server could have hung with 100% CPU usage. This has been fixed.

Note if using a network server, Windows NT, 2000, XP or 2003 are recommended over Windows 95, 98 or ME, to ensure better performance and reliability.

356798 Messages sent from the server to the client application would have been corrupted if the database character set was different from the client's connection character set. This problem would most likely have occurred on multi-byte character set systems with utf8 databases. This has been fixed.
356853 When creating tables with BIT columns, they had the attribute NULL by default. This has been corrected, by default BIT columns are now set to NOT NULL.
356857 Calling Connection.GetNewUUID() would have generated an empty UUID of type Guid,(ie "00000000-0000-0000-0000-000000000000"). This has been fixed.
356858 Attempting to use the ntile() function would have caused the server to report the non-fatal assertion 106500, "Error building aggregate", rather than report the expected error, "olap extensions not supported". This problem has been fixed.
357187 When using the Create Database wizard to create a database for Windows CE and then copying the database to a Windows CE device, there was no indication given that the log and mirror log file names should refer to directories on the Windows CE device. In fact, if the database was being created on the local computer, then the wizard would

attempt to validate the log and mirror log file names for the local computer, asking whether any required directories should be created. This was clearly wrong, since the database was destined for the Windows CE device, not the desktop computer.

This has been fixed. Now, when copying the database to the Windows CE device, the wizard indicates that the log and mirror log file names should be relative to the Windows CE machine. In addition, the wizard no longer attempts to validate these file names for the desktop machine. As a side-effect of this change, it is no longer possible to connect to

the database on the desktop computer if it is being copied to the Windows CE device, since the log and mirror log file names may be invalid.

357228 When using a database with the UTF8 collation, statements containing non-English characters could fail with the error "Syntax error or access violation", and Unicode bound data stored in the database could be corrupted. This problem would affect any application using ODBC or OLEDB, including Java-based applications using the JDBC-ODBC bridge (8.0) or iAnywhere JDBC Driver (9.0), including DBISQL and Sybase Central.

dbmlsync was also affected.

The bug was introduced in the following versions and builds:

8.0.2 build 4409

9.0.0 build 1302

9.0.1 build 1852

This problem has been fixed.

357306 The server could have chosen an inefficient execution plan for a query, even after freshly creating statistics for all tables involved in the query. The poor plan was usually caused by poor join selectivity estimation. Now, the server will have more information available after a CREATE STSTISTICS is executed, which should improve the quality of plans chosen.
357339 In the MobiLink client dbmlsync, ActiveSync is only supported as a communications type on Windows CE and Pocket PC systems. If ActiveSync was specified as the communications type on a non-CE platform, an error message would have been generated indicating that the DLL dbmlas9.dll could not be loaded. Dbmlsync will now print an error stating that ActiveSync is only supported on Windows CE and Pocket PC.
357494 If a large message was sent, the directory containing the QAnywhere store-and-forward database may have temporarily contained many files with the suffix .log. After the messages were synchronized to the QAnywhere server, these temporary files would have been deleted. The amount of disk space consumed by these temporary files was equal to the size of the message. The problem has now been fixed, these temporary files will no longer be created.
357497 If the QAnywhere client agent was being run with an "automatic" synchronization policy, any errors that occurred during message synchronization (a communication break, for example) would have caused the messages to not be synchronized until a subsequent push notification was received from the server, or a new message was sent by a client application. The problem is now fixed.
357506 Using statement-based scripting, uploaded updates can be ignored by not providing the upload_update script. When an actual update row was encountered on the upload, an error would have been generated indicating the missing script, and the synchronization would have been aborted. This has now been corrected. A workaround would be to provide any of the conflict resolution scripts (resolve_conflict, upload_insert_new_row, or upload_insert_old_row).
357550 An UPDATE or DELETE statement attempting to modify a local table, when joined with a remote table, or a remote table joined with a local table, should fail with an error indicating that the query could not be executed. However, a recent change removed this error and the server would have either hang or crashed. The problem has been resolved and the original error is now given.

Also, attempting to use the PUT statement on a remote table would have caused a server crash. An error is now given.

357556 Trying to save a MobiLink Monitor file on a Macintosh, without entering the extension, would have caused an invalid file format error. This has been fixed.
357653 The HTTP web services component of the server could have crashed if it received a SOAP request with an argument that had a length greater than the database's pagesize. This has been fixed.
357683 When an application closed a cursor, the server was not freeing the cursor's resources before dropping the associated prepared statement or when the connection ended. This caused problems for applications that open many cursors on the same prepared statement. These applications would get errors when attempting to open a cursor, such as "Resource governor for 'cursors' exceeded", if the option MAX_CURSOR_COUNT was not set, or "Cursor not open". Now the cursor's resources are freed when a cursor is closed.
357689 A row limit (ie 'FIRST' or 'TOP nnn') could have been ignored on DELETE and UPDATE statements. This was most likely to occur on smaller tables and for very simple statements.

Example:

create table temp1 (nID int not null);

insert into temp1 (nID, nid2) values (1);

insert into temp1 (nID, nid2) values (1);

commit;

delete first from temp1; //deletes both rows

This problem has been corrected. A workaround is to attach a redundant ORDER BY clause to the statement.

delete first from temp1 order by 1+1; //deletes just one row

357694 When run on NetWare systems, the server could have caused a 'CPU Hog' abend executing a complex query. This has been fixed by adding additional yields in the optimizer.
357700 When using a database with the UTF8 collation, statements containing non-English characters could fail with the error "Syntax error or access violation", and Unicode bound data stored in the database could be corrupted.

This problem would affect any application using ODBC or OLEDB, including Java-based applications using the JDBC-ODBC bridge (8.0) or iAnywhere JDBC Driver (9.0), including DBISQL and Sybase Central.

dbmlsync was also affected.

The bug was introduced in the following versions and builds:

8.0.2 build 4409

9.0.0 build 1302

9.0.1 build 1852

This problem has been fixed.

357701 Synchronizing to an ASA remote database using the UTF8 collation could fail with errors or put corrupted data into the database.

The same problem would affect any application using ODBC or OLEDB, including Java-based applications using the JDBC-ODBC bridge (8.0) or iAnywhere JDBC Driver (9.0), including DBISQL and Sybase Central.

The bug was introduced in the following versions and builds:

8.0.2 build 4409

9.0.0 build 1302

9.0.1 build 1852

This problem has been fixed.

357703 When attempting to connect to a database by specifying an ODBC data source that used an 8.x or earlier driver (for example, "ASA 8.0 Sample" that is installed with 8.x), and choosing to use the iAnywhere JDBC driver, the connection would have failed with the error "The information required to display the database in Sybase Central could not be obtained". Using a pre-9.x data source with the iAnywhere JDBC driver to connect to a database in Sybase Central is now supported.
357824 Some files required for MobiLink Java Authentication were not being installed on AIX and HP systems. In particular, mlsupport.jar, pop3.jar, and imap.jar were not being installed. This has been corrected.
357842 If the server received an HTTPS request where the URI (including parameters) or post data was longer than 1024 bytes, it may have responded with error code 408: "Request Time-out". This has been fixed
357845 A problem using the iAnywhere Solutions ODBC driver for Oracle on Unix systems has been corrected. Downloading Unicode CLOB data could have caused the following error:

"INTERNAL ERROR:occurred while storing a BLOB",

"Data truncated, column 12. (ODBC State = 01004,Native error code = 0, Column or parameter #12)

357853 Calling the graphical_plan() function on query where a host variable appeared in the document argument to the openxml() function that was inside another graphical_plan() call, would have caused the server to crash.

For example:

select graphical_plan( 'select * from openxml( graphical_plan(?), ''/'') with (type xml ''.'' ) ')

This is now fixed.

357965 Under certain conditions, SELECT DISTINCT queries with complex ORDER BY expressions may have received an erroneous syntax error.

For example, the following query would have failed with SQLCODE -149:

Select distinct e.emp_lname + space(50) + '/' + e.emp_fname

from employee e, employee e2

where e.emp_id = e2.emp_id and e2.dept_id = 100 and (e.city = 'Needham' or e2.city = 'Burlington' )

order by e.emp_lname + space(50) + '/' + e.emp_fname

This problem has been corrected.

357967 Optimizer statistics were also being flushed when procedures were unloaded. This has now been corrected.
357981 The presence of duplicate indexes increased the optimizer's search space when looking for an appropriate index to use, thus possibly preventing it finding an optimal access plan for some statements. Duplicate indexes are no longer considered during optimization, unless named in an index hint.

An index idx1 is considered a duplicate of the index idx2 if and only if the following conditions hold:

- idx1 and idx2 are defined on the same columns, having the same order, and having the property ASC/DESC exactly the same for each column.

- idx2 is a primary key index, but idx1 is not

OR idx2 is declared unique index and idx1 is not

OR idx2 is a foreign key index and idx1 is not

OR idx2 is declared a clustered index and idx1 is not

OR none of the above, in which case the engine randomly chooses idx1 to be the duplicate of idx2.

For example, if idx1 is declared as:

create index idx1 on T (T.A ASC, T.B DESC )

and idx2 is declared as :

create unique index idx2 on T (T.A ASC, T.B DESC)

then idx1 is considered a duplicate of idx2.

For base tables, an analysis of the index list is performed to flag the duplicate indexes when indexes are loaded, or an index is added or dropped.

Note 1:

The property of being a duplicate is used only by the optimizer when a statement is optimized.

Note 2:

It is strongly recommended to drop useless duplicate indexes whenever possible.

Note 3:

The properties of uniqueness and clusterness are derived from one index to another. In the example above, the engine derives that the index idx1 is also unique because idx2 is unique.

357982 A problem affecting any of the ASA executables running on CE devices only, that could have caused memory to be corrupted, has been fixed. The only behavior actually seen as a result of this problem was the inability of CE based executables to create UI elements, such as windows or messageboxes, however it may have caused other problems as well.
357983 A correlated subquery used in a predicate of the form "expr = (correlated subquery)" which, in addition, satisfied the conditions to be executed as a decorrelated subquery, may have caused a crash of the server during optimization. This has been fixed.

For example:

select *

from R

where R.X = (select max(T.X)

from T

where T.Y = R.Y)

The above query may be executed by computing the decorrelated subquery, equivalent to the following:

select R.*

from R, (select max(T.X), T.Y

from T

group by T.Y) as DT( max, Y)

where R.X = DT.max and R.Y = DT.Y

Note 1:

The decision to decorrelated subquery is done cost-based during optimization.

Note 2:

The crash would have occurred, if and only if a Sort Merge Join method was considered for joining the decorrelated subquery with the rest of the query block's tables. The Sort Merge Join strategy must have been chosen in the best plan for the crash to happen.

358006 An estimated cost for using a work table is now added to the total estimated cost of the plan that needs a work table at the root. When both materializing plans and non-materializing plans are costed for a query, the extra cost added when a work table is needed gives a more accurate cost estimate for the whole query. This will improve the optimizer's choice of the most appropriate plan for a query.
358040 In rare low-memory situations, the server could have crashed or quietly ended. This has been fixed.
358138 Connecting to a database in the MobiLink plug-in by opening the Connect dialog and specifying the connection information, would have caused the information specified (excluding the password) to be saved in the user's .scUserPreferences file under the default connection key "DefConn". The information was saved so that the next

time the Connect dialog was opened, it would contain the previous connection information. For security reasons, this feature has been removed. Now, this information is no longer implicitly saved in the user's .scUserPreferences file. Instead, it is persisted in memory for the current Sybase Central session only. Note that the user can still use

connection profiles to explicitly persist connection information in the .scUserPreferences file.

This change also fixes a problem which could have caused the password to be incorrectly persisted as "***".

358149 Operations in a stored procedure or batch, on string variables that were exactly 255 bytes in length, could have caused the resultant string to have become corrupted. This has been fixed.
358151 The Interactive SQL utility dbisqlc, did not display help when the "Help Topics" menu was selected. This has been fixed.
358197 Executing a statement with a view that referenced remote tables and used Common Table Expressions, would likely have caused a server crash. The fix for Engineering Case 352938 was incomplete, as it did not handle views. This has now been corrected.
358200 When connecting to a database with the ASA plug-in, the connection information used is now remembered for the current Sybase Central session, so that the next time the Connect dialog is opened, it contains the previous connection information. For security reasons, the password is remembered only if the SQLCONNECT environment variable is defined and contains the same password. Note that this information is remembered for the current Sybase Central session only, it is not persisted in the users .scUserPreferences file because of security concerns.
358207 As of ASA 9.0.0, the ODBC driver allows for the establishment of a message callback function, so that 'message' statements can be send back to the connection. These callback functions are established by calling SQLSetConnectAttr(), but it was not possible to uninstall the message callback function. Now, calling SQLSetConnectAttr() and passing a NULL pointer will disable the message callback function.
358245 On Palm OS devices, a call to UUID.toString() would have returned an empty string. This has been corrected
358246 On Palm devices, when creating a database with the createDatabaseWithParms() function, or opening a connection with the openConnectionWithParms() function, the numerical value in the converted connection string would have become "?". Such fields included reserve_size and page_size. This has been fixed.
358312 The server's HTTPS web services could eventually have exhausted the memory available to the server, which could have resulted in a fatal error. This has been fixed.
358333 A NullReferenceException could have occurred when fetching long varchar or long binary date using the DataReader object. This problem has been fixed.
358350 If a table was part of a publication, altering a trigger on that table could have caused the server to fail with assertion 100905 on a subsequent INSERT, UPDATE or DELETE. For this to have occurred, the table must have been referenced in a stored procedure and the procedure must have been called at least once before the ALTER and once after. This has been fixed.
358354 Insert statements with queries containing non-deterministic functions and EXISTS, ANY, ALL or IN predicates, that were rewritten as a join with a DISTINCT, could have produced incorrect results. In these cases, the distinct operation was applied to the non-deterministic function in addition to the other columns where distinct elimination was required for correctness. Hence, rows which would otherwise have been considered identical were made different by the non-deterministic function, causing the number of rows performed by the insert to be greater than expected. This has been fixed.

A workaround is to embed the insert in a compound statement, where the query is run and the inserts are done using a cursor ranging over the query.

This is a followup issue to Engineering Case 346886, which missed this special case.

358369 When connected to a remote server via ODBC and using callable or prepared statements, getting the update count could have returned a function sequence error, instead of giving the proper count. This has now been fixed.
358388 When the ADDRESS specified for the ASA client dbmlsync, to connect to a Mobilink server, contained the 'security' parameter and the cipher specified was not recognized, dbmlsync would have reported an error indicating that it could not load a DLL (usually dbsock?.dll or dbhttp?.dll). A more meaningful error message is now displayed.
358479 When editing a view, trigger, procedure, function, or event in the right pane of the main Sybase Central window, the Paste menu item and toolbar button were enabled if the clipboard contained something other than text, such as an image. In this case, selecting the menu item or clicking the toolbar button would have done nothing. Now, the Paste menu

item and toolbar button are enabled only when the clipboard contains

text.

358497 If a database with auditing enabled required recovery, the server may have indicated during recovery that the log file was invalid. If an audit record in the transaction log was only partially written, the audit record would have appeared corrupt. This is now ignored if the partial audit record is at the end of the log.
358511 The QAnywhere Client qaagent.exe, version 9.0.1.1830 or later, could have failed to start when run against a message store created with an earlier version of qaagent. The error reported in the log would have been:

E.... InternalError: Procedure 'ml_qa_set_global_property' not found

E.... Source statement:

E.... QAnywhere Agent failed to initialize parameters

I.... QAnywhere Agent stopped

This problem has been fixed.

358564 Two new Traditional Chinese collations have been added, 950ZHO_HK and 950zho_tw.

The collation 950ZHO_HK provides support for the Windows Traditional Chinese character set CP950, plus Hong Kong Supplementary Character Set (HKSCS).

The collation 950ZHO_TW provides support for the Windows Traditional Chinese character set cp950, but doesn't support HKSCS. Ordering is based on byte-by-byte ordering of the Traditional Chinese characters. The collation 950TWN is now obsolete.

Please note that in version 9.0.0 and lower, 950TWN has no support for HKSCS, the new collation that is equivalent to it is 950ZHO_TW. In 9.0.1 and higher, 950TWN does support CP950 plus HKSCS and the new collation that is equivalent to it is 950ZHO_HK.

The reason for splitting 950TWN into two collations is that Microsoft Windows allows users to create their own characters in the End User Defined Character (EUDC) area in Windows code pages. HKSCS, is an extension to CP950, which defines its characters also in the EUDC area for CP950 and thus may conflict with existing private characters defined by users who don't use HKSCS and don't have HKSCS installed.

358667 On busy servers, TLS connections may have timed out with the error -829 "TLS handshake failure", after 10 seconds. The TLS timeout time has now been changed to be the same as the connection's liveness timeout time.

Note, this problem also affected HTTPS connections as well. The timeout in that case

is now set to the same as the idle timeout (the TIMEOUT parameter to HTTPS).

This also fixed a server crash that may have occurred if an older dbtls DLL was used.

358679 The drop down boxes on the Joins page of the QueryEditor did not allow scrolling from the keyboard, only the mouse. This is now fixed.
358783 The Unload utility dbunload, would have reported character set conversion errors when UNILIB character set conversion tables ( the uct files under the charsets\unicode folder ) were not deployed with the database server. The server will nolonger report an error, but if UNILIB character set conversion tables are not present for the server, object names which contain non-English characters can be mangled in messages, when the database character set is different from the client character set.
358785 Valid nested queries that utilized aliased outer reference expressions could have failed with a syntax error (SQLCODE -149). As an example, the following query (over the asademo database schema) would have failed due to the use of "Q" in the GROUP BY clause of the subquery:

select line_id as Q, count(*)

from sales_order_items

where quantity != 89999

group by line_id

having count(*) not in (select max(quantity) from product

group by Q, description )

order by 1, 2

It was necessary that both the outer block and the nested subquery both contain aggregation and/or GROUP BY clauses for this problem to have occurred. It has now been fixed.

358843 A memory leak occurred in the OLEDB provider, ASAProv, when a repeated sequence of calls to SetCommandText(), Prepare(), and GetColumnInfo() was executed. These calls could be generated by an ADO Open() call with a SELECT statement containing a number of table JOINs. This problem has now been fixed.
358918 Sybase Central would not have started if the "Fast launcher" option was turned on and the TCP/IP port it was configured to use was already in use by some other program. No errors would have been reported; the application would simply have failed to run. This problem also affect the Interactive SQL utility dbisql as well. This has been fixed.

You can disable the fast launcher by running:

dbisql -uninstall -terminate

scjview -uninstall -terminate

358926 Connecting to a database by using the Connect dialog (as opposed to using a connection profile) and then attempting to open Interactive SQL by right-clicking the database and selecting the "Open Interactive SQL" menu item, would have required typing the password before the connection was established in Interactive SQL. This has been fixed. Now, the connection is established automatically using the same password that was specified when connecting to the database in Sybase Central.
358939 When the graphical version of the Dbmlsync Integration Component was used on Windows CE, calls to the function IOleObject::GetMiscStatus would have returned that it was not implemented, (E_NOTIMPL). Thisfunction has now been implemented for Windows CE.
358956 Executing a CREATE DOMAIN statement in a database with a multibyte collation, such as Japanese, that defined a default value that contained multibyte characters with \x5c as the second byte, would have been displayed as a hexadecimal string in Sybase Central. This problem did not exist if the collation was UTF8. The problem is now fixed.
358965 On the Table Data page of the Plug-in Preferences property sheet (accessible by right-clicking "Adaptive Server Anywhere 9" in the tree and selecting the Preferences... menu item), changing the font selection to another custom font when a custom font was already selected, would not have enabled the Apply button. This has been fixed.
358974 The QAnywhere client would have automatically set the properties "ias_MimeType" and "ias_MessageType" for each message that i\was sent. This has been changed. Now the property "ias_MimeType" is no longer set for any message, since it did not convey any more information than whether the message content was text or binary, and this information is obtainable by other means. The property "ias_MessageType" is also no longer set for regular messages. It is still set for network status and other system messages that are sent to the "system" queue. The purpose of this change was to reduce the amount of data sent over the network by up to 59 bytes per message.
359136 UltraLite.NET has a simpler error system and thus does not have the ADO Errors collection. In order to make it easier to move from UltraLite to ASA, two new properties have been added, AsaException.NativeError and AsaInfoMessageEventArgs.
359142 Two new collations have been added, 1252SPA Spanish, and 874THAIBIN Thai.

Collation 1252SPA is similar to 1252LATIN1, but causes N and � (N-tilde) to be sorted as separate characters. On a Windows system configured for Spanish, dbinit and the CREATE DATABASE statement will now default to this collation, and will also appear in the Sybase Central Create Database wizard for ASA.

Collation 874THAIBIN does not attempt to provide linguistically-correct sorting for Thai characters, but sorts the characters in binary order. The collation does provide character set mappings to cp874 (and TIS-620, which is compatible with cp874). On a Windows system configured for Thai, dbinit and the CREATE DATABASE statement will now default to this collation, and will also appear in the Sybase Central Create Database wizard for ASA.

359212 The debug server log, (output generated bu -z command line option), could have contained extraneous "Communication function <function name> code <number>" diagnostic messages. For example after stopping a database using dbstop. Similarly there could have been extraneous instances of this diagnostic message in the client LogFile.

These extraneous diagnostic messages have been removed. Please note that this diagnostic message can still validly occur under some circumstances and may be useful to help Technical Support diagnose other problems.

This change also prevents some spurious "connection ... terminated abnormally" messages.

359229 When using the iAnywhere Solutions ODBC driver for DB2, to insert BLOB data bigger than 32K bytes, the data at location 32752 wouldhave been corrupted when fetching BLOB data back in chunks. The trailing byte of a buffer was being set to 0x00. This problem has been corrected.
359242 The server could have crashed when attempting to get a db_property for a database which is in the process of being started. When a database is being started, a "stub" database object is added to the server's list of databases, which has NULL pointers for a number of fields, including the statistics counter array. Calling the db_property() function would have attempted to get statistics for the stub database. Fixed by only getting properties for active databases.
359265 When run on Sun Solaris systems, the server would have tried to load an incorrect LDAP shared object name, libldap_r.so. This has been corrected, the server now loads libldap.so.
359409 When a java.sql.Timestamp type value was inserted into a column of type TIMESTAMP, the conversion of the nanosecond portion of the java timestamp to the microsecond portion of the UlDateTime was incorrect. Thus timestamps like 01:20:60 were possible. This has now been corrected.
359428 A memory leak can have occurred in the ODBC driver if the database server closed the connection for any reason, for example an idle time-out. A pointer to the driver's connection object was being set to null, but the object was not freed. This has now been corrected.
359568 When using the iAnywhere Solutions ODBC driver for DB2 on Windows systems, (wqdb219.dll), and fetching BLOB data back in chunks, the trailing byte of the buffer would have been set to 0x00. This problem has been corrected.
359575 When using the iAnywhere Solutions 8 Oracle WP driver for Win32 to connect to Oracle 9i, NCHAR data was not correctly returned from the server. This problem is fixed in version 4.20.0081 of this driver. To update the driver, the following files need to be updated:

wqora1919.dll

wqora19r.dll

wqora19s.dll

wqbas19.dll

wqbas19r.dll

wqicu19.dll

wqutl19.dll

wqutl19r.dll

359576 For collations supporting the languages UKRAINIAN, CZECH, HUNGARIAN, GREEK, HEBREW, ARABIC, TURKISH, DUTCH, LITHUANIAN, THAI, db_property( 'language' ) would not have report those languages. For example, in a 1251CYR database, 'ru,en' would have been reported instead of 'uk,ru,en'. The collation UTF8 was missing all of the above languages. Now, the db_property() function will return all languages supported by ASA and by the specified collation.

For many collations, the returned string will change (get longer). So, an application may break if it checks for the entire string, rather than the specific two-letter language code.

359675 When a binary array of bytes was inserted into a binary column using the OLEDB provider "ASAProv", the data was converted to a hexadecimal string and stored into the binary column. For example:

BYTE m_lParm1[2]={0x10,0x5f);

would have been stored as the binary value 0x31303566 which is the original binary value stored as a hexadecimal string of characters. This has been fixed so that parameters are not converted from the user's type to a string. Instead, bound parameters are converted to the type specified by the application.

359741 If a synchronization was performed prior to changing the database options Truncate_timestamp_values to ON and Default_timestamp_increment to a value which would disallow timestamp values with extra digits of precision, the next synchronization would have caused a server crash. The server will now display an assertion indicating that an attempt to store an invalid timestamp value in a temporary table was made. The options must be changed before the first synchronization is performed.
359745 If a stored procedure declared a temporary table and returnd a result set, opening a cursor on the procedure would have made the temporary table visible outside the procedure. This has been fixed.
359828 When the Histogram utility dbhist, was run on non-English systems, mangled characters would have been shown in the title, legend, etc, of the generated Excel chart. This problem has now been corrected.
359844 If "XML" was chosen in the "Files of type" setting in the "Save" dialog, the file would have been saved with an extension of "sql" rather than "xml". The file contents were correct, just the file name was wrong. This problem affected only Linux and Solaris platforms, and has been fixed.
359877 If the Synchronization Client's (dblmsync) extended option Downloadbuffersize, was not set to 0 (the default value is 1 Meg), and a communication error occurred while receiving the download stream from the MobiLink server, the synchronization would have failed, but no error message would have been reported and the sp_hook_dbmlsync_download_com_error hook would not have been called. An error is now issued and the hook is now called in this case.
359889 If clustered indexes were available to the Index Consultant, a clustered index was almost always recommended on each table. This led to the recommendation of clustered indexes when they provided no benefit (for example, when they were not used for range scans). Clustered indexes are now only recommended if they are actually picked by the optimizer in preference to a non-clustered index for a given query.
360001 The context menu for Results tables could have appeared far from the mouse pointer if the whitespace to the right or below the actual table data was clicked on. This has been fixed so that the context menu always appears where the mouse was clicked.
360041 On Linux systems, an error dialog window could have been opened without it being made the active window. This made it almost impossible to close without using a mouse, which is contrary to the Section 508 accessibility guidelines. This has been fixed so that the window is now always activated.
360190 SQL Remote (dbremote) may have hung when scanning transaction logs if the server logged a checkpoint that has a previous checkpoint pointing to itself. This problem has been fixed.

Note, this problem also affected Mobilink's Synchroniztion Client and the ASA Replication Agent

360196 The ASA OLEDB provider ASAProv did not return the correct error codes as documented by Microsoft. For example, the ICommand::Execute method should have returned DB_E_INTEGRITYVIOLATION when a literal value in the command text violated the integrity constraints for a column, but was returning E_FAIL. This has been corrected.

The following additional error codes are also now returned:

DB_E_NOTABLE

DB_E_PARAMNOTOPTIONAL

DB_E_DATAOVERFLOW

DB_E_CANTCONVERTVALUE

DB_E_TABLEINUSE

DB_E_ERRORSINCOMMAND

DB_SEC_E_PERMISSIONDENIED

360202 On Palm devices, explicitly closing the connection, would have caused Hotsync to fail with a SQLE_SYNC_INFO_INVALID error. Now, Hotsync on Palm devices will succeed even if the connection is explicitly closed. This does not affect Windows systems.
360207 Some registry entries would have been left when uninstalling UltraLite for AppForge MobileVb, (ulmvbreg -u). Now all registry entries are completely removed.
360237 Memory-intensive operations, such as a sort, hash join, hash group-by, or hash distinct, could have caused the server to fail with a fatal memory exhausted error, if they were executed in an environment where the operation could not be completed completely in the available memory. This issue affected all platforms, and has now been fixed.
360238 The system extended stored procedure xp_cmdshell will now accept command lines up to 8000 bytes.
360242 The Histogram utility dbhist, would have reported that the histogram contained no data, when Excel was not installed, even if statistics did exist. This error message has been corrected, a new error message "Unable to create Excel Workbook' has been added.
360258 The total accumulated delay caused by the sp_hook_dbmlsync_delay hook was being calculated incorrectly when a synchronization was restarted using the sp_hook_dbmlsync_end hook. As a result the sp_hook_dbmlsync_delay hook might not be called or the delay produced by the hook might be shorter than specified.

Following are the specific conditions required to see this problem:

- Both an sp_hook_dbmlsync_end hook and an sp_hook_dbmlsync_delay hook have been coded.

- During a synchronization the delay hook was called one or more times. Those calls resulted in a total delay D and the maximum accumulated delay parameter was set to some value M.

- When the end hook is called it sets the 'restart' parameter to 'sync' or 'true' to restart the synchronization.

When the above conditions are met, the sum of delays caused by the delay hook was not being reset before the synchronization was restarted. As a result, on the restarted synchronization, the delay hook would not be called if D >= M. If D < M then the maximum delay that would be allowed before the synchronization occurred would be M - D when it should have been M.

The sum of delays is now reset before the synchronization is restarted so that the delay hook will have the same behavior on a restarted synchronization as it does on a first synchronization.

360311 A query with a large number of OR'ed predicates (about 20,000 on Windows systems) may have caused the server to crash.

For example:

select T2_N.b

from T1, T2, T2_N

where T1.a = T2.b and T2.b = T2_N.b and

( T1.a = 1 or T1.a = 2 or T1.a = 3 or .... or T1.a = 20000)

The number of OR conditions to cause the crash depended on the available stack size. This problem has been fixed. Now these queries return an error "Statement size or complexity exceeds server limits".

360357 In some circumstances, the UltraLite Schema Painter would have failed to allow the user to create a new schema file. This has been fixed.

The following steps demonstrate the problem:

- Create a new Schema File

- Right click on the schema file in the left pane of the application

- Close the schema file and choose not to save it

- Attempt to create a new schema file

360361 In some circumstances, the UltraLite Schema Painter would have crashed when browsing the File menu. This has been fixed.

The following could have caused this behaviour:

- Start the UltraLite Schema painter and create a new schema

- Right click on the schema in the left pane but do not choose any menu items

- Select the File menu and choose Close (when asked to save, click No)

- Select the File menu again and move over the items in the menu. The application could crash at this point.

360362 When creating a new schema file in the UltraLite Schema Painter, if the directory didn抰 exist, the new schema file would not have been saved properly. Now, the user is prompted whether the new directory should be created.
360455 During unloading or rebuilding a database a non-clustered index may have been recreated as a clustered index. This would have happened if there was at least one table with a clustered index and subsequent unloaded table definitions had a non-clustered index with the same index id as the clustered index. This has now been fixed.
360460 An UPDATE statement may have failed unexpectedly with the error "No primary key value for foreign key". For this problem to have occurred, multiple rows had to have been updated, the table had to have a trigger that contained a SET TEMPORARY OPTION statement, and the table had to have at least on Foreign Key with a referencial action defined. This problem has been fixed, there is no longer an error in this situation. The workaround is to

remove the SET TEMPORARY OPTION statements.

360464 If a grouped query had a base table's column T.A in its select list, and the table T qualified to be eliminated by the join elimination algorithm, then T.A might have been incorrectly renamed. This has been fixed.

For example:

The query below returned a result set which had the first column renamed "A2":

create table T1 ( A1 int primary key);

create table T2 ( A2 int,

foreign key (A2 ) references T1(A1) );

select A1

from T1 key join T2

group by A1

Note that the query was rewritten by the join elimination algorithm into:

select A2

from T2

group by A2

Now, the query is rewritten into:

select A2 as A1

from T2

group by A2

A work around for this problem is to alias all the columns referenced in the SELECT list with their own names.

For example, the query Q' below is not affected by this bug:

Q':

select A1 as A1

from T1 key join T2

group by A1

360479 The ODBC SQLDisconnect() function could have returned a failing error code if the server dropped the client's connection (e.g. for idle time-out reasons), while the connection had a dirty transaction to be committed or rolled back (i.e. SQLExecute, SQLExecDirect or SQLSetPos was called), and SQL_AUTOCOMMIT_OFF option was set ON for the connection.

Now, SQLDisconnect() returns SQL_SUCCESS_WITH_INFO and sets the SQLSTATE to 01002 (Disconnect error).

360584 The Join Nested Block (JNB) operator will no longer be considered a fully pipelined join operator while optimizing with the database option Optimization_goal set to 'first-row'. Although the JNB operator is not a fully materializing operator, it may block and force the usage of a work table. Now, while optimizing for the 'first-row' optimization goal, this operator is less likely to appear in the plan chosen.
360591 A data reader opened with a select statement would have held a lock on the table, even after the data reader had been closed. This has now been fixed.
360597 Applications attempting Shared memory connections may have hung if the server was forcibly shut down during the connection attempt. This has been fixed.
360678 ADO applications using the ASA OLEDB provider, ASAProv, could have failed with an "invalid rowset accessor" error.

The following Visual Basic code example demonstrates the problem:

Dim conn As new OleDbConnection()

Dim cmd As OleDbCommand

Dim reader As OleDbDataReader

Try

conn.ConnectionString = "Provider=ASAProv;uid=dba;pwd=sql;eng=asademo"

conn.Open()

cmd = New OleDbCommand("SELECT * FROM DEPARTMENT", conn)

reader = cmd.ExecuteReader()

While reader.Read()

Console.WriteLine(reader.GetInt32(0).ToString() + ", " _

+ reader.GetString(1) + ", " + reader.GetInt32(2).ToString())

End While

reader.Close()

reader = Nothing

conn.Close()

conn = Nothing

Catch ex As Exception

MessageBox.Show(ex.Message)

End Try

This problem has been fixed, the rgStatus array passed to the IAccessor::CreateAccessor method is now correctly initialized.

360694 The server could have deadlocked, and appear to be hung, if a transaction yielded to a checkpoint (by context switching, waiting for a lock or waiting for network I/O) after rolling back to a savepoint. This has been fixed.
360761 Calling the AsaDataAdapter.Fill method multiple times on the same DataTable that had a primary key, woulkd have caused a 'System.Data.ConstrainException' exception on the second call. Now, if a primary key exists, incoming rows are merged with matching rows that already exist. If no primary key exists, incoming rows are appended to the DataTable. If primary key information is present, any duplicate rows are reconciled and only appear once in the DataTable.
360885 Using variable assignments in a positioned update, (e.g update T1 set id = @V1, @V1 = @V1 + 1 where current of curs), would have caused a server crash. Now, variable assignments in a positioned update are supported.
360896 When inserting into a numeric column, no error was raised when the precision exceed the precision allowed by the column. The column would have been corrupt if the insert was committed. Now an overflow error is raised on insert.
360904 The reload.sql file generated by the Database Unload utility dbunload, may have contained garbled object names if the connection character set and database character set were different. This problem has now been fixed.
360936 When two instances of the same table are joined on the primary key then, under certain conditions, it is possible to eliminate one of the instances.

For example, given the following table:

create table T ( A int primary key,

B int);

the statement:

DELETE from T as T0

from T as T0 natural join T as T1

is equivalent to:

DELETE from T as T0

where T0.B = T0.B

This optimization was only done for SELECT statements when the table to be eliminated was not updatable. Now, this optimization is done for DELETE and UPDATE statements when the table to be eliminated is not the table to be modified.

360966 When performing an absolute fetch, the query processor always started either from the first or last row of a cursor. In some cases, it is safe to start from the current row (for example, if none of the tables in the query had been modified since the last absolute fetch). Now, the query processor moves from the current row, if it is safe to do so, possibly improving performance.
361088 When a publication contained a table with a foreign key or a chain of foreign keys (ie t1 has an FK to t2, t2 has an FK to t3 etc) to a table listed in the EXCLUDEOBJECT system table and the table listed in the EXCLUDEOBJECT table was not included in the publication being synchronization, then the upload would fail with the message, "Upload aborted aborted at offset...". The message now includes a description of why the upload was aborted.
361115 If Interactive SQL was run in batch mode with the output redirected to a file, executing a statement that caused a warning from the server would appear to have hung. What was happening was that Interactive SQL was waiting for a key to be pressed to continue execution after reporting the warning, the prompt had been suppressed. Now, warnings are displayed without prompting when run in batch mode. Operation in windowed mode has not been changed.
361184 A query with a large WHERE clause containing the conjunction and disjunction of many literals could have caused the server to hang with 100% cpu usage and eventually run out of memory and fail with a "Dynamic Memory Exhausted" message. This has been fixed.
361187 Feature Request - provide functionality to size system dbspace during dbinit and create database instead of using Alter dbspace afterwards
361188 The collation 1250LATIN2 was missing case conversions for "Letter O with double acute" and "Letter U with double acute". As a result, the functions UPPER() and LOWER() would have failed to convert these letters to their corresponding case, and comparisons would also have failed to match these characters with other O and U characters when the case was different. This has now been fixed, but existing databases will need to be rebuilt to get the new conversions.
361206 When run on Unix systems, the Data Source utility dbdsn, required write permission on the .odbc.ini file, even if just listing or reading the DSNs. This has been

fixed, now only read permission is required, unless the -d or -w options are used.

361210 A SELECT INTO #temp statement, using a recursive view, may have caused the server to crash if used inside a stored procedure. This has been fixed.

For example:

create procedure P1( arg int )

begin

with recursive v( a, b ) as (

select T1.a,T1.b from T1 where T1.a = arg

union all

select T1.a,T1.b from T1 join v on(T1.a = v.b)

)

select * into #temptab from v;

end

361307 Executing a CREATE DATABASE statement which contained a CASE clause could have failed as not executable, if the statement appeared in a .SQL file with other SQL statements or was executed interactively along with other statements. This has been fixed.

The problem only occurred when attempting to execute a CREATE DATABASE statement with other statements, as part of a batch, and affects DBISQL version 7.0.0 and later.

361464 This change fixes several problems with the DBSCHEMA_INDEXES rowset, implemented by the sa_oledb_indexes stored procedure.

The COLLATION column was always empty. It now contains a 1 for ASCENDING ordering and a 2 for DESCENDING ordering.

The CLUSTERED column was always TRUE, even for a non-clustered index. This column now contain 0 unless the index is clustered, in which case it will contain a 1.

The INDEX_NAME column contained the additional string "(primary key)" when the index was based on a primary key. In the DBSCHEMA_PRIMARY_KEYS rowset (implemented by the sa_oledb_primary_keys stored procedure), the PK_NAME column does not contain this string.

Since the names were different, it was difficult to join the information in these two tables. Elsewhere the index name is reported using only the table name (in access plans for example). For these reasons, the INDEX_NAME column will no longer contain the string "(primary key)".

The following column names have been corrected:

FKTABLE_CAT is now FK_TABLE_CATALOG

FKTABLE_SCHEMA is now FK_TABLE_SCHEMA

PKTABLE_CAT is now PK_TABLE_CATALOG

PKTABLE_SCHEMA is now PK_TABLE_SCHEMA

These corrections are to the "oleschema.sql" file located in the "scripts" folder, which will be in effect for newly created databases. To implement the corrections to an existing database, connect to the database with Interactive SQL dbisql and run the contents of "oleschema.sql".

361509 Servers running on Windows systems, other than Windows 95, could have experienced database corruption if the system crashed due to an OS or hardware problem (or it was powered off unexpectedly), and write caching was enabled on the drive containing the database files.

A work around would be to disable write caching in the Device Manager, via the Disk Properties tab in the Properties dialog, for the drives in question. (This might be necessary in any case for IDE drives).

361511 The QAnywhere sample databases qanyserv.db and qanywhere.db were initialized for Windows machines with default collation sequence: 1252LATIN1 (Code Page 1252, Windows Latin 1, Western), and were installed even on non-English machines. This has been fixed, these databases now have collations that matches the default for the machine on which they are installed.

A workaround for is to re-create the above databases after the install has completed. To do this, change to the appropiate directory and enter the following, (<dbfile is either qanyserv.db or qanywhere.db):

dberase -y <dbfile>

dbinit <dbfile>

361512 If a stored procedure contained a CREATE VIEW statement, the second execution of the CREATE VIEW statement may have failed with a "column not found". This has been fixed.

A workaround is to use EXECUTE IMMEDIATE to create the view.

361517 The QAnywhere client import libraries for CE platforms were missing from the install. This has been corrected, they are now placed in QAnywhere\ce\arm.30\lib and QAnywhere\ce\x86.30\lib. This affects Windows CE C++ application development. Windows CE .NET development was not affected.
361518 On Windows XP (or other Windows versions with the Luna look, ie Windows 2003) with Luna-style GUI elements enabled, as opposed to Classic Windows elements, the hard-copy printout of the query plan would have been unreadable. The DFO tree would have been displayed, but each operator would be a solid-filled coloured box. This has been fixed.

A workaround is to temporarily change the Display Properties of the machine to use the Windows Classic style while working with ISQL.

361599 Executing a STOP DATABASE statement which attempted to stop a database running on a server to which you were not currently connected, would have resulted in dbisql failing with an internal error. This has been fixed.
361965 On Unix systems, the server use 100% of the CPU while shutting down unconditionally if there were still active TCP/IP connections, although the server does eventually shut down. This has fixed.
361999 Index statistics for SYSATTRIBUTE could have become out of date, resulting in errors being found when running the Database Validation utility dbvalid. This problem has now been resolved.
362004 When a server registered its IP addresses in LDAP, it included the localhost address as well (127.0.0.1), which was not useful to clients in finding the server. This address will now no longer be included when the server registers with LDAP.
362011 The OLEDB provider ASAProv assumed that DBTYPE_BOOL values were 1 byte long. So for database columns of type BIT, it would indicate that only 1 byte needed to be allocated for a DBTYPE_BOOL column. This was incorrect, since DBTYPE_BOOL values are actually 2 bytes long. Any consumer application that fetched 2 bytes for a DBTYPE_BOOL column, (such as applications based on Borland's Delphi), and examined both bytes, would have obtained an incorrect result. Also columns adjacent to DBTYPE_BOOL columns will overlap in memory. This has been fixed.
362015 The MobiLink Server would not have detected update conflicts, if the server was running with the command line option -s n (where n was greater than 1) or without -s at all, and the consolidated database was a Microsoft SQL Server or Oracle database. Also, the synchronization had to have been a statement-based upload, with no upload_fetch script, and an upload stream had to have contained updates that had an unsatisfied WHERE clause in the consolidated database. These updates would have failed due to the unsatisfied WHERE clause, but the MobiLink server would have ignored these failures without giving any error or trying to resolve these conflicts. Now if the batch contains updates and the number of affected rows doesn't match the number of rows applied, the server will roll back the operations and try them again using single-row mode.
362053 The MobiLink Monitor was reporting the wrong number of uploaded bytes. The Monitor would most often have reported the actual value plus one, but it could also have reported even larger values. This has been corrected.
362144 The Message Viewer was capturing CTRL-A keystrokes when it did not have focus. This has been fixed.
362197 If a multi-threaded client application had more than one connection (on more than one thread) logging to the same log file, the logged entries from the connections could have been mixed up. Specifically, several timestamps may have appeared together, followed by the text of the messages. Also, in 9.x clients, the date stamp at the top of the file would always have used lowercase English strings. This has been fixed.
362198 In the COLUMNS, PROCEDURE_PARAMETERS and PROCEDURE_COLUMNS rowsets, the CHARACTER_MAXIMUM_LENGTH column contained incorrect values for BIT and LONG VARCHAR/LONG VARBINARY columns and parameters. This column should contain the maximum possible length of a value in the column. For character, binary, or bit columns, this is one of the following:

1) The maximum length of the column in characters, bytes, or bits, respectively, if one is defined. For example, a CHAR(5) column in an SQL table has a maximum length of five (5).

2) The maximum length of the data type in characters, bytes, or bits, respectively, if the column does not have a defined length.

3) Zero (0) if neither the column nor the data type has a defined maximum length.

4) NULL for all other types of columns.

As well, the CHARACTER_OCTET_LENGTH column contained incorrect values for LONG VARCHAR/LONG VARBINARY columns and parameters. The CHARACTER_OCTET_LENGTH column should contain the maximum length in bytes of the parameter if the type of the parameter is character or binary. A value of zero means the parameter has no maximum length. NULL for all other types of parameters.

In the PROCEDURE_COLUMNS and PROCEDURE_PARAMETERS rowsets, the column name should have been CHARACTER_OCTET_LENGTH rather than CHAR_OCTET_LENGTH.

In the PROVIDER_TYPES rowset, the COLUMN_SIZE column contained incorrect values for LONG VARCHAR/LONG VARBINARY types.

These problems have been corrected and will appear in the "oleschema.sql" file located in the "scripts" folder once the EBF has been applied. To implement the corrections to an existing database, connect to the database with Interactive SQL (dbisql) and run the contents of "oleschema.sql".

362207 In the FOREIGN_KEYS rowset (implemented by the sa_oledb_foreign_keys stored procedure), the DEFERRABILITY column contained the values 5 or 6. This column should contain one of the following:

DBPROPVAL_DF_INITIALLY_DEFERRED 0x01

DBPROPVAL_DF_INITIALLY_IMMEDIATE 0x02

DBPROPVAL_DF_NOT_DEFERRABLE 0x03

These corrections will appear in the "oleschema.sql" file located in the "scripts" folder once the EBF has been applied. To implement the corrections to an existing database, connect to the database with Interactive SQL and load and run the contents of "oleschema.sql".

362219 With Server Initiated Synchronization, the upload tracking synchronization could have occurred up to a minute after a _BEST_IP_CHANGED_ internal message was issue by the Listener. This latency has now been removed, although the 1 minute retry attempt is unchanged.
362220 If another transaction attempted to query or modify a table while a the fast form of TRUNCATE TABLE was executing on the same table, the server could have failed an assertion, and in some cases, possibly corrupted the database. This was not likely to occur on single processor Windows platforms. This problem has been corrected.
362221 With Server Initiated Synchronization, the Listener may have failed to expand the $adapters action variable to a useful adapter name, and left it as an empty string for some network adapters. An alternative of finding the name of the adapter has now been added and in the worst case an active adapter will be named as "unknown adapter".
362226 On Linux systems, getting information about a table's primary key, by clicking the 'Details' button on the Property dialog, would have caused a ClassCastException. This is now fixed.
362311 When estimating the selectivity of a predicate of the form "column = (correlated subselects)", the server was treating the predicate as "column = (single value)". This assumption could have lead to overly low selectivity estimates resulting in poor plans. In reality, the correlated subselect can cause a large number of values to be compared with the column, resulting in many rows.

Now, the server will use a "guess" estimate of 50% for the selectivity of these predicates.

362312 The restructuring of column statistics in the server could have caused memory corruption, which can result in various symptoms, including server crashs and assertions. The chances of this problem happening was remote. It could only have occurred if the memory allocator returned the same memory as that used in a previous invocation of the restructuring of the same histogram. This problem has now been resolved.
362356 While connected to a multi-byte character set database with the iAnywhere JDBC Driver, executing a procedure whose result set was defined to have a varchar column, but the size of the column in the definition was too small, could have resulted in an "Out of memory" exception. This problem has now been fixed.

For example:

CREATE PROCEDURE test()

result( c1 varchar(254) )

begin

select repeat( 'abcdef', 1000 )

end

Notice that a varchar( 254 ) column is much too small to hold the result of repeat( 'abcdef', 1000 ). In this case, executing the procedure test would have resulted in an "Out of memory" exception.

362415 With Dynamic SQL, memory could have been corrupted on Unicode implementations when executing CREATE TABLE or CREATE INDEX statements. This is now fixed.
362497 The OUTPUT statement could have failed to write any rows to a file, even if there were rows to write, if the "Output_format" option was set to an invalid value. Now, it is impossible to set the "Output_format" option to an invalid value. When connecting to a database in which the option has been set to a bad value, the bad value is ignored and the default (ASCII) is assumed.
362585 Queries that used a multi-column index could have returned incorrect results. For this to have occurred, all of the following must have been true:

- The index must have been comparison-based.

- One of the first few columns being indexed must have been a short character (or binary) column [the column must have been fully hashed]. This column must not have been the last column being indexed.

- The query must have contained a comparison involving this column [say with domain char(n)] and a string s with length > n whose n-byte prefix appeared as a value in the column.

This problemhas now been corrected.

362597 It was possible for the MobiLink server to have crashed while doing secure synchronizations. This has been fixed.
362722 The installer for the 9.0.1 1883 EBF made a call to a function that is not implemented on Windows NT, and as a result generated the error:

"The procedure entry point, Module32Next could not be located in the dynamic link library KERNEL32.dll".

This error is typically reported when the version of the DLL found does not match the expected version, or the function has not been exported from the DLL. In this case, the problem was related to the later, as "Module32Next" is not a valid function on Windows NT. The code has been changed to only call this function if it exists.

362723 When running on linux systems using the 2.6.x kernel, Core files generated when the server crashed, would have contained only the stack trace of the thread causing the fault. This has been fixed. Core files will now have full stack trace information for all threads. On Linux 2.4.x kernels though, the core file will continue to contain only the stack trace of the thread responsible for the fault.
362725 Some SSL clients could have rejected certificates generated with the Certificate Generation utility gencert. Beginning with version 8.0.2, gencert added an extended key usage field to certificates it generated. Since this does not seem to be accepted universally, it has been removed.
362727 The server could have evaluated the LIKE predicate incorrectly for some patterns containing multiple wild card characters. In order for the incorrect answer to have been computed, the search pattern must have been "simple", containing % as the only wild card character, but with multiple instances. For example, the predicate " '1.1.' LIKE '1.%.%.' " would have incorrectly evaluated to TRUE. The server will now compute the correct answer.
362728 Turning on or off warnings in the Preferences dialog from Tools menu, (Tools->Adaptive Server Anywhere 9->Preferences - 'Confirm deletions when editing table') would have had no effect when table data was being edited. This has been fixed.
362748 When launched on Windows CE systems, the QAnywhere Agent qaagent.exe, would have displayed a continuous "spinning wheel" wait cursor. This has been fixed, the wait cursor now appears briefly, and then disappears.
362752 When the QAnywhere Agent was launched for the first time, if a QAnywhere client application was concurrently polling for messages, the agent could have hung during start up. This scenario occurred when the QAnywhere Agent and the QAnywhere client application were both connecting to a message store in an already running database server. This has been fixed, the QAManager/QATransactionalManager Open() methods now fail if the message store has not been fully initialized. The error code returned in this case is QAError::COMMON_MSG_STORE_NOT_INITIALIZED. As well, a new command line option "-si" (store initialize) has been added to the QAnywhere Agent. This switch tells the qaagent to initialize a database as a QAnywhere message store, and exit. To solve the original problem, do the following in this order: (1) start the database server, (2) invoke qaagent with -si to initialize the message store, (3) start the QAnywhere client application that polls for messages, (4) invoke qaagent when it is desired to transfer messages to/from the MobiLink server.
362803 If the help window was opened and closed, and then Sybase Central was minimized, the help window would have been reopened when Sybase Central was then maximized. Note, this same problem affected Interactive SQL dbisql, as well. This has been fixed.
362847 If the argument to the isnumeric() function was an empty string, or a string containing only blanks, the function would have returned the value 1 instead of 0. The function will now return the value 0 in these cases.
362860 On slower machines, the Index Consultant may have reported that the analysis was unable to complete. In this case, the error dialog would have appeared immediately after tuning was started. This has been fixed by waiting until the dialog class that reports on the tuning process is loaded before proceeding. A workaround is to wait approximately two seconds between each mouse button click on the tuning parameter dialog pages (that is, after workload selection/capture dialog).
362895 In some cases, the selectivity estimate for a predicate '<column> IS NULL' could have been set incorrectly to 0. This could have lead the query optimizer to select poor execution plans, for example, selecting an index to satisfy an IS NULL predicate instead of another, more selective predicate.

For this problem to have occurred, a query must have contained a predicate of the form:

T.col = <expr>

The expression <expr> must have been an expression whose value was not known at query open time. For example, <expr> could have been a column of another table, or it could have been a function or expression that was not evaluated at optimization time. The predicate must have been the first predicate evaluated for the associated table scan, and the table T must have been scanned once with the value of <expr> being NULL. In these circumstances, the selectivity of 'T.col IS NULL' would be incorrectly set to 0. This has been fixed.

If an application opened a cursor over a query that contained an index scan with a single column in the index being searched for equality, the selectivity estimate could have been lowered incorrectly if the application scrolled the cursor using absolute fetches and did not visit all of the rows of the result set but ended the scan after the last row of the result set. This problem would have resulted in selectivity values being stored that were lower than expected, and could have lead the query optimizer to select poor execution plans by picking an index on this column instead of a better index. This problem has also been fixed.

362936 I a query was executed that caused errors as rows were fetched, the same error could have been reported multiple times. Now, identical errors are reported only once per result set.
363062 When running on Linux or Solaris systems, saving a stored procedure or function as a SQL file would have resulted in the file being written with an extension of ".null" or ".null.sql", if "All files (*.*)" had been selected in the "Files of Type" combo box. This has now been fixed.
363177 An application that created multiple threads, and opened and closed pooled connections on each thread, could possibly have had the threads become deadlocked, causing come connections to fail, if the 'Max Pool Size' was smaller than the number of threads. This problem has been fixed.
363211 A FillError exception was not thrown when an error occurred during a fill operation of the ASADataAdapter object. Now, when an error occurs during a fill operation, the adapter will call the FillError delegate. If Continue was set to true, the adapter will continue the fill operation. Otherwise, it will throw the exception.
363251 When using the FORWARD TO statement in interactive mode (i.e. issuing a "FORWARD TO <server>" statement first and then issuing individual statements, all of which are to be executed on the remote server), there was a pobbibility that one, or all, of the statements would have been executed locally instead of remotely. There was also a pobbibility that the statements will not have been executed at all. This problem was most likely to have occurred when connected via jConnect, or if the remote server name had a space in it, or any character that would required quoting. This problem has now been fixed.
363313 When a device was placed in the cradle and synchronization initiated, the ActiveSync provider could have erroneously reported that no applications had been registered for synchronization. This has been fixed.
363333 Using the Database Unload utility dbunload with the -an command line option to reload a database into a new file, could have failed if the character set of the OS was different from the character set of the database being reloaded. Failures could have taken the form of a syntax error during the execution of a CREATE DATABASE statement, or a mangled filename for the newly created database. This problem has been corrected.
363394 A procedure call that used a WITH clause and a column of type CHAR, VARCHAR, BINARY, or VARBINARY with no length argument, would have defaulted to the maximum size for the type, rather than 1.

For example:

select c from p() with (c char)

would have returned a column of type char(32767), rather than the correct type of char(1). A NUMERIC column, with no precision or scale argument, would have defaulted to (255,0) rather than the database defaults. In addition, a server crash may have occured when attempting to create a procedure containing a SELECT that had this problem. These problems have now been fixed.

363397 The server could possibly have crashed on shutdown, if the Java VM had been used. This would occurred if the VM needed to load additional classes during shutdown. Now, failure to load a new class during shutdown is handled by the Java's exception mechanism and the VM will still shutdown.
363426 The following invalid command would have caused the Listener utility to crash, instead of bringing up the usage text:

dblsn.exe -l

This has been fixed.

363428 When run on Unix systems, the dbisql command line option -onerror (Override ON_ERROR option) was not being recognized. This has now been corrected.
363434 Interactive SQL dbisq, (and Sybase Central), may have appeared to not start when run on a machine connected via Terminal Services / Remote Desktop. In fact, these programs do start, but their windows appear on the console (i.e. the physical machine) instead of the remote desktop. This problem only occurred if the fast launcher option for the program was enabled (which is the default). The programs now detect whether they are running within the context of a remote desktop, and if that's the case, they do NOT use the fast launcher.
363615 Attempting to use GROUPING SETS, CUBE or ROLLUP, in the GROUP BY clause of a remote query that would have been executed in full passthrough mode, would have resulted in an incorrect GROUP BY clause being sent to the remote server. It did not contain any GROUPING SETS, CUBE or ROLLUP clauses. This problem has now been fixed.
363625 A situation where a client request could have potentially crashed the ISAPI redirector as been fixed.
363708 The fix for Engineering Case 338114 was meant to handle creation of proxy tables to non-ASA remotes when the database name contained a space, or any other character that required quoting. Unfortunately, that fix introduced a bug which resulted in proxy tables not being created with certain remotes, under certain conditions, which vary significantly. This problem has been corrected.
363722 The access plan for the cursor in a FOR statement, when defined by a SELECT query block, was not being cached and reused, when used inside a stored procedure or a function. This has now been fixed.

In the example below, the SELECT query block will now be considered for caching:

for for_q as c_q dynamic scroll cursor for

select p.quantity as Q

from product p, sales_order_items s

where s.quantity = p.quantity

order by Q

do

set V = Q

end for;

Please see the following documentation for more information:

ASA SQL User's Guide

Query Optimization and Execution

How the optimizer works

Access plan caching

363739 If the user DBA was removed, (ie. REVOKE CONNECT FROM DBA), and another user assigned dba authority, the Database Upgrade utility dbupgrad, would have failed with the following error:

Error in file upgrad60.sql at line 2682 with sqlcode -140

SQL error (-140) -- User ID 'DBA' does not exist

The user DBA was unnecessarily being granted select authority on some tables. These GRANT statements have now been removed.

363754 On non-x86 Unix platforms, the server could have crashed on startup if one of the databases was strongly encrypted but an incorrect encryption key was specified. This has now been fixed.
363756 If a subquery contained an outer reference to a column from a view that was part of the null-supplying side of an outer join, and the view defined the column as a constant value, the server could have crashed when trying to build a hash join. This has been fixed.
363767 Deleting or updating a large number of rows could have taken longer than a comparable operation done with a server from version 8.0.1 or earlier. This would only have been observed when using a database created with version 8.0.0 or later. This has been corrected.
363826 Every time the synchronization of messages between a QAnywhere client and server failed, the client log file would have grown roughly in proportion to the size of the messages that failed to be synchronized. For limited memory devices, this could be a problem, especially if the QAnywhere client synchronization policy was "scheduled", with a small synchronization interval. In this scenario, the log file would grow in proportion to the outstanding messages every scheduled interval until a successful synchronization occurred. Once the successful synchronization occurred however, the log file would have been truncated down to a small size. This problem has now been corrected.
363861 A query such as the following:

select 'a', 'a' from employee group by 'a', 'a'

where a constant string appears in both the select list and the GROUP BY clause, could have caused the server to crash. This has been fixed.

363883 If a query has sargable predicates of the form "T.col = constant" or "T.col IS NULL" for at least two leading columns of an index, the estimate of number of rows returned is now computed by probing the index.

For example, given the following index:

create index NAME_COLOR on product( name, color);

the estimated number of rows returned by the query:

select count(*) from product

where color = 'white'

and name ='tee shirt'

with "color = 'white'" and "name ='tee shirt'" is computed by probing the index NAME_COLOR with the tuple ('tee shirt', 'white').

Note, if the index does not exist, the estimated number of rows with "color = 'white'" and "name ='tee shirt'" is computed as: [ size of table 'product'] X [selectivity of the predicate "color = 'white'"] X [selectivity of the predicate "name = 'tee shirt'"]. Such computation, unless the data is completely uncorrelated, can be inaccurate.

363884 If the access plan for an outer join's null-supplying side provided an order for the columns in the ON clause, and any of the columns in the ON clause was equated with a constant, the join operator JMO was preceded by an unnecessary SORT. This has been fixed.

Example:

The query below:

select *

from dbo.rowgenerator R1 left outer join rowgenerator R2 ON ( R2.row_num = R1.row_num and R2.row_num = 10 )

where R1.row_num = 10

may have had the access plan:" R1<RowGenerator> JMO [ SORT [R2<RowGenerator> ]]". The SORT was unnecessary as all the rows generated by the null-supplying side "R2<RowGenerator> " had R2.row_num equal to 10, hence it was ordered already on R2.row_num column. Now, the plan should be " R1<RowGenerator> JMO [ R2<RowGenerator> ]".

363956 A stored procedure whose definition contained more than 255 characters, would not have been written correctly to the reload.sql file. This problem has been corrected.
363990 The MobiLink server now recognizes the DataDirect 4.2 native Oracle ODBC driver. This driver is required when an Oracle consolidated database uses a character set (eg. JA16SJISTILDE) that is unknown to the wire-protocol ODBC driver.
364006 MobiLink Synchronizations would have failed if the consolidated database was not Adaptive Server Anywhere, and either of the LANG or LC_MESSAGES environment variables was set to something other than en_US. The MobiLink server log would ahve shown the error as follows:

Error: [-10002] ODBC: [DataDirect][ODBC 20101 driver]6008 (ODBC State = 4, Native error code = 0, Column or parameter #3)

This problem has been corrected.

364059 If the server was was shut down in the middle of capturing a workload for the Index Consultant, it could have hung with 100% CPU usage. This has been fixed.

Note that a DBA can determine whether or not capturing is in progress by viewing the server console.

364204 If an application attempted to get the metadata of a result set from a remote query, the remote tables would have had names like vt_1, vt_2, ... instead of the proxy table name. The metadata will now have the proxy table name. As a result, ODBC, OLEDB and JDBC applications can now use this proper metadata information to prepare the correct update/delete statements. For example, if a query selecting a set of rows from a single proxy table was executed in DBISQL, the user would not be able to use the table editing feature in DBISQL because the table name for the result columns would be vt_1 instead of the proxy table name. Now with this fix, users can now edit result sets from a single proxy table using DBISQL.
364205 The "backlog" parameter can now be used with the MobiLink synchronization server for HTTP and HTTPS synchronization streams. This new parameter will indicate the maximum size of the new connection backlog. While the backlog is full, MobiLink will reject all new synchronization requests, causing synchronizations to fail on the client side. The maximum backlog size can be set to any integer value >= 0. By default, the backlog has no maximum size.
364243 Support has been added to MobiLink clients for Basic HTTP authentication to third-party HTTP proxies and servers, as described in RFC 2617. To authenticate to web servers and gateways, the userid and password is specified using the new "http_userid" and "http_password" synchronization parameters. To authenticate to proxy servers, use "http_proxy_userid" and "http_proxy_password".

If a third party HTTP server or proxy requires authentication, but no credentials are supplied, or if the supplied credentials are rejected, the synchronization attempt will fail and an appropriate error will be reported.

With Basic authentication, passwords are included in the HTTP headers in cleartext, so use HTTPS to encrypt the headers and protect the passwords.

Note that Digest authentication, which is also described in RFC 2617, is not currently supported.

364246 A reference to a column not in the GROUP BY list, when made from an IN condition, was not being reportrd as an error.

For example:

select if emp_id in (1) then 0 else 1 endif

from employee

group by state

This problem is now fixed.

364260 The QAnywhere Agent was launching dbmlsync with the user 'ml_qa_user', and the password associated with this user, hard-coded in the connection string. Thus if the default QAnywhere user 'ml_qa_user' was deleted from a message store , the QAnywhere Agent would not have been able to perform message transmission to a MobiLink server. This has been corrected. Now, the QAnywhere Agent launches dbmlsync with the user and password supplied in the command line options "-dbauser" and "-password", in the connection string.
364278 Support for message callbacks has now been added to the ODBC driver. The message handler is installed by calling the SQLSetConnectAttr() function.

For example:

static char mybuff[80];

static int mytype;

// callback for messages

void SQL_CALLBACK my_msgproc(

void * sqlca,

unsigned char msg_type,

long code,

unsigned short len,

char * msg )

{

memcpy( mybuff, msg, len );

mybuff[ len ] = '\0';

mytype = msg_type;

}

// install the message handler for this connection

rc = SQLSetConnectAttr( dbc,

ASA_REGISTER_MESSAGE_CALLBACK,

(SQLPOINTER) &my_msgproc, SQL_IS_POINTER );

Then a SQL statement such as:

Message 'after' type status to client;

will invoke the ODBC client application's message handler.

364347 There are three output files produced by the QAnywhere Agent if the -verbose command line option is specified: qaagent.log, qanycli.mls and dblsn.out. These files contain the output from the qaagent.exe process, the dbmlsync.exe process and dblsn.exe process respectively, and are created in the "start-in" directory of the QAnywhere Agent process when launched on a Windows platform, or the file system root, if the agent was launched on a Windows CE platform. This could have caused problems if it became necessary to output to another location, especially on Windows CE, if the root file system was on a media with very limited space, and the output files needed to be redirected to other media where there was more room.

The fix is the addition of four new command line options for the QAnywhere Client agent (qaagent):

-o <file> log output messages to file. Ex. -o c:\tmp\qaa.out outputs to files c:\tmp\qaa.out, c:\tmp\qaa_sync.out and c:\tmp\qaa_lsn.out

-ot <file> truncate file and log output messages to it. Ex. -ot c:\tmp\qaa.out truncates and outputs to files c:\tmp\qaa.out, c:\tmp\qaa_sync.out and c:\tmp\qaa_lsn.out

-os <size> rename log file to YYMMDDxx.<ext> and start a new file with the original name when log reaches <size> (minimum 10K, cannot use with -on). The value of <ext> depends on the log file being renamed.

-on <size> append .old to the log file name and start a new file with the original name when log reaches <size> (minimum 10K, cannot use with -os)

The QAnywhere Client will log its output to the specified file, The MobiLink Client dbmlsync, will log its output to the file suffixed by "_sync", and MobiLink Listener dblsn, will log its output to the file suffixed by "_lsn".

For example, if "-o c:\tmp\mylog.out" is specified then qaagent will log yo "c:\tmp\mylog.out", dbmlsync will log to "c:\tmp\mylog_sync.out" and dblsn will log to "c:\tmp\mylog_lsn.out".

The extension of the files created when using the -os option depends on the log being renamed. If the QAnywhere Agent log is being renamed, the extension is .qal. If the dbmlsync log is being renamed the extension is .dbs. If the dblsn log is being renamed the extension is .nrl.

If -verbose is specified without specifying -ot or -o, then the pre-fix logs are used: qaagent.log, qanycli.mls and dblsn.log, and -os and -on switches are ignored.

364349 If the MobiLink Synchronization Server encountered an HTTP request larger than 1024 bytes, synchronization would fail. This has been fixed.
364365 When using Interactive SQL dbisql, and connected via the iAnywhere JDBC Driver, if a "FORWARD TO server {...}" statement was executed, where "server" is the name of a Remote Data Access server and the information inside the curly braces "{}" was anything that the remote server understood, it would likely have failed with one of two errors. If the statement sent to the remote server returned a result set, then the error "Remote server does not have the ability to support this statement" would have been given. If the statement sent to the remote server did not return a result set, then dbisql would have complained that the result set had errors. This problem has now been fixed.

Note that this problem does not exist if using dbisql connected via jConnect. Also, if the "FORWARD TO" statement used single quotes instead, then both jConnect and the iAnywhere JDBC Driver will work fine.

364372 Sargable predicates using subqueries were not used for partial index scans in some cases. The sargable predicates having this problem were only the ones referencing at least two different tables from the main query block. An example of such predicate is "T1.col1 = (select max(R.col2) from R where R.col3 = T2.col4)" where T1 and T2 are two tables of the main query block. This has been fixed.

An example:

The sargable predicate " t1.t1_id = (select MIN(t3.t1_id) from t3 where t3.t2_id=t2.t2_id)" can now be used to access the table t1 through a partial index scan on the primary key index "t1". Hence, the query may have the access plan

" t2<seq> JNL t1<t1> : GrByS[ t3<t3> ]" .

create table t1 ( t1_id int primary key);

create table t2 ( t2_id int );

create table t3 ( t1_id int, t2_id int primary key );

select * from t1, t2 on ( t2.t2_id = t1.t1_id +1 )

where t1.t1_id = (select MIN(t3.t1_id) from t3 where t3.t2_id=t2.t2_id)

364378 If an error occurred when positioning a cursor, future fetches would have failed with the error -853 "Cursor not in a valid state". When prefetch was enabled (the default) the specific error when positioning a cursor may not have been returned to the application, with "Cursor not in a valid state" being returned instead.

For example, if a query had a WHERE clause which caused a conversion error, the application may never have received an error stating a conversion error occurred, but would have received the error "Cursor not in a valid state" instead.

This has been fixed so that the initial error, which put the cursor in an invalid state, is now returned to the application.

364379 If an application running on a Unix platform, and using the iAnywhere JDBC Driver, fetched a string with embedded null characters, the resulting string would have been truncated at the first null character. This problem has been fixed.

Note that a similar problem exists for applications running on Windows systems as well. However this problem exists in the ASA ODBC Driver and is addressed by Engineering Case 364608.

364387 When autostarting the database server using the Developer Edition:

1) During the server startup sequence, the Developer Edition splash screen would appear for only a fraction of a second, then disappear. It should remain visible for three seconds, as it does when started manually.

2) The splash screen window would reappear if the system tray icon was used to restore the server window. It should appear only during the startup sequence.

3) The splash screen window was empty. The text did not appear.

These problems have been fixed. The splash screen will now contain the intended text, it will display for three seconds during the startup sequence, and will not reappear.

364397 Developer and Evaluation versions of the MobiLink Synchronization server would have always required the user to manually dismiss the notice dialog. Now the dialog auto-dismisses after several seconds, as the ASA database server does.
364536 When the synchronization parameter "liveness_timeout" was specified for the tcpip synchronization stream, reads would not have timed out, even after the specified interval had expired. This has been fixed.
364540 As of version 9.0.0, java objects in the database are no longer supported. A query of a computed column that referenced a Java object would have failed with an "Invalid type or field reference" error. Now, querying a Java computed column will fail with a "Not Implemented Java Objects" error.
364573 It was not possible to assign an enum value to AsaParameter.Value without an explicit cast. Now when AsaParameter.Value is set to an enum value, the AsaParameter.AsaDbType is set to the underllying type of the enum value (Byte, Int16, UInt16, Int32, UInt32, Int64 or UInt64) and the value is converted to the underlying type.
364608 If an ODBC application running on a Windows system fetched a string with embedded null characters, the resulting string would have been truncated at the first null character. This problem has been fixed.

Note that a similar problem exists for applications running on Unix platforms as well. However this problem exists in the iAnywhere JDBC Driver and is addressed by Engineering Case 364379.

364610 Connecting to a database using Interactive SQL dbisql, and the iAnywhere JDBC Driver, would have set the initial isolation level to 0, instead of the proper isolation level as defined by the database option Isolation_level. Once the connection was made though, changes to the isolation level would have worked fine. This problem has now been fixed.
364680 When processing a single-row GROUP BY query, the server could have crashed if at least one of the aggregate functions had been specified with the DISTINCT qualifier and the hash group-by method had been selected by the query optimizer.

For example, the following query could generate the crash (depending on the access plan selected by the optimizer):

select count( distinct dept_name+'a' )

from ( select distinct dept_name

from department

where dept_id < 1 ) T

This problem has been fixed.

364685 A change has been made to the existing callback support such that when a connection designates a message callback function, it applies only to that connection.
364820 If the font used for displaying result sets was changed, the new font was not applied to those cells which contained NULL values, until dbisql was restarted. Now, the fonts used in those cells are updated immediately.
364826 If a BACKUP statement containing WAIT BEFORE START or WAIT AFTER END was executed by a connection which had uncommitted transactions, the backup would never have completed. Now an error is reported in this situation. The connection should COMMIT or ROLLBACK before executing the BACKUP.
364921 Interactive SQL dbisql could failed with an internal error when rows of a table were selected and then the DELETE key was pressed to delete them. The following conditions had to be true for the error to have occured:

- There must have been more than about 125 rows in the table

- The rows had to have been selected using the keyboard

- The table was scrolled while selecting, past the initial 125 rows

- The "Show multiple result sets" option was OFF.

This problem has been fixed.

In a related issue, if rows were selected, then CTRL+C was pressed to copy them, extra lines of empty values would have been select after the last row. All the table data would have been copied correctly; the error was the addition of the blank rows. This has also been fixed.

364974 When attempting to save a stored procedure or function as a file, the file name would have been written with a file extension of ".sql", regardless of the extension given when "All files (*.*)" was selected in the "Files of Type" combo box. This has been fixed.
365038 If a statement that modified a remote table was executed within a savepoint, no error was given, even though remote savepoints are not supported. Now, if an UPDATE, DELETE or INSERT statement attempts to modify a remote table while inside a savepoint, it will fail with the error "remote savepoints are not supported". Note that remote procedure calls within a savepoint will also fail with this error, as there is a chance the remote procedure will modify tables on the remote database.
365044 When run interactively, Interactive SQL would have set its exit code to 9 (indicating that it could not connect), even if the user explicitly canceled the Connect dialog. This has been fixed so that when run interactively, the exit code is always 0.
365072 Installing ASA 9.0.1 for HP-UX on Itanium from the CD-ROM results in the error:

/usr/lib/hpux32/dld.so: Unable to find library 'libstdc++.so.4'.

This has been fixed and a new CD-ROM is available.

There is also a workaround, create a symbolic link from libstdc++.so.5 to libstdc++.so.4:

ln -s libstdc++.so.5 libstdc++.so.4

This symlink should be removed once the installation has been completed.

365083 If either the MobiLink Synchonization server or the MobiLink client encountered an HTTP header in a request or a reply that was larger than 256 bytes, the synchronization would fail. This has been fixed.
365147 When using the -m command line option (truncate transaction log after checkpoint), if a transaction log file was being actively defragmented or virus scanned at the time a checkpoint occurred, then the server could have failed with assertion 101201. The operating system will not allow the file to be recreated until the virus scan or defragmentation has completed. As a result, the server will now wait and retry the operation several times. A workaround would be to remove the transaction log file from the list of files that are actively scanned or defragmented.
365154 MobiLink clients now support Digest HTTP authentication to third-party HTTP proxies and servers as described in RFC 2617, in addition to Basic authentication. The same synchronization parameters are used to supply the userid and password as for Basic authentication. The HTTP server or proxy configuration determines whether Basic or Digest is used in the "WWW-Authenticate" or "Proxy-Authenticate" HTTP header they send to the client.

The difference between Basic and Digest is that Digest employs various security mechanisms to protect the password and to protect from common types of attacks, while with Basic, the password is sent in clear text. However, HTTPS provides far better security than Digest, so it is recommended that Basic HTTP authentication be used with HTTPS for full security. The only situation where Digest authentication is really useful is when connecting through a client-side proxy which doesn't support HTTPS directly, but requires authentication.

365173 If an ODBC application called SQLGetInfoW() to get the user name or collation sequence from a database using a Multibyte Character Set, then the conversion to UNICODE would likely have been wrong. This problem has been fixed.
365188 If a view was defined with the "WITH CHECK OPTION" clause and had predicates using subqueries, then opening an updatable cursor or executing an UPDATE statement might have caused a server crash. This has been fixed.

For example:

create view products

as select p.* from

prod as p

where p.id =

any(select soi.prod_id from sales_order_items soi KEY JOIN sales_order so

where so.order_date > current date )

with check option

The following INSERT statement would have crashed the server:

insert into products (id) values ( 1001 )

365210 When the QAnywhere Agent was invoked in quiet mode (-q command line option) on Windows CE, the window did not appear in the System Tray. Now, when qaagent is invoked with -q, the window is minimized in the system tray. As well, a new command line option has been added: -qi, which causes the window to be completely hidden (and not appear in the System Tray). This is similar behaviour to the database server.
365223 The MobiLink Synchronization server may displayed a "Protocol error" message and aborted the synchronization, if

- it was running without the command line option -s or with -s n, where n > 1;

- errors occurred during upload of table data;

- the handle_error (hand_odbc_error) script returned 1000; and

- the upload was a transactional upload.

This problem has been fixed.

365330 When an ODBC application retrieved certain metadata values in Unicode, like the column name of a result set column, the returned value could have been truncated. This could have occurred, even though the specified buffer was large enough to hold the Unicode value. It was also probable that no truncation error would have been returned to the application. Both of these problem have now been fixed.
365342 The UltraLite Generator ulgen, could have crashed when generating code that included an index with the same column specified more than once. In some cases, it would run correctly, but then the application that used the generated code would have crashed when executing the query that used an index with the same column specified more than once.

Having a column specified multiple times in an index is not supported by UltraLite (and would not provide any performance benefits anyway). An error message is now displayed and the application exits.

The workaround to this problem is to remove the extra column definitions from the index definition.

365453 Calling a wrapper procedure for a Java class which returned a result set would have leaked memory and could have crashed the server. This has now been fixed.
365457 It was possible for the optimizer to chose a query access plan that did a sequential scan of a base table, even when a suitable and more efficient clustered index was available, resulting in poor performance. This choice was particularly bothersome for reasonably wide range scans, (thousands of rows), over very large tables, (millions of rows). The server now does a better job of costing clustered index scans.
365460 An application that used GetData to retrieve an unbound column on the first row, could have had poor performance, if prefetch was enabled and some, but not all columns, were bound before the first fetch. This poor performance would have been particularly noticeable if the first few rows of the query were expensive to evaluate. Applications which used the iAnywhere JDBC driver, on queries which had columns with type LONG VARCHAR or LONG BINARY, were also affected by this poor performance. This has been fixed.
365465 The redirector for Apache would have truncated HTTP headers that were longer than 128 bytes. This has been fixed.
365466 The redirector for Apache would have forwarded the 'Authorization' header. This has been changed so that the redirector now ignores this header and does not forward it. It is not expected that webservers will run behind the redirector, hence there is no need to forward this Authorization header, which could contain a userid and a password in clear text in the case of Basic authentication.
365480 When running on NetWare systems, if the ASA server failed with a fatal error, the NetWare server would have abended. This has been fixed.
365498 Executing a query that involved a proxy table and the openxml() function, as in the following example:

select * from proxy_test p, (select PKID, C1 from openxml( @varxml, '//testxml/test')

with(PKID int 'PKID', C1 varchar(255) 'C1')) t where p.PKID = t.PKID

could have caused a server crash. This problem has been fixed.

365502 When upgrading Mobilink from version 6.0.x, 7.0.x or 8.0.x, if the consolidated database was Oracle version 8i, the upgrade script would have failedwith the following error:

ERROR at line 1:

ORA-06550: line 1, column 7:

PLS-00905: object FPSADMIN.ML_SCRIPT_UPGRADE is invalid

ORA-06550: line 1, column 7:

PL/SQL: Statement ignored

execute ml_script_upgrade -- failed

The problem is that Oracle 8i does not support the conversion from LONG to CLOB. This has been fixed by using an Oracle provided function TO_LOB() instead.

365508 When used with multiple Java Threads, and Synchronized Java Methods, Java Stored Procedures could have produced unexpected results. This has niw been fixed.
365537 When rebuilding a database with the Unload utility dbunload, and using the command line options -an or ar along with the -ap option, a START connection parameter in an ODBC data source was ignored, if the connection string contained a DSN parameter and no START parameter. This problem has been fixed
365603 Making an RPC call, or executing a FORWARD TO statement, may have failed to return a result set, even though one was returned by the remote server. Note that this problem only happened when the Remote Data Access class was either ASAJDBC or ASEJDBC. This has been corrected.
365688 Enhance dbltm to allow stored procedures written in Watcom SQL to be sent correctly to Replication Server.
365707 The JOIN MERGE FULL OUTER join method was not considered by the optimizer during optimization of queries using FULL OUTER JOINs. This has been fixed.
365730 If a server attempted to start what appeared to be a valid database file, and the database failed to start for any reason, then unexpected behavior could have occurred on future requests to the same server. The unexpected behavior could have included server crashes, assertions, and possibly database corruption. This has been fixed.
365731 When a dialog was opened from another dialog (rather than from the main window), closing the topmost dialog would have returned focus to the main window, instead of the initial dialog. This has been corrected.
365797 The changes for Engineering Case 364610 prevented the Interactive SQL utility dbisql, when using the iAnywhere JDBC driver, from connecting to the utility database. This is now fixed. Note, this was not a problem when connecting via jConnect.
365837 After completing an Index Consultant analysis, if the 'Requests' pane of the analysis was selected and a particular statement was viewed, the server would have appeared to be hung at 100% CPU usage. This only occurred when there were a large number (many thousands) of captured SQL statements. It was also more likely to occur when the captured SQL statement strings were very similar to each other, or were very long. The server was not actually hung, and would have eventually displayed the details for the request, although this would have taken an inordinate amount of time. This has been corrected.
365928 When rebuilding a databse with the Unload utility dbunload and using the -ar or -an command line options, if the original database had page checksums enabled, the new database would not have had page checksums enabled. This has been fixed.
365929 An UltraLite application would have crashed on the final step of the following sequence:

- Execute a query that contains a temp table

- Suspend and close the connection

- Re-connect to the database

- Apply a new schema file

This has been fixed.

365938 A crash in the UltraLite runtime libraries would have occurred if the "page_size" connection parameter was specified with a value that did not match the database being opened, or if you a database with 2Kb pages was opened without specifying "page_size=2k". Now, the page_size parameter (or lack of it) is ignored if the database already exists.
365940 If the trantest sample application (PerformanceTransaction), was executed with -a odbc -n <threadcount> and the thread count was higher than one it may have crashed in NTDLL.DLL. This has been fixed.
365953 If a user-defined function contained a COMMIT, calling the function in a SELECT statement within a batch or procedure would have caused the cursor for the batch or procedure to be closed if the cursor was not declared WITH HOLD. This may have resulted in unexpected error messages like "Column '@var' not found". Now these cursors will not be closed.
365955 On Windows CE, the C++ API method QATextMessage.readText(string, length) returned the number of qa_char's read, including the null terminator, when there were fewer qa_char's available than the number requested. This problem has been fixed. The method now returns the number of non-null qa_char's read, as documented.
366062 Incorrect results could have been generated by UltraLite Dynamic SQL when there existed a DISTINCT clause, a join of tables in the FROM clause, and there are no group-by expressions in the select list, for at least one of the tables.

For example:

SELECT DISTINCT b.key FROM tab_a a, tab_b b WHERE a.column = b.key

This situation requires a temporary table which will now be generated.

366096 A call to the RANK(), DENSE_RANK(), PERCENT_RANK(), or CUME_DIST() functions now reports error -154 : "Wrong number of parameters to function", when called with an argument. Previously, the error -134 : "Feature not implemented", would have been given.
366099 Expand explanation on Message property of database in doc set
366150 The server could have become deadlocked when executing the system procedure sa_locks. For this to have occurred, two connections must have been issuing sa_locks calls concurrently, or the user definition for the owning connection was not in cache, which is not a likely occurence. This problem has been fixed.
366155 When the Listener utility was started with the -t command line option, (enable or disable remote tracking for a remote database), without using a -x option for device tracking, the -t option would have been silently ignored. This behavior has been changed so that the listener will no longer start up, but will instead fail with an error.
366167 Database recovery could have failed when mixing Transact-SQL and Watcom SQL dialects for Create/Drop table statements. This has been fixed. The following example could have caused database recovery to fail if the server crashed before the next checkpoint.

create global temporary table #test (col1 int, col2 int);

drop table #test;

create global temporary table #test (col1 int, col2 int);

drop table #test;

A workaround is to only use #table_name for creation of local temporary tables.

366170 When using an Oracle stored procedure to insert multiple rows with a multiple row array, the version 4.20.00.28 iAnywhere Solutions Oracle WP driver would fail with the error

"ORA-01460: unimplemented or unreasonable conversion requested (ODBC State = HY000, Native error code = 1460)". Single row inserts worked fine. This only affected Windows systems, and has been fixed in version 4.20.00.81(B0067,U0062) of the driver.

The following files have been updated:

wqora19.dll

wqora19r.dll

wqora19s.dll

wqicu19.dlll

In the DSN setting, the option "Procedure Returns Results" must be selected.

366233 If a stored procedure contained a statement that performed a sequential scan of a global temporary table, executing the statement could have caused the server to crash. This problem would have occurred if the following conditions held:

- The statement plan was cached

- The table was declared as "ON COMMIT DELETE ROWS"

- The table had more than 100 pages when the plan was cached

- COMMIT was called before the statement was executed

This problem has been fixed. The crash could be avoided by setting the option 'Max_plans_cached' to 0.

366267 When the database option Ansi_close_cursors_on_rollback was set to 'ON', the Validation utility dbvalid would have failed to validate all the tables in the database. The error 'cursor not open' would have been displayed. This has been fixed.
366282 The CREATE SCHEMA statement was not being logged correctly in the transaction log if it contained at least one CREATE VIEW statement. The statement logged was the last CREATE VIEW statement, instead of the entire CREATE SCHEMA statement. As a consequence, the CREATE SCHEMA statement was not recoverable. Also, recovery could have failed with a "Failed to redo an operation" assertion, if the logged CREATE VIEW statement could not have been executed, e.g., because it referred to a table created within the original CREATE SCHEMA statement. This problem has been resolved.
366292 If a database created with version 6, 7 or 8 software, was upgraded using the Upgrade utility dbupgrad, or by executing the ALTER DATABASE UPGRADE statement, then the resulting reload.sql script generated by the Unload utility dbunload, would have contained a CREATE PROCEDURE statement for sa_proc_debug_detach_from_connection which would have failed. This has been fixed.

Workarounds include dropping the procedure after the upgrade, or simply not performing the upgrade (since it should be unnecessary).

366293 Static C++ applications, running on Palm devices, may have had data truncated from the beginning of values fetched from the database. The amount missing depended on which column was fetched. The first column was always fetched properly. This has been fixed.
366362 If a result set returned a LONG VARCHAR or LONG BINARY column, and one of the values of that column was empty, then retrieving that empty result would have caused the iAnywhere JDBC driver to leak memory. This problem has been fixed.
366364 Database validation, using either the Validation utility dbvalid, or executinmg the VALIDATE DATABASE statement, could have failed to detect some corrupted LONG VARCHAR columns. Assertion 202000 is now generated when a corrupted LONG VARCHAR is encountered.
366375 When evaluating the use of an index to satisfy a range predicate on a table that was occupying a large fraction of the server cache, the query optimizer could have failed to make use of the index, resulting in poor query access plans. This problem has been resolved.
366401 Rebuilding databases on Unix systems, using the Unload utility dbunload with the -ar or -an command line options, would have failed during the rebuild operation, if the source database had table or row constraints that specified stored procedures. This has been fixed.
366422 If a procedure had a subquery that involved a remote table, and if that subquery generated a warning, then the server would have incorrectly given an error rather than returned the result of the subquery.

For example:

SET @c = (SELECT count(*) FROM t)

where t is a remote table. In this case, if the table t was empty, then a NOT FOUND warning would have been generated when the subquery was evaluated and instead of setting the variable @c to 0, the server would have returned the error "ASA Error -823: OMNI cannot handle expressions involving remote tables inside stored procedures ".

This problem has now been fixed.

366428 The AsaCommandBuilder class could not have generated INSERT, UPDATE or DELETE statements for parameterized queries if the parameters were not provided. Now, if the command is a stored procedure, the AsaClient will call AsaCommandBuilder.DeriveParameters to add parameters for the SELECT command. If the command is text, the AsaClient will add some dummy parameters.
366503 When using the .NET scripting, Character fields moving to or from the database may have been corrupted if they contained non-ascii characters. These fields will now be bound as Unicode. Current user code can remain unchanged and should continue to work.
366510 The quality of access plans chosen for queries with joins to tables with few rows, that can make use of indexes, has been improved.
366532 Computed columns with JAVA expressions may have be incorrectly parsed, causing the error: "ASA Error -94: Invalid type or field reference". This problem occurred if the computed column belonged to a table B, and there existed another table A, used in the same statement, having a column with the same name as the JAVA class name. This has been fixed.

For example:

The following query returned the error "ASA Error -94: Invalid type or field reference":

select * FROM A WHERE A.ID NOT IN ( SELECT B.ID FROM B );

Table B has the computed column "EntityAddressId" referencing the JAVA class "Address", and table A has a base table column named "Address". Note that the computed column doesn't have to be referenced in the query.

CREATE TABLE A

(

ID int,

"Address" varchar (10)

);

CREATE TABLE B

(

ID int,

"EntityAddressId" numeric(10,0) NULL COMPUTE (Address >> FindAddress(0, '/', 0)),

);

366552 When making a remote procedure call to a remote server whose class was either ASAJDBC or ASEJDBC, if the remote procedure was a Transact-SQL procedure, with either an INOUT or OUT argument that returned a result set, then it was likely that the rows in the result set will not have been returned. The INOUT or OUT parameters were incorrectly being fetched first, prior to fetching the result set. In JDBC, fetching the value of an OUT or INOUT parameter will close all result sets. Now the values of OUT or INOUT parameters are fetched only when the procedure has completed execution.
366562 If the subsume_row_locks option is on and a table T is locked exclusively, the server should not obtain row locks for the individual rows in T when executing an UPDATE. This was not the case if T was updated through a join (or if T had triggers, computed columns, etc.), or if T was modified via a keyset cursor. Now, no locks are aquired in this situation.
366568 If MobiLink Server was the only component selected for installation, the licensing utility dblic.exe was not installed and the MobiLink Server could not have been re-licensed after installation. This has been fixed.
366574 Queries specifying the "TOP n" clause, that were optimized with the Optimization_goal set to "all-rows" may have had a less than optimal access plan. Such queries are now costed based on the estimated cost to produce first n rows instead of using the estimated total cost.
366682 A query that satisfied the following conditions would have incorrectly failed with the error "Invalid use of an aggregate function":

- it used an ANY, ALL, IN, or NOT IN subquery

- the subquery used a grouped derived table or view

- the derived table or view aliased an aggregate function

- the alias was used in another column of the derived table or view

For example:

select 1

where 1 not in ( select b from (select sum(1) as b, b + 1 as c) dt )

This problem has now been fixed.

366705 A user-defined data type can now be renamed using:

ALTER {DOMAIN | DATATYPE} usertype RENAME newname

The name of the user type is updated in SYSUSERTYPE.

Note that any procedures, triggers, views or events which refer to the user data type must be recreated, as they will continue to refer to the old name. Renaming of Java data types is not permitted.

366752 If a CREATE UNIQUE INDEX statement was executed for a local temporary table, a subsequent ROLLBACK could have caused the server to fail with assertion 100705. The CREATE INDEX statement was not performing an automatic COMMIT, now it does. A workaround is to execute an explicit COMMIT prior to the CREATE INDEX statement.

Note, If the temporary table was created without ON COMMIT PRESERVE ROWS and the table was non-empty, execution of the CREATE INDEX statement will now delete all of the rows in the table, because of the added commit. Due to the addition of the commit, a CREATE INDEX on a local temporary table can no longer be used in a trigger or within an atomic compound statement. will release any locks held by the connection, and will close cursors not opened WITH HOLD.

366763 A new "Derived Table" node is now shown in query execution plans. In the graphical plan, these nodes show the name of the derived table and list of columns that are actually computed.

The derived table nodes appear where a derived table or view appeared in the query text and was not combined with the rest of the query by "flattening". Also, these derived table nodes appear where the query processor generates a derived table, for example as input to a UNION, INTERSECT, or EXCEPT.

The following query has three Derived table nodes in the graphical plan. One is associated with 'MyDerivedTable', which was specified in the query. Two others are generated for the inputs of the UNION. The derived table nodes can be used to find the expressions used as input to the UNION.

select emp_id from employee

union all

select dept_id from ( select top 5 dept_id from department order by dept_name desc ) MyDerivedTable

366765 Attempting to delete a user with one or more subscriptions, when connected to an Oracle database using the "iAnywhere Solutions 9 - Oracle Wire Protocol" ODBC driver, would have failed to delete the user. The problem was that the rows in ml_subscription were not being deleted before the row in ml_user. This has now been fixed.
366920 Calling the DATEPART() function, with the date-part CalWeekOfYear, would have returned the wrong week number if the year started with a Friday, Saturday or Sunday and the day of the date-expression passed was a Sunday, but not the very first one. For example: DATEPART( cwk, '2005/01/09' ) would have incorrectly returned 2 instead 1. This has now been fixed.
366930 It was possible to get a schema file into a state where creating a foreign key was not possible. In the Schema Painter, attempting to create a foreign key would have resulted in the error: SQLCODE -113 Column in foreign key has a different definition than primary key, even though the domains of the columns appeared to be the same. This problem occurred when the domain for the column did not have a size, or precision and scale, thus making the domain_info irrelevant when checking for column compatibility in foreign key creation. Now, if the column type does not take a size, or precision and scale, the domain_info is not compared.

A work around is to convert the database schema definition from USM to XML, and back again:

ulxml.exe -toxml schema.usm schema.xml

rename schema.usm schema_old.usm

ulxml.exe -tousm schema.xml schema.usm

The new schema.usm will then allow creating a foreign key.

366969 Ultralite Dynamic SQL did not diagnose a duplicate name for a foreign key (within a table). It would have failed without an error code being set. This has been corrected.
366983 When using the debugger in Sybase Central to debug a Java class with Java object local variables, a NullPointer Exception would have been thrown, when stopped at a breakpoint, if a local variable was NULL. This has been fixed.
367116 Executing a LOCK TABLE ... IN EXCLUSIVE MODE statement on a table did not prevent other transactions from subsequently obtaining exclusive locks on rows in the table when executing INSERT ... ON EXISTING UPDATE statements. Although it would have prevented explicit UPDATE statements from subsequently updating rows. This could have resulted in applications deadlocking unexpectedly. This has been fixed.
367160 Ultralite Dynamic SQL would have erroneously reported an overflow error for integers larger than 2147483647. A problem computing the precision correctly has been fixed.
367198 In some very rare cases, an UltraLite application may have marked a column as a primary key, as well as an index column, thus causing the MobiLink server to crash when the application synchronized. This problem has been fixed. Now, the MobiLink server will give a protocol error when this situation is detected. To avoid the protocol error, the table will need to be dropped and recreated.
367221 When selecting from a single proxy table, the rowcount value returned by the server was incorrectly always 1, instead of -1. As a result, applications which rely on the rowcount information would have assumed that the query only had a single row in the result set. Returning a rowcount of -1 tells the application that the rowcount information is an estimate only and should not be relied upon. Note that after this fix, the rowcount for remote queries will always be -1 even if the ROW_COUNTS option is set.
367222 LDAP functionality had been inadvertently removed from both the server and client software. As a result, the LDAP TCPIP parameter would not have been recognized, and connection attempts would not have tried LDAP. This functionality has now been restored.
367232 If a database created with the UTF8 collation, had a column that contained a 5 or 6 byte Chinese character sequence, ODBC client applications would likely have crashed fetching the column. This has been fixed.

This problem was introduced by the changes for Engineering Case 364608.

367252 If the get_identity() function was used to allocate an identity value for a table, but the table itself was not modified by the current connection, or any other connection, then the value of the SYSCOLUMN.max_identity column was not updated at the next checkpoint. If the database was shutdown and restarted, get_identity() would then have re-used values previously generated. This has been fixed.

Note that the use of an empty table having an autoincrement column, together with get_identity(), may still have resulted in values being re-used if the database was not shut down cleanly and values were allocated since the last checkpoint. Depending on how the values were used, it may have been possible to correct the starting value in a DatabaseStart event by calling sa_reset_identity() with the next value to use. For example:

declare maxval unsigned bigint;

set maxval = (select max(othercol) from othertab);

call sa_reset_identity('IDGenTab', 'DBA', maxval);

367267 When using CREATE INDEX, Ultralite Dynamic SQL could have created an invalid index, if one or more of the columns being indexed were already used in another index. This problem has been corrected.
367312 When run on Unix platforms, the SMTP message link for the ASA Message Agent dbremote, would have started and then reported "Execution Complete", with no errors. This was due to dbremote attempting to load the library libdbencode9_r.so, rather than the correct library libdbencod9_r.so. Now dbremote loads the correct library. A work around is to create the following symbolic in the $ASANY9/lib directory: "ln -s libdbencod9_r.so libdbencode9_r.so".

Note, this problem also affected the SMTP message link for the ASE Message Agent ssremote, on Unix platforms.

367331 In rare circumstances, it is possible for database corruption to occur if the machine running the database server was put into suspend or hibernate mode, while the server was still running. This has now been fixed for the majority of cases. It still possible on very heavily loaded servers, as the OS may suspend the machine while the server is still preparing for it.
367337 Attempting to get the application information of a jConnect or Open Client application, using SELECT CONNECTION_PROPERTY( 'APPINFO', ... ), would have always returned NULL for APPINFO. Now, the server will attempt to display the application name, the application host and the application PID, if that information has previously been provided by the application at connect time. It should be noted that in some cases, the application information provided by the client is not completely accurate; however, the server will still display the inaccurate information.
367342 If the first byte of the DELIMITED BY string for a LOAD TABLE statement was greater than or equal to 0x80, the LOAD TABLE statement would not have recognized any delimiters in the input file. This is now fixed.
367366 If a Remote Data Access server was created in a database to connect back to the same database, then creating proxy tables would have hung the server. This problem was originally addressed in ASA 7.0.0, but subsequent changes necessitated a different fix. Now, the error "Unable to connect, server definition is circular", (SQLCODE -657), will be generated, but only for ODBC connections. JDBC connections will still have problems.
367378 The server could have become hung in an endless loop while performing a sort. When in this loop, the server would not have responded to the cancel request. For the problem to have occurred, a sort must have been performed with a small amount of memory available to the connection, followed by a decrease in the amount of available memory. The problem could have occurred even with large cache sizes, if a child of the sort consumed most, but not all, of the connection's allotted memory. Extra checks have now been added for out-of-memory situations when sorting.
367396 Ultralite Dynamic SQL would have failed with a conversion error, when attempting to convert character strings to and from LONGVARCHAR columns, and binary values to and from LONGBINARY columns. This problem has been corrected
367451 If a Remote Data Access server was created in a database to connect back to the same database, then creating proxy tables would have hung the server. This is a followup to Engineering Case 367366, which resolved the problem with circular ODBC connections. Now, the error "Unable to connect, server definition is circular", (SQLCODE -657), will be generated for circular JDBC connections as well.
367456 If a web client made an HTTP or HTTPS connection to a the database server, it could have caused other connections to hang, until the HTTP or HTTPS connection either completed, or was killed. This now has been fixed.
367464 The ASACommandBuilder class could not derive parameters if the stored procedure name was quoted. Fixed by parsing the command text and using an unquoted procedure name for deriving parameters.
367470 In the "Backup Database" wizard, the "Browse" button on the third page allows an existing file to be chosen, or to provide the name of a new file. If a new file name was provided, but without an extension, the value of the file name text field in the wizard would have ended in ".*" -- which was wrong. Now, the name typed is copied to the text field verbatim.
367528 Autodial was not responding, even when the network_name parameter was specified. Autodial functionality has now been restored.
367533 The server could have crashed when requested to generate an access plan for a remote query, either by the dbisql plan feature, or an explicit call to the explanation() function, when that query would have been executed in full passthrough mode. An example of such a query is 'INSERT INTO T VALUES(2)' where T is a proxy table. The server will now return no plans for such queries.
367549 The Interactive SQL utility dbisql, could have displayed the wrong table's data when launched from Sybase Central. This would have happened if the "View Data in Interactive SQL" menu item for a table had previously been clicked, and the resulting Interactive SQL window was left open. When trying to view the data for a different table, the new Interactive SQL window showed the data for the previous table, not the one selected. This has now been fixed.
367550 With the collation 874THAIBIN, the Thai digits (0xF0-0xF9) would have compared and sorted equal to their ASCII equivalents (0-9). The Thai digits will now sort with the other Thai characters, in binary order.
367568 Collation 1252NOR has been added to provide Norwegian ordering and comparisons for Windows Code Page 1252. When creating a new database on Windows systems using the cp1252 codepage, if no collation is specified, and the language setting for the system is Norwegian (or the environment variable ASLANG is set to "no"), then 1252NOR will be chosen. Previously, 1252LATIN1 would have been chosen.
367630 When notifying a SIS Listener with SMS listening from Rogers AT&T enabled, the Notifier would have given an error that the network_provider_id=ROGERS was not recognized. This was due to Rogers having recently changed their network provider id from 'ROGERS AT&T' to 'ROGERS'. A fix has been made so that newly created ASA consolidated databases, or new MobiLink installs for other consolidates, will contain the new network_provider_id 'ROGERS'. Existing databases can be updated by the following work around:

- Stop MobiLink and thus stop the Notifier.

- Use the MobiLink plugin to update the network_provider_id from 'ROGERS AT&T' to 'ROGERS'.

- Restart the MobiLink Server with the notifier.

367661 Executing an INSERT ... ON EXISTING UPDATE statement could have caused a deadlock in the server, if another transaction was updating the table that was being modified, and a checkpoint (or DDL statement) was pending. This has been fixed.
367663 The server could have failed to drop a temporary table on a database opened read-only. This would only have occurred if the temporary table was declared using Transact-SQL syntax, (ie "#table_name"). This has been fixed.
367688 Support for textual options to the Transact-SQL statement SET TRANSACTION ISOLATION LEVEL, have been added for compatibility with Sybase ASE and Microsoft SQL Server. Applications can now issue the following variants:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

which correspond to setting the isolation level of the connection to 0, 1, 2, or 3 respectively.

367689 When running on NetWare systems, executing complex queries could have caused the server to abend with CPU Hog Timeout. This has been fixed by adding more yields, and checks for stack overflows, in the optimizer.
367691 On AIX systems running version 4.3.1, applications, including the ASA utilities such as dblocate, would have failed to find any network servers over TCP/IP, if the host=xxx parameter was not specified. Code specific to AIX 4.3.1 to find the broadcast mask was incorrect. This has now been fixed.
367695 If queries that required temporary tables were used, and then a schema upgrade was done, it was possible that a crash could have occurred when these queries were then run after the upgrade. A crash would not have occurred if the database was restarted after the schema upgrade. Temporary table structures were not being preserved across a schema upgrade. They are now restored at the end of the schema upgrade.
367716 The userid 'dbo' was unable to use EXECUTE IMMEDIATE to execute a string containing a multi-statement batch. This restriction has now been removed.
367733 Ability to get the port number of the server inside of the engine ia sa_eng_properties system procedure
367742 When Sybase Central was connected to a database using the iAnywhere JDBC driver, and a database error occurred, it would have been treated internally as a closed connection. The error would not have been reported though, as there really were no closed connections. This has been fixed.
367743 Attempting to use a view that referenced a proxy table, and contained a subselect which used an aggregate function, would have failed with the error "invalid use of an aggregate function". This has now been fixed.
367764 If the consolidated and remote databases had different collations, the MobiLink Synchronization server may not have respected the column width defined in the remote database for columns defined with char or varchar datatypes. This may have caused the ASA client to crash. Now, the MobiLink server will display an error, and abort the synchronization, if the length of the column value is greater than the column width defined in the remote database.
367863 If the EXECUTE IMMEDIATE statement was used to perform a CALL containing variables as procedure arguments, the parameter values would have failed to be passed to the called procedure. If the procedure contained OUTPUT parameters, the output variables would not be set when the procedure returned, or a "variable not found" error would have been reported. This has been fixed.
367886 Attempting to use the Proxy Table wizard to create a proxy table for a remote table that contained a column type not supported by Adaptive Server Anywhere, would have caused Sybase Central to display an internal error. Now, if an unsupported column type is encountered, the wizard restricts the selection of only those columns that are supported.
367913 On systems rinning Windows 95, 98, or ME, with the LDAP feature in use, the database server would have registered the invalid IP address "0.0.0.0" in LDAP, as well as the real machine's address. The list of IP addresses from these versions of Windows includes 0 (i.e. 0.0.0.0). This address is now ignored when creating the list for LDAP.
367932 Ultralite Dynamic SQL would have failed to prepare a CREATE TABLE statement when one of the columns contained a partition size with a global autoincrement default.

For example:

CREATE TABLE tab (

rowid int not null primary key,

col_a int default global autoincrement( 10000 )

)

This has now been fixed.

367935 When run on Unix systems, the server could have crashed when a non-DBA user was connected, if auditing was enabled. This has been fixed.
367936 Predicates of the form "constant IS NULL" may have been incorrectly evaluated as FALSE, for special constants such as "CURRENT REMOTE USER" or "CURRENT PUBLISHER". This has been fixed.
367965 On Unix systems, the Data Source utility dbdsn uses the ODBCINI, ODBC_INI, ODBCHOME, and HOME environment variables when trying to find the .odbc.ini file, but if no such file was found, it was always created in the user's home directory. This has been fixed - the environment variables listed above will now be useed when creating the file.
368015 The following changes have been made to generate correct values and foreign names in the output SQL stream:

1. UltraLite tables with TIME columns that defaulted to CURRENT TIME, or a specific date, was incorrectly generated.

2. A uniqueidentifier column that defaulted to NEWID was incorrectly generated as new_uuid.

3. Foreign key names were not being output in the ALTER TABLE ADD FOREIGN KEY statement.

368023 Attempting to run dbconsol.nlm and connect to a server would have caused an abend. This has been fixed.

NOTE: 6.x versions of dbconsol on all platforms fail to connect to servers after version 9.0.0 1223. This is still the case, and there is no workaround.

368053 If a client application terminated while the last connection to the server was in the process of being disconnected, the server may not have autostopped when it should. In these cases, the server icon and window would still have been active, and the database would have been stopped, but no connections could have been made to the server. Pressing shutdown would have stopped the server though. This problem has now been corrected.

Note, this scenario could have occurred in a multithreaded application if all of the following conditions were true:

- the server was autostarted by a multithreaded application

- the main thread of the application signaled a child thread to shut down

- the child thread did a disconnect as part of shutting down

- the main thread did not wait for the child thread to complete before ending

This has been fixed so that the server will correctly autostop.

368116 If a stored procedure which returned a result set was called from within an atomic compound statement (i.e. BEGIN ATOMIC ... END), an error was correctly given, however, an assertion would result when the database was stopped, (Assertion 104301 - Attempt to free a user descriptor with non-zero reference count). This is fixed, the database will now shut down correctly.
368127 If a remote server was created using one of the Remote Data Access ODBC classes, opening a cursor on a proxy tables from that server would have leaked about 8 bytes of memory for each remote column. Memory allocated at cursor open time, to hold the indicator for each column, is now freed when the cursor is closed.
368160 Installing UltraLite .Net would have failed, if Visual Studio .NET 2005 (8.0) beta was already installed. Now the installer checks, and only installs the UltraLite.NET IDE integration component in the latest 7.x version of Visual Studio .NET. For example if Visual Studio .NET 2005 beta (8.0), Visual Studio .NET 2003 (7.1) and Visual Studio .NET (7.0) are installed, the UltraLite.NET IDE integration component will only be installed in Visual Studio .NET 2003 (7.1) .
368164 The Database Tools library has been reduced in size by approximately 272K.
368167 When computing string functions that result in strings with lengths greater than the maximum allowed size of 2GB, the server could have wasted resources. As an example, the following code caused the server to compute a 24GB string before discarding the extra 22GB.

begin

declare foo long varchar;

set foo = 'ABCDabcd';

set foo = repeat( foo, 49152);

set foo = repeat( foo, 65536);

end;

The server will now stop the computation after the maximum allowed size of 2GB has been reached.

368168 Error messages returned to applications connected to the server via TDS ( e.g. connections using jConnect ), would have been mangled when the OS character set and the client character set were different. The problem was caused by the header of the TDS error message having been mistakenly created in the OS character set, while the main body of the error message was in the client character set. The header is now also created in the client character set.
368170 When executing a READ statement with parameters, if the file being executed did not contain a PARAMETERS statement, but contained an identifier within braces, dbisql could have reported an internal error. This has been fixed.
368231 Executing an ALTER VIEW statement with a select statement that would have returned the warning "The result returned is non-deterministic." would have crashed the server. This has been fixed.
368236 In rare circumstances, if a database which required recovery was autostarted, the server could hang with the server window still minimized. One situation where this could have occurred was when the database had a "disconnect" event. A workaround is to start the database manually first to allow the database to recover, and then shutdown this engine.

This issue has been fixed.

368249 In complex queries, if the optimizer found an expression (prefilter) that evaluated to FALSE, the optimization time may have been long. This has been fixed.
368251 The server would have failed to return the result set under certain circumstances. One such situation was when the option Row_counts was set to 'ON' and the query access plan had an indexed sort node at the top. This problem has now been fixed.
368274 It was possible for the server to drop TLS connections, when under heavy load. Although rare, it was more likely to occur on a multi-processor machine. If the -z command line option, ("display debugging information"), was used on the server, a message indicating that a bad packet was received would have been displayed on the server console. This has been fixed.
368348 Starting dbisql with the "-f" command line option to load a graphical plan file, could have caused it to hang on startup. The symptom was that the splash screen would open, but not close, and the main window would not open. This problem has now been fixed.
368382 The QAnywhere Agent Stop utility, qastop, would have returned before the agent had terminated. This has been fixed, qastop now waits for the qaagent process to finish before

returning. This allows more reliable control over starting and stopping the QAnywhere

Agent under program control.

368388 When the QAnywhere Agent was run on Windows CE systems with "automatic" policy, and was idle without any messages having been sent or received, subsequent messages would sometimes appear to be blocked due to the QAnywhere Agent not transmiting the message, even though the device was connected to a network. The problem could usually be worked around by shutting down the QAnywhere Agent, and restarting it while in network coverage. This has been fixed. Now, messages are sent as needed, with automatic policy.
368459 A database used as the Replication Server stable queue database could not have been upgraded or unloaded. The RepServer system procedures were no longer executable by rs_systabgroup. This has been fixed.
368475 Very occasionally, dbisql could have reported an internal error (NullPointerException) when scrolling down in the "Results" pane. This has been fixed.
368540 When used in Java Stored Procedures, cursors and prepared statements were left open until the connection disconnected. If called repeatedly, they could accumulate until a "resource governor exceeded error" occured. This has been fixed.
368551 The server could have crashed when executing Java code. This has been fixed.
368574 The execution of a SELECT statement containing JOINs of several tables by applications using the OLEDB provider ASAProv, would have resulted in a memory leak. This has been fixed.
368616 Complex grouped queries, using aliases in subqueries, may have returned incorrect results. This has been fixed.
368825 If a datasource name was specified on the command line that contained an encrypted password, dbisql would not have immediately connected to the database, but would have first displayed the "Connect" dialog. Now an attempt is made to connect immediately, without first displaying the "Connect" dialog.
368857 If a hash join was performed when the server had a very small cache, an incorrect row could be returned. Subsequent fetches would then have failed with the error:

-853 "Cursor not in a valid state"

This has been fixed.

368951 ASA901.1922. Error -946 "result set not permitted" only when using dbisql with iAnywhere jdbc driver. Ok if the dbisql connection uses Jconnect (option checked in advanced tab).
368995 If a procedure contained a query that call the OPENXML() function, and the xpath expression was passed as a variable argument, the error "Feature 'OPENXML with non-constant query' not implemented" would have been reported reported on the 11th call. This has now been fixed.
369013 The connection properties IndAdd and IndLookup were always returning the value 0. This has been fixed. Note that the corresponding database properties returned the correct values.
369016 When an application using the OLEDB driver provided a DBTYPE_DECIMAL parameter with over 15 digits, the most significant digits would have been lost. For example, if the value 1234567890.123456 was provided as a DBTYPE_DECIMAL parameter, this would have been incorrectly interpreted as 234567890.123456 (the leading 1 would be lost). In particular, this could affect Visual Basic applications using an OleDbDataAdapter on a query with a numeric or decimal typed column, and a generated DataSet. The problem has now been fixed.
369030 If ulisql utility was configured to fetch all data for each column (i.e. not truncate values), attempting to execute a DDL statement after executing a query, would have resulted in the error 揂 schema upgrade is not currently allowed�. This has been fixed.
369054 Under some conditions when the results of a sort did not fit entirely in memory, the sort could have returned rows that were only partially ordered. This has been fixed.
369072 When using the OLEDB provider ASAProv, String parameters may not have been passed correctly to stored procedures. This problem has been fixed.

The following Visual Basic example calls a stored procedure with a String parameter.

Dim sendParam1 As String

sendParam1 = "20040927120000"

Dim cmd As ADODB.Command

cmd = New ADODB.Command

With cmd

.CommandText = "testproc1"

.CommandType = ADODB.CommandTypeEnum.adCmdStoredProc

.ActiveConnection = myConn

.Prepared = True

.Parameters(0).Value = sendParam1

Call .Execute()

End With

An example of a stored procedure follows.

ALTER PROCEDURE "DBA"."testproc1" (in param1 varchar(30))

BEGIN

message 'in Parameter [' + param1 + ']';

END

369122 The server may have exhibited poor performance if many connections try to concurrently truncate a global temporary table. This was due to each connection attempting to acquire an exclusive lock on the global temporary table definition. Since each connection

already has a pointer to the table definition, acquiring an exclusive lock is no longer done.

369145 When launched from Sybase Central, dbisql would have connected to the wrong database, if Sybase Central was connected to two (or more) databases and a dbisql session had already been opened and was connected to one of the databases. Subsequent attempts to launch dbisql from Sybase Central would have always connected to whatever database the initial dbisql session was connected. Now, dbisql will reliably connect to the appropriate database.
369150 If the server command line passed to the Spawn utility dbspawn contained the @filename option, dbspawn would have expanded the contents of the file and then spawned the server. This meant that the server command line would have included the contents of the file. If the file contained certificate passwords or database encryption keys, they would then be visible through the 'ps' command or equivalent. This has been changed, dbspawn will no longer expand the @filename parameter.
369170 When connected via jConnect, dbisql could have incorrectly reported that the connection to the server was lost if a statement which caused a data conversion error was executed, e.g. "select STRTOUUID ('12345678-1234-5678-9012-123456789012')".

Now, the data conversion error will be reported, but an error that the connection has been closed will not.

369234 The server may have occasionally appeared to temporarily hang with CPU usage at 100%. This would have occurred when there were only a few pages of the server's cache available for reuse. The server would have continually reused these few pages rather than immediately grow the cache. This problem has been corrected.
369238 If the schema of a table outside of a publication was altered (for example, table "t1"), and a synchronizing table existed, whose name started with this table's name (for example, table "t1_synch"), that had outstanding changes to synchronize, then dbmlsync would incorrectly report that the schema of the synchronizing table had been altered outside of synchronization. This has now been fixed.
369272 A call to IRowsetChange::InsertRow() in the OLEDB provider, ASAProv, results in a crash. This call can be made from C++ using a simple table insert:

CTable<CAccessor<CSimpleAccessor> > dbSimple;

hr = dbSimple.Insert(1);

This problem has been fixed.

369273 When used in Ultralite Dynamic SQL the SWITCH-CASE expression could have caused memory to be over-written. This has now been fixed.
369275 Executing a query that used two or more derived tables which each called the OPENXML function, one of which contained an illegal XPATH expression, could have caused the server to crash. This has been fixed.
369278 The stored procedure sp_jdbc_stored_procedures is used by jConnect to retrieve stored proc metadata. Unfortunately the definition of the stored procedure was incorrect and the PROCEDURE_TYPE column of the metadata result set was returning whether or not the particular stored proc returned a result set. In actuality, the PROCEDURE_TYPE column should return whether or not the particular stored proc returns a return value. This procedure has now been corrected.

Note, new databases will have the corrected procedure, but to update existing databases, run the Upgrade utility dbupgrad.

369335 When the server was running on Windows NT 4 systems, the lookup of integrated login groups could have failed if the integrated_login_servername did not begin with two back-slashes "\\". The server will now add two back-slashes to the beginning of the domain servername if necessary.
369410 If a stored procedure was dropped and then another stored procedure with the same name was immediately created, users who had permission to access the first procedure, and had already called it, will still have been able to access the second procedure, even if they have not explicitly been given permission, until the next time the database was stopped. This has been fixed.
369479 The MobiLink server could have crashed if all the following had occured on the same worker thread:

- an error was handled on upload on the last table

- a download cursor was opened for the first time on any table

- a subsequent sync used the download table script without having an upload error handled, and there were multiple rows to download

This is now fixed.

369491 When running on Unix systems, the Interactive SQL utility dbisql, would have displayed the usage message when a full path to a SQL script file was given. The leading '/' was was being interpreted as a command line switch on. This has been fixed.
369516 The Interactive SQL utility dbisql, could have prompted for a seemingly unnecessary second log in, if all of the following were true:

- DBISQL was running as a windowed application

- not all the connection parameters were supplied on the command line, or in the SQLCONNECT environment variable, to complete the connection

- the "Connect" dialog was opened automatically when DBISQL started

- the connection was to a slow server

This has been fixed.

369521 If the GetCurrentCommand method of the ICommandPersist interface was called, the memory heap could have been corrupted. This problem has been fixed.
369536 When initializing a database, filenames were added to the SYSFILE system table in the OS character set. The filenames are now added to the SYSFILE system table using the database character set.
369539 If the engine name in the OS charset (ie ENG= )was not identical to the engine name in the database charset, then dbunload -an could have failed with an error such as "SQL Error: Invalid database server command line". This has now been fixed.
369676 The server allowed system datatypes, such as MONEY and UNIQUEIDENTIFIERSTR, to be dropped using the "DROP DATATYPE" statement. An attempt to drop these datatypes will now be rejected with a "permission denied" error.
369692 Internally, the value of the server's name is stored in the OS's character set. When the Transact-SQL variable @@servername was used in a query, it was not converted to the database's character set and as a result, comparisons could have been incorrect. If the value was returned to a client, the name could have been mangled by going through an incorrect character set translation (db charset to client charset for a string that was in server OS charset). The property( 'name' ) function which returns the same value was already correct. This bug affected the title bar of the dbisqlc window. The problem has now been fixed.
369704 When filling a DataSet using the ASADataAdapter object, the AutoIncrement property of DataColumn was not set properly. This has now been fixed.
369735 Executing a statement with an error and then switching to the Plan tab, would have caused ULISQL to crash. This has been fixed.
369796 The ReplyToAddress and InReplyToID properties were not being mapped properly when a message crossed between QAnywhere and JMS.

If a QAnywhere generated message was sent to a JMS client via the QAnywhere JMS connector, any ReplyToAddress specified on the QAnywhere message (using setReplyToAddress() in C++ or the ReplyToAddress property in C#) was mapped over to the JMS property QAReplyToAddress. This differed from the documentation, which indicated that the ReplyToAddress was mapped to the JMS property ias_ReplyToAddress. Similarly, the InReplyToID specified on the QAnywhere message (using setInReplyToID() in C++ or the InReplyToID property in C#) was mapped over to the JMS property QAInReplyToID rather than the documented ias_InReplyToID.

If a JMS message was sent to a QAnywhere client via the QAnywhere JMS connector, the JMSReplyTo specified on the JMS message (using setJMSReplyTo()) was mapped over to the QAMessage property ias_ReplyToAddress rather than to the actual ReplyToAddress of the message. Hence the ReplyToAddress could not be accessed by calling getReplyToAddress() in C++ or the ReplyToAddress property in C#. Similarly, the JMSCorrelationID specified on the JMS message (using setCorrelationID()) was mapped over to the QAMessage property ias_InReplyToID rather than to the actual InReplyToID of the message. Hence the InReplyToID could not be accessed by calling getInReplyToID() in C++ or the InReplyToID property in C#.

This problem has been fixed to behave as documented.

369811 A database server using SPX would have started up successfully even if another server running SPX was already running with the same name. This has been fixed so that the server will now correctly detect that an another SPX server is already running with the same name and fail to start.
369842 On Windows systems, the Data Source utility dbdsn, would not have listed all of the data sources if the total length of all of the names exceeded about 1024 bytes. This has been fixed.
369956 If the system tray icon was left-clicked, and the mouse then quickly moved far from the icon, the context menu would have appeared at the mouse location, far from the icon. The menu will now appear next to the icon.
369957 On Windows 2000 or XP systems, if the keyboard was used to navigate to the system tray icon and the context menu was activated, pressing Esc to cancel the menu would not have caused focus to be restored to the system tray icon. Pressing Tab to navigate would have resulted in a beep. Now, focus is restored to the icon after the menu is canceled.
369977 The Interactive SQL utility dbisql, could have crashed if its window was closed while an INPUT or OUTPUT statement was executing, and it had been launched from Sybase Central. Now, clicking the "File/Exit" menu item when a statement is executing will cause the same "Are you sure?" prompt as would occur when clicking the window's close button.
369985 When attempting to start ULISQL on operating systems older than Windows 2000, a message would have been displayed complaining that SHGetSpecialFolderPath could not be found in shell32.dll. This entry point is available in newer versions of shell32.dll (sometimes available with updates of Internet Explorer) and in shfolder.dll on older systems.

Now, ULISQL will use shfolder.dll if the entry point is not found in shell32.dll.

370045 Insert performance on systems with three or more processors would have been much poorer than on single processor systems. The drop in performance would have been more noticable as the number of processors increased (and was likely even more noticeable on Unix systems). This problem has now been corrected.
370046 The following issues have been corrected when filling a DataSet or DataTable with the ULDataAdapter, and the ULDataAdapter.SelectCommand was of type TableDirect. Dynamic SQL SELECT statements were not affected.

Only the name and type was specified for new columns when using Fill() with MissingSchemaAction.Add. AllowDBNull, AutoIncrement, ReadOnly, Unique were set only when Fill() with MissingSchemaAction.AddWithKey was used. Column properties are now set for all new columns.

When FillSchema() or Fill() with AddWithKey was used with a non-empty DataTable and the columns did not match the source properties with respect to AllowDBNull, AutoIncrement, and Unique, DataException, ArgumentException, and InvalidConstraintException might have occurred. Existing columns are now left as the user specified them.

If a data source column was flagged as autoincrementing, the DataColumn might have had its type corrupted, possibly resulting in a loss of data during Fill(). If the DataTable contained data, an ArgumentException was thrown, otherwise, an OverflowException might have been thrown during Fill(). Now exisiting columns do not have their properties modified by Fill() or FillSchema(). New autoincrementing columns of data source type SmallInt, Integer, BigInt, Decimal are flagged as AutoIncrement and may have their type sized up to prevent Fill() errors. Other new autoincrementing columns (in particular UnsignedBigInt) are not marked in the DataTable as AutoIncrement since .NET does not support AutoIncrement with non-signed integer types.

370049 If for a query, the publications or constraints were built for a table whose correlation name was different than the table name, the error "-142 - Correlation name ... not found" was incorrectly reported. This has been fixed.

For example:

CREATE TABLE P(

one CHAR(4) NOT NULL,

two INTEGER NOT NULL PRIMARY KEY

);

CREATE TABLE F(

two INTEGER NOT NULL REFERENCES P(two),

);

CREATE TABLE R(

X INTEGER NOT NULL,

Y integer not NULL

);

CREATE PUBLICATION "Pub_F"

(

TABLE F WHERE two = any(select R.X from R where R.Y > 9999 )

);

SELECT PP.two FROM P as PP KEY JOIN F as FF where PP.two < 100

Would have reported Error -142: "Correlation name FF' not found"

370070 The SIS Listener did not accept security options over TCPIP connections if they were specified as part of the MobiLink stream parameters, (ie -x command line option), when communicating tracking information and confirmations with the MobiLink Server. This is now fixed so that rsa_tls and certicom_tls can be used on top of TCPIP.
370071 When the BACKUP DATABASE TO statement failed and returned an error, (for example if the location for the achive file was not writable), then subsequent BACKUP DATABASE TO statements that failed would have caused the server to fail with assertion 104400 (a stack overflow) on Solaris 8 or 9 systems. This has been fixed.
370072 Ultralite Dynamic SQL was failing to correctly evaluate non-trivial expressions involving alias names in the FROM clause, when a temporary table was also required with the query. This has now been corrected
370074 The MobiLink\upgrade subdirectory contains one subdirectory for upgrading non-ASA consolidated databases from each previous version with different MobiLink system tables. In each of these directories is a readme.txt file. Some of these readme.txt files had headings that were misleading, leaving users to believe that upgrading was a multi-step process, involving a partial upgrade to a previous, but newer, version, then one or more additional upgrades to the current version. This is NOT correct, and the readme.txt files have been corrected.

The proper way to upgrade a non-ASA MobiLink consolidated database of version 6.0.x is to run the appropriate setup script from the MobiLink\setup directory, followed by the SQL script from the appropriate MobiLink\upgrade\6.0.x subdirectory.

The proper way to upgrade a non-ASA MobiLink consolidated database of version 7.0.x or greater is to run one SQL script from the appropriate MobiLink\upgrade\_version_ subdirectory for the version that is being upgraded from.

There are a few special rules for DB2. Consult the documentation for details, under:

What's New in SQL Anywhere Studio

Upgrading Software and Databases

Upgrading MobiLink

Upgrading your consolidated database

370082 Queries using a procedure call in a common table expression would have failed with the error: "-921 - Invalid recursive query". This is now allowed.
370126 When using CodeWarrior and Static SQL UltraLite, a statement such as:

SELECT DISTINCT x1, x2, ..., xm FROM <table-expression>

could have resulted in the UltraLite analyzer generating more code than was necessary. In cases where the number of columns in the select-list was large (for instance 20), the generated function could have been too large for the CodeWarrior compiler to handle. This has now been fixed.

370129 Japanese characters would not have been displayed properly in the SQL command window of ULISQL. This has been fixed.
370134 With a new schema that had spaces in its pathname:

1. creating an UltraLite database would have failed with the error:

"UltraLite database creation failed. Error: cannot specify additional arguments"

2. generating MobiLink scripts, or ASA SQL, for that database would have failed with the error:

"Script generation failed. Possible installation or path issue. Error: only one XML file/sync block can be specified"

This problem has been corrected.

370165 MobiLink client's synchronizing through Microsoft's ISA Server 2000 proxy server, via HTTP or HTTPS, would have caused the MobiLink server to hang. This has been fixed for non-persisent HTTP connections (synchronization paramter 'persistent=0'), but not for persistent connections.
370166 When not going through a proxy server, MobiLink clients always used "localhost:80" for the "Host:" HTTP header, instead of using the host and port passed via the synchronization parameters. This has been corrected.
370180 If a version 8.x database was being used as a MobiLink Consolidated database, and at least one remote user had successfully synchronized multiple publications, then dbupgrad would have failed to upgrade the database to version 9.x. The Upgrade utility dbupgrad would have reported a primary key violation on the ml_subscription table, or in some circumstances the server could fail an assertion. This has been fixed.
370185 If the QAnywhere Agent qaagent was stopped by pressing the shutdown button, or using the QAnywhere Agent Stop utility qastop.exe, it could have taken up to 60 seconds to shutdown. This has been fixed.
370190 QAnywhere messages received by the JMS connector, that contain an invalid JMS Destination, are normally placed in the dead-letter queue (specified using the connector property ianywhere.connector.outgoing.deadMessageAddress). If the dead-letter address referred to a QAnywhere client message store, and that client subsequently received the message, then the copy of that message would have remained in the server repository indefinitely. This problem is now fixed.
370197 If a SELECT statement resulted in unnamed columns, the ULDataAdapter object would have named the first unnamed column as "Column1", but then named subsequent unnamed columns as "1", "2", "3", etc. Subsequent fills would not have equated the first unnamed column as mapping to DataTable "Column1" and thus created "Column2", growing the DataTable by one column each time Fill() or FillSchema() was called.

Now, unnamed columns are named "Column1", "Column2", etc.. As a workaround, columns may be named using aliasing in the SELECT statement.

Example (C#):

ULDataAdapter da = new ULDataAdapter( "SELECT MIN(SomeCol), MAX(SomeCol), SUM(SomeCol), AVG(SomeCol) AS Average FROM SomeTable", conn );

DataTableMapping dtm = da.TableMapping( "Table", "MyTable" );

dtm.ColumnMappings.Add( "Column1", "Min" );

dtm.ColumnMappings.Add( "Column2", "Max" );

DataSet ds = new DataSet();

da.Fill( dataSet );

// dataSet now has DataTable "MyTable" with columns "Min", "Max", "Column3", and "Average"

370205 A call to the C++ methods QAManagerBase::getMessage and QAManagerBase::getMessageTimeout may have returned a NULL value when there was, in fact, a message waiting. A subsequent call to the method QAManagerBase::getLastErrorMsg would indicate that a "Statement interrupted by user" error had occurred. Similarly, a call to the C# methods QAManagerBase.GetMessage and QAManagerBase.GetMessageTimeout would have caused a QAException to be thrown also indicating that a "Statement interrupted by user" error had occurred. The problem has been fixed.
370247 If Ultralite Dynamic SQL attempting to execute a query that used an alias name in the GROUP BY clause, it would have failed with a syntax error.

For example,

SELECT length( city ) AS city_length, count(*) FROM invoices GROUP BY city_length

was diagnosed as erroneous. This has been corrected so that alias names in the GROUP BY clause are now accepted.

370301 The ISNUMERIC() function could have returned TRUE for values which used the letter 'd' or 'D' as the exponent separator (eg. '1d2') on Windows platforms, or for values such as 'NAN', '0x12', 'INF', or 'INFINITY' on UNIX platforms. The function no longer returns TRUE for these values.
370312 A query in a procedure or batch, with an expression that involved remote tables and a unary minus or simple cast operator, would have failed with the error:

ASA Error -823: OMNI cannot handle expressions involving remote tables inside stored procedures.

This problem has now been fixed so that these operators do now work in expressions involving remote tables.

370317 HTTP synchronizations would have failed if a proxy or web server used ASCII characters that were not beteen 0x20 and 0x7e (except for CR and LF) in their HTTP headers. now only characters less than 0x20 are rejected.
370320 The Quiet command line option (-q) was missing from the UltraLite XML utility's (ulxml) usage message, as well as the documentation. It has now been added.
370326 The method AsaDataReader.GetSchemaTable() may have caused an InvalidCastException when the data reader had some unique columns and computed columns. This problem has been fixed.
370333 If a version 8.x database was being used as a MobiLink Consolidated database, and at least one remote user had successfully synchronized multiple publications, attempting to rebuild using dbunload would have failed when the reload.sql file was run against an empty database. A primary key violation on the ml_subscription table would have occurred. This has now been fixed. Note that the problem did not occur when using the -an or -ar dbunload command line options.
370335 On Windows CE, the method QAManagerBase::putMessage would have returned FALSE, and getLastErrorMsg() would have returned the error message "The message store is too large relative to the disk free space on the device", even though there was sufficient space in the message store. This has been fixed.
370339 Correlated subqueries used in computed columns may have caused grouped queries to fail with the error " Function or column reference to ... must also appear in a GROUP BY". This has been fixed.

An example:

CREATE TABLE R (

X integer not null,

Z integer not null,

Y integer NULL COMPUTE ((select count(*) from R as old where old.X = R.X))

)

select R.Z from R group by R.Z

370421 If the ROUND() function rounded a numeric value, the resulting value may not have fit into the original NUMERIC data types percision. For example: The constant 9.995 is of type NUMERIC(4,3). The result of ROUND(9.995,1) is 10.000 which does not fit into numeric(4,3). As a result the numeric value generated by the ROUND() function could have been invalid and a conversion of this numeric value to a string could have returned '?'.

This problem has been fixed. If the numeric value passed to ROUND() is a constant, the resulting data types percision is increased by one, (numeric(5,3) in the above example). If it is not a constant and the resulting value does not fit, then a SQLE_OVERFLOW_ERROR is generated if the option Convertion_error is set, otherwise NULL is returned.

370446 The return values from the UltraLite utilities ULCONV, ULCREATE, ULDBSGEN, ULLOAD, ULSYNC, ULUNLOAD, and ULXML have been changed from negative to positive values. This allows batch files to use ERRORLEVEL.
370456 Executing a VALIDATE TABLE statement, and using the WITH EXPRESS clause, (or dbvalid -fx), would have failed with the error "Not enough memory to start", if the currently available cache space was not large enough. If cache resizing is possible, the server will now try to increase the cache size to the amount required.
370567 The Unload utility dbunload, may have crashed if the command line option -ar (rebuild and replace database) was used with a database that had no online transaction log. This problem has been fixed.
370585 If an HTTP or HTTPS response was more than a few kilobytes in size, and the server was on Unix, NetWare or Windows 95, 98 or Me, the response could have been truncated, contain unexpected data and/or include fatal error text. This was more likely to occur if the server machine was lightly loaded and was faster than the client machine, or the client and server machine were separated by a slow network link. This has been fixed.
370604 In ODBC, changing the option for a cursor's scrollability, could have caused the driver to change the cursor type as well. For instance if the cursor type was forward-only, changing the scrollability to scrollable would have changed the cursor type to dynamic. The problem was that the driver was always changing the cursor type to dynamic regardless of the existing cursor type. This has been corrected.
370609 The MobiLink Client dbmlsync, would have complained of an "invalid option ...", if it was started with a configuration file, @filename, and filename contained any extended options specified as

-e opt1="val1";opt2=val2;...

even if all the extended options were valid. This problem is fixed now.

370699 Upgrading an ASE or Microsoft SQL Server QAnywhere consolidated database from 9.0.1 to 9.0.2 would have caused all server-side queued messages to have been lost if the server-side message store had at least one message queued (ie. the ml_qa_repository table is non-empty). This has now been fixed.
370712 Upgrading an Oracle consolidated database from 9.0.1 to 9.0.2 would have left the stored procedure ml_qa_staged_msg_for_client, instead of dropping it. The undropped procedure wouldn't have affected the behaviour after the upgrade, it just would never have been used. It is now dropped.
370717 The setup script for Microsoft SQL Server was missing the last_modified column in the ml_qa_messages view. While this column is not essential, it is useful for debugging and manually tracking when messages change status on the server side. The column has been added.
370722 The QAnywhere Stop utility qastop, was added in an EBF after the GA release of 9.0.1. The CE EBF installer was updated at the same time to expect qastop to be present. If a subsequent EBF was applied, the installer would have failed, with the following message:

Error: File 'c:\program files\sybase\asa9\ce\arm.30\qastop.exe' not found.

This has been fixed.

370724 The Unload utility dbunload, would have silently placed old transaction log files into the root directory, when the command line option -ar (rebuild and replace database) was used and no log directory was specified, for databases that were involved in synchronization/replication using RepAgent. Now, if this situation occurs, the old transaction log file will be placed in the log directory of the database.
370726 The Interactive SQl utility dbisql, would have failed to process statements in a file read by the READ command if the file used UTF8 encoding and the file started with an endian indicator (typically 0xef 0xbb 0xbf on Windows). Now the endian indicator is handled appropriately.
370744 In order to run a service under an account other than LocalSystem, that account must have been granted the "Login as a service" privilege. Sybase Central can detect when the account does not have this privilege, ask the user whether to grant it, and grant it if so, but the Create Service utility dbsvc, did not have this ability. Now, dbsvc will ask the whether to grant this privilege, and grant it if so, if the -a (account name to use)command line option is used rather than the -as option, and the account does not have this privilege already.

Notes:

- if the user running dbsvc does not have Administrator privileges, then granting the privilege will fail. However, users without Administrator privileges cannot create services anyway

- if the -y option is used, then dbsvc will attempt to grant the "Login as a

service" privilege without prompting the user

370835 Scripts for upgrading DB2 from 8.0.x and 9.0.0 short schema to 9.0.2, were missing the MobiLink system triggers. This would have resulted in MobiLink not working correctly after an upgrade. There are no scripts for upgrading from 7.0.x and 8.0.0 long schema to 9.0.2, so upgrading from 7.0.x and 8.0.0 long schema to 9.0.2 is not possible. The 9.0.1 upgrade script would not have dropped the old ml_qa_repository_content table. The 8.0.0 upgrade script would not have dropped the old ml_add_lang_connec stored procedure. These have been corrected.
370840 Shutting down the server while debugging database objects, would have caused Sybase Central to go to 100% CPU usage. This has been fixed.
370852 If an ASA database, created or upgraded to version 9.0.1, was used as a consolidated server for MobiLink with QAnywhere messaging, then attempting to upgrade the database to version 9.0.2 using dbunload would have failed with a conversion error on the reload of the table dbo.ml_qa_repository.

For example, if the database was qanyserv.db, then the following command would fail:

dbunload -c "dbf=qanyserv.db;uid=dba;pwd=sql" -ar .

This problem has been fixed, but there are a couple work-arounds. Rather than using dbunload to upgrade a database from 9.0.1 to 9.0.2 one can use the tool dbupgrad. For example:

dbupgrad -c "dbf=qanyserv.db;uid=dba;pwd=sql"

If unload and reload of the database is required, then another work-around is to run dbunload, and then modify the reload.sql file to remove the reloading of rows into the tables dbo.ml_qa_repository and dbo.ml_qa_repository_props. These rows represent QAnywhere messages, so removing them will cause the reloaded database to lose those messages.

370861 If a request log file was generated using:

call sa_server_option('Request_level_logging','sql+plan+hostvars');

and a plan string in the request log exceeded approximately 325 bytes, then calling sa_get_request_times to process the resulting file may have resulted in the error:

Primary key for table 'satmp_request_time' is not unique

Whether or not the error was given depended on what other requests were active at the time the statement with the long plan was executed. The request log file will now be output correctly.

370899 Several race conditions in the server while starting and stopping databases have now been fixed:

- The server could have autostopped a database when it should not have, or not autostopped a database when it should have.

- In rare timing dependent cases, the server could have deadlocked, asserted or possibly crashed, when a database was starting up or shutting down.

Also in rare timing dependent cases, the server could have asserted or possibly crashed if HTTP or HTTPS requests were made to a database that was starting up or shutting down.

370905 An ODBC application that allocated both an ODBC 2.0 style environment handle and an ODBC 3.0 style environment handle, could have have returned ODBC 3.0 result codes when functions were called in the ODBC 2,0 environment, or vice versa. This could have lead to subsequent function calls failing with erroneous error messages, including 'function sequence error'. Now, the driver will always allocate a separate environment handle each time SQLAllocEnv or SQLAllocHandle is called.
370914 The MobiLink Monitor was not able to connect to the synchronization server via HTTPS. This has been fixed.
370998 The problem addressed by changes for Engineering Case 323973, was reintroduced by the changes for Case 369727.

A server crash at an inopportune moment could have resulted in a corrupt database. This was more likely to have occurred with 9.x servers, and with 8.x servers running 8.x databases. It was unlikely to have occurred with 8.x and earlier servers when running against 7.x or earlier databases.

This has now been fixed.

371032 If a query referenced both proxy and local tables, or proxy tables from different servers, then it will have to be executed in 'no passthru' or 'partial passthru' mode. If such a query also contained column references of the form 'user.table.column', then the query would have failed with error -845 "Owner '<owner name>' used in qualified column reference does not match correlation name '<table name>'". This problem has now been fixed.
371180 The server could have failed with assertion 104000 when attempting to execute a query with a large IN list. An IN list of size roughly (1/32)*(page-size)^2 could have generated the assertion failure on 32 bit platforms, and a value half that size would on 64 bit platforms. This has now been fixed, and IN lists are supported up to the available cache memory.

Now, for IN lists bigger than the above limit, the "IN list optimization" is not used, and a virtual table is not introduced. This may result in a sudden performance difference when the IN list size crosses this size threshold. It is not recommended to use very large IN lists.

371202 The system procedure sa_get_request_times, would have stored a conn_id of 0 in the table satmp_request_time for any connections established before request-level logging was enabled, for the file being processed. If sa_get_request_times was called with a conn_id parameter to limit the information collected from the log, it would not have stored any information for a connection started before logging was enabled. Now, the connection id will match the connection handle value for this situation.
371203 A warning message that the server was not licenced for the appropriate number of CPUs on the machine, was being given at each checkpoint. The warning message is now only given at startup.
371373 The customer does not want request level logging in ASA ( -zr -zo ) to log any passwords as this breaches their internal security standards.

The customer is requesting that this feature be added to the engine and not solely to dbisql since they use different means to administer users. We could capture and parse out the password from the "grant connect to..." out of the STMT_PREPARE and the STMT_EXECUTE_IMM and/or STMT_EXECUTE_ANY_IMM before it gets to the parser and then the logger.

371376 An EBF install would have created the "Sample Applications and Projects" icon in the default "SQL Anywhere 9" folder, even if the original install used a different folder. This has been corrected.
371389 When the QAnywhere Agent was set up to use a primary server and a secondary server, and it was performing synchronizations frequently, a failover to the secondary server may have occurred, even though the primary server was reachable. This has been fixed. Two new command line options have now been added: -fr <n>, which specifies the number of retries to connect to the primary server after a connection failure (default 0), and -fd <n>, which is the delay, in seconds, between retry attempts to the primary server (default 0). It is recommended that the retry delay be a relatively small value, perhaps 10 seconds or less.
371411 The isolation level for a transaction was being set to 1 when the connection was opened. Now, the isolation level is no longer set to any specific value. The server default is the value defined for the connection by the database option Isolation_level.

Note, this problem was introduced in the following builds:

8.0.3 5128

8.0.2 4442

9.0.2 2528

9.0.0 1333

9.0.1 1887

The old behavior is now restored

371423 Ultralite Dynamic SQL would have failed to create a foreign key which referenced the same table as was being created by the CREATE TABLE statement. This has been fixed.
371549 If a query performed a join between a local table and a remote table with an ON condition, then there was a very good chance that the query would have been processed in 'partial passthru' mode and returned an incorrect result. This problem has now been fixed.
371558 When the QAnywhere library is used to receive a message using a transactional manager, it is possible to roll back the receiving of messages. If the receive of a message is rolled back, then the next time the message is received, the Redelivered property of the message (getRedelivered() in C++) should be true. In this situation though, the Redelivered property was always being set to false. The Redelivered property of a message whose receive was rolled back is now correctly set.
371843 When running an EBF install on Linux or Solaris systems, selecting the Japanese license agreement would have caused the install to exit before applying the EBF. The problem has now ben fixed.
371849 Executing long statements, which contained the CASE keyword, could have caused the Interactive SQL utility dbisql to appear to hang. The statement will eventually execute, but the length of time required will be unreasonably long. This problem does not affect all statements which contained a CASE keyword. This has been corrected.
371856 When doing incremental uploads, dbmlsync was making several errors when estimating the size of the upload. As a result the size of the upload increments were sometimes very different from the size requested using the increment extended option. The following sources of estimation error have been fixed:

1) Blobs were not being included in the estimate of the upload size.

2) When synchronizing a subscription for a user with more than one subscription, some operations were being included in the estimate that were not being uploaded.

371870 When using Server-Initiated Synchronization, the Listener could have hung on shutdown, leaving an unresponsive console. A race condition has been fixed.
371909 When running the UltraLite Interactive SQL utility ulisql with the Plan tab selected, executing a query, then disconnecting, then reconnecting again and re-executing the query, would have caused ulisql to crash. This has been fixed.
371911 Two problems with the UltraLite Interactive SQL utilitu ulisql, have been fixed. First, statements with carriage returns and tabs had these characters stripped off after they were executed. Recalling the statement would have caused it to have been displayed all on one line. Now the format is preserved. Second, when ulisql was launched, immediately recalling the last command would have incorrectly displayed the second last command.
371930 It was possible, (although rare, it was more likely on 64 bit Unix systems), that Interactive SQL dbisql, could have crashed when it was being shut down. This has been fixed.
371941 The server command line options -c, -cl, and -ch allow cache sizes and limits to be specified in terms of "percentage of total physical RAM installed in the system". On systems where there was more physical RAM installed than there was address space available to the server process, using percentage notation could have caused the server to attempt to allocate a cache larger than it could possibly allocate. For example, -c75p on a system with 8GB of RAM installed would attempt to create a 6GB cache. Percentage notation for these options are now defined as a percentage of available address space or total physical RAM, which ever is less.

On all 32-bit systems other than Windows, available address space is defined as 2GB less 256MB. On Windows, available address space is computed accurately on startup. Note

that each process on 32-bit Windows is given a total of 2GB of address space (that's an OS and 32-bit architecture limitation) except on Windows 32-bit Advanced Server, Enterprise Server and Datacenter Server, where they are given 3GB of address space in total provided "/3GB /PAE" is in the boot.ini and there is no more than 16GB of RAM installed. Again, these are OS and 32-bit architecture limitations. 32-bit programs running on Windows x64 Edition are given the full 4GB of address space. Available address space is then defined as total address space less address space in use by the database server at startup.

For AWE caches ('-cw' is on the command line), the definition of percentage notation has not changed and remains as a percentage of total physical memory on the system.

371958 Running the Collation utility dbcollat with the -z command line option (specify collation sequence label), can no longer be used to write a collation definition to a file. To get a particular collation definition, a database must now be built with the desired collation, and then dbcollat, without -z, can be run to extract it. The -z option will be removed in a future version of SQL Anywhere.
372064 When using the MacOS version of Sybase Central to edit a table and clicking in the Data Type or Value column, by default most of the column's width would have been taken up by the "..." button, leaving very little room to see the current value. Now, the button is only as wide as required to show the "..." text.
372065 When run on MacOS systems, after successfully running a utility wizard that displayed a messages dialog, Sybase Central would needed to have been restarted in order to use the menu bar items. Otherwise, selecting a menu item would have provided no response. This has been fixed.
372069 In the MacOS version of Sybase Central, attempting to use the ENTER key in a non-editable combo box, to commit the current selection in the drop down list, would have caused the drop down list to be closed, but the current item would not have been selected. This has now been fixed.
372074 If an INSERT .... ON EXISTING statement used DEFAULT in the VALUES clause for any primary key column of the table, the server would have crashed. This has been corrected.
372085 When the Synchronization Client dbmlsync crashed it would have left behind a temporary file, which would never have been deleted. Now, a check is made at startup for any temporary files left from previous runs and deletes them if they exist.
372086 If a query referenced a procedure in the FROM clause, and the procedure in turn had a query that referenced a remote server, but could not be executed in full passthrough mode, and the query also referenced a procedure variable, then a syntax error could have resulted. This has been corrected.
372098 In rare circumstances, an upload could have failed with the error "Unknown Client Error n", where n was some random large number. This error was usually followed by another error reporting that "A protocol error occurred when attempting to retrieve the remote client's synchronization log". Although there are circumstances where this is a valid error to report, an instance where this error was incorrectly reported has now been fixed.
372122 Engineering Case 304975 added support for handling UUID/GUID columns in proxy tables to remote servers. Unfortunately, that change had the side effect of disallowing creation of existing proxy tables with smalldatetime columns. The problem with the smalldatetime column has now been fixed.
372175 The server could have leaked memory, eventually resulting in an 'Out of Memory' error. This could have occurred while executing INSERT or LOAD TABLE statements for tables which the server maintains statistics. This has been fixed
372181 Selecting a table in the tree and then clicking on the Data tab in the right pane, would have caused any attempt to unload either the table's data or the entire database to block, until the unload operation was cancelled and another item was selected in the tree. Note that selecting another tab in the right pane was not sufficient to remove the block. Now, the unload operation will proceed regardless of which tab is selected in the right pane, and there is no need to change the tree selection to proceed with the unload.
372196 When running on Unix systems, the server could have crashed while shutting down with active TCP/IP connection. This would likely have been very rare, and has now been fixed.
372205 When the Synchronization Server was run using the HTTP stream (ie -x http), a synchronization failure could have caused the server to crash. This has been fixed.
372220 When running on NetWare systems, the ASA server would have stopped executing scheduled events and automatic checkpoints, about 66 hours after the ASA server was started. This has been fixed.
372230 The reference to "DT2.*" in the following query:

SELECT 1 FROM ( SELECT DT2.* FROM ( select 1 c ) DT1 ) DT2

should have given an error, since it occurred inside the derived table DT2. An error would only have been given if DT2 was specified with a column list. Now, an error will always be reported for this situation.

372231 The server could have deadlocked while running simultaneous queries containing joins of the same tables.

For example, the following might have caused such a deadlock.

select * from a,b where a.a2 = b.b2; //connection 1

select * from a,b where b.b2 = a.a2; //connection 2

This would only have occurred if there was no index or key on the columns a2 and b2. This would most likely have occurred on a multi-CPU machine. This has now been fixed.

372236 If the QAnywhere JMS connector received a JMS message having a non-null JMSCorrelationID, then the QAnywhere server may have failed to receive the message indicating a NullPointerException. The problem would have occurred even if the JMSCorrelationID did not refer to a QAnywhere message id. This problem has been fixed.
372239 An HTTP or web service procedure, or a function with a remote address given in dotted quad notation (e.g., http://192.168.0.1/), may have sometimes failed to resolve, or have resolved incorrectly. This has been fixed.
372262 Connecting to the MobiLink server immediately after a successful autodial could have failed with error WSAEHOSTUNREACH (10065). The fix is to repeatedly attempt to open the session until it is successful, or the network_connect_timeout expires, default 2 minutes.
372279 When opening a cursor for a statement that contained an outer join, it was possible for the server enter an endless loop. For this to have occurred, the table on the null-supplying side had to have a computed column that was a complex expression of some other table columns, and the cursor must have been opened 'for-update' (implying that Ansi_update_constraints was off), and the computed column must have been nested within two outer joins. This problem has been fixed.

For example, the following situation caused the problem:

set option public.ansi_update_constraints = 'off';

create table T1 ( a varchar(10), c varchar(10) compute ( a+'' ) );

create table T2 ( f int );

create table T3 ( z int );

select * from T3 left outer join

( T2 left outer join T1 on T2.f = T1.c )

on T3.z = T2.f

for update;

372289 On PalmOS devices, if a user entered the M-Business Client, and then exited to the home screen without doing anything, it would have crashed. This has now been corrected.
372331 During synchronization it was possible for a Windows CE device to go into sleep mode. Now the MobiLink client makes system calls to ensure that this does not happen. It is still possible for a device to go into sleep mode during a delay caused by the sp_hook_dbmlsync_delay hook or during the pause between scheduled synchronizations.
372374 The JMS connectror dead message address is an address to which messages are forwarded if it is determined that the message is undeliverable (for example, the address is not a valid JMS address). If the dead message address was badly formed, (for example, missing an agentid), then the undeliverable message would be queued but would be otherwise unreceivable. Now, if the dead message address is badly formed, the connector will fail to start with an appropriate connector initialization error message. This will ensure messages queued against a dead message address will always be receivable.
372406 Using the QAnywhere Agent with scheduled transmission rules would have resulted in invalid messages being received. This has now been fixed. This was a regression introduced with changes for Engineering Case 371389.
372469 If EXECUTE IMMEDIATE WITH RESULT SET ON was used to execute a string representing a multi-statement batch, it would have failed with the error:

Result set not permitted in '<batch statement>'

The batch will now be executed correctly and its result set returned.

372481 The estimate of the rate at which pages are being dirtied has been made less pessemistic (a smoothed version of the estimates used in 7.x). Also, on 32 bit Windows systems, the server now measures the random write times rather than using the cost model estimates, as this caused the estimates to be off by a factor of 50 in some cases.

This is a further performance improvement to the issue originally addressed by Engineering Case 355123.

372484 When the Synchronization Server was run using the HTTP stream (ie -x http), the server could have failed to shutdown in rare cases. This has now been fixed.
372485 When run on Linux or Solaris systems, the Interactive SQL utilities Import Wizard could have reported an internal error (NullPointerException) if a file was imported in a file format other than ASCII, and the "File type" field was not set to the appropriate type. This has been fixed.
372513 The UltraLite Schema painter could have crashed when creating a foreign key. This has been fixed.
372522 The server could have started processing requests while the HTTP and HTTPS communications links were still being initialized. Now, requests received by the server before it is fully initialized will wait until startup is complete.
372605 If an application, connected to a server via jConnect, cancelled a request or closed a JDBC statement, the cancel or close could have failed and/or dropped the connection entirely. This problem has been fixed.
372615 When the UltraLite Initialization utility ulinit, was run against a blank padded ASA database, each object (table, column, index, publication etc.) in the generated UltraLite schema was padded by many spaces. Since the 杬 switch on ulinit (specify a table ordering) required a list of tables, ulinit could not properly handle this switch. This has been fixed.

The workaround is to unload and reload the ASA database into a non-blank padded reference database.

372635 Ultralite Dynamic SQL was failing to respect an ORDER BY clause when there was an index that could have been used to satisfy the ordering and there existed another index that could have been used to optimize the search conditions. This has now been corrected.
372644 When the UltraLite HotSync conduit is loaded by the HotSync Manager (on desktops), it will now attempt to load the plug-in DLL, if the value "PluginDLL" is specified in the following registry key:

Software\Sybase\Adaptive Server Anywhere\<version>\Conduit\<CRID>

where <CRID> is the creator ID that was used in an UltraLite Palm application on the remote. The "PluginDLL" value should be set to the plug-in DLL location.

The conduit plug-in DLL should have the exported function ULCondGetExtraStreamParms specified:

Prototype

bool ULCondGetExtraStreamParms( char * stream_parms, unsigned short buffer_len )

Parameters

stream_parms: Pointer to a buffer in which to return the extra stream parameters.

buffer_len: The length of *stream_parms in bytes.

Remarks

The function should return false on error; otherwise, return true on success. The extra parameters returned will be appended to the existing stream parameters in the UL database.

372680 A query that used an outer join inside a lateral derived table may have failed with the error -727 "The optimizer was unable to construct a valid access plan".

Further, if the lateral derived table was flattenable and there was a reference from the null-supplying side of the outer join to a table outside the lateral derived table, then the target of the reference needed to be treated as part of the preserved side. This was not happening, Therefore, the optimizer could, in some cases, choose an incorrect plan with the table in question appearing above the outer join rather than on its preserved side.

Both these issues have now been fixed.

372736 If a stored procedure opened a cursor on a declared temporary table, but did not close the cursor before exiting, the server could have crashed when the procedure was called. Failure to close the cursor might have been caused by the procedure exiting due to an error. This has been fixed.
372743 The QAnywhere JMS connector places a message in the dead-letter queue when it is determined the message is undeliverable. Binary content messages that were placed in the dead-letter queue were losing their content. This has been fixed, such that any new binary messages put in the dead-letter queue will not lose content.
372770 String transfers to UltraLite, on Windows CE devices, was slower than neccessary. This has been fixed in the iAnywhere.Data.UltraLite namespace only.
372775 On Windows CE systems, an HTTP or web service procedure would have hung when issuing the request to the web server. The procedure would have returned when the web server issued a timeout for the request. This has been fixed.
372785 HTTP authentication would fail with Microsoft's Internet Security and Acceleration Server 2004. When sending back an authentication challenge, ISA 2004 would send back the HTTP header "Connection: Keep-Alive", even though the client sent the header "Proxy-Connection: close", which caused the client to become confused. This is fixed by having the client ignore connection keep-alive requests.
372800 When clicking on the "..." button for a table column's data type, the mnemonics would not work initially on the property dialog that appears. This has now been fixed.
372882 If a view was created with an owner like: "create view dba.V1 as select c1 from T1" the preserved source of this view (column SOURCE in SYSTABLE) would have contained an space character following the owner; e.g "create view dba .V1 as select c1 from T1".

As well, if a view was created with a "select * ...", the view definition (column VIEW_DEF in SYSTABLE) was unparsed without the space between the "select" and "*"; e.g. "select* ...".

Neither of these errors caused problems in ASA, but did cause problems for Powerdesigner. Both issues have been fixed.

372896 The optimizer occasionally recommends indexes that, if created, would degrade query performance. If the Index Consultant detects this case, it discards the query from its analysis. A check for whether a query had been discarded or not was missing from the new Analysis Viewer, which could cause the Index Consultant to fail with a NullPointer exception, making the analysis results unviewable. This has been fixed.
372897 If a database consisted of more dbspaces other than just the SYSTEM dbspace, and an attempt was made to unload the data from this database to another database with the same structure using the Unload utility dbunload:

DBUNLOAD -d -ac <connection-parameters-to-new-database>

The Unload utility would have attempted to create a dbspace for the new database and would have reported an error if the dbspace already existed. Now, dbunload will not attempt to create dbspaces when reloading into another database if the -d command-line option is used.

372922 A cast from a domain to an equivalent user type could have been ignored. For example, the following should skip quoting the result of the html_encode()

select xmlelement( name p, cast( html_encode('''') as xml ) )

However, the usertype "xml" is defined as long varchar which happens to be the return type of html_encode(). Therefore, the cast is silently dropped and the quoting happens anyway. This has been fixed.

373028 Stopping a server while a database was in the process of either starting or stopping, could have caused incorrect behaviour, such as the database requiring recovery the next time it is started, or the server asserting, crashing or hanging. Now, server shutdown waits for databases which are not active, to finish starting or stopping before shutting down, and ensures that a database is not stopped twice.
373035 Performing a synchronization that downloaded rows to a table on which a cursor had been opened, could have resulted in the cursor being positioned on an incorrect row following an ABSOLUTE fetch.

UltraLite tries to optimize ABSOLUTE fetches by replacing them with RELATIVE ones (if it thinks it will be more efficient). The algorithm first verifies that no tables in the cursor have been modified, otherwise it does not attempt the optimization. The problem occurred due to the synchronization code not marking the tables as modified. Now they are.

373037 In rare circumstances, databases using a 1K page size, could have become corrupted during database recovery. This could have resulted in the error 'Unknown device error', an assertion error, or some other error indicating that the server was reading beyond the end of the file. This has now been fixed.
373039 An attempt to create two user-defined types, whose names were the same except for case, in a case sensitive database was permitted. This now results in an error, since these names should always be case insensitive.

Also, dropping a user-defined type required the name to have matching case, in a case sensitive database. This is no longer required.

373086 If a JDBC cursor was positioned on a row with a LONG VARCHAR column, then calling ResultSet.getString() on the column would have returned the proper value for the first call, but each subsequent call would have returned NULL if the cursor had not been repositioned. This problem has now been fixed.
373130 The QAnywhere Agent window did not have a way to be minimized on some Windows CE operating systems. This has been fixed by adding a Hide button to the dialog, similar to the Database Server window.
373157 The long plan text (i.e. from the plan() function) is currently English only. However, the selectivity source names (e.g. Bounded, Index, etc.) were being displayed in the client language, causing an inconsistent appearance to the plans. This has been fixed so that English only is displayed.
373172 In the Translate Log File wizard, selecting 'Include trigger generated transactions' and 'Include as comments only', would have included the trigger generated transactions as statements rather than as comments. This has been fixed.
373173 Using the index hints "CUSTERED INDEX" or "NO INDEX" in a query could have caused the server to crash, if workload capturing for the Index Consultant had been turned on while the query was executed. This problem has been resolved.
373179 If two instances of the SQL preprocessor, sqlpp run at the same time, the generated code may be invalid. The concurrently running preprocesor's could attempt to use the other's temporary file, and silently generate invalid code. This problem has been fixed by including the process pid in the temporary file.
373206 In the Table wizard, when specifying a value other than the default for the percentage of free space to be reserved on each page, the 'number of bytes' value displayed was not updated as the percentage was changed. This has now been fixed.
373215 Ultralite Dynamic SQL could have produced incorrect results when the left table expression of a LEFT OUTER JOIN contained multiple INNER JOIN expressions. This has been fixed.
373248 When creating a foreign key with the UltraLite Schema Painter, the table for which the foreign key is being created (the table doing the referencing) was not listed as a table that could be referenced. This has been fixed, self-referencing foreign keys can now be created.
373250 When creating a foreign key with one of the UltraLite utilities (Schema Painter, ULXML, ulload, ulcreate, ulconv or ulisql), the application could have crashed, if the foreign key referenced a table that had a self-referencing foreign key. This is now fixed.
373253 When a table was removed from a query using the QueryEditor, the generated query statement was not updated to reflect the change. This has been fixed.

Note, this same problem affected the QueryEditor in Sybase Central, and is fixed as well

373254 When the QueryEditor was opened with a query with SELECT FIRST *, the query would have been changed to SELECT *. This has been fixed.
373255 It a column name ended in a blank space, the QueryEditor would have trimed the blank space from the end of the name, causing errors. This has been fixed.
373299 Using the Unload utility dbunload, with the command line options -an (create new database and reload) or -ar (rebuild and replace database), against a server which was not running sharedmemory, would have failed attempting to conmnect to the new database. The generated connection strings used to by -an and -ar to connect to the new database did not include the LINKS parameters. Now, it includes all the parameters specified for the connection to the source database.

Note, the server used with dbunload -ar must be on the same machine where dbunload is run, but dbunload -an can now be used against a remote server.

373341 The plan for a static Ultralite query could have incorrectly contained references to a base table's computed columns, causing a semantic error. This would have occurred if the table being referenced contained a computed column, even though the query did not refer to the computed column directly. This has been fixed.
373382 If a query contained a join between a remote table and a lateral derived table with an ON clause, the chances were very good that the server would have crashed. This problem has been fixed.
373462 If a CREATE TABLE statement failed, for example because of duplicate column names, and no commit or rollback was executed so far, the next attempt to execute a CREATE TABLE statement, on any connection, would have crashed the server or cause an assertion failure 102801. This has now been fixed.
373472 The Unload utility dbunload, may not have properly reloaded the contents of the sys.syssync table for databases that were involved in synchronization. This would have caused dbmlsync to always have been checking the last sync status with MobiLink synchronization server, in the first synchronization after the remote database was rebuilt. This problem is noe fixed.
373477 Running the Unload utility dbunload, with both the -ar (rebuild and replace database) and -ek (specify encryption key for new database) command line options, would have failed when attempting to connect to the new database with the error "Unable to open database file "<file>" -- Missing database encryption key." The last step of dbunload -ar is to rename the log file, but the encryption key was not specified when it should have been. This is now fixed, te encryption key is now specified correctly.
373480 If a server was started with a server name containing non-7-bit ASCII characters, and the client machine's character set did not match the server machine's character set, applications may not have been able to connect when specifying the server name, (ie ENG parameter). This has been fixed.
373482 If a connection string included the TCP parameter VerifyServerName=NO, and contained an incorrect server name, the connection would have failed, essentially, the VerifyServerName parameter was ignored. This has been fixed.
373483 If an INSERT statement used a SELECT query that required a work table at the top of the query plan, then the value of NUMBER(*) in the result of the insert could have been improperly set to 0 for all rows. This has been fixed.

For example, the following INSERT could have generated the incorrect values:

insert into R

select 0-row_num, number(*)

from rowgenerator

where row_num <= 3

order by 1

373519 If a QAnywhere connector was configured to connect to WebSphere MQ, and the connector received a JMS BytesMessage with a zero length, the message would have been ignored. The MobiLink log file would have included a error message indicating "NullPointerException". With this fix, zero length BytesMessage will be received correctly.
373526 If a QAnywhere connector was configured to connect to WebSphere MQ, and a QAnywhere message sent to the connector contained an InReplyToID,, (QAMessage::setInReplyToID() in C++, QAMessage.InReplyToID property in .NET), then the message would not have been sent onwards to WebSphere MQ. The MobiLink log would show an error indicating an invalid "JMSCorrelationID". If the connector was configured with a dead message address, then the message would be re-addressed to that address. Now, this problem will no longer occur.
373531 The fix for Engineering Case 367366 introduced a problem where attempting to establish a connection to a remote ASA database with a long database name, or a long engine name, could have crashed the server. This problem has been fixed.
373541 When run on Unix systems, the MobiLink server may have crashed when using DataDirect's 5.0 Driver Manager. The crash would have occurred when trying to retrieve an error message from the database server. This has been fixed.
373543 The QAnywhere client library did not have APIs to provide information on the number of messages queued for sending and receiving. This has been addressed by adding methods to QAManagerBase to give this information.

For C#, the following enumeration type was added:

public enum QueueDepthFilter {

/// <summary>

/// Count both incoming and outgoing messages. System messages

/// and expired messages are not included in any queue depth

/// counts.

/// </summary>

ALL,

/// <summary>

/// Count only incoming messages. An incoming message is defined

/// as a message whose originator is different than the agent ID

/// of the message store.

/// </summary>

INCOMING,

/// <summary>

/// Count only outgoing messages. An outgoing message is defined

/// as a message whose originator is the agent ID

/// of the message store, and whose destination is not the

/// agent ID of the message store.

/// </summary>

OUTGOING

};

For C#, the following methods were added to QAManagerBase:

/// <summary>

/// Returns the total depth of all queues, based on a given filter.

/// <param name="filter">a filter indicating incoming messages,

/// outgoing messages, or all messages</param>

/// <exception cref="iAnywhere.QAnywhere.Client.QAException">

/// if there was an error

/// </exception>

/// <returns>the number of messages</returns>

/// </summary>

public int GetQueueDepth( QueueDepthFilter filter );

/// <summary>

/// Returns the depth of a queue, based on a given filter.

/// <param name="filter">a filter indicating incoming messages,

/// outgoing messages, or all messages</param>

/// <param name="address">the queue name</param>

/// <exception cref="iAnywhere.QAnywhere.Client.QAException">

/// if there was an error

/// </exception>

/// <returns>the number of messages</returns>

/// </summary>

public int GetQueueDepth( string address, QueueDepthFilter filter );

Similarly, for C++, the following methods were added to QAManagerBase:

/**

* Returns the total depth of all queues, based on a given filter.

* @param filter a filter indicating incoming messages, outgoing messages,

* or all messages

* @see QueueDepthFilter

* @return the number of messages, or -1 if there was an error

*/

virtual qa_int getAllQueueDepth(qa_short filter) = 0;

/**

* Returns the depth of a queue, based on a given filter.

* @param filter a filter indicating incoming messages, outgoing messages,

* or all messages

* @see QueueDepthFilter

* @param dest the queue name

* @return the number of messages in the queue, or -1 if there was an error

*/

virtual qa_int getQueueDepth(qa_const_string dest, qa_short filter) = 0;

373607 If the first executable statement of a stored procedure was a SELECT ... INTO, then using this procedure in the FROM clause of a SELECT statement would have caused the server to crash. This has been fixed

For example:

create procedure P1 ()

begin

declare var varchar(128);

select first table_name into var from systable;

end

then

select * from P1()

would have crashed the server.

373613 An obsolete Java class could have caused the error "-110 - 'Item ... already exists'",

when attempting to install a new version of a Java class previously removed. This has been fixed.

373614 When a later version of Visual Studio .NET was installed and subsequently uninstalled, the .NET installer would fail and popup a message box.

For example, if Visual Studio .NET and Visual Studio .NET 2003 were installed and then Visual Studio .NET 2003 was removed, the UL.NET installer would still have thought 2003 was installed.

The changes for Engineering Case 368160 attempted to address this problem, but the failure could still have occurred as the UL.NET installer must use two different strategies to integrate into Visual Studio, and only one was correctly fixed. Now both are fixed.

373623 When synchronizing a version 6 or version 7 MobiLink client to a version 9 MobiLink server, that was connected to a RDBMS other than ASA, it was possible for the MobiLink server to report an "Invalid datetime format" error after having sent the download stream to the remote. This has now been fixed.
373705 Ultralite Dynamic SQL could have produced incorrect results with an ANY condition in the WHERE clause, if there was a subquery that contained a reference to a column in the original query. This has been fixed.
373732 Statistics for the index on the SYSATTRIBUTE system table may have become incorrect in rare cases. This would have been reported as a validation error. The problem has been fixed.
373733 When using UltraLite Dynamic SQL, queries with refrences in the SELECT clause, to derived-table columns from the WHERE clause, could have been incorrectly optimized. This has been fixed.
373740 The Interactive SQL utility dbisql, could have become unresponsive if a statement which returned many large result sets was executed. Interactive SQL would have attempted to display all the result sets, and could eventually run out of memory .

Two changes were made to address this problem:

1. The "Show multiple result sets" setting was being ignored. Now the setting is respected, so by default, only the first result set is displayed.

2. Even if the "Show multiple result sets" setting is on, only the first 10 result sets will be displayed.

373752 Attempting to duplicate a Group by copying it to the clipboard and then pasting it into the Users & Groups folder, would not have copied any of the members. As well, if a Group was copied and pasted into Interactive SQL, the SQL for the group would not have ncluded the statements required to define its members. Both of these problems are now fixed.
373770 Attempts to use the builtin XML functions on proxy tables would have failed with the error "No name for arguement". This problem has been fixed.
373897 When the Index Consultant was run from Interactive SQL, it would have reported that any query could not be optimized due to optimizer/parser errors. The problem was caused by an incorrect query result returned from the server as a result of the changes made for Engineering Case 364372, which was fixed by Engineering Case 374844. With a server with that fix, the Index Consultant now operates normally.
373903 PocketBuilder and ASA 9.0.2

When trying to fetch data from a datawindow you get the error:

"S1090 - Invalid String or buffer length".

This issue doesn't appear in any combination of PB 1.5.2 and 2.0 with ASA 9.0.1. But with 9.0.2, the issue remains.

373919 If the Unload Database wizard was used to unload the data, but not the structure, from a subset of a database's tables, then all types of tables were listed in the wizard. This was misleading, since the wizard should only unload the data from base tables; that is, the data from proxy and global temporary tables should not be unloaded. Now, only base tables are listed in the wizard when choosing to unload data only. When choosing to unload the tables' structure, then all types of tables are listed as before.
373931 In some circumstances, attempting to unload the data from one or more tables by selecting the tables, and then choosing "Unload Data..." from the File menu, would have caused Sybase Central to crash. This has been fixed.

In addition, the "Unload Data..." menu item is now only available for base tables. It was previously available to proxy tables and global temporary tables as well, which was incorrect, as the Unload Data dialog can only be used to unload data from a base table.

374053 When using UltraLite Dynamic SQL, it would have taken a long time (approx 30 minutes) to create tables, when there were more than 200 tables already. This has been fixed.
374061 The QAnywhere Agent could have sent or received messages with an "ondemand" policy, without it calling QAManager.TriggerSendReceive. This has been fixed. Now, when qaagent is started with "ondemand" policy, messages are sent and received only when a client application calls QAManager.TriggerSendReceive, as documented.
374070 The ASA client dbmlsync, could have crashed, either while creating the upload, or at the end of the synchronization. This was more likely to occur with very large uploads. This behaviour has been corrected.
374085 The MobiLink listener's -x option (MobiLink stream parameters) did not accept stream parameters enclosed in braces. Braces are now allowed after this change.

For example, both of the following are now allowed:

dblsn.exe -x tcpip(host=localhost)

dblsn.exe -x tcpip{host=localhost}

374122 Any user with DBA authority could have connected to a web service, regardless of the restrictions placed on that web service by the USER clause. Now the USER clause restrictions are respected.

For example, if the following SQL was executed:

grant connect to hurz identified by 'sql';

create service test type 'html' user hurz as select * from systable;

grant connect to newdba identified by 'sql';

grant DBA to newdba;

then both hurz and newdba (as well as any other user with DBA authority) could have connected to the service test.

374123 The function http_variable() would have returned a non-obvious ordering for variables with multiple values.

For example, for the following request:

http://localhost/foo?id=1&id=2&id=3&id=4&id=5

http_variable() would return the values for id in the following order:

1, 5, 4, 3, 2

The function was adding variables (and their values), either after the first occurrence of the variable, or at the end of the list. Now, variables and their values are added after the last occurrence of the variable, or at the end of the list.

374162 In localized versions of ASA, the English string 'SubQ' (used as an abbreviation for subquery) was inconsistently translated in the long query plan (i.e. from the plan() function). It would appear translated in some contexts, and not in others. This prevented users from easily scanning the query plan looking for the same word to locate the subquery responsible for a given selectivity This has been fixed so that 'SubQ' always appears in the localized language of the plan.
374301 Attempting to synchronize via HTTPS through an Internet Information Services web server, with a VeriSign certificate, would have failed. This has been corrected.
374308 Extremely complex queries with many equality predicates, for which the optimizer underestimated the number of rows in the result set due to highly correlated predicates, may have had inefficient query plans. This fix introduces a new approach for dealing with such queries. Now, the optimizer evaluates for very complex and cheap queries, some static qualities of the enumerated plans that are not dependent on cost, or number of rows.
374353 The QAnywhere Agent, when run with "automatic" policy, could have performed message synchronizations very slowly where the download portion of the synchronization was interrupted and then restarted. This has been fixed, now synchronizations will recover in a more timely manner when the downloads are interrupted and restarted.
374441 When using the UltraLite Engine, connections to a database could have failed with error SQLE_UNRECOGNIZED_OPTION, if the StartLine connection parameter was provided for autostarting the engine. This has been fixed.
374445 When running the Index Consultant from Interactive SQL, the 'Show Plan with Virtual Indexes' button would have beeen disabled on non-English platforms, regardless of whether any virtual indexes had been recommended. The same problem could have appeared when using the Index Consultant from Sybase Central, if a previously saved analysis was viewed. This has been fixed.
374451 An application using the iAnywhere JDBC Driver would have leaked memory if it called Connection.getMetaData() repeatedly. This problem has been fixed.
374452 If a proxy table to a DB2 table with a CLOB column, was used in a query, then selecting that CLOB column would have failed with an unsupported datatype error. This problem has been fixed.
374459 If a client connection to an UltraLite engine crashed, or terminated without properly calling DatabaseManager::Shutdown, and had autostarted the engine, the engine would not automatically shutdown. This has been fixed.
374490 If the environment variables TMP or TEMP were not set, the MobiLink client dbmlsync, would have given the error:

"Unable to open temporary file "MLSY\xxxx" -- No such file or directory"

and refused to start. This problem is now fixed.

374535 The Ultralite Dynamic SQL parser did not support the Datetime() function and incorrectly generated a syntax error. This has been fixed.
374580 An InvalidCastException would have been thrown when filling a DataTable using AsaDataAdapter, if a returned TIME column was mapped to a STRING column in the DataTable.

This problem has been fixed.

374595 After performing a large upload, there was a long pause at the end of synchronization. This pause would have occurred after the message "Disconnnecting from Mobilink server" was printed in the log, but before the message "Synchronization Completed". This has been fixed, although the pause may still occur during a synchronization when the MobiLink client expects to subsequently perform another synchronization before it shuts down, (for example because a schedule option has been specified, or more than one -n switch has been specified on the commandline, or the restart option in the sp_hook_dbmlsync_end hook has been used). In these cases the pause at the end of the earlier synchronization is offset by a time savings in the following synchronization.,
374602 Interactive SQL could have failed with an internal error (NullPointerException) when one of its windows was closed, and all of the following were true:

- more than one window had been opened by clicking the "Window/New Window" menu item

- more than one window was closed in quick succession

This was was more likely to have occurred on busy machines. It has now been fixed.

374620 When calling UltraLite_TableSchema::GetIndexSchema( ordinal ), if the ordinal was greater then the number of indexes in that table schema, an error would have been generated, and an illegal UltraLite_IndexSchema object would have been returned. Using a method on that object would have then caused a crash (illegal memory access). This is now fixed.
374630 On Mac OS X, script files, which did not have a file extension, were not able to be selected by the "Run Script" menu item. . A ".sql" was always added to the file name. This has now been changed so that a ".sql" file extention is no longer required.
374705 When the Unload utility dbunload, was run with the command line option -ar (rebuild and replace database), the old transaction log file may not have been deleted after the database was successfully rebuilt, even if there was no replication/synchronization involved in the original database. This problem has been fixed.
374709 If the server was attempting to start the TCPIP link, but could not bind to port 2638, possibly because it is already in use, it would not have chosen a random port to listen on. This has been fixed.

Note, this problem only affected servers on Windows and Netware systems, it did not affect servers running on Unix systems.

374714 Executing a statement using Interactive SQL that sends messages back to the client (ex. ALTER DATABASE UPGRADE, or CREATE DATABASE, or MESSAGE ... TO CLIENT), could have caused Interactive SQL to crash, if the connection was via the iAnywhere JDBC driver. This has now been fixed.

While the problem exists on all platforms, the crash has only been seen on AIX systems.

374727 When using the iAnywhere JDBC Driver to connect to a DB2 database using the IBM DB2 ODBC driver, and the method ResultSet.getObject() was used on a BLOB column, the iAnywhere JDBC Driver would have failed with the error "Failed to map result on column ? to a Java class" where ? is the column number. This problem has been fixed.
374752 If a server was listening on more than one HTTPS port, it was possible that HTTP requests for services created with SECURE ON would have been redirected to an HTTPS port that could not handle the request. This has been fixed.

For example, given a server started with the following command line options:

-xs http,https(port=443;dbn=db1),https(port=444;dbn=db2) db1.db db2.db

If "sec" was a secure service in db2, then HTTP requests for "/db2/sec" would have been redirected (via the 301 status code) to port 443 rather than 444. In most cases, this would result in a "404 Not Found" status, but could possibly have executed the wrong service. In this case, if db1 had a service called "db2/sec".

374822 Recovery of transactions requiring the Wait_for_commit option to be ON could have failed assertion 100904 "Failed to redo a database operation". For this to have occurred, the following must have been true:

- The WAIT_FOR_COMMIT option must have been on as a temporary option (not a user-level option)

- A connection must have started a transaction

- A subsequent checkpoint must have occurred while the transaction started was still active (ie. had not been committed or rolled back).

- Additional operations on the transaction must have been performed that *required* the WAIT_FOR_COMMIT option and must have been written to disk (likely due to a commit)

- The server must have gone down dirty before any other checkpoint occurred.

This has been fixed, the Wait_for_commit option is now always on during recovery.

374840 Calling the Connection.getCatalog() method, when using the iAnywhere JDBC Driver, would have yielded a string with extra characters. Note that this problem only existed if the JDBC Driver was used to connect to a server other than an ASA server. The problem has been fixed.
374844 The changes for CR 364372 could have caused, in rare situations, an incorrect result set to be returned. This has been fixed.
374846 Issuing a CREATE VIRTUAL INDEX statement on a proxy table would have caused the server to crash. A crash could also have occurred if the Index Consultant was run against a workload containing queries over proxy tables. This has been fixed. Note that although virtual index creation is allowed on proxy tables, such indexes are not meaningful and are not considered by the optimizer.
374870 The Palm HotSync Conduit Installation Utility (dbcond9.exe) may have crashed when installing or uninstalling a conduit on Windows NT 4.0, if the HotSync Manager was not available. This has been fixed.
374874 When using a cursor for which prefetch could be enabled, the fetch performance of many rows may have been slower than expected. In order for this problem to have occurred, the bound size, or described size, of the columns would have to have been fairly small (less than 50 bytes), and the number of rows prefetched must have been reduced by the maximum memory used for buffering prefetch data (see the PrefetchBuffer connection parameter). This has now been fixed.
374895 Attempting to start a server on NetWare that supported both ecc_tls encryption and https, would have failed with the error - 'Missing or invalid encryption DLL "dbrsa9s.nlm"'. When starting a server with both ecc_tls and rsa_tls encryption, the server would have started, but rsa_tls would not have been supported. This has been fixed.
374975 Under some circumstances, the Index Consultant could claim a benefit for the query or workload, even though no indexes were recommended. This has been fixed.

Note that the same problem could have occurred in the Sybase Central Index Consultant as well, although it is less likely. It has been fixed there as well.

374976 The debugger would have shown all connections on the server, instead of only showing those connections to the database that the debugger was connected to. This has been fixed.
374988 An INSERT statement, using the ON EXISTING clause to insert the result set of a query involving a remote table, into a local table, would have failed with a syntax error. The server will now execute these statements correctly.

For example, instead of generating a syntax error, the following will cause table 'bar' to contain one row:

CREATE SERVER asademo CLASS 'asaodbc' USING 'driver=Adaptive Server Anywhere 9.0;dbn=asademo';

CREATE TABLE foo(c1 int) AT 'asademo...';

create table bar( c1 int primary key );

insert into foo values(1);

insert into foo values(1);

insert into foo values(1);

commit;

insert into bar on existing skip select * from foo;

select * from bar

374990 The server could have exhibited slower than expected insert performance on a multiprocessor machine when multiple clients were repeatedly attempting to insert into a table containing an index, primary key or unique constraint. Specifically, this problem occured when the clients were doing repeated inserts to the end of an index (such as is the case with an autoincrement primary key column). In this case, the server running on multiprocessor machines with more CPUs could exhibit relatively little performance improvement over the server on machines with fewer CPUs. This has been fixed.
375084 If a request-level log contained host variable information for a TDS connection, the system procedure sa_get_request_times would not have recorded the host variable information in the satmp_request_hostvar table. This has been fixed.
375088 If a client application was connected via jConnect or the Open Client interface, and the application attempted to query a UNIQUEIDENTIFIER column, the query would have failed with the error "Attempted conversion between an illegal pair of types". This problem has now been fixed.

Note that in addition to getting a new server, a new version of jcatalog.sql will have to be run against the database with the UNIQUEIDENTIFER column, to fully implement this fix.

375097 When running on NetWare 5.1 with service pack 8, the ASA server would not start up if TCPIP or HTTP was used. When the -z (display debugging information) command line option was used, the message "TCP/IP link, function bind, error code 10038" was displayed on the

console. This has been fixed.

Note that at the time of this fix, NetWare 5.1 SP 8 was still in beta.

375102 In rare cases, the optimizer may have produced plans that omitted a sort. For example, the following query requires 2 sorts to properly calculate the 3 window functions.

select

sum(emp_id) over (order by emp_fname, emp_lname),

sum(emp_id) over (partition by emp_lname),

sum(emp_id) over (partition by emp_lname, emp_fname)

from employee

Previously, it would only have used one. This has been fixed.

375197 A problem with GROUPING SETS, that could have caused server crashes, has been fixed.
375203 On Linux and HP-UX systems, if a large number of clients were doing synchronizations at the same time against DB2, the Mobilink server could have crashed. The error would be "Error: Unable to dump exception information. Received exception while processing exception." or "Error: An unexpected exception has been detected in native code outside the VM." This is a stack overflow problem. This has been fixed by increasing the size of the stack on these platforms.
375205 When adding or removing Java classes or JAR files in a database, a class might have appeared in the All Java Classes folder, but not in the Java Packages or JAR files folder. This has been fixed. Now, all sub-folders of the Java Objects folder are kept synchronized.
375236 Under rare situations, calls to functions that took string parameters, could have crashed the server. This was only a problem on Unix systems, and has now been fixed.
375256 In the Java class description and source details panels, the line and column indicators were missing from the status bar. This has now been fixed.
375268 Interactive SQL (and the ASA plug-in for Sybase Central) were displaying UNIQUEIDENTIFIER values as hexadecimal strings, of the form "0xaabbccddeeffgghhiijjkkllmmnnoopp". Now it displays them using the usual GUID notation: "aabbccdd-eeff-gghh-iijj-kkllmmnnoopp".
375325 On non-English platforms, db_property('PlatformVer') and db_property('CompactPlatformVer') could have returned mangled strings. This problem also affected graphical plans, which include these properties in their output. The problem could have caused Interactive SQL to fail to display the results of a query containing these functions. This has been fix. The descriptive string returned from the OS was not being converted to the server's character set, now it is.

This was only likely to cause problems when connected to a database using jConnect, but it may possibly have affected the ODBC and ESQL drivers as well, and was most likely to affect servers running on Chinese and Japanese non-Windows OS versions.

375327 If the -o switch was used on the server to specify a message log output file, and the file could not be opened, a message was displayed in the server console window, and the server started anyway. This has been fixed, now if the output file cannot be opened, the server will report an error and will not start.
375341 The Index Consultant may have reported 'identifier ... too long' during analysis, and failed to continue. This could have happened if the queries being analyzed were over tables with long names and columns with long names. This has been fixed.
375348 Calls to web services client functions could have failed with error -981 ("Unable to connect to the remote host specified by '<URL>'") when the server was running on NetWare systems. This would only happen if more than one client called web services client functions at the same time. This has now been fixed.
375368 UltraLite UNICODE ODBC did not handle DECL_DECIMAL properly. The conversion to string, required by the ODBC definition, did not append a null delimiter character to the converted string with UNICODE. This has been fixed.
375369 When debugging a procedure or a Java class, if the editor was open when the breakpoints dialog was closed, it scrolled back to line 1. This has been fixed.
375421 The MobiLink server may have hung, with 100% CPU usage, when fetching user scripts containing Japanese characters, if the consolidated database was an Oracle database with Japanese character set JA16SJISTILDE, and the MobiLink server was running on a Japanese OS and used the Data Direct native ODBC driver 4.20.00.xx for Oracle. A work around for a problem in the Data Direct driver has been implemented.
375586 The following Connection events were missing from the combo box in the Connection Script wizard: authenticate_parameters, begin_publication, end_publication, and modify_error_message. This meant that it was not possible to use Sybase Central to create scripts for these events. These events have now been added.
375757 If a BACKUP or RESTORE statement was executed from the Open Client Isql utility, while the backup.syb file was marked as read-only, the server could have crashed. This has been fixed.
375851 When using UltraLite Dynamic SQL, a LIKE condition could have produced incorrect results, if the left operand was a column which occurred first in an index, and that column was larger than 126 characters. This has now been fixed.
375971 An application could have hung, received a communication error, or have possibly seen other incorrect behaviour, when doing a fetch with prefetch enabled, and then immediately doing a commit, rollback, or another fetch with an absolute or negative offset. It was rare on multiprocessor machines, and would have been even rarer on single processor machines. As well, there may have been other timing dependent cases which could have failed. This has been fixed.
376019 Executing queries containing the GROUP BY clause could have caused the server to crash. The changes for Engineering Case 332010, and a related change for case 363861, introduced the problem, which has now been fixed.
376104 When processing an INSERT statement, the value of in inserted expression could have had the wrong value if it was a complex expression involving NUMBER(*). This has now been fixed.

For example, the following would have generated incorrect results:

BEGIN

DECLARE LOCAL TEMPORARY TABLE t ( row_number INTEGER );

INSERT t SELECT 2 + NUMBER(*) AS row_number ORDER BY dummy_col;

SELECT * FROM t;

END;

376133 The MobiLink server could have behaved incorrectly, (invoked the begin_synchronization scripts, for instance), or even crashed, if there were network or client problems before the server received the full upload stream. This problem is now fixed.
376202 Installing an EBF may have abnormally terminated as it was about to copy files to the target system. This has been fixed.
376210 The server could have crashed while performing Index Consultant analysis on a complex query. This was only likely to happen in queries with numerous equality predicates, and either an ORDER BY, GROUP BY, or SELECT DISTINCT clause. This has been fixed.
376229 Version 6.0.x clients were not able to connect to 9.0.2 servers over TCP/IP. This has been fixed.
376444 If a view V1 caused a warning to be given when referenced (e.g. the result returned is non-deterministic), and another view V2 referenced V1, and the definition of V2 was output into the reload.sql script by DBUNLOAD before the definition of V1, then V2 may not have appeared in the database after the reload.sql script has run. This has been fixed. ALTER VIEW ... RECOMPILE did not handle a warning being set while building a cursor for the view. The warning is now cleared before making catalog changes and then is restored.
376453 An ADO .Net application that attempted to obtain the primary keys from a query on a table using the OLEDB provider, may have been returned incorrect results when the table had more than one primary key column and/or columns with unique constraints or unique indexes.

A sample code fragment follows:

DataTable Table = new DataTable(textTableName.Text);

OleDbDataAdapter adapter;

OleDbConnection connection = new OleDbConnection(textConnectionString.Text);

using (connection)

{

try

{

connection.Open();

adapter = new OleDbDataAdapter("select * from dba." + textTableName.Text + " where 1=0", connection);

adapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;

adapter.Fill(Table);

listBox1.Items.Clear();

foreach(DataColumn col in Table.PrimaryKey)

{

listBox1.Items.Add(col.ColumnName);

}

}

catch (Exception ex)

{

MessageBox.Show(ex.Message);

}

}

The DataTable PrimaryKey property is an array of columns that function as primary keys for the data table. This problem has been fixed.

One of the elements that ADO.Net uses in deciding whether a column belongs in this set is the column metadata rowset.

IColumnsRowset::GetColumnsRowset - Returns a rowset containing metadata about each column in the current rowset. This rowset is known as the column metadata rowset and is read-only. The optional Metadata Column DBCOLUMN_KEYCOLUMN is described to contain one of the values VARIANT_TRUE or VARIANT_FALSE or NULL.

VARIANT_TRUE � The column is one of a set of columns in the rowset that, taken together, uniquely identify the row. The set of columns with DBCOLUMN_KEYCOLUMN set to VARIANT_TRUE must uniquely identify a row in the rowset. There is no requirement that this set of columns is a minimal set of columns. This set of columns may be generated from a base table primary key, a unique constraint or a unique index.

VARIANT_FALSE � The column is not required to uniquely identify the row.

This column used to contain VARIANT_TRUE or VARIANT_FALSE. It now contains NULL since OLEDB cannot correctly set the value. As a result, ADO.Net uses other means for determining which columns belong in the PrimaryKey columns property.

376554 Upgrading an Oracle 8.1.7 database server, used as a consolidated database by MobiLink, from ASA version 9.0.1 to version 9.0.2 would have failed if the standard upgrade script MobiLink\upgrade\9.0.1\upgrade_ora.sql was used. This script has beed fixed. The failure was as a result of trying to upgrade the data in QAnywhere system tables, so if QAnywhere is not being used, or the existing QAnywhere data does not matter, the failure can be ignored, and the rest of the script executed. If any QAnywhere data is required to be preserved, the fixed script is needed.
376567 Message delivery would have been slow to QAnywhere clients using the "automatic" policy, with push notifications enabled. Message delivery to the server was fast, but the server was slow using push notifications to the message addressee to indicate that a message for the addressee was available. By default, the delay in the notification could be up to 60 seconds. This has been fixed. As a work-around however, the server option "ianywhere.qa.server.autoRulesEvaluationPeriod" can be set in the server configuration file to a lower number, for example 5000 (milliseconds), to speed-up notification check process.
376606 Creating a COMMENT on a local temporary table would have caused the server to fail with assertion 201501 - "Page for requested record not a table page or record not present on page".

Example:

declare local temporary table temp1(c1 int);

comment on table temp1 is 'my comment';

Now an error is returned when attempting to add a comment to a local temporary table.

376608 If an Open Client application opened a cursor which cuased the warning: "cursor options changed", the application would have failed to open the cursor. This problem has now been fixed. There are situations where Open Client applications are not expecting warnings, so certain warnings that are known to not be handled are suppressed, while other warnings are sent as the client actually expects them. The "cursor options changed" warning has been added to this list of warnings not to be returned to an Open Client applications.
376609 Running the Collation utility with the command line option '-d x y' could have failed with the error 'Unable to open x as internal collation or file' when converting custom collation file 'x' to script file 'y'. This has been fixed.
376617 HTTP connections to a database initialized with the collation 874THAIBIN, would have incorrectly returned a charset value of 'none', rather than the correct value of 'TIS-620'. This has been fixed.
376620 The QAnywhere Agent was launching dbmlsync and dblsn with maximum verbosity settings. Now, dbmlsync and dblsn are launched with minimum verbosity by default, otherwise honouring the -v command line switch setting.
376699 On Windows 95, 98 or ME, the build number of the operating system was displayed incorrectly.

For example:

"Running on Win98 build 67766222"

The correct OS build number is now displayed.

376713 Inserting BLOBs or CLOBs bigger than 32k, via the iAnywhere Solution 9 DB2 WP driver 4.20.00.25( 9.0.1GA) or 4.20.00.92(B0072,U0065)( 9.0.2GA), would have failed with the error:

"[ODBC DB2 Wire Protocol driver]Unexpected Server Reply (Conversational Protocol error code: 146C (PRCCNVCD)). [-1217] ['HY000']"

This problem has been fixed in version 4.20.00.115(B0080,U0069). To upgrade this driver, the following files should be changed:

wqdb219.dll

wqdb219r.dll

This fix is for Windows systems only.

376721 When running on NetWare 5.1 with Service Pack 8, the ASA server would have hung on shutdown after displaying the message "Database server stopped at <date> <time>". Some of the NLM unloading code changed in SP 8. This has been fixed, the server now supports these changes..
376742 If the sybase_sql_ASAUtils_retrieveClassDescription() function was called with a very long class name, a server crash could have occurred. This has been fixed.
376840 The MobiLink Server could have crashed when using the HTTP link for synchronization, if the remote stopped communicating with the server at a specific point in the synchronization. The crash actually occurred when the server timed out the connection. This has been fixed.
376892 The following issues with UltraLite Interactive SQL's Open Connection dialog have been addressed:

- If the extension (.udb or .pdb) of the database file was missed, it was not automatically added. Now a connection will be attempted with the file name as specified, and then with a .udb extension, and then finally with a .pdb extension.

- The browse button would initially display only .udb files. Now both .udb and .pdb files will be displayed.

- It was not possible to scroll the Filename combo box. This has been fixed.

376895 When the database option "Delete_old_logs" was set to "on", SQL Remote, (as well as MobiLink, and the ASA RepAgent), may reported "missing transaction log(s)...". This would have occurred in the following situation:

1) the online transaction that contains the last replication/synchronization offset, had been renamed, say to X;

2) the offline log X contained transactions that started from an early log, say Y; and

3) the log Y contained transactions started from an earlier log, say Z.

Transaction log Z may have already been deleted. This problem is fixed now.

376977 If an application's operating system used a multibyte character set, which was different from the character set of the database being unload by the Unload utility dbunload, then dbunload could have generated an invalid reload.sql script, and dbunload -an could have failed with a syntax error. Note that dbunload -an turns off character set translation so the character set used by dbunload in that case is the same as the database character set. For example, running dbunload -an on a Chinese (cp936) machine to unload and recreate a UTF8 database could have failed with a syntax error, or could have crashed. This has been fixed.
376990 Executing a "START JAVA" or "STOP JAVA" statement that did not end in a command delimiter, would have caused Interactive SQL to hang. This has been fixed.
377011 UltraLite could have produced incorrect results when an index was used in reverse order, and the indexed column contained NULLs. This has now been fixed.
377019 On Windows systems, when selecting numeric values from ASE 12.5.0.1, the iAnywhere Solution 9 ASE Wire Protocol driver version 4.20.00.06, would have failed with the error:

"[ODBC Sybase Wire Protocol driver][SQL Server] Arithmetic overflow during implicit conversion of NUMERIC value '-2.200000000' to a NUMERIC field."

The problem is due to the maximum precision of a numeric column on ASE server. This has been fixed in ASE 12.5.0.3. Version 4.20.00.63 of the ASE driver works around the problem. To upgrade to this driver, the following files need to be changed:

wqdb219.dll

wqdb219r.dll

wqase19s.dll

377021 A cursor for a query with a single group by expression, was incorrectly qualified to be of type 'sensitive'.

For example:

"select sum(T.x) from T"

This has been fixed. Depending on the desired cursor type, the server may change the cursor type accordingly, and return a warning. For example, under ODBC, if the desired cursor type for a cursor of a single groupby query is KEYSET-DRIVEN, the actual cursor type is determined to be STATIC.

For more information on cursor sensitivity please see:

ASA Programming Guide

Using SQL in Applications

Adaptive Server Anywhere

Cursor sensitivity overview

377036 If the MobiLink client was run with the -vn option, ('show upload/download row counts'), but not the -vr option, ('show upload/download row values'), or the -v+ option, ('show all messages'), then the upload row counts reported for each table would be cummulative, that is each rows count would include not just the rows uploaded from that table, but also those uploaded for all previous tables.
377116 The reload.sql file created by the Reload utility did not double-quote the login name for CREATE EXTERNLOGIN statements. This may have caused a syntax error during reload. This has been fixed, the login name is now double-quoted.
377141 The UltraLite Interactive SQL utility would have displayed only part of a column's name in the header of the result set after a query result was initially executed. This has been fixed, it will now display the entire column name, making it easier to read the result set
377155 Creating an index on a function and then inserting, updating, or deleting data into the table on which that index was created, could have created an invalid transaction log entry. If the index was added before any other operations are performed on the table or the server was shutdown after the index was created, and before any other operations were performed on the table, the log would have been valid. This has been fixed.
377161 The error code displayed by the UltraLite Interactive SQL utility when a query failed, or after an unsuccessful connection, did not correctly display the SQL Code associated with the error. This has been fixed, it now will display the SQL code after the initial error message.
377276 Setting up or upgrading an ASE 12.0 database server, used as a consolidated database by MobiLink, would have failed. The problem was as a result of trying to setup the QAnywhere system tables, so the errors can be ignored if QAnywhere is not being used. The setup and upgrade scripts have been fixed.
377349 If a JMS server associated with a QAnywhere JMS connector went down, then some QAnywhere messages directed towards JMS, via the connector, may have been incorrectly routed to the dead message address instead. This has been fixed such that QAnywhere messages directed to a JMS server that is down, will be queued until it comes back up.
377433 If a jConnect or Open Client application made several requests to the server using many host variables, but didn't open any cursors, and then attempted to use a jConnect or Open Client cursor with host variables, then the server would likely have crashed. This problem has been fixed.
377450 If one, or both, of the tables in a full outer join was a proxy table, executing the query would have caused the server to either crash, or give a syntax error. Remote data access did not support full outer joins, This has been fixed, full outer join support has now been added.
377471 Attemps to synchronize proxy tables would have failed with the error message "Feature 'remote savepoints' not implemented". This has been fixed.
377566 Under rare circumstances, when executing an UPDATE statement, the server could have created empty histograms, and/or corrupted the selectivity of IS NULL predicates. This problem has now been resolved.
377586 An application thread using the QAnywhere client library for messaging, would have blocked during message synchronization. Normally this was quite brief, however, if synchronization was having difficulty establishing a connection with the QAnywhere server, the blocking could have lasted several minutes. This problem is fixed.
377749 A REMOVE JAVA CLASS ... statement would sometimes have failed to remove the Java class, as an obsolete version of the class had a foreign key reference to the current version. This problem was been fixed by deleting all obsolete versions of a Java class first, and then deleting the current version.
377755 If a connection updated rows in a table and subsequently left a cursor open past a commit or rollback, other connections would not have been able to lock the entire table in share mode (ie LOCK TABLE ... IN SHARE MODE) until the updating connection closed the cursors and executed either a commit or rollback. If a cursor is left open past a commit or rollback, the schema locks persist until the cursor is closed, but other locks are now released.
377759 In Transact-SQL stored procedures, cursor names in DECLARE CURSOR statements were required to be unique. It was not possible to conditionally declare a cursor, then use a common set of statements to access the cursor. Now, DECLARE CURSOR statements in Transact-SQL procedures are treated as executable statements, and may appear anywhere in a procedure. The cursor declaration takes effect when the statement is executed and remains in effect until a DEALLOCATE CURSOR statement is executed or until the procedure completes. In Watcom-SQL procedures, cursor names must still be unique and cursor declarations must appear with variable declarations at the start of a BEGIN..END block.
377878 The MobiLink client could have crashed, or behaved irratically, when when the value of the 'charset' database property for the remote database was longer than 29 bytes. In particular, this was the case for databases with the EUC_JAPAN collation, although there may be other such collations. This issue has been fixed.
377879 On Windows CE, when synchronizing a remote database with a double-byte character set, the MobiLink client would issue the following warning if the database's character set was not identical to the operating system's character set:

"Unable to convert the string ... from the system collation to the database collation".

The MobiLink client will no longer issue this warning if the operating system character set and the database character set are very similar (for example cp932 and sjis).

377885 If an application used the PreparedStatement.setTimestamp() method to set a timestamp parameter, then the millisecond portion of the timestamp would not have been set. This problem has been fixed.
377900 When using timestamp-based downloads with MobiLink and an Oracle consolidated database, special steps are required to ensure that all changes will be downloaded. Otherwise uncommitted changes from before a download may be missed in downloads that occur after the changes are committed, assuming that triggers are used to record "last modified" timestamps for each row. In other RDBMSes, the download will block until changes are committed, assuming MobiLink's default isolation level, so changes are not missed.

To help download scripts avoid this problem, the MobiLink server now sets the next "last download time" to the start time of the oldest open transaction. This ensures that all changes will be picked up in the next synchronization that occurs after they are committed. The Oracle account used the by the MobiLink server must have permission for the V_$TRANSACTION Oracle system view, otherwise the following warning message will be displayed:

Unable to access ORACLE table 'v_$transaction'. Access is needed in order to ensure no data is missed if using timestamp-based downloads.

Note that only SYS can grant this access, and it must be granted for the base V_$TRANSACTION view (V$TRANSACTION is a synonym for the V_$TRANSACTION view, and hence cannot have permission granted on it directly). The syntax is:

grant select on SYS.V_$TRANSACTION to <user_name>;

Workaround:

For earlier versions of the MobiLink server, equivalent functionality can be achieved with the following procedure:

The simplest way to make sure that all changes are downloaded, assuming a trigger is used to maintain a last_modifed marker for each row, is to change the next "last download time" to be the earliest start time of the open transactions. MobiLink offers the modify_next_last_dowload_timestamp connection event for modifying the next "last download time", but it is invoked at the end of the download transaction, and the new value needs to be determined at the beginning of the download transaction. So the value needs to be determined in the begin_download connection event, and used in the modify_next_last_download_timestamp event. In this example the value is stored in a package variable between the events.

Here are detailed instructions:

1. Ensure that the MobiLink connection (i.e. Oracle user) has permission to access the V$TRANSACTION Oracle system view. Only SYS can grant this access, and it must be granted for the base V_$TRANSACTION view (V$TRANSACTION is a synonym for the V_$TRANSACTION view, and hence cannot have permission granted on it directly):

grant select on SYS.V_$TRANSACTION to <user_name>;

It is essential for the user to have the permission directly, rather than through a role, because a stored procedure does not have role privileges.

If GRANT access is not wanted on the whole view, instead define a view that only allows access to the required start_time column, as in the following example:

create view transaction_start_times

as

select start_time from v$transaction;

grant select on transaction_start_times to public;

2. Create a package with a variable to hold the timestamp value (use DATE type instead of TIMESTAMP for Oracle 8), and procedures to set and get it (from MobiLink events):

create or replace package SyncVars

as

procedure SetDownloadTimestamp;

function GetDownloadTimestamp return timestamp;

end SyncVars;

create or replace package body SyncVars

as

DownloadTimestamp timestamp;

procedure SetDownloadTimestamp

as

begin

select nvl( min( to_timestamp( start_time, 'mm/dd/rr hh24:mi:ss' ) ), localtimestamp )

into DownloadTimestamp

from v$transaction;

end SetDownloadTimestamp;

function GetDownloadTimestamp return timestamp

as

begin

return DownloadTimestamp;

end GetDownloadTimestamp;

end SyncVars;

3. Add a begin_download connection script to determine the timestamp value:

exec ml_add_lang_connection_script( 'version?', 'begin_download', 'SQL','begin SyncVars.SetDownloadTimestamp(); end;' );

4. Add a modify_next_last_download_timestamp connection script to replace the timestamp that will be used by MobiLink:

exec ml_add_lang_connection_script( 'version?','modify_next_last_download_timestamp', 'SQL','begin ? := GetDownloadTimestamp(); end;' );

Then the table download_cursor scripts just need to use the usual 'WHERE last_modified >= ?' clause, since the value that MobiLink passes in for the question mark will be the timestamp value determined in the previous synchronization.

377905 The documentation describes a MobiLink client hook called sp_hook_dbmlsync_process_return_code. The documentation is incorrect in that the name of this hook is actually sp_hook_dbmlsync_process_exit code. Otherwise the documentation on this hook is correct.
377911 Using AWE on Windows 2003 would very likely have caused some or all of the following:

1) a blue screen error 76 with text "Process has locked pages",

2) event log messages indicating that a "driver is leaking locked pages",

3) ASA fatal errors indicating the reads or writes were failing with the error code 1453 (ERROR_WORKING_SET_QUOTA), and/or

4) other generic fatal read/write errors

Microsoft has fixed this problem in Service Pack 1 of Windows 2003. It is our understanding that no fix will be made by Microsoft prior to the release of Service Pack 1.

In order to prevent these serious consequences the database server can no longer be started on Windows 2003 pre-SP1 while using AWE. Any attempt to do so will result in a startup error "Windows 2003 does not properly support AWE caching before Service Pack 1"

At the time this description was written there was no existing Microsoft Knowledge Base (KB) article describing this issue.

378026 Executing a query involving a column for which the server estimate for NULL selectivity had become invalid (ie greater than 100%), could have caused the server to crash. The server will now deal with this situation without crashing. The problem can be rectified by recreating the affected column statistics using the CREATE STATISTICS statement.
378033 When creating a new breakpoint in the debugger, the procedure list was not sorted. This has been fixed, now the list of procedures, events, and triggers is sorted.
378034 Executing a procedure that called a function in an external library could have caused the server to crash if the called routine was using the old-style API. The problem occurred when the function was declared in SQL with fewer arguments than it was actually written to handle. Consider the following example of a user-defined function accepting one output argument.

CREATE FUNCTION "DBA"."MachineName" (out @iMachine char(255))

returns integer external name

'Win32MachineName@C:\\path\\mytools.dll'

begin

declare @iMachine char(255);

call dba.MachineName(@iMachine);

select @iMachine

end

If the actual function was written to accept more than one argument (e.g., int Win32MachineName( char *p1, char *p2 ) ) and the function employed the "callee pops the arguments" protocol, then the stack pointer will be improperly aligned upon return to the caller (the server in this case). It will point to a memory location 4 bytes higher than where it should.

After the user function was called. the server checked, and corrected, the stack misalignment. There was, however, a small window of a few instructions where the stack pointer was misaligned and the server makes some other function calls. This resulted in the top of the stack being corrupted. In previous versions of the server, this did not result in any permanent harm. In more recent versions of the server, an important pointer is correpted, resulting in a crash.

Now, the server pushes and pops extra guard words on the stack so that these unused stack positions will be corrupted instead. The server also now checks for a serious stack underflow and will issue an assertion (103701 "Function parameter list mismatch") and stop rather than crash.

378101 If a column of type Double or Float had DEFAULT AUTOINCREMENT defined, and the maximum value for the column had already been inserted into the the table, then inserting the DEFAULT value will yield unexpected results instead of inserting the expected NULL value. This problem has been fixed.
378115 The MobiLink ASA client may not have shut down gracefully when it was running as a Windows service. This may have caused resources such as temporary files, not to have been cleaned up before shutting down. This problem has now been fixed.

Note, this problem applied to the MobiLink synchronization server and SQL Remote for ASA as well, and have also been fixed.

378225 If WAITFOR ... AFTER MESSAGE BREAK was used to wait for a message from another connection and no message was received before the end of the specified waiting period, querying the value of connection_property('MessageReceived') would return the value of the previous message received. Now in this situation, connection_property('MessageReceived') will return an empty string.
378230 Queries containing predicates with subqueries may have crashed the server during execution. This may hace occurred if one of the following conditions was met:

1. There were at least two predicates with subqueries referencing the same table T, and T was also referenced in the main query block. In the example below, t3 is referenced in both subqueries and in the main query block.

2. There was an index on the outer reference columns used in the subquery. In the example below, t3 has an index on the column t2_id which is the outer reference column in both subqueries.

Example:

select * from t1 join t3 as t2 on t2.t2_id = t1.t1_id +1

where t1.t1_id between (select MIN(t3.t1_id) from t3 where t3.t2_id=t2.t2_id)

and (select MAX(t4.t1_id) from t3 as t4 where t4.t2_id=t2.t2_id)

378242 If a batch containing a call to an external procedure was executed, and the external procedure was subsequently canceled, the batch would have continued execution, instead of being canceled as well. This problem has been fixed.
378243 Repeatedly calling a stored procedure that performed an INSERT, UPDATE or DELETE into a proxy table, would likely have caused a server crash. This problem has been fixed.
378245 The QAnywhere Agent would have needlessly directed the MobiLink client (dbmlsync)to begin a synchronization process even though the MobiLink server was unreachable. This would have resulted in dbmlsync scanning the transaction log, and then failing the synchronization because it could not to connect to the server. The problem was only noticeable in cases where the transaction log scanning process was expensive and the server went offline and the transmission policy was scheduled. In this case, dbmlsync would cause high CPU usage and then fail to synchronize.

This problem has been fixed by doing a periodic check that the MobiLink server is reachable. This check is done only after a connection failure has occurred. Once the server is reachable again, the check is discontinued. The QAnywhere Agent will not direct dbmlsync to begin the synchronization process if it is known that the MobiLink server is unreachable.

378272 Attempting to view the SQL for a view, trigger, procedure or function, that contained a -- comment anywhere in the "CREATE|ALTER <object-type> [<owner>].name" prefix, may have caused Sybase Central to appear to hang, at 100% CPU usage. It was in fact, just taking a very long time to parse the SQL. This has been fixed.
378299 A new message system parameter called "invalid_extensions" now exists for the FILE and FTP messaging system. The customer can now stop dbremote from using certain file extensions for messages that are generated by specifying a comma separated list of extensions in this options. For example :

SET REMOTE ftp OPTION "Public"."invalid_extensions" = 'exe,pif,dll,bat,cmd,vbs';

378305 Sending an empty BytesMessage through the JMS connector may have caused the connector to crash due to an uncaught NullPointerException. This problem has been fixed.

Also, the handling of reply-to addresses through the JMS connector was changed to match the documentation.

378360 The Data Adapter did not set IsKey property to true when filling a DataTable if the source tables had unique indexes. This problem has been fixed.
378387 If membership in group SYS was revoked from PUBLIC, rebuilding a database using "DBUNLOAD -an" would have failed with the error: "Table 'SYSOPTIONS' not found"

This has been fixed.

A workaround is to unload without the -an option.

378482 Incoming JMS Messages marked as "redelivered", were not being processed correctly by the QAnywhere JMS connector. This could have resulted in messages being lost if the connection between the JMS connector and the JMS server was broken while the connector was in the process of receiving a message. Now redelivered messages are handled correctly.
378516 Attempting to run an ODBC application with a third-party Driver Manager would have resulted in a hang, or a crash, if the ASA ODBC driver stub (libdbodbc9.so) was present, but the actual drivers (libdbodbc9_n.so and libdbodbc9_r.so) were missing. This situation could occur if, when creating a custom ASA installation, the driver libraries were deleted, or were not copied. THis has been fixed.
378610 If the QAnywhere server crashed, it was possible that an incoming JMS message could have been acknowledged as received without the JMS message being forwarded onwards as a QAnywhere message. This has been fixed.
378613 The following problems related to the Import Wizard have been fixed:

1. When importing ASCII or FIXED files into an existing table, the column data types were always being displayed as "VARCHAR" on the last page. Now, the actual column types are displayed.

2. When importing FIXED data in an existing table, if fewer column breaks were placed so that fewer columns were defined than appeared in the actual table, the preview would still have shown columns for all of the columns in the database table. This was incorrect, and clicking on these extra columns would have caused Interactive SQL to crash. These extra columns are now no long displayed.

3. If the Import Wizard was closed by clicking the close box, it could still attempt to import the data. Now, clicking the close box is synonymous with clicking the "Cancel" button.

378742 If an item in the GROUP BY clause was an alias reference, that appeared more than once, then the statement would have failed with the eror "Function or column reference to '???' must also appear in a GROUP BY". This has been fixed.

The workaround is to remove the repeated item.

378835 The INSERT ... ON EXISTING UPDATE statement updates an existing row with the new column values. If a column list had been specified, then in addition to modifying the specified columns, the statement also modified columns with their default values. Now, the server will no longer update default columns unless explicitly asked to.

The following describes the new server behaviour:

1. When the row does not exist, the new row is inserted as per the

牋 usual rules of the INSERT statement.

2. If the row exists, and ON EXISTING SKIP is specified, no changes

牋 are made to the row.

3. If the row exists, and ON EXISTING UPDATE is specified, the row is

牋 updated as par the following rules:

牋 (a) All columns that have been explicitly specified in the

牋牋牋 INSERT statement are updated with the specified values.

牋 (b) Columns with defaults that are meant to be changed on an

牋牋牋 UPDATE are modified accordingly. These special defaults include

牋牋牋 "DEFAULT TIMESTAMP", "DEFAULT UTC TIMESTAMP", and

牋牋牋 "DEFAULT LAST USER".

牋 (c) Columns with other defaults are not modified unless some

牋牋牋 of these are explicitly mentioned with a non default

牋牋牋 value in the INSERT statement, in which case these columns

牋牋牋 are modified as par rule 3(a) above.

牋 (d) Computed columns are re-evaluated and modified using the new row.

牋 (e) Any other columns are left unchanged.

378936 After applying the 9.0.1 1965 EBF for Solaris, the server would no longer have run on machines with pre-SparcV9 CPUs. A SparcV9 instruction (CAS) was added to the server without properly detecting pre-SparcV9 chips. This has been fixed, the server now reverts to an emulated version of CAS on SparcV8 and older CPUs.
379070 The ON EXISTING UPDATE clause of the INSERT statement can be used to update existing rows. By default, columns with default values not mentioned in the column list of the insert statement, are left unchanged. With the new clause DEFAULTS [ ON | OFF ] specification described below, it is now possible to reset these columns to their default values.

INSERT ... ON EXISTING UPDATE [ DEFAULTS [ ON | OFF ] ] ...

Not using the DEFAULTS clause is equivalent to DEFAULTS OFF.

379071 If the server encountered unexpected file errors while starting, it could have displayed the error: "Unknown error (xxxxx)" (where xxxxx was meaningless).

For example, if asatest.db existed, running:

dbeng9 asatest.db" (the trailing quote is intentional)

would generate the error: "Unknown error (xxxxx)".

This problem has now been fixed so that unexpected file errors now display the error: "Could not open/read database file: <file name>"

379077 When the LOAD TABLE statement is used with the CHECK CONSTRAINTS OFF clause, it does not validate any check constraints on the table. However, the check constraints were built and annotated as part of the LOAD TABLE and failure to do so resulted in the statement being rejected. The server will now ignore the check constraints completely, by not attempting to build them at all.

As an example the following returns a "table not found error" when the table CT1 referenced in the check constraint is not visible to the user executing the LOAD TABLE statement:

grant dba,resource to dbowner

CREATE TABLE dbowner.CT1 ( c1 integer NOT NULL )

CREATE TABLE dbowner.T2 ( c1 integer NOT NULL, check(not c1 = any(select c1 from CT1) ) )

LOAD TABLE dbowner.T2 ... CHECK CONSTRAINTS OFF ...

379106 A multithreaded Embedded SQL application could, depending on timing, have failed with the error "Invalid statement" (SQLCODE -130). For this to have occurred, the application had to use the syntax "EXEC SQL DECLARE ... CURSOR FOR SELECT ..." in code which could be run by multiple threads concurrently. This has been fixed so that the SQL Preprocessor generates code for the syntax "EXEC SQL DECLARE ... CURSOR FOR SELECT ..." that is thread safe.

Note the syntax "EXEC SQL DECLARE ... CURSOR FOR :stmt_num" is thread safe (and is not affected by this problem), while the syntax "EXEC SQL DECLARE ... CURSOR FOR statement_name" is not thread safe (and cannot be made thread safe).

379190 The Dateadd() function would have produced incorrect results when the value to be added was close to the maximum or minimum 32-bit signed integer values and the time unit was seconds. For example:

select dateadd(ss,2147483647,'2005-02-03 11:45:37.027')

would have resulted in:

1937-01-16 08:32:**.***

This has been fixed, now, the result is:

2073-02-21 14:59:44.027

The Datediff() function also produced incorrect results when the difference was close to the maximum or minimum 32-bit signed integer values and the time unit was second. For example:

select datediff(ss,'2073-02-21 14:59:45.027','2005-02-03 11:45:37.027')

would have resulted in a range error. This has also been fixed, the result is now:

-2147483648

379240 A client could have continuously failed to synchronize messages with a QAnywhere server, using an ASE consolidated database, under the following circumstances:

1 - During the last message synchronization, the server committed the messages from the client but the connection with the client dropped before the client could receive the acknowledgement of that fact.

2 - A new client useed the same message store id as a previous client message id that was abandoned.

The problem was with the QAnywhere system procedure for handling primary key conflicts, ml_qa_handle_error. If QAnywhere is being using with an ASE back-end, the QAnywhere server schema can be patched by dropping and re-creating the procedure from the fixed syncase.sql, (or syncase125.sql), script.

Any new QAnywhere ASE server schemas created with the fixed scripts will not have the problem.

379245 Attempting to unload a version 5.5.x database, containing a table with a BIT column having a default value, would have resulted in a syntax error in the generated reload.sql script. This has been fixed.
379371 If a CREATE TABLE statement was executed, and the table had a multi-column primary key, the statistics of the first primary key column would not have been used until the database had been restarted. This has been fixed
379374 The QAnywhere Agent sends special system messages to a special "system" queue that contains information about the network status of the client. These messages were not getting deleted from the client message repository, even after they expired. This has been fixed so that they are now deleted.
379378 The QAManager.recover() method allows recovery of unacknowledged messages so that they can be re-received. When a receiving QAManager called recover(), re-received a message, then acknowledged the message, the 'received' status of the message was not being synchronized back to the originator of the message. The message repository used by QAManager keeps a list of unacknowledged message IDs. This list was not being cleared by the recover() method, so the message ID of a recovered message was added to this list twice. The fix was to have the recover() method clear the list of unacknowledged message IDs.
379390 When starting Interactive SQL, if a "Connect" dialog is opened, the dialog is now parented to the main window. This ensures that it never opens behind the main window, and that if the main window is activated by clicking on its task bar icon (Windows only), the "Connect" dialog will always come to the front.

A similar bug was also fixed where error messages could have opened behind the main window under some circumstances.

379414 The Dateadd() function would have produced incorrect results when the value to be added was close to the maximum or minimum 32-bit signed integer values and the time unit was milliseconds. For example:

select dateadd(ms,2147483647,'2005-02-03 21:45:37.027')

would have resulted in:

2005-01-10 01:15:**.***

This has been fixed, now, the result is:

2005-02-28 18:17:00.674

The Datediff() function also produced incorrect results when the difference was close to the maximum or minimum 32-bit signed integer values and the time unit was milliseconds. For example:

select datediff(ms,'2005-02-28 18:17:00.675','2005-02-03 21:45:37.027')

would have resulted in a range error. This has also been fixed, the result is now:

-2147483648

379532 The same command object could have been deleted twice when running in a multi-threaded environment. This could potentially have caused a crash. The problem has been fixed.
379662 The iAnywhere JDBC Driver has been enhanced to support the PreparedStatement.addBatch() method. This method is useful for performing batched (or wide) inserts.

To use this method:

1) An INSERT statement should be prepared using one of the Connection.prepareStatement() methods,

2) The parameters for the prepared insert statement should be set and batched as follows:

for( ... ) // for loop to batch n sets of parameters

{

stmt.set?( 1, ? ); // where stmt is the prepared insert statement from step 1

stmt.set?( 2, ? );

...

stmt.set?(m , ? ); // note that there are m parameters in the statement

stmt.addBatch(); // adds the set or parameters to the batch and moves to the next row of parameters

}

3) The batch should then be executed using the PreparedStatement.executeUpdate() method

It should be noted that only the PreparedStatement.addBatch() method is supported and that the PreparedStatement.executeUpdate() method needs to be called to execute the batch. None of batch methods for the Statement object (i.e. Statement.addBatch(), Statement.clearBatch(), Statement.executeBatch() ) are supported since these methods are completely optional and not very useful. For such static batches, it is best to call Statement.execute() or Statement.executeQuery() on a single string with the batched statements wrapped inside a BEGIN...END.

NOTE 1: BLOB parameters are not supported in batches

NOTE 2: String/Binary parameters are supported but the size of the string/binary parameter is an issue. By default the string/binary parameter is restricted to 255 characters or 510 bytes. The reason for the restriction is due to the underlying ODBC protocol and will not be discussed here. For futher information, it is best to view the documentation on passing arrays of parameters in ODBC. If, however, an application needs to pass larger string or binary parameters within a batch, then an additional method has been provided to increase the size of the string/binary parameter. Note that this method must be called PRIOR to the first addBatch() call. If the method is called after the first addBatch() call, then the new size setting will be ignored. Hence, when calling this extra method to change the size of a string/binary parameter, the application needs to know ahead of time what the maximum string or binary value for that parameter will be.

To use this extra method, you must modify the "code" above as follows:

// need to cast stmt to an IPreparedStatment object in order to change the size of string/binary parameters

ianywhere.ml.jdbcodbc.IPreparedStatement _stmt = (ianywhere.ml.jdbcodbc.IPreparedStatement)stmt;

// now change the size of string parameter 4 from the default 255 characters to 300 characters

_stmt.setBatchStringSize( 4, 300 ); // note string parameters are in "characters"

// change the size of binary parameter 6 from the default 510 bytes to 750 bytes

_stmt.setBatchStringSize( 6, 750 ); // note binary parameters are in bytes

for( ... ) // for loop to batch n sets of parameters where n should not be too large

{

stmt.set?( 1, ? ); // where stmt is the prepared insert statement from step 1

stmt.set?( 2, ? );

...

stmt.set?(m , ? ); // note that there are m parameters in the statement

stmt.addBatch(); // adds the set or parameters to the batch and moves to the next row of parameters

}

The maximum string/binary size of a parameter should be modified with caution. If the maximum is set too high, then the additional memory allocation cost *will* probably override any performance gained from using the batch. Also, there is a good chance the application will not know ahead of time what the maximum string or binary value for a particular parameter is. The recommendation then is to not change the maximum string or binary size of a parameter, but rather to use the batch method until a string or binary value larger than the current/default maximum is encountered. The application can at that point call executeBatch() to execute the parameters that are currently batched, then call the regular set and executeUpdate() method to execute until the large string/binary parameters have been handled, then switch back into batch mode when smaller string/binary parameters are encountered.

379663 A new server command line option -ze, has been added to display the server environment variables. The environment variables are displayed on the server console window and will appear before the copyright notice. The output will also go in the system log if configured properly. This option is not available on Netware and Windows CE systems.
379686 A new database option has been added, UUID_has_hyphens, which will control the formatting of uniqueidentifier values when they are converted to strings. With the default setting of ON, the resulting strings contain 4 hyphens, as in:

12345678-1234-1234-1234-1234567890ab

With the option set to OFF, the hyphens will be omitted from the string.

Also, when converting a string to a uniqueidentifier value, the server now supports UUID strings both with and without hyphens.

379688 If an application was using Java in the database, or was using Remote Data Access with a JDBC class, then there was a possibility that the server may have lost a SQL error. This was most likely to occur if the SQL error was set, but the SQL error did not get reported to the client prior to the VM Garbage Collector running. Due to the asynchronous nature of the VM Garbage Collector, this problem is highly unreproducible. The problem has been fixed.
379740 A LIKE condition would have incorrectly evaluated to False, if the pattern string started with an underscore "_" or percent sign "%", and ended with at least two non-wildcard characters, (e.g. '%00'); or the string expression ended with at least two occurences of a non-wildcard character sequence that overlap, (e.g. '1000' LIKE '%00'). This has been fixed.
379788 Windows Mobile 2003 Second edition (aka Pocket PC 2003 SE, running Windows CE 4.21) is now supported. This Windows version supports both Portrait and Landscape mode screens, square screens, and also VGA screens (640X480 instead of 320X240). They can switch from portrait to landscape mode at the push of a button.

Software installed on this platform would previously have failed to install with the message: "The program you have installed may not display properly because it was designed for a previous version of Windows Mobile Software". The install has been updated to suppress this warning. Any software which supports a version of Windows CE earlier than 4.21 will still issue this error. The server was also updated to support screen resizing.

379836 UltraLite can now be run on Palm NVFS devices, and supports both the record-based and file-based data stores.

This is a summary of UltraLite clarifications for the Palm OS platform.

A. Database

An internal file volume may also be present on some NVFS devices, such as Tungsten T5 handhelds, which can be accessed and used similar to an SD slot. Therefore, ULEnableFileDB is called to store UltraLite databases on either an internal drive (built-in storage card) or external slot (expansion card). Furthermore, the existing connection parameter palm_db=CRID:n is used to specify the data store on either an internal drive or external slot, where n is the volume ordinal from enumerating the mounted volumes, and the default value of n is 0. Tungsten T5, for example, has two volumes, the internal file volume and the SD slot volume. If the device cannot locate a volume with the user-specified volume ordinal, the SQLCODE -82 is reported when opening the database. ULEnablePalmRecordDB is called to store record-based UltraLite databases.

B. Synchronization Conduit

The conduit synchronizes the first UltraLite database which is found on the device. The database lookup sequence is first the record storage, then the file system including internal drive and external slot. The UltraLite database which is intended to be synchronize should be made available as the first one found in that sequence. The conduit has been designed to work like this, since the file-based data store support was first added to the Palm platform.

379862 The Unload utility option -ar ("rebuild and replace database"), would have deleted the old online transaction log files when done, for databases that were used as Replication Server stable queue databases. This problem has been fixed.
379892 If a variable was assigned a long string value (>254 character) from a table, and the table was subsequently dropped or truncated, the server would likely have crashed on the next use of the variable.

For example:

begin

declare local temporary table t(c varchar(32767));

declare rv varchar(32767);

insert into t values(repeat('*',5000));

select c into rv from t;

truncate table t;

select lcase(rv) from dummy;

end;

A work around is to concatenate a zero-length string to column value, i.e. use "select c || '' into rv from t" in the example above.

379896 Dropping a column from a table could have caused any UPDATE OF {column} triggers on that table to fire incorrectly. This has been fixed.
379901 The OLEDB provider was failing to close the result set cursor between prepared command executions. Enigeering Case 351298 reintroduced this bug, which was originally described by Case 271435. This fix addresses both issues, an open cursor is now closed before a SQLExecute, when the command has been previously prepared.
379909 If an IIS web server was setup behind a proxy (see diagram below), when a client initiated an HTTPS request, the redirector may have failed to route the request with the error message: "user requesting redirection to unknown server:xxx". This has been fixed.

Diagram:

CLIENT <----HTTPS----> PROXY <----HTTPS----> IIS <-----> Redirector <-----> MobiLink

379916 Attempting to insert into a local table, selected rows from a proxy table when the remote server was down or not available, would likely have caused the server to crash. Note that the crash will only occur if this INSERT-SELECT performs the first connection attempt to the remote server. This problem is now fixed and a proper error message will now get displayed.
379925 When run on Unix systems, the server could have hung or crashed, while processing HTTP requests. This was more likely on slower machines, or when processing large requests or responses, and has been fixed.
379940 If an HTTP connection was cancelled by the client while the server was still processing the request, the server may not have closed the socket or releasd it back to the OS. On Unix systems, this could have caused the HTTP listener thread to eventually run out of sockets and fail after a period of time. Clients then attempting to connect to the HTTP server would hang. On Windows systems, this problem was more likely to exhibit itself as a memory leak. This has been fixed.
379951 On some new versions of the Windows CE operating system, it was possible to get a 'Fatal Error: No such file or directory' message from the server, when bringing the device out of STANDBY mode. This has been fixed.
379963 Selectivity estimates for the predicates generated for the KEY JOINs may have been set incorrectly when the User_estimates option was set to 'ENABLED' or 'OVERRIDE-MAGIC'. The side effect of the wrong selectivity estimates may have been bad performance for queries using KEY JOIN syntax. This has now been fixed.

Workarounds:

1) set the option USER_ESTIMATES to DISABLED ( highly recommended ); OR

2) rewrite the KEY JOIN into a JOIN with an ON clause, which must contain the predicates of the form 'primary key column = foreign key column' for all primary key/foreign key columns.

380056 It was possible, although extremely rare, for the server or client to crash, or drop connections, when using the TCPIP link. This could also happen to the server running on Windows for SPX connections. This has been fixed.
380064 Attempting to use any of the bit-wise operators (&, |, ^, ~) with BIGINT or UNSIGNED BIGINT arguments would have resulted in an error, if one of the argument values was too large to be converted to an INTEGER or UNSIGNED INTEGER. This has been fixed.

Also, the INTTOHEX function now permits UNSIGNED BIGINT arguments.

380084 The Dateadd() function could have produced incorrect results when the time unit was milliseconds, minutes, hours, days, or weeks.

For example:

select dateadd(hour,365*24*7923,'0001-01-01 21:45:37.027'),dateadd(hour,69399300,'0001-01-01 21:45:37.027')

would have resulted in:

'****-09-18 00:00:37.027' '9998-07-01 00:00:37.027'

This has been fixed. Now, the results are:

'7918-09-29 00:00:37.027' '7918-01-15 00:00:37.027'

Similarily, the Datediff() function produced incorrect results when the time unit was milliseconds, minutes, hours, days, or weeks.

For example,

select datediff(minute,'2005-02-03 21:45:37.027','6088-02-26 23:52:37.027')

resulted in a range error. This has been fixed. Now, the result is

2147483647

380086 The last_download_time (LDT) stored on the consolidated database, would have been incorrectly set during an upload-only synchronization. Note, this wouldn't affect the LDT stored at the remote, and sent up during synchronization, only consolidated-side logic that directly inspected last_download_time in the ml_user or ml_subscription tables would see an incorrect time. The LDT is now set only when there is a download.
380104 On 64 bit Windows systems, dynamic cache sizing did not work correctly. The server was unable to query the OS to determine its own working set size, so the cache growth algorithm reverted back to the old (version 6.0), very conservative growth algorithm. This has been corrected.
380163 If an Article of a Publication contained two columns such that one column's name was an exact prefix of another column's name (for example, "id" and "id2"), then only the shorter named column would have been marked as part of the Article on the Columns tab of the Article property sheet. This has been fixed.
380178 When ULPod threw an exception from Connection.Synchronize(), the message field of the exception only contained the string "SQLE_xxx", giving the type of the error, with no reference to the error context parameters. This information was not enough to help diagnose the problem. For example, a UNIQUE constraint violation during download would have caused the error from MobiLink: "download failed with a client error -196", and the UltraLite client side would only received a generic "SQLE_xxx" error string. It would have been very difficult to identify on which table the violation occured.

Now, extra information has been added to the message field of the exception thrown from Connection.Synchronize(). If a download UNIQUE constraint occurred inside UltraLite runtime, the conflicting table's name is added to the error parameters. ULPod will append the first three error parameters to the end of the SQLE_xxx" string, separated by ":". For example, the following message field of a synchronization exception "SQLE_SERVER_SYNCHRONIZATION_ERROR:-10013" tells that the MobiLink server error code is -10013.

380189 When a unique constraint violation error occurred, the UltraLite run-time would have only generated a PRIMARY_KEY_NOT_UNIQUE error (SQLCODE -193), with no context information about which table caused the violation. Now if a download unique constraint violation error occurs, the conflicting table's name is added as part of the error parameters.
380191 Under some circumstances, the iAnywhere JDBC Driver could have return the error "Database server not found (SQLCODE -100), as a result of executing a "STOP ENGINE" statement. This error is now ignored by Interactive SQL and is not reported to the user.
380206 The server could have left connections hanging indefinitely, when receiving multi-piece strings on a heavily loaded system. There was a chance that this problem could also have occurred under other conditions, such as when the network connection between client and server introduced long delays. This was more likely to occur when the number of active requests was larger than the number of tasks that were servicing requests (ie -gn). This has been fixed.
380351 The server will no longer display command-line options in the console window when any part of the command line is derived from an obfuscated file. It will now display a command-line syntax error message with asterisks, instead of the text that caused the syntax error when obfuscation is used, (ie Error in command near "***" )
380378 Malformed GRANT statements could have resulted in incorrect behaviour. This has now been fixed.
380454 Calling the method ULDatabaseSchema.ApplyFile() would not have ignored extra parameters in ULConnectionParms which it didn't need. This has been fixed.
380469 The server may have crashed while shutting down, if there was an outstanding xp_cmdshell() request still executing, and the server was forced to shutdown. This has been fixed.
380491 When adding days to a date using the Dateadd() function, it may have overflowed without an error, returning an incorrect date value.

For example:

select dateadd(day, 2250318 , '2005-02-16') would have returned 0000-01-00'

This has been fixed, an error message will now be returned.

380502 If the QAnywhere server contained several thousand undelivered messages (perhaps because the target clients had not recently synchronized) then the database server might appear to be using a large percentage of the CPU on its host machine. The typical solution was to add some indices on the QAnywhere system tables. Unfortunately, one of the queries being used by the QAnywhere server was not very efficient, and may have prevented the database server from using an index. The problem query has been fixed.
380576 Production ASA 8.0.2, Build 4339. Database cannot be restarted anymore. Internal database error, assertion failure number 201819. Checkpoint invalid bitmap page.

Windows. XP SP1 Build 5.1.2600

380632 The JMS connector would crash when its connection to the consolidated database was broken. Now, whenever the consolidated database throws a SQLException, all of the connections in the connection pool are discarded. When the database is accessed again, new connections are opened which will autostart the database, instead of using old, invalid connection objects.
380738 The MobiLink Palm Listener now supports running on Treo 650 Smartphones. The implementation has also been added to the MobiLink Listener SDK.
380744 It was possible to get a "Database page size too big" error when autostarting a server, depending on timing, if the following events occurred:

- an autostarted database and server was stopped due to a disconnect, and the database had a page size of 2K or greater

- then a new connection was made immediately, that autostarted a server and the same database

- virus scanning software was being used

The server was ignoring errors when attempting to determine the page size of databases during a server autostart, and using a 1k page size if there were errors. Now the server correctly handles these errors and fails the server autostart.

This has been fixed so that the autostart either succeeds or returns the "Specified database file already in use" error.

380746 Playback of a silent install recording may have failed if the recording included the ADO.NET feature, but the machine being installed to did not have the .NET Framework installed. This has been fixed.
380750 MobiLink clients using HTTP and HTTPS can now set a liveness_timeout stream option, as follows:

liveness_timeout=N

where N is the number of seconds for the timeout. The default is to have no timeout (N=0). The synchronization will fail if the client waits N seconds without any data from MobiLink server. Users must be careful when setting this value. The value set should be short enough to timeout early enough for an impatient user, but set long enough for the longest delay between the MobiLink server receiving the upload and sending the download to the client. Note, if a synchronization is aborted due to a timeout, subsequent synchronizations should not be affected -- unless the MobiLink server is still processing the previous synchronization, in which case a "user already synchronizing" error will occur.

380793 The background color of explanatory text was being set incorrectly in wizards when Sybase CEntral was run on Linux. This has been fixed so that the wizard backgrounds are now transparent.
380814 In locales where the decimal place separator is a comma, (ie French, Greek, etc.) the methods DataReader.GetDecimal() and ULTable.SetDecimal(), or a ULParameter with Decimal value, would have failed with the exception:

SQLE_CONVERSION_ERROR: Cannot convert System.Decimal to a Decimal

This has now been fixed.

380970 A CREATE PROCEDURE statement that did not qualify the procedure name with a userid, would have failed with the error "Item 'procedurename' already exists", even if the user did not own a procedure with the same name, but there existed a procedure with the same name in the user's namespace, (ie owned by a group the user was a member). This has been corrected.
381001 An ASA remote database which had been synchronized, and then forcefully shutdown, may not have recovered properly. Further synchronization attempts may fail with the error "Missing transaction log(s) ... ". This problem has now been fixed.
381011 A selectivity estimates of 0% may have incorrectly been computed for non-equality predicates on small tables (e.g., 1 or 2 rows). This has been fixed.
381111 When used with a case-sensitive database, the MobiLink client could have behaved incorrectly if MobiLink user and publication names were not specified in the same case as they were defined in the database. These identifiers might have been specified in any of the following places:

- the CREATE/ALTER SYNCHRONIZATION USER statement

- the CREATE/ALTER SYNCHRONIZATION SUBSCRIPTION statement

- the dbmlsync command line

- the CREATE/ALTER PUBLICATION statement

The incorrect behaviour could take one of the following forms:

- MobiLink client could have crashed

- synchronizations could have failed inappropriately

- if a MobiLink user was subscribed to more than one overlapping publication, operations that belonged to both publications might have been uploaded more than once, resulting in server side errors during synchronization.

MobiLink user and publication names are now treated case-insensitively

381112 The Datadd() and Datediff() functions would sometimes have produced incorrect results when the time unit was Hours, Days, Weeks, Months or Years.

For example,

select dateadd(month, 119987, '0001/1/1'), dateadd(week,521722,'0001-01-01'), datediff(month,'0001-01-01','9999-12-31')

produced the result:

****-04-01 00:00:00.000 1833-11-10 19:44:00.000 -11085

This has been fixed. Now, the result will be:

9999-12-01 00:00:00.000 9999-12-27 00:00:00.000 119987

381217 If a BACKUP DATABASE statement specified a long directory name for the target directory and also included TRANSACTION LOG RENAME MATCH, the server could have subsequently crashed. This has been fixed. A workaround is to use a shorter directory name in the BACKUP statement.
381257 Request to recover database

Production ASA 9.0.1, Build 1841 - Assertion 201425

381258 ASA 9.0.2 #2542 - Calling a java function in a nested SP would show a drastic drop in perf after 14400 calls.
381264 When running on NetWare in a low-memory situation, if the server was unloaded using the NetWare console, and there were active connections to the server, it was possible that the server would abend. This has been fixed.
381286 If a stored procedure parameter was defined with a user-defined domain, and the domain was subsequently dropped, no error would have been given. Now, an error will be given, indicating that the domain is referenced by a procedure parameter.
381327 Some utilities, (ie dbltm.exe, ssremote.exe, dbremote.exe and ssqueue.exe) would have crashed if they had been given a non-existent configuration file on their command lines. The utilities now return the usage screen.
381331 The Listener utility may have crashed, if it was shutdown while it was attempting a long running tracking synchronization. Tracking synchronizations are small and typically complete or fail quickly. In some rare circumstances, synchronizing again with a known host, where no MobiLink server was running on the agreed port, seems to cause the delayed failure. A crash can also happen when a shutdown was requested during such a delay. This has been fixed.
381438 It was possible for column statistics to become incorrect, which could have potentially resulted in poor access plans. The situaltion was rare, and was likely to have no other visible symptoms. This problem has been fixed.
381465 The SKIP n clause of the LOAD TABLE statement did not skip the initial n lines of the input file. The SKIP clause was effectively being ignored. This has been fixed so that the SKIP n clause does skip the first n lines in the input file.
381486 If a large number of statements was being used concurrently by applications connected to a database, a "SQL Statement error" could be issued. The maximum number of concurrent statements that can be handled by the server per database, was limited to 20 * (number of connections to the database) + 16384. This limit has now been changed to be approximately 20 * (number of connections to the database) + 65534. The exact number is dependent on the page size of the database cache.
381563 There was a problem generating the cab file when deploying to a Windows CE device after installing the 9.0.2 build 3040 EBF. Deselecting the sample apps and database would have caused the cab file generation to fail with:

Error: Section [Shortcuts.All]shortcut "ADO.Net Sample.lnk" - there is no matching target file "ado_net_sample.exe" for the current CPU type.

This has now been fixed.

381720 Connecting via a Connection profile would have failed unless the "Connect" dialog was first opened. This has been corrected.
381724 If more than the maximum number of licensed HTTP connections are attempting to use the server, it will report '503 Service Temporarily Unavailable'. It was possible that the server could have reported this error, even when the client had not exceeded the maximum number of connections. This was more likely to occur when the clients repeatedly made connections to the server, and the server was heavily loaded. This has been fixed.
381727 The server could have unexpectedly closed HTTP connections. This condition was more likely to occur as other active HTTP connections were terminating, or within a short period of time, (pprox. 5 to 10 seconds), of their terminating. This has been fixed.
381729 In relatively rare circumstances, the QAnywhere .NET client could have thrown the following exception:

System.NullReferenceException: Object reference not set to an instance of an object.

at Microsoft.Win32.Win32Native.CopyMemoryAnsi(StringBuilder pdst, IntPtr psrc, IntPtr sizetcb)

at System.Runtime.InteropServices.Marshal.PtrToStringAnsi(IntPtr ptr)

at iAnywhere.QAnywhere.Client.QATextMessage.get_Text()

when reading the Text property of QATextMessage. This has been fixed.

381736 Calling the system procedure sa_proc_debug_get_connection_name() could have caused a server crash if given a connection id for a connection that was attempting to access a database that was currently starting or shutting down. This has been fixed.
381748 If the server was started with the -fips flag, web procedures using HTTPS will use the regular (non-FIPS) RSA library, rather than the FIPS one. This has been fixed.

In addition, web procedures can be forced to use the FIPS library by specifying the URL as 'https_fips://...'. If the procedure is created using the https_fips protocol, and the database is subsequently run on a platform that doesn't support FIPS, the procedure will be executed as using standard (non-FIPS) HTTPS.

381750 It was possible, although likely rare, for the JMS connector to lose the content of a BytesMessage, when the connector failed to send the message, due to a JMS provider failure, immediately before or during the send operation. This has been fixed.
381771 When performing a backup to a tape device on Windows systems, the server would have asked for a tape switch after 1.5 GB of data had been backed up, even if the tape capacity was larger. This problem has been fixed. The server will now use the entire capacity remaining on the tape.

As a workaround, the desired capacity can be specified using the "capacity=" option in the device string.

For example:

BACKUP DATABASE TO '\\.\tape0;capacity=20064829' ATTENDED ON etc.

The value specified is in K and is calculated by dividing 20,546,384,896 (which is the capacity in bytes reported by Windows for a 20 GB tape) by 1024.

381848 For secure TLS synchronization, the MobiLink client would have gone through the list of trusted root certificates provided and failed with stream error code STREAM_ERROR_SECURE_CERTIFICATE_EXPIRED if any of the certificates had expired. This behaviour was incorrect. Now, the client will ignore expired root certificates when reading them, and will only report an error during the SSL/TLS handshake if no valid root certificates are found to match the server.
381849 The MobiLink client would only have loaded the first certificate in the trusted root certificates file specified by the "trusted_certificates" synchronization parameter. This has been fixed.

Note, this problem did not exist for UltraLite.

382018 Starting the server with the -fips command line option (strong encryption done using FIPF approved algorithms), but without specifying the -ec option (encryption types), would have failed with the message "Simple encryption is not available in FIPS mode". This has been corrected by changing the default for the -ec option to "none"
382022 A memory leak in the Java Heap would have caused poor performance for Java stored procedures, that used internal JDBC to access the database, if it was called repeatedly. When a procedure like this was called repeatedly without disconnection, the Java Heap would slowly grow until it reached its maximum, at which time the Java Garbage Collector would run every time a memory allocation request was made, causing poor performance. The memory leak has been fixed.
382026 An ALTER PROCEDURE executed via EXECUTE IMMEDIATE within another procedure, would have failed to define the result set for the outer procedure correctly if the outer procedure returned a result set without specifying an explicit RESULT clause and it declared a variable by the same name as one declared in the inner procedure. The result of executing an ALTER PROCEDURE within anothert procedure would have been different than if the statement had been executed by itself. This has been fixed. A workaround is to use unique variable names in the procedure which executes the ALTER.
382047 It was possible, although rare, for TLS or HTTPS connections to have been dropped at any time because of decryption errors. For HTTPS connections, the client could also have seen the error "501 Method Not Implemented". This has been fixed.
382072 When the UltraLite Interactive SQL utility was displaying a result set in the 揜esults� tab, selecting (with the mouse) an element from the first column twice would have made that item editable. Attempting to change the value would then have failed (hitting ENTER would return the value to its original state). Then disconnecting (F12), while the item was in this edit mode, would have caused the UltraLite Interactive SQL utility to crash. This has been fixed by no longer allowing the result set to be editted (it must be done via a SQL statement), and the crash no longer occurs.
382166 When the MobiLink client extended option TableOrder was specified, the synchronization would have failed if the tables, or their owners, were specified in a different case from the one in which they were defined in the database. This problem occurred whether the database was case sensitive or not. The tables and owners specified by this option are now always treated as case insensitive.
382167 If event hooks were defined, the MobiLink client would not have recognized and executed them if their procedure name was not entered entirely in lower case. The case of the procedure name is now ignored.

Note, a similar problem with the Extraction utility and SQL Remote has also been fixed.

382174 The version information of the QAnywhere C++ TestMessage sample program was incorrect or missing. This has been fixed.
382237 The sample program (samples\asa\externalprocedures\tests.sql), was using the get_piece() function for all chunks rather than just for the 2nd and subsequent chunks. If the code was modified such that the string in the 7th argument was prefixed with '=abcd'

set rslt = xp_all_types( null, 127, -12345, null,

'abcdefghijkl', 12.34e15, '=abcd'+repeat('=',300) );

then xp_all_types would have reported that all characters in the 7th argument match. This is not true since the are different. This has been fixed, the code in tests.sql has been corrected.

382307 When run on Sun Solaris systems, the server could, in rare circumstances, have crashed executing a CREATE DOMAIN statement. This has been fixed.
382317 The UltraLite runtime could have caused a crash when a subquery contained outer references to more than one table

For example,

select * from T1, T2

where T1. x in ( select x from T3 where T1.z = T3.z and T2.y = T3.y )

This has been corrected.

382345 Attempting to autostart a database with an invalid DatabaseSwitches connection parameter could have caused the server to hang. If the server was also being autostarted, the connection attempt could have hung. If the server was already running, the connection attempt would not hang, but the server may have hung when shutting down. These problems have now been fixed.
382443 UltraLite applications could have produced incorrect results with a query that had both a left outer join and an order-by cluse which referenced columns only from tables on the left side of the left outer join.

For example:

select * from t1 left out join l2 on t1.a = t2.b order by t2.x

This has ben fixed.

382499 If the server attempted to use an SSL certificate that had expired, the non-intuitive error message "Error parsing certificate file, error code -6" would have been displayed. The message has been improved, it is now "Certificate '<filename>' has expired."
382507 When using TLS encryption, the client software would go through the list of trusted root certificates provided and would fail with a handshake error if any of the certificates had expired. This behaviour was incorrect. Now, clients will ignore expired root certificates when reading them, and will only report an error during the SSL/TLS handshake if no valid root certificates were found to match the server.
382540 If a SELECT was used to obtain the value of SQLCODE or SQLSTATE within a Transact-SQL procedure, and the procedure was called repeatedly, the plan for the query may have been cached. If this happened, the values returned for SQLCODE and SQLSTATE may be zero, even after an error had occurred. This has been fixed.

The value of @@error will correctly return an indication of whether or not an error occurred.

A workaround is to set the option Max_plans_cached to 0; however, this may impact performance. Another workaround is to obtain the value for one of @@error, SQLCODE or SQLSTATE using a SET (i.e. assignment) statement rather than by using a SELECT.

382670 When running an AppForge Crossfire application in hosted mode (ie, in the development environment) calling ULConnection.Close() might not actually close the connection. If an application called Close() and then tried to open the database again, it could cause SQL code -955 SQLE_CONNECTION_ALREADY_EXISTS.

One case that could lead to this was when ULColumn variables were assigned and the garbage collector had not disposed of them before the call to ULConnection.Close(). An internal reference from the column objects to the connection prevented the connection from closing. This will not happen when running on actual devices, as garbage collection in the AppForge client is more predictable on devices.

This has been fixed so that calling ULConnection.Close() will close the connection and subsequent calls on the ULColumn object will return SQLE_CURSOR_NOT_DELCARED.

382677 When run on SuSE 9.2, the main program windows for DBISQL and Sybase Central would open behind the console window used to start them. This has been fixed.
382704 The changes made for Engineering Case 377900, would have cause the MobiLink server to issue a warning that it was unable to fetch the download transaction time when running against an Oracle8i consolidated database. This has been fixed. The version of Oracle running the consolidated database is detected and appropriate statement is issued to fetch the transaction times.
382839 When using the Microsoft SQL Server "Import and Export Data" tool to move tables from a Microsoft SQL Server database to an ASA database, and the connection to the ASA server used the OLEDB provider, column data was truncated to 200 bytes. This has now been fixed.
382935 CREATE LOCAL TEMPORARY TABLE can now be used to define a local temporary table which will persist until the end of a connection, or until the table is explicitly dropped. While DECLARE LOCAL TEMPORARY TABLE can be used to do the same thing outside a procedure, there was previously no mechanism for doing this within a procedure. In other words, if CREATE LOCAL TEMPORARY TABLE is executed within a procedure, the table will continue to exist after the procedure completes. Similarly, if this statement is executed within an IF statement, the table will exist after the IF completes.
382951 When the server was reading a significant number of pages into cache, or writing dirty pages from the cache, there could have been slightly poorer performance than expected, especially on a multiprocessor machine. This has been fixed by removing contention and slightly reducing CPU usage in this case.
383145 After deleting rows from the end of a large trie-based index, attempting to insert or search for a value larger than any indexed value could have resulted in fatal I/O errors (such as reading past the end of the file), or assertions such as 102300, or 201601. For this to have occurred, the index had to contain at least 3 levels (more than 50,000 rows with a 2k page size), the value being deleted had to be the last value in the index, and the leaf page containing the entry, (as well as the leaf's parent), must have contained only a single entry. Rebuilding (or reorganizing) the index would have fixed the problem.

Note, dbvalid would not have couaght this problem

383170 If an installation had been updated using the Maintenance Patch, or an EBF, in a language other than that used during the original installation, the uninstall would fail. The Patch or EBF would have overwritten the suport files, which contained support for the original language, but would not have changed the language option in the uninstall command line. This would have resulted in the uninstall attempting to run in the original language and failing to find the correct language support. This has now been fixed by changing the uninstall command line to reflect the language of the last-run Patch or EBF.
383178 The server disables floating point exceptions by default. If an external function DLL written in Delphi was used, floating point exceptions could have been enabled. This could have lead to a subsequent server crash due to a floating point exception. This has been fixed.
383345 An incorrect result may been returned for queries with EXISTS subqueries with correlated HAVING clauses. For this problem to have occurred, the following conditions must be met:

1. There must have been at least one correlated equality predicate in the WHERE clause of an EXISTS subquery.

2. There must have been at least one correlated predicate in the HAVING clause of the subquery which referenced an aggregate function.

3. The EXISTS subquery was used in the WHERE clause of the main query block.

This has been fixed.

Example:

select A.C from A

where exists (

select 1

from A H

where H.b=A.b

group by H.b

having MAX(H.c)=A.c )

383414 If an older database was upgraded, the system table SYSSQLSERVERTYPE was not being repopulated with new values. This table is now rebuilt during an upgrade.
383489 On NVFS devices with an internal file volume, the UltraLite Palm utility now provides access to UltraLite databases which are stored on an internal drive. This is an addition to the current access to UltraLite data stores on both the external slot and in-memory.
383497 The ResultSet classes's GetState() method could return the incorrect state when the query contains a LEFT OUTER JOIN. Specifically, if the last row in the result set supplied NULL values for the right hand expressions, calling GetState() after fetching all rows would return UL_RS_STATE_ON_ROW instead of UL_RS_STATE_AFTER_LAST or UL_RS_STATE_BEFORE_FIRST.

Some applications might use GetState to determine whether a result set has been completely fetched (for example, the UltraLite Interactive SQL utility does this). These applications would not have behaved properly when executing a query like the one described

above.

This has been fixed.

383786 A remote database connection back to the same ASA server, using the shared memory link, would have hung on Solaris. A workaround is to use TCP/IP. This has been fixed.
383942 When using the Lithunian language resource library, the server usage failed to show the command line options -cc, -cr, and -cv. This has been fixed.
383970 The database server would have erroneously reported a licensing violation on hyperthreaded or multicore CPUs. A message such as the following would have been displayed:

"Warning: The server is limited to use xxx processor(s), but it is executing on yyy processor(s)."

The server was using the number of CPUs reported by the operating system, and was not accounting for the fact that they may be hyperthreads (or, soon, just one of multiple cores in a single physical processor). Also, the server would only create enough threads of execution to match the CPU license limit; however, on a hyperthreaded or multicore processor, the server should create enough threads of execution to run on all hyperthreads and cores on all of the physical processors for which the server is licensed.

The problem has been corrected as follows:

1. The server adjusts its affinity mask to restrict the server to run on only the licensed number of physical processors

2. The server creates enough OS threads to be able to execute on all cores & hyperthreads of all processors for which the server is licensed.

To address #2 above, the default number of OS threads (changeable with the '-gx' switch) is now 1 plus the number of hyperthreads and cores on all licensed processors. The previous default number of OS threads was the minimun of the licensed number of cpus, or 1 plus the number CPUs as reported by the OS.

The server now also correctly adjusts its affinity mask to restrict the server to the licensed number of physical processors. If the server is licensed for 'n' processors, the server will by default run on all hyperthreads and cores of 'n' physical processors.

A new server command line option has been added ('-gtc') to control the aximum "processor concurrency" that the server will allow. For example, by default on a single-processor hyperthreaded system, or on any hyperthreaded system with a server licensed for just 1 CPU, the server will by default allow two threads to run concurrently on one physical processor. Adding a '-gtc 1' switch, for example, allows the user to force the engine to run on just one core of one processor.

The following will help to clarify the interaction of the switches that control licensing and concurrency. The following symbols will be used so that the values can be easily related to the server options that control them:

gt : the number of physical processors to use

gtc : the maximum processor-level concurrency

gn : the number of concurrent server requests

gx : the number OS threads to create

The default value for gt is the minimum of the number of physical processors licensed and the number of physical processors in the machine. The user cannot set gt to exceed the default value.

The default value for gtc is the minimum of the total number of cores and hyperthreads on the licensed number of physical processors and the total number of cores and hyperthreads in the physical machine. The user cannot set gtc to exceed the default value.

The default value for gn is 20 for the network server. For the personal server on platforms which support Java in the database, gn defaults to 2 times the connection limit (which is also 20 because the connection limit is 10) and the user cannot specify a gn value less than 2 times the connection limit or greater than 3 times the connection limit. For the personal server on platforms that does not support Java in the database, gn defaults to connection limit and the user cannot specify a gn value larger then connection limit.

Once the server has chosen the gt, gtc, and gn values based on command line values, license restrictions, physical processors in the machine, and the connection limit, the server will choose a gx value. The default value for gx is the minimum of gtc plus 1 and gn. The user cannot specify a gx value where gx > gn.

An example will also help to demonstrate how the server selects CPUs based on gt and gtc. For the purposes of the examples below, assume we have a 4-processor system with 2 cores on each processor. We label physical processors with letters and the cores with numbers. This 4-processor system therefore has processing units A0, A1, B0, B1, C0, C1, D0 and D1

Case 1: A 1-CPU license or "-gt 1" specified on the command line

The network server will use gt=1, gtc=2, gn=20, gx=21

Threads will be allowed to execute on A0 and A1

Case 2: An unlimited server with "-gtc 5" on the command line

The network server will use gt=4, gtc=5, gn=20, gx=21

Threads will be allowed to execute on A0, A1, B0, C0, and D0

Case 3: A server with a 3-CPU license and "-gtc 5" on the command line

The network server will use gt=3, gtc=5, gn=20, gx=21

Threads will be allowed to execute on A0, A1, B0, B1, and C0

383977 The network protocol option network_leave_open is now supported on Palm devices. Using the new option, a MobiLink client running on Palm can optionally specify that the network connectivity should be left open after the synchronization finishes.

The option syntax is as follows:

network_leave_open = { 0 | 1 }

On the Palm platform, the default is 1 where the network connectivity is left open after the synchronization finishes.

384070 The INPUT statement was ignoring the setting of the "Default_isql_encoding" option. This has now been fixed.
384130 If the length of an indexed table column was increased on a big endian machine, using the index may have caused the server to crash due to an unaligned memory reference. This has been fixed.
384141 When using the Database Tools interface to run the MobiLink synchronization client, if the a_sync_db version field was set to a value that was 8000 or greater, and less than the version supported by the dbtools library, then the upload_defs field would have been ignored. If the database had more than one subscription, then this would have caused the synchronization to report the following error message:

Multiple synchronization subscriptions found in the database. Please specify a publication and/or MobiLink user on the command line.

This behaviour could also be seen if the MobiLink client was used with a later version of the dbtools library. This has been corrected.

384238 The Ping utility would have displayed a message if the server could not be found, even if the -q option ("quiet: do not print messages") had been used. This has been fixed, no message will now be displayed if the -q option is used.
384281 UltraLite could have incorrectly generated null results for expressions referencing NOT NULL columns in tables to the right of a LEFT OUTER JOIN. This would have happened for result set rows fetched after NULLs had been supplied for the right hand side. This has been fixed.
384294 Interactive SQL could have reported an OutOfMemory error during, or shortly after, executing a statement which returned a large result set. This was most likely to occur when the "Show multiple result sets" option was turned on, and the "Maximum number of rows to display" option was set to "All rows". This has been fixed so that now when Interactive SQL detects that it is running out of memory, it will show only as many rows as it can, and will display a warning that the result set is incomplete. As a side-effect of this change, Interactive SQL's performance has been improved when executing sequences of statements for which result sets are returned, but never displayed. For example, the following sequence will execute considerably faster, especially if all of the conditions listed above are met:

SELECT * FROM T1;

OUTPUT TO t1.txt;

SELECT * FROM T2;

OUTPUT TO t2.txt;

384317 UltraLite could have generated incorrect results for queries that required a temporary table, when DISTINCT and ORDER BY clauses were both present. For example :

SELECT DISTINCT quantity, quantity + 1 FROM table ORDER BY quantity

where there was no index starting with the column named quantity. This has been fixed.

384742 The global variable @@procid would have always returned zero on big-endian platforms, (ie Sun Solaris). This has been fixed.
384758 A QAnywhere client could have continuously failed to synchronize messages with a QAnywhere server when using a Microsoft SQL Server consolidated database. This would have occurred if during the last message synchronization the server committed the messages from the client, but the connection with the client dropped before the client could receive the acknowledgement, and a new client used the same message store id as a previous client message id that was abandoned. The problem was with the QAnywhere system procedure for handling primary key conflicts, ml_qa_handle_error. This has been fixed for any new QAnywhere servers with a Microsoft SQL Server back-end. For existing QAnywhere servers with a Microsoft SQL Server back-end, the QAnywhere server schema can be patched by dropping and re-creating the procedure from the fixed syncmss.sql script.
384773 The Import Wizard would have failed with an internal error (NullPointerException) in the following situation:

1. the import file format was set to "fixed",

2. the wizard was told to import the data into an existing table,

3. "Next" was clicked until the end of the wizard was reached,

4. then "Back" was clicked until the first page in the wizard was reached,

5. the import file format was then changed to a delimited file

6. "Next" was again clicked until the end of the wizard was reached.

This has been fixed.

384795 Attempting to create a procedure or an event containing a LOAD TABLE statement, which used a variable name to represent the filename, would have resulted in a syntax error. This has been fixed.
384959 Changes made for Engineering Case #363767 could have caused the database file to grow unnecessarily. A page that was in use as of the last checkpoint is allowed to be reused before the next checkpoint, provided its preimage has been saved in the checkpoint log. Prior to the changes for case 363767, the preimage for a freed page was forced to disk and the page was allowed to be reused immediately. After the changes for case 363767, the freed page was not allowed to be reused until after the next checkpoint, because the server no longer forced the preimage to disk for performance reasons. If an application freed and reused pages frequently (for example, repeatedly deleting all rows from a table then inserting rows back into the table), the server would not have allowed many of the free pages to be used until after the next checkpoint. The problem has been fixed by keeping track of the set of free pages that would normally be allowed to be reused if only the preimages were committed to disk.

Note that this growth was not unbounded and was not a 'leak', as the pages are freed as of the next checkpoint. This problem only affected databases created with 8.0.0 or later.

385158 When the schema of a database object was modified by a DDL statement, any existing views that refered to the modified object could potentially have become invalid. However, the server did not detect any problems until the view was subsequently referenced. In order to avoid such problems from happening, it was necessary to recompile the affected views via the "ALTER VIEW ... RECOMPILE" statement. If such recompilation was not done after dropping a column that is referenced by a view for example, then the server could have crashed in certain situations when the affected view was referenced. This has been fixed, the server will now generate an error without crashing.

The server will now generate an error without crashing.

385171 If an sp_hook_dbmlsync_logscan_begin hook was defined that modified a table being synchronized, and the extended option Locktables was set to 'off', then actions performed by the hook would not have been uploaded during the current synchronization. Actions would have been uploaded correctly though during the next synchronization. This has been changed so that any changes made to synchronization tables by the sp_hook_dbmlsync_logscan_begin hook will now be uploaded during the current synchronization regardless of the setting of the Locktables option.
385174 The DBMLSync Integration Component would previously have created and written debug information to a file named dbmlsyncActiveX.log. This file will no longer be created in released versions of the DBMLSync Integration Component.
385179 The MobiLink client may not have detected that a table had been altered, and would have sent an invalid upload stream to the consolidated database. The following operations in a log file demonstrate the problem, when the client scanned the log during a single synchronization :

1) Data on table t1 is changed.

2) Table t1 is removed from the only publication it belongs to.

3) Data on table t1 is changed again.

4) Table t1 is altered.

5) Table t1 is added back to the publication it was removed from.

Now, the MobiLink client will report the error "Table 't1' has been altered outside of synchronization at log offset X" when this situation arises.

385315 The order of columns in an index as returned by the view SYS.SYSINDEXES, in the column colnames, mayt be incorrect. This has been fixed by adding an ORDER BY clause in the list() expression used to generate the column list.
385324 Attempting to execute a query with an ORDER BY clause that contained a subquery, would have failed with the error -152: 'Invalid ORDER BY specification'.

For example:

select dept_id from department as D

group by dept_id

order by (select count(*) from employee as E where D.dept_id = E.dept_id)

This has been corrected so that subqueries are now allowed in the ORDER BY clause, given that all outer references in the subquery are valid.

385349 When inserting Multi-byte Character Set strings, by passing them as parameters to the AsaCommand method, the strings were not saved. This has ben fixed.
385383 The installer would have occasionally failed to determine the location of the Shared folder. For example, if only Sybase Central had been installed, the existing Shared folder would not have been found and the default location would be used instead. If the default was chosen, plugins installed by other products would have failed to load. This has been fixed.
385486 Attempting to create a proxy table to an existing table in another ASA database, that had a defined with a UNIQUEIDENTIFIER datatype, would have failed with the error "data type not supported". This problem has been fixed.
385494 The IsNumeric() function would have returned an error when the parameter was too long. It now returns FALSE, since the parameter can't be numeric.
385530 If an ALTER VIEW statement was executed by the creater of the view, but that user no longer has RESOURCE authority, a "permission denied" error would have been reported. The view definition in SYSTABLE.view_def would still have been updated, but the preserved source for the view in SYSTABLE.source would not have been updated. This has been fixed, now no error will be reported in this situation, and the preserved source will be updated.
385641 If a trigger or procedure executed a conditional statement (e.g. an IF statement) that used a subselect on a procedure, and the procedure call in the subselect took at least one parameter, a server crash would have resulted. This has been fixed.
385645 When the server was run on big endian platforms, (such as Sun Solaris), the global variable @@procid would always have returned zero. This has been fixed.
385653 When SQL dialect related functions such as WATCOMSQL(), TRANSACTSQL() or SQLDIALECT() were called with a invalid statement, the server would have returned the error "Error at character n", where n was actually in bytes in database's character set. This number could have been misleading when the statement contained non-ASCII characters. This problem has been fixed, the error is now based on the character offset, instead of the byte offset.
385659 If an application relied on the Java VM's garbage collector to close Statement, PreparedStatement or CallableStatement objects, rather than explicitly closing these objects, the server could have eventually failed with a "resource governor exceeded" error. The garbage collector was being prevented from closing these objects. This problem has been fixed and these objects now properly get garbage collected.
386004 The method QAManagerBase::getLastError() could have return an error code indicating an error, even after the method call was successful. This would happen after a previous method call that failed. This has now been fixed, getLastError() returns an error indication, if and only if the prior method call failed.
386022 Calls to the method QABinaryMessage.ReadString() would have returned an empty string when used to read a string of longer than 255 characters, if the string was originally written with WriteString(). This has been fixed, now string data types of length up to 32767 characters can be written and read from a QABinaryMessage, as documented.
386024 The method QATextMessage::readText() is used to read the text from a QATextMessage in pieces. If readText() was called when there was no more text, it would have returned an empty string. The next call to readText() would then have returned -1, indicating no more text. This has been fixed, now readText() returns -1 as soon as there is no more text, as documented.
386025 When attempting to rebuild a strongly encrypted database with the Unload utility with the 'rebuild and replace database'command line option (-ar), if the database was involved in replication or synchronization, the current transaction log offset of the newly rebuilt database would not have been set correctly. When rebuilding databases of this type, the Unload utility will now assume that the encryption key specified with the -ek or -ep switch is the encryption key for both the database being rebuilt, and the newly rebuilt database. In addition, using the -ar option will now return an error in the following situations, where previously the database would have been rebuilt but the log offset would not have been set correctly :

1) The database is involved in replication or synchronization, but the encryption key provided with the -ek or -ep switch is not a valid encryption key of the database being rebuilt.

2) The database is involved in replication or synchronization, the database being rebuilt is strongly encrypted, but the -ek or -ep switch was not provided on the dbunload command line.

386033 Date formating strings containing the AM/PM indicators "aa" or "pp" could have resulted in mangled characters in Chinese dates. This has been fixed.
386047 When using an AWE cache, the server could have failed with a "memory exhausted" error (not to be confused with the "dynamic memory exhausted" fatal error), other fatal errors or other operations problems, such as failures loading DLL for Remote Data Access or external stored procedures could fail. The problem was that the server would allocate space for use by the cache up to the available address space less 64MB; effectively leaving only 64MB of address space for other purposes, which was frequently insufficient. Note that the amount of address space allocated never exceeded the amount of physical memory allocated for the AWE cache. Now, the database server allocates up to the available address space less 512MB

An undocumented command line option "-cm <size>" has always existed to control the amount of address space allocated for an AWE cache. As a work-around, this option can be added to the server's command line to leave more address space for purposes other than the cache.

Each process on 32-bit Windows is given 2GB of address space in total (that's an OS and 32-bit architecture limitation) except on Windows 32-bit Advanced Server, Enterprise Server and Datacenter Server where they are given 3GB of address space in total, provided "/3GB /PAE" is in the boot.ini and there is no more than 16GB of RAM installed. Again, these are OS and 32-bit architecture limitations. 32-bit programs running on Windows x64 Edition are given the full 4GB of address space, although running native 64-bit programs on Windows x64 Edition is preferable (they are not limited to 4GB of address space).

A description of "address space" is probably helpful at this point. Address space essentially refers to the amount of memory that can referenced by a program at any given time. You can think of this as the number of unique 1-byte memory addresses that can be referenced by a pointer value. On a 32-bit architecture, pointers are limited to 32-bits, or 4GB, of addressability. On Windows, the OS uses 1GB or 2GB of each process's address space for its own purposes leaving 3GB or 2GB for the process to use. Usually, every piece of memory allocated has address space associated with it. That includes memory containing code (the database server code & all DLLs loaded) or data. On Windows, "virtual memory" allows the actual physical contents of a page of memory to be written to disk to allow the physical RAM to be used temporarily for another purpose but the address space remains allocated. When the memory is paged back in, the contents could be in a different physical piece of memory but its address (pointer value) will be the same.

With an AWE cache, physical memory and address space are allocated separately. The database server may use, for example, 1GB of address space and 7GB of physical memory for the cache. Physical memory allocated for an AWE cache is not virtualized -- it is never swapped out to disk. Because the database server has only 1GB of address space for the cache, it can only access 1GB worth of the cache at any given time. If a cached page exists in physical memory but has not been assigned some address space, the server must pick a piece of the address space (in 4K chunks) that was allocated for the AWE cache and ask the OS to change the process's page table so that the given address space now refers to a different piece of physical RAM. The old piece of physical RAM is no longer visible to the database server.

Changing the AWE memory mappings is very fast and definitely much faster than doing an IO; however, it is not absolutely free. For optimal performance, you want your address space to be as large as possible to minimize the number of AWE mapping changes that are performed but small enough that you don't run out of address space.

Since some operations such as loading DLLs can occur after the database server cache has been created and the database server cannot predict the address space that will be needed by those operations, the minimum amount of address space reserved for purposes other than the AWE cache has been increased to 512MB instead of 64MB (which should be sufficient in most cases) and can be controlled manually in exceptional cases with the "-cm <size>" switch.

386109 The AsaDataAdapter object was very slow when filling a DataSet or a DataTable which had primary key. This problem has been fixed.
386187 If a LIKE predicate was used on a LONG BINARY value that was longer than would fit in a VARCHAR (32767), and the option String_rtruncation was set to 'on', then a truncation error could inappropriately have been given. This has been fixed.

The following example demostrates the error:

create table patterns( c1 long binary );

insert into patterns values( repeat('a', 50000);

select count(*) from patterns where c1 like '%aaa%'

The following error was returned: "Right truncation of string data" SQLCODE: -638 SQLSTATE: 22001

386385 While attempting to send a message to a JMS provider, if a QAnywhere connector received certain varieties of Java exceptions from that provider, then the connector would have stopped sending, and could only be restarted by restarting the hosting MobiLink server. The variety of Java exceptions that would instigate the problem were any that had a "null" return from the standard "getMessage" Exception method. This type of exception is seen in certain situations where a connection to the JMS provider is lost. This has now been fixed.
386422 If a MobiLink server was started with QAnywhere enabled using the -m command line option and that QAnywhere server was using a connector to a JMS provider, shutting down the MobiLink server using the GUI shutdown button, the text console enter key, or dbmlstop, may not have shut down MobiLink cleanly. That is, the MobiLink server output file may not have contained the line "MobiLink server finished", as well dbmlstop may have terminated with an error indicating that it could not shutdown MobiLink, when in fact, MobiLink had shut down. This has now been fixed.
386434 Trying to create or start the database server on a Linux file system that does not support Asynchronous I/O system calls, would have failed or caused the server to hang. This has been fixed.

A work-around is to use the -ua server command line option, or remove the library libdblaio(a|d){ver}.so from the installation directory, where {ver} is the

SQLAnywhere major version number.

386569 The index corruption caused as a result of Engineering Case 383145 could not have been detected by database validation. Validation of an index with this type of corruption will now generate an assertion failure, (such as 100305, 102300, or 201601). Dropping and recreating the index will solve the problem.
386705 The optimizer will occasionally recommend indexes that degrade query performance. When the Index Consultant detects this siyiation, it discards the query from its analysis. A check for whether a query had been discarded or not was missing from the new analysis viewer, which could cause the Index Consultant to report a NullPointerException, making unviewable the list of affected queries for a recommended index. This has been fixed.
386742 When an ODBC connection is in auto-commit mode, SQLFreeStmt( SQL_CLOSE ) and SQLMoreResults() both close the cursor and do a commit. If the auto-commit had failed, these functions would have incorrectly returned success. This has been fixed so that these functions now return SQL_ERROR if the commit fails.
386756 The server can now dump the SQL text or graphical plans of expensive queries to the request-level log. A new server command line option, -zx <cost>, has been added to turn on this feature and define the threshold above which queries are considered expensive. Expensive queries can be handled in two ways: when the -zp option is also specified, detailed graphical plans will be sent to the request-level log. Otherwise, only the SQL text of the expensive queries will be logged.

When both -zx (LogExpensiveQueries) and -zp (RememberLastPlan) are set:

-queries whose estimated cost is greater than <cost> milliseconds will be built with full statistics gathering gear, and a graphical plan will be dumped to the request-level log at build time

-queries whose estimated cost is less than <cost> milliseconds will be built with low-detail statistics gathering gear

-queries whose actual run-time is greater than <cost> milliseconds will have their graphical plan dumped to the request-level log when their cursor is closed; plans will contain whatever level of statistical detail was determined for them at optimization time (as described in the first point)

When only -zx is set:

-queries will be built with low-detail statistics gathering gear

-queries whose actual run-time is greater than <cost> milliseconds will have their SQL text dumped to the request-level log when their cursor is closed

The request-level log must be directed to a file for these lines to appear (by using the -zo command line option or by setting the RequestLogFile property). However, these lines will still appear even if the RequestLogging property is 'None'.

Plans appear as a single PLAN line in the request-level log; SQL text appears as a single INFO line. They are prefixed by a header which indicates whether they were dumped at build time or cursor completion time, and what the associated cost at that time was. Plans dumped at build time are prefixed by [XB <cost>], plans dumped at cursor completion time are prefixed by [XC <cost>], and SQL text dumped at completion time is prefixed by

[XS <cost>] (where all costs are given in seconds, the same as displayed in graphical plans).

The LogExpensiveQueries property can be set by the -zx <cost> command line option, or by setting the LogExpensiveQueries server option with sa_server_option(). Setting <cost> to 0 (zero) turns this logging off.

386757 The default maximum cache size for servers running on Windows systems is now limited to the lesser of the available address space, less 512MB, (previously, this was hard-coded as 256MB); or 90% of (total physical memory less 4MB), but not less than 2MB. Available address space is roughly 1.7GB on 32-bit Windows XP and Windows Server, 2.7GB on 32-bit Windows Advanced, Enterprise and Datacenter Servers (if /3GB is in boot.ini), 3.7 GB for 32-bit executables running on Windows x64 Edition, and 9TB or so for 64-bit executables running on Windows x64 Edition.

These changes affect conventional caches only -- not AWE cache.

386918 When an error occurred in a subselect that was part of a procedural statement (for example, SET, MESSAGE, IF/WHILE conditions, etc.), the server would have failed to release part of the cache that was used by that subselect. Subselects that are part of queries that return results sets, explicitly opened cursors, insert...select, or select...into statements, are not affected. This would not cause any immediate problems, however if a large number of calls were made to such procedures, an increasing portion of the database server cache would have become unavailable to the server for normal use. This would then have caused the cache to grow larger than necessary, and eventually, given enough such calls, have failed with a 'Dynamic Memory Exhausted' error. This may also have shown up as steadily decreasing server performance. This problem was more likely to appear if stored procedures were written with exception handlers or ON EXCEPTION RESUME. This has now been fixed. A workaround is to restart the server whenever performance drops below an acceptable level, or at shorter intervals than the memory exhaustion error is reported.
387038 When connecting using the "Connect" dialog, and specifying a DSN or FileDSN that contained a LINKS connection parameter, the connection would have failed if the "Search network for database servers" checkbox on the "Database page" was checked. The problem was that the "Search network" checkbox causes "LINKS=ALL" to be added to the end of the connection string, which overrides any LINKS information contained in the DSN or FileDSN. This has been fixed so that now when the "ODBC Data Source name" or the "ODBC Data Source file" radio buttons are selected on the "Identification" page, the "Search network for database servers" checkbox is automatically unchecked. The names of the server, database, and database file are also reset. Users are free to modify these fields if they need to override the contents of the data source.
387061 The locked_heap_pages and main_heap_pages statistics were being reported incorrectly if the performance monitor was left running during server restarts. Further, these counters were not being reported as accurately as they could have been. These problems have been corrected.
387070 The the method AsaDataAdapter.Fill may have caused an InvalidCastException if the query returned columns which had the same name and different data types. This problem has been fixed, but it is not recommanded to use duplicate column names when filling a DataSet.
387156 Attempting to grant a large number of column permissions, (the actual number depended on the cache page size), for one table/grantor/grantee combination, would have caused assertion failure 101506 - "Allocation size too large when re-allocating memory". This has now been fixed.
387180 The server may have stopped with an 'out of memory' fatal error when it did not need to do so. For this to have occurred, there must be very few reusable pages left in the cache.

While this specfic problem has been fixed, the server may still fail later on with an 'out of memory' error.

387212 Attempting to use the FileDSN connection parameter to connect to a database would have caused Interactive SQL to fail to connect, if the file was not in the current directory and the file name contained no path information. The error message: "The ODBC data source file could not be found" would have been displayed. This has been fixed.

Note, this problem would affect connecting in all of the graphical administration tools.

A workaround would be to use a qualified name for the DSN file -- either relative or absolute.

387224 If a query involved the ROLLUP or CUBE operator over more than 255 columns, memory would have been corrupted, which could have lead to unexpected behaviour. This was very unlikely to occur in practice, and an error would have been returned for ROLLUPs or CUBEs on 65 to 255 columns. An error is now returned for ROLLUP or CUBE operations over 64 columns.
387276 Predicates with constant arguments can be evaluated at optimization time, which allows them to be simplified, potentially giving a better estimate of selectivity. For example, the following predicate would give an estimate of 15% when not simplified, but an estimate of 0% when it is: "1 IN (2, 3, 4)". Now with this change, LIKE and IN predicates are simplified in this way. In addition, BETWEEN predicates where the first argument is a constant NULL value, are now simplified to UNKNOWN.

In addition to improving selectivity estimates, these simplifications may allow the optimizer to discover sargable predicates that permit a cheaper access pattern. For example, the query:

select *

from rowgenerator

where 1 in (2,3,4) or row_num = 2

would have used a sequential scan before this change, but now would use a scan on the primary key.

In the above discussions, host variables and procedure variables are also considered as "constants" for the purposes of simplifying predicates.

387397 Closing an HTTP connection to the server could have caused the server to crash, or other existing or subsequent HTTP connections to fail. While rare, this problem was slightly more likely on multi-processor machines. This problem has now been fixed.
387508 Message transmission rules are specified using the -policy <filename> command line option of QAnywhere Agent. If the last rule in the rules file did not end in a newline the rule was ignored. This is now fixed such that the last rule no longer needs to be terminated by a newline.
387511 The QAnywhere JMS sample program for sending and receiving messages, used a combination of API methods that was not always supported by JMS providers. The QueueSender was being initialized with a specific Queue and then the QueueSender method send() was being called with a specific (and identical) Queue. Some providers would throw an UnsupportedOperationException. The sample has been fixed to use the QueueSender send() method that does not specify a Queue.
387522 It was possible for the server to crash when starting up more than one database, or when servicing the first few requests after startup, if a checkpoint was also occurring. This problem was timing dependent and likely very rare, but was more likely on multiprocessor machines. This has now been fixed.
387530 When run on 32-bit x86 Linux systems, the server could have reported an incorrect value for property( 'NativeProcessorArchitecture' ). The value could randomly have been any of 'X86', 'X86_64' or 'IA64'. This has now been corrected.
387625 In some cases compressing a database that was using checksums with the Compression utility, could have corrupted it. This has been fixed.
387676 After creating a procedure using the syntax

CREATE PROC [owner.]name ...

Sybase Central would have incorrectly displayed the procedure's SQL as

ALTER PROCEDURE [owner.]nameCREATE PROC [owner.]name ...

This has been fixed. Now the procedure is displayed as

ALTER PROCEDURE [owner.]name ...

387852 The server will now dump cache information when it gets a 'dynamic memory exhausted' assertion. The dump file will contain information about the cache contents, and help engineering diagnose the cause of the out of memory condition. The filename will be of the form asa_cache.dmp.<pid>, and will be placed in one of the following directories:

- the directory specified by the environment variable ASA_DIAG_DIR

- the current directory of the server process

- the temp directory of the operating system

387869 When executing a batch using the PreparedStatement object, it is proper practice to use the PreparedStatement.executeUpdate() method to execute the batch and retrieve the single update count associated with it. However, applications sometimes (incorrectly) use the PreparedStatement.executeBatch() method instead. The iAnywhere JDBC driver has now been modified to support the PreparedStatement.executeBatch() method in this manner.
387997 A database file may have grown, even when free pages existed in the dbspace, if the free space was fragmented such that no 8-page cluster aligned on an 8-page boundary existed within the dbspace, and pages for a large table (one with bitmaps) were being allocated. When growing a large table prior to this change, the server always allocated table pages in clusters of eight pages so that group-reads could be performed on a sequential scan. If no clusters were found, the dbspace was grown to create one. Now, if no free cluster is found, the server will attempt to allocate pages from a cluster that has both free pages as well as pages allocated to the table that is being grown. If no free pages are found by this method, the server will use any free page in the dbspace. So now te dbspace will not grow until there are no free pages left in the dbspace.

As a work-around, periodically running REORGANIZE TABLE on all tables will generally avoid the problem

388068 If a connection that had the Wait_for_commit option set to 'On', issued a request which violated referential integrity, and the next commit was done as a result of a SET OPTION statement that set a permanent option for a different user, the server could have failed assertion 104301 "Attempt to free a user descriptor with non-zero reference count", when the server was stopped (e.g. by autostop option), or a subsequent connection revoked CONNECT permission from the user the option was set for. This has been fixed.
388072 The INPUT...PROMPT statement would never have stopped prompting for column values when Interactive SQL was run in console mode. This problem did not occur when run in windowed mode. This bug has been fixed.
388141 If the FIPS option was selected during installation, FIPS encryption will be available, but calling the system function property('IsFipsAvailable') would have returned 'NO'. The server was checking for the existence of the dll libsb.dll only in %WINDIR%. This has been fixed, the server now checks in the usual places and then checks %WINDIR% if it can't find it. A workaround is to copy the libsb.dll from %ASANY9%\win32 to %WINDIR%.
388142 The system functions encrypt() and decrypt() did not respect the -fips server switch. This has been fixed, if the -fips switch is specified, then the algorithm used for encrypt() and decrypt() will be 'aes_fips', otherwise 'aes' (or no algorithm) is specified.
388164 A new connection property, RequestStatus has been added. Calling CONNECTION_PROPERTY('RequestStatus') will return one of the following values:

"Idle" - The connection is not currently processing a request

* "Unscheduled" - The connection has work to do and is waiting for a worker thread

* "BlockedIO" - The connection is blocked waiting for a I/O

* "BlockedContention" - The connection is blocked waiting for access to shared engine data structures

"BlockedLock" - The connection is blocked waiting for a locked object

"Executing" - The connection is executing a request

The values marked with '*' are only available if the RequestTiming server option is ON (see below), if the option is OFF (the default), these cases are reported as "Executing". These properties are also returned by calling sa_conn_properties().

A new server option RequestTiming has also been added. When it is on, additional timing information is maintained for each request. The option is off by default, and it can be turned on either by specifying the new "-zt" command line option, or by calling sa_server_option('RequestTiming', 'ON'). The current value of the option can be retrieved using PROPERTY('RequestTiming'). When the RequestTiming option is on, the following statistics are recorded:

"ReqCountUnscheduled" "Number of times waited for scheduling"

"ReqCountActive" "Number of requests processed"

"ReqCountBlockIO" "Number of times waited for I/O to complete"

"ReqCountBlockLock" "Number of times waited for a lock"

"ReqCountBlockContention" "Number of times waited for atomic access"

"ReqTimeUnscheduled" "Time spent unscheduled"

"ReqTimeActive" "Time spent processing requests"

"ReqTimeBlockIO" "Time spent waiting for I/O to complete"

"ReqTimeBlockLock" "Time spent waiting for a lock"

"ReqTimeBlockContention" "Time spent waiting for atomic access"

These values can be retrieved using CONNECTION_PROPERTY( <name> ), or by calling sa_conn_properties(). If the RequestTiming server property is off, these return NULL. Alternatively, a new internal stored procedure has been created to efficiently summarize request timing for all connections. Procedure dbo.sa_performance_diagnostics() returns the following columns (each of which corresponds to the connection property of the same name):

Number int,

Name varchar(255),

Userid varchar(255),

DBNumber int,

LoginTime timestamp,

TransactionStartTime timestamp,

LastReqTime timestamp,

ReqType varchar(255),

ReqStatus varchar(255),

ReqTimeUnscheduled double,

ReqTimeActive double,

ReqTimeBlockIO double,

ReqTimeBlockLock double,

ReqTimeBlockContention double,

ReqCountUnscheduled int,

ReqCountActive int,

ReqCountBlockIO int,

ReqCountBlockLock int,

ReqCountBlockContention int,

LastIdle int,

BlockedOn int,

UncommitOp int,

CurrentProcedure varchar(255),

EventName varchar(255),

CurrentLineNumber int,

LastStatement long varchar,

LastPlanText long varchar,

AppInfo long varchar

The procedure dbo.sa_performance_diagnostics() can be used to identify connections that have spent a long time waiting for engine requests to complete.

For example:

SELECT Number, Name,

cast( datediff( second, LoginTime, CURRENT TIMESTAMP ) AS DOUBLE ) AS T,

ReqTimeActive / T AS PercentActive

FROM dbo.sa_performance_diagnostics()

WHERE PercentActive > 10.0

ORDER BY PercentActive DESC

Alternatively, you could find all requests that are currently executing, and have been executing for a long time:

SELECT Number, Name,

cast( datediff( second, LastReqTime, CURRENT TIMESTAMP ) AS DOUBLE ) AS ReqTime

FROM dbo.sa_performance_diagnostics()

WHERE ReqStatus <> 'IDLE' AND ReqTime > 60.0

ORDER BY ReqTime DESC

The following new performance statistics have also been added:

CacheFree, CacheFile, CacheFileDirty, CacheAllocated, CachePanics, CacheScavenges, CacheScavengeVisited, MultiPageAllocs, HeapsRelocatable, HeapsLocked, HeapsQuery, HeapsCarver, LockedCursorPages, QueryHeapPages, CarverHeapPages. These statistics are useful for diagnosing how the server is using memory

These statistics are all accumulated for the entire server, and this aggregate value can be retrieved using PROPERTY(name). In addition, some of the statistics are also recorded on a per-connection basis (marked as "con/eng" in the details below). The per-connection value can be retrieved with CONNECTION_PROPERTY(name). In addition, these values can be retrieved using the Windows performance monitor. Alternatively, a new internal stored procedure has been created to efficiently retrieve performance statistics. Procedure dbo.sa_performance_statistics() returns the following results:

DBNumber INT,

ConnNumber INT,

PropNum INT,

PropName VARCHAR(255),

Value INT

This procedure can be used to efficiently retrieve all server, database, and connection performance statistics.

For example:

unload

select current timestamp, *

from sa_performance_statistics()

to 'dump_stats.txt' append on

will unload all performance statistics to a text file. This approach is much faster than retrieving statistics individually.

Memory Diagnostic Statistic Details:

The following gives more details for each performance statistic (name, perfmon label, and description). Counters marked as "eng" are available only at the server-level. Those marked as "con/eng" are additionally available per-connection.

CacheFree eng

Cache Pages: Free

"Number of cache pages not being used"

CacheFile eng

Cache Pages: File

"Cache pages used to hold data from database files"

CacheFileDirty eng

Cache Pages: File Dirty

"Cache pages that are dirty (needing a write)"

CacheAllocated eng

Cache Pages: Allocated Structures

"Cache pages that have been allocated for server data structures"

CachePanics eng

Cache: Panics

"Number of times the cache manager has failed to find a page to allocate"

CacheScavenges eng

Cache: Scavenges

"Number of times the cache manager has scavenged for a page to allocate"

CacheScavengeVisited eng

Cache: Scavenge Visited

"Number of pages visited while scavenging for a page to allocate"

LockedCursorPages eng

Mem Pages: Pinned Cursor

"Number of pages used to keep cursor heaps pinned in memory"

QueryHeapPages con/eng

Mem Pages: Query Processing

"Cache pages used for query processing (hash and sort operations)"

CarverHeapPages con/eng

Mem Pages: Carver

"Cache pages used for carvers"

HeapsRelocatable con/eng

Heaps: Relocatable

"Number of relocatable heaps"

HeapsLocked con/eng

Heaps: Relocatable Locked

"Number of relocatable heaps currently locked in cache"

HeapsQuery con/eng

Heaps: Query Processing

"Number of heaps used for query processing (hash and sort operations)"

HeapsCarver con/eng

Heaps: Carver

"Number of heaps used for carvers"

MultiPageAllocs eng

Cache: Multi-Page Allocations

"Number of multi-page allocations"

388338 The number of rows returned from a Nested Block Join (JNB) could have been underreported in a Graphical Plan with Statistics. This was a display problem only, and did not affect the actual execution of the query. It was also not a problem in a Graphical Plans with estimates only. This has been fixed.
388383 The ASA server automatically collects column statistics during query execution, DML update statements, LOAD TABLE statement and index creation. The default behaviour was to collect and update statistics under all situations. A new database option Collect_statistics_on_dml_updates has been added, allowed values ON (default) or OFF, which can be used to enable or disable collection of statistics during DML update statements.
388488 The server could have failed with "fatal error: unknown device error" when performing a query over a temp table. The query had to return blob values, and make use of the SortTopN data flow operator. SortTopN most frequently appears in plans for queries with an ORDER BY clause and a row limit (ie. TOP n or FIRST).

For Example:

create procedure test()

result( val char(256) )

begin

declare local temporary table val_table(

val char(256) null );

insert into val_table values( repeat('a',256));

select * from val_table;

end;

select first val from test() order by val;

This problem has now been fixed.

388498 The server automatically gathers and maintains column statistics as queries are executed. If multiple connections concurrently updated column statistics as a result of query execution, there was a potential for some column statistics to become inaccurate. This problem has been resolved.
388573 If a result set had a DECIMAL column with a value that has more than 10 digits, but less than 19 digits, and was an integer, then calling ResultSet.getLong() should have returned the entire value but did not. This problem has been fixed.
388752 If a column's COMPUTE clause contained a string constant, or a string constant expression, the server would have crashed each time the compute expression was evaluated. This has been fixed.
388837 When building a remote database from a reload file generated by extracting from a consolidated database there could have been a failure. This would only have occurred if there existed a publication on a subset of columns in a table and there were also statistics on some columns in the table that were not part of the publication. This has been fixed.

A workaround would have been to drop the statistics on the table or column before extracting the user database.

388838 If a proxy table was created with a column that contained a DEFAULT clause, then an insert into that table would have failed if the insert explicitly specify the column, but with a different case for the column name. The returned error would have been "Duplicate insert column". For example:

create table T1 ( col1 int default 10, col2 int ) at '....';

insert into T1 ( COL1, col2 ) values ( 1, 1 );

This has been fixed.

388852 If Interactive SQL's "commit after each statement" option was on, calling some system stored procedures (e.g. sa_table_fragmentation) would have produced an empty result set. This was due to some local temporary tables not specifying a disposition on COMMIT, and so assumed ON COMMIT DELETE ROWS. This has been fixed. Databases with this problem must be rebuilt, or upgraded, to correct the stored procedures affected by this change. A workaround is to uncheck the "commit after each statement" option.
388858 When synchronizing an ASA MobiLink Client that had multiple publications, MobiLink would have allocated new memory to store the publication information on each synchronization. Now, the memory is freed after the synchronization completes.
388904 The MobiLink server could have failed to gather the synchronization scripts for a given table and reported the error "Error fetching table script t1.begin_synchronization", even though table t1 did not have a begin_synchronization script. This problem was more likely to have occured when using an Oracle consolidated database and the "iAnywhere Solution 9 - Oracle Wire Protocol" ODBC driver. This problem has now been fixed.
388906 When run on Linux platforms, the server could have crashed on shutdown if a custom backup library was used to perform backups. This has been fixed.
389039 The server could have failed with a "dynamic memory exhausted" error if AWE was enabled (ie. -cw command line option). This problem has been corrected. The only work around is to disable AWE.
389195 Due to a race condition in the server, requests over HTTPS connections may have been given an error status, usually 501 (Method Not Implemented). This has been fixed.
389224 The "ALTER DATABASE CALIBRATE" statement can be used to re-calibrate the server's I/O cost model for a specific database and hardware configuration. The recomputed cost model is stored in the catalog table SYS.SYSOPTSTAT. In some cases, the server was improperly reading the cost model when the server was restarted. This has been resolved, but it was not likely to have caused any major and/or visible problems.
389230 While running multiple connections that fetched from different proxy tables, and different remote servers using ASEJDBC, if one connection was killed then the server's Java Virtual Machine can no longer be started. This has now been fixed.
389431 A query with an undefined column used inside a derived table or a view, may have caused the server to crash. For this to have occurred, the derived table or the view must have contained one of the UNION, EXCEPT, or INTERSECT operators.

For example:

CREATE VIEW VV1( X)

AS

SELECT A.id

FROM product A left outer join

(

SELECT ERROR FROM PRODUCT P1

UNION ALL

SELECT 1 FROM sales_order_items S1

) B

on 1=1;

The column 'ERROR" in the first query block of the derived table 'B' is undefined, and the query 'select count(*) from VV1' will cause the server to crash.

This is now fixed.

389447 If a database had a "Connect" event defined, attempting to rebuild the database using the Unload utility with the Rebuild and Replace option (-ar) may have failed with the error: "Too many connections to database being replaced". Whether the error was reported or not depended on how long the event took to execute. This has been fixed, this error will no longer be reported if the only other connections are for event handlers.
389452 Growing dbspaces could be much slower than would normally be expected, particularly on Windows platforms, after the applying the changes for Engineering Case 361509. Now, when ALTER DBSPACE ADD ... is executed on Windows platforms, and more than 4MB of space is being added, the server will attempt to allocate a large (4MB) buffer to initialize the newly allocated portion of the file. The buffer will only be allocated if there is at least 16MB of physical memory free, as well as at least 16MB of address space available. The buffer will be freed after the file growth has completed. If the database server is running on Windows XP or later, on an account with the volume management privilege (which is on by default for an administrator), the server will also take advantage of new OS APIs to make file growth even faster.

In a simple test on a system with a single SCSI drive, adding 1GB to a dbspace took only 22 seconds with this change, compared to over 5 minutes previously.

389502 The OLEDB PROVIDER_TYPES rowset did not implement the DATA_TYPE and BEST_MATCH restrictions. It implemented a restriction on TYPE_NAME instead and ignored BEST_MATCH. This problem has been fixed so that the PROVIDER_TYPES rowset now implements the DATA_TYPE and BEST_MATCH restrictions. To install a new version of the PROVIDER_TYPES rowset into your database, load and run scripts\oleschem.sql against the database.

As well, not all type names are included in the rowset, and some data types that could be included were not. This has also been corrected.

389538 If an attempt to connect to a database with the MobiLink plug-in failed, then Sybase Central would have crashed. The plug-in was assuming that if a SQLException was thrown from JDBCDrivers.connect(), then the value returned from SQLException.getMessage() was always non-null, which was not always the case. This has been corrected.
389570 Cardinality estimation for a partial index scan may have been incorrect if selectivity estimations of the sargable predicates were set to 100%. This has been fixed. The index must have been a foreign key, or an unique index.
389583 If a database with auditing enabled was loaded in read-only mode, the database could have been used, but audit records would not have been created. This has been fixed so that now databases with auditing enabled cannot be started in read-only mode.
389590 If a server was started with the -o <file name> server command line option (filename for copy of message window), then stopped and immediately started again with the same -o <file name>, the server could fail to start with the error "Invalid database server command line" or "Can't open Message window log file: <file name>". This failure was rare and timing dependent. This has been fixed so the second server will successfully start.
389598 If an Open Client application used unsigned datatypes in an Remote Procedure Call, there was a good chance the application would hang. This problem has now been fixed.
389628 The Unix installer could have reported that there was enough disk space for the installation, but later fail while copying files. This problem only occurred when help files (HTML or PDF) were being installed. This has now been fixed.
389687 If the server was started with the -gn command line option (maximun number of concurrent requests) set to a value greater than 255, the server may have crashed when under a heavy I/O workload. This has now been fixed.
389796 When performing an UPDATE (or possibly a DELETE) using a keyset cursor, over a table that was joined to itself (i.e. appears multiple times in the UPDATE or FROM clause), the server could have failed to obtain write locks on rows it modified. This could have resulted in lost updates, or a corrupted index, if an update was made to an indexed column. This has been fixed.
389970 On the AIX, HP-UX, and Tru64 Unix platforms, if more than one server was run concurrently on the same machine, the ServerPort TCPIP protocol option needed to be specified on both the client and server in order to be able connect. This has been fixed so that on these platforms the ServerPort option is no longer required when multiple database servers are started on one machine.

Note than on Mac OS X, the ServerPort option must still be specified when starting a network server if a server is already running on the same machine.

390008 Attempting to unload the ASA server via the NetWare console (i.e. "unload dbsrv9") would have caused the NetWare machine to hang. This has been fixed.
390025 The server could have crashed while performing a string comparison using the LIKE operator. This has been fixed
390063 Assert failures 200602 and 200603 indicate that when truncating a table, a mismatch was detected between the number of pages in the table and the counts recorded in the table's in-memory data structures. These assertions would have brought down the server, even if the table concerned was a temporary table. In the case of a temporary table, this likely does not warrant bringing the server down. This behaviour has been changed so that now the assertion text is written to the console log, and the server is allowed to continue running. Also, the text of these assertions has been changed to indicate the table in question.
390132 If the MobiLink ASA client, the MobiLink synchronization server, or SQL Remote for ASA, was started as a Windows service, the service could not have been stopped by Window's Service Manager or the Service Creation utility. This has been fixed.
390133 If only the second member of a UNION, INTERSECT, or EXCEPT query contained multiple Transact-SQL variable assignments, then the server would have crashed. This has been fixed. Now the engine will return a syntax error if any member other than the first contains Transact-SQL variable assignments, or an "into <tablename>" clause.
390162 The server collects and maintains column statistics during UPDATE and DELETE statements. In some situations, such as when a large DELETE statement was rolled back, the column statistics could have progressively become incorrect. In particular, the estimated selectivities could have kept increasing without bound. The server now places an upper bound of 100% for each individual predicate selectivity stored in the database in these situations.
390234 A call to SQLDriverConnect() can return the completed connection string. In version 8, the ASA ODBC driver produced the connection string with the "DSN=" connection parameter first in the string. In version 9, the ODBC driver produced the connection string such that "DSN=" was not necessarily first.

For example, if the connection string passed to SQLDriverConnect() was "PWD=sql;Userid=dba;DSN=test9" then in version 8 the connect string "DSN=test9;UID=dba;PWD=sql" was returned, and in version 9 the connection string "UID=dba;PWD=sql;DSN=test9" was returned. According to the ODBC specification, the order shouldn't matter, but Gupta Team Developer 3.1 applications did not handle the version 9 order correctly. This problem has been resolved by restoring the version 8 behavior where "DSN=" is placed first in the connect string.

390347 If a timestamp value is fetched using a TDS connection (ie. jConnect or Open Client), the fractional seconds are only accurate to two digits of precision. This is due to the TDS protocol representing fractional seconds as increments of 1/300ths of a second. Since the server stores the fractional seconds as microseconds, it is converted to a value which is a multiple of 1/300th of a second. The converted value though was simply being truncated, rather than rounded, which may have caused the value of a timestamp fetched via a TDS connection to have been 1/300th of a second less than the value stored. This has now been fixed, but it should be noted, that rounding does not work for all values, but instead, will only work for timestamp values originally inserted using a TDS connection. Since in these cases, the conversion to 1/300ths of a second is first performed by jConnect or Open Client prior to sending the value to the server.
390431 On all Unix platform except Solaris, the server may have incorrectly reported the error "Unable to synchronize due to external event" in the event log, and then crashed. This message indicates that a global System V semaphore in use by the server was deleted by an external cause. In reality no such cause existed and the real cause was due to an unrelated server crash. This has been fixed and this error message will now only appear

if the semaphore was deleted.

390484 On the AIX, HP-UX, and Tru64 Unix platforms, if more than one database server was run on a machine, the ServerPort TCPIP protocol option needed to be specified on both the client and server in order to be able connect. This has been fixed so that on these platforms the ServerPort option is no longer required when multiple database servers are started on the same machine.

Note than on MacOS X, the ServerPort option must still be specified when starting a network server, if a server is already running on the same machine.

390761 The iAnywhere JDBC driver has now been enhanced to support the Organic ASE ODBC driver. The JDBC driver now checks if the ODBC driver is the Organic ASE ODBC driver and appropriately sets the default result set type and other attributes.
390763 The number of rows returned as a result of a join of the form 'T1.primary key = T2.primary key' may have been grossly underestimated during optimization. Among the conditions that need to occur are the following:

1. The 'primary key' may have been a single column or a multi-column candidate key

2. Table T1 must have been much smaller than table T2, and appeared before T2 in the FROM clause.

This underestimate may have resulted in less than optimal plans being chosen by the optimizer. This has now been fixed.

390765 If an Open Client dblib application attempted to fetch a tinyint value using the dbdata() function, instead of dbbind(), then the application would always get the value 0, instead of the actual tinyint value. Note that this problem only occurred if the tinyint value was nullable. This problem has now been fixed.
390773 If the output file specified for the File Hide utility already existed, and was more than 6 bytes bigger than the input file, the utility would have corrupted the output file. This has been fixed. A workaround is to delete the output file before running the File Hide utility.
390940 The ulload utility could have crashed due to a stack overflow exception, when very large data sets were loaded into PalmOS databases. The loop that loaded rows into a table did an implicit memory allocation. When the scope of the loop was exited, the memory was not freed, eventually after very many rows caused a stack overflow. This has now been corrected.
390955 Applying the 9.0.2 English Maintenance release to a 9.0.1 installation would not have upgraded the MobiLink plug-in if Mobilink itself was not installed. This would then have left the plug-in not matching the Sybase Central viewer and ASA connection class.

The symptom of this failure is a stack trace when attempting to connect from the MobiLink plug-in. The exception is due to this method not being found, (the right function name, but the wrong parameter signature):

com.sybase.asa.logon.LogonDialogFactory.create( )

Subsequent applications of EBFs also did not update the plug-in and thus failed to correct the problem. This has now been fixed, so that any EBF later than build 3136 will upgrade mlplugin.jar.

391182 If the text of a stored procedure was made unreadable with the HIDDEN clause, and it contained a call to itself with at least one parameter, then any call to this procedure will have failed with the error "Wrong number of parameters to function 'proc_name'". The error would have disappeared after restarting the database or reloading the procedures due to the execution of a DDL statement. This has now been fixed.
391202 JMS messages received by the QAnywhere JMS connector are forwarded on to QAnywhere if they contain a property (ias_ToAddress) indicating the QAnywhere address. If the property was missing, an error was logged, and the JMS message was discarded. This did not provide an appropriate mechanism for handling JMS messages missing the key property. To fix this, a new configurable JMS connector property has been added: ianywhere.connector.jms.deadMessageDestination. This property should be set to the value of a valid JMS Destination. All messages received by the QAnywhere JMS connector that are missing the ias_ToAddress property will be forwarded onwards to the JMS Destination specified by the property ianywhere.connector.jms.deadMessageDestination. See the documentation section "QAnywhere User's Guide->Setting Up QAnywhere Messaging->Using JMS Connectors->Configuring the JMS connector properties file" for more information on setting a connector property.
391357 If the text of a stored procedure, view or trigger was made unreadable using the HIDDEN keyword, and the definition string was invalid, the server may have crashed. This has been fixed.
391577 The global variables @@fetch_status, @@sqlstate, @@error, and @@rowcount may have been set with incorrect values if a cursor's select statement contained a user-defined function that itself used a cursor. This has been fixed.
391582 The Listener utility may have hung on shutdown. This has now been fixed.
391584 If two tables or views were selected, and the "View data in Interactive SQL" menu item was clicked, two Interactive SQL windows would have opened, but data for only one of the tables or views was displayed in one of the Interactive SQL windows. The other window would often have been empty. This has been fixed.

A workaround for this problem is to open the Interactive SQL windows separately -- select one table, click "View data in Interactive SQL", then select the other table, and click the menu item again.

391585 Enhancement Request- Update list of "Known Open Client limitations of ASA" in PG
391598 Upgrading a version 9.0.1 database, used as a QAnywhere consolidated message store, using Unload utility may have failed. The problem would occur if any message contained an embedded single quote in any of the message's property names, or any of the message's property values. The code to unload QAnywhere data has now been fixed to properly escape single quotes.

A work-around is as follows:

- Start the consolidated database, ensuring that there is no MobiLink server connected to the database

- Connect to the database as a user with DBA privilege using dbisql

- Delete the contents of the table ml_qa_repository_props by executing "delete ml_qa_repository_props". Commit the operation by executing "commit". The data in this table is strictly for caching purposes and deleting the data will have no effect on server functionality.

- Upgrade the database using the dbunload command.

391712 Upgrading a version 9.0.1 database, used as a QAnywhere consolidated message store, to version 9.0.2 using the Upgrade utility may have failed if EBF 9.0.1 1991 had been applied to the 9.0.1 software. This EBF included an an index on the column "destination" in the QAnywhere table ml_qa_repository, in order to improve performance. This column is no longer used in 9.0.2, and the upgrade script attempts to drop it, but the index makes this drop fail. This has now been fixed by dropping the index if it exists.

A work around of the problem is to do the following:

- Start the consolidated database, ensuring that there is no MobiLink server connected to the database

- Connect to the database as a user with DBA privilege using dbisql

- Drop the offending index by executing "drop index ml_qa_repository_destination"

- Disconnect and shut down the database

- Backup the database and log file (as should be done before any upgrade)

- Upgrade the database using the dbupgrad command.

Or rebuild the database as a 9.0.2 database using the Unload utility.

391719 The QAnywhere MobiLink server may have silently crashed on shutdown. This crash was not apparent unless one looked at the return code from the MobiLink process. Because of this occassional crash, using the MobiLink Stop utility to shutdown MobiLink may have incorrectly reported that MobiLink had not shut down. This silent crash problem has now been fixed.
391730 Server-side delete rules for deleting messages from an Oracle consolidated message store did not work if the delete rule contained a reference to a custom message property. This has been fixed so that such rules now work correctly.
391747 If a connection string contained the START= parameter with a value that ended with "-x",

"-xs" or "-ec", and was immediately followed by the -x, -xs or -ec parameter with at least two options, then the string would not have parsed properly and the application would have failed with a SQLCODE -95 error. This is most likely to happen with dbspawn, which converts the server command to a START= parameter.

For example:

dbspawn dbeng9 -n myserver -o output-file-x -x tcpip(port=1234;timeout=3)

This has been fixed.

391751 Numerous changes have been made to the system procedures used by jConnect when connected to ASA servers. Newly created databases will have these changes, but to update existing databases run the script jcatalog.sql, which is in the scripts directory.
391775 With the 9.0.2 build 3124 EBF a new message-based API was introduced for configuring and closing a JMS connector on-the-fly. Using the API to close and then opening a JMS connector on-the-fly had the side-effect of stopping all QAnywhere output from being logged. Restarting the QAnywhere server would have restored proper logging. This has been fixed, now closing a JMS connector on-the-fly will not stop QAnywhere output from being logged.
391785 Processing a message from QAnywhere to JMS through the QAnywhere JMS connector could have taken up to 5 seconds. Previously, connectors were polled every 5 seconds for messages. Now a QAnywhere connector is notified as soon as a message destined for the connector is uploaded.
391887 Calling the method AsaDataReader.GetSchema() could have generated the exception: "ASA .NET Data Provider: Column 'table_name' not found (-143)", if the database also had a user table named systable. This has now been fixed by qualifying references to system tables with the SYS owner name.
391888 If the "Show multiple result sets" option was turned on, result sets were not editable. This has been corrected so that result sets are now editable with this option on.

Note that editability is still subject to the requirements that:

- All of the columns are from the same table

- If the table has a primary key, all of the primary key columns must have been selected

- There must not be any Java columns selected

391889 If there were SQL errors reported in the server log by the JMS connector, or the background notification threads (indicated by the prefix [QA]), then a leak of database connections would have occurred. Every error that occurred forced a new database connection to be created without closing the old connection. One example of an error that can cause this problem is an invalid server-side transmission or delete rule. The problem was due to the current connection -- the one encountering the error -- not being returned to the connection pool, so it was never closed. This has now been fixed so that the connection encountering an error is closed.

--EOF--

  • 本文链接地址:http://www.dbainfo.net/sap-asa-cr-number-2.htm
  • 本文为dbainfo个人原创,请在尊重作者劳动成果的前提下进行转载;
  • 转载务必注明原始出处 : Sybase数据库技术,数据库恢复专家
  • 对《SAP SQL Anywhere的所有已知BUG列表(2)》有何疑问或见解,请在本文下方发表;
  • 对网站还有其他问题或建议,请提交在留言板,谢谢!
  • 目前还没有任何评论.
    :wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)