Changes in 19.3.12

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

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.

  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.

  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.

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

  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.*")
  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.

  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.

  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
  4. Fixed bug where the sum() and seq_sum() functions would return 0, instead of NULL, if none of the input values were numeric.

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

  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.

  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.

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

  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.

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

  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.

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

  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.

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


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
  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.
  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.
  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]