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

随着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
391900 Intreactive SQL could have reported an 'internal error' if the Import Wizard was used to read data from an ASCII file into an existing table, and there were fewer columns in the file than columns in the table. This has been fixed.
392015 Server-side transmission rules, including references to more than one custom message property, may under certain circumstances have evaluated as if one or more of the custom property values was null. This may have occurred if the transmission rule referred to two or more custom message properties in the same rule and the server delete rules included a reference to one of the same custom message properties. This problem has been fixed.
392017 If a shared connection profile was created, it was not saved if Sybase Central terminated abnormally after the connection profile dialog is closed. Private connection profiles were saved properly. This has now been fixed.
392029 The server would have returned either -9 or a conversion error from the following query, depending on the platform:

select hextoint('fffffffffffffff7');

This problem has been fixed. The server will now consistently return -9 for the result.

In furthering compatibility with Adaptive Server Enterprise, the following examples now return errors, since they contain invalid hexadecimal characters.

select hextoint('ffffJackf7')

392068 When backing up a database to multiple tapes, after the first tape had been written, the request for the next tape would have failed. This problem has been fixed.
392205 The SPACE() function in UltraLitre Dynamic SQL would have accepted a negative value. This has now been corrected.
392209 QAnywhere 9.0.1 clients can synchronize messages with QAnywhere 9.0.2 servers, but if there was a server-side transmission rule for a 9.0.1 client then messages destined for the 9.0.1 client would never have been delivered. The messages destined for the 9.0.1 client would have remained on the server indefinitely. If the server-side transmission rule for the 9.0.1 client is removed, the messages would then have been delivered normally. This has now been fixed, there is no longer a problem delivering messages from a 9.0.2 server to a 9.0.1 client in the presence of server-side transmission rules.
392213 The QAnywhere JMS connector could have been slow in the presence of many thousands of messages queued up destined for the connector. This has been fixed so that any new ASA database created to be used as a consolidated database for the QAnywhere server includes a new index that greatly improves the performance of the JMS connector in this situation.
392216 If a proxy table contained a column declared with DEFAULT AUTOINCREMENT, and an insert into that table did not contain a value for that column, the server may have crashed. For this to have happened, one of the column values in the insert statement had to be an expression or function call that needed to be evaluated. This has been fixed.
392227 Certain CASE expressions would have caused a 'feature-not-implemented' error to be generated by UltraLite Dynamic SQL. IF expressions were mistakenly omitted from the expression-matching code. This has been corrected.
392276 SQL log dates skip by 3:28 short of 25 days
392294 If the server was already stopped, the AsaClient would have thrown an exception when closing the connection. The AsaClient was checking the error code when closing the connection and threw the exception if the error code is not -85 Communication error. The AsaClient now ignores error whem closing the connection.
392323 If the QAnywhere Agent was run with the command line option -si to initialize the message store database, and a message store ID was specified with the option -id, the message store ID was not set until the QAnywhere Agent was invoked without the -si option.

This problem would have been noticed in the following scenario:

When the QAnywhere Agent was starting up while messages were being put into the message store, the QAnywhere Agent would have failed to start with the error:

E. 05/27 09:12:50. InternalError: User 'QA_USER' has the row in 'ml_qa_repository_content_client' locked

As well the problem would have occurred when the QAnywhere Agent was used to initialize a message store with store ID 'xyz' (-si -id xyz), and then the QAnywhere Agent was started with a different store ID (-id abc), the following error should have been given, but was not:

E. 05/31 12:05:29. QAnywhere Agent cannot be started with a client message store ID different than xyz with this message store.

This has been fixed so that now the message store ID is set, if it is specified, when the message store is initialized.

392421 The IP tracker for the Listener utility may have produced repeated error messages every second. They are now reported with an exponential increasing delay with this change.
392468 When an arithmetic operation generated an overflow error, the error message did not show the correct value if that value did not fit into the destination.

For example:

select 100000 * 100000

Previously, this returned an error message "Value 1410065408 out of range for destination". Now, the error message is the following: "Value 100000 * 100000 out of range for destination".

Further, after this change string values included in conversion or overflow error messages are enclosed in single quotes. If the string is truncated, an ellipsis (...) is used to indicate this.

For example:

select cast( '0123456789012345678901234567890123456789' as int )

would have given the error message: "Value 01234567890123456789012345678 out of range for destination" Now the error message is: "Value '0123456789012345678901234567890123...' out of range for destination". Similarly, an ellipsis is now used when printing binary values.

When NCHAR values were printed for error messages or plain text (explanation(), plan(), or graphical_plan()), the text was not represented correctly.

For example:

select cast( unistr('\u00df') as int )

would have caused the error message: "Cannot convert '脽' to a int". The text in the message was the result of cast( cast( unistr('\u00df') as binary ) as char). Now, the error is: "Cannot convert '�' to a int". The error message is now formed by converting from NCHAR collation to the database CHAR collation. If there are characters that can not be represented in the CHAR collation, they are replaced with substitution characters.

Also, when certain values were included in the result of a graphical_plan(), they could have generated an invalid XML result. For example, the following query previously generated an 'Invalid plan' error: select 'a\x1ab'. Characters that contain a byte value < 0x20 are now escaped and printed as '\xHH' where HH is the two-digit hex code for the byte. For example, in the "Select list" section of the graphical plan, the escaped text is now shown.

392470 When the string_rtruncation option is on, the error "Right truncation of string data" (SQLCODE -638, SQLSTATE 22001) was not being given when converting from numbers to binary. This has been corrected so that when the option is on, this error is now given in the following cases:

- REAL values converted to BINARY(3) or shorter

- DOUBLE values converted to BINARY(3) or shorter

- exact numerics converted to BINARY where a leading byte is truncated and the byte value is not zero

When converting exact numerics (bit, tinyint, smallint, unsigned smallint, int, unsigned int, bigint, unsigned bigint, numeric) to binary, the numeric value is first converted to one of the following types: INT, UNSIGNED INT, BIGINT, UNSIGNED BIGINT. If the target binary is smaller than 4 bytes for INT/UNSIGNED INT or smaller than 8 bytes for BIGINT/UNSIGNED BIGINT, then the most significant bytes of the value are truncated. For example:

SELECT CAST( 0x12345678 AS INT ) ival,

CAST( ival AS BINARY(3) ) bval

returns 0x345678 for bval. After this change, an error is raised if one of the truncated bytes is non-zero and the string_rtruncation option is on.

Further, when converting a too-long binary string to a number, errors are generated as follows:

- for REAL, if the binary string is not 4 bytes long

- for DOUBLE, if the binary string is not 8 bytes long

- for BIGINT/UNSIGNED BIGINT, if the binary string is longer than 8 bytes and a non-zero byte in the prefix would be truncated

- for INT/UNSIGNED INT, if the binary string is longer than 4 bytes and a non-zero byte in the prefix would be truncated

For example, the following generate errors:

CAST( 0x123456 AS REAL )

CAST( 0x1234567800 AS REAL )

CAST( 0x1234567800 AS INT )

but, the following do not generate errors:

CAST( 0x12345678 AS REAL )

CAST( 0x0012345678 AS INT )

CAST( 0x0000000000123456789abcdef0 as UNSIGNED BIGINT )

392484 If an application using either the ASA ODBC driver, or the iAnywhere JDBC driver, fetched a set of rows in which one of the rows encountered a data exception, then it was likely that the error would not have been reported. Note that Prefetch must have been on for the problem to occur. This problem has now been fixed, but in addition to this change, the changes to the server for Engineering Case 395662 are also required
392500 When the server was run on Unix systems, if the public.string_rtruncation option was on when a database started and select length( property( 'CompactPlatformVer' ) ) was more than 40 characters, user options may not have been set correctly, and other incorrect behaviour could have occurred. This has been corrected.

Windows platforms were not affected, since the length returned for 'CompactPlatformVer' is much less than 40 characters.

392502 If a Java application closed an SAConnection object, and then subsequently called the 'isClosed' method on the same object, an exception would have been thrown erroneously. This has been fixed.
392504 If the method PreparedStatement.executeStatement(), as well as several others, returned a non-zero SQLCode, an exception would have been thrown. This was incorrect behaviour as positive SQLCode values are warnings. The problem has been fixed to only throw exception when the SQLCode is less than zero.
392640 When using a keyset-driven cursor over a query containing an unflattened derived table that contains a subselect, the wrong answer could have been returned for the subselect.

For example, the following query could cause the above problem:

select *

from (

select t1.a , (select t2.a from t2 where t2.b =t1.a) as x

from t1

order by t1.a

) v2

This error has been fixed. As a consequence, the results for unflattened derived tables are now Insensitive in Keyset-driven cursors.

392668 If an application used the Remote Data Access feature to perform an INSERT from SELECT in 'no passthru' mode, and the insert received an error, it was possible for the server to have crashed. This problem has now been fixed.
393022 If an expression contained a reference to a proxy table, the server would have crashed if the expression was used:

- in a MESSAGE or PRINT statement

- in a RETURN statement of a function or procedure

- in a time/delay expression in a WAITFOR statement

- in an offset expression of a FETCH statement

This has been fixed so that the server now correctly returns the error "OMNI cannot handle expressions involving remote tables inside stored procedures"

393093 If executing an SQL Remote PASSTHROUGH statement caused a trigger to fire, the statement would not have been send to the remote server. The problem did not occur for PASSTHROUGH ONLY statements, since the statement did not execute locally, no triggers were fired. This has been fixed.
393270 If a server was running with a ServerName longer than 32 bytes, attempts to connect to it using SPX would have failed. This has now been fixed so that only the first 32 bytes are relevant for SPX.
393429 If a remote QAnywhere client and a QAnywhere Connector shared the same name, it was possible for both to receive the same message. While it is unlikely that such a situation would set up purposefully, now with this fix, a remote QAnywhere client and a QAnywhere Connector sharing the same name will nolonger receive the same message.
393434 On Windows platforms, when the Transaction Log, Log Translation or Backup utilities are executed on a database with auditing enabled, a file called "<db filename>.alg" is created or updated. A record is added containing the date and time of execution, the Windows user name, and the name of the utility executed. If this file already existed, but the new record could not be written because the disk was full, the utility would have ignored the error and continued. This has been fixed, now if the audit record cannot be created, the utility fails. A message is also displayed to indicate that the audit record could not be created.
393489 A message that should have expired would sometimes not expire on the client. If the message was part of a previous failure to transmit messages to the QAnywhere server (for example, network connectivity was lost) before the message was scheduled to expire, then the message would not have expired. Subsequently, when connectivity and message transmission with the QAnywhere server was resumed, the message that was scheduled to expire would have been transmitted to the server. Likely, the server would expire the message at this stage, however, it was possible that the message would be transmitted onwards to the target client before the server had a chance to expire it.

QAnywhere makes no guarantees that a message scheduled for expiration will not be delivered, however, QAnywhere makes a best attempt to expire messages as they are scheduled. In this case, QAnywhere missed an opportunity to expire messages. This has been fixed so now, if a message was part of a previous failure to transmit messages, that will not stop the subsequent expiring of the message.

393568 If the command line option -zl "remember last statement for each connection" was used, and the database option Log_deadlocks was 'on', the server could have crashed if a deadlock occurred. This has been fixed.
393574 If a 'root' web service was created with URL ON or URL ELEMENTS, the service would not have been selected to process a request when it should have been selected. This has been fixed. The way that the server now determines which service is to be used to process an HTTP[S] request is to do the following:

- if the request is for '/' then choose the 'root' service if it is defined

- first check for a service name for the entire URL

- interatively chop off one level from the URL at a time until a defined service is found with URL ON|ELEMENTS setting.

- if no service is found using the above, then select the 'root' service if it is defined with URL ON|ELEMENTS

For example:

If the request is for /a/b/c then the server will first look for a service named 'a/b/c', then 'a/b', and finally 'a'. With this fix, the engine will now also look for the 'root' service.

The latter three (a/b, a, and root) must all have been defined with URL ON or URL elements in order to be chosen in this situation.

Note that by defining a root service with URL ON|ELEMENTS, this service becomes a 'catch-all' service that will be used to process all requests (for the selected database) that do not match any other defined service.

393587 The ODBC driver was not returning some reserved words for SQLGetInfo( SQL_KEYWORDS ). The mssing reserved words were:

character

dec

options

proc

reference

subtrans

These words are synonyms for other reserved words, and have now been added to the list returned by SQLGetInfo( SQL_KEYWORDS ).

393604 If an application used ResultSet.relative(0) to attempt to refresh a row, then the iAnywhere JDBC Driver would usually have given an "Invalid cursor position" or a "Not on row" error. It should be noted that the "Invalid cursor position" error is valid since that error is usually given by the underlying ODBC driver when the Statement or PreparedStatement that generated the ResultSet is of type TYPE_FORWARD_ONLY. However, when the Statement or PreparedStatment is scrollable, then the iAnywhere JDBC Driver should refresh the row rather than give the "Not on row" error. This problem has been fixed.
393633 On Windows CE devices, the MobiLink ASA client, (as well as SQL Remote for ASA) may not have renamed the output file specified by the -o <filename> option, even when the size of the output file exceeded the size specified by the -os <size> option. This would have occurred if the output file already existed before the application started. This has been corrected.
393745 When running the reload.sql generated by the Unload utility, executing LOAD STATISTICS statements may have failed. This would have occurred if the column was of type binary or long binary, and the source database and the target database had different collations

(e.g. one had a single byte collation and the other one a multi-byte collation).

This has been fixed so that now the statistics of binary columns are only loaded if both databases have the same collation.

393746 If a space did not follow the method name in the EXTERNAL NAME clause of the wrapper function to a Java method, calls to the function would have resulted in a procedure not found error.

For example:

a wrapper function definition of

CREATE FUNCTION MyMeth (IN arg1 INT, IN arg2 varchar(255),IN arg3 INT )

RETURNS Int

EXTERNAL NAME 'TestClass.MyMethod(ILjava/lang/String;I)I'

LANGUAGE JAVA;

would have resulted in the error

Procedure 'TestClass.MyMethod(ILjava/lang/stringI)I' not found.

where as

EXTERNAL NAME 'TestClass.MyMethod (ILjava/lang/String;I)I'

would have worked. This has been fixed so that a space is no longer required between the method name and the left parenthesis.

393776 The reload of a database using the reload.sql generated by the Unload utility would have failed when executing a LOAD STATISTICS statement. This would have occurred if the column specifed was of type char, varchar or binary, and its columns size had changed from less then 8 byte to a size of 8 bytes or more, and it had column statistics generated before altering the column,s size. This has been fixed. The server now drops columns statistics if the column size changes.
393809 In a QAnywhere .NET application running on Windows CE, if a message listener threw an exception, or a QAException was thrown by the QAnywhere library, asynchronous message receiving would have stopped. This has been fixed. Now a message box with the exception details is displayed and asynchronous message receiving continues after clicking OK. To avoid the message box, the application's message listener should handle any exceptions that occur and return normally to the QAnywhere library.
393813 A number of problems with the QAnywhere GUI admin tool have been fixed.

-Delete rules specified and "Save"'ed using the "Server Delete Rules" tab now persist over a restart of the QAnywhere server.

-When creating a message using the "New Message" dialog, when specifying a custom boolean typed property on the "Properties" tab, only the value "0" could be entered to represent the false value. This was confusing, as the value was displayed as "false". Now the value "0" or "false" can be entered to represent the false value.

-When creating a message using the "New Message" dialog the "Content" tab now allows the compression level that should be applied to the content to be specified.

-When viewing a message in the right-hand panel using the "Content" tab, if the message was compressed, then the content would have been displayed rendering the compressed data as characters. Content is now displayed correctly even if the data is compressed.

-If a QAnywhere connector took more than 30 seconds when started using the "Start" menu item, the connector state would not have been updated on the right-hand summary panel. The latency has been changed to 60 seconds, and a new "Refresh" menu item has been added to allow refreshing of the current connector state at any time.

-Messages created and sent using the "Send message..." menu item would not trigger synchronization. Hence messages sent in this way would only be transmitted to the server when another synchronization trigger occurred. Now, sending such a message will act as a synchronization trigger. In fact, an additional menu item "Trigger message transmission" has been added to trigger message synchronization.

-The clients listed in the Clients tree view was only including clients that had sync'ed sometime in the past. If the client had messages destined for it, but had never sync'ed, it was not showing up in the tree view. The tree view has been fixed to include clients that have messages destined for it but have never sync'ed.

-The right-hand summary panel for a client displayed the client name on the far right. This formatting problem has been fixed.

393817 If a QAnywhere application had received a message with a QATransactionalManager, but had not committed or rolled back the transaction, and it then used another QAManager to send a response to the message it had received, it was very likely that the call to PutMessage would have blocked in a database deadlock situation. This has been fixed so the PutMessage will now queue the message without blocking.
393923 If a procedure or function called a Java method, and the Java code used the current connection to run a SQL statement that called a procedure or function that also called a java method, the server would have crashed if the two procedures or functions had a return statement.
393935 Attempting to register a schedule that contained the BETWEEN or ON { days of the week } clauses would have failed, resulting in an "unexpected token" exception to be thrown.

Also, attempting to register a schedule containing a time between 12:00:00 and 12:59:59, would have resulted in the 12 being interpreted as 00. For example, START TIME '12:30:00' would have been interpreted as START TIME '00:30:00'.

Both of these problems have now been corrected.

393970 Reloading state tracking information into an ASA database for MobiLink synchronization, would have cause subsequent restartable downloads, or file-based downloads, to fail. Five new columns were added to sys.syssync in version 9.0.0, but only 2 columns were being unloaded. This has been fix to now unload the missed columns.
394136 If a table had been created with the PCTFREE clause (table page percent free), the unload or reload of that table would not have used this PCTFREE in the CREATE TABLE statement for the new database. This has been fixed.
394220 A message transmission rule with an equality expression that had the right-hand operand missing (eg. a= ) would have caused the QAnywhere Agent to crash when parsing the transmission rule file. This has been fixed so that a syntax error is now flagged.
394297 Attempting to execute a statement like INSERT INTO v SELECT ..., where v is a view on a proxy table, would have caused the server to crash. The problem has now been fixed.
394331 When scanning the transaction log to determine which changes need to be uploaded, if dbmlsync first found a DML statement on a table (for example, an insert), and then later found a DDL statement on the same table (for example, an ALTER TABLE), dbmlsync should have failed and reported an error similar to "Table 't1' has been altered outside of synchronization at log offset X". If the table in question (or it's owner) had a name that required double quotes around it in the log file (such as reserved words or numeric names such as "42"), then dbmlsync would not have detected that the schema of the table had changed and would not have reported the error. Also, if the ALTER TABLE statement that was executed included a comment either before the ALTER TABLE statement or between "ALTER TABLE" and the table name, dbmlsync would also have failed to detect that the schema of the table had changed and would not have reported the error. Dbmlsync will now report the error "Table 't1' has been altered outside of synchronization at log offset X" when either of these situations arise.
394558 A window function can not be referred to, either directly or indirectly, in the WHERE clause of the block where the window is computed. However, if a window function was used in a complex expression in the WHERE clause, the server would have crashed rather than give error -964 as required. This has been fixed.
394668 The ON EXISTING UPDATE clause of the INSERT statement can be used to update rows that already exist in the database. By default, columns with default values in existing rows should be left unmodified unless their values are explicitly changed by the INSERT statement. Under some circumstances, the server could have modified these columns incorrectly. This problem has been resolved.

As a simplified example consider the following:

drop table a;

CREATE TABLE a (

a1 INTEGER NOT NULL,

a2 INTEGER NOT NULL,

a3 INTEGER NOT NULL DEFAULT AUTOINCREMENT,

a4 INTEGER NOT NULL,

PRIMARY KEY ( a1, a2 ) );

INSERT INTO a VALUES( 1, 1, 1, 1);

INSERT INTO a VALUES( 2, 1, 2, 2);

commit;

INSERT a ON EXISTING UPDATE WITH AUTO NAME

SELECT 1 AS a1, 99 AS a2, 11 AS a4

union all

SELECT 2 AS a1, 1 AS a2, 88 AS a4;

The INSERT statement should

1. Insert a new rows into table a with PKEY <1,99>, and

2. Update the value of a.a4 to 88 in the row with PKEY <2,1>. The default column a.a3 in this row should now remain unchanged.

394716 A message synchronization may not have completed, and appeared to be hung. Disconnecting the client and re-attempting the synchronization would have had no effect, as the server continued to try to complete the previous synchronization and disallowed any new synchronizations from the client. Only re-starting the QAnywhere server would have allowed subsequent synchronizations from the client. This generally happened only when the server was under load. The problem has been fixed.
394722 If an application retrieved the ResultSetMetaData and then queried the datatype of an unsigned smallint, unsigned int or unsigned bigint column, the datatype returned would have been incorrect. This problem has now been fixed so that an application can properly determine the unsigned column type using the ResultSet.getColumnType() and ResultSet.isSigned() methods.
394832 A QAnywhere client would not have been able to transmit messages to the server if all the following apply

- The last time the client transmitted messages with the server it used the "scheduled" policy (using the qaagent command line argument -policy scheduled)

- The client message store had subsequently been deleted and re-created and then the client agent was started with the automatic policy (using the qaagent command argument -policy automatic).

This has been fixed. To work-around the problem, start the client agent with the "scheduled" policy. After a successful message transmission, the client can then be re-started with whatever policy is desired. The key is that after a client message store has been deleted and re-created, the first time the client agent should be started with the last policy it previously synchronized under.

394857 Not all OLE DB schema rowsets are supported, however the most common and useful rowsets are supported. 燭wo OLE DB schema rowsets that were not supported have now been implemented.

CATALOGS: The CATALOGS rowset identifies the physical attributes associated with catalogs accessible from the DBMS. SQL Anywhere does not support the notion of catalogs as some other database systems do. With that in mind, the SQL Anywhere OLE DB provider will return a result set for CATALOGS containing all currently started databases. The following is an example.

CATALOG_NAME DESCRIPTION

AnotherSample c:\SQLAnywhere10\Samples\sample.db

demo c:\SQLAnywhere10\Samples\demo.db

The CATALOG_NAME column contains the database name. 燭he DESCRIPTION column contains the physical location of the database on the database server computer.

SCHEMATA: The SCHEMATA rowset identifies the schemas that are owned by a given user. 燭he following is an example of a SCHEMATA rowset 爎eturned by the SQL Anywhere OLE DB provider.

CATALOG_NAME SCHEMA_NAME SCHEMA_OWNER DEFAULT_CHARACTER_SET_CATALOG DEFAULT_CHARACTER_SET_SCHEMA DEFAULT_CHARACTER_SET_NAME

demo dbo dbo demo SYS windows-1252

demo GROUPO GROUPO demo SYS windows-1252

demo ml_server ml_server demo SYS windows-1252

demo rs_systabgroup rs_systabgroup demo SYS windows-1252

demo SYS SYS demo SYS windows-1252

The CATALOG_NAME column contains the name of the database to which you are currently connected. The SCHEMA_NAME and SCHEMA_OWNER columns contain identical values 爁or SQL Anywhere databases. The DEFAULT_CHARACTER_SET_CATALOG column always contains the name of the database to which you are currently connected since character sets are associated with databases. The DEFAULT_CHARACTER_SET_SCHEMA column is arbitrarily set to SYS since the character set in use for the database is not owned by anyone. The DEFAULT_CHARACTER_SET_NAME column contains the value of the "CharSet" database property

Note, to get this new functionality in existing databases, do the following:

9.0.2 - upgrade the databases by loading and running Scripts\oleschem.sql using Interactive SQL.

10.0.1 - run dbupgrad on each database, or connect to each database and run ALTER DATABASE UPGRADE. As an alternative, the databases can be upgraded by running Scripts\oleschem.sql using Interactive SQL.

11.0.0 - run dbupgrad on each database, or connect to each database and run ALTER DATABASE UPGRADE.

394896 If the QAnywhere Agent was started with a window class name (using the -wc option), that was the same as the message store ID (the -id option), it would not have shutdown properly with either the Shutdown button on the UI, or with qastop. This has been fixed.
395054 If the database option Wait_for_commit was set to ON while executing a LOAD TABLE statement, and it failed with a referential integrity error, then the database could have been left in an inconsistent or corrupt state. This has been fixed.

Some of the errors that might be characteristic of this problem are:

- Assertion 200602 - Incorrect page count after deleting pages from table 'table_name' in database 'database_name' - could occur during TRUNCATE TABLE or DROP TABLE.

- Database validation could report that an index has inaccurate leaf page count statistics.

- Database validation could report that a foreign key is invalid and that some primary key values are missing.

- Database validation could report that the rowcount in SYSTABLE is incorrect.

- Inconsistent row counts might be observed when querying the table sequentially versus via an index.

395055 The server could have deadlocked when sending or receiving large strings or data on a heavily loaded system. 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 option ). This has been fixed by terminating the connection, which had been blocked sending or receiving for several seconds, and the maximum number of active requests (-gn) were all blocked. Now in this case the following message is displayed: "All threads were blocked when waiting to send or receive. A connection has been terminated. Increasing -gn may prevent this in the future."
395071 After installing the 8.0.3 build 5260 EBF for CE, it did not deploy to the device at the end of the install, even if that option is selected. This has been corrected.

A workaround is to select:

"Deploy SQL Anywhere for Windows CE" from the Start Menu under: SQL Anywhere 8

395207 The ALTER TABLE statement can be used to change the nullability of a column. If an attempt was made to change a column from "nulls not allowed" to "null allowed" in conjunction with specifying the datatype of the column, as in the following example:

ALTER TABLE t ALTER c1 int NULL

The server would have ignored the NULL, and left the column as "null not allowed". This has been corrected so that the server will now change the column specification to "null allowed" in this case. A work around is to not combine NULL with the datatype for the column as in:

ALTER TABLE t ALTER c1 NULL

395238 The changes for Engineering case 384294 had the side-effect of preventing the "Continue" action from working properly after Interactive SQL failed to execute a statement. This has now been corrected.
395299 When using UltraLite Dynamic SQL it was possible to create incorrect foreign keys when there were more than two unnamed foreign keys in a table. This has been fixed.
395313 When using UltraLite Dynamic SQL the result of the UPPER() function was erroneously being treated as 256 characters long. This has been corrected.
395662 An Embedded SQL or ODBC application, which used wide fetches or ODBC multi-row rowset fetches on a cursor which had prefetched enabled, could have returned a row with invalid data or data from a previous row when an error should have been returned instead. An example of a row error which could have caused this type of behaviour is the "Subquery cannot return more than one row" error. Also, for Embedded SQL applications, SQLCOUNT was not being set correctly to the number of rows fetched on an error. These problems have been fixed so that the error is correctly returned, and SQLCOUNT is set correctly on errors.
395667 When attempting to export multiple result sets at the same time, Interactive SQL could have failed with and internal error, or the resulting files could have been empty. This has now been fixed.

This problem did not occur if the "Show multiple result sets" open was turned OFF (which is the default), nor did the problem occur if there was only one result set to export.

A crash was observed if the result sets were exported using the FIXED file format. Using other file formats typically resulted in the first result set being exported correctly, while the files for the subsequent result sets would be empty.

395908 If an Open Client or jConnect application described a column that was of type Varchar(n) or Varbinary(n), the size reported for the column would have been 32768 instead of n, if n was greater than 255. This problem has now been fixed.
396058 Inserting a string longer than 64K bytes into a column of a proxy table, would have caused the local server to crash. This has been fixed.
396173 If the QAnywhere Agent was started with a failover server defined (ie. there was more than 1 "-x" option on the command line), and the device lost network connectivity to all servers, and then the device recovered network connectivity to at least one of the servers, queued messages would not have been transferred to a sever. This has been fixed so that now, when network connectivity is recovered, queued messages will be transferred to the primary server (if it is reachable) or an alternate server, as appropriate.
396236 After shutting down Sybase Central or Interactive SQL, directories could have been locked, making it impossible to delete or rename them. This problem only occurred on Windows platforms, when the "Fast launcher" option was enabled, and the file browser dialog was used to open or save a file. The native Windows file dialog changes the current directory. A changes has been added to restore the directory after the dialog is closed.
396463 DBASE3 or FOXPRO files, created by saving a result set, could have appeared empty when loaded by FoxPro. The problem was only seen when reading the file with FoxPro, but not with Excel, and only when all of the following were true:

- The result set contained fewer rows than the configured maximum number of rows to fetch

- All column data was shorter than the configured truncation length.

- The "Show multiple result sets" option was OFF.

This has been fixed, which also solves the following related problems:

- Under the conditions listed above, DATE columns were written in character fields in the .DBF file rather than using dBase/FoxPro "Date" fields.

- Warning messages about long column names being truncated would be displayed twice. Now they are displayed only once.

396464 After having established an HTTPS connection, the server may have lost data when receiving a large request. Data loss may have been experienced intermittently when requests were in the range of 10K bytes or greater. Data loss may have occurred either receiving POST or GET requests. This has been fixed.
396571 Calling the OPENXML() function with an xpath expression that was NULL, would have caused the server to crash. This has been fixed. Note, this did not happen to xpath expressions in the WITH clause.
396584 If a query referenced a proxy table and contained an ORDER BY clause, and an ON condition in the FROM clause, it may have returned incorrect results or an error. This has been fixed.
396681 When the Unload utility was run with the -ar command line option ("rebuild and replace database"), it was possible that the transitional log file (or mirror log file) that was used during the rebuild process would not have been deleted. For example, if the transaction log name was asademo.log, then an extra file called asademo.logR would have remained after the rebuild process. The rebuild would have been successful, but subsequent attempts to run dbunload -ar on the same database would have failed, if the file asademo.logR was not removed. This has now been fixed.
396813 Changes for Engineering Case 395908 introduced a bug such that long binary and long varchar columns were truncated for Open Client and jConnect applications. This problem has been fixed.
396861 When a warning occurs during Palm HotSync synchronizations, HotSync raises a dialog indicating a problem in the log. The log would have stated 'FAIL', along with the positive SQLCODE value and message. Now, the log will state 'WARNING' for positive SQLCODE values, and will not cause HotSync to raise a dialog.
396873 Changes for Engineering Case 392484 ensured that data exceptions that occurred during a wide fetch were not lost, but the changes introducing an error such that warnings were lost instead. This has been corrected so that both data exceptions and warnings are properly reported to the client.
396917 UltraLite Dynamic SQL could have produced erroneous metadata for columns in derived tables. The algorithm for matching user-supplied names with metadata was flawed for some cases in derived tables. This has been corrected.
397046 The changes for Engineering Case 394722, to have the iAnywhere JDBC driver correctly handle unsigned values without promoting them to the next largest datatype, also required that code in the Index Consultant that was expecting 'Long' objects, be modified to accept the more general 'Number' objects.
397047 Windows uses a two-character combination to indicate an end-of-line (\r\n). In the request level log, these characters are replaced with spaces, so that multi-line statements only take a single line of the file. Newlines at the end of each line are preserved. As of build 3111, the extra newline character used on Windows platforms was no longer preserved. This resulted in an extra space appearing at the end of every line in most Windows editors. Very basic text editors (such as Notepad) would have failed to detect the end-of-line and would display the entire log as a single line. This has been fixed.

Note, his did not affect the processing of the Request-level log by the builtin procedures (ie. sa_get_request_times, sa_get_request_profile, etc.).

397058 If a DELETE statement involved a join, the server would have placed long-term read locks on the unmodified tables, even if the DELETE statement was executing as isolation level 0. This has been corrected, the server now locks rows of the unmodified table according to the isolation level of the connection.

As an example, consider a local temporary table DELTEST that contains a single column, X. The statement

DELETE

FROM DELTEST

FROM DELTEST JOIN PRODUCT ON (DELTEST.X = PRODUCT.ID)

would cause the server to place long-term read locks on the product rows that successfully joined with the DELTEST table.

Note that this unnecessary locking occurs only with DELETE statements. INSERT and UPDATE statements are unaffected by this error.

397134 A query that referenced proxy tables and contained a row limitation in the SELECT clause (ie. FIRST n or TOP n) may have incorrectly returned the warning "The result returned is n

non-deterministic.", even if the query had an ORDER BY clause. This has been fixed.

Note, this will not have happened if the complete query was forwarded to the remote

server, (ie. Full Pass-thru mode).

397223 Java UltraLite could have generated code which had compilation errors when queries with an EXISTS was used. This was corrected.
397352 Executing a COMMENT TO PRESERVE FORMAT statement may have caused a server hang. With a database page size is 2 KB this would have occurred if the COMMENT statement was exactly 1960 characters in length. This problem would have occurred for other pages sizes as well, if the exact length of the COMMENT statement matched corresponding values. This problem has been fixed.
397387 All ANY and ALL predicates are now rewritten to an EXISTS predicate, if it is semantically correct to preform such a rewrite optimization. With this rewrite optimization, a performance benefit may be observed for some queries.
397635 The server could have crashed while executing a stored procedure, if it was executed often enough to enable caching. This has been fixed.
397668 Scheduling transmission rules that contained ON { days of the week } or ON { days of the month } clauses, but did not contain an EVERY {period} clause, would have resulted in an "illegal argument" exception, causing the QAnywhere server to fail. In scheduling these rules, the fact that the EVERY clause was omitted was ignored and the rule was treated as though it had been included. A check has now been added for these rules and they are now handled correctly.

Also, when calculating the next execution time for rules with the ON { days of the week } clause, the scheduler mistakenly set the next day of execution to the 7th of the month, rather than 7 days in the future. This has been fixed as well.

397772 If a LOAD TABLE command failed, for example with a primary key violation, then it was possible that the server would leak table pages and index pages in the database. These leaked pages would not have belonged to any database object and would also not have been marked as free. As a result, the database file could have been larger than necessary. The only way to recover the lost space is to rebuild the database.
397776 When using the FILE based messaging system for SQL Remote, there is a maximum of 47,988 possible file names that SQL Remote will use to generate messages. If all of these file names were already in use, then SQL Remote would have looped forever trying to find a file name to generate a message. SQL Remote will now detect that it has tried every single file name and break out of the loop, reporting that "The maximum number of messages in the messaging system has been reached". Note that although SQL Remote will now no longer loop infinitely in this situation, to allow for the creation of new messages for this remote user, all the files in the user's inbox may need to be manually deleted, and possibly, the maximum message size increased using the -l switch on the SQL Remote command line.
397798 If a Visual Basic application attempted to open a record set using a STATIC cursor with a PESSIMISTIC locking mechanism, the OLEDB provider would have selected a DYNAMIC cursor instead. This was done by the provider to ensure that updating of the records was possible, usually by locking records at the data source immediately before editing. Of course, this also meant that the records were unavailable to other users once editing had begun, until the lock was released by calling Update. This type of lock is used in a system where you can't afford to have concurrent changes to data, such as in a reservation system. If the application then tried to obtain the current bookmark value, an error would have occurred. This made it appear that STATIC cursors didn't support bookmarks, whereas the real problem was that DYNAMIC cursors do not support bookmarks. If the application specifies a STATIC cursor with a READ-ONLY locking mechanism, then a STATIC cursor will be used and bookmarks are supported. The OLEDB provider has been changed so that a KEYSET cursor will be selected instead of a DYNAMIC cursor when PESSIMISTIC locking is requested. This will allow the use of bookmarks.
397914 Error message for SQLSTATE 23506, SQL error code -209 (INVALID_COLUMN_VALUE) contained a spelling error in Lithuanian. "eleistina" should be "neleistina". This has been corrected.
398062 If an application used the PreparedStatement.addBatch() method to perform a wide insert, and set some of the columns in the insert to NULL, the addBatch() may have failed with a "Not Yet Implemented" error. The new addBatch code was not properly checking the NULL indicator prior to attempting to setup the next row in the batch. This has now been fixed.
398122 While initializing the in-memory free list on start up, the server could have run out of memory if the database was corrupt. The server will now generate assertion 202100 - "Invalid bitmap page at page (page number)" when encountering such corruption.
398132 If a backup of the database was being performed and the transaction log was either being renamed or truncated, if the database engine was unable to open a new transaction log (or mirror log), an error would have been returned to the backup process, but the server could have continued to apply operations without logging them to the transaction log. The server will now faile an assertion when it cannot open a new transaction log or mirror after the truncation or rename, as this should be a fatal error.
398293 When run on Unix, NetWare, or Windows CE systems, connection attempts could have caused the server to crash if request-level logging was on. This has been fixed.
398294 Any user connected to the server was able to execute the REMOTE RESET statement. This has been fixed, the user must now have DBA authority.
398456 If a delete rule was specified in the '[system:delete]' section of a transmission rule file, it was ignored by the QAnywhere server. This has been fixed so that now such a delete rule replaces the default delete rule used by the server.
398459 The implementation of schedules for transmission rules on the server was incorrect. Schedules with a 'start time' did not fire the rule evaluation at the given start time. As well, schedules with serveral days of the week or several days of the month scheduled at once (eg. every 10 seconds on ('Monday','Tuesday')) did not work correctly. These problems have been corrected.
398604 It was possible for the server to loop infinitely while going through automatic database recovery if the database file was corrupted. This could have occurred when deleting an entry from a corrupted index. "Assertion 200901: Corrupted page link found on page (0x%x) while deleting from index %s" will now be generated for this situation.
398631 Queries with an ORDER BY clause and OUTER JOINs may have returned rows in an incorrect order. This has been fixed.

The following conditions must have been met:

(1) there was at least one equality predicate between two expressions used in the ORDER BY clause

(2) the equality predicate appears in an ON condition of an outer join

(3) the expressions were both from the preserved side of the outer join

Example:

select T.* from

T left outer join R on T.e1 = T.e2 and T.e2 = T.e3 and R.e1 = 10

where T.e1 = T.e2

order by T.e1, T.e3, T.e2

398635 If a query referencing proxy tables that contained an ORDER BY clause within the LIST() function was executed in Full Passthru mode, it would have failed with the error "Feature 'olap extension' not implemented." This problem has now been corrected.
398799 The UltraLite utility would not have run when the system did not have VFS Manager services e.g. devices running Palm OS 3.5. This is now fixed. The presence and proper version of the VFS Manager is now checked when the utility starts.
398964 On Linux Itanium, client applications could not connect to a server if the server was restarted after a crash. This has been fixed. The work-around is to shutdown the server and restart it again.
398980 Prior to this change, there was no method of stripping leading or trailing blanks from data loaded via the LOAD TABLE statement when the QUOTES OFF clause was used. The syntax of the STRIP clause now allows for the additional options of RTRIM and LTRIM, to allow for more fine tuned control over the trimming of white space. For backwards compatibility, ON is treated as RTRIM.
399068 When Sybase Central - Tools - Connection Profiles... - New was used to successfully create a new profile, and the user returned to the the Connection Profiles dialog box, the list should have been scrolled to the new entry, and the new entry should have been automatically selected. This is now fixed.
399155 The server would have crashed under the following conditions:

- A BEGIN END block contained a nested BEGIN END block

- Inside the nesting block a local temporary table was declared (e.g. using execute immediate)

- The outer block declared a cursor on the temporary table and was opened inside the nested block but not closed in the nested block

- The cursor used an index on the temporary table

This has been fixed.

399488 Multiple errors were defined with SQLSTATE 28000. As a result, an incorrect error message could have been returned. This has been corrected with the following changes:

SQLSTATE_PARM_TOO_LONG changed from 28000 to 53W06

SQLSTATE_PASSWORD_TOO_SHORT changed from 28000 to 54W07

SQLSTATE_PASSWORD_TOO_LONG changed from 28000 to 54W08

SQLSTATE_INVALID_LOGON and SQLSTATE_INVALID_PASSWORD continue to return 28000

399512 The SQL Remote Message Agent could have failed with the error "No log operation at offset x in the current transaction log" if the database made use of checksums. This has now been fixed.
399751 The character set names 'windows-936', 'gbk', 'cp936', and 'ms936' (all of which refer to the same character set, gb18030), were ignored when requested by an HTTP application. The mapping from character set name to Unicode ID has been corrected.
399773 When using ASA's PHP driver, the sqlanywhere_set_option() function was not recognizing "on" or "off" as valid values for the auto_commit option. This has been fixed.

The function works fine if "true" or "false" was specified.

399872 When using FoxPro to display a result set, the first record was missing. The following code sample illustrates the problem.

conn = CREATEOBJECT( 'ADODB.Connection' )

conn.ConnectionString = [Provider=ASAProv.90;uid=dba;pwd=sql;]

conn.Open

rs = CREATEOBJECT( 'ADODB.RecordSet' )

rs.ActiveConnection = conn

curs = CREATEOBJECT( 'CursorAdapter' )

curs.datasourcetype = 'ADO'

curs.datasource = rs

curs.SelectCmd = 'SELECT * FROM SYS.SYSTABLE WHERE table_id = 2'

curs.alias = 'ADO Test'

curs.cursorfill

BROWSE

FoxPro obtained the first row in the result set and then issued a RestartPosition() call to reposition to the first row in the result set. The cursor type for the query in the above example was FORWARD ONLY. With this type of cursor, the RestartPosition() procedure failed to reposition to the start of the result set. This problem has been fixed. RestartPosition() will now re-execute the query to position to the start of the result set when the cursor type is FORWARD ONLY.

400047 When selecting Oracle timestamp values from a table using bound parameters, the decimal digits from a previous bind and execute are returned instead of the correct digits for the current bind and execute. The iAnywhere Solutions Oracle WP driver has been updated to version 4.20.0114
400050 When using the iAnywhere Solutions driver for ASE ODBC driver and executing a procedure using the native ASE syntax:

begin exec my_proc ? out end

would have returned the correct results for the first time it was called, but second and subsequent calls would have return incorrect results. Updating the driver to version 4.20.0106 resolves the problem.

A workaround is to execute the procedure using standard syntax:

{ CALL my_proc(?) }

400056 In rare circumstances, strongly encrypted connections to the database server may have failed unexpectedly. Specifically, HTTPS connections may have returned status 501 (Method not implemented), and ecc/rsa connections may have returned handshake errors. This has been fixed.
400091 When a multi-byte character string was truncated in the middle of a character by being but into a column that was not wide enough to for the whole string, subseqent selects would have return a NULL at the end of the data. This could have caused MobiLink synchronizations to fail, as the NULL was misinterpreted. This has been fixed by truncating the string at the last full character.
400165 Parameters for user-defined functions must be declared as IN. If a parameter was declared as OUT or INOUT, the server would not have given an error until the function was called. Now a syntax error will be given when the function is created.
400186 Insertion of multibyte strings (Chinese, Japanese, Korean, etc.) into a database using the UTF8 collation would have failed. The following C# code illustrates the problem.

System.Data.OleDb.OleDbDataAdapter Ada=new System.Data.OleDb.OleDbDataAdapter ("select * from test",conn);

System.Data.OleDb.OleDbCommandBuilder CommandBuilder=new System.Data.OleDb.OleDbCommandBuilder (Ada);

System.Data.DataTable dt=new DataTable ();

Ada.FillSchema (dt,System.Data.SchemaType .Mapped );

System.Data.DataRow dr=dt.NewRow ();

dr["Col01"]=textBox1.Text ;

dt.Rows.Add (dr);

Ada.Update (dt);

If the text entered into "textBox1" was a multibyte character, it would not have been inserted correctly into column "Col01" of the "test" table when the database was using the UTF8 collation. This problem has now been fixed.

400188 If a MobiLink client connected to a database where SQL Remote was already running, it was possible for the MobiLink client to report "Cannot convert scanner to a unsigned int". When this error was reported, the current synchronization would fail. This has been fixed so that the error is no longer reported.
400331 The use of the ON EXISTING clause of the INSERT statement requires that the referenced table have a primary key. The server would have generated a "syntax error" in the event the table had no primary key defined. This has now been changed so that the server will generate a "table has no primary key" (sqlcode: SQLE_NO_PRIMARY_KEY) error instead.
400332 Changes for Engineering Case 394722 to the iAnywhere JDBC Driver prevented Interactive SQL from displaying, importing, or exporting unsigned numeric types correctly. For example, when displaying unsigned values, an error dialog could have been displayed saying that the value would not fit in an "n" byte value, where "n" was a small whole number. This has now been fixed.
400466 If an ODBC application described a signed bigint column, the precision would have been returned as 20 when it should really have been 19. This problem has been fixed.

Note that the precision of unsigned bigint columns is still returned as 20, which is the correct value.

400467 Additional changes have been made to ensure that proper metadata is provided for newer versions of jConnect. If a new version of jConnect is to be used, then it is recommended that the new version of JCATALOG.SQL is run against the database.
400562 To set the same server-side transmission rule for many users, either each user had to be added to the transmission rules file with the same rule, or the same rule had to be added for each user using QAnywhere Central. This was time-consuming and did not handle well situations where users were added dynamically (MobiLink command line parameter -zu+).

With these changes, a default transmission rule can be set such that every user that does not have an explicit transmission rule will use the default rule as its transmission rule. There are two ways to set the default transmission rule:

If you are using a transmission rule INI file, then create a section called ianywhere.server.defaultRules and set the transmission rule. For example, if the default transmission rule is to send only high-priority messages, then the following should be added to the transmission rules file:

[ianywhere.server.defaultRules]

auto = ias_Priority > 6

You must restart the server for this rule to take effect

To set the default transmission rule using QAnywhere Central, follow these steps:

Select Tools->Server store connect... and specify the necessary connection parameters to connect to the server

Select the Properties item in the left-hand panel

Right-click "Properties" in the left-hand panel and select "Create property"

In the "New Property" dialog enter ianywhere.server.defaultRules for the Client field, ianywhere.qa.server.rules for the Property field and the rule (example "auto=ias_Priority > 6") for the Value field.

You must restart the server for this rule to take effect

To set the default transmission rule using a Server message

C# Example:

QAManager mgr = �; // Initialize the QAManager

QAMessage msg = mgr.CreateTextMessage();

msg.SetStringProperty( 搃as_ServerPassword�, 換Anywhere� );

// Indenting and newlines are just for readability

msg.Text = �<?xml version="1.0" encoding="UTF-8"?>\n�

+ �<actions>\n�

+ � <SetProperty>\n�

+ � <prop>\n�

+ � <client>ianywhere.server.defaultRules</client>\n�

+ � <name>ianywhere.qa.server.rules</name>\n�

+ � <value>auto = ias_Priority > 6</value>\n�

+ � </prop>\n�

+ � </SetProperty>\n�

+ � <RestartRules>\n�

+ � <client>ianywhere.server.defaultRules</client>\n�

+ � </RestartRules>\n�

+ �</actions>\n�;

mgr.PutMessage( 搃anywhere.server\system�, msg );

Note that this mechanism has the advantage that you do not have to restart the server.

400563 It was not possible to call a stored procedure via ADO.Net and have it to use the default values for the stored procedure parameters, unless the parameters were at the end of the list. This has been resolved by adding a new class ASADefault/SADefault to the .NET provider. If the value of a parameter is set to AsaDefault/SADefault.Value, the server will use the default value to execute the procedure.

For example:

create procedure DBA.myproc( in arg1 int default 1, in arg2 int default 2, in arg3 int default 3)

begin

select arg1 + arg2 + arg3 from dummy;

end

To use the default values, set the parameters' value to SADefault.Value:

SAConnection conn = new SAConnection( "DSN=SQL Anywhere 10 Demo" );

conn.Open();

SACommand cmd = new SACommand( "DBA.myproc", conn );

cmd.CommandType = CommandType.StoredProcedure;

cmd.Parameters.Add( new SAParameter( "arg1", SADefault.Value ) );

cmd.Parameters.Add( new SAParameter( "arg2", SADefault.Value ) );

cmd.Parameters.Add( new SAParameter( "arg3", SADefault.Value ) );

int val = ( int ) cmd.ExecuteScalar();

400572 If the QAnywhere server's consolidated database was Oracle, Microsoft SQL Server or ASE, there would have been problems adding members to QAnywhere message groups. The QAnywhere server would have failed the next time it was started. A QAnywhere message group is a special QAnywhere client to which other QAnywhere client's can become members. A message sent to the group will then be forwarded to all the members in the group. This has now been fixed.
400583 An empty value in the QAnywhere server's INI file for the transmission rule file property ianywhere.qa.server.transmissionRulesFile, would have resulted in the server failing on start-up. This has been fixed so that an empty value is now treated as indicating the non-existence of ianywhere.qa.server.transmissionRulesFile.

A work-around is to delete the property from the INI file.

400586 If a function or procedure was called with an invalid parameter, the server will now return a new error:

"Function '%1' has invalid parameter '%2' ('%3')"

SQLCODE -1090

Constant SQLE_INVALID_PARAMETER_W_PARM

SQLSTATE 08W94

Sybase error code 13424

ODBC 2 State 08004

ODBC 3 State 08004

The text of the error will specifiy the function name %1, the parameter name or

number %2, and the invalid parameter value or mode %3. A parameter value of 'NULL' means that a NULL parameter has been specified; 'UNKNOWN' means that value is unknown for the evaluation routine.

400590 When an out-of-range hexadecimal value like 0xffffffff01000000 was passed to the hextoint() function, no error was returned. Instead an incorrect integer value was returned. This has been fixed so that out-of-range hexadecimal values now return an error.
400604 At the end of each synchronization dbmlsync reports a line like the following:

End synchronizing 'template_P1' for MobiLink user 'template_U1'

If more than one publication was specified on the MobiLink Client commandline (either together as -n P1,P2 or separately as -n P1 -n P2), then the publication reported in this message may have been incorrect, although processing of the synchronization would have continued correctly. Only the message was wrong. The message now reports the correct publication name or names.

400670 When trying to create functions or procedures using Transact-SQL, use of the "expr AS name" syntax in the arguments to the procedure or function call would have failed with an error. This has been fixed.

A workaround is to write the function or procedure in using Watcom-SQL

400769 The server would have reported the following error to the server log when attempting to register with LDAP if the LDAP server was an Active Directory server:

Attempting to register server with LDAP

LDAP Error Referral (v2) received from ldap_search_s (LDAP server error: Referral: <LDAP URL>

LDAP registration failed

This has been fixed with the addition of the following new asaldap.ini file parameters:

read_authdn - the read-only authentication domain name. The domain name must specify an existing user object in the LDAP directory that has read access to the basedn. is only required if the LDAP server requires a non-anonymous binding before searching can be done. For example, this field will normally be required if Active Directory is used as the LDAP server. If this field is missing, the bind will be anonymous.

read_password - the password for authdn. This is only required on the client if read_authdn is used.

Note that this fix required changes to both the server and the client libraries. Thus applications using ODBC, embedded SQL and JDBC with the iAnywhere JDBC driver are affected. If a server containing this fix registers with an Active Directory server, applications without this fix will not be able to find it.

400799 Results from the Inttohex() function for bigint and numeric types were formatted inconsistently.

The following are the results for bigint, integer and numeric values:

'00000001' '00000001' '00000001'

'ffffffffffffffff' 'ffffffff' 'ffffffffffffffff'

'00000002' '00000002' '00000002'

'fffffffffffffffe' 'fffffffe' 'fffffffffffffffe'

'7fffffff' '7fffffff' '7fffffff'

'ffffffff80000001' '80000001' 'ffffffff80000001'

'ffffffff80000000' '80000000' 'ffffffff80000000'

'80000000' '00008000' '80000000'

'7fffffffffffffff' '00007fff' '7fffffffffffffff'

'8000000000000001' 'ffff8000' '8000000000000001'

'8000000000000000' 'ffff7fff' '8000000000000000'

This problem has been fixed. The following shows typical results now returned for bigint, integer and numeric values:

'0000000000000001' '00000001' '0000000000000001'

'ffffffffffffffff' 'ffffffff' 'ffffffffffffffff'

'0000000000000002' '00000002' '0000000000000002'

'fffffffffffffffe' 'fffffffe' 'fffffffffffffffe'

As well, with 9.0.2, passing a negative value to inttohex() would have resulted result in a "value out of range" error. This to has been corrected

400908 Attempting to start a server with a non-existent configuration file, (i.e. dbeng9 @does_not_exist), would have caused the Usage dialog to be displayed without the name of the non-existent file. This has been changed so that the Usage dialog will now display the missing file name.
400911 A server experiencing a high rate of commits could have prevented checkpoints from occurring. This has been fixed to provide fair access for checkpoints in the presence of operations that suspend checkpoints, such as commits.
400924 Setting the system clock back to an earlier time (either manually or by a system daemon) on non Windows platforms (i.e. NetWare, Unix) could have caused any of the following symtoms:

- timestamps reported in the request level log could jump ahead approximately 25 days

- client applications could be incorrectly disconnected

This has been fixed.

401036 The system procedure sa_make_object() can now be called by any user having RESOURCE authority. It no longer requires DBA authority.
401161 UltraLite can now be run on Palm NVFS devices, and it supports both the record-based and file-based data stores.

The following 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 you can access and use similar to an SD slot. Therefore, call ULEnableFileDB to store UltraLite databases on either an internal drive (built-in storage card) or external slot (expansion card). Furthermore, use the existing connection parameter palm_db=CRID:n to specify the data store on either an internal drive or external slot. 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.

B. Synchronization Conduit

The conduit synchronizes the UltraLite database which is first found on the device. The database lookup sequence is first the record storage, then the file system including internal drive and external slot. Make the UltraLite database which you intend to synchronize available as the first one found in that sequence.

401216 When using Dynamic SQL, executing a CREATE TABLE statement that involved LONGVARCHAR or LONGBINARY columns could have caused a corrupt database. This was corrected.
401244 Calling SQLBindCol() would have returned the error HY090 "Invalid string or buffer length", when trying to bind a user supplied buffer pointer that was not aligned to the data type requested on x86 platforms. Starting with 9.0.2, a check was added to the ODBC driver to return this error if a buffer pointer that was not aligned to the data type was requested This check has been removed for x86 platforms as x86 allows unaligned memory accesses.
401337 The base64_encode() function was embedding a linefeed character into the result every 76 characters. This has been fixed.
401363 The QAnywhere JMS connector did not always ensure the preservation of the order of delivery of messages from a JMS sender to a QAnywhere client receiver when the QAnywhere server's consolidated database was non-ASA. This has been fixed so that the order of new JMS messages to QAnywhere client receivers will be preserved.
401391 When run on Linux systems, the Interactive SQL utility was not able to run a script file with if it did not have a ".sql" file extension. It would have displayed an error message saying that the file did not exist. This has now been fixed so that files can now be opened even if they do not have a ".sql" file extension.

Note: This bug only affected opening a file by clicking on the "File/Run Script" menu item. Behavior when running as a command line program was not affected.

401494 The ESCAPE CHARACTER clause of the OUTPUT statement was being ignored so that the escape character was always a backslash. This has been fixed.
401610 When a SOAP client toolkit requests a WSDL from the ASA server, the WSDL targetNamespace would always have specified 'localhost', rather than the machine name within the URL. This has been fixed so that the hostname is now derived from the HOST header of the HTTP request. The HOST header field is mandatory in HTTP 1.1.
401614 The database file could have become corrupted when performing an ALTER TABLE statement. The corruption may not have been immediately detected by database validation. This has been fixed. A database corrupted in this manner can perhaps be rebuilt by unloading the database with data 'ordered'.
401645 The server gathers and updates column statistics as part of the query execution process. In the case of NOT predicates, the server could have incorrectly changed the stored selectivity of these predicates to 100%. This problem has been resolved.
401757 The QAnywhere Agent stopped transmission of all messages when a GetMessage or PutMessage was called on a QATransactionalManager. Message transmission was being suspended until a Commit or Rollback was done on that QATransactionalManager. This has now been fixed so that the transmission of committed messages or messages sent by a (non-transactional) QAManager will proceed, independent of the status of uncommitted messages by any specific QATransactionalManager.
401758 Previously, all UltraLite database types, except Palm VFS files, could be created by the UltraLite command line tools (ulload and ulcreate). Now, a .udb file suitable for deployment to a Palm VFS card can be created by adding "palm_fs=vfs" to the connection string on the command line.

For example,(Note the -p switch is still required):

ulload -p CRID -c dbf=ul_udb_CRID.udb;palm_fs=vfs my_schema.xml

When deployed to the device, the database name must follow the pattern ul_udb_XXXX.udb where XXXX is the creator id of the application. Furthermore, the file must reside in the /PALM/UltraLite/ folder.

401809 If an application prepared an INSERT statement to be used within a batch and then switched datatypes when setting different row values of a particular column, the iAnywhere JDBC driver could have inserted incorrect values. The driver now throws a SQL exception when the datatype is switched.

An example of the incorrect JAVA code follows:

PreparedStatement stmt = con.prepareStatement( "INSERT INTO t VALUES(?, ?)" );

stmt.setInt(1, 100);

stmt.setString(2, "row 1");

stmt.addBatch();

BigDecimal bd = new BigDecimal(200);

stmt.setBigDecimal(1, bd); // notice the switch in datatype when setting the variable value

stmt.setString(2, "row 2");

stmt.addBatch();

stmt.execute();

The above code would have inserted incorrect data for the second row in the batch, but will now throw an execption when the application performs the stmt.setBigDecimal() call.

Note that switching datatypes is perfectly acceptible during different executions of a batch. So, the following code will not generate an exception and will insert correct data:

PreparedStatement stmt = con.prepareStatement( "INSERT INTO t VALUES(?, ?)" );

stmt.setInt(1, 100);

stmt.setString(2, "row 1");

stmt.addBatch();

stmt.setInt(2, 200);

stmt.setString(2, "row 2");

stmt.addBatch();

stmt.execute(); // notice the execution of the first batch

BigDecimal bd = new BigDecimal(300);

stmt.setBigDecimal(1, bd); // notice the switch in datatype when setting the variable value

stmt.setString(2, "row 3");

stmt.addBatch();

stmt.execute();

401863 The QAnywhere Agent default delete rule did not completely clean up messages from the message repository. This has been fixed.
401948 The corruption caused by the problem fixed in Engineering Case 383145 could have been undetectable by database validation. Engineering Case 386569 attempted to address this, but the change may have caused validation of non-corrupted indexes to fail. This has been fixed. Validation of a database affected by the corruption in Engineering Case 383145 is now detected properly and results in the error "Index 'index_name' on table 'table_name' has an invalid right spine". This type of corruption should be fixed by rebuilding the index.
401979 The Index Consultant could have finished its analysis, but not displayed the results, then failed with a dialog reporting a NullPointerException. This was only likely to happen on databases used with jConnect connections. This has been fixed.
401987 When adding a row to a table that contained a BIT column using the OLEDB provider, the BIT column value was always recorded as FALSE. This problem has been fixed.
401989 A Visual Basic application, using the OLEDB provider to add a new row to a table that contained an unitiialized (NULL) column value , would have crashed with a null pointer exception. This problem has been fixed.
401990 When adding a new row into a table using the OLEDB provider, if the value for a column was the empty string, Visual Basic would have reported reports a run-time error. The conversion functions assumed that a result length of 0 indicated an error, which is true if the input length is non-zero, but if the input length is 0 then a result length of 0 is expected. This problem has been fixed.
402038 Executing an INSERT statement that specified a very long list of columns (approx 1/4 of the database page size in bytes), could have caused a server crash. This problem has been resolved. A temporary (inefficient) work around would be to start the server with a larger cache page size.
402084 The QAnywhere Agent could have used incorrect server information when it was started on a fresh message store with option -x tcpip(host=serverA); or when it was shut down and restarted on the same message store with option -x tcpip(host=serverB). In the second case, the QAnywhere Agent would have incorrectly transmited messages to serverA. This has been fixed. Now when the QAnywhere Agent is restarted as in the second case, only serverB is used for message transmissions.
402147 The QAnywhere Agent would have crashed with a memory violation, if the option "-wc <window-class>" (specify a window class name for the console window) was specified on the command line. This has been fixed.
402170 Replaying a silent install on a machine running a firewall would have resulted in the failure of the silent install when it attempted to load the Sybase Central or Interactive SQL fast-launchers. This has been fixed by no longer attempting to load the fast-launchers during either the recording or the playback of a silent install.
402276 The iAnywhere OLEDB Provider was reporting inconsistent type information for NUMERIC/DECIMAL columns. In some cases it would have reported DBTYPE_DECIMAL for NUMERIC/DECIMAL columns, in other cases it reported DBTYPE_NUMERIC. It would also have inconsistently reported precision for NUMERIC/DECIMAL columns, changing it between compile time and runtime. These problems have now been fixed. The changes have been made to the provider, as well as the supporting stored procedures. To install new versions of the OLEDB provider schema rowsets into a database, scripts\oleschem.sql must be rerun against the database.
402278 The Microsoft Query Analyzer uses the iAnywhere OLEDB provider to process queries from (ASA) Linked Servers. The Query Analyzer can call ASA stored procedures provided that Remote Procedure Calls have been enabled. The Linked Server properties RPC and RPC Out must be selected; otherwise a message like "Server 'asatest9' is not configured for RPC" will be issued.

The Query Analyzer forms a query that is syntactically incorrect for ASA and this results in a syntax error message.

For example, the following query will result in the error messages shown below.

asatest9..dba.sp_customer_list

Could not execute procedure 'sp_customer_list' on remote server 'asatest9'.

[OLE/DB provider returned message: Syntax error near '1' on line 1]

The Query Analyzer issues the SQL statement "{?=call "dba"."sp_customer_list";1}". The ";1" results in a syntax error.

This has been fixed. The iAnywhere OLEDB provider will now remove the ";1" from the statement as a work-around.

402359 The MobiLink Synchronization Server was not able to synchronize multi-byte characters (e.g. Chinese characters) between ASA with the UTF8 collation and Microsoft SQL server, if the columns were defined as CHAR (varchar, char, or long varchar) in ASA and NVARCHAR in Microsoft SQL server. A new command line option, -hwH+, has been added to the MobiLink server. By default, it is on for Microsoft SQL server and off for all other consolidated databases. When it is on, the MobiLink server will call SQLDescribeParam (this function may not be supported by all ODBC drivers, but it is available in the driver for the Microsoft SQL Server) to find out the data types of the parameters in the consolidated database and binds the parameters with the consolidated data types for all the columns with a CHAR datatype.
402416 The performance of a Java stored procedure may have degraded the longer it ran. This would occur if a JDBC Statement object that remained open for a long time caused muliple warnings. Eventually, the buildup of SQLWarning objects would have exhusted the Java heap, causing the Java garbage collector to run continuously. These SQLWarning objects would have been garbage collected when the JDBC Statement was closed, or when the clearWarnings function was called by the Java procedure. This problem has been fixed by clearing the Statement's SQLWarning objects whenever the Statement's associated ResultSet is closed.

Note that the default heap size may be to small for some applications, but can be increase with the Java_heap_size database option.

402417 A memory leak in the Java VM would have caused poor performance of a Java stored procedure if it was called hundreds of times. The cause of the performance drop was exhaustion of the Java heap, forcing the Java garbage collector to run continuously. This has been fixed.

Note that the default heap size may be to small for some applications, but can be increase with the Java_heap_size database option.

402431 The changes for Engineering Case 394506 introduced a bug that could have caused a database file to become corrupted. The problem has been corrected
402669 If a procedure call in the FROM clause returned fewer columns than indicated in the result clause, or the catalog, and the last column returned was not used by the query, the server would have crashed rather than give an error. This has been fixed.
402727 Issuing a START DATABASE request for a database with a mismatched transaction log could have failed with the error message "Cannot open transaction log: '???' belongs to a different database". The error message now correctly specifies the transaction log file name in place of the string '???'.
402864 The changes for Engineering Case 383970, would have caused the server, when run on systems that had multicore processors with hyperthreading disabled or not present, to report each processor core as a physical processor. Now a multicore processor is reported as only one physical processor.
403010 The iAnywhere OLEDB Provider could have reported a "Table not found" error for any of the following rowsets:

COLUMN_PRIVILEGES

TABLE_PRIVILEGES

FOREIGN_KEYS

The SQL scripts that implement these schema rowsets did not qualify the SYSGROUP or SYSTRIGGER tables with "SYS.". This has been corrected.

To install new versions of the OLEDB provider schema rowsets into a database, load and rerun scripts\oleschem.sql.

403014 The iAnywhere OLEDB Provider's default ('PUBLIC') for the GRANTEE restriction column for the COLUMN_PRIVILEGES and TABLE_PRIVILEGES rowsets was incorrect. The default should be the empty string (''). Also, the Provider did not enforce the GRANTOR and GRANTEE restriction columns for the COLUMN_PRIVILEGES rowset. These problems have been fixed.

To install new versions of the OLEDB provider schema rowsets into a database, load and rerun scripts\oleschem.sql.

403026 For FORWARD-ONLY cursors, the iAnywhere OLEDB provider was returning the error "HY109" when fetching rowsets with more than 1 row, and contained a column with more than 200 bytes. This problem has been fixed.
403057 Calling the ChangeDatabase method would have resulted in the provider looking for name of the DSN, instead of the database name. The ChangeDatabase method has been corrected to now use the DatabaseName(DBN) connection parameter to change the current database.
403145 If a server was heavily loaded while the Index Consultant was doing a workload capture, and was also checkpointing frequently, there was a small chance that the srever could hang. Only threads working on the database being captured would have been affected, other databases on the same server would remain operational. This problem was more likely to occur on multi-processor systems. This problem has now been fixed.
403151 The database server could have crashed when connecting to the utility_db from an ODBC application. This would only have occurred if the ODBC driver was a newer version than the server. This has been fixed.
403163 Any use of an aggregate function with DISTINCT in a query, could have potentially lead to a 'dynamic memory exhausted' error. This has been fixed.
403181 The ULSyncParms property that is documented as "StreamParms" was actually coded as "StreamParams". This method has been corrected to be "StreamParms" as documented, and an alias of "StreamParams" added for backwards compatibility. The code samples have also been updated to use "StreamParms" instead of "StreamParams".
403187 When synchronizing against DB2, the synchronization could have been blocked. MobiLink uses the table sysibm.systables to select current timestamp, thus would have been blocked if another application was updating sysibm.systables at the same time. To solve this problem, the table sysibm.sysdummy1, which only has one row and is used for compatibility, is now used instead.
403199 Executing an ALTER VIEW statement with the SET HIDDEN clause, could have caused the server to crash when given the name of an existing base table. This has been corrected so the the server now generates an error.
403315 The changes for Engineering case 385659 accidentally removed the IPreparedStatement.setBatchStringSize method. This method has now been added back.
403353 If a system table was used in a procedure consisting of a single select statement, and was not qualified with the owner, the server would have given an error when the procedure was called in the FROM clause of a query. A workaround is to qualify the table name. This has been fixed.
403355 Executing a REORGANIZE TABLE statement without the PRIMARY KEY, FOREIGN KEY or INDEX clauses could have caused the server to become deadlocked and appear to hang. This problem has now been fixed.
403363 A query with an EXISTS subquery in a nested subquery may have caused the server to crash. This has been fixed. For the crash to have occurred, the following conditions must hold:

- The nested subquery had to qualify to be flattened by the engine (e.g., there were no ORDER BY or GROUP BY clauses in the nested subquery, the main query block didn't contain an OUTER JOIN, etc.)

- the EXISTS subquery could not have been flattened.

- the EXISTS subquery was correlated, and the outer reference was used in an equality predicate.

- the EXISTS subquery qualified to be evaluated as an uncorrelated subquery (i.e., the subquery optimization algorithm was used for the cost-based analysis of the subquery's evaluation methods)

For example:

SELECT *

FROM sales_order_items s

WHERE prod_id IN (

SELECT p1.id

FROM product p1

where p1.quantity > 0 and

EXISTS (

SELECT *

FROM product p2

where p2.quantity > 0 and p2.id =p1.id

GROUP BY p2.id

)

403518 If an application used the setString() method to set up a number of string values for a batch insert, and the strings varied widely in size, then it was possible that the call to addBatch() would have crashed the iAnywhere JDBC driver. The driver was setting up the string array for the wide insert incorrectly when a new string was larger than the standard element size. The string array is now adjusted correctly.
403525 When large databases were synchronized, UltraLite on Palm with the file-based data store, could have become very slow and would eventually time out on conduit synchronization. This has been fixed by allowing users to specify a larger default cache size, which significantly improves the synchronization time by cutting down file I/Os.

Now, when the UltraLite conduit is loaded by the HotSync Manager (on the desktop), it attempts to set the cache size using the value "CacheSize" if it is specified in the following registry key:

Software\Sybase\Adaptive Server Anywhere\<version>\Conduit\<CRID>

where <CRID> is the creator ID used in an UltraLite Palm application on remote. The size of "CacheSize" is in bytes, or the suffix k or K to indicate kilobytes or m or M to indicate megabytes, can be used. If this value is invalid, it is ignored and the old default cache size of 128KB is used. If the "CacheSize" value is not set, the UltraLite conduit will use the new default cache size of 4MB.

403624 If a user was granted SELECT permission on a view that referenced a proxy table, but did not have SELECT permission on the proxy table, then using the view in a subquery would have failed with a permission denied error. This has been fixed.
403665 The changes for Engineering Case 370421 caused the result from the Round() function to be returned with an incorrect scale. This has been corrected.

This is illustrated by the following SQL code.

BEGIN

DECLARE @denominator numeric(16,12), @time_calc numeric(22,12)

select @denominator = 12

select @time_calc = round(1.0/@denominator,12)

select @time_calc

END

The correct result is .083333333333, prior to this fix, the result was .083333000000.

403762 If an Embedded SQL application called the function sqlerror_message(), without first calling the function db_init(), the application could have crashed. Without first calling db_init(), sqlerror_message() would use a NULL cmdseq_env.langstring. This has been fixed so that now the message "DBLib not initialized: error <SQLCODE>" is returned.
403805 Attempting to invoke the AsaConnection ConnectionString Property designer dialog in Visual Sudio .Net would have failed with the error "Value cannot be null. Parameter name: item.". This has now been corrected.
403811 Dynamic SQL did not properly handle aliases in metadata. For example, it did not recognize an alias for a result set column that was a column in a derived table. This has corrected.
403931 When editing a numeric trigger row variable value, a negative value could not have been entered without first typing a digit. This has been fixed.
403932 When debugging a trigger, table columns referenced in the trigger were not shown in the row variables table. This has been fixed.
403934 The iAnywhere JDBC driver has been enhanced so that it supports the Sun JDBCODBC subprotocol for the URL definition in addition to the current definition. As a result, applications can now use URLs of the form:

jdbc:odbc:<data-source-name>[;<attribute-name>=<attribute-value>]*

403958 Changes for Engineering Case 401757 caused the QAnywhere Agent to be very slow during the upload phase of a message transmission if the message store contained many messages. This has been fixed so that the time for the upload phase is now similar to what it was before.
403970 The reserve_size connection parameter was being applied to the temporary file as well as the main database file. This essentially doubled the space allocated by reserve_size unnecessarily. Now, the reserve_size parameter applies only to the main database file, and the temporary file is created initially to contain a very small number of pages.
403988 When using a stored procedure in the request_cursor property, the Notifier may have failed to start, and in turn caused the MobiLink server to fail to start. This could have happened when the database source did not support the use of SQLColAttribute before a statement was executed. For example, this limitation occurs on Oracle 9.2 with DataDirect's wire protocol driver 4.2, but not with ASA and ASA's ODBC driver. This failure would have caused a SQLException with the following fragment of stack trace in the MobiLink log during startup:

...

E. 09/02 11:21:58. Error: at ianywhere.ml.jdbcodbc.IResultSetMetaData.getColumnCount(IResultSetMetaData.java:213)

E. 09/02 11:21:58. Error: at ianywhere.ml.notifier.Notifier.connectDB(Notifier.java:348)

E. 09/02 11:21:58. Error: at ianywhere.ml.notifier.Notifier.init(Notifier.java:299

...

This problem has been fixed, the call to getColumnCount is now delayed until after the request_cursor is executed.

404072 If an application relied on the garbage collector to clean up ResultSet and (Prepared) Statement objects rather than explicitly closing these objects, then the iAnywhere JDBC driver would have leaked memory. It should be noted though that explicitly closing either the ResultSet object or the (Prepared) Statement object was enough to avoid the memory leakage. This problem has now been fixed.
404084 A new server command line option -dt <dir> has been added which allows for specifying the directory for temporary files. If the switch is not present the server looks for the OS environment variables as in current versions. On Unix systems, temporary files for shared memory connections will not be placed in the directory specified by -dt, but will still use the OS environment variables as in current versions.
404119 In case-sensitive databases some identifiers were still being treated as case-sensitive (e.g. index names). This has been fixed.
404130 It was possible that the sa_get_request_times() procedure could not have read request logs generated in certain locales. The satmp_request_time table would have been empty. The request logs were generated with date/time values that were in a locale-specific format, whereas the sa_get_request_times() procedure was expecting a specific format. The date/time string will now be output in the same format (mm/dd hh:nn:ss.iii) regardless of the locale setting.
404134 The utility installULNet.exe, which removes and reinstalls Visual Studio integration for UltraLite.NET, was failing to re-install the Sync Progress Dialog wizards. This has been fixed.
404151 Calling a procedure owned by another user with the result of a function owned by a third user would have resulted in a 'permission denied' error. This has now been fixed.

For example, the following this sequence would have generated the 'permission denied' error:

create procedure userA.hello( in name char(10) )

begin

message 'Hello ' || name;

end;

grant execute on userA.hello to userC;

create function userB.world()

returns char(10)

begin

select 'world';

end;

grant execute on userB.world to userC;

create procedure userC.say_hello( )

begin

call userA.hello( userB.world() );

end;

call userC.say_hello();

404179 Cancelling a "Start Database" statement could have crashed the server. This has been fixed.
404188 Calling the function connection_property( 'UncommitOps', conn_num ) could have returned a value greater than 4 billion if conn_num referred to an internal connection of a database which was currently being started. This has been fixed so that 0 is now reported in this case.

Note, the value greater than 4 billion could have caused an out of range error if used with the procedure sa_conn_info.

404251 If the execution of a BACKUP statement failed, the next time the database did a checkpoint the server would have failed with the following error:

Assertion failed: 108001 (9.0.2.3182) Attempting checkpoint while backup active

A flag indicating that a backup was in progress was not being reset if the backup failed. This has been corrected.

404280 If server was shutdown, or crashed while the debugger was in use, Sybase Central may have become very slow. This has been fixed.
404290 A stored procedure call that included the owner name would have failed when using ADO and the SQL Anywhere OLE DB provider. The following is an example using Visual Basic:

' Set CommandText equal to the stored procedure name.

objCmd.CommandText = "fred.ShowSalesOrderDetail"

objCmd.CommandType = adCmdStoredProc

objCmd.ActiveConnection = objConnection

A couple of problems arose when using this form of the stored procedure call. Internally, the OLE DB provider uses a SQL query to obtain information on the number of parameters to the stored procedure. It asked for information on a procedure name called "fred.ShowSalesOrderDetail" and there was no such procedure name since the owner name had not been separated from the procedure name. This problem has been fixed.

The second problem involved using the ADO parameter "Refresh" method as shown below in a Visual Basic example:

' Automatically fill in parameter info from stored procedure.

' This avoids having to do CreateParameter calls.

objCmd.Parameters.Refresh

The problem is related to the way ADO interprets the components of the stored procedure name. There are three basic forms recognized by ADO.

1. ProcedureName

2. Owner.Catalog

3. Owner.ProcedureName.Catalog

Here is how ADO interprets these forms.

The first form is what is most often used. When only a name appears (no qualifiers), it is interpreted to be the procedure name. This form poses no problems.

When the second form is used (two names separated by a period), the first name is assumed to be the owner name and the second name is assumed to be the catalog name. SQL Anywhere doesn't support the notion of catalogs. When the Refresh method is called, the OLE DB provider is presented with the following query by ADO.

EXECUTE sa_oledb_procedure_parameters inProcedureCatalog='Catalog',inProcedureSchema='Owner'

This query from ADO is meaningless to the SQL Anywhere OLE DB provider, as the procedure name is missing. ADO has interpreted the two components as a schema name (the owner) and a catalog name. The query returns information on all procedures owned by "Owner" which is of no use.

When the third form is used, the first name is assumed to be the owner name, the second name is assumed to be the procedure name. and the third name is assumed to be the catalog name. When the Refresh method is called, the OLE DB provider is presented with the following query by ADO.

EXECUTE sa_oledb_procedure_parameters inProcedureCatalog='Catalog',inProcedureSchema='Owner',inProcedureName='ProcedureName'

Since the procedure name and owner are present and since the catalog name is ignored by the OLE DB provider, this query will return the correct information about the procedure parameters. However, the actual procedure call will result is a syntax error since "call Owner.ProcedureName.Catalog" is not an acceptable form for a stored procedure call.

These problems can be avoided by not using the ADO "Refresh" method and, also, by avoiding the use of the three-part syntax. The best solution is to avoid the use of an owner qualification entirely since the "X.Y" form is misinterpreted by ADO.

404321 If an Adaptive Server Enterprise database was used as a QAnywhere server's consolidated database, and QAnywhere groups were created, any messages directed at the groups would have queued up, but would never have been delivered. This is now fixed, so that messages directed to groups will be delivered. Any messages queued up before this fix will also be delivered.
404331 The QAnywhere client library could crash in any of these methods: Commit() or Rollback() of QATransactionalManager; Acknowledge(QAMessage msg) or AcknowledgeUntil(QAMessage msg) or AcknowledgeAll() of QAManager. This has been fixed.
404396 The server could have gone into an infinite loop while performing operations on a database corrupted in a certain way. Validation of the database may or may not have experienced the same behaviour. The server will now fail with "Assertion 202101: Invalid bitmap links on page 0x%x" when such a condition is encountered.
404437 The QAnywhere Central utility was not displaying the clients tree display in sorted order, so finding a particular client in a list of any size was difficult. With this fix, the clients are sorted by name.
404448 When connected to an Adaptive Server Enterprise server whose version was greater than or equal to 12.5.1, the MobiLink Synchronization Server could have uploaded incorrect data from ASA TIME columns into ASE DATETIME columns when a cursor-based upload was used. The date part of the uploaded rows in the ASE database would have been the current date, instead of '1900-01-01'. This problem is now fixed.
404450 If dbremote were forced to retry an operation that involved a long varchar or long binary, then dbremote would have reported an error in the dbremote log similar to "There is already a variable named 'n1'". Dbremote will no longer report this error.
404622 When 9.0.1 QAnywhere clients synchronized messages with 9.0.2 QAnywhere servers, the performance may have been poor, especially under load situations. Checking the QAnywhere server log would have likely shown multiple "Deadlock" errors. Although these deadlock errors did not affect correct message delivery, the deadlocks were forcing the clients to re-synchronize until there were nolonger deadlock errors. This has been fixed, so that the deadlocks will no longer occur, and performance under load situations will improve.
404767 If an INSERT...SELECT was executed, such that the table being inserted into was in a publication and the table being selected from was a proxy table, then it was possible that the statement would have failed with unnexpected errors. The most likely error was a "conversion error", but any number of errors could have been returned. The problem has now been fixed.
404908 A memory leak in the OLE DB provider associated with calling stored procedures has been fixed.
404915 When using the UltraLite Schema Painter, it was not possible to define a Numeric column as autoincrement. An error dialog would have been displayed, stating that the default was not compatible with the type of the column. The Schema Painter was missing Numeric from its list of valid autoincrement column datatypes. This has been corrected.
405060 When Connection Lifetime was specified in a connection, the connection duration would have been incorrect. This has been fixed so that the behaviour is as follows:

- If the time span exceeds the value specified by Connection Lifetime, the connection will be destroyed when it is closed.

- If the time span does not exceed the value specified by Connection Lifetime, the connect will be returned to the pool when it is closed.

405103 An outer hash join could have failed to return rows that should have been generated from a preserved row that had no matching row from the null-supplied table. In order for this problem to occur, the following conditions must have been met:

- An outer hash join operator was used in the query execution plan

- The build input to the hash join was larger than would fit into memory

- Further, the order of rows had to match a particular set of conditions, and memory usage in the rest of the query plan had to match a particular state

When the problem appeared, the set of missed rows would vary depending on current server state. This problem has been fixed.

405321 An attempt to insert a value into a SQL TINYINT column declared as adTinyInt, that was greater than 128, would have failed with the error "Count field incorrect". Unfortunately, this message did not clearly indicate where the problem occurred. The ADO adTinyInt type (DBTYPE_I1) includes numbers in the range -128 to 127. A value like 255, which is outside of this range, cannot be converted to an adTinyInt. The ASA TINYINT type corresponds to an unsigned 1-byte integer, which matches the ADO adUnsignedTinyInt type (DBTYPE_UI1). This type accepts values in the range 0 to 255. The conversion error that results from trying to convert a value like 255 to an adTinyInt type is now properly reported as "Cannot convert parameter X to a DBTYPE_I1" where X is the index of the parameter to the INSERT statement.
405360 If a value longer than 255 bytes was passed to a MobiLink client hook procedure, through the #hook_dict table, then the MobiLink client could have become unstable. This may have occurred when a communications address longer than 255 bytes was specified, there was a failure connecting to the Mobilink server, and there was an sp_hook_dbmlsync_ml_connect_failed hook defined. This has now been fixed.
405375 If the sending phase of the SQL Remote Message Agent was the victim of a deadlock, it could have crashed. Note that in order for the sending phase of dbremote to have been the victim of deadlock, it would have to have been in the process of satisfying multiple SYNCHRONIZE SUBSCRIPTION commands, and the send and receive phases of would have had to be running on separate dbremote processes. The Message Agent will no longer crash in this situation, but will now report that the sending of messages has failed and will shut down as expected.
405389 Calling a procedure using Transact-SQL EXECUTE syntax, and passing a subquery as one of the parameters, could have caused a server crash. Attempt to pass a subquery as a parameter will now result in a syntax error when using Transact-SQL syntax for the call. This is the behaviour when using Watcom-SQL syntax..
405397 When run on Windows CE devices, the server was not have recognising the registry setting to change the location of the temporary folder. This has been fixed, so that temporary files may now be moved to a storage card.
405516 The server could have crashed, or failed an assertion, when doing a REORGANIZE TABLE on the tables rows. A work around is to lock the table exclusively WITH HOLD before doing the reorganize.
405588 The QAnywhere Agent could have caused the MobiLink client to crash under the following circumstances:

- a failover server was specified with a second -x option,

- the communication address of the failover server [as in -x tcpip(<communication address>)] was longer than 255 characters, and

- communication with the primary server failed, causing an attempt to synchronize with the failover server.

This has been fixed. The problem is related to Engineering Case 405360.

405597 The MobiLink server would have failed to start if the Notifier properties stored in the database contained empty SQL statements. This problem has been fixed.
405626 The database server could have stopped writing to the console log file if the file could not be opened after being renamed due to growing to its maximum size. One cause for this would be a virus scanner which scans files immediately after they are modified. This has been fixed so that logging to the file will continue once the file can be opened again. There is a chance that some messages may not be logged if this occurs.
405631 If a transaction spanned more than two transaction logs, and these logs were applied to a copy of the original database, an error "<log_file> is an invalid transaction log" could result. This has been fixed. The original transaction logs and database are valid; however, the database produced by applying the logs using a server without this fix may be missing transactions.
405704 A statement that contained a subselect with more than one column, should have generated the error: "Subquery allowed only one select list item" (SQLCODE -151, SQLSTATE 53023). If the subselect was coded using a single '*' or 'T.*' in the select list, the error was not given. For example, the following should give an error:

select *

from dummy

where dummy_col = (select * from department where dept_id < 200 )

When the error was not given though, the extra columns were ignored. This has been fixed.

405724 All of the menus in the menu bar could have become disabled on Mac OS X 10.4.2. This did not happen in earlier OS X versions. This has now been fixed.
405887 The server could have generated inaccurate selectivity estimates for predicates involving comparisons on a NUMERIC column when the value being used for comparison had a different scale than that of the column. This problem has been resolved.
405913 When using Dynamic SQL, erroneous results could have been produced if the SUBSTRING() function was called with negative lengths. This has been corrected.
405965 When installed on non-English Windows systems, the managed provider components (Adapter, Connection, Command) were not displayed in Visual Studio's toolbar tab correctly, along with the rest of the Data Components. This has now been fixed.
405988 UltraLite for M-Business Anywhere now supports ECC (Elliptic curve cryptography) for TLS (Transport Layer security). Both UltraLite for M-Business Anywhere pod (ulpod9.dll) and One-Button-Sync (ulconnect.exe) now support ECC over TCPIP or HTTP as synchronization stream types.

To use this new feature, users will need to have a valid Certicom ECC license, as well as ECC client and server certificates. New properties and methods have been added to the SyncParms pods object to support the new synchronization stream types.

* PODS Constant: UInt32 STREAM_TYPE_ECC_TCPIP - select this value for the SyncParms.setStream() method when synchronizing via TCPIP over ECC transport-layer security.

* PODS Constant: UInt32 STREAM_TYPE_ECC_HTTP - select this value for the SyncParms.setStream() method when synchronizing via HTTP over ECC transport-layer security. Note, this is NOT the same as HTTPS.

* PODS Method: setSecurityParms( String v ) - Sets the options required when using ECC transport-layer security. This method is relevant only when the sync stream type is set to be ECC_TCPIP or ECC_HTTP. A detailed explanation of this parm string can be found in the MobiLink documentation: MobiLink Clients -> UltraLite Synchronization Parameters -> Synchronization parameters -> Security Parameters synchronization parameter.

* PODS Method: String getSecurityParms() - Gets the option string for ECC security.

The UltraLite for M-Business Anywhere samples, Simple and CustDB, have been updated to demonstrate the use of these new methods and constants.

406017 Use of TOP n START AT m could have caused a server crash when used later in a query plan, following certain operators. These operators include all of the hash operators, the window operator, and the sortmerge operator. This has been fixed.
406030 The server could have crashed when referencing a variable declared as a VARBINARY of unspecified length. This has been fixed.
406093 Calling the Information utility with -u option "output page usage statistics", could have caused a server crash if there was a table in the database with a long name.
406125 If the sending and receiving phases of dbremote were being run in separate dbremote processes, and the sending phase was processing a SYNCHRONIZE SUBSCRIPTION request, it was possible for the two phases of dbremote to deadlock, resulting in the sending phase being rolled back. The sending phase of dbremote will now lock all the tables that are about to be synchronized if it detects that the receiving phase of dbremote is also active. If the sending phase fails to acquire the table locks, it will attempt to get the locks 5 times, with a increasing delay between each attempt ( 100ms, 200ms, 400ms, 800ms). If all five attempts to acquire the locks fail, the sending phase will attempt to process the SYNCHRONIZE SUBSCRIPTION without acquiring the locks, which could still result in a deadlock. To further reduce the possibility of deadlock, the receiving phase of dbremote should run with "-g 1" to prevent the grouping of transactions.
406421 If a checkpoint was initiated while a backup was in progress, the changes made for Engineering Case 400911 would have prevented subsequent commits from completing until the backup had finished. The server now allows requests attempting to suspend checkpoints to progress if there is a transaction already suspending checkpoints as a result of a backup or other such operation.
406432 During periods of heavy server load, or substantial cache pressure, the server could have appeared to stop processing active requests. This was more likely to occur during very heavy disk I/O, and when issuing DDL statements alongside connections that had created, and were dropping, string variables which contained long string values. Although these active requests appeared to hang, they would eventually complete, taking an arbitrarily long time. This has been fixed.
406441 If two or more QAnywhere servers were started using the same consolidated database, the JMS connectors in the multiple instances may have produced duplicates messages. That is, if a QAnywhere message was sent to a JMS destination via a JMS connector, it was possible that each instance of the JMS connector would have read the QAnywhere message and produced a corresponding JMS message. This has now been fixed so that the potential source of duplicate messages has been removed.
406488 The server was incorrectly assessing NULL selectivity when used with a descending index. When examining an index to determine selectivity, the server assumed that NULLs were at the start of the index. In a descending index, they are at the end. This assumption has been corrected.
406557 The QAnywhere client library's GetMessage methods could have returned inconsistent data when there were at least two originating clients sending messages to one receiver client,

and there was a high rate of messages being delivered to the receiver client, resulting in several synchronizations per second. In this scenario it was possible that message properties or content obtained from a given QAMessage through the QAnywhere client API methods, may not have been correct, even though the messages were stored correctly in the message store database. This has been fixed.

406567 The server could have crashed while executing a stored procedure that was called from another stored procedure. This has been fixed.
406574 Dynamic SQL applications could have crashed when a nullable column participates in an index optimization, and the predicate involved a host variable.

For example,

SELECT name from Table where name < ? (name starts an ascending index)

SELECT name from Table where name > ? (name starts a descending index)

This has been corrected.

406730 The Synchronization observer ( iAnywhere.Data.UltraLite.ULSyncProgressListener.syncProgressed() ) was invoked for every row during a synchronization. This caused increased overhead and slowed the synchronization, particularly when using higher-level components such as UltraLite.NET. The observer behaviour has been changed to issue a maximum of 2 callbacks per second while in the sending data or receiving data states.
406745 Executing DDL statements with incorrectly formed object names would have made the transaction log unrecoverable.

For example, if a statement such as:

ALTER TABLE DBA..T ADD c2 INT

was executed, the resulting transaction log would contain an invalid statement and recovery using the log would fail. This has been fixed so that when a statement such as the one above is executed, it will now result in a valid statement being recorded in the transaction log.

406753 If the server could not allocate the database cache, the server would likely crash at startup. For example, starting a server with "-c 4800m" would have caused the server to crash. This has been fixed.
406765 Database recovery could have failed with assertion 201501 "Page for requested record not a table page or record not present on page". The problem would only have occurred in the event of the database server not shutting down cleanly while dbremote replication was taking place. It would also have been required that another connection revoked CONNECT or REMOTE from the remote user for which the transactions were being replicated. This has been fixed so that connections attempting to revoke permissions from the user for which replication is currently occurring will now receive an error indicating that the operation is "Not allowed while user 'user_name' is actively replicating transactions". The connection attempting to REVOKE permissions will need to wait until replication completes (commit/rollback) before being able to revoke the permissions.
406845 A new character set conversion mapping table has been added to provide Microsoft-compatible conversion to and from CP932 (Japanese). In the existing mapping table, <install>\charsets\unicode\cp932ms.uct, certain characters that appear more than once in CP932 map differently from Microsoft conversion functions. By copying the new file, cp932ms3.uct, over cp932ms.uct, mappings will be 100% compatible with the Microsoft mappings. The affected characters in CP932 are 81CA, 8754-875D, 8782, 8784, 878A, EEF9, FA4A-FA54, FA58-FA5A. As noted, for these characters, the same Japanese characters occur as two different character codes in the character set.

It is important that this file be copied over cp932ms.uct before any use of a database in the environment. In particular, it is recommended that this file copy occur immediately after deploying Adaptive Server Anywhere and a database and prior to running an application against the database. If the file copy occurs after the database has been in use, the altered character mappings may cause data values to change, even though the appearance of the characters remains unchanged. In a synchronization environment, these data changes may cause unexpected errors.

406857 If a query like "SELECT TOP 5 * FROM T" was executed without an ORDER BY clause, the server would normally return a warning stating that "the result returned is non-deterministic." For Open Client applications, this warning is now nonger returned.
406885 The Synchronization observer ( ianywhere.ultralite.SyncProgressListener.syncProgressed() ) was invoked for every row during a synchronization. This caused increased overhead and slowed the synchronization, particularly when using higher-level components such as Native UltraLite for Java. The observer behaviour has been changed to issue a maximum of 2 callbacks per second while in the sending data or receiving data states.
406890 A call to the ULSynchronize() could have caused stack corruption if an error occurred and synch_info.stream_error.error_string was not NULL but synch_info.stream_error.error_string_length was 0. This has been fixed.
406894 When the Synchronize() method was called with an observer function, a callback was invoked for every row during a synchronization. This caused increased overhead and slowed the synchronization, particularly when using higher-level components such as UltraLite for MobileVB. The observer behaviour has been changed to issue a maximum of 2 callbacks per second while in the sending data or receiving data states.
406895 When the Synchronize() method was called with an observer function, a callback was invoked for every row during a synchronization. This caused increased overhead and slowed the synchronization, particularly when using higher-level components such as UltraLite ActiveX. The observer behaviour has been changed to issue a maximum of 2 callbacks per second while in the sending data or receiving data states.
406904 If the Translation utility was used with the command line option -it "specify table names to include in output", it would have crashed when the transaction log file contained transactions that continue from the previous transaction log file. This has now been

fixed.

406913 The Interactive SQL utility could have appeared to be hung when launched from the context menu of a table in the ASA plug-in for Sybase Central. The problem did not occur every time, nor on every machine. This has been fixed.
406942 An UltraLite application could have taken a long time to time-out when attempting to establish a connection over GPRS if the MobiLink server was not running. If the client_port synchronization parameter was supplied with a large range of ports, the client could take an extremely long time to time out, as each port was tried in succession. This has been fixed so that the connection attempt will now time out after the number of seconds specified in the "network_connect_timeout" parameter has passed.
406995 It was possible for the estimated number of rows returned by a plan operator to be misreported. This problem was likely to only affect plans containing derived tables. This problem only affected the graphical plan display; it did not affect query optimization or execution. The incorrect estimate would have been easily detectable, as it would either have been a number with an extremely large (positive or negative) exponent, or it would have been a string of characters like "IND#-1". This has been fixed.
407012 The following ODBC driver problems have been fixed:

1) Fetching multiple rows into a bound WCHAR column, which was too small for the column (thus truncating the data), could have copied the data into the wrong user buffer location. Data was filled correctly on the first fetch, but incorrectly on subsequent fetches, likely overrunning memory and possibly crashing the application.

2) Using SQLGetData to put data into a WCHAR buffer, where the client or database charset was multibyte, may have caused a subsequent SQLGetData on the same column to contain incorrect data. Also, indicator values may have been set incorrectly for SQLGetData or SQLFetch calls to fill WCHAR buffers when using multibyte character sets.

3) Using SQLGetData to put data into a WCHAR buffer with more than 64K WCHARs could have returned the wrong indicator, when there is no truncation.

4) Using SQLPutData to put more than 64K of data of ANY TYPE in one SQLPutData call, may have put incorrect data.

5) Calling SQLPutData with CHAR (not WCHAR) data and SQL_NTS length, only appended the first 256K of data. Appended data greater than 256K was lost.

6) Calling SQLPutData with WCHAR data and using odd lengths (i.e. partial characters), may have put incorrect data if the client or database charset was multibyte.

407032 Write access to an UltaLite database was denied (with error code -89) during synchronizations, even if the application was only pinging the MobiLink server. This has been fixed so that now write access is permitted during synchronization when doing a ping or a download-only synchronization. Write access is still denied if when sending an upload to MobiLink.

Also, the runtime now permits a ping synchronization if there are uncommitted transactions.

407181 If the following conditions were all true, the server could have crashed when the calling connection was dropped:

- a user-defined function was called from a procedure

- the function in turn called a procedure with an inout or output parameter

- the argument corresponding to the output parameter had a different datatype, requiring a conversion to be done

This has been fixed. A workaround is to ensure the argument datatype matches the type of the output parameter, or declare the parameter explicitly as IN if it was not intended to be INOUT.

407296 Logging deadlocks by setting the option PUBLIC.log_deadlocks to ON, could have logged incorrect information. If the command line option -zl "remember last statement text" was used, the "what" sa_report_deadlocks column may have been blank and there was a chance the server could crash. These problems were more likely when the 10K deadlock log buffer limit was reached, calling sa_report_deadlocks would report the lowest snapshotId greater than 1. This has been fixed.
407390 A query with an outerreference to unflattened derived table or view, that was used twice in a subquery, could have failed with an unexpected expression error, or could have caused theserver to crash. In the example below, the outerreference T1.q is used twice in the subquery and it references a column of a derived table with UNION:

SELECT T1.*

FROM

(select * from (select quantity from product UNION select quantity +10 from product ) as V (q)

) T1 (q)

WHERE EXISTS(

SELECT 1 FROM

(select max(id) as i,

sum(quantity) as qty

from product

group by color) T2

WHERE T1.q >T2.i AND T1.q=T2.qty )

This has now been fixed.

407408 If the full path to the active transaction log was greater than 57 characters, calling the Backup utility with command line option -xo "delete and restart the transaction log without backup", would have failed to erase the renamed transaction log. The renamed transaction log file is now properly deleted.
407421 When executing a Dynamic SQL query containing a CASE statement, incorrect errors could have been produced. This has been corrected.
407422 It was possible for the server to fail with Assertion 200602: 'Incorrect page count after deleting pages from table {table_name} in database {database_name}', when dropping or truncating a table for which a LOAD TABLE had failed. It was also possible for a failed LOAD TABLE to leak table pages, or temporary file pages. A failed ALTER TABLE could have resulted in many other assertions or strange behaviours. These problems would only have occurred if there where other transactions actively committing and rolling back transactions at the time of the LOAD TABLE or the ALTER TABLE. These problems have now been fixed.
407546 The Message Agent could have failed with the error "No log operation at offset n in the current transaction log", if:

- the database used checksums;

- transactions spanned transaction logs;

- the last replication finished at a commit that was at the end of an offline transaction log.

This problem has been fixed.

407565 When run on some Windows CE devices, after the server had grown a file, the OS would start to ignore the FILE_FLAG_WRITE_THROUGH flag, as well as the FlushFileBuffers() call. On Windows CE, the server uses FlushFileBuffers() to guarantee IO ordering for recoverability. In an attempt to work around this problem, the server has been changed to close and reopen files after the first call to FlushFileBuffers() after a file grows. It is not known exactly which versions of Windows CE contain this problem.
407670 Subqueries with an EXISTS predicate may no longer be flattened if the subquery contains two or more tables in the FROM clause, and it is not known if the subquery returns at most one row. The main issue with flattening subqueries with more than one table in the FROM clause is that a Distinct on rowids is always needed for the plan of the main query block.
407672 The changes for Engineering Case 404072 resolved a memory leak in the iAnywhere JDBC driver, but revealed a problem with synchronizing the release of resources within the native portion of the iAnywhere JDBC driver and the VM's garbage collector. We had to ensure that resources were not being released while the garbage collector was running. The issue with synchronizing the VM's garbage collector has now been resolved.
407773 When connected to a server via jConnect, Interactive SQL could have displayed the following warning after calling a stored procedure:

"010P4: An output parameter was received and ignored."

This warning has now been suppressed since there is nothing the user can, or should, do about it.

407815 A query that has many constant strings and duplicate constant strings in the GROUP BY clause may have crashed the server.

For example:

select <many constant strings>, 'foo' 'foo'

from employee

group by 'foo', 'foo'

This has been fixed.

407945 In some cases, secure web services (i.e. using HTTPS) may have failed to connect, with the error "The connection was closed from the other side". This has been fixed by upgrading to version 3.1.14 of the Certicom libraries. Note that this problem did not occur on Mac OS X.
408062 If a query referencing a proxy table was to be executed in "No passthru" mode and the proxy table contained a varchar column, then any trailing blanks in the varchar column would have been incorrectly stripped. This problem has been fixed.
408064 Starting the server on a database created by a previous version, (ie. versions 8.0.x and earlier) could have left the database in an unrecoverable state for varying intervals of time between checkpoints. This time interval was large on Windows 95, 98 or ME, and other Windows platforms where the server was started using the undocumented command line option -hx. Otherwise the interval of time was extremely short or non-existent.
408074 UltraLite.NET did not work with the .NET Compact Framework v2.0. New compatible assemblies can now be found in <install dir>\ultralite\UltraLite.NET\ce\VS2005\. These assemblies are based on the ADO.NET 1.0 API but have been recompiled to work with v2.0.

Please note the following behaviour change:

The ULConnectionParms control does not work with Visual Studio 2005. Instead, use the ULConnectionParms class programatically which functions exactly the same as the control. Make a ULConnectionParms object and set its properties. Finally, to get the connection string, call the ToString() method, as with the control.

The SyncProgressDialog wizards are not available for Visual Studio 2005. Users should visit codeXchange web-site for samples of the SyncProgressDialog.

Also note the the following behaviour changes have been observed in the .NET Compact Framework 2.0:

1. Decimal object scale preserved

In Decimal objects, scale (i.e. number of digits after decimal place) is preserved when converted to string even if the digits are zero.

As an example, the following piece of code will behave differently between .NET Compact Framework 1.x and 2.0. In this example, a decimal value of 5 is assumed to have been placed in a Decimal column that has a precision of 4 and a scale of 2.

ULDataReader dr = cmd.ExecuteReader();

dr.MoveFirst();

Decimal d = (Decimal) dr.GetValue( 1 );

Console.WriteLine( d );

Console Output under .NETF v1.x:

5

Console Output under .NETF v2.0:

5.00

2. ULRowUpdatedEventArgs and ULRowUpdatingEventArgs

In the ULRowUpdatedEventHandler method, getting the TableMapping property of the given ULRowUpdatedEventArgs object behaves differently when run with .NET v1.x and .NET v2.0. With .NET v1.x, null is returned when no TableMapping is associated with the event. With .NET v2.0, an empty TableMapping object is returned.

3. Deployment of resources on devices

iAnywhere.UltraLite.resources.dll and iAnywhere.Data.UltraLite.resources.dll

Consider the following directory structures:

Directory Structure #1

<curdir>\iAnywhere.Data.UltraLite.dll

<curdir>\iAnywhere.Data.UltraLite.resources.dll

Directory Structure #2

<curdir>\iAnywhere.Data.UltraLite.dll

<curdir>\en\iAnywhere.Data.UltraLite.resources.dll

With .NET v1.x, the resources dll could have been placed in the same directory as the executing assembly or in a directory with the name of its culture. That is, Directory Structure #1 and #2 are both acceptable.

With .NET v2.0, the resources dll must be placed in a directory with the name of its culture. That is, using Directory Structure #1, the Compact Framework will not be able to find the resources dll. Using #2 on the other hand, the Compact Framework will find the resources dll.

408097 On Unix systems, calling the ODBC function SQLDataSources() would have caused the server to crash with a SegFault, if no Driver Manager was being used. This has been fixed.
408216 The native Apache2 redirector now supports initiating HTTPS connections to Mobilink server. Prior to this new feature, the redirector could only communicate to Mobilink through HTTP.

PLEASE NOTE THE FOLLOWING REDIRECTOR CONFIG FILE CHANGES:

THe MobiLink directive now supports the following formats for the directive value.

(This is the old format - which is still supported) - Existing application can continue to use this format. It's a simple and short format if applications are not interested in HTTPS

ML=my-pc:82

(This is the new format - which allows for more security options to be specified)

ML="host=my-pc;port=82;trusted_certificates=rsaroot.crt;https=true"

Please note the following with the new format:

1- There is quotation marks that bounds the value of the options list. It is mandatory that those quotes exist.

2- All Mobilink stream options are valid for the option list (since they simply get passed along to Mobilink), Only the 'https=' option though is specific to the redirector only.

2- The option, trusted_certificates (Plural), is where you specify the server root certificate. This certificate has to be PEM encoded x509 type, which is simply the supported Mobilink certificate format.

3- The option https=true has to be specified in order for the redirector to enable SSL at the lower communication layer. Any value other than true or if the option is omitted, the default is used, which is false.

408239 Changes to the Java redirector have been made so as to better support the Java Servlet container behaviour in Tomcat 5.5.9.
408381 If an outstanding external procedure or function was cancelled, and a new external call was issued shortly after the cancelled external call returned back to the server, the newly issued call could potentially have returned immediately, without executing. This has now been fixed.
408481 Subqueries with an EXISTS condition are no longer flattened if the subquery contains more than two tables in the FROM clause, and it is not known if the subquery returns at most one row. This can lead to improved performance, as subquery optimization can now be done. The main issue with flattening subqueries with more than one table in the FROM clause is that a Distinct on rowids is always needed for the plan of the main query block. Previously, when flattening was done as the query was parsed, the optimizer could not choose any other plan but one with a Distinct.
408483 If a query had a predicate of the from "DT.X = expr", where "DT.X" was a column in a derived table, the predicate "DT.X IS NOT NULL" is now generated as a rewrite optimization. This generated predicate may then be used by other rewrite optimization algorithms to eliminate OUTER JOINs, redundant or conflicting predicates, etc. This could lead to vastly improved query performance.
408490 The MobiLink client would have leaked approximately 0.5 Kb, plus 0.5 Kb for each user connection open to the database, for each synchronization. This leak was small enough that it would only cause a problem if dbmlsync performed many synchronizations between the time it was started and when it was shut down (for example if a frequent schedule option was being used and dbmlsync was left running for a long time). This has now been fixed.
408506 For CREATE VIEW and CREATE GLOBAL TEMPORARY TABLE statements, if the name of the object being created included a server or database name, but no user name, the statement recorded in the transaction log would have been invalid and could prevent recovery using the log. This has been fixed.
408512 It was possible, although very unlikely, for the server to crash if an undocumented system procedure was called directly. This has been fixed.
408613 When using Dynamic SQL, incorrect results could have been generated when a SELECT DISTINCT query was executed, and a temporary table with more than one column was required to create the result set. The temporary table was being created with an incorrect primary key. This was been corrected.
408655 Executing a very large query could have caused the server to crash. This has been fixed.
408745 Image backups produced by a server when running on a multi-processor machine could have been corrupt. This would have occurred if there was more than one transaction concurrently modifying the database. This has now been corrected.
408806 When an input parameter was bound to a parameter in a stored procedure, and the procedure parameter was actually an INOUT parameter, the ODBC driver would have attempted to update the value after the procedure executed. This could have lead to a 'data truncated' warning message if the resulting string did not fit. This has been fixed so the the ODBC driver will no longer attempt to update the values of INOUT parameters bound as input only.
408903 Running the Validation utility would have cause the server's temporary file to grow on each execution if validation with express check (-fx) was chosen. This is the default mode in 9.0.2. The amount of growth would depend on the number of tables in the database and the size of those tables. This has now been fixed. A workaround is to validate using -fn rather than -fx. Validation performance should improve with this fix as well.
408937 The native Apache2 redirector now supports routing requests from Afaria clients to an Afaria server.
408974 On Windows CE and Windows Mobile devices, if the host synchronization parameter was not supplied, applications would have tried to connect to a MobiLink server running on the machine they had an ActiveSync partnership with. Unfortunately, on Windows Mobile 5.0 devices, this operation could have failed. This has now been fixed.
409006 The server could have deadlocked at the end of an on-line backup if at least two other concurrent transactions performed various unsafe actions. This has been fixed.
409091 The changes for Engineering case 399512 introduced a bug in calculating a page offset, that failed to recognize the amount of space left on the page when a checksum was present on the page. This has now been corrected.
409230 A performance degradation may have been observed when executing queries with proxy tables to an ASE Remote Server with the JDBC based server class 'asejdbc'. This was due to a memory leak in the Java heap that could lead to heap exhaustion and cause the Java garbage collector to run continuously. This problem has been fixed.
409231 The the graphical version of the Dbmlsync Integration Component (ActiveX) allowed no more than 30,000 characters to be added to the log window Further output was ignored, however synchronization continued normally. This limit is implosed by Windows on Edit controls. To fix this problem, once the Edit control is full, lines will be deleted from the top of the output to make room so that new lines can be added at the bottom
409233 The QAnywhere Agent could have transferred unnecessary data during synchronizations, causing message transfer to be slightly slower. This has been fixed.
409283 If an SMTP email was sent using the xp_sendmail procedure, and the engine received a socket timeout error for a socket receive, the next xp_sendmail or xp_stopsmtp call would have caused the server to crash. This has been fixed.
409320 When retrieving long varchar fields using a client side ADO recordset, a null character was appended to the end of the data by the OLEDB provider. This problem has been fixed.
409377 If the -clrVersion or -clrFlavor .NET command line options were specified when starting the MobiLink server, the MobiLink server would have reported that the options were invalid, or not specified correctly. The MobiLink server will now properly parse and accept these two .NET options.
409523 Attempting to use the Grouping() function as a window function would have caused a server crash, rather than giving an error. This has been fixed.
409529 When tens of thousands of messages were directed to a QAnywhere JMS connector (bridge), the connector would have processed the messages very slowly; for example, depending on hardware, OS, and other software, the connector might have handled only one message every few seconds. This has been fixed, resulting in approximately a 10-fold improvement in QAnywhere JMS connector performance in sending QAnywhere messages into JMS. This fix requires a schema change to existing ASA consolidated databases. To implement this schema change, start the QAnywhere server dbmlsrv9 with the additional command line parameters:

-sl java { -Dianywhere.qa.db.upgradeDeliveryColumns=true }

During start-up, the QAnywhere server will change the schema. Note that the schema change should be considered irreversible. That is, it will not be possible to go back to an earlier version of the software. Once the schema change has completed, it is no longer necessary to start the QAnywhere server with the additional command line parameters.

409599 When starting a database with a writefile that required recovering, the server could have crashed or failed with the error "Assertion failed: 102300 File associated with given page id is invalid or not open". This has now been fixed.

Note, the database is not corrupt and will recover correctly when started with a server with this fix.

409734 It was possible for a call to an external function or procedure to have failed without generating a SQL error. This was very unlikely and would only have occurred when all other database request tasks (as set by the -gn server switch) were internally blocked at the time the call was issued. In these cases, the request that issued the call was terminated by the server to prevent deadlock, but the SQLSTATE_THREAD_DEADLOCK error was not set for that connection. This has been fixed by setting SQLSTATE_THREAD_DEADLOCK when this failure arises. Additionally, under these circumstances, there was a very small window of opportunity where an external function call failure could cause the server to crash, most likely when being shutdown. This has also been fixed.
409768 Support has now been added for 32-bit Itanium clients on HP-UX 11i v2 (HP-UX 11.23) IPF.

Note that starting with this build, HP-UX 11i IPF versions prior to HP-UX 11i v2 (HP-UX 11.23) are no longer supported.

For details on HP's HPUX 11i support, see:

http://www.hp.com/products1/unix/operating/oeurjuly05.html

409772 The server may have crashed when executing a query with a subselect, if the subselect caused an error when describing the result set. This has been fixed.
409773 If an error occurred while executing a subquery, then there is a chance that the server would have left heap unfreed. This has now been fixed.
409857 The QAnywhere Agent incremental upload option (-iu) did not work well when the network connection was lost during an upload. If there was a large amount of message data to be uploaded, and the network connection was lost any time before all of the data was committed on the server, all of the data would have been re-uploaded in the next synchronization with the server. This has been fixed so that now QAnywhere synchronizes approximately the amount of data specified by the incremental upload option in the upload of each synchronization. This means that if the network connection is broken, the messages that were uploaded in successful synchronizations before the break do not have to be re-uploaded in the next synchronization. This option may also be set by a QAnywhere application using the message store property "ias_MaxUploadSize".

Note that at least 1 message will be in each upload (if there are messages queued) and the QAnywhere Agent does not split messages. Therefore, the incremental upload size is an approximation, and it will be a poor approximation if there is a message to be uploaded that is many times larger than the incremental upload size.

Example: The default incremental upload size is 256K, so if the average message size is 256 bytes and the maximum message size is not too large, then approximately 1000 messages will get transferred to the server per synchronization. The synchronizations will continue until all queued messages are transferred to the server, or until the connection is broken. The batches of messages that were successfully transferred to the server will not be transferred again.

409861 The server could have failed with the error - "Assertion failed : 101412 Page Number on page does not match the page requested" or possibly crashed. This has been fixed.
409958 When synchronizing with the Palm HotSync conduit, the HotSync connection could have been timed out if the UltraLite application (with record-based data store) required a long synchronization. The error: -309 - 'Memory error -- transaction rolled back' would then be signalled. This has been fixed. Now the worker thread handles all communication between HotSync and MobiLink, which prevents any device timeouts due to the long communication between HotSync and the MobiLink server.

In addition, the HotSync dialog is now properly updated - the "Exchange" arrows indicator is kept progressing while the connection is kept alive.

410007 The QAManagerBase.GetQueueDepth methods could have returned incorrect values for the QueueDepthFilter.ALL and QueueDepthFilter.OUTGOING arguments. These methods may not have counted outgoing messages that were in the process of being uploaded. If the upload then failed, the GetQueueDepth methods could have indicated fewer outgoing messages in the queue than were actually there. This has been fixed so that now outgoing messages are counted until they have been successfully transferred to the server.
410109 The next M-Business Anywhere release, version 6.0, will begin supporting UTF8-encoded webpages on Windows platforms (PocketPC and XP Desktop). This will cause incompatibility problem with UltraLite for M-Business Anywhere (ULPod) 9.0.2, as ULPod assumes the webpage is encoded with the local codepage of the device (ISO encoding), when it converts strings passed from the PODS engine into Unicode strings, and then pass it to the UltraLite runtime. If the string is UTF8 encoded, the conversion will be wrong and the data will be lost.

A new feature has been implemented which will allow ULPod to tell how the string coming from the PODS engine is encoded, and use the correct conversion parameters to convert it to, or from, Unicode. This new feature is only enabled on Windows platforms, as M-Business Anywhere for Palm OS does not yet support UTF8.

410139 Attempting to send a message using QAnywhere Central while connected to a client message store did not work. Right-clicking the client message store tree icon, and selecting "Send Message", would have opened a dialog for authoring a message, but nothing would have happened when clicking the "Send" button to send the message. The dialog would not have gone away, and the message would not have been sent. This has now been fixed so that messages can be sent as normal.
410251 If the MobiLink Client's DownloadReadSize extended option was specified, it would report an error like the following:

Invalid option "<value>"

where <value> was the value the option was set to, (i.e. -e drs <value>). The drs option was being treated as a boolean value, when in fact it is a numeric value. This has been corrected, and the error will no longer be reported

410259 Microsoft has recently released Visual Studio 2005, which includes version 2.0 of the .NET Framework and the .NET Compact Framework. A new driver for SQL Anywhere support of ADO.NET 2.0 is now available, which consists of the following new files:

<install dir>\win32\VS8\iAnywhere.Data.AsaClient.dll

<install dir>\win32\VS8\iAnywhere.Data.AsaClient.dll.config

<install dir>\win32\VS8\policy.9.0.iAnywhere.Data.AsaClient.dll

<install dir>\ce\VS8\iAnywhere.Data.AsaClient.dll

<install dir>\ce\VS8\iAnywhere.Data.AsaClient.gac

The ADO.NET reference manual has also been updated to describe the new features of ADO.NET 2.0. The new documentation files are:

<install dir>\docs\dbpaen9.chm

<install dir>\docs\pdf_en\dbpaen9.pdf

Compact Framework version 2.0 programs cannot be built with assemblies built with version 1.0. The following new files are versions of the existing .NET assemblies built with Compact Framework version 2.0.

<install dir>\ce\VS8\iAnywhere.QAnywhere.Client.dll

<install dir>\ce\VS8\iAnywhere.QAnywhere.Client.gac

<install dir>\ce\VS8\iAnywhere.QAnywhere.Client.xml

<install dir>\UltraLite\UltraLite.NET\ce\VS8\iAnywhere.Data.UltraLite.dll

<install dir>\UltraLite\UltraLite.NET\ce\VS8\iAnywhere.Data.UltraLite.xml

<install dir>\UltraLite\UltraLite.NET\ce\VS8\iAnywhere.UltraLite.dll

<install dir>\UltraLite\UltraLite.NET\ce\VS8\iAnywhere.UltraLite.xml

410263 Microsoft's Visual Studio integration has been extended with the release of the SQL Anywhere Explorer. The Explorer allows you to create connections to SQL Anywhere databases and browse the contents of tables and columns within the Visual Studio environment, in a manner similar to the Server Explorer. The accompanying toolbar can be used to launch Sybase Central and Interactive SQL from within Visual Studio. The Explorer supports browsing of the database structure and allows drag-and-drop operations to populate forms with controls. The SQL Anywhere Explorer supports both Visual Studio 2003 and Visual Studio 2005. The explorer is installed within Visual Studio by default when running the setup program. Both the explorer and the toolbar can be started by selecting them from the View menu in Visual Studio. There is no documentation yet for the SQL Anywhere Explorer, but Visual Studio users who are already familiar with the Server Explorer will find that it works in a very similar manner.

New files include

<install dir>\win32\iAnywhere.VSPackage.AsaClient.dll

<install dir>\win32\SetupVSPackage.exe

<install dir>\win32\1033\iAnywhere.VSPackage.AsaClientUI.dll

<install dir>\win32\VS8\iAnywhere.VSPackage.AsaClient.dll

<install dir>\win32\VS8\SetupVSPackage.exe

<install dir>\win32\VS8\1033\iAnywhere.VSPackage.AsaClientUI.dll

414410 Executing CREATE INDEX and DROP INDEX statements with Dynamic SQL could have caused databases to become corrupt. This has been fixed.
414454 Attempting to create and populate a table using SELECT ... INTO could have failed if the table owner of the new table was different than the current user. The table would have been created but not populated, and a "table not found" error would habe been returned. This has been fixed.
414939 It was possible, although very unlikely, for the server to crash if cache warming was enabled. This has now been fixed.
415025 When the Dbmlsync Integration Component was used if a synchronization ended because of an error, or because the stop method was called, the EndDownload event may have been fired and the values passed to it for the number of rows deleted and upserted by the download would have been incorrect. This problem was transient and would usually not reproduce consistently. This has now been fixed.
415161 Attempting to start the server on NetWare 6.5 with Service Pack 3 installed would have caused the message "In LibC, NXSemaInit reports attempt to reinitialize lock from DBSRV9.NLM" to be displayed, and then the server would have hung. This has been fixed. Note that other versions of NetWare are not affected. NetWare 6.5 with SP 4 installed does not experience the problem.
415245 On some systems running Windows XP, the graphical administration tools (i.e. Sybase Central, Iteractive SQL, the MobiLink Monitor and the Console utility) could have crashed on startup if the Windows desktop was configured to use the "Windows XP style" for the "Windows and buttons" setting. While it is still unclear as to the cause, a work-around for this problem is being provided.

After installing the EBF, create a file called "temp.reg", and paste the following lines into it:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Sybase\Sybase Central\4.3\VMArgs]

"-Dswing.noxp"="1"

[HKEY_LOCAL_MACHINE\SOFTWARE\Sybase\Adaptive Server Anywhere\9.0\DBISQL\VMArgs]

"-Dswing.noxp"="1"

[HKEY_LOCAL_MACHINE\SOFTWARE\Sybase\Adaptive Server Anywhere\9.0\DBConsole\VMArgs]

"-Dswing.noxp"="1"

[HKEY_LOCAL_MACHINE\SOFTWARE\Sybase\Adaptive Server Anywhere\9.0\DBMLMon\VMArgs]

"-Dswing.noxp"="1"

and then run the file. If the "Fast Launcher" feature of Sybase Central or DBISQL has been enabled, log out and then log back in again for the changes to take effect.

While this procedure will prevent the programs from crashing, there will be some visual anomalies, such as an incorrect background color for the menu bar. These defects aside, the programs will function normally.

415425 There were problems with the Java administration tools when they were run on a secondary monitor. When the application window was run on the secondary monitor, context menus would have appeared on the primary monitor. For dbisql and dbconsole only, if the application window was last closed on a secondary monitor, it would always have appeared on the primary monitor, rather than on the secondary monitor, the next time they were run. These problems have now been fixed.
415537 Changes have been made to UltraLite.NET to allow it to integrate with Visual Studio 2005 (VS2005).

- In Smart Device and Windows projects, a reference to the iAnywhere.Data.UltraLite.dll is available in the "Add References" dialog box.

- The SyncProgressDialog can be added to a project by selecting Project, Add New Item.

- The ULConnectionParms controls are available, but must be added manually as described below due to a problem in Visual Studio 2005. If a Compact Framework DLL is added to the GAC before one of its controls is added to the VS2005 toolbox, the control will be permanently greyed out.

In the instructions below, <VS2005InstallDir> refers to the installation directory of Visual Studio 2005. For example, "C:\Program Files\Visual Studio 2005\"

To add the ULConnectionParms controls to the toolbox, do the following after the install:

1. Open the Visual Studio 2005 program.

2. Go to Tools, Choose Toolbox Items.

3. Note that there is already an iAnywhere.Data.UltraLite DLL with "Global Assembly Cache" as its Directory.

4. Add the following DLL by clicking Browse:

<VS2005InstallDir>\SmartDevices\SDK\CompactFramework\2.0\v2.0\WindowsCE\iAnywhere.Data.UltraLite.dll

5. Check ULConnectionParms for the two iAnywhere.Data.UltraLite DLLs from steps 3 and 4. Press OK.

6. Finally, in a command prompt (or the <Start>, Run dialog) , run

<VS2005InstallDir>\SDK\v2.0\Bin\gacutil.exe -i <VS2005InstallDir>\SmartDevices\SDK\CompactFramework\2.0\v2.0\WindowsCE\iAnywhere.Data.UltraLite.dll

415756 If the server was running a database without a transaction log, and a request was cancelled (or closed by the client) during a commit, the server could have started running at 100% CPU usage. If this happened, the server would also have hung on shutdown. This could also have happened when running with a transaction log, if a CREATE DBSPACE, ALTER DBSPACE or DROP DBSPACE was cancelled. This has now been fixed.
415767 If the MobiLink client was running on a schedule, and had successfully synchronized, in very rare circumstances, it was possible for a failed synchronization to result in the section of transaction log that was scanned during the failed synchronization to not be scanned again in the next synchronization. This has now been fixed.
415776 On UNIX platforms, if the locale (environment variables LC_ALL, LC_MESSAGES, LC_TYPE, or LANG) was set to something invalid or unrecognized, the server, or one of the client tools, may have crashed on startup. In particular, all locale names ending with ".UTF-8" and all locale names ending with ".utf8" except for ko_KR.utf8, mk_MK.utf8, se_NO.utf8, tr_TR.utf8 and univ.utf8 were affected. This has now been fixed.
415787 The QAnywhere Agent Stop utility was missing a usage message. This has been fixed. The usage is displayed with the command "qastop -?".
415859 The server may have crashed while running the Java VM Garbage Collector. The crash would have occurred if some time before a very long array or string was allocated and during the allocation of pieces of that array or string the Garbage Collect ran more than once. This has been fixed.
415862 It was possible for a small amount of cache memory to not have been freed if the Java VM's garbage collector ran for a request that used the VM, and that request has been cancelled. This has now been fixed.
415863 The server may have crashed while running the Java Virtual Machine's garbage collector, if multiple connections run the garbage collector at the same time. This problem was more likly to have occurred on Unix systems and multi-cpu machines. This problem has been fixed.
415877 If the authenticate_parameters method was being used as the only method of authentication for the MobiLink server, and users were automatically being added to the ml_user table during synchronization with the -zu+ command line option, and an error occurred when authenticate_parameters was called, or authenticate_parameters returned an authentication status indicating failure, then the MobiLink user would still have been added to the ml_user table. The MobiLink user is now removed from the ml_user table if the authenticate_parameters fails to authenticate the user.
415893 On UNIX platforms, locale names ending with ".utf8", with the exception of ko_KR.utf8, mk_MK.utf8, se_NO.utf8, tr_TR.utf8 and univ.utf8, were not being correctly recognized as UTF-8 locales and were instead treated as ISO8859-1 locales. Locale names that instead ended with ".UTF-8" were recognized correctly. This has been fixed.
415894 The DLLs in <install dir>\ultralite\UltraLite.NET\ce\x86 were version 9.0.2.3211 in all EBFs from build 3212 on, and hence were unusable. UltraLite.NET would have reported an error like "Unable to load dll ulnet9.0.2.3221" (where 3221 was the build of the EBF). Other CE platforms were not affected. These DLLs are now properly updated.
415897 On HP-UX, a non-threaded ODBC application using the ODBC driver could have hung, or crashed at start-up, if the application was linked against a third library that was in turn linked against the libpthread library. This has been fixed by changing the method for detecting the threading model.
415899 If there was an .odbc.ini file in the current directory, the Data Source utility would always have used it, regardless of any environment variable settings. This has been fixed.
415979 When the server was using a database file that was located on another machine via Windows file sharing, or was located on the local machine but referenced using a UNC name (such as \\mymachine\myshare\mydb.db), it could have failed with one of the following errors (and possibly other assertion failures and fatal errors, including OS error 58):

I/O Fatal error: Unknown device error

Assertion failed: 201125 Read Error with OS error code: 64

The problem only occurs on certain machines with certain patches and/or hardware and/or drivers, the specifics of which have not been completely identified. The problem is related to scattered reads (aka "group reads") -- see the documentation to determine when the server may use scattered reads. The server now works around this OS problem by disabling scattered reads for files accessed by remote file sharing, or by UNC reference.

415985 The documented order of events in the prepare_for_download transaction has been incorrect since the feature first appeared in 7.0.1. The correct order is:

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

prepare_for_download

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

modify_last_download_timestamp

prepare_for_download

if( modify_last_download_timestamp script is defined

or prepare_for_download script is defined ) {

COMMIT

}

Previous documentation had the order of the scripts reversed. The above order was chosen because the last-download timestamp (LDT) affects the content of the download. If the LDT is being modified, it must be modified before the download logic kicks in (ie. in the prepare_for_download script or in the download scripts).

415999 When there were tens of thousands of messages directed to a QAnywhere JMS connector (bridge), the connector would have processed these messages very slowly. For example, depending on your hardware, OS, and other software, the connector may have handled only one message every three seconds. This has been fixed, which should result in a roughly 10-fold improvement in QAnywhere JMS connector performance in sending QAnywhere messages into JMS. A schema change to the Oracle consolidated database is also required. To make this schema change, start the QAnywhere server dbmlsrv9 with the following additional command line parameters:

-sl java { -Dianywhere.qa.db.upgradeDeliveryColumns=true }

During start-up the QAnywhere server will change the schema. Note that the schema change should be considered irreversible. That is, it will not be possible to go back to an earlier version of the software. Once the schema change has completed, it is no longer necessary to start the QAnywhere server with the additional command line parameters.

416088 The MobiLink server's .Net scripting only supported version 1 .NET CLR. The MobiLink server would have failed to start if it attempted to load version 2 .NET CLR. The error reported in the log was: " [-10192] Could not create domain 'DefaultMobiLinkDNetScriptingDomain' ". The -clrVersion option could have been used to force the loading of a version 1 .NET CLR, if the fix for Engineering case 409377 had been included in the version of the software, (i.e. -sl dnet(-clrVersion=v1.0.3705 ... ). Now support has been added for .NET CLR version 2 as well.
416223 The literals TRUE and FALSE can be used in client-side transmission rules, however, the client-side rule processing code was treating these literals no differently than a message property reference. Hence, unless the message being evaluated happened to have a property TRUE or FALSE, TRUE or FALSE was being evaluated to NULL. That is, if there was a rule "myboolprop = TRUE", where myboolprop was a boolean typed message property, the rule would never evaluate to TRUE. The work-around is to use the literal 1 in place of TRUE and 0 in place of FALSE. This has now beeen fixed so that TRUE and FALSE are correctly recognized as boolean literals.
416233 The literals TRUE and FALSE can be used in server-side transmission rules, however, the server-side rule processing code was treating these literals as invalid literals. Hence, an error would have occurred while processing the rule indicating that TRUE or FALSE was not valid syntax. This has now beeen fixed so that TRUE and FALSE are correctly recognized as boolean literals.
416332 If a call was made to SQLColAttribute, SQLColAttributeW, SQLGetDescField or SQLGetDescFieldW ( and the deprecated ODBC 2.0 functions SQLColAttributes and SQLColAttributesW) with a NULL pointer value, no error would have been reported and the function would have returned SQL_SUCCESS. This is illustrated by the following code fragment:

SQLRETURN res = SQLColAttribute(hstmt, SQLUSMALLINT(i), SQL_DESC_COLUMN_TYPE, 0, 0, 0, 0);

switch ( res ) {

case SQL_SUCCESS:

case SQL_SUCCESS_WITH_INFO:

break;

default:

ODBC_error(henv,hdbc,hstmt);

break;

}

This problem has been fixed.

416428 When using a secure (i.e. https) web services client function, if the https connection to the remote host failed, the error message said simply "The secure connection to the remote host failed". This same error message would also have been returned if the certificate file could not be found or was corrupt. The error message now contains more information as to why the connection failed (eg. certificate file not found, certificate expired, server closed connection, handshake failed, etc.) library to the error message.
416442 When running the 64 bit version of the driver, a call to SQLColAttributes or SQLColAttributesW would have returned invalid datatypes for SQL_COLUMN_TYPE. The results would have been either -1 or a large number such as 2147482128. A 32 bit pointer was being returned instead of a 64 bit pointer. This has been corrected.
416461 The QAnywhere JMS connector was doing more processing of messaging incoming from JMS than was necessarily. Although this problem did not affect correctness, it could have affected performance. If an incoming message had many properties, the performance impact of the problem may have been noticable, with the larger the number of properties the larger the performance impact. This has now been fixed so that there is no longer a performance impact with respect to the number of properties in the incoming message.
416564 Two new commandline options have been added to the Data Source utility.

The ODBCINI and ODBCHOME environment variables are used to tell the ODBC driver and Data Source utility where to find the .odbc.ini file. If these environment variables were set to files that did not exist, a search for the .odbc.ini file was done in the user's home directory, and if not found, the path was searched. If a file was found, that file was used. If no file is found, one was created in the user's home directory. The -ns option now tells the Data Source utility not to search for the .odbc.ini file, but to use the existing environment variables to determine where the file should be. This is only useful when (a) the file specified by one or more of the environment variables does not exist, AND (b) a DSN is being created.

The -f option tells the Data Source utility to display the name of the .odbc.ini file that is being used. For example, "dbdsn -f -l" will display the name of the .odbc.ini file being used, and then list the DSNs in that file.

416625 The M-Business client would have crashed on File | Sync. If ulpod9.dll was removed from the client machine, the crash no longer occurred. When the client performs a sync, it sends a PODS_NOTIFY_PRESYNC event to the ULPod component. ULPod uses this chance to close the current UltraLite database connection, so that the same database can be opened later by ulconnect.exe for one-button-sync. The connection was closed by calling the Close() method on the Connection pods object, which in effect destroyed the Connection pods object. The has been fixed by adding an internal method to the Connection object that does the same thing as Close(), except it does not destroy the Connection object itself. The PODS_NOTIFY_PRESYNC event handler now calls this function instead of Close().
416729 When creating proxy tables using an ASAJDBC server class, some memory was not released from the Java heap. This has been fixed.
416755 A complex query in a recursive union could have caused predicate inference problems in the optimizer. The reported symptom was an infinite loop. The exact conditions are difficult to characterize, but the minimum complexity that produces the problem involves a derived table in one of the branches of the recursive union that itself contains a subquery and a join that uses both an ON condition and a WHERE clause. The problem is now fixed.
416772 The Unload utility may not have properly unloaded a remote database that was involved in synchronization, causing the reload file generated to contain syntax errors. This would have occurred if any of the options for synchronization users or synchronization subscriptions in the remote database had been completely dropped with:

ALTER SYNCHRONIZATION USER ml_username DELETE ALL OPTION

or

ALTER SYNCHRONIZATION SUBSCRIPTION

TO publication-name

[ FOR ml_username, ... ]

DELETE ALL OPTION

This problem has now been fixed.

416876 Attempting to add ASA.Net Data objects ( AsaConnection, AsaCommand, AsaDataAdapter ) to the Visual Studio .NET toolbox would have resulted in an error dialog. This was due to some required .NET attributes being missing. This has been fixed by adding the attributes.
416906 Starting the MobiLink server with an invalid connection parameters would have caused the service to hang. The only way to remove the hung process was to use the Task Manager. A semaphore which signaled that initialization had completed was not being set in this particular error case. This has now been corrected.
417129 The Idle Timeout value was being ignored when the server was running on NetWare or Unix systems, other than 32-bit Linux. This would have caused idle connections to stay connected indefinitely. This has been fixed.
417130 The fix for Engineering Case 416089 exposed a bug in the iAnywhere JDBC driver which caused the Interactive SQL utility, and other applications, to crash when fetching result sets. Note that this problem only happened with 64-bit clients. This problem has been fixed.
417145 When tens of thousands of messages were directed to a QAnywhere JMS connector (bridge), the connector would have processed the messages very slowly; for example, depending on hardware, OS, and other software, the connector might have handled only one message every few seconds. This has been fixed, resulting in approximately a 10-fold improvement in QAnywhere JMS connector performance in sending QAnywhere messages into JMS. This fix requires a schema change to existing Microsoft SQL Server consolidated databases. To implement this schema change, start the QAnywhere server dbmlsrv9 with the additional command line parameters:

-sl java { -Dianywhere.qa.db.upgradeDeliveryColumns=true }

During start-up, the QAnywhere server will change the schema. Note that the schema change should be considered irreversible. That is, it will not be possible to go back to an earlier version of the software. Once the schema change has completed, it is no longer necessary to start the QAnywhere server with the additional command line parameters.

417335 The Lithuanian translation of error -100, Server not found, was improved.
417411 When using a moving window aggregate specified with a RANGE (not ROWS) clause, an incorrect value of the aggregate was possible in rows following a row where the RANGE specification resulted in an empty window. This has now been fixed.
417414 Changing the MobiLink Script Version field in the "Generate Consolidated Database and MobiLink Scripts" dialog did not update the actual script version in the generated MobiLink scripts. This has been corrected.

Workaround: After generating scripts with a new MobiLink script version, use File|Save to save the schema. This will update the underlying meta information file. Then generate the scripts again, the new MobiLink script version field will now be used.

417496 Negative integer values exported to an Excel spreadsheet were exported incorrectly (the values were incorrect). DOUBLE, FLOAT, NUMERIC, and REAL values were not affected. The INTEGER record in the Excel BIF format is implicitly unsigned, but signed numbers were being written. This has been fixed by writing negative integers as NUMBER records instead.
417500 When an array of parameters was used as input to an ODBC execute (for example, to insert more than one row with one SQLExecute), some of the parameter values could have be sent to the server incorrectly. It was possible for this to have occurred if CHARACTER or BINARY data was used, and the data size for a particular column was slightly larger in subsequent rows than previous rows within a single array of parameters (for example, if the first row in the array had a value of length 1000, and the second row in the array had a value of length 1050 for the same column). This has now been fixed so that the data is correctly sent to the server in this situation.
417512 An outer reference from a derived table to an alias should always give an error. If the derived table was a UNION, INTERSECT or EXCEPT, the server would have crashed instead. This has now been fixed.
417598 If a web service procedure received an HTTP status of 300, 303, 405, or 406 from the remote web server, the error status would have been displayed as "<status number> Unused". For example, if the error code 405 was returned from the web server, the error displayed would have been "405 Unused" instead of "405 Method Not Allowed". This has now been corrected by adding meaningful strings for these errors.
417622 The OLE DB schema rowsets (e.g., INDEXES) are supported by stored procedures like sa_oledb_indexes (and others). They return result sets that allow for table names and other identifiers up to 128 characters in length. However, the input parameters to these stored procedrues only allowed for identifiers of up to 80 characters in length. This problem has been fixed so that parameters can now be up to 128 characters in length.
417837 When the ADO methods AddNew() or Update() were called, a memory leak would have occurred in the OLE DB provider. This problem has been fixed by appropriately freeing the allocated memory.
417847 The rdbmsSrvLimitedResourceTable.rdbmsSrvLimitedResourceID entry was returning an OID that was either invalid or referred to an unrelated entry in the MIB. This entry should return the OID of the limited resource in question (which in ASA's case, is either licenses or processors), but the OID that was returned referred to the asaSrvStat subtree rather than the asaSrvProp subtree. This has been fixed.
417863 Calling a stored procedure that referenced a user-defined function in the search-condition of an IF statement could have crashed the server if the function called a procedure with OUTPUT or INOUT parameters defined as NUMERIC, and then called another procedure. This has been fixed. A workaround is to move the function call to an assignment statement preceding the IF.
417977 If an ASA process (such as dbremote, dbmlsync or dbmlsrv8) had been started as a service, it was possible for the process to hang when the service was shut down. This has been corrected so that these services now shutdown correctly.
417998 If the Interactive SQL utility, when launched from Sybase Central, was closed by clicking its close button after the server to which it was connected had already been stopped, Sybase Central could have crashed. This has now been fixed.
418073 If a new default SecurityManager for Java was installed in the database, and the class for it had not been installed in the database, all queries that included java columns would have failed with the error "Exception occured while loading Java SecurityManager". A query of the catalog table dbo.JAVAUSERSECURITY would also have failed for the same reason. This has now been fixed by adding, or updating, a new Java SecurityManager only if its class has already been installed. The above error may still occur if a user installs their own Java SecurityManager that cannot be loaded for some reason. In this case the user supplied SecurityManager would have to be deleted manually from JAVAUSERSECURITY and the server restarted.
418255 Using Dynamic SQL with the Palm OS Emulator (POSE), could have caused an exception during the execution of a CREATE INDEX statement. This was been corrected.
418264 It was possible, although very unlikely, for the server to crash, or for connections to deadlock and appear to hang, in the presence of concurrent DDL statements. For one of these failures to have occurred, these concurrent statements would generally have to refer to the same database object (i.e.,table, column or stored procedure, etc), either directly or indirectly. A workaround is to serialize all DDL requests that references the same object. This has been fixed.
418346 If two or more users with DBA authority granted the same column update permission to a user, these column permissions could then only have been revoked by revoking the table update permission. Any attempt to revoke the column update permission would have failed with the error "You do not have permission to revoke permissions on <table>". This has been fixed.
418500 If the Interactive SQL utility encountered an error while fetching the results of a statement, it could have left the "Execute" toolbar button disabled indefinitely, even after it reported the error to the user. This has been fixed.

The workaround for this problem is to interrupt the statement by clicking the "Stop" toolbar button.

418909 A new method has been added to the SyncParms pods object:

setMBAServerWithMoreParms( String host, String port, String url_suffix, String additional )

This new feature came from requests to specify a proxy server's host/port with ULPod one-button-synch. This new method augments the existing SyncParms.setMBAServer() method by adding the new string argument "additional".

The new "additional" argument gives user a chance to specify additional stream parms, such as proxy host, proxy port, or other security-related parameters.

418929 The QAnywhere .NET assembly for Compact Framework 2.0 was not strongly named. This has been fixed. It is now strongly named with the same public key as the QAnywhere .NET assembly for Compact Framework 1.0.
419140 When the MESSAGE statement was called with the TO CLIENT clause, the registered event handlers of AsaConnection.InfoMessage were not called. This problem has been fixed so that registered event handlers are now correctly called.
419146 If a QAnywhere server operating against an ASE consolidated database, was terminated unexpectedly while a QAnywhere JMS connector was processing a QAnywhere message destined for JMS, it was possible that when the QAnywhere server was restarted the QAnywhere JMS connector would not be able to process any subsequent messages. The problem was with the message that was being processed during the crash. It can be worked around using the GUI administration tool QAnywhere Central. Using QAnywhere Central, determine which message is causing the problem (The address of the message will be the connector address, and the state of the message will be "receiving"), select and export the message, cancel the message, wait for the message to be deleted, then use the exported message to create a new message containing the same content, headers and address. There is a simpler work-around involving the use of the tool dbisql. This work-around involves deleting the record indicating the "receiving" state for the message, but this should only be attempted with the assistance of Technical Support. This problem has now been fixed so that neither of these the work-arounds are needed.

Note that this problem does affect QAnywhere server running against ASA, Oracle, DB@ or Microsoft SQL Server.

419165 The documentation indicates that server-side transmission rule times could be like '1:00am'. In fact, the default time format is hh:mm:ss, where hh uses the 24 hour clock. Hence, using an AM or PM suffix is not valid, but the error reporting and detection did not always report an error. If, for example, the time '1:00:00 PM' was used, the PM portion of the time was ignored, and the time was treated as 1:00:00 AM. This has been corrected so that such a time is now reported as an error.

The documentation also did not indicate indicated how a user can change the default time and date formats used by the QAnywhere server. To set the time format, set the property ianywhere.qa.server.scheduleTimeFormat to a value describing the time format. This property can be set in several different ways. If the server uses a configuration file (using the -m <file-name> MobiLink command line option), then a line can be added to the file as follows:

ianywhere.qa.server.scheduleTimeFormat = hh:mm:ss a

This property can also be set using the GUI tool QAnywhere Central, by clicking on the server properties tab and adding the property. The time format values are identical to those used in Java by the java.text.SimpleDateFormat class (the default time format is HH:mm:ss):

Letter Time Component

a Am/pm marker (AM/PM)

H Hour in day (0-23)

k Hour in day (1-24)

K Hour in am/pm (0-11)

h Hour in am/pm (1-12)

m Minute in hour (0-59)

s Second in minute (0-59)

Time Format Example Time

HH:mm:ss z 12:08:56

h:mm a 12:08 PM

K:mm a 0:08 PM

hh:mm aaa 12:08 PM

HH:mm:ss 12:08:56

HHmmss 120856

To set the date format, set the property ianywhere.qa.server.scheduleDateFormat to a value describing the date format. This property can be set in several different ways. If the server uses a configuration file (using the -m <file-name> MobiLink command line option), then a line can be added to the file as follows:

ianywhere.qa.server.scheduleDateFormat = yy:MM:dd

This property can also be set using the GUI tool QAnywhere Central, by clicking on the server properties tab and adding the property. The date format values are identical to those used in Java by the java.text.SimpleDateFormat

class (the default date format is yyyy-MM-dd):

Letter Date or Time Component

y Year

M Month in year (ie July, Jul or 07)

d Day in month

Date Format Example Date

yyyy.MM.dd 2001.07.04

yyyy.MMMMM.dd 02001.July.04

d MMM yyyy 4 Jul 2001

yyMMdd 010704

Note that the software does not need to be upgraded your to use the two date and time formatting properties.

419284 The iAnywhere JDBC Driver can be used to fetch blobs from a server, but if the underlying ODBC driver returned an unexpected error code when fetching the blob, then the JDBC driver may have crashed or run out of memory. Note that this problem was more likely to occur with ODBC drivers for servers other than SA. This has been fixed by having the JDBC driver throw a SQL Exception when the ODBC driver returns an unexpected error.
419347 Using Dynamic SQL could have caused an exception during the execution of a SQL query. For this to occur, the SELECT statement must have contained an ORDER BY clause, and no index could be used to achieve the ordering. The statement must also have contained a GROUP BY clause whose items all occur in at the start of the ORDER BY clause, in some order, and must also contains a HAVING clause. This problem has now been fixed.
419399 There have been circumstances where the QAnywhere JMS connector would receive a RuntimeException from either the JDBC driver or the 3rd party JMS driver. The default behaviour of the JMS connector when it received this kind of exception was to terminate execution. Such exceptions have often been found to be transient or spurious, and that retrying the same operations often results in the problem going away. Because of this experience, the behaviour of the QAnywhere JMS connector has been changed to backoff and retry when receiving this exception. The backoff is exponential, increasing in time with each consecutive exception up to one minute (this default maximum can be configured using the connector property ianywhere.connector.pollingFrequency value in milliseconds).

Note that RuntimeExceptions are logged to the QAnywhere Server (MobiLink) console and log file. Typically, RuntimeExceptions represent bugs, and probably indicate that you need a fix for the component issuing the exception, for example, the JDBC driver or JMS driver.

419414 If a nested transaction was started with a BEGIN TRANSACTION statement, and two or more COMMITs were done one after the other to commit the nested transaction, the transaction may not have been committed. This has been fixed so that the transaction is now committed.
419563 UltraLite now supports Windows Mobile 5.0 devices. If using Embedded Visual C++ 3.0 or 4.0, the existing runtimes can continue to be useed. However, new runtimes (installed under ultralite\ce\arm.50) are required when using Visual Studio 2005 to build an application.

Visual Studio 2005 compilers define the wchar_t type as the internal __wchar_t type, instead of unsigned short*, which is what was used in the previous CE compilers. Because of this, apps compiled with Visual Studio 2005 would trigger unresolved external errors when linked against the UltraLite runtime. As a work-around, an application can cast all wchar_t, ul_wchar, and TCHAR variables passed into the runtime to unsigned short* explicitly. Another work-around is to use the -Zc:wchar_t- compiler option, which will cause wchar_t to be defined as unsigned short *, though, this won't work if the app links against other libraries such as the MFC library that are compiled with Visual Studio 2005 without this option.

Note that the Visual Studio 2005 compatible runtimes do not support sync encryption on 9.0.2.

419668 In the presence of many undelivered messages in the QAnywhere server, message synchronization performance would have declined. This was largely due to poor performance of a number of three SQL operations being executed against the server message store. Two of these operations, that involved message delivery confirmation and message download preparation, were re-structured to dramatically improve performance. Applying the fix to the server is all that is required to get these benefits. The final SQL operation requires a schema change, and only is available for an Oracle consolidated database. These schema changes can be made in two different ways. The first is to run the QAnywhere server with the additional command arguments -sl java { -Dianywhere.qa.db.upgradeDeliveryColumns=true } successfully at least once. The second is to execute the following SQL against your Oracle database using SQL*Plus:

create global temporary table ml_qa_clients

( client varchar(255) not null ) on commit preserve rows

/

create index ml_qa_clients_index on ml_qa_clients( client )

/

drop index ml_qa_delivery_client

/

create index ml_qa_delivery_client on ml_qa_delivery(client,syncstatus,maxstatus,status)

/

create or replace trigger ml_qa_delivery_before_trigger

before insert on ml_qa_delivery

for each row

begin

insert into ml_qa_clients (client) values( :new.client );

select substr(:new.address,2,instr(:new.address,'\')-2) into :new.clientaddress from dual;

select :new.status into :new.maxstatus from dual;

begin

select seqno, priority into :new.seqno, :new.priority

from ml_qa_repository where msgid = :new.msgid;

exception

when NO_DATA_FOUND then

select 0, 4 into :new.seqno, :new.priority from dual;

end;

end;

/

Note that this must be executed under the same database user initially used to create the MobiLink QAnywhere schema.

419708 Subqueries with an ANY or ALL condition, that also contained both a DISTINCT and a TOP n clause (where n > 1), could have returned incorrect results. The server was incorrectly eliminating the DISTINCT, which meant that some rows could have been missed from the subquery. This has now been fixed.
419782 If a query contained an alias in the SELECT list, with the aliased expression containing an IF or CASE expression, where the predicate in the IF or CASE contained an EXISTS, ANY, or ALL predicate, and the aliased expression was used as an outer reference in another subquery, and the execution plan contained a materializing operator such as Hash Join, then incorrect results could have been returned for the IF/CASE expression and the referencing subquery.

The following query demonstrates the problem using the demo database:

select T2.dept_id,

( if exists ( select 1 from sys.dummy T4 where T2.dept_head_id <> -1 ) then 1 endif ) as S2,

( select 1 from sys.dummy T5 where S2 > 0 ) as S3

from

rowgenerator T0 with ( no index )

join department as T2 with ( no index )

on T0.row_num*100 = T2.dept_id

This has been fixed.

419802 Attempting to use Sybase Central to create a proxy table for a Microsoft Excel or Access database would have failed with the following error:

[Sybase][ODBC Driver][Adaptive Server Anywhere]Server '<server-name>': [Microsoft][ODBC Driver Manager] Driver does not support this function (-660)

The Sybase Central plug-in was calling the ODBC function SQLPrimaryKeys() to determine which columns in the table were part of the primary key. Some ODBC drivers (such as Access and Excel) do not support this call. Now, if the remote server is of type

"generic", any failures when this call is made are ignored, and no primary key information is displayed.

419832 The "Browse" buttons associated with the "ODBC Data Source file" and the "Database file" fields in the "Connect" dialog would have done nothing if "C:\" (or any other root folder) had first been entered in the field. This has been fixed.

Note, this problem also affected the Console utility, and the plug-in for Sybase Central.

419848 The UltraLite Interactive SQL utility should be able to connect to databases created on the desktop, Windows CE (i.e. Unicode databases) and Palm OS (either in the record store or on the VFS). However, it was failing to open an UltraLite database created by a Palm application on the VFS, returning a database not found error (sqlcode -954). This has been fixed.

Note, when attempting to connect to an UltraLite database created by a Palm OS application, and stored on the VFS, remember to include "palm_fs=vfs" in the connection string. This tells UltraLite that this Palm database uses the file store instead of the record store.

419897 When the server was running on NetWare, casting a string representing an overly-large number to a double or float could have returned the value '1.#INF', rather than setting error -158 (Value ... out of range for destination). This has been corrected.
419923 If a parameter to a procedure or function had the same name as a connection global variable, and the procedure was called from within a batch that passed the global variable as an argument, the value of the parameter would have been incorrectly set to NULL. This has now been fixed. A workaround is to change the parameter or global variable names to avoid duplication.
420042 An INSERT, UPDATE or DELETE statement may have incorrectly returned the error "Invalid statement", if the execution of the statement caused a trigger to fire, or an RI action was executed, and a subsequent statement then failed with a deadlock error. This has been fixed.
420137 On Unix systems, if an application autostarted a server, used ASA's embedded SQL function db_start_engine(), or used the Spawn utility to start a server, and the application was terminated abnormally by SIGINT, SIGQUIT, SIGTERM or some other unhandled signal (SEGV, etc), the server that had been started would shutdown unexpectedly, although cleanly. This has been fixed.

A work-around is to specify -ud on the server command line, although this has the side effect that the controlling application (e.g. dbspawn) will return/continue immediately before the server has fully started all of its databases, etc.

420171 A failed UPDATE statement, for example due to a deadlock error, could have resulted in a corrupted index. It is likely that only databases involved in replication would have been affected by this problem. A database validation with 'full check' would have detected that the index had missing values. This has been fixed, but dropping and re-creating an index in such a state will fix the corruption.
420179 Dynamic SQL could have produced incorrect results for comparisons, when the following conditions were true:

- a nullable column was being compared

- the nullable column occurred first in an index or foreign key

- the expression being compared was of a different type than the collumn and could be casted to the type of the column

- the index or foreign key could have been used as part of the plan to execute the query

This has now been corrected.

420382 There are situations where passwords used in Sybase Central, running on Unix systems, could be at risk of being discovered. Selecting the password field text and pasting it into another field, would have allowed the clear text password to be viewed. This has been fixed.

A full description of this problem is available at http://www.sybase.com/detail?id=1040117

420462 If a zero-length file was opened, the status bar text would continue to read "Loading <file name>", and a progress bar control would remain. This has been fixed so that the status text is cleared, and the progress bar is not present. Behavior for files with nonzero lengths is unchanged.
420496 On Palm T|X devices running the latest Palm OS v5.4.9, the OS can leave the record busy bit turned on when the device is reset. This could have caused UltraLite applications to fail on startup in the call ULAppLaunch(). A work around has now been implemented.
420588 The Data Source utility now supports encrypting the password when creating ODBC data sources. When the -pe command line option is specified, and a PWD entry is provided, the password in the PWD entry is encrypted and replaced by an ENP entry in the resulting data source.
420633 The Java code generated by the UltraLite Generator, could have contained a compilation error when a query contained both DISTINCT and ORDER BY clauses, and where a temporary table was required to satisfy the query. A extra semicolon was being generated following a RETURN statement. This \was then detected as a compilation error by some Java compilers. This has been fixed by eliminating the extra semicolon.
420743 The QAnywhere Agent could have taken several minutes to shutdown after the Shutdown button is clicked, if the MobiLink server was unreachable. This has been fixed. Now, the QAnywhere Agent shuts down immediately when the Shutdown button is clicked.
420745 If a database that had been running on a network server with about 100 concurrent connections or more, required recovery, attempting to recover the database on a personal server would have failed assertion 104901 - "Allocating Stream object for temporary connection failed". This has been fixed.

A workaround is to use the network server to recover the database.

420747 When the UltraLite statement property sheet was used to change an UltraLite statement's SQL statement, its code segment setting would have been cleared. This has been fixed so that the plug-in now re-applies the code segment setting whenever the SQL statement changes.
420749 On Linux and Solaris systems, the server command line option -ui ("automatically choose UI") was not being accepted, and would have resulted in the usage screen being displayed.

This has been fixed, and the switch now behaves as specified in the documentation.

420752 When run on Microsoft CE devices, the QAnywhere Agent could have crashed when invoked with command line parameters in a file, ie. qaagent @file. This has been fixed.
420807 If the optimizer chose a query execution plan with a "Hash Table Scan" operator, for a query that returned a string column, it was possible that a server crash could have occurred. This has now been fixed.
420864 While a database upgrade is in progress, event execution is not allowed. If a scheduled

event did fire during a database upgrade it was correctly not executed, but it was also incorrectly not scheduled for its next execution. This meant that the event would not have been executed again until the database was restarted. This has been fixed, so that now the event is rescheduled for the next execution.

420898 In certain cases, with download acknowledgements turned off synchronization through ActiveSync 4.x could have failed, even though the same sync would have worked through ActiveSync 3.x. The reason for the failure is that with ActiveSync 4.x, the internal proxy will time out the connection 15 seconds after the server has finished sending the data and closed its side of the connection, while with ActiveSync 3.x, the proxy would wait indefinitely for the client to finish reading all the data before closing the connection. Microsoft has indicated that this change was intentional, in order to avoid resource leaks. A change has been made to improve download performance which will increase the likelyhood that the client will finish reading the download before the time out expires.
420924 After calling the C# API QAManager Close() method, future calls to the QAManager did not throw exceptions as expected. This has been fixed. They now throw an exception as documented.
420933 The GetQueueDepth() method of QAManager returned a count which included messages that were already acknowledged. This has been fixed so that GetQueueDepth() now includes only pending messages in the QueueDepthFilter.OUTGOING case.
420934 Opening a QATransactionalManager and putting a message onto a queue without committing, creates an index lock on ml_qa_repository_client. This was preventing any other application from sending or receiving messages until the transactional manager executed a commit or rollback. This has been fixed by changing the view used by the QAnywhere client to get messages, ml_qa_messages_client, to use the WITH (READPAST) functionality recently added to the server, (see Engineering case 422513). The order of insert statements in QAManagerBase.putMessage was also changed to prevent another blocking issue.
421009 If a certificate was directly specified in a web procedure (i.e. using "certificate 'certificate=...'"), then it was possible that the connection would have failed with the error "Error parsing certificate file". This has been fixed. A workaround is to remove all whitespace in the certificate data.
421137 Database validation will now detect if the number of pages allocated to a particular table matches what is stored in the system table SYSTABLE(table_page_count). A message will be displayed if these values do not match. Incorrect table page counts could potentially lead to assertion failures in the future. Namely, assertion 200602 could be generated when dropping or truncating such a table.
421142 On NetWare 6.5 with SP2 or later, the server may have abended if the database server displayed a total of approximately 100kB worth of messages to the console. This was due to a bug in the NetWare operating system relating to the scrollable screen feature. To resolve this, the use of the scrollable screen feature has been removed.
421161 If a user accidentally used a dot reference incorrectly, the syntax error resulting from the incorrect use ws not reported properly by the server. For example, if the following query was issued:

SELECT str(table_id).str(creator).length(table_name) from systable

the server would have reported "Syntax error near '' ???". The server will now correctly report "Syntax error near 'length'".

421275 If a temporary table was declared as NOT TRANSACTIONAL, deleting rows in the table using a DELETE statement did not release the space for re-use. This has been fixed.
421320 If a partial HTTP request was received by the server, and the socket was then closed, the server would have leaked three handles on Windows systems, or one handle on Unix or NetWare systems. This has been fixed.
421349 The One-button synchronization feature of UltraLite for M-Business Anywhere did not work correctly if the synchronization stream was HTTPS. The Certicom libraries required were not being linked into ulconnect.exe. This has now been corrected.
421397 The ApplyFile() method's enumeration constants for state changes had incorrect values, the Error and Done states were reversed. This has been coreected. The correct values for ulUpgradeStateError and ulUpgradeStateDone are 3 an 4 respectively. A successful ApplyFile() call will generate the states 0, 1 or 4. States 2 and 3 are only produced when an error occurs.
421399 It was possible for dbremote to fail to send or receive messages, but no line was written to the SQL Remote log that started with "E", indicating that an error had occurred. This has been corrected so that an error line is now always written to the log after the send or receive of a message fails.
421675 Interactive SQL would not have consistently reported errors raised from within a stored procedure if connected via jConnect. This has been fixed.
421744 For an n-way join query block with a DISTINCT clause, the optimizer can now chose a plan using semijoins instead of inner joins, based on the expressions used in the select list. The inner joins can be executed as semijoins for tables, derived tables, or views whose expressions are not used in the select list. The decision to use inner joins or semijoins is done cost-based during optimization by the SA optimizer.

Examples:

select distinct p.* from product p, (select prod_id, id, count(*) C from sales_order_items group by prod_id, id )

as DT, sales_order as so

where p.id = DT.prod_id and so.id = DT.id

421924 With the QAnywhere C# API, calling the Start() method on a QAManager that had been previously Started and Stopped, could have caused the application to hang, or fail to terminate cleanly. This has been fixed.
421944 When using the Create Database wizard with a server older than the version of the Sybase Central SQL Anywhere plug-in, for example, using a 9.x SQL Anywhere plug-in to create a database on a 8.x server, the list of collations provided by the wizard would include those not be supported by the server. Choosing an unsupported collation would then have caused an error to be displayed in the Create Database messages dialog. This has been fixed so that now the wizard lists only those collations supported by the selected server.
421957 When UltraLite Dynamic SQL executed a query with both an ORDER BY clause and a GROUP BY clause, an incorrect ordering could have occurred when there existed an index to satisfy the ORDER BY, but no index existed for the GROUP-BY. This has been corrected.
421987 There was an extremely slight possibility the server could have crashed if a database, which had events running, was shut down. This has been fixed.
421991 The server could have crashed while handling an HTTP request. The improper handling of an HTTP header has been corrected.
422013 Comparisons involving NULL constants (such as column-name > NULL) may have produced incorrect results or diagnostics. This has been corrected.
422131 UltraLite Dynamic SQL would have handled a column reference incorrectly if an alias name was the same as a column name and that name was used in an IF or CASE statement within the SELECT expression to which the alias was assigned. This has now been corrected.
422133 The changes for Engineering Case 421320 introduced a handle leak. As a result, if many HTTP connections were received and serviced in a short time, the server could have crashed. This has now been fixed.
422197 If a derived table was joined with the rest of the query using a Join Nested Loops operator, the performance of the query may have suffered if the derived table had to be computed many times due to many rows being generated by the left hand side of the Join Nested Loops. The optimizer was choosing such a plan if the estimated number of rows of the left hand side was very small. If this estimation was wrong (e.g., the optimizer estimated one row for the left hand side, but in reality the left hand side had 1,000 rows), the derived table was computed many, many times during execution. This is now fixed by having the optimizer only consider using the Join Hash or Join Sort Merge operators for the derived table, if it is correct to do so.
422213 At isolation level 1, the last row visited by a keyset cursor scan before finishing (ie a fetch returning 'row not found') would have been left locked until the cursor was closed or moved. This has now been corrected.
422252 Interactive SQL could have failed to execute a reload script, if it contained a COMMENT TO PRESERVE FORMAT statement which included a semicolon in its braces. For example:

COMMENT TO PRESERVE FORMAT ON VIEW test IS

{

CREATE VIEW test AS SELECT * FROM myTable;

}

In this example, dbisql would have sent only the portion of the statement "COMMENT ... myTable;" omitting the closing brace. This problem has been fixed.

422487 If a cursor was opened on a stored procedure call, and the procedure executed a RAISERROR statement, the error was not reported on the OPEN. The value of @@error would have been set to the integer value given in the RAISERROR statement and would have remained set to that value even after other statements were executed, until another RAISERROR was executed or the connection was dropped. This has been fixed so that an error will now be reported to the application on the OPEN.
422513 The server now supports the READPAST table hint. An example:

Select *

From customer with( readpast )

Where state = 'NY'

READPAST is meaningful only at isolation level 1; it is ignored at all other isolation levels. As with other hints, the READPAST hint is respected only when the correlation name in the FROM clause refers to a base or global shared temporary table. In other situations (views, proxy tables, table functions) the READPAST hint is ignored. Queries within views may utilize READPAST as long as the hint is specified for a correlation name that is a base table.

The READPAST hint directs the server to ignore locked rows (that is, rows write-locked by other connections) rather than blocking. One way to think about READPAST is to pretend that addtiional predicate has been added to the query's WHERE clause; with the example above, akin to

Select *

From customer with( readpast )

Where state = 'NY' and (current row is not write locked by another transaction).

Consequently the READPAST hint is inconsistent with the behaviour of ANSI SQL isolation level 1, as uncommitted changes (locked rows) have an impact on the result set of a statement utilizing READPAST. As such, the use of READPAST can lead to anomalies due to the interaction of locking and predicate evaluation within the server. Subtle differences in this interaction from release to release of SQL Anywhere may yield different behaviours. The precise affect of READPAST may also depend on the optimization strategy determined by the query optimizer, particularly if the hint is specified only on a subset of the tables in the query. For example, consider the outer join query

SELECT * FROM R LEFT OUTER JOIN S (WITH READPAST) ON 1=0

In 9.0.2, a cursor stability lock is placed on the rows of R and S once the join is performed (assume nested loop join, JNLO, in this example). Further, assume that we find a single candidate S row to match the current R row, but that it is dirty (the row is write-locked by another transaction). The lock node will reject it, causing the server to fetch another row from the JNLO. Since the JNLO thinks it has found a match, it will not generate a null-supplied copy of the R row, and the server will fail to preserve the R row in the result. Hence, in this case, the query's result will fail to include all the rows of R, which it would if READPAST was not used.

READPAST can be used with all cursor types. However, KEYSET cursors must be used with caution. When initially populating the keyset through forward FETCH statements, READPAST will ignore locked rows as described above. However, a subsequent refetch of a previously FETCH 'd row may block if that underlying row was write-locked by another connection after the row was originally added to the keyset. The blocking can be avoided through the use of the BLOCKING option, but after receiving the ROW_LOCKED error (SQLCODE -210) the cursor will be in an invalid state.

READPAST can be useful when implementing a queue with a table, and there are multiple producers and consumers of the queue. Using READPAST can significantly improve concurrency in this scenario.

422515 If there were active client or http requests when the server was shutting down, there was a possibility, although small, that the server could have crashed. If a crash occurred, it would have been after the databases were stopped, so there was no chance of data loss. This has now been fixed.
422774 If the join predicates of a join involving a derived table, or a null-supplying side of an outer join, contained equality predicates on the same column, the estimated number of rows might have been incorrect. This has been fixed.

For example:

The derived table DT has two equality predicates on the column DT.X. The estimated number of rows of the join of DT with (T join S) is underestimated due to the fact that the selectivity estimations of the predicates 'T.X = DT.X' and 'S.X = DT.X' are multiplied.

select *

from T, S, (select count(*), R.x, R.y from R group by R.X, R.Y ) as DT( C, X, Y)

where T.X = DT.X and S.X = DT.X and T.X = R.X

422775 The optimizer would have underestimated the cost of using a clustered index if the table pages were partially in the cache (for example, 40% of the table pages were in the cache). This has been fixed.
422828 If an sp_hook_dbmlsync_process_exit_code hook was defined and an invalid dbmlsync extended option was specified, then the synchronization client would have crashed. This has been fixed.
422845 Interactive SQL could have reported an internal error (NullPointerException) when the Import Wizard was opened to import a file and a file was chosen, but the file was deleted (or otherwise became unavailable) after entering the wizard. This has been fixed.
422996 Embedded SQL applications running on Unix or NetWare systems would not have had the DB_CALLBACK_CONN_DROPPED callback function called when the server was about to drop a connection. This has now been fixed.
423129 It was possible, although very rare, for all connections to the server appear to be hung (deadlocked) in the presence of DDL statements, checkpoints, backups, or other operations, if a connection that was executing Java was cancelled. This has now been fixed.
423139 In rare circumstances, the server may have crashed if a DROP PROCEDURE statement failed because the procedure was currently in use. For this to happen there must have been a disconnect in progress at the same time. This problem was more likely to occur if the disconnect had to stop additional Java threads, as would happen when using JDK 1.3. This has been fixed.
423324 If a dynamic trap was set on a valid entry in the ASA MIB that was under the agent or metadata subtrees, the SNMP agent would have crashed. This has been fixed. Dynamic traps on these OIDs are not supported and they will be ignored by the agent.
423508 The provider calls the ADO CreateParameter method using the adBSTR datatype. Each time the Execute method was called, memory would have been leaked. The following is a C++ example of the code.

std::wstring strParam1( 84, L'\x9F5F' );

// Create the parameters.

_ParameterPtr param1;

_variant_t val1( strParam1.c_str() );

param1 = cmd->CreateParameter( L"", adBSTR, adParamInput, (long)strParam1.length(), val1 );

cmd->Parameters->Append( param1 );

// Run the command.

_variant_t vtEmpty1( DISP_E_PARAMNOTFOUND, VT_ERROR );

_variant_t vtEmpty2( DISP_E_PARAMNOTFOUND, VT_ERROR );

cmd->Execute( &vtEmpty1, &vtEmpty2, adCmdStoredProc | adExecuteNoRecords );

When a variant BSTR object (val1) was converted to a BSTR object (the bound parameter), a new object was created and the memory for that object was lost. This problem has now been corrected.

423578 Attempting to OPEN a cursor on a procedure call that returned the SQL warning "Procedure has completed", would not have opened a cursor. The server still created a cursor handle though, which was not freed until database shutdown. This has been fixed so that the server will now return a NULL handle if the cursor has not been opened.
423681 The server may have crashed during the second or subsequent executions of a procedure,

if after its first execution, one of the referenced objects (table, view, proxy table, etc) had been dropped and recreated with a changed type. For example, a referenced table was dropped and a view with the same name was recreated. This has been fixed

423730 A SOAP web service client procedure did not detect and encode string parameters that contained XML special characters, such as '<', '>' or '&'. A string parameter containing XML that was not well formed would have invalidated the requesting SOAP envelope, causing an error at the web service endpoint. This has been fixed so that Soap client parameters are now always encoded (e.g. '<' becomes <).
423792 If a relative path name is used in an INPUT statement, and the statement itself appears in a .SQL file, the directory containing the calling file is now searched when resolving the name of the called file. For example, suppose there are two files, "test.sql" and "test.dat", both in "c:\test", and that "test.sql" contains the line:

INPUT INTO myTable FROM 'test.dat';

If the current directory is "C:\home", and the following is run:

DBISQL c:\test\test.sql

the INPUT statement is now able to resolve the relative file name "test.dat" to "c:\test\test.dat" by using the name of the folder which contains "test.sql", the file that contains the INPUT statement. Previously, "test.dat" would not have been found.

The INPUT statement could fail to resolve relative file names if the fast launcher option is turned on. The workaround is to turn off the fast launcher, or to use fully qualified file names in the .SQL files.

423803 The Service Create utility can be used to create and start the Listen utility as a service, much like other ASA servers or agents. However, the status of the service would have remained as "STARTING", even when the listener was up and running properly. Shutting down the listener service was also problematic. These problems are now fixed.
423828 SOAP v1.1 requires that the URI value of the HTTP SOAPAction header be enclosed within double quotes. In the event that the quotes were missing the server would have closed the HTTP connection without issuing an error response. This has now been fixed so that the server will now respond with a "400 - Bad Request".
423858 Applicatons connected via the CmdSeq protocol, could have crashed if a connection request resulted in a warning. This has been fixed.
423859 The Service Creation utility can now create services for the Listener utility, using the '-t dblsn' command line option.
423901 The OLEDB GetRowsByBookmark method, as implemented by the iAnywhere provider, did not work correctly. It was possible to return invalid row handle values. As well, incorrect row status array values were being returned. This has now been fixed.
423911 Insertion of rows into a UTF8 database, using ADO and the OLEDB provider, would sometimes have failed. The following Visual Basic script is an example that reproduces the problem.

recordset.Open "Employees", connection, , , adCmdTable

recordset.AddNew

recordset.Fields.Item("EmployeeID") = 1000

recordset.Fields.Item("GivenName") = "Munroe"

recordset.Fields.Item("Surname") = "Marvin"

recordset.Fields.Item("DepartmentID") = 201

recordset.Fields.Item("Street") = "No fixed Street"

recordset.Fields.Item("City") = "No City"

recordset.Fields.Item("Salary") = 12000.00

recordset.Fields.Item("StartDate") = "2006-01-03"

recordset.Update

This has now been fixed.

424085 When a computed column is added to a table, the expression used to generate the column values may give an error, the actual error will depend on current option settings and the current connected user. The following examples show ways that a computed column may give an error in some circumstances only:

- Use an unqualified user-defined function (UDF). If the current user does not include the UDF in the lookup path, an error is returned.

- Miss-spell a UDF name. There is no checking done when the column is added. Any use of the table fails.

- Create the column referencing a UDF then drop it. Even if 2. is fixed, there is no dependency tracking to prevent 3.

- Use a cast that gives an error at build time (e.g, TIME -> INT). The table causes an error unless the Conversion_error option is Off.

- As with 1. 2. or 3. , use a sub-select referencing a table, view or procedure that is unqualified or non-existent.

- Use features in the compute expression that cause SQL flagger errors to be returned. If the connection options give a flagger error, the table can not be used.

http://dcx.sybase.com/index.html#1201/en/dbusage/defining-computed-javause.html*d5e620

When the expression for a computed column gives an error, it does so for any query that references the table (even if the table is not modified by the statement.

As a best practice, computed columns should be defined with an expression that is computed in the same way for all connections and all users that have permission to read from the table.

424090 When DatabaseMetaData.getColumns() was called on a table that contained a uniqueidentifier column, the datatype returned for the uniqueidentifier column was -11 (i.e. SQL_GUID). If the application then useed -11 as the datatype value in a setNull or setObject call, the iAnywhere JDBC Driver would have returned an invalid datatype error. This problem has now been resolved and -11 is now accepted for setNull and setObject.
424091 It was possible for the iAnywhere JDBC Driver to have crashed, or to hang, when creating or preparing a statement. While rare, this was more likely when under a heavy load. This problem has been fixed.
424217 The iAnywhere OLEDB provider was not correctly executing multi-row fetches as a result of calling the GetRowsAt() method. For example, when using GetRowsAt() to fetch rows 1 through 50 of a result set and then fetching rows 26 through 75, the provider would have incorrectly returned rows 51 through 75 on the second fetch. This problem has been fixed.
424219 A security problem on Unix sytems has been fixed
424344 It was possible, although rare, for the server to crash if multiple requests called the same stored procedure, and the procedure contained statements of the form "select ... into #temp ...". This has been fixed.
424465 Indexes in Java UltraLite databases could have become corrupted in some cases, when a new entry was inserted in to the index page. This has been fixed.
424920 Attempting to get the graphical plan for a batch, either using the GRAPHICAL_PLAN() function or the Plan tab in Interactive SQL, or calling the REWRITE() for a batch, could in some cases have caused the server to crash. This has been fixed.
424923 Using an incorrect dot reference in a query that also references proxy tables, would have failed with SQLCODE -660. The text of the error would be from the remote server. This has now been fixed.
424931 When the OLEDB provider was used with ADO, wide character strings (UTF16/OLECHAR) were written correctly to a database that used the UTF8 collation. However, when fetching the inserted values back from the database, the UTF8 strings were not correctly converted back into UTF16. This has been fixed. The OLEDB provider now does proper conversion from UTF8 strings to UTF16 strings.
425121 The call to MessageBox.Show() has been removed when there is an exception thrown inside the QAnywhere Message Listener. Calling MessageBox.Show()was not desired behaviour when in a transactional context environment. For the .NET Compact Framework and the .NET Framework, exceptions that occur in a message listener are now logged to the QAManager log file, rather than shown in a MessageBox. The QAManager log file is set with the "LOG_FILE" QAManager configuration property. It is recommended for all QAnywhere .NET applications to catch ALL exceptions in the message listener delegate, and deal with them appropriately.
425125 If an exception was thrown inside the message listener, the exception text was displayed in the MessageBox.Show() dialog, (see Engineering case 425121 for a change in this behaviour), and the transaction was rolled back. However, the message which caused the exception was then put back on the queue and was then received by the message handler. If the message handler itself then threw an exception, this could have resulted in an infinite loop. There was no method of setting a maximum retry to interrupt this process. So a new message store property "ias_MaxDeliveryAttempts" has been added. When this property is set to a positive integer n by a QAnywhere application, eg. mgr.SetIntStoreProperty( "ias_MaxDeliveryAttempts", 5 ), the QAnywhere client will attempt to receive an unacknowledged message up to n times before setting the status of the message to unreceivable. If the property "ias_MaxDeliveryAttempts" is not set, or is negative, the QAnywhere client will attempt to receive messages an unlimited number of times, which was the behaviour before this change. Also, there is now an integer message property "ias_DeliveryCount" that is set by the QAnywhere client in a message each time it is delivered to the application by a get method. This property is the number of times that the message has been delivered to the application, without being acknowledged.
425141 The AES_FIPS encryption type is not supported on 64-bit Windows, but attempting to create a database of this type would have resulted in the error -976 "Could not load the encryption DLL dbrsa9f.dll'". This has been fixed - the correct error code -131 "Syntax error near 'encryption algorithm'" is now returned.
425280 Starting with build 9.0.2.3274, pre-generated .CAB files for Windows Mobile 5 will now be shipped which are security-signed by Verisign. These can be installed only on Windows Mobile 5 devices, and will avoid the "unknown publisher" warning displayed when installing un-signed .CAB files.

There is an additional feature: "Signed .CAB files for Windows Mobile 5" in the desktop install.

In the CE deployment installer, there are now up to 5 platforms to choose from:

Build or Deploy a .CAB file for Windows Mobile 5

Build a .CAB file for ARM

Build a .CAB file for ARMV4T

Build a .CAB file for MIPS

Build a .CAB file for Pocket PC 2002 emulator (X86)

Selecting the Windows Mobile 5 option, will also allow the choice of deploying one of the two security-signed .CAB files -- one has support for Compact Framework 1.1, the other for Compact Framework 2.0. Alternatively, a custom .CAB file can still be built, but this will not be security-signed.

425445 When executing a SQL query "SELECT commit_txn_id FROM LNK_IQ126..SYS.SYSIQINFO" to access an IQ 12.6 ESD#4 server on Solaris referencing a MS Linked Server based on ASA OLE DB Provider 'ASAProv.90', MS Query (MSQRY32.exe) receives the following error from MSSQL server:

> OLE DB error trace [OLE/DB Provider 'ASAProv.90'

> IUnknown::QueryInterface returned 0x80004005:

> The provider did not give any information about the error.

NB DBISQL, MS SQL Query Analyser and ODBCTest process the same query successfully

425473 One of the server's recursive union execution strategies had inadvertently become disabled. This could have caused poor performance for some recursive queries and has been fixed.
425513 Calling an HTTP client procedure with an unsupported data type, may have caused the server to crash. This has been fixed.
425515 An Ultralite application may have crashed when operations were done on tables that were near the 64K row limit. This has been fixed.
425847 Queries containing expressions involving the GROUPING() function may have returned incorrect results for those expressions. This has been fixed.
425925 It was possible for the server to crash if a user-defined datatype was dropped while a CREATE TABLE statement, or an ALTER TABLE statement that added a column of this type, was executing. This has been fixed.
425943 The SQLError object was missing two error constants: SQLE_INVALID_OPTION_SETTING and SQLE_METHOD_CANNOT_BE_CALLED. This has been corrected.
425955 The server would have reported an error when attempting to register with LDAP, if the LDAP server was an Active Directory Server and the server was listening on more than one IP address. This has been fixed.

Note, clients with this fix will not be able to connect through LDAP to servers without the fix, and vice versa.

426056 Attempting to execute a "SELECT INTO #temporary-table-name" statement, may have caused a server crash in cases where it should have returned the error "Statement size or complexity exceeds server limits". This has been fixed.
426153 If the MobiLink client was shutdown by clicking the shutdown button on the window, using the stop method on the integrations component or sending a WM_CLOSE message to the dbmlsync window, then it could have hung with 100% CPU utilization. The behaviour would have occurred intermittently, and would have been more likely on machines with multiple processors. This has now been fixed
426165 If the SOAPAction URL was malformed an error of 400 'Bad Request' or 404 'Not Found' may have been returned. Now, a Malformed SOAPAction URL will always return a 400 'Bad Request', whereas a correctly formed URL trying to access a SOAP endpoint that does not exist will return a 404 'Not Found'. This fix also simplifies the requirements for configuring an SA SOAP client that accesses an SA SOAP service endpoint (client and server cannot be running on the same database server).

The SOAPAction HTTP header is required by SA when a SOAP request is POSTed to a DISH service endpoint. The SOAPAction URL is the 'address' of the SOAP service endpoint for the request. Prior to this change an SA HTTP client was required to provide a namespace clause that defined an appropriate URL containing the database name for the endpoint service. Now it is now possible to access an SA SOAP endpoint by assuming the use of its default database. This only works in the simple case where the SA SOAP web service is not defined within a 'group' of a DISH service. When a soap endpoint is defined within a 'group', the SA SOAP client must specify the namespace to provide the appropriate database and group mapping.

The simple case is described with two services as follows:

create SERVICE "wsdl"

TYPE 'DISH'

AUTHORIZATION OFF

format 'concrete'

USER DBA;

create SERVICE "soapecho"

TYPE 'SOAP'

AUTHORIZATION OFF

USER dba

AS call soapecho_proc( :s1 );

The following are valid SA SOAP client procedure definitions that access the above soapecho service:

1) Access soapecho service directly (note, to stay consistent with the other cases the format clause describes the desired output format):

create procedure soapecho( s1 long varchar )

url 'http://localhost/soapecho'

format 'concrete'

type 'soap:doc';

2) Access indirectly through the wsdl DISH service and specifying the namespace (note, the server is expected to be running the sample.db):

create procedure soapecho( s1 long varchar )

url 'http://localhost/wsdl'

namespace 'http://localhost/sample'

type 'soap:doc';

3) With this change, namespace clause is no longer required:

create procedure soapecho( s1 long varchar )

url 'http://localhost/wsdl'

type 'soap:doc';

The above cases yield the following request characteristics:

CASE HTTP POST SOAPAction Namespace

1) POST /soapecho http://localhost/soapecho http://localhost

2) POST /wsdl http://localhost/sample/soapecho http://localhost/sample

3) POST/wsdl http://localhost/soapecho http://localhost

An example of a more complex case where the namespace clause for an SA SOAP client is required (closely resembles case 2) above):

create SERVICE "wsdl"

TYPE 'DISH'

AUTHORIZATION OFF

format 'concrete'

group 'abc'

USER DBA;

create SERVICE "abc/soapecho"

TYPE 'SOAP'

AUTHORIZATION OFF

USER dba

AS call soapecho_proc( :s1 );

The namespace is required because it identifies both the database and the group for the SA SOAP service endpoint:

create procedure soapecho( s1 long varchar )

url 'http://localhost/wsdl'

namespace 'http://localhost/sample/abc'

type 'soap:doc';

The resulting request is similar to case 2) with the exception that /abc is appended to the SOAPAction URL and the soap envelope namespace URI.

426167 The http_header() function returned an ASCII 0 control character when the given header had no value. This has been fixed, the return value in this case is now an empty string.
426186 If an embedded SQL application executed a PUT on a non-updateable cursor with the option ANSI_UPDATE_CONSTRAINTS set to OFF, the server could have crashed. This has been fixed.
426279 The server may have crashed if an INSERT statement had subselects in the VALUES clause that referenced remote tables, and the insert was executed in no passthrough mode.

For example:

insert into T1 values ((select col1 from RemoteT1), (select col2 from RemoteT2))

This has been fixed so that now the server returns the error "Remote server does not have the ability to support this statement", if SET items are subselects in no passthrough mode.

To workaround this problem, the statement can be rewritten as an INSERT ... SELECT.

For example:

insert into T1 select (select col1 from RemoteT1), (select col2 from RemoteT2))

426330 Attempting to run two simultaneous archive backups, for different databases, on the same server, could have caused the server to crash. The backup library was being unloaded by the first operation to complete. This has been fixed.

This problem does not affect image backups created with BACKUP DATABASE DIRECTORY or the DBBACKUP utility.

426361 The OLEDB provider was not converting columns of type BIT to DBTYPE_BOOL correctly. A true value 1 should map to a 16-bit integer value equal to -1 rather than to the value 1, as it was. This problem has now been fixed.
426364 When scrolling backwards or forwards through a cursor, the OLEDB provider would have refetched deleted rows. This problem has been fixed.
426377 Attempting to execute an invalid recursive query (ie one that would have failed with error "-921 - Invalid recursive query") could have caused the server to crash, if it referenced remote tables. This has been fixed.
426484 A new MobiLink server HTTP stream option, called session_key, has been added. This option determines how the MobiLink server tracks non-persistent HTTP sessions (i.e. when the MobiLink client specifies 'persistent=0'). The option is used as follows:

dbmlsrv9 ... -x http(...session_key=[cookie|header];...) ...

When the session_key is 'cookie', which is the default, an HTTP cookie with name JSESSIONID is used to track HTTP sessions. When the session key is 'header', an HTTP header is used. The 'header' option is useful if the cookie name of JSESSIONID conflicts with an existing cookie, in which case MobiLink will track HTTP synchronizations using a custom header entry that will not conflict with any other HTTP infrastructure. In order to implement this feature in the MobiLink server, changes were also required to the MobiLink client. Thus to get the new behaviour, clients need to be upgraded as well.

426596 Query using select col1 = (select sum(columnname) from Tablename) on proxy table never finishes -> "NO PASSTHRU mode"
426611 Calling connection_property( 'UnschReq' ) may have returned a value larger than it should have been, particularly if multiple DROP CONNECTION statements were issued against a single connection. This has been fixed.
426786 Some aggregate expressions were not handled correctly by Dynamic SQL when there was no GROUP BY clause.

For example, when table is empty:

SELECT ifnull( sum(x), 0 ) FROM table

This has been corrected.

426799 The server could have become deadlocked (it would have appeared to be hung), if non-temporary database pages were updated, then freed, in quick succession. This has been fixed.
426806 The Index Consultant wizard would have returned syntax errors, and could not work properly, if the statements to be analysed contained column names that were only valid as quoted identifiers. This has been fixed.
426984 When upgrading a database, either by executing the ALTER DATABASE UPGRADE statement, or running the Upgrade utility, the upgrade did not run the oleschem.sql. This has now been corrected
427005 If the Gateway wizard or Property sheet was used to create or modify an SMTP or UDP gateway, then an invalid "ack_timeout" property would have been set. This has been fixed so that the correct property "confirm_timeout" is now set.

This problem would also have prevented the MobiLink server from starting. This has also been fixed by allowing the MobiLink server respect the "ack_timeout" setting as an alias to the "confirm_timeout" property. If both property name are used at the same time, the value associated with "confirm_timeout" will take effect.

427121 Integrated login connections could have failed if INTEGRATED LOGIN was granted to a Windows group, and the Windows group contained the particular user that was connecting as domain\username. This has been fixed so that user 'username' is now successfully logged in, even if they are in the Windows group as 'domain\username'.
427138 Server run on Unix systems with the -z command line option ("display debugging information"), would have displayed a message indicating that a TCP/IP connection has been received, when an HTTP or HTTPS request had been received. This has been fixed. The message will now indicate that an HTTP (or HTTPS) connection has been received (the same as on other platforms).
427299 The idle IO timer could have firing before the server was fully initialized, which would have caused the server to crash. This has been fixed by checking that the server has completed it's startup before dispatching the timer.
427456 When the UltraLite generator was run against a schema that included UUID column types, and it was configured to generate the C++ API, it would have generated code that referenced SQL_UUID. This symbol was not defined, causing a compiler error when the code was compiled. This has been fixed by defining the symbol SQL_UUID.

A work around is to add SQL_UUID to the enum listed in ulapi.h just before SQL_MAX_INDEX.

427834 The QAnywhere Agent command line option -q (quiet) did not work well on Windows CE. In particular, the database server was not started in quiet mode so the server window would pop up briefly before being minimized. This has been fixed so that when the the QAnywhere Agent is run with the -q option, the database server is started with -qi on Windows CE, and with -qw on Windows, as well..
427856 When the QAnywhere Agent was started by an application, and the application then started sending and receiving messages immediately, it was possible that the QAnywhere Agent would not complete its startup, and issue the following error:

InternalError: User 'ml_qa_user' has the row in 'ml_qa_repository_content_client' locked

Source statement: CREATE SYNCHRONIZATION SUBSCRIPTION TO ml_qa_user_group.ml_qa_repository_pub FOR "02600601376" OPTION sv='ml_qa_2'

The problem was that messaging cannot begin until the synchronization subscription is created in the message store, which cannot happen until the message store ID is known. This has been fixed so that the message store property "ias_StoreID" is set by the QAnywhere Agent when the message store ID has been initialized. A QAnywhere application can query this message store property and begin sending and receiving messages when the property value is defined.

428011 With IQ 12.6 ESD#4 on Solaris set to Force_Updatable_Cursor=OFF, queries referencing MS SQL 2000 Linked Server based on Sybase ASAProv.90 (9.02) exhibit the followings:

+ INSERT succeeds

+ UPDATE & DELETE fail with MSSQL Msg 7352, Level 16

With IQ set to Force_Updatable_Cursor=ON, INSERT fails additionally:

+ UPDATE & DELETE continue to fail with the same error as above

+ INSERT fails with MSSQL Msg 7343, Level 16

428075 It was possible for the server to hang while generating the plan for a query. This has now been fixed.
428363 Both the SQL Anywhere and MobiLink plug-ins permitted pausing, and continuing Windows services for dbsrv8 and dbsrv9, dbeng8 and dbeng9, dbremote, dbmlsync and dbmlsrv8 and dbmlsrv9. This ability has been removed, as none of these executables actually support pausing. Pause and continue operations are now only permitted on dbltm Windows services.
428375 The Interactive SQL utility could have truncated the data from columns with NUMERIC and DECIMAL datatypes of precision greater than 18, when they were exported to dBASE II file formats. This has been fixed so that columns with precisions greater than 16 are now saved as character data.
428387 The option to print only the last result set when running in console mode was ignored if the "Show multiple result sets" option was enabled. Instead of printing only the last result set, all result sets were being printed. This has been fixed.

The linkage between these two options is possibly not clear in the user interface. To clarify the relationship, the "Results" panel in the "Options" dialog has been updated to disable the option to show all result sets when run in console mode when "Show multiple result sets" is turned off. Note that in that case, "all" is the same as "last".

428508 The Interactive SQL utility could have reexecuted more than the last SELECT statement if the "Auto_refetch" option was on. For this to have occurred, DBISQL would also have to have been run in windowed mode, with multiple statements executed at once, starting with a SELECT statement. e.g.

SELECT * FROM myTable;

OUTPUT TO 'c:\\test.txt';

Then an INSERT, UPDATE, or DELETE statement was executed, which would have caused the statements following the SELECT statement (in this case, the OUTPUT statement) to have been reexecuted. This has been fixed.

428685 If the NUMBER(*) function was used in a subquery of an expression, and the expression referenced a proxy table, the server may have crashed. This has been fixed.
428862 When host input variables were used in binary operations (such as comparisons using LIKE) and the other operand of the operation had a string type, Ultralite Dynamic SQL would have used the size of the other operand as the size for the host input variable as well. This could have lead to incorrect results when the string value was larger than the size designated for the host input variable. This has been fixed by increasing the sizes used to handle most reasonable cases, without using the maximum size which could impact the performance of existing applications.

For example, a query of the form

SELECT * FROM table WHERE col-a LIKE ?

where col-a is a 5-character column with a value '12345', would have generated a row in the result set for a host input value of '1234567%' (because that value would be truncated to '12345').

Similar problems existed with other comparisons.

428879 When using the Windows Service Manager to start and stop ASA services, the option to pause

running services was available. This option has been removed for all services, except for

dbltm.

428977 It was possible for a query to return the wrong answer, if the query contained an IN list search condition that was used in an index scan to provide an ordering property.

For example, the following query could give the wrong answer for some query execution plans:

create table TOB( c1 int, c2 int);

create index TOBx on TOB(c1,c2);

insert into TOB

select row_num c1, 20-c1

from rowgenerator where row_num <= 20;

commit

select *

from TOB T1 with( index(TOBx) ), TOB T2 with( index(TOBx) )

where T1.c1 = T2.c1

and T1.c2 in (15,16,17,18,19) and T1.c1 in (1,2,3,4,5)

order by T1.c2

The wrong answer could have been returned in some cases if a Merge Join was used for the above query. This problem has been fixed.

429026 When searching for the .odbc.ini file on Unix systems, the ODBC driver would have first searched the current directory, and if one was found, would have used it, incorrectly taking precedence over the search locations documented in the SQL Anywhere Database Administration Guide. For example, a .odbc.ini file found in the current directory would be used even if the ODBCINI environment variable was set to reference a different file. This has been fixed so that the search order is as documented.

Note, an application that is dependent upon finding the .odbc.ini file in the current directory will need to explicitly include the current path or full filename. The environment variables ODBCINI and ODBC_INI can be used to specify the complete filename. The environment variables ODBCHOME, HOME and PATH can be used to specify the directory containing .odbc.ini. Consult the SQL Anywhere documentation for details.

429029 The changes for Engineering case 406765 could have caused a server crash. The circumstances where this occurred were rare, and would have required that the CONNECT or REMOTE permissions for a user be dropped, while dbremote was actively replicating transactions for the user. This has been fixed.
429117 In the Details panel of a table's result set, if a row was selected and the Delete key pressed, the row would have been successfully deleted. If the Delete key was pressed again, an error would have been displayed. This has been fixed.
429129 Two cases of memory leaks have been fixed in the ULPod component.

Case 1: If a PrepStmt pods object was not explicitly closed, the SQL string stored in the object was not freed when an AvantGo client exited.

case 2: In SyncParms.getAuthenticationParms(), pods array elements used to construct the output array were not freed properly afterwards.

429136 Scripts are now available for applying QAnywhere performance upgrades to consolidated databases used by a Version 9.0.2 QAnywhere (MobiLink) server. These scripts are located in the SQL Anywhere Studio 9.0.2 install directory under QAnywhere\sql. This includes a readme.txt that details how to apply the scripts.

Engineering cases 409529, 415999, and 417415 described applying performance upgrades by using additional command line parameters on the QAnywhere server:

-sl java ( -Dianywhere.qa.db.upgradeDeliveryColumns=true )

As there were situations where it was not possible to start the MobiLink server with a database user having schema change permissions, the scripts:

patchasa1.sql

patchmss1.sql

patchora1.sql

were developed for applying the performance upgrades against Adaptive Server Anywhere, Microsoft SQL Server and Oracle consolidated databases respectively.

429146 When there were hundreds of thousands of messages in the QAnywhere Server consolidated message store, cleaning up (deleting) old messages could have been very slow. Deleting this many messages would have locked down message transmission for the duration of the operation. A work-around would be to schedule message deletion to a time of low server activity, perhaps over night. This has been fixed, but requires the application of an upgrade to the QAnywhere Server consolidated message store. The fix, so far, is only available for Adaptive Server Anywhere, Microsoft SQL Server, and Oracle consolidated databases used by a Version 9.0.2 QAnywhere (MobiLink) server. These scripts are located in the SQL Anywhere Studio 9.0.2 install directory under QAnywhere\sql. This includes a readme.txt that details how to apply the scripts. The scripts are:

patchasa2.sql

patchmss2.sql

patchora2.sql

for Adaptive Server Anywhere, Microsoft SQL Server and Oracle consolidated databases respectively.

429149 The implementation of message listeners in QAManagerBase would have continued to loop as long as it was receiving messages (which it would have continued to do, as the same message would have continually been rolled back and subsequently received) and did not intermittently check to see if a request had been issued to stop or close the manager. This infinite loop would have occurred if the message store property ias_MaxDeliveryAttempts was not set, or was set to -1, and the processing of a message in a message listener caused an exception to be thrown which was not caught. This has been fixed so that now a QAManager in such a state can be stopped or closed.
429167 When a QATransactionalManager had an open transaction, another QAManager would have blocked in the GetQueueDepth methods. This has been fixed so that the GetQueueDepth methods do not block.
429169 The message listeners in QAManagerBase were polling the message store for messages. This unnecessarily consumed CPU resources. This has been changed so that the background receiver thread now efficiently waits for a message to be put on a queue before retrieving it and delivering it to the message listener.

Note that the behaviour of the (foreground) blocking GetMessage methods has not changed - these have always efficiently waited for a message to be put on a queue.

429258 PocketBuilder 2.0.4 against ASA 9.0.2 on CE Device: Select error: SQLSTATE=S1090 [Sybase] [ODBC Driver] Invalid string or buffer length.

This worked fine with ASA 9.0.1

(yes - another ASA behavior change fixed via PocketBuilder)

429262 If an ODBC application called SQLSetConnectAttr() to set the isolation level while there were concurrent requests using the same connection on other threads, the application could have hung, crashed, or the call could have failed with an error. This problem does not occur on Windows systems when using the Microsoft ODBC Driver Manager. This problem has been fixed.

Note, similar problems with SQLConnect, SQLBrowseConnect, SQLDriverConnect, SQLAllocStmt/SQLAllocHandle and SQLFreeStmt/SQLFreeHandle have also been corrected.

429267 The value returned for the ERRORMSG() function could have been incorrect if the function was used within a procedure, and the statement referencing it was executed repeatedly. The function was not defined as non-deterministic, which as a result, may have caused plan caching to return a previous value. This has been fixed.
429284 On Unix systems, when searching for the .odbc.ini file, or an ODBC File DSN, one of the places searched is the user's home directory. Under normal circumstances, the HOME environment variable points to the user's home directory, but it can be changed. If the HOME environment variable was set to a location other than the user's actual home directory, and the file being sought was not found there, the file was not then searched for in the user's "real" home directory (ie ~/.odbc.ini). This has been corrected so that the user's actual home directory is search as well.
429438 When the return value of a user-defined function was truncated, the server created a temporary string that was not freed until the cursor was closed. This problem only occurred with multibyte character set databases. This has been corrected.
429527 The changes for Engineering case 404908, introduced a problem where obtaining parameter information on a stored procedure that was owned by a different user could have resulted in a crash.

The following Delphi code demostrates the problem:

procedure TForm1.Button1Click(Sender: TObject);

var

adoParams: Parameters;

nCnt: integer;

begin

mmoParams.Clear;

FAdoCommand.Set_ActiveConnection(ADOConnection1.ConnectionObject);

FAdoCommand.Set_CommandText("sp_test");

FAdoCommand.Set_CommandTimeout(30);

FAdoCommand.Set_CommandType(adCmdStoredProc);

adoParams := FAdoCommand.Get_Parameters();

adoParams.Refresh;

for nCnt := 0 to adoParams.Count - 1 do begin

mmoParams.Lines.Add(adoParams.Item[nCnt].Name);

end;

end;

This problem has been fixed.

429607 The Unload utility could have generated calls to dbo.ml_add_property() in the reload.sql file, even when they were not necessary. This has been fixed.
429629 The QAnywhere Server could have performed poorly if the consolidated database was IBM DB2. For the performance degradation to have been apparent, the consolidated database must have contained more than 100,000 undelivered messages. The performance issues included slow processing of messages by a JMS connector, slow expiry of messages, and slow removal of old messages. This has been fixed, but the fix requires the application of an upgrade to the DB2 consolidated message store using a SQL script. The script, patchdb2.sql, is located in the SQL Anywhere Studio 9.0.2 install directory under QAnywhere\sql. This directory also includes a readme.txt that details how to apply the script.
429794 The SQL Anywhere Webservice Client has been modified such that when a defined attribute resolves to NULL the behaviour is now equivalent to that of an undefined attribute. For example, the following client procedure instances behave as if the PROXY clause is not defined when their associated substitution parameters are NULL:

create procedure f2c("temp" float, proxyurl long varchar )

url 'http://localhost/f2c' proxy '!proxyurl'; // where proxyurl = NULL

create procedure f2c("temp" float, schemehost long varchar, path long varchar )

url 'http://localhost/f2c' proxy '!schemehost!path'; // where schemehost = NULL and path = NULL

create procedure f2c("temp" float )

url 'http://localhost/f2c'; // proxy not defined

whereas:

create procedure f2c("temp" float, hostname long varchar, path long varchar )

url 'http://localhost/f2c' proxy '!http://!hostname/!path'; // does not resolve to NULL even if hostname = NULL and path = NULL

can never resolve to NULL due to the static text within the value of the PROXY attribute.

An empty string '' is not treated the same as a NULL. If used within one or more substitution parameters, the empty string will resolve to an empty string - not NULL. In the case of the first two examples, if all substitution parameters were empty strings, the proxy attribute would equal '' (empty string). Conversely, in the fourth example proxy would resolve to 'http:///', whether the substitution parameters were NULL or '' (empty string).

Default Behaviour of undefined (or resolve to NULL) Attributes

- ** type - 'SOAP:RPC'

- namespace - URI composed of scheme, hostname and port:

If type 'SOAP:DOC' Http SOAPAction header is composed of URI/operation, where operation is the soap service endpoint. e.g.: if the operation at localhost is login, then the namespace = 'http://localhost' and the SOAPAction : "http://localhost/login"

If type 'SOAP:RPC' resulting Http SOAPAction header is SOAPAction : ""

- url - The URI 'NULL' is invalid. SQLCODE = -980

- proxy - no proxy.

- clientport - use any free port.

- certificate - no certificate.

- *header - no user defined HTTP headers.

- *soapheader - no soap headers.

Notes:

* header and soapheader clauses are a new features in 10.0.

** type substitution parameters are not supported prior to 10.0.

429846 The Interactive SQL utility would have reported a syntax error when attempting to execute a BACKUP DATABASE statement with the WAIT AFTER END clause from within a BEGIN ... END block. The parser was interpreting the "END" in "WAIT AFTER END" as the end of a BEGIN...END block, and then submitting only part of the block to the server for execution. This has been fixed.
429867 The Server Locate utility was truncating the server names in the list that was displayed to 20 bytes. This has been fixed. The displayed server names are no longer truncated.
429894 Executing an INSERT statement that used the ON EXISTING UPDATE clause, on a table whose primary key contained column(s) with default values, but did not provide a value for one of these default columns, could have caused the INSERT to perform incorrect data changes. This problem has been resolved.
429978 If a query contained window aggregate functions such as SUM(T.X) OVER (PARTITION BY T.Y), and the query had a subquery appearing in an EXISTS, ANY, or ALL predicate, then the query may have returned an incorrect result set. This has been fixed.

For example:

select id,

sum( quantity) over (partition by size )

from product p

where exists( select 1 from sales_order_items s where s.quantity > p.quantity )

and size = 'Large'

order by id

430086 After a deadlock occurred, the upload data for the tables prior the current table that caused the deadlock may not have been applied to the consolidated database by the MobiLink synchronization server if the following situations applied:

1) the MobiLink synchronization was running with the rowset size greater than 1: the command line option -s X (X > 1) was used or the command line contained no -s option;

2) the deadlock occurred when the MobiLink synchronization server was applying the upload operations in multi-row mode and there was no deadlock when the server was retrying to apply the same operations for the current table in single-row mode.

This problem is now fixed.

430149 When an existing entry was deleted from an index in a Java UltraLite database, the subsequent coalescing of index pages could have left the index corrupt. This has been corrected.
430229 If the LIST() function was used with a query over a large number of rows and the result of the function was also large, the query would execute slowly but would return the correct result. Changes have been made so that the same query will now execute much faster.
430425 If a column was defined with DEFAULT GLOBAL AUTOINCREMENT before the value of the Global_database_id option was set, and the new value for the option was 0, the max_identity value of the column would not have been set based on existing rows in the table. This has been fixed.
430442 When doing a restore from an archived backup image on UNIX platforms, the disk activity would have been very high and the restore would have taken a long time. This has been corrected.
430465 If an updateable table in an updateable cursor was defined in a SQL Remote or MobiLink article, retrieving the plan for the query could have caused the server to crash.
430554 Queries that contained predicates with subqueries that used a range clause (i.e., FIRST, TOP N, TOP N START AT M) may have returned an incorrect result set. The subquery had to have been correlated, and an ORDER BY clause was not specified. This has been fixed.

The following examples demonstrate the problem:

select * from product p where p.id > any( select TOP 10 prod_id from sales_order_items s where s.quantity > p.quantity )

select * from product p where exists( select TOP 10 START AT 2 * from sales_order_items s where s.quantity > p.quantity )

430564 If a connection executed a statement that caused the server's Java VM to start, and another connection that was executing a Java statemet was canceled, it was possible, although rare, that all connections could appear to hang (ie. deadlock) in the presence of DDL statements, checkpoints, backups, and possibly other operations, . This has been fixed.
430576 It was possible, although rare, for the server to hang while doing an ALTER TABLE. A deadlock problem updating histograms has been fixed.
430586 The Interactive SQL utility was failing to execute a ROLLBACK following a failed statement if the Auto_commit option was ON. The behaviour has been changed so that a ROLLBACK is now executed in this situation. Note, this is now the same behavior as DBISQLC.
430594 If a passthrough session contained "create variable" or "drop variable" statements, it was possible for SQL Remote to crash when applying the passthrough session at the remote database. A case sensitive string comparison for "VARIABLE" was being done, but if a create or drop variable command was executed in lower case during a passthrough session, the receiving side would fail to find the name of the variable, leading to the crash. The string is now converted to upper case before doing the comparison.
430606 MobiLink synchronizations through an IIS redirector could have failed if the http header sizes added up to an integer multiple of 2k, The problem has been fixed.
430742 Usually, the Interactive SQL utility sends statements to the database server for execution one at a time. When dbisql saw an IF statement with an ELSEIF clause, it would become confused as to where one statement ended and another began, which would have caused multiple statements to be sent to the server at the same time. This has now been fixed.
430899 When running on Solaris systems, the server will now use 'cp932' as the default character set when it detects that the locale is set to ja_JP.PCK. Perviously, it would have used 'iso_1' as the default character set.
431023 If a SQL Anywhere Webservice Client was defined with a PROXY clause and the proxy url, and/or the URL clause, contained a non-default port specification, the web service request may have failed. This has been fixed.

The following example illustrates a relevant use case:

alter procedure f2c("temp" float )

url 'http://hostname:8081/f2c'

type 'SOAP:RPC'

proxy 'http://proxy-host:8080';

431126 When starting db_backup on database, everything freezes: no connection, none can work.
431225 After uninstalling SQL Anywhere for Windows CE, the entry 'Deploy SQL Anywhere for

Windows Mobile' would have remained on the Windows Start menu. This has been fixed

431228 Specifying the connection parameter INT=NO (do not use integrated logins) would actually have been interpreted as 'use integrated logins' if the database was being autostarted, which would likely have prevented a connection from being made. This has been fixed.

Note, this problem also affects the Console utility and the plug-ins for Sybase Central.

431369 An INSERT statement with the ON EXISTING UPDATE clause could have failed with an incorrect referential integrity error. This would only have occurred if the table had a single column primary key, and there existed a row where value of this column was the same as another column value in the VALUES clause. This has been fixed, but a workaround would be to use an UPDATE statement when the primary key value already exists.
431697 When the OUTPUT command was used with the FORMAT LOTUS clause, UNSIGNED SHORT values greater than 32767 were exported as negative numbers. This has been fixed by writing out UNSIGNED SHORTs as numeric records.
431810 The server may have crashed, rather than return the error "OMNI cannot handle expressions involving remote tables inside stored procedures" (SQLCODE -823 : SQLE_OMNI_REMOTE_ERROR).

For example (x is a remote table)

declare @x int

declare @y int

select @x =1

select @y =1

if (select x from x where y = @y) = @x + 1

print 'yes'

else

print 'no'

This has been fixed.

431876 The Interactive SQL utility could have reported a spurious table missing error if a connection executed a SELECT statement, disconnected, then connected to a different database and executed an INSERT statement. The problem was due to the "Auto_refetch" option being on. This option was not sensitive to the connection being closed, which has now has been fixed.
431917 Engineering case 384238 changed the behaviour of the Ping utility, such that when run with the -q command line option "quiet: do not print messages", it would not have displayed a message if the server could not be found. According to the

documentation, a message is always displayed when an error occurs. This change has been reversed, so that error messages are now displayed.

431929 A SQLAnywhere SOAP webservice declared to return data in 'XML' would have returned the XML data in unencoded form. This has been fixed so that the XML data is now encoded and typed as an XMLSchema string type. A SOAP client will unencode the XML data and assign it as a string, suitable for post processing with an xml parser. The following SOAP response of a hello_svc webservice demonstrates this behaviour:

<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope...>

<SOAP-ENV:Body>

<tns:hello_svcResponse>

<tns:hello_svcResult xsi:type='xsd:string'><tns:rowset><tns:row><tns:hello>Hello World</tns:hello></tns:row></tns:rowset>

</tns:hello_svcResult>

<tns:sqlcode>0</tns:sqlcode>

</tns:hello_svcResponse>

</SOAP-ENV:Body>

</SOAP-ENV:Envelope>

A SOAP client will decode hello_svcResult element into a string as follows: <tns:rowset><tns:row><tns:hello>Hello World</tns:hello></tns:row></tns:rowset>

432032 When run on Unix systems with the -q "silent mode" command line option, dbisqlc would have crashed if a MESSAGE statement was executed with a TYPE ACTION TO CLIENT or a TYPE WARNING TO CLIENT clause. This has been fixed.
432068 Customer upgraded to resolve a bug and since applying the upgrade, they are unable to Synchronise - "Unable to connect to remote database. SQLCode = -140."
432074 When run on Windows CE devices, the server could have crashed if the language DLL could not be found or loaded. This has been fixed. A dialog stating the language DLL could not be found will now be displayed.
432090 For complex queries involving a large number of tables, the memory required to open a cursor could have been excessive. In some cases, this would have lead to "dynamic memory exhausted" errors. This has now been fixed.
432113 The server could have crashed while generating a graphical UltraLite plan. This has been fixed by adding a missing check for a NULL pointer.
432184 In PocketPC 2003 Applications, calling the MIN() function would have returned the MAX-Value, and the MAX() function would have returned the Min-Value. This has been fixed.
432212 If a user had been granted select permissions on a view which referenced a proxy table, but did not have select permissions on the underlying proxy table, querying the view inside an IF or CASE expression would have failed with a permission denied error. This problem has now been fixed.

Note that using the view outside of an expression would have worked fine.

432227 When using Open Client, there was a requirement that the servername that was specified as part of the Open Client login, was also the name of the database that the user was attempting to connect to. The reason for this requirement was due to the fact that the database name that is usually specified as part of an Open Client connection actually does not get sent until after the connection is establised. This model of sending the database name after the connection is established works for ASE, since in ASE the connection is to the master database first, and then switches to the specified database once the database name is sent. However, in the case of SA, there is no master database so SA needs to know at login time which database the user wants to connect to.

A new feature has now been implemented so that the SA server will allow connections to the default database, even though the Open Client login server name does not match the name of the default database, provided that the connection string does not involve starting a database (i.e. there is no DBF=), and the server is only running one database. If both of these conditions are met, then the Open Client connection will be allowed to the default database.

432246 If a query had a predicate of the form 'T.col1 = DT.col2', where DT was a derived table or view, and T.col1 and DT.col2 had different domains, it was possible for the server to return an incorrect result. This has been fixed.

For example:

create table T (x tinyint);

create table R (x smallint);

SELECT * FROM R, (SELECT T.x FROM T GROUP BY T.x ) dt

WHERE R.x = dt.x

432297 Graphical plans written to the server log had information missing 'Optimizer statistics' sections. The following information is now displayed for these plans:

CurrentCacheSize Current cache size in kilobytes

Isolation_level Controls the locking isolation level

Optimization_goal Optimize queries for first row or all rows

Optimization_level Reserved

Optimization_workload Controls whether optimizing for OLAP or mixed queries

ProductVersion Product version

User_estimates Controls whether to respect user estimates

Note, logging graphical plans to the server log is enabled by starting the server with the -zx command line option, or by calling the system procedure sa_server_option:

sa_server_option ( 'RequestLogging', 'NONE' );

sa_server_option ( 'RequestLogFile', {file_name} ); -- append to file

sa_server_option ( 'RememberLastPlan', 'ON' );

sa_server_option ( 'LogExpensiveQueries', {x} ); -- cost {x} threshold in milliseconds

432537 The OLE DB provider did not properly support 4-part queries when used with the SQL Server 2005 Linked Server feature. For example, attempting the following SQL statement in Microsoft SQL Server 2005 Management Studio:

SELECT * FROM ASASERVER..dba.customer

would have caused the error:

Msg 7320, Level 16, State 2, Line 1 Cannot execute the query

However, the OPENQUERY form of SELECT works fine:

SELECT * FROM OPENQUERY( ASASERVER, 'SELECT * FROM customer')

This problem has now been fixed. Note, this problem does not appear with SQL Server 2000.

432545 A problem was introduced with the changes for Engineering case 419782, such that if a query contained two subselects S1 and S2, and subselect S2 referred to S1 using an alias, and S1 does not appear in the select list returned with S2, then S2 may have returned incorrect results. This has been corrected. The most common failure mode would be to return the same value for multiple rows (not re-evaluating as needed).

The following query demonstrates this problem:

SELECT row_num,

SS2

FROM

(

SELECT R.row_num,

( SELECT R.row_num FROM sys.dummy D1 ) AS SS1,

( SELECT SS1 + (100*row_num) from sys.dummy D2 ) AS SS2

FROM dbo.rowgenerator R

) DT

The problem can be worked around by including both subselects in the result set of the query.

432574 Constants were not being allowed as SELECT expressions with aggregate queries.

For example:

INSERT INTO tab( pk, col1) SELECT max(pk)+1, 15;

SELECT sum( pk ), 'a constant' FROM tab GROUP BY col1;

This has now been corrected.

432645 After setting stream parameters, a Synchronize with callbacks would have lost the stream parameters, preventing the connection/sync from happening. This has been fixed. The only workaround is to not use callbacks for the Synchronize operation.
432730 The server may have crashed, although occurences would have been rare, if multiple connections ran the same stored procedure for the first time after the database was started, and the procedure was used in a select statement. This has been fixed
432886 Attempting to reference a hexadecimal literal with an odd number of characters between 9 and 15 characters long inclusive, would have caused a syntax error.

For example:

select cast( 0xF1234ABCD as bigint );

This has been fixed, as now an extra zero is added to the front of odd length hexadecimal strings. Note, hexadecimal strings that are odd in length, and too large to fit into a BIGINT, will still generate a syntax error.

432903 The server could crashed if an updatable keyset driven cursor was opened for a query that had a predicate with an IF or CASE expression over a subquery. This has been fixed. This is a similar issue to Engineering case 430465.
432929 Normally, QAnywhere works against any consolidated database that MobiLink supports. However, MobiLink supports DB2 UDB 7.2 only with caveats. Those caveats make it impossible for QAnywhere to work against a DB2 UDB 7.2 consolidated database, and the documentation was not clear on this. In fact, there is a small chance of message corruption if DB2 7.2 is used as a consolidated database for QAnywhere. Now, attempting to to start a QAnywhere MobiLink server against a DB2 UDB 7.2 database will result in an error. Similarly, trying to administer such a database with QAnywhere Central will also result in an error
433047 The LOAD TABLE statement could have incorrectly loaded multi-byte character data, due to incorrect accounting for a split character in a buffer. The loaded data would appear to have characters or bytes within it that were not part of the original data. This has been fixed.
433072 If a keyset-driven cursor (value sensitive cursor) was opened on a query that contained a derived table used on the null-supplying side of an outer join, and the derived table contained a subquery, then, depending on the access plan selected, the server could have crashed, or in some cases, the wrong answer could have been returned for the query.

The following is an example of the type of query that would be affected by this problem if used in a keyset-driven cursor:

select ( if D1.y is null then 0 endif ) as z

from T1 left outer join

( select T2.b,

cast( sum( if T2.c = any( select T3.e from T3 WITH ( INDEX(T3) )

where f in( 1001,1020,1040,1080,10100,10200,10400,10500,101000,102000))

then T2.d

endif) as numeric(12,4) ) as y

from T2

group by T2.b

) as D1

on T1.a = D1.b

The incorrect behaviour relies on the specific access plan selected. This problem has been fixed.

433164 Engineering case 418264 introduced a problem such that if the server crashed while executing a CREATE VIEW operation, there was a small window of opportunity where the database could have become unrecoverable. The redo-log processing would have failed trying to recreate the view. This has been fixed.
433272 The docs suggest that a filedsn is searched for in various locations, but in fact its chacked only in the root directory.
433281 If a transaction log was renamed and a new one started, and there were transactions that spanned the old and new transaction logs, then it was possible for any of the log scanning tools (dbmlsync, dbremote, dbltm or dbtran) to crash while processing the two transaction logs in sequence. This problem has now beem fixed.
433331 The Deployment Wizard, and resulting MSI installations generated, now supports French, German, Japanese and Simplified Chinese in addition to English. A dialog box allowing the selection of a language will appear when the Deployment Wizard is run, which is the language that will be used when subsequent installations are generated.
433340 If a column was renamed, and was part of a foreign key defined with ON {UPDATE | DELETE} {CASCADE | SET NULL | SET DEFAULT}, the system trigger for the foreign key would still have contained a reference to the old column name and would have failed when executed. Similarly, if one of the key columns referenced by such a foreign key was renamed, the system trigger was not updated. This has been fixed.
433341 If there was a transient connection problem with the consolidated database server, it was possible that a message being transferred from QAnywhere to JMS would have been duplicated. This problem would have occurred after a message was transferred from QAnywhere to JMS. The transfer acknowledgement is stored in the consolidated database, and if there was a temporary difficulty accessing the database, the transfer would not have been acknowledged. At a later time (not necessarily immediately), because the acknowledgement was lost, the message may have been re-transferred from QAnywhere to JMS. This problem has been fixed, although, if the connectivity with the consolidated server is not resumed in a timely manner it is still possible the message may be duplicated.

Note that we do not guarantee that duplicates will not be delivered from QAnywhere to JMS, but duplicates should only occur in rare situations, for example where the QAnywhere MobiLink server or the dbms or the JMS server was to crash.

433428 Using SQLBindCol to bind to a variable that was not naturally aligned would have resulted in an error on AIX and Mac OS X (PowerPC) systems, even though these platforms can handle this situation properly. The 2-byte, 4-byte, and 8-byte alignment requirement has been removed for AIX and Mac OS X platforms.
433460 The Interactive SQL utility was displaying messages that contained ampersands incorrectly. Ampersands were removed from the text, and the characters following the ampersands were underlined. This has been fixed.
433484 The server may have crashed if an UPDATE statement contained a subquery with a GROUP BY clause, and the subquery was merged into the main query block. This has been fixed.
433564 It was possible that the generation of notifications to the cliemt, for messages that were available on the server for that particular client, might be delayed. The problem was that the determination of whether notifications should be generated was serialized. Hence, if the determination conditions were slow for a particular client (because of complicated transmission rules), then the determination for all other clients would have been held up. This has been fixed so that slow determination of notifications for some clients will not hold up the determination of notifications for other clients.
433577 The data in TIME columns in a remote database might not have been uploaded or downloaded properly. After synchronization, the fractional part of the second would always be zero. This problem is fixed now.
433582 Engineering case 428075 introduced a problem where the server could hang when starting a database read-only that was stored on a CD-ROM. This has been fixed.
433696 On Windows CE, sending messages to a queue could have taken longer and longer over time. This would have occurred when messages were not received by a receiver, or transmitted from the message store. This has been fixed so that the time taken to now send a message to a queue stays fairly constant, even as messages build up in the queue.
433717 The Windows x64 version of the OLE DB provider did not align the data areas for columns on memory boundaries. This was resulting in run-time errors. This problem has been fixed.
433726 The Windows CE version of the OLE DB Provider could have failed when attempting conversions to and from Variant types. Also, some properties were not supported properly under Windows CE and would have incorrectly returned errors. These problems have now been fixed.
433730 If a domain was dropped and re-created within a batch, and the batch also included a subsequent reference to the domain in a CREATE TABLE or ALTER TABLE statement, the server could have crashed. This has been fixed.
433741 Although rare, the server may have crashed if at that moment a shared memory connection was being established, the client process disappeared. For the same reason a client application may have crashed if the server disappear at the moment the application was about to establish a shared memory connection. This has been fixed.
433829 It was not possible to interrupt or cancel execution of a CREATE STATISTICS statement. As a consequence, if an exclusive operation such as a CHECKOINT started in the middle of executing a CREATE STATISTICS statement, then all other connections would have had to wait until both the CREATE STATISTICS and the CHECKPOINT completed executing. This problem has been resolved by having the CREATE STATISTICS operation context switch.
433934 A memory leak may have occurred when web service client procedure parameters were converted to Strings for XML or HTML representation. This has been fixed.
433982 QAnywhere Java clients now support Windows CE running Windows Mobile 2003 and the J9 VM. The J9 VM is the core of WebSphere Everyplace Micro Environment (WEME), an IBM(TM) implementation of the Java Virtual Machine Specification, Version 1.3. The supported J9 runtime is J2ME Personal Profile 1.0 (JSR-62), based on the CDC/Foundation Profile.
434156 JBoss JMS message property names must begin with an alpha character, can contain only alphanumeric and underscore characters, and must not be the same name of any of the JMS Defined Properties (as listed in section 3.5.9 of the JMS 1.1 spec), that are defined as being set by the provider. These include JMSXUserID, JMSXAppID, JMSXDeliveryCount, JMSXProducerTXID, JMSXConsumerTXID, JMSXRcvTimestamp, or JMSXState. Using a property name that JBoss does not support in a QAnywhere message, and then sending that to JBoss JMS via a configured QAnywhere connector, would have caused problems. The connector would have tried to deliver the message to JBoss continuously until the message expired, was cancelled, or was deleted. This problem has been fixed so that the problematic property name problem will be detected as message-specific, the message will be marked as unreceivable, and the connector will no longer try to deliver the message. If the property ianywhere.connector.outgoing.deadMessageAddress is set to a non-empty value, then a copy of the message will be sent to that address value.
434229 If the Transact-SQL compatibility option CHAINED was set to Off, and the database contained scheduled events, attempting to unload the database would have resulted in the error "COMMIT/ROLLBACK not allowed within atomic operation". This has been fixed. A workaround is to set the chained option to ON, unload the database, and then restore the option setting.
434305 The QAnywhere MobiLink server could have hung on shutdown if all the following conditions occurred:

- There was a problem accessing the consolidated database, for example, the consolidated database engine crashed,

- There were messages queued for delivery from QAnywhere to an external JMS server via the QAnywhere JMS connector,

- An upload message transmission had just occurred, containing messages meant for the QAnywhere JMS connector

If a shutdown was attempted at this point, it was possible that the QAnywhere MobiLink server would not shutdown. As a work around, either the database server would have to be brought back on line, or the QAnywhere MobiLink server process would have to be killed. No message data would be lost. This has now been fixed so that a shutdown should not hang under these circumstances.

434318 The QAnywhere MobiLink server could have processed, and subsequently not delivered, incoming JMS messages to its QAnywhere JMS connector if the QAnywhere MobiLink server consolidated database was inaccessible, for example because it had crashed. This has been fixed by allowing the default value of the ianywhere.connector.incoming.retry.timeout property to be set to -1, and making this the default. This means the connector will not give up trying to send the message.

As a work around, the connector property ianywhere.connector.incoming.retry.timeout can be set to a very large value, for example 1000000000. This property indicates how many times the QAnywhere connector will retry transferring a JMS message to QAnywhere before giving up. Unfortunately, the default value for this property was set to 5, which was much too low. It was not documented, improperly named, and had no support for specifying an infinite value. In recognition that this property's name implies a duration rather than a number of retries, a new property, ianywhere.connector.incoming.retry.max, has been added as a replacement for ianywhere.connector.incoming.retry.timeout. The property ianywhere.connector.incoming.retry.max indicates the maximum number of times the connector will retry transferring a JMS message to QAnywhere before giving up. The default is -1, which indicates that the connector will never give up. Please now use this new property.

Also, the fact that the QAnywhere connector had given up trying to transfer the message, was also not added to the dead message destination. Now, if the connector reaches the maximum number of subsequent failed attempts to transfer a JMS message to QAnywhere, the JMS message will be re-addressed to the ianywhere.connector.jms.deadMessageDestination property value.

434364 If an external function DLL name contained a non-ASCII character, and the OS and database character sets were different, then the external function DLL would have failed to load with the following error:

Could not load dynamic library '<dll name>' [-620] ['WW006']

The external function DLL was being loaded using the name of the DLL encoded in the database's character set. This has been fixed so that the external function DLL is now loaded using the name of the DLL encoded in the native character set.

434469 The server may have crashed if a trigger on a table that had multiple triggers for the same event (ie. foreign keys with CASCADE referential actions), was currently executing and another connection's operation (e.g. create publication, alter table/view/publication, drop table/view/publication/domain, revoke) marked all the triggers for reload. This has been fixed.
434510 Any variable name in an HTTP request that was HTTP encoded (e.g., "Test%20Name") was not being HTTP decoded before being presented to the user. This has been fixed.
434597 Opening a table in extremely low memory conditions may have caused an UltraLite application to crash. The Open() method on the generated class for a table calls ULTable::init() (in ulapi.c). This method then calls ULOpenBegin(), which could fail to allocate memory for the cursor if enough memory was not available. When this happens, an error is set, UL_RUNTIME_EXIT() is called, and NULL is return. The implementation of init() was checking for the NULL return, but also calling UL_RUNTIME_EXIT() again. This would have put the runtime into a state where the next call to the runtime would cause a crash. This is now fixed.

Since ulapi.c is a distributed source file, a work around for this problem is to remove the first call to UL_EXIT_RUNTIME() in ULTable::init().

434601 If a procedure appeared in a select's FROM clause, and the procedure's select list exceed the syntactic limit of the server, the server would have crashed during execution of the CREATE PROCEDURE statement. This has been fixed.
434602 A new server command line option has been added, -su <password>, in order to specify the utility_db password, and deprecate the use of the util_db.ini file. Also, the GRANT CONNECT statement now allows changing the utility_db password, and the REVOKE CONNECT now allows disabling connections to the utility_db

New option documentation:

-su server option

Function: Set the password for the DBA user of the utility database (utility_db), or disables connections to the utility database.

Syntax: { dbsrv10 | dbeng 10 } -su password ...

Applies to: All operating systems and servers.

Description:

This options specifies the initial password for DBA user of the utility database. By using a value of NONE for the password, all connections to the utility database are disabled. You may wish to use dbfhide to obfuscate the password, and reference the obfuscated file on the command line.

If this option is not specified, the personal server allows connections with the DBA userid and any password. If this option is not specified, the network server does not allow connections to the utility database unless the util_db.ini file exists and the userid is DBA with a password which matches the password in the util_db.ini file. On a network server, if both -su and util_db.ini are used, util_db.ini is ignored.

Note util_db.ini is deprecated and will be removed a future version of SQL Anywhere. While connected to utility_db, the GRANT CONNECT TO DBA [IDENTIFIED BY 'new_password'] statement may be used to change the password for the DBA user of the utility database, and the REVOKE CONNECT FROM DBA statement can be used to disable connections to the utility_db.

Examples:

dbeng10 -su None demo.db

create util_db_pwd.cfg containing only the text "utilpwd"

dbfhide util_db_pwd.txt util_db_pwd_hide.txt

dbsrv10 -su @util_db_pwd_hide.txt -n my_server demo.db

See also:

- utility database

- util_db.ini

434603 If the method AsaConnection.GetSchema was called while the connection already had a transaction, an exception would have been thrown. This problem has been fixed.
434641 Use of an IF or CASE expression in an OLAP window function argument would have given a wrong result, unless the leading edge of the window was always the current row (e.g. when using "range between x preceding and current row"). This is fixed.
434647 When upgrading a version 9.0.1 database to version 9.0.2, some views would have been missing. This would not have occurred if the starting database was older than version 9.0.1. This has been fixed.
434740 When using ECC or TLS encryption to connect, a number of parameters about the encryption certificate are specified, including the cerfificate company, unit and name. When an ODBC datasource was created with these parameters, it was necessary to specify all of the parameters. Omitting one of the parameters would have left the value empty in the connection string, possibly preventingthe connection from being made. This has been fixed so that empty parameters are no longer added to the connection string.
434808 A QAnywhere message listener could have been starved of messages waiting to be delivered. If two or more listener were on a QAManager, and messages were put in the queue of one of the listeners as fast as it could process them, the other listeners would not have received any messages, even if there were messages in its queue. This has been fixed so that messages are delivered to listeners one at a time, with a round-robin algorithm.
434814 A QAnywhere application could get into the situation where an excessive amount of CPU was being used. This would typically happen on Windows CE devices when three or more QAManagers with message listeners were opened and started. The problem can be avoided by increasing the database server's maximum number of concurrent requests (using the -gn option). For a QAnywhere application, the rule of thumb for the -gn value for the database server is: 3 * (number of QAManager's ) + 2. The "+ 2" is for the qaagent and dbmlsync. This has been corrected by adding a heuristic check to the QAManagerBase.Open method, so that it will fail when it detects that the number of active requests in the database server is too close to the maximum number of concurrent requests for that server.
435039 When starting a database on a running server by passing the DatabaseFile parameter (DBF), if the DatabaseKey parameter (DBKEY) is passed unnecessarily, the server prints a warning message using the database file name. If the database being connected to was the utility_db, for which there was no actual file, the server would have crashed. This has now been fixed.
435045 If multiple blobs were synchronized from a remote to the consolidated, and the -bn command line option was used on the MobiLink server, it was possible for the MobiLink server to have hung while processing the download stream for this synchronization. This problem has been fixed so that synchronization of blobs will now complete as expected.
435053 If all other server threads were blocked, and the last server thread attempted to execute a WAITFOR statement, the statement would have failed to wait and server usage would have risen to 100%. The wait failed as a thread deadlock would have occured on a wait. Executing WAITFOR on the last non-waiting thread will now generate a thread deadlock error and will no longer result in 100% CPU usage.
435083 Changing the rowset size (SQL_ATTR_ROW_ARRAY_SIZE) from a smaller to a larger value between calls to SQLFetchScroll, when using bookmarks on 64-bit platforms, would have caused the application to crash. The driver was not freeing the bookmark buffer, but was reusing the existing buffer without growing it. This problem has been fixed.

Note, a similar problem with the SQL Anywhere OLE DB provider on 64-bit platforms has also been fixed.

435217 If the upload_update synchronization event had been defined to accept both the new and old row values being synchronized, the table contained blob columns, and a new row value for one of the blob columns was of zero length, then the MobiLink Server would have returned the error : "Error: INTERNAL ERROR: occurred while retrieving a BLOB -- zero length". This problem has now been fixed.
435243 The server could have crashed when running a stored procedure following the execution of a DDL statemnt against the server. The server was failing to detect that a cached plan for a procedure that has been reloaded (due to a schema version change), was no longer valid. This has been fixed by not allowing plans to be cached if the procedure is flagged as needing a reload.

A workaround is to set the option MAX_PLANS_CACHED to zero (although this will hurt the performance of stored procedures).

435328 The ODBC function SQLBindParameter could have incorrectly reported an "Invalid String or Buffer Length" error if parameters were passed at execution time. The check that would report this error to the SQLExecute call is now delayed, ensuring that the error is only reported when it is valid.
435348 If an HTTPS connection was closed by the client while the initial connection handshake was still in progress, the server could have crash. This has been fixed.
435511 The MobiLink Monitor could have shown invalid counts for upload-only or download-only synchronizations, or possibly have shut down unexpectedly. This has been fixed.
435643 The FIPS parameter (when specified using the -xs or -ec server command line options) was ignored when the server was run on platforms that do not support FIPS. This has been fixed so that now if FIPS=YES is specified on a platform that does not support FIPS, an error message will be given, and the server will not start.
435859 The ON EXISTING UPDATE clause of the INSERT statement can be used to update an existing row. The server now requires UPDATE privileges on the target table, in addition to the current INSERT privileges, if the ON EXISTING UPDATE clause of the INSERT statement is used.
435885 If a database was upgraded using the Upgrade Database wizard, jConnect support would always have be installed, regardless of whether the "Install jConnect meta-information

support" check box was checked or not. This has been fixed.

435890 After pressing Finish in the Upgrade Database wizard, it was possible to still cancel the upgrade operation by pressing the Escape key, even though the Cancel button was disabled in the Upgrading Database dialog. This has been fixed so that now Escape key presses are ignored while the database is being upgraded and the Cancel button is disabled.
435951 Expressions involving arithmetic operations with numeric data could have yielded results with a precision that was greater than the maximum allowed by the PRECISION database option. This has now been fixed.
435957 Calling the method UltraLite_Table::UpdateBegin, while on a row that had been deleted by another cursor, would have caused the next row in the index to be updated instead. This has been fixed. Now the UpdateBegin call will fail with SQLE_NOTFOUND.
435960 When an update was done to a row, any other cursors that were pointing to that row could have lost the results of previous UltraLite_Table::Set calls. This has been fixed.
436098 Calling the QAManager Close() method could have taken up to 1 minute to return. The background receiver thread could have been interrupted, resulting in a cancel request which took a minute to timeout. Now the cancel request is retried until it succeeds, so the Close() method will always complete in a reasonable amount of time.
436194 Attempting to autostart a server and database would fail if the DatabaseFile (DBF) parameter contained both apostrophes (single quotes) and spaces. This has been fixed.

Note, that apostrophes in database file names are not supported by CREATE DATABASE and other tools, so using apostrophes in database file names is not recommended.

436293 When run on Unix systems, utilities such as Interactive SQL, when looking for a file with a filename with no extension, might fail to find the file even when present. The routine doing the search was appending the filename with a dot ".", even when there was no extension to add. This has been fixed.
436306 Attempting to make an encrypted connection using transport-layer security, from a

non-threaded Unix clients, would have caused the application to hang. This has now been fixed.

436437 If the command history file could not be saved, the Interactive SQL utility would have reported an internal exception (NullPointerException in PlainView.updateMetrics) on shutdown. This has been fixed.
436457 The server could have leaked memory if user-defined datatypes containing check constraints were used as column datatypes when creating tables. This would have resulted in a server slowdown, and eventually a "memory exhausted" error. This has been fixed.

In the course of fixing this problem a second memory leak was found that affected columns that had check constraints, but were not user defined datatypes. This has been fixed as well.

436484 The database option, DELETE_OLD_LOGS, has been extended so that SQL Remote, RepAgent and MobiLink delete offline transaction logs will wait before deleting offline transaction logs. The option can now additionally be set to a positive integer ('n D', 'n d', or 'n DAYS') which is the number of days to wait before deleting logs.

For example, running dbmlsync on 2006-08-18, against a remote database that contains "DELETE_OLD_LOGS = 10 days", will cause dbmlsync to only delete the offline transaction logs that were created on or before 2006-08-07. Any offline transaction logs that were created after 2006-08-07 will not be deleted, even if these offline transaction logs are no longer needed for synchronization.

436575 When using the QAnywhere JMS connector, a message may have appeared in the server log indicating that a problem with anywhere.ml.jdbcodbc.IConnection.setAutoCommit had occurred. The problem was with respect to resetting the autocommit status of a database connection used by the QAnywhere JMS connector. The error had no effect on the performance or accuracy of the connector, but the cause of the error has now been removed and the message should no longer occur.
436578 A message available for download to a client may not have been downloaded. The message was not lost, and would likely have been downloaded on the next synchronization of that client. The problem could only have occurrec if the transmission rules used for the client included a reference to a custom message property. This has been fixed.
436685 It was possible to create user IDs, server names and database names which required the user to quote the value in a connection string. In order to make it easier to connect, these user IDs, server names and database names are no longer allowed. The following are now invalid for use as user IDs, server names and database names:

- strings that begin with white space, or single or double quotes

- strings that end with white space

- strings that contain semicolons

436708 If the Unload utility was used with the -an or -ar command line options, on a database with encrypted tables enabled (and contained at least one encrypted table), and neither the -et nor -er switches were used, it would have created the new database and then failed with the error "This database does not support encrypted tables". This has been fixed so that dbunload now requires that one of the -er or -et switches must be specified when reloading a database that has encrypted tables enabled, and will display a message to that effect if neither switch has been given.
436711 If a view was marked as disabled, and permissions had been granted for it, attempting to rebuild the database would have resulted in an error when the GRANT statements for the view were executed. This has been fixed by moving the the GRANT statements until after the ALTER VIEW ... DISABLE statement when rebuilding a database.
436988 The Listener utility for Windows, now logs the command line options when verbosity is 1 or higher.
436994 Illegal XML element names would have been generated within the WSDL output of a SQLAnywhere DISH service whose name contained one or more forward slash ('/') characters. This caused some SOAP toolkit clients to fail, notably, Visual Studio 2003 C# .NET will fail to 'Add WebReference' if the DISH service name contained a '/'. This has been fixed so that DISH services may not be created or altered if the service name contains a forward slash.

Note, any other service name may contain a forward slash.

437013 UPDATE and DELETE statements that were automatically generated by the provider would have failed if table had nullable columns. This problem has been corrected.
437104 The Listener utility for Windows, when shutdown on CE devices under heavy load may have taken a long time. Changes have been made to improve shutdown times when the device is under load.
437122 When using Interactive SQL in console mode (ie with -nogui command line option), result sets data could have been truncated unnecessarily if the column name was shorter than any of the data in the column, and if the column data contained leading and/or trailing blanks. This has been fixed.
437144 The ALTER MATERIALIZED VIEW ... DISABLE statement can be used to disable a materialized view. If the materialized view being disabled was referenced by other views, i.e., had dependent views, then the ALTER statement would have failed with an error. A work-around is to disable the dependent views explicitly before attempting to disable the referenced materialized view. The server will now allow the ALTER statement to succeed. Remember that disabling a view, materialized or otherwise, also disables all dependent views. In addition, for materialized views, all materialized data is deleted and all indexes dropped. If and when the materialized view is re-enabled, indexes must be recreated and the data refreshed.
437162 The information for procedure and function parameters in the catalog could have contained incorrect values for the user_type and default fields. This has been fixed so that the catalog information is now generated correctly.
437266 If a proxy table was created that referenced a table that had columns with unsigned datatypes (i.e. unsigned smallint, unsigned bigint, and unsigned int), then querying the data of the proxy table would have given incorrect conversion errors. This problem has now been fixed.
437270 In rare situations, the server could have stopped processing requests for a database when one user was attempting to CREATE, DROP or ALTER a procedure while other users were calling procedures. This has been fixed.
437296 If an RPC call was made to an ASE remote server, the call may have failed or hung. The problem was due to to the fact that RPC calls to ASE usually need to be made with AUTOCOMMIT on. RPC calls are now always made with AUTOCOMMIT on regardless of the back end, whereas previous calls were made within a transaction with AUTOCOMMIT off.
437306 It was possible, although extremely rare, for a database to get into an inconsistent state, where some rolled back transactions would appeared to have been committed. The chances of this happening were moret likely when performing several large operations without doing any commits, and the operations also spanned checkpoints. The connection doing the operations would have needed to be disconnected before committing, and then the server must have gone down dirty at the appropriate time. It also would have been more likely when 'savepoints' and 'rollback to savepoint' were used. This has now been fixed.
437392 A new MobiLink server HTTP stream option, called session_key, has been added. This option determines how the MobiLink server tracks non-persistent HTTP sessions.

The option is used as follows:

dbmlsrv9 ... -x http(...;session_key=[cookie|header];...) ...

When the session_key is cookie, an HTTP cookie is used to track HTTP sessions. When the session key is header, an HTTP header is used. The default value is cookie.

437399 If a repeatable notification was sent, and the confirmation was not received within the acknowledgement timeout of the delivering gateway, the notifier would have started polling the database once a second. This problem has been fixed.
437586 Attempting to use IBM's J9 VM with Native UltraLite for Java would have caused exceptions regarding deprecated methods in DatabaseManager. IBM's J9, based on CDC 1.1/Foundation 1.1/Personal Profile 1.1, is now supported.
437684 Results of aggregate functions might have been described as belonging to a user-defined domain, but the underlying data type would not have matched the definition of the user-defined domain.

In a related issue, the result of casting a value to a user-defined data type might not have been described with the appropriate user-defined domain.

Both these problems have been fixed.

437688 If a relative path name is used in a READ statement, and the READ statement itself appears in a .SQL file, the directory containing the calling file is now searched when resolving the name of the called file. As an example, suppose there are two files, "test1.sql" and "test2.sql", both in "c:\test", and that "test1.sql" contains the line:

READ test2.sql;

If the current directory is "C:\Home", and the following is run:

DBISQL c:\test\test.sql

the READ statement is now able to resolve the relative file name "test2.sql" to "c:\test\test2.sql" by using the folder name of the file which contains the READ statement. Previously, "test2.sql" would not have been found unless it was in the path, or SQLPATH.

437700 When the database option Temp_space_limit_check was set to 'on', the temporary file space used by user temporary tables, such as those created with DECLARE LOCAL TEMPORARY TABLE, was not included in the temporary space limit checking. This has now been fixed.
437815 A client application would have crashed when a connection attempt was made using a connect string that used the hash char '#' in place of the equal sign '=' for the CommLinks option VerifyServerName (e.g. "Verify#No"). This has been fixed.
437957 The error message: "Package 'SQL Anywhere Explorer' has failed to load propertly... ", would have been displayed when attempting to open SQL Anywhere Explorer in Visual Studio 2005. This problem has been fixed.
437964 Compilation errors could have been produced if an application contained a TRUNCATE TABLE statement on a table that was not referenced in other statements, and there existed a foreign key which referenced a table that was referenced in other statements. This has now been corrected.
438075 If the server was started with the TCP/IP option ServerPort=0, no connection through that link was possible, and the client error message did not help in diagnosing the cause. This has been fixed so that the server can no longer be started if one of the specified server ports is 0, and the error message "Illegal value for option 'ServerPort'" will be displayed.
438119 If a connection was made from Sybase Central to a SQL Anywhere server, using the iAnywhere JDBC Driver, and then a subsequent connection attempt was made to an ASE server within the same Sybase Central session using the ASE plug-in and jConnect, the connection to ASE would have failed. This problem has been fixed.
438139 If a database having dbspaces with fully-qualified pathnames was backed up, there was no way to start the backed-up copy of the database on the same machine as the original database, while the original database was still running. A new server command line option "-ds <dir>" has been added to tell the server where to find all of the dbspaces and transaction log for the database. The START DATABASE statement has a new clause as well to provide the same information:

START DATABASE 'db-file' ... DIRECTORY 'dbspace-directory'

When a dbspace directory is specified, the server will look only in that directory for the files for that database. For example, if the server is started in the same directory as all of the dbspaces, adding "-ds ." will tell the server to find the log and all dbspaces in the current directory.

During startup, a message will be displayed in the server messages window, e.g.:

Opening dbspace file 'path\sp1.db'

to indicate the location of the dbspace.

438141 If the ulload utility was used (without using the -i option) to load data into a _nosync table, then any future deletes to those loaded rows would have been leaked. This may eventually have caused UltaLite to hit its 64K row limit (SQLE_DBSPACE_FULL error will be raised in this case). There was no way to clean up the leaked rows, so the table could no longer have been updated once the 64K limit was reached.

The workaround is to use ulload -i. This has been fixed by effectively invoking the -i functionality, but only for _no_sync tables. So now rows populated through ulload can be deleted, and they will be physically removed from the database on a commit.

438225 It is now possible to change the setting of the "Show multiple result sets" checkbox (Tools->Options->results), using the SET statement. The name of the option is "isql_show_multiple_result_sets". Allowable values are "on" and "off" (case-insensitive).

For example:

SET TEMPORARY OPTION isql_show_multiple_result_sets = on;

This is not a new option per-se, but the ability to modify it from the SET statement is new.

438231 Attempting to execute a statement using the Open Client isql utility, that failed with a conversion error, and which referenced to a proxy table, would have leaked cache memory. If such statements were executed many, many times, the server would have eventually failed with a "Fatal Error: Memory Exhausted". This has now been fixed.
438265 On Unix platforms, if the sum of the lengths of all the keys in the [ODBC Data Sources] section of .odbc.ini, added to the number of the keys in the section, equaled one less than some multiple of 100 (i.e., 99, 199, 299, etc.), calling SQLDataSources may have caused memory corruption. This has been fixed.

A workaround is to change data source names such that the above condition is avoided.

438405 When using the Database Tools interface, calling DBToolsInit followed by DBToolsFini, would have resulted in a few kilobytes of memory being left unfreed. The amount would have been relatively constant.

Calling DBSynchronizeLog, would also have resulted in memory being left unfreed. The amount of memory left unfreed was proportional to the number of articles contained in all the publications involved in synchronization subscriptions in the database being synchronized.

Both of these memory leaks have now been fixed.

438514 The MobiLink Listener (dblsn.exe) may have appeared to hang indefinitely, resulting in the necessity to kill it, while shutting down the QAnywhere Agent. The QAnywhere Agent hangs indefinitely waiting for the MobiLink Listener to shutdown. This would have happened when the QAnywhere Agent was shut down soon after starting, after dblsn had been launched and before dblsn was ready to receive a shutdown command. This has now been fixed.
438528 The name of the table's owner was not being added to automatically generated INSERT, UPDATE and DELETE statements by ADO.NET 2.0 provider. This has now been fixed by setting the BaseSchemaName to the table's owner.
438529 When a repeatable notification was sent, and the confirmation was not received within the acknowledgement timeout of the delivering gateway, the notifier would have deleted the request prematurely without respecting the repeatability of the request. This problem was introduced by the changes for Engineering case 437399, and hais now been fixed.
438857 The server could have incorrectly detected CPU characteristics, such as the number of physical and logical cores, when run on some newer processor architectures. This has been fixed.
438976 Executing a STOP ENGINE statement would not have caused the Interactive SQL title bar text to revert to "(Not Connected)". As a result, users may have had the impression that they were still connected, even when they weren't. The title text is now updated after execution of a STOP ENGINE statement if the connection is closed.
439163 The error "Too many connections in use" may have appeared in the QAnywhere MobiLink server log. It may have occurred if a JMS connector had been configured and started, and the JMS connector was handling a large volume of incoming messages from JMS to QAnywhere. The error would not have affected accurate delivery of messages, but may have had an impact on performance. This has been fixed.
439201 Executing the ALTER TABLE statement on a table that contained deleted rows, could have left the table corrupted. This has been fixed.
439213 Global temporary tables were not listed in the "Lookup Table Name" window. There were inadvertently excluded, and are now listed.
439377 Two special values "default_internet" and "default_work", are now recognized for the network_name client synchronization parameter on Windows CE These values represent the default internet network and default work network, as specified via the Start->Settings->Connections->Connections dialog. The network_name parameter still accepts the name of a specific network profile as before.
439591 If the PASSWORD or DATABASEKEY connection parameters were entered on the Interactive SQL command line, any leading or trailing blanks would have been inadvertently trimmed, even if the string was quoted. The blanks are now preserved.
439597 The server may have crashed if a select list alias (e.g. "cols" in the example below) was used in a LIKE predicate.

For example:

select table_name,

( select list(column_name) from syscolumn a where a.table_id = b.table_id ) cols

from systable b

where cols like 't%'

This has been fixed.

439687 SQL Anywhere web service client HTTPS connections may have truncated received data. This has been fixed.
439693 Attempting to disconnect from a database which had already closed the connection, could have caused two error messages to be generated. One warning that changes could not be committed (if the Commit/On exit option was checked), and another notifying the user that the connect had been closed. Now, at most the warneing that changes could not be committed is displayed.
439705 If a query contained a nested loops join with a subselect expression used for the first time on the null-supplying side of the join, and also used above the nested loops join, then the query could return the wrong answer or possibly crash. This has been fixed.
439707 It was possible for the server to have crashed if the system procedure sa_server_option( 'RequestLogFile', ... ) was called while requests were running. This was less likely on single processor machines. This has been fixed.
439710 Trying to use the TableData adapter wizard with a Dataset, would have failed with the message "Generated SELECT statement: 'ASAProv.90' failed with no error message available, result code: DB_E_DELETEDROW(0x80040E23)". This problem has been fixed.
439713 If an application called ResultSet.close(), and the underlying ODBC driver threw an error when closing the result set, then the iAnywhere JDBC Driver would have thrown a JNI exception complaining about making a JNI call with a pending exception. This problem has now fixed by ignoring the error from SQLFreeStmt.
439790 The selectivity estimation of a predicate of the form 'col IS NULL' is now recomputed if the column 'col' is generated by the null-supplying side of an outerjoin, and the predicate is evaluated after the outerjoin is computed. Previously under these conditions, the selectivity estimation used (for example, the histogram for the column 'col') was not accurate, as those estimates did not take into account that the column 'col' may have been NULL supplied by the outerjoin.
439802 If the consolidated database had a message repository containing several million messages, startup time of the MobiLink QAnywhere server may have taken several minutes. This has been fixed so that the startup time should now be the same, regardless of the number of messages in the repository.
439903 When the QAnywhere agent was running and the device was connected to a network (e.g. wired, wireless, etc.), the device seemed to dramatically slow down. For any other combination of QAnywhere agent running and network connectivity, the device performance was fine. This has been addressed by a performance optimization in the upload part of the QAnywhere data synchronization process. The performance slowdown occurred when the QAnywhere agent was performing repeated data synchronizations, such as when the device is connected, the policy is automatic, and an application is adding messages to a queue at a high frequency. This performance optimization should decrease the time spent processing the upload by about 33%. An approach worth considering in this scenario is to use transmission rules, or ondemand policy, to batch several messages puts before triggering a message transmission to the server.
440007 The Interactive SQL utility now supports the new DIRECTORY clause added to the START DATABASE statement by Engineeering case 438139.
440029 Database corruption, and server crashes and assertions, could have occurred if a database was modifed while in the process of being backed up. This could only have happened on systems with multi-core processors. In 9.x and earlier servers, this could also have happened if many thousands of locks had been obtained.

Note that if a server was running multiple databases, databases other than the one being backed up could have been affected.

440037 The Input Wizard could have crashed when double-clicking the "Finish" button, and was most likely to have occurred when the computer was busy. A similar problem could have occurred with the "Next" button if the table which was beaing imported into was locked, and the database option "Blocking" was "on". This has been fixed by having the Wizard prevent any interaction with a control while it is busy with a request to database.
440041 The hash join algorithm has an optimization to scan the right input using an index scan if the left side is small enough such that using the index provides a cheaper strategy (shown as JHx in the plan). In some cases, the use of this indexed strategy could have caused a server crash. One particular way for this problem to occur was for the right hand table to contain a large number of rows that had been deleted with the deletes not yet commited. This problem has been fixed.
440124 The ODBC function SQLBindParameter is used to specify a data buffer address or offset, and a data length/indicator address or offset. As offsets, these values are combined with the address specified by SQLSetStmtAttr(SQL_ATTR_PARAM_BIND_OFFSET_PTR) to produce an actual memory addresses. A change to the SQL Anywhere ODBC driver to check data buffer alignment failed to combine the offset and address which when referemnced, resulted in a memory access violation. This problem has been fixed.
440132 When not utilizing push notifications, the extra processing done on the MobiLink server to process notifications was wasted. A new server configuration parameter ianywhere.qa.server.disableNotifications has been added, that will allow disabling server-side notification processing. The parameter, which defaults to "false", should be set to "true" to disable server-side notification processing. Disabling process notification should improve performance when not using push notification.
440134 If the Datasource utility was executed with the -g option on a non-existent DSN, or if -g or -gu was used on a system DSN on Windows; and the -cm option was also used, then the output would have been an invalid dbdsn command. This has been fixed.
440140 Calling the DBTools DBUnload function twice in an application would have resulted in the second call hanging if the unload was attempting to load into a new database. This problem did not affect dbunload.exe, but could be seen using Sybase Central. This has been fixed.
440146 Optimization of a query could have taken longer than necessary if it had multiple window functions, each with a distinct window specification. In practice, at least 10 windows functions would have been required for this to have been noticeable. The problem has now been fixed.
440209 A WRITETEXT statement would have returned the incorrect SQL error "Subquery cannot return more than one row" if the table had a publication with a "subscribe by (subselect)" condition and the subselect returned more than one row. This has been corrected.
440215 The changes made for Engineering case 433717 caused the provider to return 'Object or provider is not capable of performing requested operation', when executing a simple query. This has now been fixed.
440231 When executing a FOR statement, where the CURSOR USING clause referenced a variable, the server would have crashed with a SIGBUS on platforms that enforce alignment, such as Solaris/SPARC. This problem has been fixed.
440234 UltraLite Dynamic SQL could have generated incorrect results, and could have possibly raised an exception, when there were host variables in the select list for a query and temporary tables were required. This has been fixed.
440245 In the "Export" dialog, when the "Browse" button was clicked and an existing file selected, the user was asked if they wanted to overwrite the file. This prompt has been removed, as the user is asked this anyway when they click the "Export" dialog's OK button.
440246 ASA uses files for client-server shared memory communication. On Solaris systems, when free disk space was exhausted, attempts to allocate more shared memory was not being detected and raised as an error. Then, when either the client or the server accessed the memory, a BUS error would have occurred. This has been fixed, by added code to check free disk space whenever new shared memory is created on Solaris.
440344 The performance of the ADO .Net 2.0 provider has been improved.
440462 When executing a query that involved a remote table, and an aggregate whose argument was a concatenation with a user-defined function, the server would have failed with the error "syntax error near unknown", rather than successfully running the query. This has been fixed.

For example, the following would have generated the syntax error:

select min( cast( 'fred'||dba.NewID() as varchar(25) ) )

from remote_t

where remote_t is a proxy table and NewID() is a user-defined function.

440465 Attempting to upgrade a database created with software that is newer than version 6.0.2, and older than version 8.0.0, where the public setting for the Date_order option had been changed, would have failed with a conversion error. This problem has now been fixed.
440689 Executing a remote query that contains a derived table which is a UNION, would very likely have crashed the server. When analyzing the query and attempting to determine the server id of the derived table, the server was assuming that the derived table was always a simple select. The server now properly handles the case where the derived table is a UNION, INTERSECT or EXCEPT.
440702 Changing the refresh rates of the various viewers in DBConsole had no affect on how often the viewers actually refresh. This has been corrected
440704 If the ODBC function SQLBindParameter was called for a SQL_WCHAR with an odd BufferLength and a NULL StrLen_or_IndPtr value, the driver would have returned an errror with SQL state "HY090". The problem has been corrected.
440709 When using the OLEDB provider to read values from a varchar( n ) column, using the .NET DataReader, the last character was truncated if the column contained exactly n characters. This problem has been fixed.
440783 It was possible for connections with communication compression enabled to get communication errors. The problem was timing dependent, thus would have been rare, and could have occurred if the data being transferred had poor compression rates. This has been now been fixed.
440811 The properties 'disable new connections' and 'remember last statement' were not being restored correctly in the Console utility's options pane. This has been fixed.
440903 If a table was defined with a trigger that fired for more than one type of event (e.g. INSERT and UPDATE) ,while unlikely, a server crash could have occurred if operations were being performed on the table while another connection was performing a DDL statement. This has been fixed.
440930 The database server could have crashed with a "memory exhausted" error. One of the symptoms leading up to thecrash would have been increased disk read activity by the server, although this is not always the case. This was due to cache pages becoming unavailable for use. This could occur on machines with 2 or more processors, but was more likely to happen on machines with 4 or more processors. This issue has been fixed.
441010 Executing a query that referenced a window function with a constant string argument could have caused the server to crash. This has been fixed.
441110 Interactive SQL could have reported:

"There was an error reading the results of the SQL statement.

The displayed results may be incorrect or incomplete."

when attempting to display a result set which contained numeric data that was undisplayable. This error message has been replaced with the the textual representation of the value which is returned by the server. For example, the following statements now display a result set with one value ("?"), whereas previously, the result set column header and the error message above were displayed, with no values at all.

set temporary option precision='1';

set temporary option scale='0';

create variable v1 decimal;

create variable v2 decimal;

set v1=9;

set v2=9;

select v1*v2;

441111 Attempting to open the Connected User property sheet, while connected only to the utility_db, would have caused a "permission denied" error. The plug-in was calling dbo.sa_conn_properties() function, which is not supported for utility_db connections. This has been fixed, now the Extended Information page will display "You cannot view the Extended Information for this connection because you are only connected to the utility database."
441243 Some carriers are injecting control characters in their SMS message. When this is done at the end of the message, the MobiLink Listener that received the message may have reported protocol mismatch errors, and discarded the message. This has been fixed by removing all control characters in SMS messages.
441248 When using the UltraLite Engine runtime (ULDatabaseManager.RuntimeType = ULRuntimeType.UL_ENGINE_CLIENT), the ULFileTransfer.DownloadFile() methods may have failed with a MissingMethodException. Under the 2.0 Compact Framework, the exception would have been: "Can't find PInvoke DLL 'ulnet10.dll'." This has been fixed.

A work around is to create an instance of a ULConnection class before invoking DownloadFile().

For example:

// C#

ULConnection xxx = new ULConnection();

// If the compiler complains that xxx is never used, add the do nothing code below

if( xxx.State = ConnectionState.Open ) {

// will never happen

throw new OutOfMemoryException();

}

441260 If an INSERT ... FROM SELECT ... statement was used with the ON EXISTING SKIP/ERROR clause, and the table being inserted into contained default columns, then the server would have computed default values even for rows that already existed. As a consequence, default values, such as autoincrement, were calculated even for skipped rows resulting in skipped values in the autoincrement sequences. The server now does not compute default values for rows being skipped.

The behaviour is not going to be changed in 10.x and newer versions, as it is more consistent with what happens when the insert fails for a row that already exists, and the ON EXISTING clause was not specified. As an example, the following code will also cause autoincrement values to be skipped:

create table t1( c1 int primary key, c2 int default autoincrement );

insert into t1(c1) values(1);

insert into t1(c1) values(1);

insert into t1(c1) values(2);

The values inserted for the example above are:

1,1

1,3

441267 There was no iAnywhere.QAnywhere.Client assembly for .NET Framework 2.0 in SQL Anywhere 9.0.2. One has now been added.
441275 Attempting to make a connection to the database server at midnight, could have resulted in the error "Connection error: Found server but communication error occurred". The client software did not handle a date roll-over if a timeout was specified. This has been fixed.
441329 The server did not allow a conversion between the datetime and smallint data types. However, there were certain date values for which a conversion to smallint could succeed, for example, the statement:

select cast( cast( 'Jan 1 0001 12:00:00:000AM' as datetime ) as smallint )

should return the value 10101, but was failing with the error "cannot convert timestamp to a smallint". This issue has been fixed.

In a related issue, certain operations that should result in conversion errors were incorrectly succeeding. Consider the following script:

create table t1 (c1 char(1), c2 smallint)

go

create table t2 (c2 datetime)

go

insert into t1 values ('Y', 21)

go

insert into t2 values ('Jan  1 1995 12:00:00:000AM')

go

select c1 from t1 where c2 in (select c2 from t2)

go

It should fail with the error "ASA Error -157: Cannot convert 21 to a date", but was not. This has been fixed so that the appropriate error is generated.

441350 If a table was selected from the tree and a cell value was changed in the Table Editor on the Columns tab, and then another cell in the Table Editor was clicked on, then the Undo

menu item and toolbar button would not have been enabled until F2 was pressed, or the area outside the table editor was clicked. This has been fixed.

441456 If a synchronization model in the tree was selected, and then the model's file was deleted, pressing F5, or choosing View -> Refresh Folder, would have caused Sybase Central to show the same error dialog eight times and then crash. This has been fixed so that the error dialog is now displayed once.
441458 Selecting a synchronization model in the right-pane, and then choosing File -> Remove From List, would have caused Sybase Central to crash. This has been fixed.

Note that selecting the model in the tree would avoid this problem.

441472 Clicking a cell in the Table or Column Mapping Editor would sometimes have failed to open the corresponding drop-down list for the cell. Also, in some cases items in the drop-down list would have been clipped. Both of these issues have now been fixed.
441489 When using the New Table Mapping wizard to create new mappings for a synchronization model, it was possible for the model to contain two or more table mappings that referenced the same remote table. This has been fixed.
441502 If the ALTER TABLE statement was used to modify the domain of a column to an incompatible domain, the server could have crashed. For example, an attempt to convert the type of a column from time to bigint (a conversion that is not supported) would have causes a crash. The server will now, as expected, generate a conversion error.
441560 An application compiled to the DBTools API, which includes most the ASA database tools including dbremote, dbmlsync and dbltm, could have reported an "Out of memory" error, even though there appeared to be free memory on the system where the error was reported. This has now been fixed.
441562 It may have appeared that a lot of data was being sent from the server and the client, even when the client was not receiving messages. The problem occurred when using a consolidated database where the last_download and last_upload time granularity was large, typically in the one second range. Because the QAnywhere MobiLink server against an Oracle server only supports a one second granularity, it would typically have happened only with an Oracle consolidated database. The problem was that message synchronizations between the client and the server, that took less than the timestamp granularity, would have been interpreted as a failed sync by the next synchronization, resulting in data being re-downloaded to the client. This has been fixed by correcting for the timestamp granularity, so that re-downloading data to the client will no longer occur.
441568 Attempting to set the following options using the SET OPTION statement would have failed when connected to a database:

isql_show_multiple_result_sets

isql_print_result_set

This has been fixed.

441583 If a synchronization model was created that used a shadow table for storing last modification times and used logical deletes, then deployment would not have populated the shadow table with existing rows, which would have caused no rows to be returned for the first download. This has been fixed.

A workaround is to deploy to a file only for the consolidated, and in the resulting SQL file change the WHERE clause in the INSERT INTO statement that follows the CREATE TABLE statement for the shadow table, so that it excludes deleted rows. If the defaults are used, this would involve changing 'Y' to 'N'.

441585 If a synchronization model was selected in the tree and a cell value was changed in the Table Mapping Editor or Column Mapping Editor on the Mappings tab, then the Undo

menu item and toolbar button would not have been enabled until F2 was pressed, or the area outside the Mapping Editor was clicked. This has been fixed.

441606 On the Download Subset Details tab for a table mapping, it was possible to specify the "Table to join:" to be the same table as the table mapping's consolidated table, which would have caused a script generation error. This has been fixed so that now an error message is displayed and the problem must be corrected before proceeding.
441618 When attempting to revert all changes to a synchronization model, if there was invalid input (that is, something that would cause a validation error when attempting to save the model) on the Mappings, Events, Authentication or Notification tab, reverting the model would have failed and the validation error would have been displayed. This has been

fixed.

441663 The Interactive SQL utility could have reported an internal exception, if it was run in a language other than English, when attempting to open or import a file which it could not interpret. This error would most likely have occured when attempting to open a binary file, or a text file which was encoded using a codepage not supported by the computer. This has been fixed.
441669 If a procedure with a NO RESULT SET clause returned a result set, an error may not have been generated. This has been fixed so that an error is now generated in this case.
441675 Runing an NUnit test case repeatedly when connection pooling was enabled, could have caused a System.AccessViolationException unhandled exception. This problem has been fixed.
441677 If a fatal error was encountered when starting a network listener thread, and the server may have crashed as it was shutting down. This problem has been fixed.

Note, this would only have occurred with servers running on Unix platforms.

441680 Attempting to open a .QAA or .QAR file, which could not be read (because the file was deleted outside of Sybase Central after it had been started, for example), would not have removed the file from the "Agent Files" container. As well, attempting to open a .QAR file which could not be read, would not have given an error message, and may have opened a window containing the file's contents. These two problems have now been fixed.
441754 The keyword "REAL" was not supported in the Data Type column of the table editor. The workaround was to use the keyword "FLOAT" instead. This has been fixed.
441772 When rebuilding databases from previous versions to version 10 on Unix systems, the variables SATMP and ASTMP must both have been set to the same directory, or not have been set at all, otherwise the Unload utility would have displayed an error that it could not connect to the database. This restriction has now been removed
441784 It was possible to call the system procedure sa_server_option with the option 'quitting_time' and set an invalid datetime parameter. This has been fixed.
441791 If an application called setNull() with the type id set to NCHAR, NVARCHAR or NLONGVARCHAR, then the iAnywhere JDBC Driver would returned a "type id unknown" error. This problem has been fixed.
441798 If the server was shut down while a connection had a cursor open on a java stored procedure that returned a result set, it was very likely that the server would have hung or crashed. This problem has been fixed.
441804 A problem where the server could have become deadlocked and appear to be hung has been fixed. This was more likely to occur if persistent tables or indexes were being dropped or truncated.
441815 The server tracks dependencies between views and other database objects. A view is said to be dependent upon another object if the view makes a reference to the object. When the REVOKE CONNECT statement is executed to drop a user, all objects owned by the user are dropped along with the user. The REVOKE CONECT statement counld have failed erroneously if the database contained an active view that was dependent upon an object owned by the user being dropped. The intention was to disallow the REVOKE CONNECT if the dependent view was owned by a user different from the one being dropped. The user should be dropped without error in cases where the dependent view is also owned by the user being dropped. This has been fixed so that dependent views owned the user being dropped are now ignored when executing REVOKE CONNECT.

A work around is to first drop or disable views that depend on tables and views owned by the user being dropped. This process can be easily implemented in SQL by making use of the 'ALTER TABLE .. DISABLE VIEW DEPENDENCIES' and 'ALTER VIEW ... DISABLE' statements.

441856 The Interactive SQL utility would have ignored the EXIT statement when running in non-windowed mode if not connected to a database. This has been fixed.
441864 Runaway QAnywhere client synchronizations could have caused massive logging on the MobiLink server. This has been fixed.
441865 When opening the Users folder in for an UltraLite database, Sybase Central may have crashed, or displayed non-existent or duplicate users. This has been fixed.
441874 The Log Translation utility, and the Translate Log File wizard in Sybase Central, could have failed if the temporary directory name was more than about 10 characters. This has been fixed.
441946 Attempting to update a row in a table that another connection had locked by editing a result set, cound have made the Interactive SQL utility to become unresponsive. This has been fixed.

Note, this same problem also affected the "Data" tab in the SQL Anywhere plug-in for Sybase Central, and has been fixed as well.

441970 Attempting to perform an INSERT ... SELECT, where the select involved a derived table that referenced both local and proxy tables, and the table being inserted into was a local table, could have caused the server to crash. This problem has been fixed.
441971 It was not possible to create multi-byte character userids and passwords with trailing bytes x7B or x7D, or with {, }, (, ) or spaces. Attempts to do so, would have failed with an invalid identifier error. As well, it was possible to create a userid or password using Sybase Central, or any of the programming APIs, which could not have been used in an UltraLite connection string. Both of these issues have now been fixed. All userids and passwords which correspond to a valid connection string value can now be specified, and values specified through Sybase Central or GrantConnectTo() which can not be used in a connection string are rejected.

Note, userids and passwords must still be valid connection string values and must not contain leading or trailing spaces, leading single or double quotes, or any semi-colons.

441978 The changes for Engineering Case 440786 introduced a problem such that running a large query that referenced proxy tables that were executed in FULL PASSTHRU mode, could have failed with a memory allocation error. This problem has been fixed.
441995 It was possible, although extremely rare, for the MobiLink server to have crashed when using compressed network communications. The only workaround was to disable network communication compression. This problem has been fixed.
442034 It was possible for the MobiLink server to have crashed during HTTP synchronizations. This has been fixed.
442144 If a materialized view was selected in the tree, and then its Indexes tab was selected, the New View and New Materialized View menu items and toolbar buttons could not be used to create a view or materialized view. This has been fixed.
442145 After right-clicking a column in the table editor and choosing the Delete menu item, then right-clicking the same column again, the Delete menu item would have been left enabled. This has been fixed so that the Delete menu item is only enabled if the column has not already been marked for deletion.
442146 If a column in the table editor was right-clicked and the Delete menu item chosen, then the column could still have been modified by opening its property sheet. This has been fixed by opening the column's property sheet in read-only mode.
442148 If a table mapping was marked for deletion in the Table Mapping Editor, then the table mapping could still have been modified by using other menu items in the File or pop-up menus. This has been fixed by having the context and pop-up menus take into account whether the table mapping was marked for deletion.
442149 It was not possible to use the Edit menu's Cut, Copy, Paste, and Delete menu items with text fields on the Mappings tab's Download Type, Download Deletes, and Download Subset tabs, or with text fields on the Authentication and Notification tabs. This has been fixed. Note that the corresponding toolbar buttons were functional in this case.
442152 If a table mapping was marked for deletion, it was still possible to modify it by making changes on the Download Type, Download Deletes, Download Subset, and Conflict Resolution tabs. Also, if the Column Mappings tab was selected, it was possible to right-click a column mapping and change the Synchronize setting via the menu item. Both of these problems have been fixed. Now all components on these tabs, and all menus, are disabled when the corresponding table mapping is marked for deletion.
442155 If a database was involved in mirroring, and the database was shut down but the server hosting the database remained running, the mirror server was not notified of the shutdown and did not take ownership of the database. This has been fixed.
442158 If temporary table containing a compressed column was used in the result set of a stored procedure or batch, the server may have crashed. This would only have happened if the size of the *compressed* data was less than one page. This has been fixed.
442176 A SOAP request to a SQL Anywhere SOAP service having been declared with a datatype IN, or an ON clause with a call to a stored procedure that takes no parameters, would have caused the server to crash. This has been fixed.
442268 A query containing an outer join, where the null-supplying side was a derived table, may have failed with the error "The optimizer was unable to construct a valid access plan". This occurred when the outer join was used in a correlated subquery of an EXISTS, NOT EXISTS, ANY or ALL predicate, and the derived table must have been uncorrelated, and not flattened (ie., it is a GROUPED query, a UNION query, etc.) This has been fixed

For example:

select * from product p1

where EXISTS(select *

FROM product p2

left outer join (select p3.id, count(*) from product p3 group by p3.id ) as P(ID, c) ON P.id = p2.id

WHERE p2.id = p1.id )

442269 Calling the method DataReader.GetSchemaTable() would have thrown an exception if the table name contained single quotes. This has been fixed by doubling single quotes in the table name.
442279 Restarting a MobiLink server listening for HTTP requests, while a listener was already running, would have caused the MobiLink server to report protocol errors, and this listener would have failed to reconnect. This has been fixed.
442283 The Listener would have leaked memory if it failed to connect to the MobiLink server. This has been fixed.
442284 The MobiLink redirector may have crashed if a client tried to access an empty server-group and there were other non-empty server groups within the redirector configuration. This is fixed.
442293 The MobiLink redirector may have occassionally failed to redirect a large upload. An error calculating the content-length has been corrected.
442297 Running a MobiLink synchronization through the redirector for SunONE6.1 with persistent HTTP would have failed. The webserver may turn on HTTP chunking when downloading to the client, but HTTP chunking was not supported. This has been fixed by adding HTTP chunking support.
442299 MobiLink synchronizations through the MobiLink redirector for IIS with persistent HTTP would have failed. Persistent HTTP was not supported by the IIS redirector, it has now been added.
442301 Since persistent HTTP was not supported by the MobiLink redirector for iPlanet 6.0, synchronization would have failed or hung. This has been fixed by changing the redirector to turn persistent HTTP off, even when clients specify it.
442303 Calling the system prodecure xp_read_file() would have caused the server to fail with assertion 100913, if the file read was longer than the server's maximum supported string size (~2GB). This has been fixed.
442305 When the listener was using an AirCard modem to receive SMS messages, and the AirCard modem was also used by another process, or the listener itself, to dial up to an IP network, the modem may have deadlocked with a constant green light on the card. This has now been corrected.
442307 Calling a stored procedure that returned empty date, datetime, smalldatetime or timestamp values, would have caused an ArgumentOutOfRangeException. This problem has been fixed.
442310 If a remote server was defined using either the SAJDBC or ASEJDBC class and a remote stored procedure was created that had string arguments, then calling the remote stored procedure would have failed with a "system exception occurred" error. This problem has been fixed.

Note, the problem does not exist if the remote server is created using one of the ODBC classes.

442318 On Unix systems, an ODBC trace of the MobiLink server would have shown many calls to SQLSetEnvAttr, as it was being called to set the ODBC version on every connect. This problem could have caused a hang within the MobiLink server when connected to a non-ASA consolidated. The hang could have eventually tied up most, if not all, the server's worker threads, after which the MobiLink server would have been completely unresponsive. This has been fixed so that now SQLSetEnvAttr is only called when the environment is allocated.
442373 When installing to Windows CE using the signed CAB file, the Japanese language resource library (dblgja10.dll) was not being copied, and the language key was set incorrectly in the registry. This has been corrected, now all five of the language DLLs are included in the signed .CAB files, and the language registry entry is left blank. This will allow the signed .CAB files to run by default in the same language as the device.
442386 Fetching an nchar column from a proxy table that contained both nchar columns and long varchar, long binary or long nvarchar columns, could have returned mangled data for the nchar column, when the nchar column appeared after the first long column in the proxy table definition. Data for nchar columns which appeared before the first long column would have been fetched correctly. This problem has been fixed so that nchar data is fetched correctly regardless of the columns position in the table definition.
442387 While using Sybase Central extensively, users may experienced connection failures reporting too many connections, or too many open databases, when there were only a few or only one database open. The connection count displayed in Sybase Central for a particular database would have been unreasonably high. The odbc driver was leaving connections open. If users were switching databases (while keeping one open), or repeatedly trying to connect to already connected database, connection limits could have been exceeded. This has been fixed.
442398 A long owner name could have obscured the names of tables in the New Remote Database Schema and Existing Remote Database pages of the Create Synchronization Model and Update Schema wizards of the MobiLink plug-in. This has been fixed
442417 The UltraLite Create Database utility (ULCREATE), did not create case sensitive databases when the option -o case=respect was set. This has been corrected.
442440 If a remote data access server was createded using either the SAJDBC or ASEJDBC classes, and a proxy table referencing that server was defined with a long string column, then fetching the data for that column could have lead to data corruption if the remote database was using a multi-byte character set. This problem has been fixed.
442443 Attempting to retrieve data from an nchar column, when connected using either jConnect or Open Client, may have caused the connection to have been dropped. This problem has been fixed.
442452 The LIKE operator did not respect case in case-sensitive databases. This has been fixed.
442453 Changing a table schema, or data in the data tab for a table, then switching modes, would have caused the change to be lost. This has been fixed by prompting the user to save or cancel changes when switching modes.
442459 If an externlogin was created for a remote data access server with a remote login id that was 128 bytes long, then remote connections would have failed. This problem has been fixed.
442460 When attempting to create a proxy table to a remote table, if the remote table name was 128 bytes in length or the user id of the remote table's owner was 128 bytes in length, then the server would have crashed. This problem has been fixed.
442543 The UltraLIte Interactive SQL utility and the UltraLite schema painter were not handling systems with multiple monitors correctly. If a window was closed while on a secondary monitor and then the application was restarted when only one monitor was connected, the window would have been positioned off the visible desktop. This is now fixed.

A workaround for this situation is to do the following:

1. Right click on the application in the task bar.

2. Select Move

3. Use the keyboard cursor keys to bring the window back to the visible desktop and hit Enter when it抯 properly positioned.

442554 If a server, with an alternate server name that was not all lower-case, was shut down, other servers in the network could not have started using that server name (or alternate server name); startup would have failed with the error "Server name is already in use". This has been fixed.
442567 An UltraLite for AppForge application could have crashed after calling the ULConnection.GetDatabaseProperty() method. This would have occurred if the application was written in a Crossfire language (VB.Net or C#), and run on an actual device (i.e. not in hosted mode on the desktop). This is now fixed.
442574 Applications which did not use ODBC (for example, dbisql and other utilities) would not find a file DSN file if the file was in the default ODBC File DSN directory. The FILEDSN connection parameter can be used to specify a file DSN. The default ODBC File DSN directory is the directory where File DSNs are created by default by the Microsoft ODBC Data Source Administrator. This has been fixed.
442575 If a database had two or more tables with the same name and columns owned by a different users, and one of those table owners had queried their table with the Interactive SQL utility, opening the QueryEditor would have caused an exception to be thrown. This problem has been fixed.
442589 Using the ODBC Administrator to create a File DSN with a space in a parameter, would have caused the value in the file to be incorrectly quoted. This has been fixed so that File DSN values are now created without quotes.
442590 Attempting to copy and paste a Directory Access Server's proxy table within the plug-in would have failed. The remote location string was not being set correctly. This has been fixed.
442594 If a return variable name that contained spaces was specified in the Create Function wizard, then Sybase Central could not have created the function. The return variable name was not being quoted in the generated source. Now it is if the dialect chosen is Watcom-SQL. If the dialect chosen is Transact-SQL, then spaces are replaced with underscores, as Transact-SQL does not support spaces in variable names.
442613 The SQLCONNECT and ULSQLCONNECT environmental variables can supply parameters for the -a and -c command line options, SQL ANYWHERE and UltraLite database connection strings respectively. When a parameter was supplied in both the environment variable and in the option, the parameter from the environmental variable was the one chosen. For compatibility with other utilities, this has been changeded so that those supplied on the command line are preferred.
442641 If an UNLOAD statement includes ESCAPES OFF and QUOTES OFF and attempts to unload a long string, the server could crash or generate garbage characters in the output file. This has been fixed.
442667 The SQL Anywhere Explorer was not installed on Windows x64 machines. This has been corrected.
442674 If the input string and encryption key supplied to the encrypt built-in function were identical, the output data (the ciphertext) would always have been the same (i.e. the function was deterministic). This has been changed so that there is now a public-only option called encrypt_aes_random_iv that controls this behaviour. If this option is set to ON, a random initialization vector will be used, ensuring that encrypting the same string with the same key will result in different ciphertext. If this option is set to OFF, the existing behaviour is used. The default value of this option is OFF, i.e. things

will continue to work as they do now. To get the new behaviour, set the value of this option to ON.

In versions of 10.x starting from 10.0.1, the default for this option will be ON. In the next major version, this option will be removed, and the new behaviour will always be used.

442676 Processing large and complex queries may have caused the stack to overflow, resulting in the server crashing. This has been fixed.
442684 The MobiLink server was not able to upload data from an ASA char/varchar column to a Microsoft SQL Server nchar/nvarchar column, if the column width defined in the remote database was greater than 2000 bytes. The Microsoft ODBC driver would have given the error "Invalid precision value", when the MobiLink client tried to upload data to a table that contained such columns. This problem is fixed now.
442685 When using the debugger in Sybase Central, adding an expression in the Watch dialog that contained a '-' character, would not have been evaluated. This has been fix by enclosing watch expressions in quotes.
442704 If the library dblsn_sms.dll was missing from a Windows CE install, the MobiLink Listener would have displayed the error : "An error happens in the command near the -a option". Since SMS support is optionally installed, the Listener has been changed to allow it to start even if SMS support is not installed.
442727 If the option to create KDE or GNOME desktop icons was chosen during installation, the icons for the documentation (i.e. the readme, contents.html, and the Check for Updates link) always pointed to the English versions of these files, regardless of the user's current locale. This has been fixed so that the installer will attempt to change the links if they already exist, and make them match the system language as set at EBF install time.
442761 The server could have failed with a 'Fatal error: disk full' error when writing to the temporary file, even with TEMP_SPACE_LIMIT_CHECK turned on. This has been fixed.
442767 Applications calling a procedure with a blob output parameter could have crashed if any parameters of the procedure were derived by calling the SACommandParameter.DeriveParameters() method. The SACommandBuilder.DeriveParameters() method was setting the size of output blob parameters to 2GB, which caused a memory access violation. This has been fixed by changing the Size of blob parameters to the default value (32767).
442778 Immediately after opening a modal dialog, Sybase Central may have ignored keystrokes until a different window was activated. This problem would have been intermittent and was not specific to any particular wizard, property sheet, or dialog. It is now fixed.

Note, this problem affected the Interactive SQL utility, which is fixed as well.

442783 Queries using LIKE conditions, were ignoring the case sensitivity of the database and always doing case sensitive comparisons. Rows that should have matched the LIKE condition where being excluded from result sets. This has been fixed so that LIKE now properly follows the case sensitivity of the database.
442787 The registry entry for the two Dbmlsync Integration Components did not indicate the threading model that were used. This prevented some containers from loading the ActiveX components. Now, when these ActiveX components are registered, it appropriate entries are created in the registry to indicate that it supports the Apartment threading model.
442791 Creating a user defined domain with a long default value or CHECK condition (greater than ~258 characters) would have caused a memory leak. This has been fixed.
442793 If a dbspace name required double-quotes (i.e., the name contained characters such as '-'), then rebuilding the database would have failed with a SQL syntax error. This has been fixed by putting the dbspace name in double quotes in the ALTER DBSPACE statement that is issued to pre-grow the dbspaces.
442794 In the Interactive SQL utility, the result set from selecting all columns from a materialized view was editable, although trying to save the changes would have caused an error message. Now, the table is not editable.
442801 Attempted to insert a row into an UltraLite table by using the Results panel in the Interactive SQL utility, or the Data tab in the UltraLite plug-in, would have caused an error message saying that primary key cannot be null. UltraLite considers the primary key columns to be read-only. The ResultSetTable component should have been ignoring the read-only desgination when inserting rows for primary keys. This has been fixed.
442839 The Embedded SQL sample program for Windows CE (esql_sample) would have failed to connect when running on ARMv4T devices. This sample program had an incorrect connection string. It has been updated to correctly use "DSN=SQL Anywhere 10 Demo.dsn"
442898 If a server-initiated synchronization property was set to the empty string or blanks, the property was treated as not set. Blank padded strings were trimed. This has been fixed so that string properties are accepted as is.
442915 CREATE TABLE or DROP TABLE statements could have failed to execute (or the Import Wizard could have failed to complete properly), reporting the following error:

A schema upgrade is not currently allowed[SQL Offset: 0]

SQLState=ERROR, ErrorCode=-953

This was typically seen after executing a SELECT statement, whose result set was displayed in the "Results" pane, and either the result set was edited, or the "Show multiple result sets" option was on. This has been fixed.

442928 If a server was run on a big endian machine, then attempting to retrieve an unsigned integer value from a remote server could have returned a 0 instead of the actual value. This problem has been fixed.
442932 When the graphical admin tools were run on Linux, the standard CTRL+C (Copy), CTRL+X (Cut), and Ctrl+V (Paste) accelerators did not work in most text fields. This has been correct so they now do.

A workaround would be to use the following keystrokes:

CTRL+INS Copy

SHIFT+INS Paste

SHIFT+DEL Cut

442935 A predicate of the form:

<column> LIKE <pattern>

where <column> is a column of exact numeric type <DOMAIN> and <pattern> is a constant string containing no wild-cards should generate a sargable predicate:

<column> = CAST( <pattern> AS <DOMAIN> )

For example, the query:

select * from systab where table_id like '1'

should consider using an index scan on systab.table_id = 1, but this inference was not performed. This has been fixed. See also Engineering case 336013.

443005 The system procedure xp_cmdshell() did not work on Windows CE. This has been fixed. To run this procedure the command shell executable "\\windows\cmd.exe" is required. Note that the parameter 'no_output' is ignored on Windows CE.
443013 Odd and misleading errors may be generated when a lossy charset conversion occurs on database filenames during database initialization (i.e., dbinit). The error may look something like "@default collation could not be found". This situation can happen in all cases where a lossy conversion is present between OS charset and database charset, such as when creating an English database on a Japanese machine using Japanese characters in the filenames. The loss occurs as a result of converting the filenames to database charset as they are sent to the database and stored in the catalog. This problem applies to the database, log, and mirror-log filenames.

If this loss is an issue, a database character set for which no loss occurs should be chosen. For example, choosing UTF8 on a Japanese machine will ensure that filenames are preserved.

We now make a better attempt at reporting character set conversion errors on database filenames.

443014 A DELETE statement could have caused the server to crash if the schema of the table being deleted from had certain attributes. The problem has been resolved.
443015 The server could have failed an assertion when deleting or updating a long row. For this to have occurred, there must be at least two pages worth of row data. The most likely assertion would have been 201501 - Page for requested record not a table page or record not present on page. There was also a chance, although unlikely, of table corruption if there were many concurrent inserts or updates of long rows. This has now been fixed.
443016 If a stored procedure contained a simple statement that referenced a table that was subsequently modified by an ALTER TABLE statement, it was possible for the server to have crashed on a subsequent call to the procedure. This has been fixed.
443017 Executing a query that contained a distinct aggregate, and a sufficiently complex grouping specification, could have crashed the server. This has been fixed.
443027 The Interactive SQL utility, as well as Sybase Central and DBConsole, would not have operated correctly when connected to a SQL Anywhere database that had the SQL_flagger_error_level or SQL_flagger_warning_level options set to anything other than 'W'. Typical behavior included getting the error message Disallowed language extension detected..." when connecting. This has been fixed.
443040 A server which was not running a database could have crashed if dblocate -d was run. Also, dblocate -d was not reporting 10.0.0 servers which were not running any databases. This has been fixed so that a server running no database will no longer crash, and dblocate -d will list the server.
443041 When the server is under a heavy load, with many INSERT, UPDATE and DELETE requests, checkpoints might have caused the server to slow down for as much as a minute because of heavy disk writes. This has been fixed.
443043 A query whose plan contained a merge join, with join conditions on columns that formed a proper prefix of an ORDER BY, could have failed with the error -300 "Field unexpected during compilation", if the merge join was in an unflattened derived table or a select with a GROUP BY, and after the prefix matching the join condition, the ODER BY contained columns from a table that was above the merge join in the plan. This has been fixed.
443053 Allocating space for a row could have taken a long time. The larger the table, the longer the allocation time could have been, as allocating space for a row could have involved reading all of the pages in a table. This has been fixed.
443154 On Windows platforms (desktop and Pocket PC), there are two types of ULPod dlls that are shipped. The first is built with the standard UltraLite runtime for Windows desktop and Pocket PC. In the SA install directory, they are named ulpod10.dll and ulpod.cab (contains ulpod10.dll and ulrt10.dll). The second is built with the client/server version of the UltraLite runtime. It is named ulpodclient10.dll.

In the ULPod documentation, and in the sample readme file, it is explicitly emphasized that only one type of the ULPod dll file should be deployed to the client device. It must be either the standard ulpod10.dll or the client/server version ulpodclient10.dll, but never both. The reason is that when the M-Business client browser AvantGo.exe launches, it will load ALL the dll files it can find in the pods directory. If both ulpod10.dll and ulpodclient10.dll are found in the pods directory, both are loaded into memory. Then when the JavaScript code tries to create a ULPod DatabaseManager object:

var DatabaseMgr = CreateObject( "iAnywhere.UltraLite.DatabaseManager.CustDB" );

both ulpod10.dll and ulpodclient10.dll are asked by the AvantGo JavaScript engine to claim ownership of the pods object name. The result is random. If ulpodclient10.dll is first called to claim the ownership, and if there is no uleng10.exe installed on the device, an error will be returned saying the UltraLite engine cannot be found.

To solve this problem, a new section has been added to the standard ULPod pods object namespace to clearly identify which ULPod DLL should be loaded. The previous ULPod name prefix was "iAnywhere.UltraLite.DatabaseManager", followed by the application name. The new rules now add ".Standalone" or ".Engine" after the previous ULPod name space, and before the application name.

Thus if the standard ULPod dll is required, the following call should be made:

var DatabaseMgr = CreateObject( "iAnywhere.UltraLite.DatabaseManager.Standalone.CustDB" );

if the client/server version of ULPod dll is required, the following call should be made:

var DatabaseMgr = CreateObject( "iAnywhere.UltraLite.DatabaseManager.Engine.CustDB" );

If no runtime-type is provided in the object name prefix, and both dlls are found in the pods directory, which ULPod dll is loaded will be non-deterministic as before.

443164 When run on multi-processor machines, the server may have crashed, although very unlikely, if the startup of a parallelized query occurred as the server was shutting down. This is fixed.
443174 In some rare cases, the server could have shown periodic spikes in CPU usage even though there were no requests currently executing. The spike would have lasted for appromimately half a second, with an interval of about 20 seconds. This has been fixed.
443180 It was not possible to insert a zero length value into a BINARY column by inserting or editing a row in the "Results" panel.

Also, when connected to an UltraLite database, the tooltip for column headers for result sets showed the wrong size for non-numeric types that have a variable size. For example, the type of a BINARY(20) column was displayed as "binary(0)".

Both of these problems have now been fixed.

443214 If one or more modified column mappings were selected, and the Undo toolbar button was clicked or the Edit -> Undo menu item was selected, then in some cases the original column mappings would not have been restored. This has been fixed.
443256 Executing an UPDATE WHERE CURRENT OF cursor, DELETE WHERE CURRENT OF cursor, or WRITETEXT statement could have caused the server to fail an assertion (likely 201500 or 201501), if another connection was concurrently deleting the row. This cannot have happened at isolation levels 2 or 3. This has been fixed.
443272 Validating indexes in other than the SYSTEM dbspace, could have caused the server to fail an assertion, or to have crashed. This has been fixed.
443274 If a row was added to a the Result Set table, then 'NO' was clicked in the confirmation dialog, the dialog prompting to save it would have been displayed again. This has been fixed.
443285 The utilities dbunload, dbbackup and dbinfo, would not have operated correctly when connected to a SQL Anywhere database that had the SQL_flagger_error_level or SQL_flagger_warning_level options set to anything other than 'W'. Typical behavior included getting the error message Disallowed language extension detected..." when connecting. This has been fixed.
443290 A new value of AsaDbType.Xml/SADbType.Xml has been added to AsaDbType/SADbType enum.
443315 For synchronization models where some columns were not synchronized in synchronized remote tables, the CREATE PUBLICATION statement in the remote would have correctly listed only the synchronized columns, but the ml_add_column statements generated for the remote would have also included all the remote columns. This would have caused a problem when synchronizing. This has been fixed so that the ml_add_column statements are now only generated for synchronized columns.
443321 If the server connection was terminated while the Interactive SQL utility was still running, the loss of connection would have been reported, but the title bar text would not have been updated. This has been fixed.
443368 When using the Support utility with the -sa switch "submit all reports and diagnostic info", extraneous 'File not found' messages could have been printed. This has been fixed.
443455 When the QAnywhere agent was idle, that is not performing message transmissions, there was a small spike in the CPU usage every 10 seconds. This has been addressed by increasing the interval at which the message store is polled to 15 minutes. A signaling mechanism is used to trigger a message transmission when certain events happen in the message store, such as a message being put on a queue, or a push notification being received.
443456 Clearing deadlock information from Deadlocks Panel and closing the database properties dialog, would have resulted in a NullPointerException. This has been fixed.
443473 When a stored procedure call with a return value was prepared, the provider would have generated a call with an incorrect number of parameters. The following Visual Basic code demostrates the problem:

objCmd = CreateObject("ADODB.Command")

objCmd.CommandText = "Add_User"

objCmd.CommandType = adCmdStoredProc

objCmd.ActiveConnection = objConn

objCmd.Prepared = True

objCmd.Parameters.Append(objCmd.CreateParameter("Add_User", 3, 4))

objCmd.Parameters.Append(objCmd.CreateParameter("@userid", 200, 1, 25, "jbjones"))

objCmd.Parameters.Append(objCmd.CreateParameter("@first", 200, 1, 25, "John"))

objCmd.Parameters.Append(objCmd.CreateParameter("@last", 200, 1, 35, "Jones"))

objCmd.Parameters.Append(objCmd.CreateParameter("@phone", 200, 1, 18, "5558836300"))

objCmd.Parameters.Append(objCmd.CreateParameter("@extension", 200, 1, 6, "6300"))

An erroneous SQL statement like the following is generated.

?=call Add_User(?,?,?,?)

If the objCmd.Prepared = True statement was not included , or the Prepared property was set to False, then the problem did not appear. This has now been fixed.

443495 Previously, ULPod only allowed one database connection per database manager. Opening a new connection meant that the existing connection had to be closed first. Now a DatabaseManager pods can open up to 10 different connections at the same time. Opening more than 10 connections will result a SQLE_TOO_MANY_CONNECTIONS error being returned. At this point, existing connections will need to be closed in order to open new ones. To maintain the behavior compatibility with the prvious ULPod, this new feature is

achieved through new methods on the DatabaseManager object.

New API methods:

For SA 10

ULPodConnection DatabaseManager.openConnectionEx(string conString)

ULPodConnection DatabaseManager.reOpenConnectionEx(string conName)

For ASA 9

ULPodConnection DatabaseManager.createDatabaseEx(string conString)

ULPodConnection DatabaseManager.createDatabaseWithParmsEx(ConnectionParms parm)

ULPodConnection DatabaseManager.openConnectionEx(string conString)

ULPodConnection DatabaseManager.openConnectionWithParmsEx(ConnectionParms parm )

ULPodConnection DatabaseManager.reOpenConnectionEx(string conName)

The difference between the Ex() and non-Ex() functions is that the Ex() version

supports multiple connections, while the non-Ex functions do not.

443513 The database server could have crashed, or hung, when diagnostic tracing was enabled (and especially as it was being saved) and the server was processing large numbers of simultaneous requests. This was more likely if graphical plans were being traced, and connections were frequently cancelled at the time the tracing session was saved. This has has now been fixed.
443515 The MobiLink server could have silently failed to start, if more than one secure stream was specified by the -x 'communications parameters' command line option. This has now been fixed.
443524 The traced_plan() function could have caused the server to fail an assertion (106900 or 106901), if passed an invalid query number. This has been fixed so that traced_plan() now correctly returns NULL in this case.
443551 The Unload or Extract Database wizards could not have been used to automatically create a new database with simple table-only encryption, and reload into this database. This has been fixed. In addition, when a new database is chosen to be reloaded, the new database's encryption settings now default to the same settings as the database which was being unloaded or extracted.
443564 The server could have reported an assertion failure when processing an INSERT statement for a table that had a particular form of publication. For example, fhe following assertion failure could be reported: "Assertion failed: 102501 (9.0.2.xxx) Work table: NULL value inserted into not-NULL column" In this case, the INSERT statement would fail, but the server would continue to run and remain available for further requests. This has been fixed.
443566 A security issue has been fixed, resolving a case where, in limited circumstances, connected users were able to access data they were not authorized to access.
443595 If a new column was added to a table using ALTER TABLE ADD, and a default column value was specified, the value would not have been set when a row was added. The column value would instead have been set to null. This has now been corrected.
443600 Using the CONNECT statement to connect to a different user on the same database could have failed if the connection string required protocol-specific parameters (e.g. an IP address and port number for TCP/IP). This has been fixed by merging the protocol parameters needed from the existing connection.
443602 When using the MobiLink client to synchronize over HTTP through the redirector, if two remotes had the same Mobilink user, they would have both been redirected to the same Mobilink server. This could have impaired load-balancing, and been fixed.
443613 Data inserted by an application using the ADO.NET Provider, that contained characters from a multi-byte character set into a non-UTF8 database using host variables, would have appeared to have been truncated after being inserted into the database. When the provider converted the characters from UNICODE to multibyte, it did not set the length correctly. This has been fixed.
443642 If an application sent a timestamp structure host parameter which contained an invalid year, the server would not have generated an error if the database option Conversion_error was On. Timestamp structures are used for example, with the embedded

SQL type DT_TIMESTAMP_STRUCT, and the ODBC type SQL_TIMESTAMP. If a stored timestamp value with an invalid year was converted to a string, the year component of the string would have contained asterisks (e.g. ****-02-28 ). This has now been fixed so that the server correctly generates the error SQLE_CONVERSION_ERROR (-157) for invalis timestamp structures, even when the option Conversion_error is On.

443644 Using the UltraLite plugin for Sybase Central to add a long binary column with a default value to a table, then switching to the Data view to add new rows, could have caused the error SQLE_DOUBLE_REQUEST. A crash could also have occurred. This has been fixed.
443651 The default value of the PrefetchRows connection parameter has been changes from 10 to 200 as a performance optimization. That is if the PrefetchRow parameter is not specified, the ADO.NET Data Provider will set it to 200. The default value of AsaConnectionStringBuilder.PrefetchRow (and SAConnectionStringBuilder.PrefetchRow for SA 10) has also been changed to 200. Prefetching is disabled if the resultset has any blob columns.
443655 Several status messages have been added to the Initialize Database utility (ulinit), which will now be displayed after the banner.

For example:

SQL Anywhere UltraLite Database Generation Tool Version 10.0.0.2716

Loading schema

Creating empty UltraLite database

Collation: 1252LATIN1

Done creating database

443657 If a query contained an IN predicate with a large number of elements, and the predicate was used as a sargable predicate in an index scan, then the server could have reported an assertion failure: "101505 (10.0.0.xxx) Memory allocation size too large". This has been fixed. Now, IN predicates with too many elements will not be used to drive an index scan.
443660 A problem with the UltraLite ODBC driver caused userids to be lost on database connections, from Sybase Central and the Interactive SQL utility, to Japanese database filenames. This has now been corrected.
443671 If a statement was executed that returned a result set containing binary column values that were longer than about 1MB, the Interactive SQL utility could have become unresponsive for a length of time proportional to the width of the column data. This has been fixed. This performance problem could often be seen when selecting all columns from a proxy table to a directory access server.
443693 Synchronizing a database with complex foreign key relationships, or when using the table_order synchronization feature, may have resulted in the runtime crashing or possibly corrupting the database. This has now been fixed.
443694 When downloading using a slower network, it was possible to see the following error: "Aborting read because of liveness timeout". The synchronization would have failed, even though an active connection existed with the MobiLink server and data was being received. A fix has been made so that this problem should no longer be possible.
443735 The server could have reported a statement-level assertion failure when processing an INSERT ... ON EXISTING UPDATE statement, with a table that contained an autoincrement column that was part of the primary key. For example, the following sequence demonstrates the problem:

create table foo ( a integer primary key default autoincrement );

insert into foo on existing update select a from foo;

This has been fixed.

443758 The dbisqlc utility would have crashed if an OUTPUT command redirected a non-deterministic result set. This has been fixed.
443765 The rdbmsDbLimitedResourceLimit, rdbmsDbLimitedResourceCurrent, and rdbmsDbLimitedResourceHighwater values in the rdbmsDbLimitedResourceTable table may have contained negative numbers. If the value would cause a 32-bit integer to overflow, the scale of units (bytes, KB, MB, etc.) is increased until the number no longer overflows. The rdbmsDbLimitedResourceDescription value now returns one of "Bytes", "KB", "MB", "GB", or "TB".
443782 An HTTP request to a web service running in the server with an arbitrary query string, would have been rejected with a 400 - 'Bad Request'. The SA web server required the query component of the request URL to have one or more name value pairs in the following format: 'name=value[&name2=value2...]'. This restriction has been removed, so that now an arbitrary query string will not be rejected.

For convenience, calling the http_header() function and specifying the pseudo-header @HttpQueryString will return the query string component of the URL verbatim. The function call next_http_variable() can be used to cycle through all the keys, regardless of whether or not they contain a value.

A query string with no key and a value (e.g. http://localhost/x_service?=value) can only be processed by parsing the query string as it is returned from an http_header('@HttpQueryString') call.

Example:

http://localhost/a_service?h&0&name=value&=x

http_header('@HttpQueryString') returns: h&0&name=value&=x

An iteration of the next_http_variable function would return the following keys: h, 0 and name (x is ignored). Using the http_variable function, the value of h and 0 is '' (empty string) and the value of name is value.

443783 The Interactive SQL utility could have reported an internal exception (IllegalStateException) after using the Import Wizard, if a result set had been displayed immediately before opening the wizard. The occurrence of this problem would have been rare, and was timing dependent. This has been fixed.
443786 When starting a database on a Windows CE device, the server may have erroneously reported the error "not expecting any operations in transaction log". For this error to be reported, the database must have previously been shutdown clean, the log file must have existed, and the "current" log page (the one to which the next operation will be written) must have been the last page in the transaction log. The server was not correctly detecting that it had reached the end of the transaction log on platforms for which transaction mirroring is not supported (ie. Windows CE). This has been fixed.
443789 If the MobiLink client was running such that it would have performed more than one synchronization in a single run, usually this would involve using the schedule extended option, and it successfully connected to the remote database for the first synchronization, but it was unable to reconnect to the remote database for a subsequent synchronization, it would have crashed. This has been fixed.
443798 When calling the GetQueueDepth() method, it could have returned inconsistent values for the number of messages remaining in the queue. This has been fixed.
443799 If the client sent a timestamp structure host parameter that contained an invalid date or time, the server would not have generated an error if the database option 'Conversion_error' was On. Timestamp structures are used with the embedded SQL type DT_TIMESTAMP_STRUCT, and the ODBC types SQL_TIME, SQL_TIMESTAMP, SQL_TYPE_TIME, as well as other similar types. This has been fixed so that the server now correctly generates the error SQLE_CONVERSION_ERROR (-157) in this case.
443841 Complex expressions used above and below an outer join might not have been incorrectly null supplied, in a plan which allowed for parallel execution. This has been fixed.
443842 With the database option 'On_charset_conversion_failure' set to a value other than 'Ignore', the server would not have reported failures during character set conversion. This has been fixed.

This fix affects both the server and dbicu library - if the server starts a database that requires dbicu, then both the server and dbicu library must have this fix. If the server has this fix but dbicu does not, then the server will display the following message when it attempts to load the database:

"Unable to start database "<dbname>": dbicu library version mismatch"

443845 When using ADO and the SQL Anywhere OLE DB provider, a stored procedure reference like "SProc" is correctly parsed in a CommandText string as a procedure name. However, a stored procedure reference like "DBA.SProc" was incorrectly parsed as a schema owner, followed by a catalog name, and no procedure name. The following Visual Basic example fragment illustrates the problem:

objCmd.ActiveConnection = objConn

' Set CommandText equal to the stored procedure name.

objCmd.CommandText = "DBA.SProc"

objCmd.CommandType = adCmdStoredProc

' Automatically fill in parameter info for the stored procedure.

objCmd.Parameters.Refresh()

' Set the parameter values.

objCmd("@user_id") = "ianywhere"

objCmd("@password") = "test"

objCmd("@first") = "Iam"

objCmd("@last") = "Anywhere"

objCmd("@phone") = "5558836300"

objCmd("@extension") = "6300"

When ADO executeed the Refresh() method, the provider was asked to provide parameter information on the "SProc" stored procedure. A catalog name ("SProc") and schema owner name ("DBA") were passed in. Since catalog names are not supported and ignored, information on all stored procedures owned by DBA were returned to ADO.

This problem has been fixed. An incorrectly set property, DBPROP_CATALOGLOCATION, resulted in the parsing error. The property value has been corrected.

443856 If the non-security version of UltraLite.NET was installed and an attempt was made to use the HTTPS synchronization stream, no error would have been displayed and the SyncParms.Stream would have been set to UNKNOWN. A SQLException SQLE_COULD_NOT_LOAD_LIBRARY is now thrown. This is the same error that occurs when trying to set the HTTPS stream with the security version of UltraLite.NET and the native ulrsaw9.dll is missing.
443864 The server could have appeared to be hung in certain situations. This was more likely to occur at checkpoint time, and when other connections were processing large strings or blobs (approximately one database page in size or larger). This has been fixed.
443881 The QAnywhere Agent (qaagent) would sometimes have failed to launch the MobiLink Listener (dblsn) at start up. This was more likely to occur on Windows CE devices. This has been fixed.
444106 Complex disjunctive (OR) search conditions in a query's WHERE clause could have been incorrectly transformed by rewrite optimizations in the server, yielding a search condition not equivalent to the original, and hence yielding incorrect results. It is difficult to completely characterize the types of search conditions affected by this problem. However, for the problem to have occurred, the search condition must have contained so many disjunctive conditions that the condition exceeded a (generous) threshold of the maximal number of potential predicates to generate.

The following example illustrates the complexity of a search condition necessary for this problem to occur. However, the number of disjunctive clauses, and the number of predicates in each clause, are not alone a guarantee of exhibiting the problem:

select count(*)

from in_all

where

(d4=1 and d5=9 and d6=90 and d8=122)

and

(

(d7=4 and d8=122 and d9=138)

or (d8=122 and d9=112)

or (d3=57 and d7=4 and d8=122 and d10=4)

or (d8=122 and d9=65)

or (d3=76 and d7=1 and d8=122 and d9=62 and d10=2)

or (d3=62 and d4=1 and d7=1 and d10=2)

or (d3=76 and d4=1 and d5=9 and d7=3 and d10=1)

or (d3=55 and d4=1 and d5=9 and d6=90)

or (d3=124 and d7=4 and d8=122)

or (d4=1 and d7=2 and d8=122 and d9=37 and d10=1)

or (d3=22 and d7=1 and d8=122 and d10=2)

or (d3=76 and d4=1 and d5=9 and d8=122 and d9=37)

or (d3=31 and d7=1 and d8=122 and d9=59 and d10=2)

or (d3=57 and d4=1 and d7=1 and d8=122 and d9=59 and d10=2)

or (d3=110 and d4=1 and d5=9 and d10=4)

or (d3=76 and d7=1 and d8=122 and d9=23 and d10=3)

or (d3=150 and d7=1 and d8=122 and d9=23 and d10=2)

or (d3=36 and d7=1 and d10=2)

or (d3=30 and d4=1 and d7=2 and d8=122)

or (d4=1 and d7=5 and d8=122 and d9=136 and d10=1)

or (d3=76 and d4=1 and d5=9 and d6=90 and d7=2 and d10=4)

or (d3=110 and d8=122 and d9=59 and d10=1)

or (d4=1 and d5=9 and d7=3 and d8=122 and d9=37 and d10=4)

or (d3=61 and d4=1 and d5=9 and d8=122)

or (d3=91 and d7=3 and d10=4)

or (d3=216 and d7=1 and d10=2)

or (d4=1 and d5=9 and d7=4 and d8=122 and d9=37)

or (d3=30 and d4=1 and d8=122 and d9=23)

)

and date1 = 200406

This has been fixed.

444112 If a database server involved in mirroring was given its own server name via the -xp command line option ("database mirroring options"), it will successfully connect to itself and begin "synchronizing" the database. This provides no benefit whatsoever, and can lead to data corruption. This has been fixed so that servers are now prevented from connecting to themselves.
444121 UltraLite for AppForge on Palm would have set 揢nknown error� in the Description field of the error object (Err) when it should have set the field to SQLE_METHOD_CANNOT_BE_CALLED. The numeric value for the error was correct though (-669). This has been fixed.
444122 If a device that was running the QAnywhere Agent was powered off during the upload part of a MobiLink synchronization, after the completion of sending the upload data but before the acknowledgement of the upload, it was possible that all subsequent uploads would have failed. This has been fixed.
444123 The Interactive SQL utility could have become unresponsive if there windows open which were exectuing statements that led to the reporting a deadlock condition. This would have occurred if it had executed a call to stored procedure which was being debugged, the execution of a stored procedure call that was being debugged was cancelled. These conditions would also have caused Sybase Central to become unresponsive on Linux if the Interactive SQL utility was also running at the same time, and was itself unresponsive. These problems have been fixed.
444125 If the event_condition() function was referenced in the body of an event, the server could have crashed. This has been fixed. A workaround is to use the event_parameter() function instead.
444132 Using an UltraLite database with a collation using a multibyte character set and publication predicates that contained multi-byte characters, could have caused truncation of those predicates when saved to XML using the ulunload utility. This has been fixed.
444135 It was possible, although very rare, for a server under heavy load to have crashed when a client attempted to connect, that connection failed with a TCP/IP error. This type of TCP/IP error could have occurred, for example, if the client was terminated while it was in the process of connecting. This has been fixed.
444140 When an INSERT ... ON EXISTING UPDATE statement was executed against a table with an AFTER UPDATE ... FOR EACH STATEMENT trigger, the trigger would fire once for each row in the insert that matched a row already in the table. This behaviour is incorrect, as the trigger should fire only in response to an UPDATE statement. This has been corrected so that now an AFTER UPDATE ... FOR EACH STATEMENT trigger will not fire in response to an INSERT ... ON EXISTING UPDATE statement. Note, however, that any AFTER UPDATE ... FOR EACH ROW triggers will still fire.
444168 Setting the option Truncate_timestamp_values to On when the option Default_timestamp_increment had a value greater than 1, may have caused the assertion failure 106205 - "Attempting to store invalid timestamp value ..." This has been fixed by changing the maximum value for Default_timestamp_increment to 1000000 (1 second).
444260 If a CREATE DATABASE statement with a DATABASE SIZE clause caused the database file to grow beyond the space available on the file's device, the server would have failed with a fatal error signifying that disk space had been exhausted. The same behavour would have been observed with the -dbs command line option ('set initial database size') of dbinit. This has been fixed. The server now raises a SQL error rather than the fatal error.
444273 When connected to an UltraLite database, the DESCRIBE TABLE statement would have failed with an error, if the tablename contained any underscore '_' or percent '%' characters. This has been fixed.
444284 When preparing statements with non-ASCII characters, Dynamic SQL could have misinterpreted these characters causing unpredictable results. This has been fixed. A work around is to enclose strings containing these characters with double quotes.
444418 The TYPE clause for a SQL Anywhere web service client has been extended to allow the specification of a mime type. The value of the mime type specification is used to set the Content-Type request header and set the mode of operation to allow only a single call parameter to populate the body of the request. At most one parameter may remain when making a web service stored procedure (or function) call after parameter substitutions have been processed. Calling a web service procedure with a null or no parameter (after substitutions) will result in a request with no body and a content-length of zero.

The behaviour has not changed if a mime type is not specified. Parameter names and values (multiple parameters are permitted) are url encoded within the body of the http request.

Examples:

call sa_make_object( 'procedure', 'setmime' );

alter procedure setmime( val long varchar, mime long varchar, anurl long varchar)

url '!anurl'

type 'http:post:!mime';

from dbisql:

call setmime('hello, this is plain text', 'text/plain', 'http://localhost/someservice'); // POST body is not url encoded, it contains hello, this is plain text, Content-Type: text/plain

call setmime('<hello>this is xml</hello>', 'text/xml', 'http://localhost/someservice'); // POST body is not url encoded, it contains <hello>this is xml</hello>, Content-Type: text/xml

call setmime(null, 'text/plain', 'http://localhost/someservice'); // POST body is empty, Content-Type: text/plain, Content-Length: 0

- SQL Syntax of TYPE clause for create/alter stored procedure

HTTP:POST[:type/subtype]

- Error checking

Minimum error checking is provided for the mime type specification. A mime type specifier must contain a slash character. The colon delimiter may be padded on both sides by one or more spaces. Only a single parameter (after parameter substitutions) may contain the value used to populate the body of the HTTP request.

444429 Web service SOAP client calls could have used temporary file pages without releasing them, with at most one page would have been leaked per SOAP request. The visible result of this leak was that the temporary file could slowly grow in size over time when SOAP client calls were made. Since the leaked pages were left in the cache, the effective size of the cache would also have decreased over time. This has been fixed.
444436 The SQL preprocessor sqlpp could have generated incorrect code if the following two statements were one after the other:

EXEC SQL SELECT ... INTO <hostvar list>;

EXEC SQL DROP ...;

The DROP would have been missing from the generated. This has been fixed.

444438 If one or more remote columns were changed to be not synchronized, by selecting the columns in the column mapping editor and then selecting the File -> Synchronize menu item, there would not have been the same warning that was shown when the corresponding Synchronize check boxes were unchecked. This has been fixed so that the same warning is displayed in both situations.
444457 If the server displayed the message: "Cannot create stream controller thread" on startup, it may not have been possible to connect to a server in this state, and applications that were able to connect may have received communication errors. This error only occurred if the server ran out of address space (approximately 2GB of address space is available on 32bit Windows operating systems). This has been fixed so that the server will now fail to start if this error occurs. When this error occurs, the maximum cache size should be reduced by at least 10MB.
444467 If a character variable was bound to a numeric output parameter of a procedure, and the numeric value being returned by the procedure ended in two or more zeroes, the output value assigned to the variable may have been a single "?" character. A problem with the function that calculated precision and scale has been corrected.
444472 Using Interactive SQL with the -q command line option ("Suppress non-critical messages"), would have caused all messages to be suppressed. This was not correct, and has been fixed. Now, error messages are displayed regardless of whether -q is used or not.
444473 The DESCRIBE statement would have reported that a database object (ie table, view, procedure etc) could not be found if its name contained a tilde (~) character. This has been fixed.
444498 The UltraLite stream objects, reader and writer, were not being released correctly when ResultSet pods object is closed. This memory leak has now been fix.
444560 If the Java VM was started, and then at a later time an attempt to execute an ALTER or DROP DBSPACE it would have failed with the error: "Not allowed while 'user' is using the database', where "user" was the userid of the Java main connection. This problem has now been fixed.
444561 DETACH TRACING did not fully clean up connections established via ATTACH TRACING. After several thousand ATTACH TRACING calls, any further connections would have been denied, and the message "Out of StreamPool objects. Failed to create a new connection." would have appeared in the console. This has been fixed.
444592 String expressions formed from a large number of concatenations could have resulted in a stack overflow when the expression was evaluated. The number of concatenations required to see the failure was very large; while platform dependant, it was on the order of many thousands. This condition was more likely to manifest itself on UNIX platforms than on Windows. This has been fixed.
444594 The entry fields in the Install Key dialog allowed the entry of more than 5 characters, which would usually result in an invalid Install Key. This has been fixed by ignoring key presses if there are 5 characters already in the field.
444614 Synchronizations via HTTP could have failed, apparently at random. The frequency of these failures would have been very low. This has been fixed.
444627 Simple SELECT queries may have had a less than optimal query plan, which may have resulted in poor performance. A bypass cursor has built for queries that selected from a single table, even if the WHERE clause referenced only some of the columns of the primary key with equality predicates. This has been fixed.
444743 A new MobiLink server HTTP stream option, called session_key, has been added. This option determines how the MobiLink server tracks non-persistent HTTP sessions (i.e. when the MobiLink client specifies 'persistent=0'). The option is used as follows:

mlsrv10 ... -xo http(...session_key=[cookie|header];...) ...

When the session_key is 'cookie', which is the default, an HTTP cookie with name JSESSIONID is used to track HTTP sessions. When the session key is 'header', an HTTP header is used. The 'header' option is useful if the cookie name of JSESSIONID conflicts with an existing cookie, in which case MobiLink will track HTTP synchronizations using a custom header entry that will not conflict with any other HTTP infrastructure. In order to implement this feature in the MobiLink server, changes were also required to the MobiLink client. Thus to get the new behaviour, clients need to be upgraded as well.

Note, the session_key option is supported by the -xo option only.

444758 When run on Windows CE, if the server executable was located on a filesystem controlled by the Intel Persistent Storage Manager (IPSM), typically rooted at the \IPSM directory, then the server and the Windows CE device could have hung. The hang only occurred while writing data to a non-database file which is also located on the IPSM, such as the server output log (-o command line option), and was due to a problem with the IPSM driver. A work around to this problem has been implemented. Moving non-database files to RAM is a workaround.

The following is a copy of the IPSM bug description from Intel:

Note that other ASA components or 3rd party applications which might write compiled-in strings to a file on IPSM will also be susceptible to this bug. For 3rd party applications (or for ASA components prior to this fix), the user can avoid the problem by copying the executables & DLLs into the RAM disk or onto another flash device and running them from there instead of from IPSM.

444770 It was possible, although likely rare, for the server to crash after applying a transaction log, but before shutting down. The database file produced would still have been valid. A race condition in the server has been fixed.
444896 The performance of unprepared commands was slower than prepared commands when calling ExecuteNonQuery. This problem has been fixed.
444897 The changes for Engineering case 426484 would have caused the server to silently ignore client requests if clients were upgraded to a version with the change, but the server was not. This has been fixed so that newer clients with this change can synchronize with servers that have not yet been upgraded to a version with the change. Thus to solve this problem, the server must be upgraded to build 3342 or later, or the client must be upgraded to build 3390 or later.
444898 The server may have crashed when using cached plans in nested procedures. This crash would have been rare, and was likely to appear only when there was heavy competition for cache memory. This has been fixed.
444904 When the MobiLink server was listening for HTTP or HTTPS connections, it would have silently ignored invalid connections/requests. It now displays an error for each invalid request.
444919 When the Interactive SQL utility opens a file, it scans the file to determine the character encoding used. If that encoding is different from the encoding used by the operating system, a dialog is opened which allows selecting the encoding to be used when reading the file. There is a "(Default)" encoding which means that the system character encoding is used. Opening a file could have failed if the file was not encoded in the system file encoding, and "(Default)" was explicitly selected in the "Open File" dialog. This has been fixed.
444924 A query that used a full index scan without predicates on a prefix of the index, but with predicates on other index columns, could have crashed the server. This has been fixed.
444926 The dbisqlc utility would have failed to connect to a server if the option sql_flagger_error_level was set to any value except 'W' (Allow all supported syntax). This has been fixed by setting the option to 'W' temporarily on startup.
444936 An attempt to display the dialog giving the option to re-enter an install key or to install the evaluation version, which is displayed when an invalid install key is entered in the Install Key dialog, would have generated a non-fatal missing string error. This has been fixed.
444941 Attempting to create an event with a non-recurring schedule that had a start time in the past, would have caused the error: "Invalid start date/time for event '<event-name>'". This has been fixed so that now the following error message is displayed:

You cannot create a non-recurring schedule with a start time

in the past, since such a schedule can never trigger an event.

You must either specify a recurrence interval and/or days,

or change the start time to a time in the future.

444986 SELECT expressions, which were not just a reference to a column, could have been improperly evaluated when the cursor was not read-only, and when temporary tables were involved. This has been fixed. The work-around is to add the FOR READ ONLY clause to the SELECT statement.
445021 The syshistory logging entries for DTT and LAST_DTT did not include the correct detail

information for dbspaces other than SYSTEM. For non-SYSTEM dbspaces, the detail information of the main dbspace was entered. If the drive type was "UNKNOWN", the detail information was incorrectly deleted when moving a LAST_DTT to DTT. This has now been fixed.

445035 On Unix systems, specifying an IPv6 address with the MYIP parameter would have caused the server to fail to start. For IPv4 addresses, when listening on a UDP port Unix requires that you listen on the broadcast address, not the actual address. However, for IPv6 addresses, you must listen on the actual address. This has been fixed.
445042 On Windows CE systems, the MobiLink client could have crashed when the QAnywhere agent was shut down. This has been fixed.
445043 The use of indexes may have caused poor query peformance when the server was under heavy load. This has been corrected.
445049 If an EXECUTE IMMEDIATE statement was used to execute a string representing a compound statement having a single executable statement and an exception handler, the exception handler would have been ignored. This has been fixed. Adding a RETURN before the EXCEPTION would be a work around.
445050 An INSERT statement may use a work table in order to provide the required semantic guarantees. In such cases, it was possible for autoincrement columns to be incremented by 2 instead of by 1. The consequence of this would be gaps in the values inserted into autoincrement columns. This has now been fixed.
445062 Typically, ResultSet.getBlob() is used to retrieve columns of type long binary, however, there is no reason an application cannot use the getBlob() method to retrieve a column of type VARBINARY or BINARY. Unfortunately, getBlob() did not work properly for columns of type VARBINARY or BINARY. This problem has now been fixed.
445065 The MobiLink server could have crashed if the number of columns in a table uploaded from a remote client did not match the number of columns defined in the ml_column table. Now, the error: "The number of columns in client table <table name> does not agree with the number defined in ml_column" is displayed, and the synchronization is aborted.
445069 If a statement representing a query was dropped before the cursor using it was closed, the system procedure sa_get_request_times() could have reported a time for the statement which was too low. The sa_get_request_times() procedure calculates statement duration using the enter and exit times for a subset of the requests associated with that statement. Individual FETCH requests are not considered, since request logs frequently do not contain that level of detail. For queries, most of the time occurs between OPEN and CLOSE, so sa_get_request_time() calculates the difference between the enter time for the OPEN and the exit time for the CLOSE and adds that to the total for the statement. While processing the log, it only keeps track of statements which it considers "active". It discards its knowledge of a statement when it sees a DROP for the statement. Many (if not most) applications perform queries using the following sequence:

PREPARE

DESCRIBE

OPEN

FETCH ...

CLOSE

DROP

While the server can handle the statement being dropped before a cursor using that statement is closed, sa_get_request_times() could not. This has been fixed.

One possible workaround is to remove the lines representing the statement DROP from the request log before calling sa_get_request_times(). Assuming that statement handles are not re-used within the request log, this should allow the correct times to be obtained.

445072 If an UltraLite client attempted to connect to a server that was in the process of shutting down, there was a small possibility that the connection attempt would hang. This has been fixed.
445185 When the MobiLink server was listening for HTTP or HTTPS connections, it would have silently ignored invalid connections/requests. It now displays an error for each invalid request. This has been fixed, but only affects the -xo command line option. The -x option already displays one of a number of different HTTP errors when an invalid connection/request comes in, so no fix is needed for it.
445186 An attempt to convert a value from a numeric domain to a binary domain would have resulted in a conversion error. For example, the statement

select cast( cast( 17 as numeric(5,2) ) as varbinary )

would result in error -157: "Cannot convert numeric to a varbinary." This has been fixed.

445193 Calling the method SACommand.ExecuteNonQuery with invalid parameter values, could have caused an NullReferenceException to be thrown. This problem has been fixed.

A C# example:

SAConnection conn = new SAConnection("dsn=SQL Anywhere 10 Demo;uid=dba;pwd=sql");

conn.Open();

SACommand cmd = new SACommand( "DELETE FROM Departments WHERE DepartmentID = ?", conn );

cmd.Parameters.Add( "p1", SADbType.Integer );

cmd.Parameters[0].Value = "xxx";

int rowsAffected = cmd.ExecuteNonQuery();

445195 The CustDB sample was registering unsynchronized columns in the ml_column table. This has been fixed. In order to fully implement this fix, the CustDB consolidated database(s) must be rebuilt, as an accompanying fix to the MobiLinl server will cause synchronizations to fail. To do this, go to the %SQLANY10%\samples\UltraLite\CustDB directory and run newdb.bat.
445212 When executong a LOAD TABLE statement, if the server read a UTF16 or UTF8 data file that contained a byte order mark (BOM) as the first character, the BOM would have been interpreted as column data, rather than being skipped. If the first column contained numeric data for example, a conversion error would have been reported. If the first column contained string data, the BOM would have been included as part of the first string value for that column. This has been corrected by skipping BOMs.

Note that SQL Anywhere just skips over the BOM even for UTF16. It does not currently allow the BOM to control the endian-ness of the data in the file (it is always assumed to be in platform endian). BOMs in UTF8 are meaningless but the Unicode standard does allow them. Some utilities such as Notepad on Windows put a BOM into files encoded in UTF8.

For detailed information on BOMs, see http://unicode.org/unicode/faq/utf_bom.html.

445219 When the ULPod method ResultSetSchema.close() was called, the UltraLite runtime object ResultSetSchema was released twice. This may have caused rare crashes to have occurred. This has been fixed.
445246 If a Java stored procedure fetched a numeric InOut or Out variable from JAVA, the numeric value returned could have been a '?', instead of the actual value.

Note, this problem is a side effect of the changes made for Engineering case 443233. Both this problem, and the original problem for case 443233, have now been resolved.

445341 The row number on the Results tab could have been clipped (i.e. shown the first digit followed by an ellipsis), if the "Show multiple result sets" option was on and the result set contained thousands of rows. This has been fixed.
445367 When unloading a database using the Unload utilty, Sybase Central, or through the dbtools 'DBUnload()' function, the unloading application (i.e., dbunload, Sybase Central, or caller of DBUnload()), could have crashed. This would only have happened with the "verbose" option set to ON (such as would be the case with an unload from Sybase Central, or with the -v option of dbunload). This has now been fixed.
445369 If an INSERT ... SELECT query involved both remote and local tables, and the table being inserted into was a view, then the query would have failed with a "column not found" error. This problem has now been fixed.
445373 The Interactive SQL utility could have crashed on startup if a badly-formed TrueType font was installed on the machine. This has been fixed.
445374 The MobiLink Contact sample had incorrect columns in the ml_column table. This caused the MobiLink server to assign incorect values to named parameters, which caused uploads to fail. The script 'build_consol.sql' has been corrected. In order to implement the fix, the Contact sample must be rebuilt by running the clean step followed by the build step.
445378 Importing binary data into an UltraLite database using the Interactive SQL utility could have failed to load correctly. The UltraLite ODBC driver was not treating SQL_VARBINARY as the same as SQL_BINARY, so binding a parameter as SQL_VARBINARY would have caused no data to be loaded. This has now been fixed.
445382 The server now makes use of direct I/O on Solaris, AIX, and Linux sytems where possible. If direct I/O is not available the server will revert to using synchronized I/O data integrity completion as before. Using direct I/O will significantly improve some disk operations, such as extending a databse or transaction log file.
445429 The MobiLink Monitor would only have shown statistics for one synchronized table. The server was passing a truncated table_id to the Monitor. This has been fixed.
445439 The UltraLite runtime could have crashed when attempting the execute a query with IN or ANY operators that used a subquery. This was corrected.
445529 If a row had a wide index entry (i.e. many columns or a single long column, or some combination), and one of the columns that was part of that entry was updated, there was a chance that the index would have been corrupted. If the update happened to be rolled back, the corruption would typically have been removed. This could only happened on non-catalog, non-temporary, base tables. This has been fixed.
445540 On Unix systems, the iAnywhere ODBC Driver Manager always loaded the threaded version of the ODBC driver, regardless of whether it was being used by a threaded or a non-threaded application. This has been fixed.
445542 Applications (including SA utilities) initiated with the locale set to EUCJP, or with the charset connection parameter containing a value greater than 19 characters, would have failed to connect. This has been fixed.
445543 When run on HP-UX systems, connection attemps using TCPIP would have failed when using the single threaded 32-bit client libraries. This problem has been corrected.
445544 If a database which uses dbspaces is started and one of its dbspaces cannot be found, executing an "ALTER DBSPACE ... RENAME" will now cause the server to attempt to open the dbspace after the catalog has been updated. If the dbspace cannot be opened, it will remain inaccessible and no error is returned. Previously, the dbspace would not be accessible until the database had been restarted. An application can determine if a dbspace is open by examining the result of db_extended_property('FileSize','<dbspace-name>'). If the result is NULL, the dbspace is not open.
445546 Calling an SA client SOAP procedure, from within the Interactive SQL utility, may have returned unexpected HTML encoded data within the result set. Some characters were being displayed in their html encoded form (i.e. an apostrophe (') as '). This has been fixed.
445559 When creating indexes in UltraLite databases, the maximum hash size for the index can be specified, although the full hash size specified might not be needed to accurately represent an index value. For example, if the maximum hash size is set to 6 and the index is one integer column, only 4 bytes is required. UltraLite should only use the number of bytes required up to the maximum value specified, but was using the maximum hash size specified instead of the potentially lesser value of what was required. So, if a maximum hash size of 6 was specified for an index of only one column, 6 bytes was used instead of only 4. This would waste 2 bytes for every index entry, leading to pages that are not as full as could be. This has been fixed so that new indexes created will only use the space needed for them. For compatibility reasons, existing indexes continue to use the hash size with which they were created (they will continue to potentially waste space). Existing databases can be unloaded and reloaded to take full advantage of this fix.
445568 Calling the ODBC function SQLTables() returns a result set of table owners, table names, and table types. When SQLTables() was called with SQL_ALL_TABLE_TYPES it should have returned a result set with a list of all possible table types, but "SYSTEM VIEW" and "MATERIALIZED VIEW" were missing. Support for these two new types was missing, but has now been added.
445570 While do a Linux install, if only x86_64 (64-bit) components were installed, sa_config.sh and sa_config.csh were not be generated. This has been fixed.

Note, the Linux Itanium install is not affected by this problem.

445586 The changes for Enginering case 444112 caused connection attempts using connection strings with errors in the TCPIP parameter to return SQLCODE -100 'Database server not running', rather than the correct SQLCODE -832 'Connection error: ...'. This has been

corrected.

445593 If there was a fatal startup error, and the MobiLink server was running in a GUI, the MobiLink server would not have displayed an error dialog. This has been fixed.
445626 Attempting to start a database with the wrong log file could have failed with the error "Unable to start specified database: ??? belongs to a different database". This has been fixed so that the log file name now correctly appears in the error message.
445675 When the server was run on Windows CE devices, database unload progress messages could have been truncated when the database collation used a multi-byte charset. This has been fixed.
445677 Interactive SQL could have reported an internal error if an accelerator key (e.g. CTRL+N) was used while it was busy (e.g. saving a file). This has been fixed.
445684 On NetWare, certain operations were slower than in previous ASA versions. Particularly, operations which involved processing many rows for each row returned in the result set were noticeably affected. This has been fixed so that the performance of these operations has been improved.
445688 For messages coming from a JMS system, the QAnywhere JMS connector now maps the JMSTimestamp header to a message property of the QAnywhere message with name "JMSTimestamp" and type LONG. Also, in this case, the message property "ias_Timestamp" of the QAnywhere message is set to the time that the QAnywhere message is created.
445695 A QAnywhere client application wass not be able to get a message that had been received, but not acknowledged, and for which the expiry time had passed. This has been fixed. Now, QAnywhere clients can always get, or browse messages, that had been received at least once before the expiry time has passed.
445707 The Interactive SQL utility could have crashed if it was closed while executing a statement if all of the following were true:

- it was running as a windowed application

- a .SQL file had been opened,

- the file had been modified in the "SQL Statements" field,

- the file had not yet been saved,

- when prompted whether to save the file or not, the "Yes" button was clicked.

This has been fixed.

445710 The default value of SACommand.UpdateRowSource has been changed from UpdateRowSource.Both, to UpdateRowSource.OutputParameters. This change can improve the performance of SADataAdapter.Update. If the value of SACommand.UpdateRowSource is UpdateRowSource.OutputParameters, the provider will call ExecuteNonQuery to update rows. If the value is UpdateRowSource.Both, ExecuteDataReader is called to update rows.
445714 Interactive SQL could have crashed, following an attempt to execute a statement if the server had previously closed the connection, and the "auto_commit" option was ON. This has been fixed
445741 The Initialize Database utility ULINIT, would have failed with an internal syntax error when processing a UNIQUEIDENTIFIER column that had a DEFAULT of NEWID(). This has been fixed. The work around is to drop the DEFAULT in the reference database, then run ULINIT to create an UltraLite database, and then go back and restore the DEFAULT.
445836 In the dbisqlc Statistics window, messages such as "execution time xx.yyy seconds..." could have had an incorrect number of seconds. This has been fixed so that xx.y seconds is now reported (i.e. seconds including tenths), and this time is accurate.
445847 On Unix systems, if the environment variable ASTMP (9.0) or SATMP (10.0) contained a path, where the final two or more component directories did not exist, client utilities would have crashed on startup with the error message "Failed to create directory '<path>': No such file or directory". This has been fixed.

Note that the network server is not affected by this.

445855 When run on Windows XP, Sybase Central could have crashed on startup if a custom desktop theme was being used, and this theme supplied its own resource file for system bitmaps that did not contain equivalents for all of the usual system bitmaps. This has been fixed so that when this situation is detected, it will not attempt to use the missing bitmaps.
445878 Creating a table, then selecting the table's node in the tree, and answering "yes" to save it, would have resulted in a NullPointerException. This has been fixed.
445879 When deploying a synchronization model the generated calls to the ml_add_column stored procedure could have been in the wrong order, leading to synchronization errors. This has been fixed so that the generated calls to ml_add_column now occur in the same order as the column order in the remote database. A workaround is to deploy to a SQL file for the consolidated database, and edit the file so that the ml_add_column calls are in the same order order as the columns in the remote database.
445898 When inserting a negative value into a column with an autoincrement default, the error callback function is called if one was registered with the runtime. The error passed to the callback was SQLE_OVERFLOW_ERROR however, no error would have been signaled when checking immediately after the Insert call. This has been fixed so that no error is now raised at all.
445966 If the extended option DownloadOnly was set to 'ON', the MobiLink client would not have sent authentication parameters specified by the -ap optiion to the MobiLink server. Authentication parameters were being sent for normal synchronizations. This has now been fixed.
445997 An application using jConnect could have caused a server crash when calling a stored procedure. This has been fixed.
446001 The MobiLink client could have crashed whenever a synchronization was attempted if no communication address were specified for connecting to the Mobilink server, such that the default values were used. This would have occurred when the 'log_sent' and 'progress' columns in the syssync table were not equal, and the 'progress' column did not equal the 'created' column. The crash would normally have occurred after a synchronization failed during the upload phase of synchronization. This has been fixed.
446003 Importing text files encoded with UTF-8, using the INPUT command, would have failed if the file had a 3 byte endian header. This has been fixed.

Note that some text editors (e.g. Notepad) write the 3 byte header, but others do not.

446050 Stored procedures that execute a very large number of of simple statements, such as control statements, could have run slower than earlier versions of the server. This performance problem has been resolved.
446052 When the Unload utility, or Sybase Central, ws used to rebuild a database that was running on a server on a different physical machine, the rebuild could have failed. This has now been fixed. This would only have happened when the -an option (create a new database and reload), or the Sybase Central equivalent, was specified. Also, because rebuilding a pre-10.0 to 10.0 database requires that dbunload be on the same machine as the database being rebuilt, this problem only happened when rebuilding a 10.0 database.
446064 Validating an index could have caused a server crash if the index was concurrently being updated. Checks were missing to see if a page had changed across a context switch. This has been fixed.
446066 The Backup utility would have given a poor error message when backing up a database with one or more missing dbspaces. It would have reported the following messages:

Database backup not started

Database backup failed

These messages were not very informative. This has been fixed so that the following messages are now displayed:

Backup is unable to open database file '<file name>'

Database backup failed

446067 If an external stored procedure had OUT or INOUT parameters of type SMALLINT, then the result of these parameters could have been interpreted incorrectly for negative values. For example, the comparison "x < 0" could have failed even though the parameter x was assigned a negative value. This has been fixed,
446094 When a new remote database was created, based on an Oracle database with DATE columns, the SQL Anywhere or UltraLite remote database would have had DATE columns. However Oracle's DATE type includes time information which would have been lost when downloading to the remotes. This has been fixed. Now new remotes have TIMESTAMP columns for Oracle DATE columns in the consolidated. This will cause a warning about timestamp precision mismatch unless the remote database is changed to have the same timestamp precision as Oracle's DATE type. This is not done automatically in Model Mode when Oracle TIMESTAMP columns are also being synchronized.

If time information is important, then you should consider changing DATE columns to TIMESTAMP columns in your Oracle database.

446220 Calling a stored procedure that did not return a result set, could have caused a "cursor not open" error. This problem has been fixed.
446233 It was possible that some components could have generated errors, or created files with invalid names, when using files with names that had missing attributes. For example, backing up a database and transaction log, where the log file had no extension (ie. demo as opposed to demo.log), could have generated an error that the log file could not be backed up and that the backup failed. This has been fixed.
446241 If a DELETE trigger referenced values from the NEW row, it was possible for the server to have crashed. This has been fixed; attempts to set values in the NEW row result in an error.
446243 The network protocol option network_name did not work on Windows CE. This has been fixed.
446262 The Import Wizard would have displayed text data which contained escape sequences incorrectly in the preview table. For this to occur, the imported data must have been ASCII formatted, and the data had to contain an escape sequence (e.g. "\0x0a"). This has been fixed.
446269 Interactive SQL could have run out of memory when it executed a SQL file. Running into this problem would have been more likely if the the SQL file was large and run in batch mode from a command-line, the "-onerror continue" command line option was used, or the script included an equivalent SET OPTION statement in the SQL file itself, and executing the SQL file caused tens or hundreds of thousands of errors to be reported. This is now fixed.
446387 If the QAnywhere client was started with scheduled policy, after previously being started with a short (< 5 seconds) schedule interval, it could have failed to start, and issued an internal error 'ml_qa_sync_event_0 in use'. This has been fixed.
446388 The Import Wizard was not consistently providing default widths for columns when importing a file into a new table. The problem was that only a limited set of data types were getting default values. This has been fixed.
446393 When MobiLink was running a QAnywhere connector and then shut down, some JDBC connections to the consolidated database were not closed. This has been fixed so that all JDBC connections used by QAnywhere connectors are now closed when MobiLink is shut down.
446398 When a non-default port was specified for TCPIP connections, the server could not be found by the Locate utility on Unix systems. The UDP listener for the default port was listening on the actual IP address, as opposed to the broadcast address which Unix uses. This has been fixed.
446405 The list of data types on the column details page of the Import Wizard could have contained unsupported data types, if a SQL Anywhere database had been connected to prior to connecting to an UltraLite database. The cached list of data types was not being discarded on a disconnect. This is now fixed.
446406 If a machine was configured for IPv6, but for some reason failed to send the broadcast on the IPv6 interface (e.g. "No route to host"), applications that sent a broadcast would find no servers at all. The broadcast was giving up after any failure to send a message. This has been fixed so that if either the IPv4 or the IPv6 send succeeds, it will

listen for responses.

446409 If an ALTER TABLE statement attempted to add a column CHECK constraint, plus make other changes to the column, and the CHECK clause was not the first one in the statement, the server could have crashed. This has been fixed. To work around this problem, divide the changes into separate statements, or specify the CHECK clause first.
446416 When generating recommendations for a logging sesssion on a database, deadlocks were reported on all logging sessions, not just the one that was selected. This has been fixed.
446424 When reading a SQL script via the File.../Open menu, or via the READ command (either explicitly or implicitly by putting the file name on the command line), dbisqlc would have stopped reading the file at the first '\x1a' character (also known as control-Z or a DOS end of file character). Typically, a syntax error or other obvious error would have occurred when executing the script, as the most likely reason that such a character would be present in a file is that it is a substitution character created during a lossy character set translation. This has been fixed by opening the file in binary mode.
446425 The server could have leaked small amounts of memory when calling some of the server or connection property functions, such as sa_conn_properties(). This has been fixed.
446427 Validating indexes could have caused the server to become deadlocked. For this to have occurred, the validation had to report "Invalid or duplicate index entries", whether spurious or not. This is now fixed.
446432 The download resumption feature of MLFileTransfer did not work properly if an error had occurred during download. Although it did work properly when a download was cancelled. The temp file was always being deleted when there was an error. This has been fixed so that the temp file is deleted only if download resumption is disabled.
446433 Changing any value on the DBConsole options dialog, except quitting time, on a database that did not have quitting time set, would have caused an error message to display indicating that quitting time had an incorrect value. This has been fixed.
446517 Unscheduled requests were being recommended for all logging sessions, not just the selected session, when examining a database with tracing information from multiple sessions. This has been fixed.
446550 An invalid column reference could result in a server crash. This has been fixed.
446555 If an application used BCP IN to insert data into a table, then the last row in the input would not have been inserted. This problem has now been fixed.
446556 The ADO.NET providers ( versions 1.x and 2.0 ) were not marked as CLS Compliant. This could have caused CS3001 and CS3003 warnings from Visual Studio. This problem has been fixed.
446662 If a proxy table had a unique identifier column defined, then querying that unique identifier column would always have returned NULL. This problem has been fixed.
446667 Casting a double with a large positive or negative exponent, into a string with a large buffer, would have crashed the UltaLite runtime. An intermediary buffer was too small. This has been fixed.
446669 Executing a JAVA method could have hung if the method attempted to flush a message to System.out or System.err. For this problem to occur, many specific events must take place:

1) multiple connections must be executing JAVA at the same time,

2) the connection that executed JAVA last is the first one to return from JAVA,

3) that connection then subsequently disconnects,

4) no other connection executes JAVA after the connection in 3 above disconnects, and

5) one of the connections still executing JAVA tattempts to flush a message to System.out or System.err after the connection in 3 above disconnects.

This problem has now been fixed.

446682 An invalid ORDER BY clause in an OLAP window specification could have caused a server crash. This has been fixed so that the server now handles errors correctly when constructing composite aggregate functions.
446700 When calling a stored procedure with a string parameter, either inout or out, the parameter value returned would have been an empty string, if the size of the string parameter was not specified. Now, the provider will throw an InvalidOperationException if the size of the parameter is invalid.
446768 The MobiLink server would have crashed, or hung, when shutdown after a QAnywhere client had sent a web services request. This has now been fixed.
446771 Connections using the iAnywhere JDBC driver would have failed if the connection string contained chararacters that were not ASCII or UTF-8. This has now been fixed.
446772 When viewing the Details pane after profiling an application, the procedure name may have been incorrect for some statements. The displayed statement text and line number information were correct though. This would only have happened if a separate tracing database had been created. This has been fixed. A workaround is to trace to the local database.
446803 In the MobiLink Model Mode in Sybase Central, if multiple rows were selected on the Mapping page and the download type changed from Timestamp to Snapshot or Custom, or the Download Deletes column was unchecked, the download_delete_cursor script on the Events page might not have reflected the change. This is now fixed.

A workaround is to change one table mapping at a time.

446806 An application would not have shut down after it had NEW'ed a Dbmlsync object (an object that represented the dbmlsync non-visual integration component -- dbmlsynccom.dll). When the application closed the last of its windows the process did not terminate, as the Application.Run() method did not return, even though all application windows were closed. This problem has been resolved. The application now shutdowns normally.

Note, this problem did not occur when the graphical version of the integration component was used (dbmlsynccomg.dll).

446808 After performing an analysis on a database, and viewing the recommendations by moving to it via the arrow button in the recommendation dialog, the recommendation for "outdated optimizer statistics" could have been truncated. This has been fixed.
446914 With this change, it is now possible to restrict the permissions of temporary files created by the server and/or client. Traditionally, these files were unconditionally created with global read, write and execute permissions. To use this feature, a directory must be specified using the SATMP environment variable and this directory must not be one of the standard locations:

- /tmp

- /tmp/.SQLAnywhere

- the value of the TMP environment variable, if set

- the value of the TMPDIR environment variable, if set

- the value of the TEMP environment variable, if set

- a symbolic link pointing to any of the above

When SATMP is set to such a non-standard location, the server and client will walk up the given directory path looking for directories owned by the current user with permissions set to 707, 770 or 700. For each directory found, the appropriate permissions (other, group, other+group respectively) will be set from the permission mask used to create temporary files.

For example, if the SATMP environment variable is set to: /tmp/restricted_permissions/sqlany, where restricted_permissions is a directory with permissions 700, then all files created in this directory will have permissions 700.

446916 After doing a schema upgrade (ApplyFile) the values for the last_download_timestamp of each publication would have been overwritten by the values of last_upload_timestamp. This has been corrected.
446925 If the QAnywhere Agent's message store was created to use a transaction log, and the QAnywhere Agent was launched with no special database server options, the transaction log of the message store database would have grown without limit. This has been fixed. Now, the QAnywhere Agent uses -m (truncate transaction log after checkpoint) by default for the database server start options.

Previously, it was recommended to create QAnywhere client message stores with no transaction log. This is no longer the case, as the QAnywhere client is much more efficient when the message store is using a transaction log.

446927 If a procedure was called using host variables many thousands of times on a single connection, the call could eventually fail with error -890 (Statement size or complexity exceeds server limit). This has been fixed.

A workaround is to periodically disconnect and reconnect the connection.

446931 Index corruption was possible if there were two consecutive index entries with the following properties: the first index entry had a hash length between 242 and 248 and the second entry had a hash of length 249 or greater, and must have contained the first hash as a prefix. The hash length of an index entry is roughly the sum of the lengths of the indexed values [for strings with ICU collations, doubling the length will likely give a better estimate]. For the corruption to have occurred, the last column indexed needed to be a string column with a legacy collation. This is now fixed.

Note, the fix will flag any index entry having a hash length between 242 and 248 as corrupt. Indexes with such entries can be found by running VALIDATE TABLE ... WITH EXPRESS CHECK ( or dbvalid -fx). Indexes with such entries will produce a message like

Index "t_l" has invalid entries - reorganizing the index may resolve the problem

Reorganizing the index by issuing a REORGANIZE INDEX command will fix the affected index entries (a validate with express check should run cleanly afterwards). Reorganizing the table is not recommended.

446945 Using the "Back" or "Forward" toolbar buttons or menu items would have selected the tree item, but did not restore the selected details tab. This is now fixed.
446948 It was possible, although very rare, for the server to have crashed or exhibit other fatal behaviour when it was under heavy load, or when there was increased concurrency, such as when run on multi-processor systems. This has been fixed.
446951 A deleted row that could not be immediately removed from the database because it was in use by another cursor, was not subsequently removed as quickly as possible when the row was freed. This has been corrected.
446958 The server automatically collects column statistics when data is modified by means of LOAD TABLE or when INSERT, UPDATE or DELETE statements are executed. The efficiency of the collection mechanism for NUMERIC columns has been significantly improved.
446962 Interactive SQL was treating the character 0x1A as an end-of-file character, when it was encountered by the INPUT or READ statements. This has been changed so that processing continues after reading that character.
446965 The fix for Engineering case 433730 introduced a problem which caused the types for procedure parameters and function results defined using user-defined types to be set incorrectly. As well. the problem could have affected procedures which returned XML data. This has been fixed.
447049 Executing a statement, or statements, which caused tens of thousands of messages to be displayed in the "Messages" panel, could have caused Interactive SQL to eventually report an out of memory error. This has been fixed so that only the last 1000 messages are displayed when Interactive SQL is run as a windowed application, in order to reduce the amount of memory required. When run as a console application, all of the messages are displayed in the console window.
447062 When importing data using Interactive SQL's Import wizard, setting any column type to "long varchar" would have caused a syntax error. This has been fixed.
447079 When Interactive SQL was connected to an UltraLite database, an INPUT statement would have failed attempting to load data into a BIGINT column. While SQL_C_SBIGINT and SQL_C_UBIGINT were supported, SQL_BIGINT was not. It is now supported.
447081 The server could have crashed when truncating a table with an index that contained long hash values, when the database option Truncate_with_auto_commit was ON, which is the default. For the crash to have occurred there must have been no foreign keys to or from the table, no DELETE triggers defined on the table, and the server must not have been in the middle of an atomic operation. This problem is now fixed.
447085 The Import wizard could have crashed on the last page. The crash was timing related, so its frequency could have varied considerably. This problem has now been fixed.
447199 In some constrained memory conditions, a recursive union query might have caused the server to crash, or failed with the error 'attempting to insert a null into a not null column of a temp table'. This has now been fixed.
447332 Sort key generations for some UCA collations could have been incorrect and could have lead to index corruption. The problem only affected primary-only sort keys (ie it must have been case and accent insensitive, and it must have sorted punctuation at the primary level). This has been fixed.
447334 If a server was killed or crashed while executing a command through xp_cmdshell it's sockets would not have closed until the xp_cmdshell process was finished executing. Thus, if the server was restarted, it would not have been able to bind to the port used in the last run, and could not have been restarted unless a different port was specified. This has been fixed so that the port is closed when the process ends.
447342 If a query used a SUM aggregate function with a NUMERIC argument in a query containing window OLAP features, it was possible for the server to have crashed. This has been fixed.
447343 When using the Database Tracing wizard, clicking the Tracing Data page for a closed server could have caused an exception. This has been fixed by ensuring that the database is found before closing all connections on a server for the database.
447345 If an application using the iAnywhere JDBC driver executed a statement, or prepared statement, that returned several tens of thousands of asynchronous messages to the client (i.e. calling a stored procedure that executes many MESSAGE ...TO CLIENT statements), then there it was very likely that the Java VM would either run out of memory or crash. If however, the stored procedure returned only a few messages per execution, calling the stored procedure tens of thousands of times would not have been a problem. This is now fixed.

Note, that for this problem to occur, the application must install an asynchronous message handler. the Interactive SQL utility is one such application.

This problem has now been fixed.

447353 The Model Mode of the MobiLink plug-in would have added a CHAR(1) column to consolidated tables for which logical deletes were chosen to be used. With a SA, a CHAR(1) column is just one byte, so it can not hold multi-byte characters, even if a UTF8 database was used. Now an NCHAR column is used, except for DB2 consolidated databases (since DB2 does not support the NCHAR type, and in a Unicode DB2 database CHAR can hold multi-byte characters).
447355 If the tracetime.pl Perl script (<asany>\Samples\ASA\PerformanceTraceTime\tracetime.pl) was run using a request log containing host variable information, the script would have hung. The script failed to increment a counter within a loop that was resetting the hostvar info. This has been fixed.
447458 When the network protocol option MyIP specified a link-local IPv6 address on Linux, depending on Linux kernel version, the server would have failed to start, or broadcasts would not have worked. This has been fixed.
447469 If a BACKUP DATABASE statement with a TRANSACTION LOG RENAME clause was performed on a mirrored database, the mirror server would have crashed at the completion of the backup. This has been fixed.
447481 Given a query with a LEFT OUTER JOIN where the join condition was on an indexed column whose ID value was greater than 7, all rows after the first that had null values supplied on the right side (i.e. when the join condition was not satisfied) would have had null values for the null-supplying side.

For example:

SELECT id, c8 FROM T LEFT OUTER JOIN S on id = c8

If c8 was the 8th column in table S and the first row抯 value of id could not be found in c8, NULL would have been supplied for every value of c8 in the result set (even when S had a row where id = c8).

This has been fixed.

447483 1) The -ea option ('strong encryption') on dbinit and dbunload now accepts the additional values of 'none' and 'simple' as encryption types. This switch no longer requires either of the -ek or -ep options. The option "-ea none" cannot be specified with -ek, -et, or -ep; and the option "-ea simple" cannot be specified with -ek or -ep.

The defaults for the -ea option are as follows:

1. "none" if none of -ek, -ep, or -et are used

2. "AES" if -ek or -ep is used (with or without -et)

3. "simple" if -et is used without -ek or -ep

2) The -e option ('simple encryption') on dbinit is now deprecated. It will still be accepted in 10.x, but is not listed in the usage, and will be removed in the next major release. Instead, "-ea simple" should be used for the same behaviour.

447484 The syntax for creating encrypted databases has changed slightly. The syntax for the ENCRYPTED clause of the CREATE DATABASE statement is now:

ENCRYPTED OFF |

ON |

[ON] KEY key [ALGORITHM { AES | AES_FIPS } ] |

[ON] ALGORITHM { AES | AES_FIPS | SIMPLE } [KEY key]

The key and the algorithm can be specified in either order, and the algorithm can be specified without the key, although this is only useful for the 'simple' algorithm. The "SIMPLE" algorithm cannot be specified without a key. Algorithm names (AES, AES_FIPS, and SIMPLE) are case-insensitive.

This change only applies to the CREATE DATABASE statement; the CREATE ENCRYPTED FILE statement is unchanged.

447585 When using Microsoft's Query Analyzer with Microsoft SQL Server, if a SELECT statement that used the OPENDATASOURCE procedure and specified the SQL Anywhere OLE DB provider was executed, it would have failed with the error: "Could not perform a Windows NT authenticated login because delegation is not available.".

For example:

SELECT * FROM OPENDATASOURCE('ASAProv.90','Data Source=dba_sql_90;User ID=dba;Password=sql')..dba.my_table

This has been fixed so that the OPENDATASOURCE procedure now works correctly.

447602 It was possible for SQL Remote to have generated MAPI messages which were visible in the account's inbox, even if the SQL Remote message link option for IPM_Send had been properly set to FALSE. The IPM_Send variable was not being properly initialized. This has now been fixed.
447613 A performance warning "Server cache size is too small for database '<dbname>'" could have been displayed in the server console even when the cache size was adequate for the size of the database. The problem was that the server was including the size of the transaction log in its space calculation. This has been fixed.
447620 If a request log was generated using an application which dropped the statement for a query before the cursor on that statement was closed, the tracetime.pl Perl script would not have calculated the time for the statement correctly. This has been fixedso that the script now keeps track of statements for which a cursor is open, similar to the change made for sa_get_request_times in Engineering case 445069.
447679 If a primary key or a single column unique constraint was deleted, either from the Indexes folder or from a table's Indexes or Constraints tab, then the table's table editor on its Columns tab wouldn't have been updated automatically to reflect the deleted constraint(s). This has been fixed.
447680 Changing the data type of a column from a data type that was either compressed or maintained blob indexes for large values, to a data type that didn't support either of these options, would have failed when attempting to save the changes to the table.
447753 Interactive SQL could have reported an internal error (NullPointerException) if the database connection was lost immediately after being opened. This has been fixed.
447782 The server could have reported spurious 104904 assertions ("latch count not 0 at end of request"). This would only have happened on multiprocessor machines. A problem with the per-connection counters in question has been corrected.
447913 A blob column's "compressed" or "index" attributes could have been reset to their default values after running an ALTER TABLE "tabname" ALTER "colname" ... statement. The default value for "compressed" is OFF and the default value for "index" is ON. This problem would have occurred only if the ALTER TABLE statement did not specify a COMPRESSED or INDEX clause. The absence of the clause on the ALTER TABLE statement was taken to mean that it should use the default value. This has been corrected.
447935 The SQL preprocessor (sqlpp) could have crashed on certain ALTER statements. This has been fixed.
447937 A change has been made to the server, and client tools, so that the interface identifier suffix on IPv6 addresses are now accepted when specified as part of the HOST network protocol option.

The documentation mentions that the interface identifier is "Windows only", but this no longer applies. Although Linux (kernel 2.6.13 and higher) is the only OS thus far that appears to require that the interface identifier be specified, the option is available on all versions of Unix.

Below are some examples of entering an IPv6 address as the host parameter:

Global scope address, unique everywhere, so no interface index is required

-c "links=tcpip(Host=fd77:55d:59d9:56a:202:55ff:fe76:df19)" // no index required

-c "links=tcpip(Host=fd77:55d:59d9:56a:202:55ff:fe76:df19%2)" // all communication will be done through interface 2

-c "links=tcpip(Host=fd77:55d:59d9:56a:202:55ff:fe76:df19%eth0)" // all communication will be done through eth0

Link scope address, addresses are unique on each interface

-c "links=tcpip(Host=fe80::202:55ff:fe76:df19)" // possibly ambiguous (i.e. this host may exist through both eth0 and eth1)

-c "links=tcpip(Host=fe80::202:55ff:fe76:df19%2)" // not ambiguous because it must use interface 2

-c "links=tcpip(Host=fe80::202:55ff:fe76:df19%eth0)" // not ambiguous because it must use eth0

448074 Repetition of a complex expression, inside and outside a window function argument, could have caused incorrect results for the outside copy. The problem has now been fixed.

Note, that this problem could also have occurred if an implicit cast of a simple expression was repeated both inside and outside a window function.

448083 A query that used both a keyset, and a complex expression involving a window function in the select list, may have crashed or given incorrect results. This is fixed.
448088 A query containing a correlated subquery may have returned incorrect result set if the subquery contained a function whose arguments were aggregate functions and the subquery did not have a GROUP BY clause. For this problem to have occurred, the FROM clause expression must have returned no rows and the access plan for the query computed the subquery as a decorrelated derived table.

For example:

select * from syscolumn c

where

(select Coalesce(sum(t.Count), 0) from systable t

where file_id = 1 and t.table_id = c.table_id) >= 0

This problem has now been corrected

448115 When run on Windows CE, the server could have hung when attempting to display a message if the PostMessage Windows function failed. This has been fixed so that if PostMessage fails, the server will assert but not hang.
448214 If a temporary table containing a compressed column was used in the result set of a stored procedure or batch, the server may have failed assertion 101504 - 'mermory allocation size to large'. This would have been rare, as it would only happen if the size of the compressed data was slightly less than one page. This has been fixed.
448223 A busy server with high CPU usage and hundreds, or thousands, of connections could have occasionally dropped a connection due to a liveness timeout. If this occurred, the liveness timeout would be detected by the client, and a message like "Disconnecting Client - 120 seconds since last contact" would have appeared in the client's logfile, if the logfile connection parameter was used. A change has been made to the server's liveness code so that connections should no longer be dropped in this case.
448234 Under very rare conditions, unpredictable behaviour in TCP/IP connections may have been observed, including all TCP/IP traffic halting. A problem in the TCP/IP networking code that could have caused this behaviour has been fixed.
448247 UltraLite has a restriction that the maximum size of a row for a table cannot exceed 64KB. The maximum size of a row can be roughly computed by adding the number of bytes required for each column. For example, consider the following table:

CREATE TABLE T( id int not null primary key, c1 bigint, c2 varchar(200), c3 binary(10) )

The maximum row size for this table is approximately 222 bytes (4 for id + 8 for c1 + 200 for c2 + 10 for c3 = 222). (Note that internal data structures may add a few bytes to this value). This restriction was not properly enforced, so it was possible to create a table with a row size greater than 64K. Attempting to use this table would have caused the UltraLite application to crash. Now, attempting to create or alter a table that results in a table with a row size greater than 64K will generate an error; -1132 : "Maximun row size exceeeded" (SQLE_MAX_ROW_SIZE_EXCEEDED).

In cases where a database exists with a table already defined to have a maximum row size greater than 64K, UltraLite will no longer allow a connection to this database. This is necessary because the existence of this kind of table could cause database corruption. Unloading the database before applying this fix should allow existing schema and possibly data in other tables to be preserved.

448363 The method SACommandBuilder.UnquoteIdentifier was not supported. Support for this method has now been added.
448391 A simple update statement that modified a small fraction of columns in every row of a large table may have run inefficiently. This inefficiency was more likely to be noticed in temporary non-transactional tables, and has been addressed.
448398 Simple updates with an index hint may not have updated all rows.

For example:

update T with( index( I ) ) set a = a + 1

Would only have updated the first row returned by the index I. The server was bypassing optimization of queries with index hints, even if the index was not unique. Now, updates with index hints are bypassed only if there is a covered unique index.

448405 Auto-starting a database with a connection string that contained the CharSet connection parameter, whose value differed from the OS charset, could have failed. This would have ocurred when a value for the EngineName, DatabaseName, or DatabaseFile parameters did not consist of ASCII characters. If it did succeed, the name of the auto-started server would have been mangled, and connections to it using a connection string that lacked the CharSet parameter, or that had a different value for this parameter, would have subsequently failed.

Note, this problem affected all connections using the iAnywhere JDBC driver, regardless of whether or not the CharSet connection parameter was explicitly specified. This also affected the Java Tools, and actions like, for instance, creating a database from Sybase Central that had a non-ASCII, non-UTF-8 name.

This has been fixed.

448409 When run on Unix systems, if the server had insufficiently low system resources to successfully spawn a new process, connections may have hung after attempting to execute the xp_cmdshell() system procedure. This has been fixed by having the server ensure that the fork succeeded before proceeding.
448425 Table relationships were not being added in DataSets generated by Visual Studio 2005. This has now been corrected.
448489 A DESCRIBE of a statement may have returned a syntax error if the SELECT statement contained tables that had CHECK constraints, or articles with WHERE/SUBSCRIBE BY clauses. For this to have occurred the very next operation after PREPARE was an OPEN of a read-only cursor, and the statement described was executed after opening the cursor. This has been fixed.
448491 The Language Selection utility dblang.exe now works without having to have administrator privilege. The SQL Anywhere installer creates language settings that are stored in HKEY_LOCAL_MACHINE in the Windows registry. Without Windows administrator privilege, these registry settings cannot be modified. Thus users had to login as administrator to change language settings for localized versions of SQL Anywhere. The Language Selection utility has been changed so that when it is used to change langauge settings, it will create an entry, or update an existing one, in HKEY_CURRENT_USER in the Windows registry.
448493 There was really no way of forcing the server to quote identifiers when attempting to execute a remote query that contained identifiers that needed to be quoted. The quoting of idetifiers by the server is based on specific rules within the Remote Data Access framework. This has now been enhanced to do a better job of quoting identifiers for certain classes of remote servers. In particular, the new more simplified, and more accurate rules, for quoting identifiers are:

- For SA, ASE, and MS SQL Server, the quoted_identifier option is now turned on by default at connect time and identifiers are always quoted.

- For Oracle, identifiers can always be quoted, so the server now always quotes identifiers in SQL generated for Oracle.

- For DB2 and generic ODBC remote servers, the old rules for quoting identifiers still apply. That is, quoting of identifiers is done based on whether or not the identifier contains special characters that require quoting.

448501 The event viewer could have contained informational messages like "Service not able to access Desktop" or "Service able to access Desktop". These messages were the result of normal server startup. They are no longer generated by the starting of a service for a server.
448506 When SQL Remote for ASA/SA was the only feature selected for installation, the installer was failing to include certain files (dbtools*.dll, dblib*.dll, dblg*.dll) required for standalone operation. This has been fixed so that these files are now installed.
448549 It was possible that an attempt by an UltraLite application to connect to the UltraLite engine could have caused the application to enter an infinite loop. When an UltraLite application disconnected from an auto-started engine, causing the engine to auto-stop, the UltraLite client code did not fully clean up its shared memory connection. Subsequent connection attempts would have caused the application to enter the infinite loop trying to auto-start the engine again. This has been fixed by having the UltraLite client clean up its shared memory connection.
448637 If the MobiLink server could not find the Java native library mljstrm10, it would have failed with not very helpful errors in the server log. This has been fixed. Now, it displays an error dialog as originally intended, and logs other useful information to the server log.
448659 When the Sybase Central MobiLink plug-in was in Model mode, creating a new remote database from a consolidated database with table's having LONG NVARCHAR columns, would have resulted in those columns being LONG BINARY in the remote. This has been fixed. Such columns will now be LONG NVARCHAR in the remote.
448677 When the server was running with the TCP/IP network protocol enabled and no database running, or in the brief time between starting the server and starting the database, if a broadcast was received looking for a specific database name, the server could have crashed. This has been fixed.
448735 Prior to 10.0.0, the EUC_TAIWAIN database collation used a character set that was labeled "eucb5", which appeared to be distinct from the cp950 character set used by the 950ZHO_TW collation; however, internally they were the very same character set (Windows cp950 / "Big5"). Also, the character set encoding definition in the EUC_TAIWAN collation matched neither Big5 nor the real EUC-TW character set (which Unilib in 9.x and earlier did not support).

In 10.0.0, the server now uses ICU and the character set "eucb5" used by the EUC_TAIWAN collation ended up using the "ibm-950_P110-1999" ICU character set which was distinct from (but close to) the ICU character set "windows-950-2000" used by the SQL Anywhere character set label "Big5" used by 950ZHO_TW.

The EUC_TAIWAIN collation now uses the EUC-TW character set and has had its character encoding specification corrected. EUC_TAIWAN databases created with 10.0.0 will continue to use the "eucb5" label for their character set; however, "eucb5" now maps to the windows-950-2000 ICU converter.

Although the EUC-TW character set was defined as "known by SQL Anywhere" (a client connection could request it, for example), the conversion tables for it were not shipped in the ICU dataset. Adding the EUC-TW conversion tables to ICU was the only part of this change made to 10.0.0.

448751 Updating a DataTable using DataAdapter and CommandBuilder could have caused the exception DBConcurrencyException.

Example:

AsaDataAdapter adapter = new AsaDataAdapter( "SELECT * FROM mytable", conn );

DataTable table = new DataTable();

adapter.Fill( table );

table.Rows[ 0 ][ 1 ] = "ABCDEFG";

AsaCommandBuilder cb = new AsaCommandBuilder( adapter );

adapter.Update( table );

This problem has been fixed.

448758 The description for files with .QAA extensions, that appeared in file browsers used by the QAnywhere plug-in, would have been "QAnywhere Agent Command Files". This has been corrected to be "Qanywhere Agent Configuration Files".
448759 The TDS DATE and TDS TIME datatypes were recently introduced into TDS clients. As a result, applications that use Open Client 15 or newer versions/ebfs of jConnect are now able to fetch date and time columns as TDS DATE or TDS TIME values instead of TDS DATETIME. Unfortunately, Open Client and jConnect applications wishing to fetch date and time columns as TDS DATE and TDS TIME could not do so when connected to SA servers. The server has now been enhanced so that TDS based applications can now fetch date and time data as TDS DATE and TDS TIME values if they so wish. Applications that use an older version of Open Client or jConnect will continue to fetch date and time data as TDS DATETIME.

Note that non-TDS based applications (i.e. applications that use ESQL, ODBC or the iAnywhere JDBC Driver) have always been able to fetch date and time data as DATE and TIME values.

448760 Several improvements have been made for Palm HotSync reliability and VFS performance as follows:

- Devices with a sufficiently large heap (RAM) now use a RAM-based cache for VFS file access instead of a storage heap-based cache.

- A fix has been made to prevent a progress mismatch with MobiLink, if a reset was done at the right moment during a HotSync.

- A fix has also been made to resolve the problem where the HotSync conduit could have referenced freed memory (likely causing a crash), if the record database on the device was corrupt (missing pages), but caused no I/O errors.

448819 If an ORDER BY expression contained an IN predicate that matched an expression in the SELECT list, it would have been treated as though there were no matching expression in the SELECT list, resulting is an error.

For example, the following query (run on asademo.db):

select case when name in ('syscolumns') then name else 'OTHERS' end

from sysobjects

group by case when name in ('syscolumns') then name else 'OTHERS' end

order by case when name in ('syscolumns') then name else 'OTHERS' end

would have failed with the error "Function or column reference to 'name' in the ORDER BY clause is invalid". This problem has been fixed.

448821 Application of an EBF or Patch to a non-English system, could have caused the Network Server and/or MobiLink Server licenses to become corrupted. This has been fixed.
448824 If an index entry for a row wasn't fully hashed, deleting the row might not have reclaimed the space for the row. Fully reorganizing a table could have increased the space allocated for the table by more than a factor of 30. This has now been fixed.
448828 If a non-DBA user created a view referencing a system table and granted SELECT permission on the view to another user, then that other user could not have selected from the view with a permission denied error. This was due to the non-DBA user not having SELECT permission on the system table WITH GRANT OPTION. The system table referenced could have been the SYS.DUMMY table referenced implicitly. This has now been fixed. A workaround would be to explicitly grant SELECT permission WITH GRANT OPTION on the system table to the view creator.
448832 Opening the Trigger wizard from the Triggers folder would have listed all tables, including proxy tables. This has been corrected so that proxy tables are now excluded, since a trigger on a proxy table will never execute.
448834 There is code in ulglobal.h that checks that the CE version is at least 3.0:

#if defined(UNDER_CE) && UNDER_CE < 300

#error "UltraLite applications for Windows CE must target Windows CE 3.0 or later"

#endif

Embedded Visual C++ 3.0 and 4.0 automatically defined UNDER_CE to be 300 and 420, respectively, but, unfortunately, Visual Studio 2005 defines UNDER_CE, but does not set it to the CE version, which was causing this check to fail. The workaround is to change the default settings in VS 2005 so that UNDER_CE is defined to $(CEVER).

This has been fixed by removing the check, so that the default settings of Visual Studio 2005 will work. For 10.0.1 and later, ulglobal.h will check that _WIN32_WCE is at least 300. Embedded Visual C++ 3.0 and 4.0 and Visual Studio 2005 all define _WIN32_WCE to the CE version by default.

448835 The method ULDataReader.HasRows, HasRows is part of the ADO.NET 2.0 specification, was performing poorly on large result sets. This has been fixed.
448836 The Foreign Key wizard was allowing attempts to create a foreign key between a base table and a global temporary table. This would always have failed, as tables related by a foreign key constraint must both be base tables, or both be global temporary tables without the ON COMMIT DELETE ROWS clause. This has been corrected so that the Foreign Key wizard now prohibits attempting to create a foreign key that is not meet the above criteria.
448910 If two servers running on the same Unix machine attempt to use the same alternate server name for a database, and either server had not started the TCP/IP network protocol, the databases on both servers will start successfully, but the alternate server name will not work for either database. This has been fixed, the second database will now fail to start

with a "Server name already in use" error.

Note, if both servers were running the TCP/IP network protocol, which is the default, the error was correctly detected.

448915 If a query contained two or more IN predicates that contained the same number of elements, but one list contained duplicate entries and all the entries in the list with duplicates were present in the other lists, then the query could have returned incorrect results or fail to give an error when an error should have occurred. For example, consider the following query, run against demo.db:

select count(*),

case when DepartmentName in ('R & D', 'R & D') then

DepartmentName

else

'Others'

end

from Departments

group by case when DepartmentName in ('R & D', 'Sales') then

DepartmentName

else

'Others'

end

The query would have returned results as though both IN lists were ('R & D', 'Sales'). This has been fixed so that now the query correctly returns the error -149: "Function or column reference to 'DepartmentName' must also appear in a GROUP BY"

449016 Explicitly dropping a database connection that was used within an HTTP session context, could have caused the server to crash, if the connection was actively in use by an HTTP request. The session was being immediately deleted when the database connection was dropped. Now a cancel is issued to the request, then when it terminates, the session is deleted and the connection closed.
449041 When rebuilding a database using an external unload/reload (i.e., the -xx option in dbunload, or the equivalent settings in Sybase Central), NCHAR data could potentially have been subject to "lossy" character set conversion operations. This would have resulted in incorrect NCHAR values in the rebuilt database. For this to have occurred, the NCHAR data must have contained characters that had no counterpart in the host operating system's) character set. This has now been fixed.

A workaround for this problem is to specify "charset=utf-8" on the unload and reload connection parameters.

This has been fixed.

449146 A query containing a subquery that made use of an aggregate function and had an outer reference, could have returned an incorrect result.

For example, the following query that should have returned several rows, would have returned at most one row:

SELECT t1.w FROM T t1 WHERE t1.x IN (SELECT max(t2.z) FROM T t2 WHERE t2.id = t1.id)

This has been fixed.

449161 If the pattern of a LIKE predicate does not begin with a wildcard character (e.g., x LIKE 'abc%'), then an optimization is used that allows an index to be used to filter rows based on the LIKE prefix. If the indexed column was created descending, the wrong answer could have been returned. This is now corrected.
449193 Duplicate variable declarations in Transact-SQL procedures were not detected as syntax errors when the procedure was created. They would then have caused spurious syntax errors during procedure execution. This has been fixed.
449309 Enhancements were made to the MobiLink Server to allow for future support of currently non-supported consolidated databases.
449317 When run on Unix systems, applications attempting to connect will fail, if "clientport" was specified in the tcpip options of the connection string. The client software was binding a UDP socket to both an IPv4 address and an IPv6 address, using the same port.

This cannot be done on UNIX systems unless the socket option SO_REUSEADDR is specified, which was not being done. This has been corrected.

449395 When using the MobiLink .NET Direct Row API, it was not possible to set the value of a column in the IDBCommand returned by the GetDeleteCommand method to NULL. This prevented passing a truncate table command down to the remote database using the download_delete_cursor. This problem has now been fixed, and a NULL value can now be used.
449401 Character data could have been incorrectly reloaded when rebuilding a database containing at least one table with NCHAR columns, and when doing an unload/reload other than with the -an or -ar command line options specified. In these cases, the data could have been subject to unwanted character set conversions, resulting in incorrect values being loaded into the rebuilt database. This has been fixed. A workaround for this problem is to specify "charset=utf-8" on the unload and reload connection parameters.
449411 It was possible that the SQL error STRING_RIGHT_TRUNCATION could have been raised when it should not have been. This was more likely to have occurred when the declared byte length of a character column was near, or greater than one database page in size, and when the value being inserted (or updated) was longer than the declared column length, but only space characters would have been right-truncated in the insertion. If the truncated characters consisted only of spaces then the error should not have been raised. This has been fixed.
449416 A connection attempt may have failed, or hang, if the HOST connection parameter was an IPv4 address, and the initial connection attempt to the host failed for some reason, resulting in a search for the server. The server must also have been listening on an IPv6 interface with the client having IPv6 enabled, and the response to the server search that the client received must have come from that IPv6 interface. In other words, the client would have proceeded to connect to an IPv6 address after first trying an IPv4 address.

This has now been fixed.

449439 Depending on the device and the mechanisms used, UUIDs are guaranteed or are extremely likely to be unique. In the case where there was no host address available, duplicate UUIDs were possible, because the node id was generated randomly. The quality of the random number used for the node id has now been improved for Windows CE, thus making duplicates far less likely.
449459 If ULTransaction.Commit() failed (for example due to a referencial integraty error), and the then ULTransaction.Rollback() was called, Rollback() would have failed to report that the transaction had already completed. This has now been corrected so that Commit() will only mark the transaction as completed if there were no errors. A work-around is to close the connection and then re-open it. A side-effect of this will be that all prepared statements will be invalidated.
449506 Attempting to execute an INSERT ... SELECT, that did not fill columns defined with default timestamp, may have caused the assertion failure "Attempting to store invalid timestamp value in table ...". This occurred when the database option Truncate_timestamp_values was set to ON, and the value for the database option Default_timestamp_increment was greater then 1. This has been fixed.
449533 When a server received an HTTP request that was subsequently canceled, it may have occasionally leaked memory. This would have been very rare, as the cancel had to occur within a very small period of time. This has been fixed.
449536 Calling the html_decode() function could have caused the server to crash. This has been fixed.
449543 Some characters that should be considered as whitespace, such as U+00A0 (no-break space), where not being treated as whitespace by the server. The problem applies to all collations, but has been fixed only in the UCA collations. Legacy collations have not changed.

Note that a new dbicu10.dll is required for this fix.

449554 When starting a server with the network protocol option myip=::xxx.xxx.xxx.xxx%n, an invalid address error would have been displayed, and the server would have exited. This address is an IPv4 address embedded in an IPv6 address. IPv6 addresses accept a %n at the end, but IPv4 addresses do not. The server now truncates the IPv4 address at the %, so that the address is no longer rejected.
449577 On Unix systems, an auto-started server that had shut down would have remained a zombie until the parent process exited. This has been fixed by doing a double fork when spawning the server, in order to ensure all parent-child relationships are erased when it is shutdown.
449590 If a date parameter value (a value of type adDate) was inserted into a column, only the year and month were inserted correctly. The day was always 1.

A Visual Basic example:

cmd.CommandText = "INSERT INTO DateTable(cDate) values (?)"

cmd.CommandType = ADODB.CommandTypeEnum.adCmdUnknown

parm = cmd.CreateParameter("inDate", ADODB.DataTypeEnum.adDate, ADODB.ParameterDirectionEnum.adParamInput)

cmd.Parameters.Append(parm)

parm.Value = "2006-12-15"

cmd.Execute()

The value inserted would have been "2006-12-01".

This problem has been corrected, so that the correct date is now inserted.

449600 If an UNLOAD <select> statement was executed with the clauses FORMAT ASCII, QUOTES OFF and DELIMITED BY '' (empty delimiter string), the server could have gone into an infinite loop. The code was missing the case of an empty delimiter string, this has now been corrected.
449670 An application using the .NET Row Api could receive the error "Unable to find an entry point named native_GetColCSTimestampStruct in DLL mldnet10.dll". This has been fixed.
449676 It was possible for the MobiLink Server to have reported that a synchronization had failed with no apparent error. The failure would happen after performing the user authentication , even though the authentication had been successful. The problem was a result of the size of the synchronization stream, so making almost any change at the remote database would change the size of the synchronization stream, causing the problem to disappear. This problem has now been fixed.
449758 The system function html_decode() now decodes more Unicode codepoints given as numeric entities, for example, ÿ. When a Unicode codepoint is specified (for example, ™ for the trademark symbol), the value is converted to a character. If an invalid codepoint is specified, or the codepoint cannot be represented in the database character set, the server will output the codepoint unchanged (still in its &#x form). Previously, codepoints less than 0x7F were converted to characters (for some character sets, codepoints less than 0xFF were converted to characters), and all other codepoints remained in their codepoint form.
449763 There was apossibility, although remote, that the MobiLink server may have crashed when using named columns if the type field was null, which is the default.
449783 Some of the utilities, dbunload, dbtran and dbmlsync were not always honouring the SATMP (version 10.0.0), or the ASTMP (versions prior to 10.0.0) environment variable, when determining a location to store temporary files. When that happened, all the other steps in deciding the temporary directory location were as documented. This has been fixed.
449874 The dbisqlc utility may have terminated abnormally immediately on startup. This problem occurs occasionally. A problem in the GUI initialization code has been fixed.
449881 If the table names specified in the Unload utility's -t and -e command-line options (or the equivalent Sybase Central settings) were provided in a character set other than the database character set, the tables may not have been unloaded (or excluded, in the case of -e). This problem would commonly have occurred when the OS charset and database charset were different, and characters in the table names required conversion. This has been fixed.
449882 Rebuilding of a version 10.0 database, with a UCA CHAR collation, may have failed. In cases where the rebuild completes without failure, other collation related problems could, and likely would, have arisen later on, such as incorrect sorts or sortkey generation. This problem could only have occurred when the -an or -ar dbunload command line options (or the Sybase Central equivalent settings) were used. A work-around is to initialize the new database manually, specifying '-z UCA' (if using dbinit), and then using the -ac dbunload command line option to reload into the new database.

This has been fixed.

449887 If while starting up as a Windows service, the server received a stop request from the Stop Server utility, the server may have crashed. This has been fixed.
449917 If an application called the ODBC function SQLSetConnectAttrW() with a string argument, there was a chance that the application would have crashed. This problem has now been fixed.
449974 The server may have crashed, or failed an assertion with an "Out of memory" error, when receiving Unichar data over a TDS connection (e.g., using jConnect). This has now been fixed.
450088 On Unix systems, if a pre-version 10.0 database was reloaded internally that had several dbspaces that were not all present in the current directory, the reload would have hung. This has been fixed. The reload operation will now be aborted and the message "Dbspace for table '<tablename>' not found" will be displayed, as is already the case for version 10.0 to version 10.0 database reloads.
450098 When run in very low memory conditions, which in practice would likely be extremely rare, the Unload utility could have crashed when building indexes. This has been fixed.
450135 Reorganizing an index could have caused the server to fail an assertion, or to have crashed. This was unlikely to occur unless the server was heavily loaded. This has now been fixed.
450195 A SQL Anywhere web client procedure connecting to a non HTTP endpoint, may have caused the server to crash, or to have failed silently with no error message. This has been corrected so that the client will now generate the error: "Invalid response from the HTTP server"
450232 Following a DML statement that caused a statement-level trigger to fire, the value of the Transact-SQL global variable @@rowcount could have been incorrect . Also, if a DML statement caused multiple statement-level triggers to fire, the value of @@rowcount could have been incorrect in some of the triggers. These problems have been fixed so that the value of @@rowcount now correctly holds the number of rows affected by a DML operation when the operation (along with any triggers) completes. Also, at the beginning of any statement-level triggers, @@rowcount holds the number of rows affected by the statement that caused the trigger to fire.
450247 For tables having unsigned bigint columns defined with "default global autoincrement", a LOAD TABLE statement would not have correctly set the next available value for the column. This could occur, for example, when rebuilding a database using DBUNLOAD. This has been fixed.
450259 When executing a statement that runs for a long time ( for example, "waitfor delay '20:00:00'" ), the application could have crash if the server had gone down. This problem has been fixed.
450346 Attempting to connect to a database using a filename specified in a different case than that actually stored on the filesystem, could have caused the following exception when the tables folder was opened:

java.lang.NumberFormatException: null

at java.lang.Integer.parseInt(Unknown Source)

at java.lang.Integer.valueOf(Unknown Source)

at ianywhere.ultralite.Index.<init>(Index.java:122)

at ianywhere.ultralite.Table._loadPrimaryKey(Table.java:481)

...

For example, attempting to connect to the database "application.udb" using the name "Application.udb", would have caused the problem to occur. This has been fixed.

The workaround is to specify the filename (directories do not need to match case) in the same case as the file was stored on disk.

450353 The MobiLink client would gradually have consumed more and more memory when synchronizing tables that contained foreign keys that refer to other tables that were not being synchronized. This has been corrected.
450354 If a view was disabled, and there were previously generated objects, such as cursors and prepared statements, that referred to the view being disabled, then future references to these objects could have caused the server to behave erratically, including crashing. The server will now properly deal with cached objects that refer to views that are disabled after the creation of the referencing objects.
450355 When a table or view is altered, the server finds all cursors (including those created internally for DESCRIBE) that refer to the table or view being altered and automatically closes them. Under some circumstances, the server would have failed to close all such cursors, causing subsequent references to these cursors to behave unpredictably. The results could have ranged from no impact, to a server crash. This problem was likely to happen when the table being altered had previously been used in a cursor, and the reference was eliminated internally by the optimizer as being redundant. For views, the problem could have arisen when the view was flattened by the optimizer, and references to it were removed from the query that was optimized and executed. This has been fixed so that the server now correctly finds and closes all the cursors.
450500 When deploying a synchronization model that creates a new database and deployed to file, the batch file to create the database would always have used "remote.db" (or "remote.udb" for UltraLite) for the database file name. The name specified in the wizard was ignored if a remote database was also directly created. Thus recreating the remote from the batch file and attempted to sync would have failed, since the database names were different. Now the batch file will create a remote database file with the same name as was used if deployment directly created the database. If only deploying to file, then the default database file name, <model_name>_remote.<ext>, will be used, which is the same default as the wizard uses for direct creation.
451339 After running dbisqlc on Unix in a gnome-terminal, the terminal may no longer have behaved

correctly. Specifically, when input reached the end of a line, it would have wrapper over itself, instead of continuing on the next line. During initialization, wrapping was disabled on the terminal, and was not re-enabled on exit. This is now fixed by re-enabling wrapping on exit.

451343 A malformed multipart form-data HTTP request may have caused the server to crash. This has been fixed.
451374 When an SD memory card holding a running UltraLite database is removed, the runtime will return an I/O error (SQLE_DEVICE_IO_FAILED). This error is a critical error, meaning that all subsequent calls into the runtime should immediately return this same error until all connections to the database have shutdown and the database is restarted. Unfortunately, this error was not being marked as critical, so it was lost on the next call into the runtime, and the runtime would have crashed the next time it tried to read from, or write to, the database, due to an invalid file handle. This has been fixed.

Further testing revealed that some runtime entry points did not handle other critical errors correctly, and would have caused the runtime to crash if a critical error had been signalled in a earlier call. These have been fixed as well.

451463 When running on Windows Vista, performing operations that require administrative privileges will cause a Windows Vista Elevation Consent (or Credentials) prompt to be displayed. The application name shown in the prompt will be "dbelevate". In order for the operation to succeed, the user must provide consent or provide administrative credentials.

Some self-registering DLLs require administrative privileges to register or unregister themselves. During a normal installation, the installer runs in an elevated state and a prompt for dbelevate will not be seen; however, if regsvr32 is used directly, the prompt may be seen. The SQL Anywhere OLE DBV provider, SAOLEDB, is Vista-aware and may request elevation when installed or uninstalled.

451472 The MobiLink server may have crashed when using multiple synchronization streams, or the clients were using HTTP non-persistent. This problem would have been seen more quickly if using the -nc switch (set maximun number of network connections) with a small number. No workaround is available. While not eliminated, the probability of this problem occurring has been reduced.
451486 If an application using the iAnywhere JDBC driver fetched a result set with more than one column, and one of the columns was a blob column, then calling ResultSet.wasNull() after calling ResultSet.getBlob() would not always have indicated the correct 'nullness' of the the blob value that was just fetched. The driver was not properly setting the null bit for blob columns, so calling ResultSet.wasNull() after fetching a blob column would have actually returned the null bit of the previous column fetched. This problem has been fixed.
451551 The property sheet for a non-materialized view would not have displayed the view's status (valid, invalid or disabled). This has been fixed.
451555 The QAnywhere agent was not setting the store property ias_Network.Adapter correctly when the device is on ActiveSync. This has been fixed so that ias_Network.Adapter is now set to 'RndisFn1' when the device is on ActiveSync.

Note that the Remote-NDIS Host "IP address" and "Default gateway" properties must be configured on the Windows CE device in order for name resolution to work properly when connected on ActiveSync.

451563 An UltraLite application could have produced incorrect results for queries that involved non-trivial ORDER BY expressions when the query did not have the FOR READ ONLY clause. This has been fixed. A work-around is to add the FOR READ ONLY clause, if possible.
451573 The changes for Engineering case 422775 may have caused the server to use sequential scans when executing a SELECT statement over a large table, even when a much more efficient access method using a clustered index scan was available. The problem was more likely to be noticeable when the table was fairly large, most of the table was not in cache, and the scan returned a fairly large number of rows. The earlier fix caused the server to over estimate the cost of partial index scans with a cold cache. This has now been corrected.
451587 If a database had an associated mirror log, and an attempt was made to truncate both the main transaction log and the mirror log using the BACKUP DATABASE statement with the TRANSACTION LOG TRUNCATE clause, the server would have failed assertion 100915 and would not have deleted the mirror log file. The same situation would have occurred if dbbackup was used with "-s -x" on the same database, as this causes the BACKUP DATABASE statement to be executed on the server. This has been fixed. A workaround is to use dbbackup without the "-s" option.
451631 A check has been added to detect some page header corruption which could have lead to unpredictable behaviour. This check operates independent of the whether page checksums are enabled. As with page checksums, a fatal error is now signaled if corruption is detected.
451693 When the plug-in is in Model mode, creating a new remote database from a Microsoft SQL Server consolidated database, with tables having NTEXT columns, would have resulted in those columns being created as LONG BINARY cloumns in the remote. This has been fixed so that such columns will now be created as LONG NVARCHAR columns.
451699 The change for Engineering case 444112, could have caused a database mirroring server to crash if it attempted to connect to another mirror server, and the attempt failed. This has now been fixed.
451706 In the SQL Anywhere Console utility, some database properties selected from the Property Viewer (File->Options->Property Viewer) would not have been displayed. This problem has been fixed.
451712 If an application using JAVA in the database called a Java method that had an OUT or an INOUT binary parameter, the call would have failed to return the proper value for the binary output parameter. The new JAVA in the db support was not properly handling [[B arguments in the method signature. This problem has been fixed.
451730 The method SAConnection.BeginTransaction() could have failed with a "Resource governor 'prepared statement' limit exceeded" exception, if there were many undisposed commands.

Here's an example:

using ( SAConnection conn = new SAConnection( "DSN=SQL Anywhere 10 Demo;UID=dba;PWD=sql" ) )

{

conn.Open();

for ( int i = 0; i < 1000; i++ )

{

SATransaction trans = conn.BeginTransaction();

SACommand cmd = new SACommand( "", conn, trans );

cmd.CommandText = string.Format( "INSERT INTO MyTable( id ) VALUES( {0} )", i );

cmd.ExecuteNonQuery();

trans.Commit();

}

}

The SAConnection.BeginTransaction method executes a SQL command to begin a new transaction, but it was not checking if the number of existing prepared statements had already exceeded the limit before executing the SQL. This has been fixed.

451811 For a synchronized consolidated table T, if delete tracking via shadow table and download timestamp via column were enabled, then deployment would have created a trigger called T_del_del that would have added a row to the delete shadow table T_del when the row was deleted from T. If the download timestamp was changed to use a shadow table, then deployment would have created a trigger called T_mod_del that would also have added deleted rows to the shadow table. If both these triggers existed, then deleting a row would have caused an error as both triggers would have attempted to insert the same row into the shadow table. This has now been fixed so that the delete trigger is called T_del if any shadow tables are used, so conflicting triggers are prevented. Similarly the triggers T_del_ins and T_mod_ins are now called T_ins, and T_mod_upd is now called T_upd.
451827 When generating DataSets in Visual Studio 2005, table relationships were not added for multi-column foreign keys. This problem has been fixed.
451863 When run on a machine other than the server's machine, the Log Translation utility (dbtran) would have failed with the error:

Cannot open transaction log directory "<log directory name>"

if the -c option was used to obtain the transaction log contents from a running server, and the log file included a path specification but the specified directory did not exist on the machine where dbtran was invoked. This has been fixed.

451870 If a cursor was opened requesting SENSITIVE semantics and the query for the cursor was sufficiently simple to bypass optimization and the cursor was opened on the statement without an intervening DESCRIBE, then prefetching could have been incorrectly enabled for that statement, possibly leading to stale results. This has been fixed.
451941 When executing a stored procedure that used a string input parameter with a length exceeding 30 bytes (15 wide characters), the OLE DB provider would have overrun a buffer and a run-time error would have resulted. This problem has been fixed.
451959 The server could have crashed, and the database could have become corrupted, if the database included multiple dbspaces and the files were also encrypted. This has been fixed.
452021 In the Table Mapping editor, if a table mapping was selected with a Download Subset setting of "User" or "Remote", then the "Column name:" could not be changed on the Download Subset tab. This has been fixed.
452041 When setting a dynamic trap on the rdbmsDbLimitedResourceTable in the RDBMS MIB, the trap would only have fired if a standard query for the same OID was received after the condition was satisfied. If such a query was not received, the dynamic trap would never be

sent. This has been fixed.

452098 The UltraLite Unload Database to XML utility (ulunload), when used on a database with a security certificate, would have resulted in XML output that did not include the security certificate. Ulunload was accessing an old system table for the security certificate. Certificates are now stored in SYSULDATA, within a row with the name "SyncCertificates".

Note that creating and using databases with security certificates worked, and the certificate was properly used. The problem was in unloading such a database and then reloading it, the certificate would have been lost. As a workaround, the certificate can be re-added from the original certificate file using the -t option to the UltraLite Load XML to Database utility (ulload), as in:

ulload -t <CertificateFile> -c dbf=newDB.udb saved.xml

452110 If an application used the iAnywhere JDBC driver to connect to an Oracle database with a multi-byte charset using the DataDirect Oracle 5.1 ODBC driver, and then attempted to fetch a long varchar column that had multi-byte data, there was a chance that the fetch would have failed with a conversion or translation error. This problem is actually a bug in the DataDirect Oracle 5.1 ODBC driver but a workaround has now been implemented in the iAnywhere JDBC driver.
452119 When creating a new UltraLite database, if the specified trusted root certificates file could not have been opened, no error was reported and a new database was successfully created without any trusted root certificates. Any future attempt to synchronize over TLS or HTTPS would have failed with stream error 207 (STREAM_ERROR_SECURE_NO_TRUSTED_ROOTS). This has been fixed so that now if the trusted roots certificate file cannot be opened, an error will be reported immediately and no database will be created.
452126 The Certificate Generation utility (gencert) cannot handle certificates with an expiry date beyond January 2038. However, if a validity interval was specified that put the expiry date beyond this, gencert would have created an invalid certificate without reporting an error. This has been fixed so that an interval is specified beyond January 1, 2038, gencert will now reduce the expiry to this date.
452220 In some rare cases mostly associated with truncated or malformed characters, some character set conversions could produce incorrect converted characters. For example, if a truncated character existed at the end of a source string, a substitution character might not be generated in the converted string. The problem was more likely to occur if ICU was not installed. It has now been corrected.
452225 Attempting to execute a query that references a proxy table with an invalid dotted reference (eg. select c1, p1.c2.foo() from proxy_t p1), would very likely have caused the server to crash. The crash for an invalid dotted reference has now been fixed.

Note that using a valid dotted reference like "select c1, u.f() from proxy_t", where f was a user-defined function owned by user u, would have worked, and will still work.

452230 The server would have crashed when using a keyset cursor if it was started with the -b command line option ("run in bulk operations mode"). This has been fixed.
452237 If the SA GUI installer for MacOS crashed, or is otherwise uncleanly terminated, the machine may have become slow to respond, consuming close to 100% CPU. The GUI installer for MacOS communicates with the setup script through a special "interactive" mode. When the GUI is cleanly terminated, it sends an "exit" command to the setup script and both sides exit. If the GUI is not cleanly terminated, the setup script receives an error, which leads to the script entering an infinite read loop. This has now been fixed by properly handling this error state.
452285 A request for the database property, "FreePages" (e.g., select db_property('FreePages')), could have caused the server to fail assertion 101412 - "Page number on page does not match page requested", if the database file was currently in the process of being grown. This would likely have been a very rare occurence, and has been fixed.
452305 The SQL statement given by the ODBC InitString parameter may not have been executed, depending on the statement, which including some CALL statements. This has been fixed.
452329 The server may have crashed while processing a highly recursive query. This has been fixed so that the error "syntactic limit reached" will now be returned in such a situation.
452414 When setting dynamic traps for the SNMP Extension agent, the modifiers 'K', 'M', 'G',

or 'T' can now be used to specify numeric values. For example, you can set a

dynamic trap to fire if the current cache size exceeds 200 MB using:

Trap1=1.3.6.1.4.1.897.2.1.1.11.1 > 200M

Note, the modifiers are case insensitive.

452418 When using the iAnywhere Solutions 10 Oracle WP driver (version 5.10.00.124) to insert Unicode characters of surrogate pairs 0xD800 )xDF40 into a NCHAR column, the driver only inserts the first two charactors correctly, the rest data would have been corrupted as:

0xD800 )x2020 0x2020 ...

This problem has now been corrected.

452509 UltraLite could have produced incorrect results with queries that involved a derived table containing a GROUP BY clause, if there was an outer reference in an expression within that derived table. This has been fixed, but a work-around would be to add an OPTION (FORCE ORDER) clause to the query.
452515 Use of the "expr AS name" syntax in an argument to the functions XMLATTRIBUTES(), XMLFOREST(), or XMLGEN(), inside a CALL statement argument, could have caused the server to crash. This problem has now been fixed.

A workaround is to use "select * from proc()" rather than "call proc", or to evaluate the expression into a variable before passing it as a call argument.

452516 The status history entries in the History tab of the Message Properties dialog were incorrect for the QAnywhere client message store.

(1) The originator of a message did not see a 'received' status for a message that was received and acknowledged by another client,

(2) When a message arrived at a destination, the transmission status was not set to 'transmitted', so the status history did not show that the message was 'transmitted',

(3) The transmission status for system messages (push notifications and network status notifications) was not set to 'local', instead it was set to 'untransmitted',

(4) The transmission status for a message sent to a queue in the same message store was not set to 'local', instead it was set to 'untransmitted'.

These problems have now been corrected.

452538 If the Mobilink server was communicating with a client when a network disruption occurred, all network I/O could have paused for up to 2 minutes. This has been fixed.
452542 If page corruption was detected (usually via page checksums), UltraLite would have failed an assertion, stopping the database process. Page corruption exceptions are now signaled as SQL errors (SQLE_DEVICE_ERROR), which persist until the database is restarted. The database must be shut down following this error.
452628 Exceeding the maximum task limit by executing too many concurrent web client HTTP procedure calls was not detected. This may have resulted in calls unexpectedly hanging. This has now been fixed. When a thread of execution has detected that it has exceeded the task limit, it will now issue a -306 "Deadloack detected" error. This indicates that the last available non-waiting TASK thread had attempted to wait on a synchronization event.

A work around is to increase the task limit (number of TASK threads) using the -gn option.

452629 When a database uses blank-padded comparison semantics (dbinit 朾 or CREATE DATABASE � BLANK PADDING ON), some queries could have returned incorrect results or indexes on string columns could have been corrupt. Validating the database would have identified which table and index were corrupt. Only strings containing a sequence of two or more non-trailing space characters (慭x20�) were handled incorrectly.

After this fix is applied, it is possible that indexes that were valid previously could now be considered corrupt. Running dbvalid will identify which indexes are corrupt and should be rebuilt. If the corruption is in a system index, it may be necessary to unload the database with older software, and reload it with a version with this fix.

452632 When data is sent from the client to the MobiLink server and then to the consolidated database, and vice versa, character data is translated to allow the server to deal with the possibility of the two ends using a different character set. If some characters to be translated are invalid, the translator cannot process them, but the MobiLink server was not detecting this. This has been fixed. The MobiLink server now checks for characters that have failed the translation process.
452638 QAnywhere makes extensive use of the JRE, so the MobiLink server when run with the QAnywhere messaging option (-- m), may have encountered instabilities in the JRE under heavy load and low memory conditions. To address this the JRE has now been updated. This update contains fixes that significantly improve the stability of the JRE when running under these conditions.
452650 Instabilities in the Java VM may have been encountered when the MobiLink server was running under heavy load and low memory conditions, and executinging Java synchronization scripts. To address this the JRE has now been updated. This update to the JRE contains fixes that significantly improve the stability of the JRE when running under these conditions.
452652 The ICU modules (dbicu10.dll and dbicudt10.dll) were not installed if the Network database client was the only feature selected for installation. This has been fixed.
452657 Some inputs to the UNISTR() function could lead to incorrect results or server behaviour. For example, the result of the following was incorrect:

select unistr( repeat( 'x', 1018 ) || '\u0041' )

The result should be identical to:

select repeat( 'x', 1018 ) || unistr( '\u0041' )

Instead, it was equal to repeat( 'x', 1018 ) || '\u0041'. This problem has been fixed.

452660 Non-deterministic functions should not be shared in a query, even if they have the identical arguments. However, a query such as:

SELECT RAND() a, RAND() b

would have incorrectly returned the same result for both a and b. This has been fixed.

Note, this problem did not affect non-deterministic user-defined functions.

As well, non-deterministic functions were being eliminated when ordering. For example, the query:

SELECT * FROM EMPLOYEE ORDER BY rand()

should now order the rows by the value of rand() computed for each row.

452671 Attempting to display the command line usage would have caused the usage window to appear, and then disappear almost instantly. This has been fixed.
452761 The server may have crashed if a connection executed a Java procedure and the connection received a cancel request while executing a createStatement() call. This has been fixed.
452793 Changing "Show multiple result sets" setting to On in the "Options" dialog could have incorrectly changed the setting which controls which result sets are printed in console mode. This has been fixed.
452795 If an application using the iAnywhere JDBC driver on a UNIX platform attempted to fetch an NCHAR column, the iAnywhere JDBC driver may have thrown a truncation exception. The driver was incorrectly interpreting the column OCTET lenght. This problem has now been fixed.
452798 In very rare cases, a crash during recovery, or killing the server during recovery, may have resulted in assertion 201502 - "Inconsistent page modification counter value" on subsequent attempts to recover. This has now been fixed.
452811 UltraLite could have produced incorrect results with aggregate queries with an ORDER BY clause, if ther did not exist an index on which to order the data, and there was no data supplied to be aggregated.

For example,

SELECT max( a ) FROM table ORDER BY max( a ) (table contains no rows)

This was fixed. A work-around woule be to recode the query as:

SELECT max( a ) FROM table ORDER BY 1.

452878 When deploying to a Microsoft SQL Server case-sensitive database, tests for existing tables and columns could have failed because the query used lower case names for the INFORMATION_SCHEMA.COLUMNS and INFORMATION_SCHEMA.TABLES columns called TABLE_NAME and COLUMN_NAME. This has been fixed by changing the tests to use upper case column names.

A workaround is to deploy to a file and change column names to upper case.

452902 The server may have crashed when starting up in low memory conditions on Linux x86_64.

This has been fixed so that a crash will not occur, and the startup process will attempt to continue as normal.

452905 The text on the "History" tab of the Message Property sheets has been updated, as some of the text could have been misinterpreted. The description of each stage in a message's lifecycle uses consistent nomenclature, and includes the message status and transmission status explicitly.
452906 Nomenclature change: The addressing entity responsible for sending a message has changed from "Source" to "Originator". This change is visible in the following places:

1. The "Messages" tab for a server store:

a) In the "Filter" panel

b) In the header for the first column

2. On the "General" page of a "Message Properties" dialog.

452908 Clicking a column header to sort messages on the "Messages" tab of a client or server store, then opening a property sheet for one of the messages, could have displayed information for the wrong message. Clicking the "Next Message" or "Previous Message" buttons in the property sheet could also have selected the wrong message. These problems have now been fixed.
452909 The "#Outbound Msgs" column on the "Clients" tab for server message stores was always being displayed as zero. This has been fixed so that the number of messages is now displayed correctly.
452911 A database that had gone down dirty, could have become corrupted during recovery. This would only have occurred if the database contained a very large checkpoint log (greater than 32512 pages for a database with 4Kb pages), which means that at least this many pages would have been altered in the database file since the last checkpoint. The symptoms of the corruption could be many different assertions including assertion 202101 - "Invalid bitmap links on page {page_num}". Also, validation errors could have resulted due to this corruption as well. This problem is now fixed.

It's possible that this corruption could be prevented by increasing the server checkpoint urgency. The more often checkpoints occur the less likely one is to get a database with a very large checkpoint log.

As always it is important to maintain a tested backup and recovery strategy. Having a valid backup database in this case allows one to apply the current transaction log to that backup to recover all transactions.

452912 When using the Create Database wizard (or another wizard that creates a database), attempting to create an UltraLite database and immediately connect to it after the wizard completes would have failed with a connection error, although the wizard completes successfully. Going to the Advanced tab and removing the DBN entry will resolve the problem and the connection will succeed. This problem was introduced by the changes for Engineering case 450346. The required semi-colon before the DBN keyword was missed. This has now been fixed.
452921 The MobiLink server behavior may have been incorrect, or have even crashed, if a MobiLink monitor attempted to connect for the first time and the server was busy. This would have occurred if the monitor script "for_MLMonitor_only" didn't exist in the consolidated database. This problem has now been fixed.
452935 The MobiLink Monitor would not have shown server activity generated by version 9.0 or older clients. The server was not correctly sending an event to the Monitor for older clients. This has been fixed.
453009 When specifying a host name for the -x (specified network protocal and options) commandline option, the MobiLink server would have shutdown without giving an error when the host name was not in IP address form. This option has now been extended to accept an IP name, and an error message will now be displayed when the lookup fails.
453011 Executing the statements CREATE DATABASE or CREATE ENCRYPTED FILE to create an encrypted database or file, could have caused a server crash. This has now been fixed.
453022 An UltraLite application could have hung when attempting to auto-start the UltraLite engine, if the engine encountered an error and was unable to start-up properly. This has been fixed.
453024 If a cursor was opened over a query containing an IN-list predicate, that cursor might have taken an overly long time to close. This slowdown had the most impact on IN-list predicates with many (~25 or more) entries in the list. This has been fixed.
453026 Calling the method ResultSet.Close() before the method PreparedStatement.Close() would have resulted in a memory leak. This has been fixed.
453038 Applications that report the physical processor count of the computer would have returned an incorrect value when run on multi-core Mac OS system (e.g., dual-core Core Duo or dual-core Xeon CPUs). This may have affected licensing. This problem has now been corrected.
453126 If an application made a Java call, and a deadlock occurred during the call, it was very likely that the server would have hung. The problem has now been fixed, and a deadlock error is correctly returned to the application.
453133 The table mapping editor now displays one row for each table in the remote schema; previously, it displayed one row for each table mapping, requiring the use of select File -> New Table Mappings to create a table mapping and add a row to the editor. Now creating a new table mapping (when the remote table already exists in the remote schema) is simply a matter of changing the mapping direction to something other than "Not Synchronized" and choosing a consolidated table.

New remote tables can be created (which adds a new row to the table mapping editor) by selecting File -> New Remote Tables. Remote tables can also be deleted (which removes the corresponding rows when the model is saved) by selecting the rows and then selecting Edit -> Delete, or clicking the Delete toolbar button, or pressing the Delete key. With these changes, the meanings of the table mapping editor's row header icons have changed. "New" (the yellow star) now means "Remote table is new" rather than "Table mapping is new"; "Delete" (the red X) now means "Remote table is marked for deletion", rather than "Table mapping is marked for deletion".

A new table mapping can be created by changing its Mapping Direction column from "Not Synchronized" to one of the other three values (Bi-directional, Download to remote only, or Upload to consolidated only) and choosing a consolidated table. Similarly, you delete a table mapping by changing its Mapping Direction to "Not Synchronized". In both cases, because the row in the table mapping editor has been changed, the "Edit" icon (the yellow

pencil) will appear in the row header. The "Edit" icon is also displayed when any other type of change is made to a table mapping, such as a change to the selected consolidated table or the download type.

The column mapping editor now has a Mapping Direction column between the remote and consolidated columns. This replaces the "Synchronized" check box column in previous versions. This change makes it harder to "unsynchronize" a column and easier to "delete" it; the former being far less common than the latter. The column mapping editor's row header icons have similar meanings to those in the table mapping editor, and remote columns can be deleted in the same way that remote tables are deleted. Remote columns can

only be added by adding a new remote table.

These changes have eliminated the inconsistencies between the table and column mapping editors.

453137 If a version 9.0 or older client was synchronizing with a version 10.0 MobiLink server, it could have reported a protocol error which would have caused the synchronization to fail. This would most likely have occurred when the table being synchronized contained a blob column followed by a string column. This has been fixed.
453147 In some circumstances, the MobiLink plug-in would not have beeb able to display the set of notifiers, gateways, carriers or versions in a database. This has been fixed.
453149 Enabling the Fast Launcher in the "Options" dialog (Tools/Options), could have caused the Interactive SQL utility to report an internal error (NullPointerException) when the dialog was closed. This has been fixed.
453226 In some circumstances a Notifier's property sheet would have displayed an incorrect value for the polling interval. The class that parses the ml_property.property_value column value when the ml_property.property_name column value was "poll_every" assumed that one or

more "H", "M", or "S" suffixes would always be present in the value, but it is not always true. This has been corrected.

453238 When attempting to install the High-Availability add-on, using the Linux x86_64 GA installer, the installer would print the following messages:

Checking for available disk space ...

/bin/df: `\n.': No such file or directory

/bin/df: `\n.': No such file or directory

You do not have enough disk space in ''. Needed=0K Available=0K.

This would happen with "old" High-Availability keys. The newer High-Availability keys do not have this problem.

If you encounter this problem, you can either:

1. obtain a new High-Availability key that will fix the issue.

2. download the Developer edition from

http://www.ianywhere.com/forms/downloads/sql_anywhere/sqlany_10_developer_download.html

and provide the key(s) you already have during the install.

453249 The MobiLink server was not correctly displaying the extended usage for Java and .Net scripting. This has been fixed.
453270 If a JDBC application connected using jConnect, and had the string_rtruncation option set to ON, calls to the procedure DatabaseMetaData.getTables() to get a list of tables would likely have resulted in an empty result set, even though it should not have been. This problem would only have occurred if one or more of the tables in the result set had a comment that was longer than 128 characters in length. This problem has now been fixed.
453274 It was possible for UltraLite to incorrectly return Referential Integrity violations. This could have happened when the primary row had been updated and it was the first row in an index. This has now been fixed.
453399 The encrypt() or decrypt() function could have returned NULL if the algorithm specified was AES_FIPS. This has been fixed.
453408 The MobiLink server may have aborted a synchronization request with the error "Unique PK violation on ml_user or ml_database table", when multiple MobiLink servers were running against the same consolidated database simultaneously. This problem has now been fixed.
453412 An AFTER UPDATE OF column-list trigger may have fired even if no column in the trigger's

column-list had been changed. This would have only have occurred if some other column specified in the UPDATE's SET list changed its value.

For example:

create trigger T1_UA after update of C1 on T1

for each row

begin

message 'after update trigger on column C1 fired';

end;

insert into T1 ( C1, C2 ) values ( 'abc', 'xyz' );

The following UPDATE changes C2, but C1 does not change, so trigger T1_UA should not fire

update T1 set C1= 'abc', C2 = 'XYZ';

This has been fixed so that triggers no longer fire under these conditions.

453429 Database validation could have, in very rare cases, incorrectly reported the error "Table (table_name) has an incorrect page count (x) in SYSTABLE when (y) was expected. This has now been fixed.
453438 If UltraLite encountered a permanent error (ie SQLE_DEVICE_IO_FAILED), due to the removal of an SD card, a subsequent attempts to close a connection would have caused a crash with a native error. This has been fixed.
453440 SOAP requests with encodings other than the database charset would have incurred errors within translated stringss. This has been fixed.
453442 UltraLite could have produced incorrect results for queries in which there was an inner join with an ON condition, and the right-hand side of the operation was a complex subquery. In these cases, the ON condition was incorrectly not being applied. This has been corrected.
453556 The sa_oledb_tableconstraints() system procedure may exist in older databases, but it is no longer used by the SQL Anywhere OLE DB provider. This procedure has been replaced by sa_oledb_table_constraints(). Newer versions of the oleschem.sql script dropped the sa_oledb_tableconstraints() procedure if it exists. The oleschem.sql script has now been changed to no longer drop the sa_oledb_tableconstraints() procedure.
453580 It was possible, although rare, for the server to have produced an invalid checkpoint. If recovery was attempted with such a checkpoint, either during recovery from a crash, or restarting from a backup, the recovery would have failed. This problem was more likely to occur on multi-processor systems. This has now been corrected.
453594 The server may have crashed when attempting to select from a call to a procedure. This behaviour could have occurred if the query was part of a subselect in a complex expression. The precise conditions for the failure are difficult to describe, though the error was more likely to have occurred when the procedure call was nested inside another procedure or function.

For example, the following function meets the above criteria (though may not necessarily cause an engine crash in all cases). Here, p1() is a user-defined procedure.

CREATE FUNCTION f1()

RETURNS LONG VARCHAR

BEGIN

RETURN 'str1' || (SELECT * FROM p1()) || 'str2';

END

This issue has been fixed.

453666 Some predicate optimizations (merging range bounds, forming IN lists from OR predicates, etc) were done only when comparing a field to a constant literal. These optimizations should also have operated on any value that is known at open time, including variables. Failing to do these optimizations could have prevented the possible use of an index. This has been fixed.

For example, the query:

select * from department

where dept_id = var1 OR dept_id = var2 OR dept_id = var3

can be transformed as follows:

select * from department

where dept_id IN ( var1, var2, var3 )

provided that var1,var2, and var3 are variables.

Additionally, predicate optimizations to simplify OR predicates may not have been taken. This could have impacted the choice to use an index scan during query execution. This also has been fixed.

453691 The following server store property values were not being displayed or saved correctly:

Rules evaluation period

Schedule date format

Schedule time format

Management request address

Server administration password

Logging level

Compression level

Rather than showing their proper value, they always showed their default value. Even after changing a property, its new value would appear in the server's property dialog, but the new value would not be used by the MobiLink server. The plugin was setting the in-memory property set rather than the one in the persistent store. This has been fixed.

453696 The changes made for Engineering case 372680 could have caused the server to crash when executing a procedure with an outer-reference in a query block. This has now been fixed.

For example, if the following query was in a procedure, the server may have crashed executing the procedure:

select sum( R.z + ( select sum(DT.x + DT.y)

from (select T.x, R.y <<<<<-----R.x is an outerrefere

from T ) as DT(x, y) ))

from R

453704 The QAnywhere Notifier could have sent redundant push notifications to a QAnywhere client when only a single message was waiting in the server store for that client. The QAnywhere Notifier could have been put into an infinite loop by sending push notifications to a QAnywhere client, when no push notification is required. The redundant push notification problem could have been seen when sending a web service request from a mobile web services client, for example in the currency convertor sample. The infinite loop of push notifications could also have been seen when sending a web service request from a mobile web services client, when the web service is unavailable. This has now been fixed.
453705 The server may have crashed after executing an xp_cmdshell() system procedure. This problem has been fixed.
453710 If an index contained more than one instance of a particular "long" entry (a hashed value contained more than 249 bytes), removing one of these entries could potentially have corrupted the index. This has been fixed.
453720 Attempting to view the contents of very large messages (e.g. greater than 1 MB) could have caused an internal error. This has been fixed by limiting the number of characters or bytes displayed to 8192.
453728 Clicking the "Export" button on the "Agent Log Viewer" dialog would have created a blank-delimited file whose first column was garbled, typically text of the form "com.sybase.qanywhere.plugin.LogFile$Record@xxxxxxx". This has been fixed. Now, the first value on each line is the name of the process that created the message (qaagent/dblsn/dbmlsync). The second value on each line indicates the message type: "I"/"W"/"E" for information, warning, or error, respectively.
453743 If a running instance of Visual Studio was found, the utility SetupVSPackage.exe would have displayed a dialog box with a 'Continue' button and 'Cancel' button, but clicking 'Cancel' would have done nothing. This has been fixed.
453744 UltraLite could have produced incorrect results with queries in which a cast of NULL was used in the select list. The NULL constant was not being set up correctly. This was fixed.
453834 Sybase Central was not respecting the language setting created by the Language Select utility dblang. This has been corrected.
453835 If a push notification error occurred while the MobiLink server was still undergoing startup, the MobiLink server would have treated it as a critical error, thus preventing the server from starting. A race condition in the code that handles MobiLink server startup and the code that handles push notifications, has been corrected.
453846 Prior to HP-UX 11i v2 September 2004 Update, hostname length on HP-UX machines was limited to 64 bytes. Starting with that version, system administrators could enable support for 255-byte hostnames by setting a kernel parameter. However, on SQL Anywhere servers on HP-UX machines with long hostname support enabled, the MachineName property would only have returned at most 64 bytes of the hostname. The same was true of the HOST key in the AppInfo string for clients on such machines. This has now been fixed, and both MachineName and AppInfo are now capable of containing 255-byte hostnames.
453858 When connected to an UltraLite database, the Interactive SQL utility would not have displayed system table names, even when configured to do so. This problem has now been corrected.
454000 Secure synchronizations may have failed unexpectedly, and apparently at random, at the very end of the synchronization/connection. Secure connections from all clients would have been affected, including:

- dbmlsync (including QAnywhere agent synchronizations)

- UltraLite clients

- the MobiLink Monitor

- dblsn

- mlfiletransfer

The failure required that the last thing MobiLink server did on a connection, just before it was closed, was a read. In synchronization terms, this means that synchronizations with download ACKs were potentially affected, but synchronizations _without_ download ACKs were not. Persistent connections should not be affected by this problem. This has been fixed.

454017 When specifying a Download Subset method of "Custom" in the synchronization model, the SQL generated for the download_cursor event would have had an erroneous comma in the FROM clause if no join tables were specified. This has been fixed.
454021 In the Agent Log Viewer dialog, it was impossible to use the time in the "Starting at" or "Ending at" fields to restrict the times of the displayed messages. This has been fixed.
454027 The "Schedule Editor" did not display existing schedules correctly if the schedule was for certain days of the week, or certain days of the month. This has been fixed.
454133 If a statement contained the literal constants N'<str1>' and '<str2>', where <str1> and <str2> were any identical strings, then the wrong answer could have been returned for the statement, with the two literals being incorrectly treated as identical.

For example, the query:

select N'A', 'A'

should return a nchar(1) for column 1 and a char(1) for column 2. Instead, the same domain was incorrectly being selected for both columns:

select * from sa_describe_query( 'select ''A'', N''A'' ' )

This has been fixed.

454140 Selecting Sybase Central, the Interactive SQL utility or the MobiLink Monitor from the Start Menu, may have failed to start the respective application. This has been fixed.
454182 Creating a database with a user-specified DBA user as "DBA" (ie using CREATE DATABASE with the DBA USER clause, or dbinit with the -dba command line option) would not have put that user into the PUBLIC group. This would have lead to problems such as jConnect failing to find metadata on such databases. This has been fixed.
454193 When importing data with DBISQL IMPORT, rows with certain NULL columns would have failed to load, with the error

The data on line n could not be imported.

[UltraLite database] Expression has unsupported data type.

SQLCODE=-624, ODBC 3 State="HY003"

UltraLite was attempting to bind two types that were not supported, SQL_FLOAT and SQL_GUID, but only when those columns were NULL. When those columns were not NULL, the rows would have been loaded as usual. Fixed by adding support for these types.

454249 When comparing a column with a CHAR domain (CHAR, VARCHAR, or LONG VARCHAR) to an NCHAR value, the incorrect semantics could have been given. The behaviour depended in part on whether the query was simple enough to bypass optimization and whether an index was selected to satisfy the comparison.

For example, the following query:

SELECT * FROM department D WHERE D.dept_name = N'R & D'

could have incorrectly been executed as:

SELECT * FROM department D WHERE D.dept_name = CAST( N'R & D' AS CHAR) AND CAST( D.dept_name AS NCHAR)= N'R & D'

This has been fixed. Such comparisons are now treated consistently, regardless of whether a sequential scan or an index is used, and regardless of whether the query bypassed optimization or not.

The above query is now correctly executed as:

SELECT * FROM department D WHERE D.dept_name = CAST( N'R & D' AS CHAR)

Note that NCHAR values may appear if there is a host variable that is bound at the client as SQL_C_WCHAR.

This fix further clarifies the rules of type inference when building expressions that have both CHAR and NCHAR columns. After this change, some expressions with a mix of CHAR and NCHAR types may return a different result type or a different answer than before. For each expression, SA tracks a flag coercible_collation that indicates whether the value can be coerced to CHAR when used in an expression containing a CHAR column. All constants, variables, and host variables are marked as coercible. All column references are marked as not coercible. A complex expression is coercible if all of its arguments are coercible. When combining arguments, the following rules are considered in order:

If there is any not-coercible NCHAR value, all CHAR values are converted to NCHAR

Else, if there is any not-coercible CHAR value, all NCHAR values are converted to CHAR

Else, if there is a mix of coercible CHAR and coercible NCHAR values, all CHAR values are converted to NCHAR

When NCHAR semantics are explicitly desired and a mix of CHAR/NCHAR types is present, use a cast on any CHAR column references in the operation. For example, the following comparison is done in the NCHAR domain:

SELECT * FROM department D where CAST( D.dept_name AS NCHAR) = N'R & D'

Since this change affects the results of queries, it may cause a query to return a different result than a server without the fix. If a materialized view was created with a server that does not contain the fix, stale results may be returned. If a materialized view contains NCHAR and CHAR values, the view columns may have different domains with a server containing this fix, and this may lead to a failure to match the materialized view (see QTS-454364). In this case, the materialized view must be recompiled with 'ALTER VIEW [ owner.]materialized-view-name RECOMPILE' and then refreshed with 'REFRESH MATERIALIZED VIEW [ owner.]materialized-view-name...before it can again be automatically matched (see also the section "Refreshing materialized views" in the SQL Anywhere� Server - SQL Usage book for information about how to refresh materialized views).

454313 It was possible, although very unlikely, for a mirror server to have crashed when attempting to connect to another mirror server. This has been fixed.
454319 If the case of a variable in a procedure was used inconsistently (e.g. declared in lower case but used in upper case), the server could have reported a "column not found" error, or even have crashed, when the procedure was called. This has been fixed.
454339 The Initialization utility would have failed with "SQL Error (-131) -- Syntax error near 'dba user'" when providing a DBA password without a DBA username with the -dba command line option. This has been fixed.
454360 The UltraLite Database Initialization utility was incorrectly handling tables without primary keys. If there was no primary key, but at least one unique constraint, ulinit would have attempted to use the first unique constraint as the primary key. However, the DDL generated for that table was incorrect, and produced a syntax error. If there was no primary key and no unique constraint, ulinit did not catch this case, and again produced DDL with a syntax error. These problems have now been corrected.
454364 A materialized view created with a server prior to this fix, and having constant NCHAR and CHAR columns, may no longer qualify to be used by the optimizer for cost-based optimization. Changes have been made to how the optimizer handles materialized views related to issues described in Engineering cases 454249 and 454133. The view must be recompiled and then refreshed so that the optimizer can use it again.
454423 When deploying a MobiLink synchronization model for a SQL Anywhere remote, selecting an advanced option for the Remote Synchronization client would have caused the script to be generated with an extra comma, causing a syntax error. This has been fixed.
454449 When an application uses the iAnywhere JDBC driver, the URL that the application passes to the driver begins with the header "jdbc:odbc:". Unfortunately, this URL header conflicts with the URL header that the Sun JDBC-ODBC bridge accepts. This problem is most noticible if the application uses JDK 1.6. To avoid this conflict, the iAnywhere JDBC driver now accepts the header "jdbc:ianywhere:" in addition to "jdbc:odbc:". Application developers are encouraged to use the new "jdbc:ianywhere:" header instead of the old "jdbc:odbc:" header when building the URL that will be passed in to the iAnywhere JDBC driver.
454477 The "Condition Editor" dialog contains a drop-down button for inserting the names of QAnywhere status codes. The list contained the name "IAS_TRANSMIT", which should have read "IAS_TRANSMITTING". This has been fixed.
454480 Calls to the method DataTable.Merge() would have failed after performing an update, when using a data adapter with the property AcceptChangesDuringUpdate set to false. This problem has been fixed.
454481 The SQL Anywhere OLE DB provider was returning E_FAIL from IOpenRowset::OpenRowset for database errors. Since E_FAIL was returned, the client would have reported the message "Unspecified error". On a "table not found" error for example, it should have returned DB_E_NOTABLE , "The specified table does not exist in the data store". This problem has been fixed.
454485 In the Console utility dbconsole, some database properties were not displaying any values. These database properties with no values where listed in error. This problem has been fixed.
454612 When a database containing tables with autoincrement columns was rebuilt, the default and historical behavior was for the server to calculate the next available value for each of these columns based on the current contents of the tables. In most cases, this iwa sufficient; however, if rows had been deleted from the "end" of the range of values, this would have resulted in values being re-used, which in some cases was not desirable. To force the current value of SYSTABCOL.max_identity to be preserved across a database rebuild, the Unload utility's (dbunload) "-l" option can be used. This will cause calls to sa_reset_identity() to be added to the generated reload.sql script for each table containing an autoincrement value.
454614 A database could have become corrupted during a failed LOAD TABLE or ALTER TABLE. This could have occurred if the database contained more than one dbspace and the table being loaded or altered had indexes in a different dbspace from where the table was located. This has been fixed.
454619 If the server was under a heavy I/O load when running on a Linux kernel prior to 2.6.12, the machine may have hung and required a reboot. A bug exists in Linux kernel versions prior to 2.6.12 that may cause machine hangs when using asynchronous I/O. The server will now automatically disable asynchronous I/O when running on affected kernels. A work around for those who do not wish to upgrade the kernel, or apply this fix, is to use the -ua server option to manually disable the use of asynchronous I/O.
454624 After double-clicking a search result in the Search dialog, (View > Search Pane), the corresponding item would not have been scrolled into view in the right pane. This has been fixed.
454640 When synchronizing with logic written in Java scripts, or with QAnywhere or with the Notifier, the Java VM may have become unstable after 60 minutes. This has been fixed.
454739 The ODBC driver on Unix systems, Windows system when not using the Driver Manager, and Windows CE systems, may have sent or received incorrect non-ASCII characters if the database character set was different from the application's operating system character set. This has been fixed.
454742 When a MobiLink server is handling synchronization requests from both version 9.0 and 10.0 clients concurrently, the same synchronization number may have been shared by both 9.0 and 10.0 synchronizations. The MobiLink server now assigns version 9.0 and older clients synchronization numbers in the range of 9000000 to 9999999. Version 10 clients will not be assigned numbers in this range.
454745 In some cases, an INSERT, UPDATE, or DELETE statement would have used a work table that was not needed. This would have caused performance to be slower than it could otherwise have been. This has been fixed.
454756 When a database mirroring server was attempting to start, it could incorrectly have attempted to take ownership of the database. This may have resulted in the error message "The alternate server name provided is not unique" being displayed. This has been fixed.
454785 Attempting to create a proxy table to a remote table that had an underscore in the table name, may have failed when using certain ODBC drivers. For this problem to have occurred, the ODBC driver in question must have returned the empty string as the "SQL_SEARCH_PATTERN_ESCAPE" string. At the moment, the ASE ODBC driver seems to be the only one that is affected by this problem. This has now been fixed.
454791 Running the Application Profiling wizard could have failed with a 'duplicate primary key' error on the ISYSUSER table, when creating the tracing database. This has been fixed.
454793 Opening an Agent configuration file (.qaa) with the QAnywhere plug-in would have shown the failover delay and failover retry count always as zero, even if they had non-zero values specified in the configuration file. This has been fixed.
454851 Using a PUT to insert rows into a cursor could have failed to fire insert triggers on the affected table. Also, it was possible for a PUT to have caused a server crash if triggers were present on the table. These problems have now been fixed.
454858 The server could have crashed when performing a LOAD TABLE into a temporary table. Certain requirements are now properly enforced when loading into temporary tables. A commit is now performed prior to the load, and after a successful load, for any table except a LOCAL TEMPORARY TABLE with ON COMMIT DELETE ROWS. A partial LOAD TABLE into a temporary table due to a failure will result in the entire contents of the table being removed, including rows in the temporary table which were present prior to the load. Previously, a partial load would have resulted in the rows loaded to that point being left in the table, while others were missing. Since rows are removed from a temporary table on error, it is now also required that there be no foreign rows already referencing rows in the table being loaded. As a result, loading into a temporary table already containing rows with foreign key references from another table will result in an error. In version 10.0, the use of LOAD TABLE into a global temporary table, that was created with the SHARE BY ALL clause, will cause an exclusive lock on the table. This will prevent concurrent loads into the table.
454860 It was possible, although extremely rare, for an internal rebuild using the Unload utility (dbunload -ar or -an) of a pre-10.0 database to hang the server while unloading/reloading the first table. This problem would only have been seen on SMP systems, or systems with hyper-threaded processors. A workaround is to restart dbunload. This has been fixed.
454862 After receiving a TEMP_SPACE_LIMIT error, and then making more space available to the temporary file partition by increasing the partition size or deleting unnecessary files, an application may still have received a TEMP_SPACE_LIMIT error. This could have happened even when enough space was added so that all connections were below their quota, as the calculation of available temporary space was being made when the temp file was extended. If the temp file was not grown after more space becomes available, then the server would not have applied newly available space to a connection's temp file quota. This has been fixed. Now, after a small interval of time following a TEMP_SPACE_LIMIT error, the engine will re-compute available temp space and temp file quotas. The interval is currently set to 60 seconds. This recalculation is made following every occurance of a TEMP_SPACE_LIMIT error.
454868 On Windows CE, if a second server is started when one is already running, the first server's console window is displayed, and the second server terminates immediately. This is the correct behaviour, unless the command line coptions -qw or -qi were used, in which case the server's console window should never be displayed. This has been fixed so that the first server's console window is not displayed if the second server's command line includes one of the following options: -qw (do not display database server screen), -qi (do not display database server tray icon or screen) or -qs (suppress startup error dialogs).
454871 The method ULConnection.Synchronize(ULSyncProgressListener) could have thrown an exception that application code could not catch, typically a unrecoverable error like SQLE_DEVICE_ERROR. Worker threads were not trapping errors from connection.Close(), as this exception was thrown from a worker thread, the application could not catch it. This has been fixed.
454877 The QAnyhere plug-in could have crashed when attempting to edit a poorly-formed rule (.QAR) file. This has been fixed.
454878 The server could have crashed while optimizing a statement. In order for the problem to have occurred, there must have been a search condition comparing a column to a value of a different domain. This has been fixed.
454889 It was possible, although rare, for the server to produce invalid checkpoints. If recovery was attempted with such a checkpoint (either during recovery from a crash, or restarting from a backup), the recovery would have failed. This has now been fixed.
454890 If an application using the iAnywhere JDBC driver attempted to cancel a long running statement, it was possible that it could have crashed. This has now been fixed.
454895 Sequentially scanning tables containing string columns was slow. Whether or not strings that had been read could be cached was not being determined correctly. This has been fixed.
454903 On Windows CE, if a second server is started when one was already running, the first server's console window is displayed, and the second server is terminated immediately. This is the correct behaviour, unless -qw or -qi was used, in which case the server's console window should never be displayed. This has been fixed so that the first server's console window is not displayed if the second server's command line includes the following command line options: -qw ('do not display databse server screen'), -qi ('do not display database server try icon') or -qs ('suppress startup error dialogs').
454923 Executing a query using the stored procedure debugger (Debug > Query Database) could have caused the database server to crash. This has been fixed.
454990 The server could have hung, when running on a heavily loaded system. This was more likely to have occurred when running on multi-processor systems. This has been corrected.
455002 Attempting to update a view that contained an outer join using a searched update, could have failed if there were NULL-supplied rows, even if the update statement only modified columns from the preserved table.

For example, the following sequence could have incorrectly lead to the error CANNOT_UPDATE_NULL_ROW:

create view ab

as select apk, ax, bpk, bfk, bx

from a left outer join b on bfk = apk;

update ab set ax='Z' where apk=2

This has been fixed.

455003 The UltraLite generator ulgen could, if there was an unreferenced column and that column was the referencing column of a foreign key, generate an UltraLite database containing that column. This has been corrected.
455022 The ULCommandBuilder class would have created an INSERT statement without values for the primary key columns, when the primary key columns were not DEFAULT AUTOINCREMENT. This has been fixed.
455115 Running build.bat for the SIS_CarDealer sample application (Samples\MobiLink\SIS_CarDealer\build.bat) to generate files for Palm listeners, could have failed. The error "Wrong number of parameters to function 'ml_add_user'" would have been reported when populating the MobiLink SIS tracking tables. It is now fixed.
455140 Executing a query that involved a proxy table, and uses an invalid dotted reference that contained empty fields within the query, would likely have caused the server to crash. An example of an invalid dotted reference with empty fields is:

select emp_profile..dependents..count(*) from emp_profile

This problem has now been fixed so that attempts to use an invalid dotted reference of the above form will result in an "invalid field reference" error.

455148 Use of references to procedure in UPDATE statements could have caused the server to crash. The server will now generate an appropriate error message.
455160 The Interactive SQL utility could have failed with an internal error (NullPointerException) when saving result sets if the "Show multiple result sets" option was ON and the result sets contained a column wider than the truncation length. This has been fixed.
455170 If a Windows NT system was shutdown or rebooted while a database server was running as a service with desktop interaction enabled, the database server could have crashed during the shutdown. This problem has been fixed.
455256 Synchronizations using encryption may have occasionally taken too long. The primary symption of this problem was the presence of at least one two-minute delay in the middle of a synchronization. This has been fixed.
455321 The x86_64 Linux server may have crashed while processing a request. This would only have occurred when glibc-2.3.3 was installed on the system. A work-around in the server has been added to avoid this crash.
455329 The Interactive SQL utility could have displayed BINARY, LONG BINARY, VARCHAR or LONG VARBINARY values as empty if the "Show multiple result sets" option was on and the truncation length was set to zero. This has been fixed.

Note, this problem only affected windowed operation, not console mode.

455330 The Unix install could have hung after reporting the following error:

"No valid values found for the -w flag". The installer makes a call to the OS to get the size of the current window, which is then used to format the display of the install text. If this call returns an error, the window size is set to a default of 80x24. If however, the call does not return an error but returned a window size of 0x0, the installer would have tried to use this to format the text, leading to problem. This has been fixed by using the default 80x24 size for this case as well.

455342 The system procedure sa_db_properties() would have failed to return the value for the database property ConnCount. This has been corrected.
455350 A .NET client receiving a SOAP response from a SQL Anywhere SOAP service would have failed to parse the response if the SOAP service was configured with FORMAT 'DNET', and one or more of the response columns was null. This has been fixed. A C# .NET client will now emit a System.DBNull object to represent a null column.

XML supports hexBinary and base64Binary representations for BINARY data types. A SQL Anywhere DISH service will now expose all SOAP service elements of type BINARY as base64Binary XML types. This applies to all three SOAP service formats: CONCRETE, DNET and XML. Prior to this change, DNET formatted soap services exposed BINARY data as hexBinary.

455526 The server could have deadlocked during concurrent index scans and row updates. This was more likely to have occurred on multiprocessor systems, and with index scans that changed directions. This has now been fixed.
455533 When connecting to an UltraLite database with a connection string that did not contain a password, the application (such as ULISQL) could have crashed. This has been fixed so that specifying no password is now treated as an empty string password.

This fix resolves another potential problem: attempting to add a user with a null password. Calling the C++ method UltraLite_Connection::GrantConnectTo() with NULL as the second parameter could also have crashed the application. This has been resolved as well.

455534 The Validation utility dbvalid could have failed with syntax errors when validating databases if the database charset differed from the operating system charset, specifically when the database charset contained characters that could not be represented in the operating system charset. This has been fixed by having dbvalid connect using the database charset.
455536 An error that there was incorrect syntax near 'FULL' would have occurred when attempting to delete a Connection or Table script from a Sybase ASE consolidated database. The SQL that was used to determine this reference count contained a FULL OUTER JOIN, which isn't supported by ASE. The query has been rewritten.
455542 If the server was started with the -z option and an application connected using either Open Client or jConnect, it was very likely that the server would have crashed if the application subsequently fetched a large float value. This problem has been fixed.
455647 Viewing any numeric property in the property sheet for a web services connector (e.g the HTTP proxy port) would always have displayed the socket timeout, rather than the intended property. This has been fixed.
455649 If the value of the PUBLIC timestamp_format option was changed to something other than the default, Sybase Central could have crashed when the Events or Maintenance Plans folder was selected in the tree. This has been fixed.
455656 If the "ianywhere.connector.outgoing.retry.max" property was set in a connector property sheet, it would not have been displayed the next time the property sheet was opened. This property was being included in the list of system properties, and as a result, the property was deliberately not listed on the "Properties" page. This has been corrected so that it is no longer treated as a system property, which allows it appear on the "Properties" page.
455659 A server crash was possible if concurrent connections were calling and dropping a procedure. For the crash to have occurred, there must have been a specific chain of events. A procedure was called on one connection, a checkpoint occurred, another connection dropped the procedure, and the first connection rolled back. This has been fixed.
455668 It was possible for the database server to crash when attempting to run a corrupted database file. Assertion 201418 'Row (page:index) has an invalid offset' has now been added to detect this corruption.
455695 The values returned for the "Number" and "ReqTimeUnscheduled" columns of the sa_performance_diagnostics() stored procedure were not correct. This has been fixed.
455704 Changing the Server Administration Password from a server message store's property sheet, would have actually changed the Management Request Address. This has been fixed.
455712 Esape processing was not being performed on NCHAR string literals. For example, the literal N'\n' was interpreted as an NCHAR string of two characters, a backslash followed by the letter 'n'. Instead, it should be treated as a single new line character. Similarly, N'\\' was treated as two backslash characters instead of one. When unparsing statements such as views and stored procedures, NCHAR string literals were output as if escape processing had been performed. This could have lead to incorrect results in some cases.

For example:

create procedure TNchar()

begin

select '\', N'\'

end

The TNChar procedure would have incorrectly returned a string with two backslash characters instead of one.

This has been fixed.

Note that hexadecimal escape sequences are interpreted in the CHAR character set, not the NCHAR character set. Use the UNISTR() function for unicode escapes.

NOTE: The interpretation of escape characters in NCHAR string literals has changed; if your database contains materialized views affected by this, the views should be refreshed.

455776 When a cursor was opened on a query with a "Nested Loops Semijoin Algorithm" or a "Nested Loops Anti-Semijoin Algorithm" in the execution plan, the cursor could have been repositioned inappropriately on a FETCH RELATIVE 0. Instead of remaining on the current row, a different row or NOTFOUND could have been returned. This has been fixed.
455814 If an application connected using the iAnywhere JDBC Driver, prepared a callable statement, set the value of a parameter, registered the same parameter as output, and executes the statement, the output value of the INOUT parameter would not always have been correct. In some cases, the output value of the parameter would have incorrectly been set to the input value of the same parameter (i.e. the value would have remained unchanged after the callable statement was executed). This problem has now been fixed.
455922 In some timing-sensitive circumstances the QAnywhere client could have returned incorrect results. Calling QAManagerBase.GetMessageTimeout may have returned NULL if the queue contained unread messages; and an incorrect queue depth value may have been returned by calls to QAManagerBase.GetQueueDepth. These problems have been fixed.
455926 An attempt to create a base table with the same name and owner as that of an existing local temporary table is permitted by the server. However, the newly created table could not have been accessed until the local temporary table with the same name and owner was dropped from the current scope. The server will now disallow the creation of a base table in this scenario.
455972 A plus character ('+') within a STRING type parameter (eg. var char) to a SQL Anywhere web client configured as type HTTP:GET or HTTP:POST, was received as a space ' ' by an HTTP server. The SQL Anywhere web client was not url-encoding the plus character. This has been corrected.
455973 A SQL Anywhere DISH service that was configured with a GROUP clause, but no FORMAT clause, could have caused the server to crash on startup. This problem affected Win64 and some Unix platforms, but did not occur on Win32 platforms. It has now been fixed.
455974 If the server had been busy for a while, and the cache had grown somewhat, attempting to creating a proxy table may have caused the server to hang. For this problem to have occurred, the remote database that the proxy table was being created to, had to be on the same server as the local database. This problem has been fixed.
455977 License information for the Network Server (dbsrv9.exe), Personal Server (dbeng9.exe), Runtime Server (rteng9.exe) and Mobilink server (dbmlsrv9.exe) are now contained in a separate .LIC file, rather than inside the executable file. The license file is stored in the same directory as the executable file. When dblic.exe is run, specify the name of the .LIC file instead of the .exe file that needs to be licensed.

Note, when deploying any of these executables, the .LIC file will need to be deployed as well

456070 If CreateDatabase was called to create an encrypted database, and an encryption key waspassed via the connection parameters but ULEnableStrongEncryption wasn't called, CreateDatabase would have created an unencrypted database without reporting any warnings or errors. This has been fixed so that CreateDatabase will now fail in this situation with SQLE_ENCRYPTION_NOT_ENABLED. When attempting to connect to an encrypted database and an encryption key was provided, but ULEnableStrongEncryption wasn't called, the runtime would have reported SQLE_BAD_ENCRYPTION_KEY, which could have been misleading. This has been corrected so that the runtime will now report SQLE_ENCRYPTION_NOT_ENABLED for this as well. Also, when attempting to connect to an unencrypted database and an encryption key is provided, but ULEnableStrongEncryption isn't called, the connection will still succeed, but the runtime will now report a warning SQLE_ENCRYPTION_NOT_ENABLED_WARNING.

Note that these changes only apply to applications that use the C++ or embedded SQL interfaces and don't use the UltraLite engine. Applications that use the engine, or any of the components, did not have these problems since they always call ULEnableStrongEncryption internally.

456116 Attempting to establish a connection to an SA 10 database using jConnect may have failed with an UNRECOGNIZED charset error, even though the database charset was valid. This problem was most prevelent with a CP936 database, although it may have occurred with other database charsets as well. The problem has been fixed.

Note that this problem does not affect non-TDS based connections.

456202 Two problems with generated batch files for dbmlsync and ulsync have been fixed.

The default dbmlsync command used in the automatically generated *_dbmlsync.bat file contains the "-qc" switch. This switch caused the window to automatically close upon completion of the synchronization, making it hard to see whether it was successful or not. This has been fixed so that it is no longer in the default command. It can be added if desired by adding "-qc" to the command line options in the Advanced Options for SQL Anywhere Remote Synchronization Client page of the Deploy Synchronization Model Wizard.

The automatically generated *_ulsync.bat had a "set PARMS=" line (intended for users to edit if they wanted), which should have been "set PARAMS", that meant that the %PARAMS% environment variable was not used with the ulsync command. The typo has been corrected.

456231 If a statement contained one or more large IN list predicates that were processed using the IN List algortihm, then the statement could have taken a long time to respond to a cancel request. In some cases, a communication error would have occurred when executing such statements. This has been fixed.

For more information on the IN List algorithm, see the documentation:

SQL Anywhere� Server - SQL Usage

Query Optimization and Execution

Query execution algorithms

Miscellaneous algorithms

IN List

456232 The Interactive SQL utility, or any of the Java administration tools (ie Sybase Central, DBConsole, and MobiLink Monitor) would not have started on machines running German Windows Vista, if installed to "C:\Programme" rather than "C:\Program Files". This problem has been fixed.
456239 A query that performs an index scan involving a partially specified key could have returned wrong results. The following are all necessary for a wrong result to be returned: 1) the index had to be over more than one column, 2) the index scan must not have specified a value for the last column 3) the hash for the key must be 243-248 bytes long 4) the key must be a prefix of some indexed value. This has been corrected.
456302 The server may have crashed if multiple connections ran the same stored procedure concurrently the first time after the database was started, or an event caused the procedure to be reloaded. For the crash to have occurred, the procedure must have contained a control statement (e.g. IF) with a condition that used a subselect referencing proxy tables. This has been fixed.
456312 If a filename provided to a BACKUP, RESTORE, LOAD TABLE, UNLOAD TABLE, or UNLOAD statement was not a CHAR-based character string (CHAR, VARCHAR, LONG VARCHAR), then the filename could have been incorrectly translated to an operating system file name.

An error is now given if a filename is provided to one of the above statements and the filename is not a CHAR-based string. This can happen either if the N'' string literal prefix is used to denote an NCHAR string or if a variable is used and the variable is not CHAR-based.

456317 When running in a Terminal Services (aka Remote Desktop or Fast User Switching) session, clients were not be able to use the shared memory communications port reliably. For example, database servers started as a Windows service would only be visible to the primary local login session ("session 0"), and they would be invisible to all other Terminal Services sessions. The behaviour has now been corrected and improved as follows:

1. A database server started in session 0 (ie as a Windows service or on the desktop of the primary login session) will be visible via shared memory to all sessions.

2. A database server will not start if there is already a server running by the same name in session 0 or in the current session. Note that the server _will_ start if there is a database server running with the same name in another session other than session 0.

3. When connecting via shared memory, clients will look for a server by the specified name in the current session first and then in session 0.

Note that starting a database server on the desktop of session 0 can prevent a server with the same name from starting as a service; however, this situation is rare because services are normally started when the system starts.

456324 In UltraLite, the dateformat() function was not properly using mixed case when specified by the format string.

For example:

Select dateformat( �2007-02-15�, 慏DDdddddd, Mmmmmmmm� ) from dummy

This function would have incorrectly returned 搕hursday, february� instead of 揟hursday, February�. This has been corrected.

456348 When the server shutdown on Unix platforms, it may have recorded in the server console that the user requested the shutdown by pressing 'Q' when this was not the case. The correct reason for the shutdown will now be displayed.
456366 For a synchronization model that used timestamp downloads, logical deletes, and a non-default name for the timestamp column, a "column not found" error would have been returned when the download_delete_cursor was executed by the MobiLink server. This has been fixed.
456445 It is not possible to use the Input Method Editor (IME) to enter passwords in the Interactive SQL utility, or any of the Java administration tools, due to a bug in the Java Runtime Environment.
456446 The MobiLink server could have hung when run on Unix systems. This has been fixed.
456468 When unloading data from a database that is currently connected, if the wizard was terminated after the filename was specified, the new database would have failed to connect with the error: 揧ou are already connected to this database�. This has been fixed.
456473 When starting a database server on a file for which the server had no write permissions, the server would have reported "Unable to start database server. Unknown error (-29958)". A more appropriate error message is now displayed. In the case of having no write permissions, the server will now display "Unable to start database server. Permission denied"
456484 The MobiLink server FIPS option did not work when HTTPS was used. Specifically, the following would not have loaded a FIPS-compliant encryption DLL/shared object, instead a non-compliant encryption DLL/shared object was loaded:

mlsrv10 ... -x https(...;fips=y)

Note that this is the full extent of the bug. The following will load the proper DLL/shared object:

mlsrv10 ... -x https( ...) -fips

mlsrv10 ... -x tls(...;fips=y)

mlsrv10 ... -x tls(...) -fips

Those requiring FIPS compliance for encryption are urged to always use the -fips option of mlsrv10 and/or on the server. They are also urged to remove the DLLs/shared objects that are not FIPS-compliant. Customers doing the latter would have seen the MobiLink server issue an error about being unable to load mlrsa_tls10.

456492 Updating a clustered index on a table that from which rows had been deleted, could have resulted in a the server crashing, or a failed assertion. While there is a small chance that database corruption could result, this is not likely. This has been fixed.
456549 A Client Rule file (.QAR file) could have been inadvertently truncated, losing the transmission and deletion rules, if it was viewed in a dialog, but not actually modified. This has been fixed.
456558 The MobiLink server may have mistakenly detected conflict updates when synchronizing tables containing columns with a TIME data type; if there was an upload_fetch or upload_fetch_column_conflict script, and at least one of the upload_new_row_insert, upload_old_row_insert, and resolve_conflict scripts. This problem is now fixed.
456561 When a synchronization model was deployed that created shadow tables, the shadow tables would have been created with the connected user as the owner, and the generated triggers would have referred to the shadow tables without specifying the owners. This could have caused the triggers to fail if a base table and shadow table had different owners, and the base table owner could not access the shadow table owner's tables without specifying the owner (eg. if the owners were not in the same group). This has been fixed. Now a shadow table is created with the same owner as the base table, and the triggers and download scripts fully qualify the shadow table name.
456562 When selecting publications in the Extract Wizard, if one publication was selected, the appropriate tables were displayed. However if more than one publication was selected, no tables were displayed. This has been fixed.
456564 On Windows Vista, services are not allowed to interact with the desktop. Even if "allow interaction with desktop" is enabled, the server will not attempt to do so.
456567 The Infomaker, PhysicalModel or DataWindow.NET installs could either have failed to launch, or have been launched incorrectly by the main Tools Installer when run from the CD. This has been fixed in SA 10.0.1 by using the fully-qualified paths of the install launchers.

A work-around for SA 10.0.0 is to copy the contents of the CD to a hard drive and run the install from there.

456580 The sample programs provided have been changed so that they now correctly handle SQL Anywhere installation pathnames that contain spaces. Previously, the sample programs used the Windows "short" filename (8.3) format, which avoided spaces.
456585 Adding a row to a table in the "Results" panel (or on the "Data" tab of a table object in Sybase Central) and then tabbing between the new column values, could have inadvertently changed a "(DEFAULT)" value to "(NULL)". This problem will occur if the table contained a nullable column, followed by one which was not nullable and which also has a default value. This has been fixed.
456608 On Windows Vista, to use AWE (Address Windowing Extension) cache with the database server, the server must be run as an administrator. If not run as an administrator, the server will disable AWE and issue a warning message.
456610 Executing a TRUNCATE TABLE statement on a very large global temporary or permanent table may have blocked other database requests (including connect requests) until its completion. This has been fixed.
456644 Calling UltraLite_ResultSet.Set did not set NOT NULL when a value was supplied. This could have also have affected the Set methods in various components. This has been fixed.
456675 If a result set row could not have been fetched, the full reason for the failure might not have been reported. Typically, the message "Cursor not in a valid state" was displayed without the underlying error indication. Now, all of the available error information is displayed.
456682 The VARBIT and LONG VARBIT data types were missing in the SADbType enum. This has been corrected, SADbType.VarBit was added for the VARBIT data type, and SADbType.LongVarbit was added for the LONG VARBIT data type.
456698 The special value NULL, used by itself in certain SELECT expressions, could have given incorrect results. For example, the query "select NULL union select NULL" did not give the correct results. This has been corrected.
456703 The event source for a service event log entry is incorrectly set to the service name. This results in a message similar to the following: "The description for Event ID ( 1 ) in Source ( SQLANYm_xxx ) cannot be found. ..." This problem has been fixed.
456715 In the "SQL Statements" field, clicking on a statement keyword (e.g. "SELECT", or "INSERT") should open a context menu which contains an item "Help for xxx" (where "xxx" is the keyword). Help was available only for a very select number of statements. This has been corrected so that help is now available for all statements.
456720 A race condition existed when the server checked for expired Http connections, which in a rare case could have caused the server to crash. This has been fixed.
456728 The options 'Listening', 'Enable Actions' and 'Prompt Before Actions' were always enabled for the Palm Treo 600 and 650 Listeners, and could not be disabled. This has been fixed so that these options are now configurable.
456732 The server would have failed to start a database file which resided on a file system not supporting Direct IO. This is of particular importance to users wishing to run a SQL Anywhere database on a tmpfs filesystem (RAM drive), as tmpfs does not support the use of Direct IO. This only affected Linux and AIX systems.

In order to support tmpfs filesystems, the server now automatically disables the use of Direct IO when the database file resides on a file system not supporting it. In such cases

an informational message will be sent to the server console and/or log file indicating that DirectIO has been disabled for that file.

456757 When passing an uninitialized or NULL parameter,a SQL Anywhere SOAP client procedure (or function) would have serialized the parameter as an empty XML element. This has been fixed so that a NULL parameter is no longer serialized within the request SOAP envelope.
456783 When the DEFAULT clause specified a character string for a column in a CREATE or ALTER table statement, and the length of that character string exceeds 126 characters, the characters string was truncated to 125 characters, instead of 126 characters. This has been corrected.
456826 Attempting to modify a column immediately after viewing a table's data would have caused the error message "A schema upgrade is not currently allowed." The plug-in was neglecting to close the result set which provided the data for the "Data" tab when it was deselected. This has been fixed.
456829 When using Server-Initiated Synchronization, the server could have failed with a java.lang.OutOfMemoryError exception due to Java heap memory exhaustion. This would have occurred after many notifications. This is now fixed.
456835 If an Agent Rule file had a custom schedule, it was not parsed completely by the QAnywhere plug-in and would have been displayed incorrectly. This has been fixed.
456856 If a rule had a custom schedule, and the schedule contained start and end times, the rule was misread by the QAnywhere pplug-in and displayed with an end time equal to the start time. This has been fixed.
456867 The QAnywhere Plug-in could have reported an internal error when attempting to delete a message from a client message store after the database connection had been lost. This has been fixed.
456868 When Mobilink was synchronizing data to a multi-byte Microsoft SQL Server database, it was possible for the ODBC Driver to fail and return an "Unspecified Error". The connection to the Microsoft SQL Server would have been dropped, and the synchronization would have failed. The problem was in the Microsoft SQL Server ODBC driver, and a workaround has been implemented in the Mobilink Server to avoid it.
456873 Change made to the Interactive SQL utility for Engineering Case 443671 to improve the performance of displaying blob data from SA database, caused an error from the ODBC Driver

Manager when displaying blob data from the UltraLite databases. The problem was seen when displaying the contents of a non-empty blob column. No data is returned, and DBISQL would have displayed the following Driver Manager error (SQLSTATE HY009):

[Microsoft][ODBC Driver Manager] Invalid argument value

This has now been fixed.

456875 The SQL Anywhere Explorer was not reading the correct Windows registry entry for the language setting, as created by Language Selection utility (dblang). This has been fixed.
456885 The Add Connection dialog did not close when the ESC key was pressed. This has been fixed.
460670 Visual Studio 2005 checks the property SADataConnectionProperties.IsComplete to determine if the OK button should be enabled or disabled. The provider was not correctly setting this property in some cases. It has now been fixed by setting the property SADataConnectionProperties.IsComplete to TRUE, if both user id and password are entered by the user.
460700 Queries that scanned backwards through an index could have produced too few rows in the result set. This would only have happened if the index contained a long value. Note that prefetching can be a cause of backwards scans. This has now been fixed.
460712 Using the server command line option -dt "set directory for temporary files" on a Unix systems did not actually set the directory. Furthermore, under most common scenarios, the server would have failed to start if this switch was specified. This has been fixed so that the -dt option now correctly sets the directory where the server puts its temporary files.
460718 The Listener used by MobiLink Server-Intitated Synchronization uses a tracking database to store information. A new command line option -z has been added to the Listener utility (dblsn) to allow specifying a non-default location for the temporary tracking database. The -z option takes the location of the tracking database as a parameter.

For example,

dblsn -z "c:\program files\tracker\"...

460745 As of the release of SQL Anywhere 10.0, synchronization concurrency was reduced. In particular, other threads and processes were blocked from entering the UltraLite runtime during upload, and while waiting for MobiLink to create the download. This has been fixed.
460762 SOAP parameters passed as empty XML elements, eg. <an_empty></an_empty> were incorrectly being treated internally as NULL parameters within a SQL Anywhere SOAP service. This has been fixed. A null parameter may be expressed by not including the given parameter element within the SOAP request, or by providing it with a nil="true" attribute, eg <a_null xsi:nil="true" />.

SQL Anywhere SOAP services with FORMAT 'XML' or FORMAT 'CONCRETE' no longer return NULL column values as empty XML elements. Empty XML elements are only returned for VARCHAR data types in order to preserve the empty string symantics. This change, along with Engineering case 455350, synchronizes the behaviour for all SOAP service formats.

460829 If a column is declared as "default timestamp" or "default utc timestamp", then the timestamp values generated by the server should be unique for each row inserted or updated. This was not the case; the same value could have been shared for multiple rows affected by an INSERT or UPDATE statement. This has been fixed.
460830 Comparisons using UPPER(), LOWER(), UCASE(), or LCASE() could have given incorrect results, equivalent to not using the function at all.

For example, consider a database with the UTF8BIN NCHAR collation and 125LATIN1 CHAR collation:

create table TChar( x int primary key, c char(1), n nchar(1) );

insert into TChar values( 1, nchar(199), nchar(199) );

insert into TChar values( 2, nchar(231), nchar(231) );

commit

The following query should return one row:

select T1.x, T2.x

from TChar T1, TChar T2

where upper( T1.c ) = T2.n

and T1.x <> T2.x

but would have incorrectly returned no rows; this was equivalent to removing the upper() function.

This has been fixed, altough in cases where it is safe to do so, the functions UPPER(), LOWER(), UCASE() and LCASE() are still removed.

460861 Servers involved in a high-availability system were not able to use TLS encryption on connections to each other. This has been fixed.

Note that client connections to a high-availability server were not a problem, they are able use TLS.

460873 The server could have crashed when stopping a database. This problem would only have happened when a database was shutdown immediately after a transaction had ended, and then only rarely. This has been fixed.
460895 Deploying a model, or checking MobiLink System Setup, with a case sensitive Microsoft SQL Server database, could have failed with the following error:

A SQL error occured when trying to check for Mobilink system setup in the consolidated

database. [Microsoft][SQL Native Client][SQL Server]The multi-part identifier "O.ID"

could not be found

This has been fixed.

460905 When creating or modifying an event schedule, the component used to specify the event recurrence on specific days of the week would always have used Sunday as the first day of the week. This has been corrected so that the current locale is checked to determine which day should be used for the first day of the week. For example, in French, German, Chinese and Japanese locales, the first day of the week is Monday.
460942 Table names exceeding 128 characters were not handled correctly. In particular, they were being improperly trunctated, allowing duplicate tables with the same apparent name to be created. Such table names are now diagnosed as syntax errors.
461027 If an application, connected using the iAnywhere JDBC driver, started a request and then attempted to close the connection on a separate thread, it was very likely that the application would have crashed. This problem was most easily reproduced in Sybase Central when a profiling session was cancelled, and an attempts was made to go back to design mode. The problem has now been fixed.
461036 When referencing a proxy table to a remote database with a multi-byte character set, table or column names that had multi-byte characters could have been passed to the remote server mangled. For identifiers in the multi-byte Character set, the server may have incorrectly escaped certain characters and/or changed the case. This problem has been fixed.
461052 When comparing a VARBIT or LONG VARBIT value to a value of another domain, both arguments were converted to NUMERIC and then compared.

For example:

select row_num, cast( cast( row_num as tinyint ) as varbit ) vb

from sa_rowgenerator(0,10)

where vb >= '00000100'

The above query would have returned the empty set; vb would have been converted to NUMERIC and compared to CAST('00000100' AS NUMERIC)==100. This has been fixed. Now, both arguments are converted to LONG VARBIT and compared as bit strings. The above query will now return the following:

row_num,vb

4,'00000100'

5,'00000101'

6,'00000110'

7,'00000111'

8,'00001000'

9,'00001001'

10,'00001010'

Further, when bit string values were displayed in plan text, they were displayed as a hexadecimal string that did not have a clear relationship to the bitstring value. For example, the bit string CAST( '00000100' AS VARBIT ) was previously displayed as 0x080000000100000004000000 in the plan text. Now, bit string values are displayed in the plan text as a string literal prefixed with B (for example, B'00001010'). The B prefix distinguishes bit strings in the plan text from character strings.

461054 The ASCII function would have returned an incorrect value when passed a zero-length string as an argument. This has been corrected.
461056 If an assignment statement contained a concatenation operator, it was possible for the assignment to modify the value of an unrelated variable.

For example:

begin

declare @x long varchar;

declare @y long varchar;

set @x = 'abc';

set @y = @x;

set @y = @y || 'z';

end

It was possible for the variable @x to be incorrectly modified to be 'abcz'. In order for this problem to have occurred, the concatenation must have been of the form:

set @var = @var || 'string';

for some variable @var, and further, the variable @var must have shared the same string value as another variable. In cases where the problem may have occurred, it would occur intermittently depending on the current server state. It has now been fixed.

461064 Calling a proxy function or procedure, where the remote server was MicoSoft SQL Server, would not always have returned the proper return or output parameter values. This problem has been fixed.
461144 The server will no longer start if a license file cannot be found. The error message "License file could not be found" will now be displayed.

Rather than looking for fixed filenames "dbeng10.lic", "dbsrv10.lic", etc, the server now looks for a ".lic" file that has the same base filename as the executable that is being run. For example, if dbeng10.exe has been renamed to be "mydb.exe", the server will now look for the file "mydb.lic".

461154 The server could have crashed when under heavy load, and issuing (and possibly cancelling) a large number of external calls. These could have been external function calls, HTTP client procedures, RPC calls to remote servers, or Java requests. A race condition in the server has been corrected.
461155 If an error occurred while an UltraLIte .Net application was closing a connection to the database connection, the engine could have hung. This has been fixed.
461161 Opening the Connected User property sheet for a connection that no longer existed and clicking the Extended Information tab, would have caused Sybase Central to crash. This has been fixed.
461162 If the QAnywhere Agent was started with a client ID of 128 characters or more, the actual ID would have been changed to an empty string. This has been fixed.

The QAnywhere Agent will not start if the client ID is more than 120 characters long. The maximum length for a QAnywhere client ID is now 120 characters. This is because the maximum length of dblsn user names is 128, and qaagent forms a dblsn user name as "ias_<client-id>_lsn".

461164 The SNMP agent could have crashed when dynamic traps were fired. This has been fixed.
461166 Messages sent by the system procedure xp_sendmail could have had mangled non-ASCII characters, both in the body and the subject of the message. This only would have occurred when using a session started with xp_startsmtp, not with xp_startmail. The problem wasn't that xp_sendmail was corrupting the message, but that it wasn't specifying the character set that message was encoded in. Now xp_sendmail specifies the correct encoding, in this case the OS character set.
461181 The syntax highlighter would have displayed SQL code with incorrect coloring. The problem was confined to the text following a constant string, where the string included a backslash immediately before the string's closing quotation mark. This has been fixed.
461185 Executing a query with a dotted reference, with the dotted reference having less than four fields, would likely have caused the server to crash, instead of returning an error if one of the fields was empty. Note that for the query to crash the server, the table being referenced in the dotted reference must be a proxy table. This problem has now been fixed and a proper error message is now returned.
461274 If connection parameters passed to the Unload utility using the -c or -ac command line options failed to parse, it would have shutdown without displaying any error message. This has been fixed.
461282 The 32 bit version of the dbisqlc utility would not run on the PA-RISC version of HP-UX

11i v3 (version 11.31) as it required the deprecated library libcur_colr. This requirement for this library has been removed.

461288 Ater selecting a user in the tree and then selecting the Memberships tab, attempting to change a group in the Memberships tab to a user would have caused Sybase Central to crash. This has been fixed.
461299 When using the Unload utility dbunload and doing an external unload of a database to files (i.e., using -xx or -xi and specifying an unload directory) on a system with a multi-byte OS charset, then the unloaded character data could have been inconsistently encoded, or incorrectly unloaded. For this problem to have occurred, a connection charset of something other than the OS charset must have been specified. Fr data to be incorrectly unloaded, t specified charset needed to be one of Windows-31j (sjis/cp932), GBK (cp936), GB18030, cp950, big5-hkscs, or cp949, and the character data needed to contain the value 0x5c (i.e. an ASCII backslash) as a follow-byte. Otherwise, the unloaded data may just have been inconsistently encoded into hex (i.e., some bytes encoded as '\xDD', and other bytes left as is) characters. While the 10.x fix addresses this problem for any unload connection charset, the fix for earlier versions addresses this problem only when the specified connection charset is either the OS or the database charset.

It is generally recommended that the database charset be used for unloading as it avoids both the overhead of unnecessary charset conversion and potentially lossy conversions.

461314 The size and position of some user interface controls have been adjusted, as they were not displaying properly for applications run on Windows Vista.
461407 Under some specific conditions, if a trigger used row variables that were defined to be NUMERIC, DECIMAL or a string type, then the server could have crashed, or reported an assertion failure. This has been fixed.
461408 When run on Unix systems, the server could have hung when under heavy load and diagnostic tracing was enabled. Although likely very rare, this problem has been fixed.
461436 Windows Mobile Device Center (the Windows Vista replacement for ActiveSync) would have reported an unhandled exception when the MobiLink provider's Options dialog was closed. This has been fixed.
461547 If a sargable IN list predicate can be used for a partial index scan of a unique index, the optimizer was incorrectly choosing the unique index, without costing other indexes or sequential scan alternatives. This exclusion of other indexes may have resulted in an inefficient plan being used for the query. This has been fixed so that the optimizer will cost all available indexes and the sequential scan for cases where IN list predicates are present.

For example, the query below had always, before this fix, the plan T<c1> which may be inefficient for some instances of the table T.

create table T (c1 int primary key );

.....

select count(*) from T where T.c1 IN (1,2,3,4,5,6,7,8,9);

461574 If an application that was connected to the utility database via ODBC, executed "select @@server" and bound the resulting string as a WCHAR, there was a chance that the length of the string returned would have been incorrect. This problem only appeared if the server was running on a mult-byte character set system and the servername being fetched was a string of multi-byte characters. The problem has now been fixed.

Note that the problem did not happen if the application connected to a real database, instead of the utility database.

461578 If a jConnect application connected to the utility database, then jConnect always chose iso_1 as the character set, even if the server was using a multi-byte character set. This problem has now been fixed and jConnect now uses the same character set as the server.
461591 Executing a query referencing proxy tables, that contains a subquery which involved MANY unions, could have caused the server to have crashed. This problem has been fixed.
461688 The Deployment Wizard was not including the utility for unloading database files created with versions earlier than 10.0.0 (dbunlspt.exe and associated files). These files will now be included by selecting the new "Unload Support for pre 10.0 databases" feature which has been added under "SQL Anywhere Server\Database Tools" in the Deployment Wizard.
461699 When using the Unload Database wizard and browsing for a non-running database file, a Save dialog would have been displayed. This has been fixed so that now an Open dialog is shown.
461712 On older versions of Windows NT the install could have failed to load a required dll with a message like: "Unable to load install support DLL (dbinst.dll)...". This has been fixed.
461732 If the Allow_nulls_by_default option was set to 'off', the Unload utility would have failed to unload the database. The error reported was:

Column 'first_pkcol' in table 'sa_unloaded_table' cannot be NULL

This has been fixed. A workaround is to set the option to 'on' prior to unloading the database.

461829 If a table in the tree was selected, the Data tab in the right pane was clicked, and then the white space below all rows was right-clicked, then the Add Row, Edit Row, Delete Row, Update and Cancel menu items would not have been displayed in the popup menu. This has been fixed.
461846 It was possible for QAnywhere applications to get into a state where calls to GetQueueDepth would have taken an usually long time to return, and eventually have thrown a QAException "error getting queue depth". If a device crashed, or was powered off while the QAnywhere Agent was marking messages to be uploaded, a flag was left set that GetQueueDepth checked. This problem has been fixed by adding code to reset the flag in appropriate circumstances.
461875 The Redirector would have failed to initialize on Unix systems when synchronizing over HTTPS to a backend server. This problem did not affect clients using HTTPS to a web server and HTTP to a backend server. Error messages such as the following would have appeared in the web server log:

... mod_iaredirect: Error creating stream, code: 224, system code: 0

... mod_iaredirect: failed to initialize stream..

Note: The above error messages are an example of what would have appeared in an Apache redirector log. Similar messages would have appeared in the log for iPlanet or M-Business Anywhere.

This has been fixed.

461878 When a CREATE DATABASE statement was executed, the DATABASE SIZE option would have been silently ignored if the units (e.g., BYTES, PAGES, etc) were omitted. This has been corrected so that a CREATE DATABASE statement will now fail with a syntax error if the units for DATABASE SIZE are omitted.
461882 First mnemonic was broken in the MobiLink Server options tab of the Deploy Sync Model Wizard. This has been fixed.
461978 Unloading a database into a new or existing database, or upgrading a database, could have resulted in Sybase Central crashing. This problem was more likely to have occurred when run on Windows Vista. This has been fixed.
461985 The UNICODE function would always have returned NULL when the first byte of the string parameter was a single-byte UTF8 character (ie, in the ASCII range of 0x00 to 0x7f). This has been fixed so that it now returns the correct UNICODE codepoint.
461990 When unloading the DBLIB client library, or the ODBC or OLEDB drivers on Windows Vista, could have caused the client application to crash. This problem has been fixed.
461999 The United State has extended Daylight Saving Time (DST) by 4 weeks in the U.S. time zones that recognize DST. Starting in 2007, Daylight Saving Time will begin the second Sunday in March (2am, March 11, 3 weeks earlier than previous years) and will end the first Sunday in November (November 14, 2am, 1 week later than previous years). SQL Anywhere software is not directly vulnerable to issues related to this change, but users of Java logic may need to update their run-time environments.

For more details, see:

http://www.ianywhere.com/developer/technotes/sa_daylight_savings_time_change.html

462000 The SAParameterCollection.AddWithValue method was not implemented. It has now been added. The SAParameterCollection.AddWithValue method replaces the SAParameterCollection.Add method that takes a String and a Object. The overload of Add that takes a string and an object was deprecated because of possible ambiguity with the SAParameterCollection.Add overload that takes a String and a SADbType enumeration value where passing an integer with the string could be interpreted as being either the parameter value or the corresponding SADbType value. Use AddWithValue whenever there is a need to add a parameter by specifying its name and value.
462017 After dropping the primary key from a table, the optimizer could have failed to recognize that values in the column were no longer necessarily unique. While rare, this could have lead to a poor execution plan. This has been fixed.
462019 A database mirroring server acting as a mirror could have failed to copy a transaction log page from the primary server. Although rare, the problem would have occurred, and been detected, as the mirror server was starting. When this happened, the server would have reported that the transaction log was corrupt. This has been fixed.

As a workaround, connect to the primary server, insert a row into an existing table, and roll back the transaction. Then copy the transaction log to the mirror server. The mirror server should now start.

462026 In a database mirroring environment, if a connection was modifying the database when the mirror server became unavailable, the connection could have seen a "communication error" even though the presence of an arbiter allowed the primary server to stay up. No error should have been reported. The connection remains active. This has been fixed.
462028 On Windows XP or Vista, when launching DBISQL while its Fast Launcher was running, the application window may have failed to appear. This has been fixed.
462029 The United State has extended Daylight Saving Time (DST) by 4 weeks in the U.S. time zones that recognize DST. Starting in 2007, Daylight Saving Time will begin the second Sunday in March (2am, March 11, 3 weeks earlier than previous years) and will end the first Sunday in November (November 14, 2am, 1 week later than previous years). SQL Anywhere software is not directly vulnerable to issues related to this change. SQL Anywhere 10.0.1 includes Java Runtime Environment 1.5.0_10 (5.0_u10), which includes changes to resolve issues associated with the new DST rules.

For more details, see:

http://www.ianywhere.com/developer/technotes/sa_daylight_savings_time_change.html

462145 When running on multi-processor systems, the server could have exhusted all the cache, causing it to fail with a dynamic memory exhausted error. This has now been fixed.
462154 On Windows XP or Vista, when launching Sybase Central while its Fast Launcher was running, the application window may have failed to appear. This has been fixed.
462179 When the server name contained multibyte characters, and the OS character was different than the database character set, the result returned by the server properties 'Commandline' and 'OmniIdentifier' could have been mangled. These properties were being maintained in the OS character set, and needed to be converted to the database character set before being returned by the property function. The server was not doing this, now it does.
462181 The Unload utility (dbunload) required table names used in the -t and -e options to be case sensitive in case sensitive databases. This has been corrected so that the table names are now case insensitive.
462182 The server could have failed assertion 201117 "attempt to close a file marked as dirty" on shutdown. For this to have occurred, the option 'allow_snapshot_isolation' must have been 'on', and a column containing a blob must have been updated shortly before shutdown. The problem is now fixed.

Note that the assertion does not indicate corruption and can be safely ignored.

462186 Changing a table mapping in a synchronization model to upload-only, after it had previously had logical delete tracking enabled, would have caused the generated upload scripts to incorrectly refer to the logical delete column, leading to upload errors. Delete tracking is only set up for table mappings with downloads, since it is not needed for upload-only table mappings. This has been fixed.
462291 The MobiLink File Transfer utility (mlfiletransfer) was accepting an empty string as a valid script version (e.g. mlfiletransfer -v "" ...). This has been fixed. The empty string is now rejected, just as if no script version was supplied at all.

Note, this fix also applies to the MLFileTransfer and ULFileTransfer methods in the various UltraLite interfaces.

462299 If client statement caching was disabled for a connection by setting the option Max_client_statements_cached to 0, then prepared statements on this connection could still have used resources after the application had dropped them. Statements would have been correctly dropped and re-prepared if the application prepared the same statement again. This has been fixed so that if client statement caching is disabled, the resources for a statement will now be released when the application drops the statement.
462307 The setting for the option Sort_collation was not used when ordering NCHAR, NVARCHAR or LONG NVARCHAR values. This has been fixed.

Note, if a materialized view was created with NCHAR values, this change may alter the results of the materialized view. Such views should be recomputed after this change is applied.

462311 A database may become corrupted when it is moved from a big to little-endian platform, and vice versa, and run with a server without this fix. This problem may manifest itself with a number of different symptoms, including but not limited to: the server crashing or asserting when executing a request, failing to start the affected database, or the database failing validation. The problem is more likely to be seen with servers running "large" databases, such as those with many tables, or with many large values, such as blobs. It may also appear if the database has indexes containing long values or a large number of columns.

If a database was created and started only on architectures with the same endian (i.e., byte-ordering), then the corruption will not appear, and no immediate action needs to be taken. However, if at some point during its history it had been started on platforms with a different byte-ordering, then it may potentially be corrupt.

This problem was caused by incorrect reads and writes to a small set of database page types. Due to the nature of the problem, it is not feasible to update or correct the affected pages of existing databases in-situ. Instead, this fix allows detection of databases that either may be corrupt or that cannot be started on a particular platform, because doing so may cause corruption. It also fixes the problem in newly created 10.0.1 databases, and optionally in new 10.0.0 databases.

Description of the Changes

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

Databases created with version 10.0.1 are not susceptible to this issue and may be freely moved between platforms with different byte-orderings. These databases are created with a new database "capability bit", which means that they cannot be started by 10.0.0 servers that do not have this fix. All databases with the capability bit can be moved between platforms without restriction. A new database property has been added so that it can be determined whether or not a database has the capability:

SELECT db_property(慔asEndianSwapFix�)

If a database does not have this capability, both the 10.0.1 or 10.0.0 servers may still be able to start it depending on what platforms it had been created or previously started on. The server will perform the following actions when it starts a database without this capability:

1) If the history of a database (determined via the SYSHISTORY catalog table) indicates that it has been created or started only on platforms with the same endian as the current platform, then the database will start normally.

2) If the database has been created and started exclusively on platforms of one endian, and a start is attempted on a platform of the other endian, then the start will fail with the SQL error SQLSTATE 08W99, SQLE_DATABASE_ENDIAN_FAILURE. The text of the message is:

揇atabase '%1' cannot be started on this platform. See http://ianywhere.com/developer/product_manuals/sqlanywhere/notes/en/endian_cant_change_platform.html�

If this error is received, the database should be moved back to a platform with its 搊riginal� byte-ordering. It can then be started normally, or rebuilt so that it may be moved to a new platform.

3) If the history indicates that it has been created and/or started on platforms with mixed byte-orderings, then the server will fail to start it with the SQL error SQLSTATE 08W98, SQLE_POSSIBLE_DATABASE_CORRUPTION. The text of the message is:

揇atabase '%1' cannot be started on this platform. See http://ianywhere.com/developer/product_manuals/sqlanywhere/notes/en/endian_corruption_warning.html�

10.0.1 Specific Changes

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

1) If this error described by 3) is received, then the database cannot be started normally on either a big- or a little-endian platform as it may be corrupt.

Since rebuilding the database is the only option, a new command line switch, "-hR" is provided to allow the server to start the database for the purpose of unloading or rebuilding it. The "-hR" switch causes the database to be started in a "read-only" mode, disabling features that may attempt to access the potentially corrupted pages. Once started in this mode, all modifications to the database, including inserts, updates and DDL are disallowed.

2) If a 10.0.0 database without the capability bit has been created and only ever started on little-endian platforms, then it will not be corrupt. In this circumstance, assuming the database is running on a little-endian platform, the capability bit may be turned on by upgrading the database (i.e., running dbungrad). After the upgrade completes successfully the database may be moved across platforms without restriction.

10.0.0 Changes

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

1) By default, databases created by 10.0.0 servers with this fix will NOT have the capability turned on. However, if required, databases with the fix may be explicitly created. The CREATE DATABASE statement has been extended to support the new clause:

CREATE DATABASE ... CAPABILITY 'DatabaseEndianFix'

2) A 10.0.0 server with this fix is able to recognize and start databases with the capability. If the server does not have the fix then it will not be able to start these databases, failing with the following error:

"Unable to start specified database: '<DB name>' must be upgraded to start with this server (capability 50 missing)"

Other Information

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

Currently supported SA big-endian platforms include:

- AIX (PowerPC)

- Solaris SPARC

- HP Itanium and HP PARISC

Currently supported SA little-endian platforms include:

- All Windows platforms, including X86, Itanium and CE

- All Linux platforms

- Solaris X86

- Mac X86

462319 If an UPDATE statement specified a VERIFY clause that contained a string or numeric (decimal) value, the server could have crashed under some conditions. It was also possible that the wrong set of rows could have been updated, or they could have been updated to incorrect values. This has now been corrected.
462322 Under very rare conditions the server could have crashed if it was unable to start a database. This has been fixed.
462328 Opening a UTF-8 UltraLite database with dbisql, or Sybase Central and the UltraLite plugin, that had a name with certain UNICODE encodings on a Multi-byte Character Set Windows system, could have resulted in the database name being mangled in the title bar. This has been fixed.
462332 It was possible to create a foreign key between two global temporary tables, where one was shared and the other was not. This is no longer allowed. A foreign key can be created between global temporary tables now only if both are shared, or neither are shared.
462362 The Unload wizard could still have tried to connect, even if there was a failure. If the failure was ignored and the user clicked on Finish again, Sybase Central could have crashed. This was most likely to have occurred if unloading from a currently connected database. This problem may also have occurred with other wizards. These problems have been fixed.
462446 The Interactive SQL utility could have reported an out-of-memory error when executing some large .SQL files or statements, which contained Transact-SQL CREATE PROCEDURE or IF statements. This has been fixed.
462447 If an HTTP request was made to the server, and then subsequently the Java VM was loaded, then it was very likely that the server would have hung on shut down. This problem has been fixed.
462449 Large, non-persistent HTTP synchronizations through a server or proxy, requiring digest HTTP authentication, would have failed if the session timed-out and a new session was initiated by the server or proxy. This has been fixed.
462453 The UltraLite utilities and UltraLite ODBC driver share the SQL Anywhere resource files for database error message strings. These messages were always in English, even when another locale was set with dblang. The SQL Anywhere resource files were not properly loading for error messages, only the English resources were being loaded. This has been corrected.
462463 When executing a wide insert into a proxy table, the statement could have failed to insert rows beyond the first row, returning a "-308 Connection terminated" or "-85 Communications error" error code. This has been fixed.
462471 The MobiLink server will no longer start if a license file cannot be found. The error message "License file could not be found" will be displayed.

Rather than looking for fixed filenames, the MobiLink server now looks for a ".lic" file that has the same base filename as the executable that is being run.

462482 It was possible for stored procedures to be unloaded in the wrong order when using the Unload or Extraction utilities. In situation where an outer procedure called an inner procedure, and the inner procedure returned a result set, if the outer procedure was created first, then calling the outer procedure would have resulted in the error 'Result set not permitted in InnerProcedure'. The problem has now been fixed. It's important to note that this fix only addresses situations where calling the outer procedure does not result in an error on the original database, but an error is returned when called on the newly rebuilt or extracted database. If the error is occurring on the original database, then dropping and recreating the outer procedure should fix the problem.
462516 The server may have failed to detect that a corrupt database page was read from disk, and not stopped with an assertion failure. This has been corrected.
462595 If a TDS connection had already reached the maximum number of prepared statements allowed, as defined by the Max_statement_count option, and then received a language request, the server may have crashed instead of failing the request with SQLCODE -685 "Resource governor exceeded". This has been fixed.
462634 Executing a CREATE VIEW statement could have failed with:

"*** ERROR *** Assertion failed: 102600 Error building EXISTS subquery

if complex constrains existed on the tables referenced in the view definition. This has been fixed.

For example:

create table T1 ( a int )

create publication Pub1 ( table T1 (a) where not exists ( select 1 from dummy ) )

The following statement would have failed:

create view V1 as select * from T1

462642 Queries involving 'long varchar' or 'long binary' columns, containing both null and non-null values, and a temp table, could have caused a crashed in UltraLite, signaled an error, or produced incorrect results for the 'long' columns. This has now been fixed.
462661 If a user was granted BACKUP or VALIDATE authority, this authority would have been lost after rebuilding the database using the Unload utility. This has been fixed.
462673 The Unload Database and Extract Database wizards did not ensure that a new database file name was specified when unloading or extracting into a new database. Failure to specify a new database file name would have caused the unload or extract operation to fail with the error: "Specified database is invalid". This has been fixed.
462754 The server could have hung, or failed with a 'page is invalid' (wrong page number, bad page type, etc), when run on a multi-processor system. This has been fixed.
462782 If MobiLink authentication failed, the MobiLink File Transfer utility (mlfiletransfer) would not have reported a useful error message. This has been corrected so that it will now report "MobiLink authentication failed". Also, the methods MLFileTransfer and ULFileTransfer will now return the stream error code STREAM_ERROR_AUTHENTICATION_FAILED.
462796 The ABS() function (absolute value of a numeric expression) did not properly handle integers with more than 30 digits. This has been corrected.
462899 When using the command line options -qw "do not display database server screen" or -qi "do not display database server tray icon", a number of messages that should have been logged to the -o output file were suppressed. This has now been corrected.
462903 The server could have reported assertion failures, a fatal error or crashed, when reading rows with certain characteristics. This would only have occurred if the row contained NCHAR data, or a column in the table was defined with CHARACTER-LENGTH SEMANTICS (such as a datatype of VARCHAR( N CHAR ) ). The problem could have occurred during querying the data, DML, or DDL. The data in the database file was correct. In order for the problem to occur, the column must have been declared to be one of the following:

- CHAR( N CHAR ) or VARCHAR( N CHAR )

- NCHAR( N ) or NVARCHAR(N)

where N <= 127 and (N * (max-bytes-per-char) > 127). This problem is now fixed and servers containing this fix will be able to properly read rows containing the aforementioned datatypes.

462912 When a QAnywhere application had an open QATransactionalManager, delete rules always failed in the QAnywhere Agent. The error from the database server when executing delete rules would have been: ** ERROR conn: 5 code: -210 "User 'DBA' has the row in 'ml_qa_global_props_client' locked". This has been fixed. Delete rules will now delete messages that satisfy the delete rules, skipping over messages that are in an open transaction.
462915 The ODBC PrefetchOnOpen optimization was disabled for queries which had input parameters. The PrefetchOnOpen optimization is disabled by default, and is enabled with the PrefetchOnOpen ODBC connection parameter. This has been changed so that the optimization is now enabled for queries which have input parameters if the ODBC PrefetchOnOpen connection parameter is used.
462939 In order to not miss conflicts, the upload_fetch and upload_fetch_column_conflict scripts need to prevent modification of the rows it has selected before they are updated. Previously, for SQL Anywhere consolidated databases, the upload_fetch and upload_fetch_column_conflict scripts generated for a model with conflict detection used the HOLDLOCK table hint. Now these scripts use the UPDLOCK table hint. For scripts deployed to a SQL file already, replace HOLDLOCK with WITH (UPDLOCK) in the upload_fetch and upload_fetch_column_conflict scripts.
462940 Setting ConnectionString could have caused a buffer overrun if the ConnectionString contained some very long connection parameters. In SAConnection.ParseConnectionString method, the managed code uses fixed statements to set pointers to managed variables, which were not being passed correctly to the native code. This problem has been fixed.
462945 When run on NetWare systems, unloading the server using the NetWare console (i.e. "UNLOAD DBSRV9") when there were still active connections to the server, may have caused the server to abend or hang. This has been fixed.
463059 The MobiLink server was not able to start with snapshot isolation against Microsoft SQL server running a case-sensitive database. The MobiLink server mistakenly used upper-case identifiers to build queries to access system tables when the consolidated database was running on Microsoft SQL server, which was a problem as identifiers are case-sensitive in a case-sensitive database on Microsoft SQL server. This has now been fixed.
463062 When a QAnywhere client that had previously synchronized with a MobiLink server, and whose message store was subsequently re-created, synchronized again with the MobiLink server, the error " -193 error Primary key for table 'ml_qa_global_props' is not unique" would have been reported in the MobiLink log. This has been corrected so that the QAnywhere client's message store properties are now upserted into the consolidated database. This fix is only for ASA consolidated databases.

Note that this works correctly for all supported consolidated databases in version 10.0.0 and later.

463074 In build 3461, the ECC transport-layer security protocol has changed to allow 10.0.x clients to connect version 9 servers. If only the server is updated to build 3461 or higher, 9.0.2 clients running older builds can continue to connect using ECC transport-layer security. However, if 9.0.2 clients are updated to build 3461 or higher, they can use ECC transport-layer security to connect to a 9.0.2 server only if the server is also running build 3461 or higher. In other words, the 9.0.2 server must be updated first.

For a 10.0.0 client to use ECC transport-layer security to connect to a 9.0.2 server, the 10.0.0 client must be running build 2816 or higher, and the 9.0.2 server must be running build 3461 or higher.

463081 The property DataReader.HasRows would have always returned True, whether there were actually rows in the dataReader or not. This problem has been fixed.
463091 If an index was created on a column of type VARBIT or LONG VARBIT, then the index would have incorrectly ordered some values.

For example, if x1 and x2 are two bit string values where x2 = x1 || repeat('0',N) for some N > 0 (so, x2 = x1 followed by some number of 0 bits), the proper order is therefore x1 < x2 because x2 is longer. If x2 has a multiple of 8 bits and x1 does not, then an index will incorrectly order x2 < x1.

create table TVarBit( pk long varbit primary key, nbits int );

insert into TVarBit select repeat('0', row_num), row_num from sa_rowgenerator(0,8);

select nbits, pk from TVarBit with(index(TVarBit)) order by pk;

nbits,pk

0,''

8,'00000000'

1,'0'

2,'00'

3,'000'

4,'0000'

5,'00000'

6,'000000'

7,'0000000'

The value '00000000' is incorrectly sorted before '0' if the index is used. If no index is used, the correct answer is given:

select nbits, pk from TVarBit with( no index ) order by pk;

nbits,pk

0,''

1,'0'

2,'00'

3,'000'

4,'0000'

5,'00000'

6,'000000'

7,'0000000'

8,'00000000'

This problem has been fixed. If a server with this fixed is used on a database that contains an index on a VARBIT or LONG VARBIT column, then the index will be reported as corrupt by VALIDATE TABLE, VALIDATE INDEX, sa_validate() or dbvalid. All such indexes should be rebuilt using the ALTER INDEX ... REBUILD statement. Any primary key indexes that contain VARBIT/LONG VARBIT should be rebuilt first, followed by other index types. Otherwise attempts to rebuild foreign keys could fail. For some structures of referential integrity, it may not be possible to rebuild the indexes in place and it may be necessary to drop and re-create them.

463170 If a query contained a left outer join with an index scan on the left hand side, then the query could have returned incorrect results on a refetch operation. This problem only occurred on refetch operations (e.g. fetch relative 0), and only when the data from the current row on the left hand side of the join had been modified or deleted since the original access.

For example:

create table R ( x integer primary key );

insert into R values (1);

insert into R values (2);

insert into R values (3);

create table T ( x integer primary key );

insert into T values (1);

insert into T values (3);

Connection A:

open crsr { select R.x, T.x from R ( with index( R ) ) left join T on R.x - T.x = 0 }

fetch crsr into x1, x2

=> returns (x1, x2) = (1, 1)

Connection B:

update R set x = 99 where x = 1

Connection A:

fetch crsr relative 0 into x1, x2

=> returns (x1, x2) = (3, 3), should be (2, NULL)

This problem has been fixed.

463174 Using pooled connections could have caused exceptions when used in multi-thread applications. This has been fixed.
463182 If an UPDATE or DELETE statement had a sufficiently simple structure, contained a WHERE clause identifying a single row by primary key, and had additional predicates comparing a string or numeric/decimal column to a value that was NULL, then the server could have crashed. This has been fixed.
463194 If a client failed to connect using ECC encryption to a version 9 or earlier server, the client could have written an error to the connection log saying that ECC encryption could not be used to connect to older servers, even if there was some other cause. This has been corrected, and this error will no longer appear.
463200 Users running systems in a Japanese locale where not able to do a check for updates from the admin tools. This restriction has now been removed.
463311 The server keeps track of the dependencies of a view on other views and tables. When the schema of a table or view is modified by a DDL statement, the server automatically recompiles any existing views that reference the table or view being modified. If a dependent view no longer compiles as a consequence of the schema modification of a referenced object, the dependent view is marked as invalid and is no longer available for queries. Once a view becomes invalid, the server prohibits it's definition from being modified by means of the ALTER VIEW statement, requiring the view to be dropped and recreated with a definition that can be successfully compiled. An example of this scenario is provided below:

create table t1 (c1 integer, c2 integer);

create view v1 as select c1, c2 from t1;

alter table t1 drop c1;

alter view v1 as select c2 from t1;

The server will now allow the use of the ALTER VIEW statement on an invalid view so that its definition can be corrected without having to drop the view first; or to disable it.

463318 On Windows CE, when starting a second server on the device, the window of the first server is normally displayed. This should not have been the case though when the first server was started with the command line options -qw and -qi to hide the window and the icon resectively. This has been corrected so that the first server's command line is honored and the first server's window is no longer displayed when attempting to start a second server on the device. Starting the second server will now fail silently in this instance.
463335 If two database mirroring servers were started simultaneously and both were capable of taking ownership of the database, a small delay in starting the server that was the previous owner could have resulted in both servers starting as primary servers.

Also, if a server acting as mirror was stopped and later restarted, the primary server may have failed to reconnect to the mirror. This may have resulted in the primary server not taking an appropriate action if the arbiter became unavailable.

Both of these problems have now been fixed.

463343 It was possible, although likely rare, for the server to have crashed while processing a query with a GROUP BY clause. This has been fixed.
463346 Under rare circumstances the server can crash while processing a query. This has been fixed.
463466 The ADO.Net provider could have thrown the exception 'Resource governor limit for prepared statements exceeded' if the application issued statements which contained multi-select statement.

For example:

BEGIN

DECLARE @MyConnectionId INTEGER;

DECLARE @MaxCount INTEGER;

DECLARE @Prepared INTEGER;

SELECT CONNECTION_PROPERTY ( 'prepstmt' ) into @Prepared;

SELECT number INTO @MyConnectionId FROM sa_conn_list(-1);

SELECT Value INTO @MaxCount FROM sa_conn_properties(@MyConnectionId) WHERE PropName='max_statement_count';

SELECT @MyConnectionId AS Id, @MaxCount AS MaxStatement, @Prepared as Prepared;

END

This problem has been fixed.

463517 On Windows CE devices, database corruption could have occurred due to a bug in Windows CE related to growing the database file. A change to the runtime to close and reopen the file after growing it has been implemented in an attempt to work around the problem.
463557 When the Evaluation Edition was selected, the titles of the Setup dialogs referenced "Developer Edition" instead of "Evaluation Edition". This has been fixed.
463586 If a Remote Data Access server was created for a remote database with a different charset than the local database, then it was possible that a string that fit in a char(n) or varchar(n) column on the remote would not have fit into a char(n) or varchar(n) column when inserted into a local table. The reason being that performing charset translation on the remote string would have yielded an equivelent string in the local database's charset, but the string would have required more space in the local charset. Unfortunately, the Remote Data Access layer was not raising an error or truncating the string in these instances. As a result, attempting to insert these remote strings into a local table would have generated a server assertion failure error. This problem has now been fixed and either a truncation error will be raised if the string_rtruncation option is on, or the Remote Data Access layer will silently truncate the string to the maximum number of whole characters that will fit if the string_rtruncation option off.
463589 Clicking the "Help" button on the "Add Watch" dialog would not have done anything. Now it correctly opens the online help for the dialog.
463598 The Create Database wizard would have chosen the wrong defaults for the case and accent sensitivity collation tailoring options for UCA collations if the database was being created on a Japanese machine, the server's character set was a Japanese character set, or a Japanese collation was selected for the new database's CHAR collation. This has been fixed.

--EOF--

  • 本文链接地址:http://www.dbainfo.net/sap-asa-cr-number-3.htm
  • 本文为dbainfo个人原创,请在尊重作者劳动成果的前提下进行转载;
  • 转载务必注明原始出处 : Sybase数据库技术,数据库恢复专家
  • 对《SAP SQL Anywhere的所有已知BUG列表(3)》有何疑问或见解,请在本文下方发表;
  • 对网站还有其他问题或建议,请提交在留言板,谢谢!
  • 目前还没有任何评论.
    :wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)