Changes in 20.3.17

The following changes were made in Oracle NoSQL Database Release 20.3.17 Enterprise Edition.

New Features

  1. Support Universally Unique Identifier.

    Added new SQL function random_uuid() which returns a randomly generated UUID, as a string of 36 characters.

    Added new option "AS UUID" for the STRING data type. The syntax is "STRING AS UUID". The input and output format of "STRING AS UUID" column must be UUID canonical format: 32 hexadecimal (base 16) digits, displayed in five groups separated by hyphens, in the form 8-4-4-4-12 for a total of 36 characters (32 hexadecimal characters and 4 hyphens).

    Added new option "GENERATED BY DEFAULT" for the "STRING AS UUID" data type. The syntax is STRING AS UUID GENERATED BY DEFAULT. The system automatically generates a value for the UUID column if the user does not supply a value for it.

  2. New client side cache of table metadata.

    Added a new client side cache of table metadata. This affects the various TableAPI.getTable() methods. The cache will improve performance of these methods by not requiring a remote call to the server for Table instances found in the cache.


Bug and Performance Fixes

  1. Fixed a problem that the Streams API may incorrectly pull a table with earliest version when it subscribes a new table. Instead, it should pull the table with latest or required version.

  2. Made the region name defined in the JSON configuration file required by the XRegion agent case-insensitive.

  3. Fixed a problem that the XRegion agent may fail to initialize the table when reading/writing internal info from/to the local store.

  4. Modified the default timeout of a subscription created by Streams API from 10 minutes to 30 seconds.

  5. Fixed a performance bug where, during the multi-region table transfer from a remote region, the table might be copied more than once.

  6. Fixed a problem where setting a mutable JE parameter for an Admin or an Arbiter Node did not have an effect unless the node was restarted explicitly.

  7. Modified the implementation of multi-region tables to create checkpoints when initializing tables. If XRegion Agent fails while it is copying the contents of a multi-region table from another region, the copy can resume from a checkpoint when the agent restarts, reducing the time needed to complete initialization.

  8. Plan locking has been changed to reduce failures due to concurrent plan execution. This change generally impacts system plans run by the Admin.

  9. Less strict indexing in case of typed JSON indexes.

    Currently, if a JSON field is indexed as double/float and a row to be inserted contains an integer/long on that field, that insertion raises an error. This is too strict. To fix, the integer/long value is cast to double/float and if the cast is lossless, the insertion succeeds.

  10. Made modifications to avoid a problem where Java RMI temporarily creates additional RenewClean threads. The additional threads were being created in both Replication Nodes and clients.

  11. Fixed problems with the KVStore.executeAsync() API. Previously, this API worked for very simple queries only. For other queries, it could cause crashes or infinite loops. The API now works for all queries.

  12. Some behavior of the SET LOCAL REGION DDL command has been changed. With the new behavior, the local region name cannot be changed if a multi-region table has been created. The one exception is if the store is upgraded from a version that did not support the local region name. In that case the local region name can be set once if multi-region tables exist. Lastly, though the local region name is case insensitive, case will be preserved.

  13. Fixed a problem where, if a sorting/grouping query used hints to force an index and the index was not a sorting one, generic order-by/group-by was not added to the query.

  14. Fixed a bug with queries that use multi-key index and aggregate function but no grouping expressions. A multi-key index can never be a sorting index. This rule was not taken into account when a query contained aggregate functions without any group-by clause. As a result, generic group by was not added as required.

  15. In previous releases, the integration of Oracle NoSQL Database with Apache Hadoop MapReduce, Apache Hive, and Oracle Big Data SQL was documented via javadoc package summaries included with the separate example distribution. With this release, that information is now formally documented in the following publicly available user guides:
  16. The integration of Oracle NoSQL Database with Elasticsearch so that full text search queries can be performed on data stored in an Oracle NoSQL Database table is now formally documented in the following publicly available user guide:
  17. Fix problems that could cause calls made using the asynchronous table API (for example TableAPI.getAsync) on a secure store to fail if an authentication token could not be renewed and reauthentication was needed.

  18. Fixed a problem where adding an empty row to a table with an identity column would result in an exception: "IllegalArgumentException: Primary key is empty".

  19. Fixed a bug where "get kv" failed when used with multi-region tables.


Storage Engine Changes (JE 20.3)

  1. If the master in a replication group is about to fail with a DiskLimitException it will first check if there are any lagging replicas that are preventing it from from deleting logs. If a lagging replica is found, the master will break the connection with the replica, forcing the replica to reconnect and perform a NetworkRestore.

  2. Several fixes were made to Btree/data verification.

    • When an invalid LSN for an IN (as opposed to an LN) is discovered, the verifier is designed to abort verification of the current database and move to the next database. Previously, the verifier was not aborting verification properly and was reporting an internal exception (OperationVerifyException) along with potentially large numbers of NullPointerExceptions before moving on to the next database. These errors were logged and reported as VerifyError.Problem.RECORD_ACCESS_EXCEPTION. This has been fixed so verification does abort properly and these exceptions do not occur.
    • When verification is run via DbVerify, logging of individual problems is not enabled because the JE environment is read-only. To cause output to System.err, the java.util.logging.config.file JVM property may be set to the name of a file containing .Previously, because rate-limited logging is used by the verifier, when explicitly enabling logging as described above, only a small subset of the individual problems were logged. Now, rate-limited logging is disabled when DbVerify is used. This ensures that all problems are logged for debugging purposes, but may produce a large amount of output.
    • The javadoc for DbVerify, VerifyConfig and RateLimitingLogger has been improved.
  3. Fixed a bug that could cause DbVerify to report false VerifyError.Problem.DATABASE_ACCESS_EXCEPTION errors, and other utilities and programs that open the environment as read-only to report false EnvironmentFailureException.UNEXPECTED_STATE errors.

  4. CkptStart and CkptEnd log records will now be printed with a timestamp using UTC instead of the local time. This is the format used for all other log records.