Previous Next JavaScript must be enabled to correctly display this content

## Changes in 19.3.12

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

Topics

- New Features
- Bug and Performance Fixes
- Utility Changes

New Features

1. Added support for indexes that do not index `NULL` and non-existent values. This is an index property that can be specified in the index-creation DDL (the default is to index `NULL` and non-existent values). Such indexes may be useful when the data contain a lot of `NULL` and/or non-existent values on the indexed fields, because the time and space overhead of indexing is reduced. However, use of such indexes by queries is restricted. Specifically, they can be used only if for every indexed field, there is a sargable predicate on that field and the predicate in not `IS NULL` or `NOT EXISTS`.

   [#27486]

2. Modified operation and request count statistics to use long values to support stores with larger numbers of operations.

   Added some new JMX bean methods that return total counts as longs. In some cases, for large stores, counts could exceed 2^31, so these new methods are needed to return accurate values for these statistics. The old methods are maintained for compatibility and will return `Integer.MAX_VALUE` if the count gets too large.

   New methods on the `OperationMetrics` interface:

   - `getIntervalTotalOpsLong`
   - `getCumulativeTotalOpsLong`

   New methods on the `RepNodeMXBean` interface:

   - `getIntervalTotalOpsLong`
   - `getCumulativeTotalOpsLong`
   - `getMultiIntervalTotalOpsLong`
   - `getMultiIntervalTotalRequestsLong`
   - `getMultiCumulativeTotalOpsLong`
   - `getMultiCumulativeTotalRequestsLong`

   The new long values are also reported in .perf files, collector .csv files, and in JSON output.

   [#27517]

3. The Streams API now supports dynamically adding or removing subscribed tables to or from any running stream without needing to terminate and recreate the stream.

   [#27381]

4. Users can now use the "describe table" statement to describe the schema of a system table.

   [#27602]
5. Added the new built-in function `regex_like` to the query language. The function is used for string datatype regular expression pattern matching. For example, assume table "persons" has a string field "lastName". The following select statement will qualify records with a lastName starting with the letter "C".

       select * from persons where regex_like(lastName,"C.*")

   [#27396]
6. Removed all classes and interfaces from the `oracle.kv.avro` package, which had previously been deprecated. Applications that had been using Avro should be modified to use the table API. [#27387]

Bug and Performance Fixes

1. Fix a bug that caused key statistics to be collected more often than the specified collection period.

   [#27615]

2. Allow single-partition queries to use secondary indexes. In previous releases, if a query used a secondary index it would be sent to and executed at all the shards of the queried table. However, if the query also specifies a shard key in the `WHERE` clause, sending it to all the shards is wasteful, because the query will have results only in the partition corresponding to the shard key. To avoid such waste, previous releases would never choose a secondary index if the query specified a shard key (i.e., if it was a single-partition query). Furthermore, if a single-partition contained an `ORDER BY` or `GROUP BY` clause that required the use of a secondary index, the query would raise an error. The current release lifts these restrictions by allowing single-partition queries to use secondary indexes and be executed only in the partition corresponding to the specified shard key.

   [#27573]
3. `NOT EXISTS` predicates were not considered sargable before. Now they are. For example, assume table "persons" has a column "info" of type JSON, and there is an index on info.age. Then, the following query, which looks for persons that do not have any age information, can now use the index on info.age for efficient execution.

       select * from persons p where not exists p.info.age

   [#27489]

4. Fixed bug where the `sum()` and `seq_sum()` functions would return 0, instead of `NULL`, if none of the input values were numeric.

   [#27468]

5. Changed the `seq_count()` function to return `NULL` if any of its input items is `NULL`.

   [#27582]

6. Fixed a bug where `seq_min` and `seq_max` functions would not skip JSON null if it was the first value in the input sequence.

   [#27628]

7. Changed the way the `EXISTS` and `NOT EXISTS` operators behave when their input expression returns `NULL`. Before, `EXISTS` would return true and `NOT EXISTS` false. Now, they both return `NULL`, unless it is known that the input expression will always return at least one item; in the later case `EXISTS` returns true and `NOT EXISTS` returns false.

   [#27492]

8. Fixed a bug where a value-comparison predicate would be erroneously pushed to a multi-key field of an index.

   [#27491]

9. Fixed two bugs where the GeoJson functions would sometimes throw a `NullPointerException` if an argument is not a valid GeoJson object.

   [#27496] [#27508] [#27526]

10. Fixed a bug where the `geo_distance` function would return -1 instead of `NULL`.

    [#27546]

11. Fixed a bug where SN memory allocation check would sometimes produce misleading logging message.

    [#27524]

12. Modified the `plan migrate-sn` command to continue in the presence of failures if the `-force` flag is specified. Administrators can use this new behavior when migrating SNs from failed zones.

    [#27598]

13. Fix a problem encountered when processing string literals that contain the backslash character.

    [#27640]

14. Fix a bug where using bulk put API to load data to a table with identity type column, the identity column is not filled in value.

    [#27664]

15. Fix a bug where `min()`/`max()`, `seq_min()`/`seq_max()` of Timestamp values with precision less than 9 returns wrong fractional second.

    [#27662]

Utility Changes

1. Removed deprecated Admin CLI commands that supported Avro:
   - `ddl add-schema`
   - `ddl enable-schema`
   - `ddl disable-schema`
   - `table add-schema`
   - `put kv -json <schemaName>`
   - `get kv -json <schemaName>`
   - `aggregate kv`
   - `show schemas`
   [#27387]
2. Upgraded the `verify-data` plan with the following changes:
   - Made the `verify-data` plan asynchronous to avoid the timeout of RMI requests.
   - Added a feature to provide users a list of corrupt keys associated with the error messages as a part of the plan result.
   - Added two new flags, `-show-corrupt-files` and `-valid-time`. `-valid-time` specifies the amount of time for which an existing verification will be considered valid and not be rerun. The default is '10 minutes'. `-show-corrupt-files` specifies whether to show corrupt JE log files in the plan result. It is disabled by default.
   [#27216]
3. Updated InitialCapacityPlanning.xls (the capacity planning sheet) with the following changes:
   - Misc. cleanups to text and presentation.
   - JVM overheads are now accounted for explcitly when sizing memory requirements.
   - Simplified usage by eliminating explicit use of DbCacheSize.
   - Support for specifying one index along with the table.
   [#27550]
4. The Oracle NoSQL Database Hadoop and Hive integration classes can now be used in environments running CDH6 Hadoop and Hive.
5. A 'shaded' version of the `antlr4-runtime.jar` library is now shipped with this release; where the path prefix of each class specified in that library has been changed from the string `org/antlr` to `oracle/kv/shaded/org/antlr`. This has been done to avoid ClassLoader conflicts (typically manifested as a `NoClassDefFoundError`) when an application runs in an environment that depends on a different, incompatible version of that library; for example, various containers, Hadoop clusters, Hive clients, etc. In general, this will require no changes to current applications. The only case where a change in your application will be necessary is in the unlikely event that the classpath of your application includes the `antlr4-runtime.jar` library shipped in this release of Oracle NoSQL Database, rather than a version of `antlr4-runtime.jar` installed in the application's particular runtime environment. In that case, we urge you to change your application's classpath to reference your own instance of `antlr4-runtime.jar`; as the shaded version of `antlr4-runtime.jar` shipped with this product is considered private to Oracle NoSQL Database.

   [#27616] [#27126]