What's New

Feature Matrix

This chapter briefly describes the features added to each major version.

Architecture

System Architecture

The following is a feature matrix for system architecture.

Feature matrix for system architecture

Feature

1.x

2.x

3.1

3.2

20c.1

Shared Nothing Cluster

X

X

O

O

O

DA (Direct Attach)

O

O

O

O

O

JDBC DA (Direct Attach)

X

X

O

O

O

C/S (Client/Server) Dedicated

X

O

O

O

O

C/S (Client/Server) Shared

X

O

O

O

O

multi-process applications

O

O

O

O

O

multi-threaded applications

O

O

O

O

O

Linux platform

O

O

O

O

O

HP platform

X

O

O

O

O

AIX platform

X

O

O

O

O

Windows Client Platform

X

O

O

O

O

CDC(Change Data Capture) replication

X

O

O

O

O

CDC replication with log mirror

X

O

O

O

O

multi-level start up

X

O

O

O

O

parallel database loading

O

O

O

O

O

parallel index build

X

O

O

O

O

SQL plan cache

X

O

O

O

O

Storage Internal

The following is a feature matrix for storage internal.

Feature matrix for storage internal

Feature

1.x

2.x

3.1

3.2

20c.1

memory dictionary tablespace

O

O

O

O

O

memory data tablespace

O

O

O

O

O

memory undo tablespace

O

O

O

O

O

memory temporary tablespace

X

O

O

O

O

memory bitmap data segment

O

O

O

O

O

memory bitmap undo segment

O

O

O

O

O

memory bitmap instant segment

X

O

O

O

O

memory heap table

O

O

O

O

O

memory instant table

X

O

O

O

O

memory B-tree index

O

O

O

O

O

memory instant B-tree

X

O

O

O

O

memory instant hash

X

O

O

O

O

global secondary index

X

X

O

O

O

disk data tablespace

X

X

X

X

O

disk bitmap data segment

X

X

X

X

O

disk B-tree index

X

X

X

X

O

disk global secondary index

X

X

X

X

O

Transaction Control

The following is a feature matrix for transaction control.

Feature matrix for transaction control

Feature

1.x

2.x

3.1

3.2

20c.1

CDS(Concurrency Data Store) database mode

O

O

O

O

O

TDS(Transactional Data Store) database mode

O

O

O

O

O

read-only database

X

O

O

O

O

read/write database

O

O

O

O

O

flat transaction

O

O

O

O

O

distributed transaction

X

O

O

O

O

read-only transaction

X

O

O

O

O

read/write transaction

O

O

O

O

O

READ COMMITTED isolation level

O

O

O

O

O

SERIALIZABLE isolation level with SELECT FOR UPDATE

O

O

O

O

O

MVCC(Multi Version Concurrency Control)

O

O

O

O

O

multi-version read consistency

O

O

O

O

O

multi-statement consistent read

O

O

O

O

O

implicit lock for DML

O

O

O

O

O

writer don't blocks readers

O

O

O

O

O

row-level locking

O

O

O

O

O

deadlock detection

O

O

O

O

O

deadlock resolution

O

O

O

O

O

lock granularity

O

O

O

O

O

read lock

O

O

O

O

O

write lock

O

O

O

O

O

intention lock

O

O

O

O

O

WAL(Write Ahead Logging)

O

O

O

O

O

repeat history

O

O

O

O

O

restart recovery

O

O

O

O

O

circular logging

O

O

O

O

O

buffered logging

O

O

O

O

O

logging group

X

O

O

O

O

supplemental logging

X

O

O

O

O

mirrored logging

X

O

O

O

O

synchronous commit

O

O

O

O

O

asynchronous commit

O

O

O

O

O

grouped commit

O

O

O

O

O

total rollback

O

O

O

O

O

implicit statement rollback

O

O

O

O

O

savepoint management

X

O

O

O

O

Backup & Recovery

The following is a feature matrix for backup & recovery.

Feature matrix for backup & recovery

Feature

1.x

2.x

3.1

3.2

20c.1

off-line backup

O

O

O

O

O

on-line backup

X

O

O

O

O

full backup

X

O

O

O

O

incremental backup

X

O

O

O

O

complete recovery

O

O

O

O

O

incomplete recovery

X

O

O

O

O

auto instance recovery

O

O

O

O

O

tablespace recovery

X

O

O

O

O

file recovery

X

O

O

O

O

change tracking

X

X

X

X

O

Database Information

DICTIONARY_SCHEMA Schema

The following is a feature matrix for DICTIONARY_SCHEMA schema.

Feature matrix for DICTIONARY_SCHEMA schema

Family

Feature

1.x

2.x

3.1

3.2

20c.1

Views of ALL_family

ALL_ALL_TABLES

X

O

O

O

O

ALL_ARGUMENTS

X

X

O

O

O

ALL_CATALOG

X

O

O

O

O

ALL_CLUSTER_TABLES

X

X

O

O

O

ALL_COL_COMMENTS

X

O

O

O

O

ALL_COL_PLACE

X

X

O

X

X

ALL_COL_PRIVS

X

O

O

O

O

ALL_COL_PRIVS_MADE

X

O

O

O

O

ALL_COL_PRIVS_RECD

X

O

O

O

O

ALL_CONSTRAINTS

X

O

O

O

O

ALL_CONS_COLUMNS

X

O

O

O

O

ALL_DB_PRIVS

X

O

O

O

O

ALL_DB_PRIVS_MADE

X

O

O

O

O

ALL_DB_PRIVS_RECD

X

O

O

O

O

ALL_DEPENDENCIES

X

X

O

O

O

ALL_GLOBAL_SECONDARY_INDEXES

X

X

O

O

O

ALL_GSI_PLACE

X

X

O

O

O

ALL_INDEXES

X

O

O

O

O

ALL_IND_COLUMNS

X

O

O

O

O

ALL_IND_PLACE

X

X

O

O

O

ALL_NONSCHEMA_COMMENTS

X

O

O

O

O

ALL_OBJECTS

X

O

O

O

O

ALL_PACKAGE_PRIVS

X

X

X

X

O

ALL_PACKAGE_PRIV_MADE

X

X

X

X

O

ALL_PACKAGE_PRIV_RECD

X

X

X

X

O

ALL_PROCEDURES

X

X

O

O

O

ALL_PROC_PRIVS

X

X

O

O

O

ALL_PROC_PRIV_MADE

X

X

O

O

O

ALL_PROC_PRIV_RECD

X

X

O

O

O

ALL_SCHEMAS

X

O

O

O

O

ALL_SCHEMA_PATH

X

O

O

O

O

ALL_SCHEMA_PRIVS

X

O

O

O

O

ALL_SCHEMA_PRIVS_MADE

X

O

O

O

O

ALL_SCHEMA_PRIVS_RECD

X

O

O

O

O

ALL_SEQUENCES

X

O

O

O

O

ALL_SEQ_PRIVS

X

O

O

O

O

ALL_SEQ_PRIVS_MADE

X

O

O

O

O

ALL_SEQ_PRIVS_RECD

X

O

O

O

O

ALL_SHARD_KEY_COLUMNS

X

X

O

O

O

ALL_SOURCE

X

X

O

O

O

ALL_SYNONYMS

X

O

O

O

O

ALL_TABLES

X

O

O

O

O

ALL_TAB_COLS

X

O

O

O

O

ALL_TAB_COLUMNS

X

O

O

O

O

ALL_TAB_COMMENTS

X

O

O

O

O

ALL_TAB_IDENTITY_COLS

X

O

O

O

O

ALL_TAB_PLACE

X

X

X

O

O

ALL_TAB_SHARDS

X

X

O

O

O

ALL_TAB_PRIVS

X

O

O

O

O

ALL_TAB_PRIVS_MADE

X

O

O

O

O

ALL_TAB_PRIVS_RECD

X

O

O

O

O

ALL_TBS_PRIVS

X

O

O

O

O

ALL_TBS_PRIVS_MADE

X

O

O

O

O

ALL_TBS_PRIVS_RECD

X

O

O

O

O

ALL_USERS

X

O

O

O

O

ALL_VIEWS

X

O

O

O

O

Views of DBA_family

DBA_ALL_TABLES

X

O

O

O

O

DBA_ARGUMENTS

X

X

O

O

O

DBA_CATALOG

X

O

O

O

O

DBA_CLUSTER

X

X

O

O

O

DBA_CLUSTER_COMMENTS

X

X

O

O

O

DBA_CLUSTER_TABLES

X

X

O

O

O

DBA_COL_COMMENTS

X

O

O

O

O

DBA_COL_PLACE

X

X

O

X

X

DBA_COL_PRIVS

X

O

O

O

O

DBA_CONSTRAINTS

X

O

O

O

O

DBA_CONS_COLUMNS

X

O

O

O

O

DBA_DB_PRIVS

X

O

O

O

O

DBA_DEPENDENCIES

X

X

O

O

O

DBA_EXTENTS

X

O

O

O

O

DBA_GLOBAL_SECONDARY_INDEXES

X

X

O

O

O

DBA_GSI_PLACE

X

X

O

O

O

DBA_INDEXES

X

O

O

O

O

DBA_IND_COLUMNS

X

O

O

O

O

DBA_IND_PLACE

X

X

O

O

O

DBA_NONSCHEMA_COMMENTS

X

O

O

O

O

DBA_OBJECTS

X

O

O

O

O

DBA_PACKAGE_PRIVS

X

X

X

X

O

DBA_PROCEDURES

X

X

O

O

O

DBA_PROC_PRIVS

X

X

O

O

O

DBA_PROFILES

X

O

O

O

O

DBA_RECYCLEBIN

X

X

X

X

O

DBA_SCHEMAS

X

O

O

O

O

DBA_SCHEMA_PATH

X

O

O

O

O

DBA_SCHEMA_PRIVS

X

O

O

O

O

DBA_SEQUENCES

X

O

O

O

O

DBA_SEQ_PRIVS

X

O

O

O

O

DBA_SHARD_KEY_COLUMNS

X

X

O

O

O

DBA_SOURCE

X

X

O

O

O

DBA_STAT_SYSTEM

X

X

O

O

O

DBA_SYNONYMS

X

O

O

O

O

DBA_SYS_PRIVS

X

O

O

O

O

DBA_TABLES

X

O

O

O

O

DBA_TABLESPACES

X

O

O

O

O

DBA_TAB_COLS

X

O

O

O

O

DBA_TAB_COLUMNS

X

O

O

O

O

DBA_TAB_COMMENTS

X

O

O

O

O

DBA_TAB_IDENTITY_COLS

X

O

O

O

O

DBA_TAB_PLACE

X

X

O

O

O

DBA_TAB_PRIVS

X

O

O

O

O

DBA_TAB_SHARDS

X

X

O

O

O

DBA_TBS_PRIVS

X

O

O

O

O

DBA_USERS

X

O

O

O

O

DBA_VIEWS

X

O

O

O

O

Views of USER_family

USER_ALL_TABLES

X

O

O

O

O

USER_ARGUMENTS

X

X

O

O

O

USER_CATALOG

X

O

O

O

O

USER_CLUSTER_TABLES

X

X

O

O

O

USER_COL_COMMENTS

X

O

O

O

O

USER_COL_PLACE

X

X

O

X

X

USER_COL_PRIVS

X

O

O

O

O

USER_COL_PRIVS_MADE

X

O

O

O

O

USER_COL_PRIVS_RECD

X

O

O

O

O

USER_CONSTRAINTS

X

O

O

O

O

USER_CONS_COLUMNS

X

O

O

O

O

USER_DEPENDENCIES

X

X

O

O

O

USER_EXTENTS

X

O

O

O

O

USER_GLOBAL_SECONDARY_INDEXES

X

X

O

O

O

USER_GSI_PLACE

X

X

O

O

O

USER_INDEXES

X

O

O

O

O

USER_IND_COLUMNS

X

O

O

O

O

USER_IND_PLACE

X

X

O

O

O

USER_OBJECTS

X

O

O

O

O

USER_PACKAGE_PRIVS

X

X

X

X

O

USER_PACKAGE_PRIVS_MADE

X

X

X

X

O

USER_PACKAGE_PRIVS_RECD

X

X

X

X

O

USER_PROCEDURES

X

X

O

O

O

USER_PROC_PRIVS

X

X

O

O

O

USER_PROC_PRIVS_MADE

X

X

O

O

O

USER_PROC_PRIVS_RECD

X

X

O

O

O

USER_RECYCLEBIN

X

X

X

X

O

USER_SCHEMAS

X

O

O

O

O

USER_SCHEMA_PATH

X

O

O

O

O

USER_SCHEMA_PRIVS

X

O

O

O

O

USER_SCHEMA_PRIVS_MADE

X

O

O

O

O

USER_SCHEMA_PRIVS_RECD

X

O

O

O

O

USER_SEQUENCES

X

O

O

O

O

USER_SEQ_PRIVS

X

O

O

O

O

USER_SEQ_PRIVS_MADE

X

O

O

O

O

USER_SEQ_PRIVS_RECD

X

O

O

O

O

USER_SHARD_KEY_COLUMNS

X

X

O

O

O

USER_SOURCE

X

X

O

O

O

USER_SYNONYMS

X

O

O

O

O

USER_SYS_PRIVS

X

O

O

O

O

USER_TABLES

X

O

O

O

O

USER_TABLESPACES

X

O

O

O

O

USER_TAB_COLS

X

O

O

O

O

USER_TAB_COLUMNS

X

O

O

O

O

USER_TAB_COMMENTS

X

O

O

O

O

USER_TAB_IDENTITY_COLS

X

O

O

O

O

USER_TAB_PLACE

X

X

O

O

O

USER_TAB_PRIVS

X

O

O

O

O

USER_TAB_PRIVS_MADE

X

O

O

O

O

USER_TAB_PRIVS_RECD

X

O

O

O

O

USER_TAB_SHARDS

X

X

O

O

O

USER_USERS

X

O

O

O

O

USER_VIEWS

X

O

O

O

O

Other views

AUDIT_POLICIES

X

X

X

O

O

AUDIT_POLICY_ENABLED

X

X

X

O

O

AUDIT_POLICY_OPTIONS

X

X

X

O

O

AUDIT_TRAIL

X

X

X

O

O

DATABASE_PROPERTIES

X

O

O

O

O

DBC_TABLE_TYPE_INFO

X

O

O

O

O

DICTIONARY

X

O

O

O

O

DICT_COLUMNS

X

O

O

O

O

DUAL

X

X

O

O

O

IMPLEMENTATION_INFO

X

O

O

O

O

IMPLEMENTATION_INFO_BASE

X

O

O

O

O

JDBC_CLIENT_PROPS

X

O

O

O

O

PRODUCT

X

O

O

O

O

SESSION_PRIVS

X

O

O

O

O

SUPPLEMENTAL_LOG_TABLE_INFO

X

O

O

O

O

Aliased synonym

COLS

X

O

O

O

O

DICT

X

O

O

O

O

IND

X

O

O

O

O

OBJ

X

O

O

O

O

RECYCLEBIN

X

X

X

X

O

SEQ

X

O

O

O

O

TABS

X

O

O

O

O

INFORMATION_SCHEMA Schema

The following is a feature matrix for INFORMATION_SCHEMA schema.

Feature matrix for INFORMATION_SCHEMA schema

Feature

1.x

2.x

3.1

3.2

20c.1

COLUMNS

X

O

O

O

O

COLUMN_PRIVILEGES

X

O

O

O

O

CONSTRAINT_COLUMN_USAGE

X

O

O

O

O

CONSTRAINT_TABLE_USAGE

X

O

O

O

O

INFORMATION_SCHEMA_CATALOG_NAME

X

O

O

O

O

KEY_COLUMN_USAGE

X

O

O

O

O

MODULES

X

X

X

X

O

MODULE_BODY

X

X

X

X

O

MODULE_BODY_MODULE_USAGE

X

X

X

X

O

MODULE_BODY_ROUTINE_USAGE

X

X

X

X

O

MODULE_BODY_SEQUENCE_USAGE

X

X

X

X

O

MODULEBODY_TABLE_USAGE

X

X

X

X

O

MODULE_MODULE_USAGE

X

X

X

X

O

MODULE_PRIVILEGES

X

X

X

X

O

MODULE_ROUTINE_USAGE

X

X

X

X

O

MODULE_SEQUENCE_USAGE

X

X

X

X

O

MODULE_TABLE_USAGE

X

X

X

X

O

PARAMETERS

X

X

O

O

O

REFERENTIAL_CONSTRAINTS

X

O

O

O

O

ROUTINES

X

X

O

O

O

ROUTINE_MODULE_USAGE

X

X

X

X

O

ROUTINE_PRIVILEGES

X

X

O

O

O

ROUTINE_ROUTINE_USAGE

X

X

O

O

O

ROUTINE_SEQUENCE_USAGE

X

X

O

O

O

ROUTINE_TABLE_USAGE

X

X

O

O

O

SCHEMATA

X

O

O

O

O

SEQUENCES

X

O

O

O

O

SQL_FEATURES

X

O

O

O

O

SQL_IMPLEMENTATION_INFO

X

O

O

O

O

SQL_PACKAGES

X

O

O

O

O

SQL_PARTS

X

O

O

O

O

SQL_SIZING

X

O

O

O

O

STATISTICS

X

O

O

O

O

TABLES

X

O

O

O

O

TABLE_CONSTRAINTS

X

O

O

O

O

TABLE_PRIVILEGES

X

O

O

O

O

USAGE_PRIVILEGES

X

O

O

O

O

VIEWS

X

O

O

O

O

VIEW_MODULE_USAGE

X

X

X

X

O

VIEW_ROUTINE_USAGE

X

X

O

O

O

VIEW_TABLE_USAGE

X

O

O

O

O

PERFORMANCE_VIEW_SCHEMA Schema

The following is a feature matrix for PERFORMANCE_VIEW_SCHEMA schema.

Feature matrix for PERFORMANCE_VIEW_SCHEMA schema

Feature

1.x

2.x

3.1

3.2

20c.1

GV$____

X

X

O

O

O

V$AGABLE_INFO

X

X

O

O

O

V$ARCHIVELOG

X

O

O

O

O

V$AUDITABLE_DB_PRIVILEGES

X

X

X

O

O

V$AUDITABLE_SYSTEM_ACTIONS

X

X

X

O

O

V$BACKUP

X

O

O

O

O

V$BALANCER

X

O

O

O

O

V$BCH

X

X

X

X

O

V$BUFFER_STAT

X

X

X

X

O

V$CLUSTER_DISPATCHER

X

X

O

O

O

V$CLUSTER_LOCATION

X

X

O

O

O

V$CLUSTER_MEMBER

X

X

O

O

O

V$COLUMNS

X

O

O

O

O

V$CONTROLFILE

X

O

O

O

O

V$DATAFILE

X

O

O

O

O

V$DB_CHANGE_TRACKING

X

X

X

X

O

V$DB_FILE

X

O

O

O

O

V$DISPATCHER

X

O

O

O

O

V$ERROR_CODE

X

O

O

O

O

V$GLOBAL_TRANSACTION

X

O

O

O

O

V$JOURNALING

X

X

O

O

O

V$INCREMENTAL_BACKUP

X

O

O

O

O

V$INSTANCE

X

O

O

O

O

V$KEYWORDS

X

O

O

O

O

V$LATCH

X

O

O

O

O

V$LOCK_WAIT

X

O

O

O

O

V$LOCKED_OBJECT

X

X

X

X

O

V$LOGFILE

X

O

O

O

O

V$PROCESS_MEM_STAT

X

O

O

O

O

V$PROCESS_SQL_STAT

X

O

O

O

O

V$PROCESS_STAT

X

O

O

O

O

V$PROPERTY

X

O

O

O

O

V$PSM_RESERVED_WORDS

X

X

O

O

O

V$QUEUE

X

O

O

O

O

V$RESERVED_WORDS

X

O

O

O

O

V$SESSION

X

O

O

O

O

V$SESSION_AUDIT

X

X

X

O

O

V$SESSION_CONNECT_INFO

X

O

O

O

O

V$SESSION_EVENT

X

X

O

O

O

V$SESSION_MEM_STAT

X

O

O

O

O

V$SESSION_SQL_STAT

X

O

O

O

O

V$SESSION_STAT

X

O

O

O

O

V$SESSION_WAIT

X

X

O

O

O

V$SHARED_MODE

X

O

O

O

O

V$SHARED_SERVER

X

O

O

O

O

V$SHM_SEGMENT

X

O

O

O

O

V$SPROPERTY

X

O

O

O

O

V$SQLFN_METADATA

X

O

O

O

O

V$SQL_CACHE

X

O

O

O

O

V$SQL_COMMAND

X

X

O

O

O

V$SQL_HISTORY

X

X

O

O

O

V$STATEMENT

X

O

O

O

O

V$SYSTEM_EVENT

X

X

O

O

O

V$SYSTEM_MEM_STAT

X

O

O

O

O

V$SYSTEM_SQL_STAT

X

O

O

O

O

V$SYSTEM_STAT

X

O

O

O

O

V$TABLES

X

O

O

O

O

V$TABLESPACE

X

O

O

O

O

V$TABLESPACE_STAT

X

X

O

O

O

V$TRANSACTION

X

O

O

O

O

V$WAIT_EVENT_CLASS_NAME

X

X

O

O

O

V$WAIT_EVENT_NAME

X

X

O

O

O

V$XA_TRANSATION

X

X

O

O

O

Server Property

The following is a feature matrix for server property.
Feature matrix for server property

Feature

1.x

2.x

3.1

3.2

20c.1

AGING_INTERVAL

O

O

O

O

O

AGING_PLAN_INTERVAL

X

O

O

O

O

ARCHIVELOG_DIR

O

O

X

X

X

ARCHIVELOG_DIR_1 ~ DIR_10

X

O

O

O

O

ARCHIVELOG_FILE

X

O

O

O

O

ARCHIVELOG_MODE

X

O

O

O

O

BACKUP_DIR_1 ~ DIR_10

X

O

O

O

O

BLOCK_READ_COUNT

O

O

O

O

O

BROADCAST_INDEX_REBUILD_PROTOCOL

X

X

X

X

O

BROADCAST_REBALANCE_PROTOCOL

X

X

X

X

O

BUFFER_CACHE_SIZE

X

X

X

X

O

BUFFER_CHECKPOINT_LIST_COUNT

X

X

X

X

O

BUFFER_FLUSH_THREADS

X

X

X

X

O

BUFFER_FLUSHING_INTERVAL

X

X

X

X

O

BUFFER_FREE_LIST_COUNT

X

X

X

X

O

BUFFER_HASH_BUCKETS

X

X

X

X

O

BUFFER_HOT_REGION_CRITERIA

X

X

X

X

O

BUFFER_HOT_REGION_PERCENT

X

X

X

X

O

BUFFER_LRU_LIST_COUNT

X

X

X

X

O

BUFFER_MULTIPAGE_READ_COUNT

X

X

X

X

O

BULK_IO_PAGE_COUNT

X

O

O

O

O

CDISPATCHER_HOT_POLICY_INTERVAL

X

X

O

O

O

CDISPATCHER_LOCKLESS_THREADS

X

X

X

X

O

CDISPATCHER_SOCKET_BUFFER_SIZE

X

X

O

O

O

CDISPATCHER_THREADS

X

X

O

O

O

CHANGE_TRACKING

X

X

X

X

O

CHANGE_TRACKING_EXTENT_SIZE

X

X

X

X

O

CHANGE_TRACKING_FILE

X

X

X

X

O

CHAR_LENGTH_UNITS

X

O

O

O

O

CHARACTER_SET

X

O

O

O

O

CHECK_DEDICATE_CONNECTION_INTERVAL

X

X

O

O

O

CHECK_DEDICATE_SOCKET

X

X

O

X

X

CLIENT_MAX_COUNT

O

O

O

O

O

CLIENT_NUMA_POLICY

X

X

O

O

O

CLOSE_PSM_CHILD_STMTS

X

X

O

O

O

CLUSTER_ASYNC_COMMIT

X

X

O

O

O

CLUSTER_ASYNC_REPLICATION

X

X

O

O

O

CLUSTER_CM_BUFFER_COUNT

X

X

O

O

O

CLUSTER_CM_BUFFER_SIZE

X

X

O

O

O

CLUSTER_CM_READ_BUFFER_SIZE

X

X

O

O

O

CLUSTER_COMMIT_SLAVES

X

X

O

O

O

CLUSTER_COMMIT_STREAM_ISOLATION

X

X

O

O

O

CLUSTER_CONNECTION

X

X

O

O

O

CLUSTER_CONNECTION_TIMEOUT_SEC

X

X

O

O

O

CLUSTER_DATA_SYNC_SERVERS

X

X

O

O

O

CLUSTER_DEADLOCK_TIMEOUT

X

X

X

X

O

CLUSTER_DISPATCHER_IN_QUEUE_SIZE

X

X

O

O

O

CLUSTER_DISPATCHER_NUMA_STREAM_MAP

X

X

O

O

O

CLUSTER_DISPATCHER_OUT_QUEUE_SIZE

X

X

O

O

O

CLUSTER_HEARTBEAT_INTERVAL

X

X

O

O

O

CLUSTER_HEARTBEAT_RETRY_COUNT

X

X

O

O

O

CLUSTER_IGNORE_INACTIVE_MEMBER

X

X

O

O

O

CLUSTER_MAX_PACKET_SIZE

X

X

O

O

O

CLUSTER_MAX_PAYLOAD_SIZE

X

X

O

O

O

CLUSTER_PACKET_ALLOCATION_TIMEOUT

X

X

O

O

O

CLUSTER_SERVER_RESPONSE_QUEUE_SIZE

X

X

O

O

O

CLUSTER_SESSION_HASH_BUCKETS

X

X

X

X

O

CLUSTER_SPLIT_BRAIN_RESOLUTION_POLICY

X

X

O

O

O

CLUSTER_SPLIT_BRAIN_RETRY_COUNT

X

X

O

O

O

COMMITTER_HOT_POLICY_INTERVAL

X

X

O

O

O

CONTROL_FILE_0 ~ FILE_7

X

O

O

O

O

CONTROL_FILE_COUNT

X

O

O

O

O

CONTROL_FILE_TEMP_NAME

X

O

O

O

O

COORDINATOR_COMMIT_WRITE_MODE

X

X

O

O

O

CSERVERS

X

X

O

O

O

DA_CLIENT_NUMA_MODE

X

X

O

O

O

DATA_STORE_MODE

O

O

O

O

O

DATABASE_ACCESS_MODE

X

O

O

O

O

DATABASE_INSTANCE_NAME

X

X

O

O

O

DDL_AUTOCOMMIT

X

O

O

O

O

DDL_LOCK_TIMEOUT

O

O

O

O

O

DEADLOCK_PRIORITY

X

X

X

X

O

DEFAULT_GLOBAL_SECONDARY_INDEX_CREATION

X

X

O

O

O

DEFAULT_INDEX_LOGGING

X

O

O

O

X

DEFAULT_INDEX_PCTFREE

X

X

O

O

O

DEFAULT_INITRANS

O

O

O

O

O

DEFAULT_MAXTRANS

O

O

O

O

O

DEFAULT_PCTFREE

O

O

O

O

O

DEFAULT_PCTUSED

O

O

O

O

O

DEFAULT_REMOVAL_BACKUP_FILE

X

O

O

O

O

DEFAULT_REMOVAL_OBSOLETE_BACKUP_LIST

X

O

O

O

O

DEFAULT_SHARDING

X

X

O

O

O

DISABLE_DDL_CDC_GIVEUP

X

O

O

O

O

DISABLE_UPDATE_PK_CDC_GIVEUP

X

O

O

O

O

DISALLOWED_PROTOCOL_TARGETTYPE

X

X

O

O

O

DISALLOWED_PROTOCOL_TARGETTYPE_WITH_ALL

X

X

X

O

O

DISALLOWED_PROTOCOL_TARGETTYPE_WITH_NAME

X

X

O

O

O

DISPATCHERS

X

O

O

O

O

DISPATCHER_CM_BUFFER_SIZE

X

O

O

O

O

DISPATCHER_CM_UNIT_SIZE

X

O

O

O

O

DISPATCHER_CONNECTIONS

X

O

O

O

O

DISPATCHER_HOT_POLICY_INTERVAL

X

X

O

O

O

DISPATCHER_LOAD_BALANCING

X

X

O

O

O

DISPATCHER_NUMA_STREAM_MAP

X

X

O

O

O

DISPATCHER_QUEUE_SIZE

X

O

O

O

O

DISPATCHER_REQUEST_MINI_QUEUE_COUNT

X

X

O

O

O

DISPATCHER_RESPONSE_MINI_QUEUE_COUNT

X

X

O

O

O

FETCH_FAILOVER

X

X

O

O

O

GLOBAL_CONNECTION_ALLOW_SESSION_DEPENDENCY

X

X

X

O

O

GLOBAL_JOURNAL_BUFFER_SIZE

X

X

O

O

O

GLOBAL_JOURNAL_BUFFER_TOTAL_MAX_SIZE

X

X

O

O

O

GLOBAL_PROPERTY_LOCK_TIMEOUT

X

X

O

O

O

GLOBAL_TRANSACTION_COMMIT_WRITE_MODE

X

X

O

O

O

GLOBAL_TRANSACTION_ISOLATION_SCOPE

X

X

O

O

O

GLOBAL_TRANSACTION_LOG_DIR

X

X

O

O

O

GLOBAL_TRANSACTION_LOG_FILE_SIZE

X

X

O

O

O

GMASTER_NUMA_NODE

X

X

O

O

O

GMON_AUTOSTART

X

X

O

O

O

HINT_ERROR

X

O

O

O

O

IDLE_TIMEOUT

O

O

O

O

O

IN_DOUBT_DECISION

X

O

O

O

O

IN_KEY_RANGE_ARRAY_COUNT

X

X

X

X

O

INCREMENTAL_BACKUP_SCAN_BUFFER_SIZE

X

X

X

X

O

INDEX_BUILD_PARALLEL_FACTOR

X

O

O

O

O

INDEX_REBUILD_BLOCK_READ_COUNT

X

X

X

X

O

INDEX_TREE_MERGE_PARALLEL_FACTOR

X

X

O

O

O

INST_ALLOCATOR_COUNT

X

X

O

O

O

INST_TABLE_BLOCK_SIZE

X

X

O

O

O

JOURNAL_TEMP_DIR

X

X

O

O

O

KEEPALIVE_IDLE_TIME

X

O

O

O

O

LOCAL_CLUSTER_MEMBER

X

X

O

O

O

LOCAL_CLUSTER_MEMBER_HOST

X

X

O

O

O

LOCAL_CLUSTER_MEMBER_PORT

X

X

O

O

O

LOCAL_JOURNAL_BUFFER_SIZE

X

X

O

O

O

LOCATION_FILE

X

X

O

O

O

LOCATOR_QUERY_TIMEOUT

X

X

O

O

O

LOCK_HASH_TABLE_SIZE

X

O

O

O

O

LOCKLESS_CSERVERS

X

X

X

X

O

LOG_BLOCK_SIZE

O

O

O

O

O

LOG_BUFFER_SIZE

O

O

O

O

O

LOG_DIR

O

O

O

O

O

LOG_FILE_SIZE

O

O

O

O

O

LOG_GROUP_COUNT

O

O

O

O

O

LOG_MIRROR_MODE

X

O

O

O

O

LOG_MIRROR_SHARED_MEMORY_STATIC_SIZE

X

O

O

O

O

LOG_MIRROR_TIMEOUT

X

O

O

O

O

LOG_SYNC_INTERVAL

X

O

O

O

O

LOG_SYNC_INTERVAL_MSEC

X

X

O

O

O

MAX_GROUP_COUNT

X

X

O

O

O

MAX_JOURNAL_FILE_SIZE

X

X

O

O

O

MAX_NODE_COUNT

X

X

O

O

O

MAXIMUM_CONCURRENT_ACTIVITIES

X

O

O

O

O

MAXIMUM_FLANGE_COUNT

X

X

O

O

O

MAXIMUM_FLUSH_LOG_BLOCK_COUNT

O

O

O

O

O

MAXIMUM_FLUSH_PAGE_COUNT

O

O

O

O

O

MAXIMUM_INDEX_REBUILD_JOURNAL_REPLAY_COUNT

X

X

X

X

O

MAXIMUM_JOURNAL_REPLAY_COUNT

X

X

X

O

O

MAXIMUM_NAMED_CURSOR_COUNT

X

O

O

O

O

MAXIMUM_SESSION_CM_BUFFER_SIZE

X

O

O

O

O

MEASURE_CLUSTER_LATENCY

X

X

O

O

O

MEDIA_RECOVERY_LOG_BUFFER_SIZE

X

O

X

X

X

MEMORY_MERGE_RUN_COUNT

X

O

O

O

O

MEMORY_SORT_RUN_SIZE

X

O

O

O

O

MIN_SAMPLE_ROW_COUNT

X

X

O

O

O

MINIMUM_UNDO_PAGE_COUNT

O

O

O

O

O

NET_BUFFER_SIZE

X

O

O

O

O

NLS_DATE_FORMAT

X

O

O

O

O

NLS_TIME_FORMAT

X

O

O

O

O

NLS_TIME_WITH_TIME_ZONE_FORMAT

X

O

O

O

O

NLS_TIMESTAMP_FORMAT

X

O

O

O

O

NLS_TIMESTAMP_WITH_TIME_ZONE_FORMAT

X

O

O

O

O

NUMA

X

X

O

O

O

NUMA_MAP

X

X

O

O

O

OFFLINE_MEMBER_AFTER_FAILOVER

X

X

O

O

O

ONLINE_INDEX_REBUILD_JOURNAL_REPLAY_THRESHOLD

X

X

X

X

O

ONLINE_JOURNAL_REPLAY_THRESHOLD

X

X

X

O

O

OS_GROUP_ACCESS

X

X

O

O

O

PACKET_COMPRESSION_THRESHOLD

X

X

X

X

O

PAGE_CHECKSUM_TYPE

X

O

O

O

O

PARALLEL_IO_FACTOR

O

O

O

O

O

PARALLEL_IO_GROUP_1 ~ GROUP_16

O

O

O

O

O

PARALLEL_LOAD_FACTOR

O

O

O

O

O

PENDING_LOG_BUFFER_COUNT

O

O

O

O

O

PLAN_CACHE

X

O

O

O

O

PLAN_CACHE_SIZE

X

O

O

O

O

PRIVATE_STATIC_AREA_INIT_SIZE

X

X

X

X

O

PRIVATE_STATIC_AREA_NEXT_SIZE

X

X

X

X

O

PRIVATE_STATIC_AREA_SHRINK_THRESHOLD

X

X

X

X

O

PRIVATE_STATIC_AREA_SIZE

X

O

O

O

O

PROCESS_MAX_COUNT

O

O

O

O

O

QUERY_TIMEOUT

O

O

O

O

O

READABLE_ARCHIVELOG_DIR_COUNT

X

O

O

O

O

READABLE_BACKUP_DIR_COUNT

X

O

O

O

O

REBALANCE_BLOCK_READ_COUNT

X

X

O

O

O

RECOMPILE_CHECK_MINIMUM_PAGE_COUNT

X

O

O

X

X

RECOMPILE_PAGE_PERCENT

X

O

O

X

X

RECOVERY_LOG_BUFFER_SIZE

X

X

O

O

O

RECYCLEBIN

X

X

X

X

O

REDO_LOG_COMPRESSION_THRESHOLD

X

X

X

O

O

REFINE_RELATION

X

O

O

O

O

SESSION_FATAL_BEHAVIOR

X

O

O

O

O

SESSION_MEMORY_INIT_SIZE

X

X

X

O

O

SESSION_MEMORY_SHRINK_THRESHOLD

X

X

X

O

O

SHARED_MEMORY_ADDRESS

O

O

O

O

O

SHARED_MEMORY_STATIC_KEY

O

O

O

O

O

SHARED_MEMORY_STATIC_NAME

O

O

O

O

O

SHARED_MEMORY_STATIC_SIZE

O

O

O

O

O

SHARED_REQUEST_QUEUE_COUNT

X

O

O

O

O

SHARED_SERVERS

X

O

O

O

O

SHARED_SESSION

X

O

O

O

O

SNAPSHOT_STATEMENT_TIMEOUT

X

O

O

O

O

SQL_HISTORY_SIZE

X

X

O

O

O

SUPPLEMENTAL_LOG_DATA_PRIMARY_KEY

X

O

O

O

O

SYSTEM_DISK_DATA_TABLESPACE_SIZE

X

X

X

X

O

SYSTEM_FILE_IO

X

O

O

O

O

SYSTEM_LOGGER_DIR

X

O

O

O

O

SYSTEM_MEMORY_AUX_TABLESPACE_SIZE

X

X

X

O

O

SYSTEM_MEMORY_DATA_TABLESPACE_SIZE

O

O

O

O

O

SYSTEM_MEMORY_DICT_TABLESPACE_SIZE

O

O

O

O

O

SYSTEM_MEMORY_TEMP_TABLESPACE_SIZE

O

O

O

O

O

SYSTEM_MEMORY_UNDO_TABLESPACE_SIZE

O

O

O

O

O

SYSTEM_TABLESPACE_DIR

O

O

O

O

O

SYSTEM_UDS_DIR

X

X

O

O

O

TCP_NODELAY

X

X

O

O

O

TEMP_SEGMENT_CACHE_SIZE

X

X

X

O

O

TEMP_UNDO_ENABLED

X

X

X

O

O

TIMED_STATISTICS

X

X

O

O

O

TIMER_INTERVAL

O

O

X

X

X

TIMEZONE

X

O

O

O

O

TRACE_ALTER_SYSTEM

X

O

O

O

O

TRACE_DDL

O

O

O

O

O

TRACE_LOG_ID

X

O

O

O

O

TRACE_LOG_MSGBUG_SIZE

X

X

O

O

O

TRACE_LOG_TIME_DETAIL

X

O

O

O

O

TRACE_LOGGER

X

X

O

O

O

TRACE_LOGGER_REMOTE_HOST

X

X

O

O

O

TRACE_LOGGER_REMOTE_PORT

X

X

O

O

O

TRACE_LOGIN

X

O

O

O

O

TRACE_LONG_RUN_CURSOR

X

O

O

O

O

TRACE_LONG_RUN_SQL

X

O

O

O

O

TRACE_LONG_RUN_TIMER

X

X

X

X

O

TRACE_XA

X

O

O

O

O

TRANSACTION_ALLOCATION_TIMEOUT

X

X

X

O

O

TRANSACTION_COMMIT_WRITE_MODE

O

O

O

O

O

TRANSACTION_MAXIMUM_UNDO_PAGE_COUNT

X

O

O

O

O

TRANSACTION_TABLE_SIZE

O

O

O

O

O

TRANSACTION_TIMEOUT

X

X

O

O

O

UNDO_RELATION_ALLOCATION_TIMEOUT

X

X

X

O

O

UNDO_RELATION_COUNT

O

O

O

O

O

UNDO_SHRINK_THRESHOLD

X

O

O

O

O

USE_LARGE_PAGES

X

X

X

X

O

USER_DATA_TABLESPACE_MEDIA_TYPE

X

X

X

X

O

USER_DATA_TABLESPACE_SIZE

X

X

X

X

O

USER_DISK_DATA_TABLESPACE_NEXTSIZE

X

X

X

X

O

USER_TEMP_TABLESPACE_SIZE

O

O

O

O

O

XA_TRANSACTION_IDLE_TIMEOUT

X

X

X

X

O

SQL

SQL Element

Data Type

The following is a feature matrix for data type.

Feature matrix for data type

Type

Feature

1.x

2.x

3.1

3.2

20c.1

Character string type

CHAR

O

O

O

O

O

VARCHAR

O

O

O

O

O

LONG VARCHAR

X

O

O

O

O

Binary string type

BINARY

O

O

O

O

O

VARBINARY

O

O

O

O

O

LONG VARBINARY

X

O

O

O

O

Decimal number type

SMALLINT

X

O

O

O

O

INTEGER

X

O

O

O

O

BIGINT

X

O

O

O

O

NUMERIC

O

O

O

O

O

DECIMAL

X

X

O

O

O

NUMBER

X

O

O

O

O

REAL

X

O

O

O

O

DOUBLE PRECISION

X

O

O

O

O

FLOAT

X

O

O

O

O

Binary number type

NATIVE_SMALLINT

X

O

O

O

O

NATIVE_INTEGER

X

O

O

O

O

NATIVE_BIGINT

X

O

O

O

O

NATIVE_REAL

X

O

O

O

O

NATIVE_DOUBLE

X

O

O

O

O

BOOLEAN type

BOOLEAN

O

O

O

O

O

Date/ time type

DATE

O

O

O

O

O

TIME

O

O

O

O

O

TIME WITH TIME ZONE

O

O

O

O

O

TIMESTAMP

O

O

O

O

O

TIMESTAMP WITH TIME ZONE

O

O

O

O

O

INTERVAL type

INTERVAL YEAR TO MONTH

O

O

O

O

O

INTERVAL YEAR

O

O

O

O

O

INTERVAL MONTH

O

O

O

O

O

INTERVAL DAY TO SECOND

O

O

O

O

O

INTERVAL DAY

O

O

O

O

O

INTERVAL HOUR

O

O

O

O

O

INTERVAL MINUTE

O

O

O

O

O

INTERVAL SECOND

O

O

O

O

O

INTERVAL DAY TO HOUR

O

O

O

O

O

INTERVAL DAY TO MINUTE

O

O

O

O

O

INTERVAL HOUR TO MINUTE

O

O

O

O

O

INTERVAL HOUR TO SECOND

O

O

O

O

O

INTERVAL MINUTE TO SECOND

O

O

O

O

O

ROWID type

ROWID

X

O

O

O

O

Function

The following is a feature matrix for function.

Feature matrix for function

Feature

1.x

2.x

3.1

3.2

20c.1

expr1 * expr2

O

O

O

O

O

expr1 + expr2

O

O

O

O

O

datetime + interval

X

O

O

O

O

+ expr

O

O

O

O

O

expr1 - expr2

O

O

O

O

O

datetime - interval

X

O

O

O

O

- expr

O

O

O

O

O

expr1 / expr2

O

O

O

O

O

str1 || str2

O

O

O

O

O

expr <comp> expr

O

O

O

O

O

expr <comp> ( subquery )

X

O

O

O

O

( subquery ) <comp> expr

X

O

O

O

O

( subquery ) <comp> ( subquery )

X

O

O

O

O

( expr, ... ) <comp> ( expr, ... )

X

O

O

O

O

( expr, ... ) <comp> ( subquery )

X

O

O

O

O

( subquery ) <comp> ( expr, ... )

X

O

O

O

O

expr <comp> {ALL|ANY|SOME} ( expr, ... )

X

O

O

O

O

expr <comp> {ALL|ANY|SOME} ( subquery )

X

O

O

O

O

( subquery ) <comp> {ALL|ANY|SOME} ( expr, ... )

X

O

O

O

O

( subquery ) <comp> {ALL|ANY|SOME} ( subquery )

X

O

O

O

O

( expr, ... ) <comp> {ALL|ANY|SOME} ( expr_list, ... )

X

O

O

O

O

( expr, ... ) <comp> {ALL|ANY|SOME} ( subquery )

X

O

O

O

O

( subquery ) <comp> {ALL|ANY|SOME} ( expr_list, ... )

X

O

O

O

O

ABS( num )

O

O

O

O

O

ACOS( num )

O

O

O

O

O

ADDDATE( date, interval )

X

O

O

O

O

ADDDATE( expr, days )

X

O

O

O

O

ADDTIME( expr1, expr2 )

X

O

O

O

O

ADD_MONTHS( date, number )

X

O

O

O

O

AND

O

O

O

O

O

ASCII( char )

X

X

O

O

O

ASIN( num )

O

O

O

O

O

ATAN( num )

O

O

O

O

O

ATAN2( num1, num2 )

O

O

O

O

O

AVG( num )

X

O

O

O

O

expr1 [NOT] BETWEEN [ASYMMETRIC|SYMMETRIC] expr2 AND expr3

X

O

O

O

O

BITAND( num1, num2 )

O

O

O

O

O

BITNOT( num )

O

O

O

O

O

BITOR( num1, num2 )

O

O

O

O

O

BITXOR( num1, num2 )

O

O

O

O

O

BIT_LENGTH( str )

O

O

O

O

O

BYTE_LENGTH( str )

O

O

O

O

O

CASE .. WHEN .. THEN .. ELSE .. END

X

O

O

O

O

CASE2( condition, result, ... )

X

O

O

O

O

CAST( expr AS datatype )

O

O

O

O

O

CBRT( num )

O

O

O

O

O

CEIL( num )

O

O

O

O

O

CEILING( num )

O

O

O

O

O

CHAR_LENGTH( str )

O

O

O

O

O

CHARACTER_LENGTH( str )

O

O

O

O

O

CHR( num )

X

X

O

O

O

CLOCK_DATE()

O

O

O

O

O

CLOCK_LOCALTIME()

O

O

O

O

O

CLOCK_LOCALTIMESTAMP()

O

O

O

O

O

CLOCK_TIME()

O

O

O

O

O

CLOCK_TIMESTAMP()

O

O

O

O

O

COALESCE( expr1, ..., exprN )

X

O

O

O

O

CONCAT( str1, str2 )

O

O

O

O

O

CONCATENATE( str1, str2 )

O

O

O

O

O

COS( num )

O

O

O

O

O

COT( num )

O

O

O

O

O

COUNT( expr )

X

O

O

O

O

COUNT(*)

X

O

O

O

O

CURRENT_CATALOG

O

O

O

O

O

CURRENT_DATE

O

O

O

O

O

CURRENT_SCHEMA

O

O

O

O

O

CURRENT_TIME

O

O

O

O

O

CURRENT_TIMESTAMP

O

O

O

O

O

CURRENT_USER

O

O

O

O

O

seq.CURRVAL

O

O

O

O

O

CURRVAL( seq )

O

O

O

O

O

DATEADD( datepart, number, date )

O

O

O

O

O

DATEDIFF( datepart, startdate, enddate )

X

O

O

O

O

DATE_ADD( date, interval )

X

O

O

O

O

DATE_PART( field, datetime )

X

O

O

O

O

DECODE( expr, comparison, result, ... )

X

O

O

O

O

DEGREES( radians )

O

O

O

O

O

DIGEST ( data, type )

X

X

O

O

O

DUMP( expr )

X

O

O

O

O

EXISTS( subquery )

X

O

O

O

O

EXP( num )

O

O

O

O

O

EXTRACT( field FROM datetime )

X

O

O

O

O

FACTORIAL( num )

O

O

O

O

O

FLOOR( num )

O

O

O

O

O

FROM_BASE64( str )

X

X

O

O

O

GREATEST( expr, ... )

X

O

O

O

O

HEX( str )

X

X

O

O

O

expr1 [NOT] IN ( expr, ... )

X

O

O

O

O

expr1 [NOT] IN ( subquery )

X

O

O

O

O

subquery [NOT] IN ( <expr_list> )

X

O

O

O

O

subquery [NOT] IN ( subquery )

X

O

O

O

O

<expr_list> [NOT] IN ( <expr_list>, ... )

X

O

O

O

O

<expr_list> [NOT] IN ( subquery )

X

O

O

O

O

subquery [NOT] IN ( <expr_list>, ... )

X

O

O

O

O

INITCAP( str )

X

O

O

O

O

INSTR( str, substr, ... )

X

O

O

O

O

IS NOT NULL

O

O

O

O

O

IS NULL

O

O

O

O

O

LAST_DAY( date )

X

O

O

O

O

LAST_IDENTITY_VALUE()

X

X

O

O

O

LEAST( expr, ... )

X

O

O

O

O

LENGTH( str )

O

O

O

O

O

LENGTHB( str )

O

O

O

O

O

string [NOT] LIKE pattern ESCAPE escape_char

X

O

O

O

O

LN( num )

O

O

O

O

O

LNNVL( expr )

X

X

X

X

O

LOCALTIME

O

O

O

O

O

LOCALTIMESTAMP

O

O

O

O

O

LOCAL_GROUP_ID()

X

X

O

O

O

LOCAL_GROUP_NAME()

X

X

O

O

O

LOCAL_MEMBER_ID()

X

X

O

O

O

LOCAL_MEMBER_NAME()

X

X

O

O

O

LOG( num2 )

O

O

O

O

O

LOG( num1, num2 )

O

O

O

O

O

LOGON_USER()

X

O

O

O

O

LOWER( str )

O

O

O

O

O

LPAD( str, length, fill )

X

O

O

O

O

LTRIM( str, [ str ] )

X

O

O

O

O

MAX( expr )

X

O

O

O

O

MIN( expr )

X

O

O

O

O

MOD( num1, num2 )

O

O

O

O

O

MONTHS_BETWEEN( date1, date2 )

X

X

X

O

O

NEXT_DAY( date, day )

X

X

O

O

O

seq.NEXTVAL

O

O

O

O

O

NEXTVAL( seq )

O

O

O

O

O

NEXT VALUE FOR seq

O

O

O

O

O

NOT

X

O

O

O

O

NULLIF( expr1, expr2 )

X

O

O

O

O

NUMTODSINTERVAL( num, interval_indicator )

X

X

X

X

O

NUMTODSINTERVAL( num, interval_indicator )

X

X

X

X

O

NVL( expr1, expr2 )

X

O

O

O

O

NVL2( expr1, expr2, expr3 )

X

O

O

O

O

OCTET_LENGTH( str )

O

O

O

O

O

OVERLAY( str1 PLACING str2 FROM start FOR length )

X

O

O

O

O

OR

X

O

O

O

O

PHYSICAL_LENGTH( expr )

X

X

X

X

O

PI()

O

O

O

O

O

POSITION( str1 IN str2 )

O

O

O

O

O

POWER( num1, num2 )

O

O

O

O

O

RADIANS( degrees )

O

O

O

O

O

RANDOM( min, max )

O

O

O

O

O

REPEAT( str, num )

X

O

O

O

O

REPLACE( str, from, to )

X

O

O

O

O

REVERSE( str )

X

X

X

O

O

ROUND( num )

X

O

O

O

O

ROUND( date, fmt )

X

O

O

O

O

ROWID_GRID_BLOCK_ID( rowid )

X

X

O

O

O

ROWID_GRID_BLOCK_SEQ( rowid )

X

X

O

O

O

ROWID_MEMBER_ID( rowid )

X

X

O

O

O

ROWID_OBJECT_ID( rowid )

X

O

O

O

O

ROWID_PAGE_ID( rowid )

X

O

O

O

O

ROWID_ROW_NUMBER( rowid )

X

O

O

O

O

ROWID_SHARD_ID( rowid )

X

X

O

O

O

ROWID_TABLESPACE_ID( rowid )

X

O

O

O

O

ROWNUM

X

X

O

O

O

RPAD( str, length, fill )

X

O

O

O

O

RTRIM( str, [ str ] )

X

O

O

O

O

SESSION_ID()

X

O

O

O

O

SESSION_SERIAL()

X

O

O

O

O

SESSION_USER

X

O

O

O

O

SHARD_GROUP_ID( table, expr )

X

X

O

O

O

SHARD_GROUP_NAME( table_name, shard_key_value [, ...] )

X

X

O

O

O

SHARD_ID( table, expr )

X

X

O

O

O

SHARD_NAME( table_name, shard_key_value [, ...] )

X

X

O

O

O

SHIFT_LEFT( num, cnt )

O

O

O

O

O

SHIFT_RIGHT( num, cnt )

O

O

O

O

O

SIGN( num )

O

O

O

O

O

SIN( num )

O

O

O

O

O

SPLIT_PART( str, delimiter, field )

X

O

O

O

O

SQRT( num )

O

O

O

O

O

STATEMENT_DATE()

O

O

O

O

O

STATEMENT_LOCALTIME()

O

O

O

O

O

STATEMENT_LOCALTIMESTAMP()

O

O

O

O

O

STATEMENT_TIME()

O

O

O

O

O

STATEMENT_TIMESTAMP()

O

O

O

O

O

STATEMENT_VIEW_SCN()

X

O

O

O

O

STATEMENT_VIEW_SCN_DCN()

X

X

O

O

O

STATEMENT_VIEW_SCN_GCN()

X

X

O

O

O

STATEMENT_VIEW_SCN_LCN()

X

X

O

O

O

STDDEV( [ ALL | DISTINCT ] expr )

X

X

X

O

O

STDDEV_POP( expr )

X

X

X

O

O

STDDEV_SAMP( expr )

X

X

X

O

O

SUBSTR( str FROM start FOR length )

X

O

O

O

O

SUBSTR( str, start, length )

X

O

O

O

O

SUBSTRB( str, start, length )

X

O

O

O

O

SUBSTRING( str FROM start FOR length )

X

O

O

O

O

SUBSTRING( str, start, length )

X

O

O

O

O

SUM( expr )

X

O

O

O

O

SYSDATE

O

O

O

O

O

SYS_EXTRACT_UTC( datetime_with_timezone )

X

X

O

O

O

SYSTIME

O

O

O

O

O

SYSTIMESTAMP

O

O

O

O

O

TAN( num )

O

O

O

O

O

TO_CHAR( datetime, fmt )

X

O

O

O

O

TO_CHAR( number, fmt )

X

O

O

O

O

TO_BASE64( str )

X

X

O

O

O

TO_DATE( str, fmt )

X

O

O

O

O

TO_NATIVE_BIGNIT( str, fmt )

X

X

X

X

O

TO_NATIVE_DOUBLE( str, fmt )

X

O

O

O

O

TO_NATIVE_INTEGER( str, fmt )

X

X

X

X

O

TO_NATIVE_REAL( str, fmt )

X

O

O

O

O

TO_NATIVE_SMALLINT( str, fmt )

X

X

X

X

O

TO_NUMBER( num, fmt )

X

O

O

O

O

TO_TIME( str, fmt )

X

O

O

O

O

TO_TIME_TZ( str, fmt )

X

O

O

O

O

TO_TIME_WITH_TIME_ZONE( str, fmt )

X

O

O

O

O

TO_TIMESTAMP( str, fmt )

X

O

O

O

O

TO_TIMESTAMP_TZ( str, fmt )

X

O

O

O

O

TO_TIMESTAMP_WITH_TIME_ZONE( str, fmt )

X

O

O

O

O

TRANSACTION_DATE()

O

O

O

O

O

TRANSACTION_LOCALTIME()

O

O

O

O

O

TRANSACTION_LOCALTIMESTAMP()

O

O

O

O

O

TRANSACTION_TIME()

O

O

O

O

O

TRANSACTION_TIMESTAMP()

O

O

O

O

O

TRANSLATE( str, from, to )

X

O

O

O

O

TRIM( LEADING|TRAILING|BOTH trim_char FROM source )

O

O

O

O

O

TRUNC( num, scale )

X

O

O

O

O

TRUNC( date, fmt )

X

O

O

O

O

UPPER( str )

O

O

O

O

O

UNHEX( str )

X

X

O

O

O

UNHEX_TO_CHARSTR( str )

X

X

O

O

O

USER_ID()

O

O

O

O

O

UUID()

X

X

O

O

O

VAR_POP( expr )

X

X

X

O

O

VAR_SAMP( expr )

X

X

X

O

O

VARIANCE( [ ALL | DISTINCT ] expr )

X

X

X

O

O

VERSION()

O

O

O

O

O

WIDTH_BUCKET( num, min, max, cnt )

O

O

O

O

O

Object

SQL Object

The following is a feature matrix for DDL which creates/ drops/ alters an SQL object.

Feature matrix for SQL object DDL

Object

Feature

1.x

2.x

3.1

3.2

20c.1

Database

object

ALTER DATABASE ARCHIVELOG

X

O

O

O

O

ALTER DATABASE ADD LOGFILE

X

O

O

O

O

ALTER DATABASE DROP LOGFILE

X

O

O

O

O

ALTER DATABASE RENAME LOGFILE

X

O

O

O

O

ALTER DATABASE BEGIN/END BACKUP

X

O

O

O

O

ALTER DATABASE RECOVER

X

O

O

O

O

ALTER DATABASE RECOVER TABLESPACE

X

O

O

O

O

ALTER DATABASE REGISTER

X

O

O

O

O

ALTER DATABASE RESTORE

X

O

O

O

O

ANALYZE SYSTEM

X

X

O

O

O

COMMENT ON object IS ..

X

O

O

O

O

Profile

object

CREATE PROFILE

X

O

O

O

O

DROP PROFILE

X

O

O

O

O

ALTER PROFILE

X

O

O

O

O

Audit policy

object

CREATE AUDIT POLICY

X

X

X

O

O

DROP AUDIT POLICY

X

X

X

O

O

ALTER AUDIT POLICY

X

X

X

O

O

AUDIT POLICY

X

X

X

O

O

NOAUDIT POLICY

X

X

X

O

O

Authorization

object

CREATE USER

X

O

O

O

O

DROP USER

X

O

O

O

O

ALTER USER

X

O

O

O

O

GRANT privileges TO

X

O

O

O

O

REVOKE privileges FROM

X

O

O

O

O

Schema

object

CREATE SCHEMA

X

O

O

O

O

DROP SCHEMA

X

O

O

O

O

Tablespace

object

CREATE MEMORY DATA TABLESPACE

X

O

O

O

O

CREATE MEMORY TEMPORARY TABLESPACE

X

O

O

O

O

DROP TABLESPACE

X

O

O

O

O

ALTER TABLESPACE .. RENAME TO

X

O

O

O

O

ALTER TABLESPACE .. BEGIN/END BACKUP

X

O

O

O

O

ALTER TABLESPACE .. ADD [DATAFILE|MEMORY]

O

O

O

O

O

ALTER TABLESPACE .. DROP [DATAFILE|MEMORY]

X

O

O

O

O

ALTER TABLESPACE .. RENAME DATAFILE

X

O

O

O

O

ALTER TABLESPACE .. { ONLINE | OFFLINE }

X

O

O

O

O

Table

object

CREATE TABLE

O

O

O

O

O

CREATE TABLE AS SELECT

X

O

O

O

O

CREATE GLOBAL TEMPORARY TABLE

X

X

X

O

O

CREATE GLOBAL TEMPORARY TABLE AS SELECT

X

X

X

O

O

CREATE IMMUTABLE TABLE

X

X

X

X

O

CREATE IMMUTABLE TABLE AS SELECT

X

X

X

X

O

DROP TABLE

O

O

O

O

O

TRUNCATE TABLE

X

O

O

O

O

ALTER TABLE .. STORAGE

X

O

O

O

O

ALTER TABLE .. RENAME TO

X

O

O

O

O

ALTER TABLE .. ADD COLUMN

X

O

O

O

O

ALTER TABLE .. SET UNUSED COLUMN

X

O

O

O

O

ALTER TABLE .. ALTER COLUMN

X

O

O

O

O

ALTER TABLE .. RENAME COLUMN

X

O

O

O

O

ALTER TABLE .. RENAME CONSTRAINT

X

X

X

O

O

ALTER TABLE .. ADD CONSTRAINT

X

O

O

O

O

ALTER TABLE .. DROP CONSTRAINT

X

O

O

O

O

ALTER TABLE .. ALTER CONSTRAINT

X

O

O

O

O

ALTER TABLE .. ADD SUPPLEMENTAL LOG

X

O

O

O

O

ALTER TABLE .. DROP SUPPLEMENTAL LOG

X

O

O

O

O

ALTER TABLE .. READ { ONLY | WRITE }

X

X

X

O

O

ANALYZE TABLE

X

X

O

O

O

FLASHBACK TABLE

X

X

X

X

O

PURGE

X

X

X

X

O

View

object

CREATE VIEW

X

O

O

O

O

DROP VIEW

X

O

O

O

O

ALTER VIEW

X

O

O

O

O

Index

object

CREATE INDEX

O

O

O

O

O

DROP INDEX

O

O

O

O

O

ALTER INDEX .. AGING

X

X

O

O

O

ALTER INDEX .. STORAGE

X

O

O

O

O

ALTER INDEX .. RENAME

X

X

X

O

O

ALTER INDEX .. REBUILD

X

X

X

X

O

Sequence

object

CREATE SEQUENCE

O

O

O

O

O

DROP SEQUENCE

O

O

O

O

O

ALTER SEQUENCE

X

O

O

O

O

Synonym

object

CREATE SYNONYM

X

O

O

O

O

DROP SYNONYM

X

O

O

O

O

CREATE PUBLIC SYNONYM

X

O

O

O

O

DROP PUBLIC SYNONYM

X

O

O

O

O

Stored procedure

object

CREATE PROCEDURE

X

X

O

O

O

DROP PROCEDURE

X

X

O

O

O

ALTER PROCEDURE

X

X

O

O

O

Stored function

object

CREATE FUNCTION

X

X

O

O

O

DROP FUNCTION

X

X

O

O

O

ALTER FUNCTION

X

X

O

O

O

Package object

CREATE PACKAGE

X

X

X

X

O

CREATE PACKAGE BODY

X

X

X

X

O

ALTER PACKAGE

X

X

X

X

O

DROP PACKAGE

X

X

X

X

O

Cluster Object

The following is a feature matrix for DDL which creates/ drops/ alters a cluster object.

Feature matrix for cluster object DDL

Object

Feature

1.x

2.x

3.1

3.2

20c.1

Cluster system

object

ALTER DATABASE REBALANCE

X

X

O

O

O

ALTER DATABASE DROP INACTIVE CLUSTER MEMBERS

X

X

O

O

O

Cluster group

object

CREATE CLUSTER GROUP

X

X

O

O

O

DROP CLUSTER GROUP

X

X

O

O

O

Cluster member

object

ALTER CLUSTER GROUP name ADD MEMBER

X

X

O

O

O

ALTER CLUSTER GROUP name OFFLINE MEMBER

X

X

O

O

O

ALTER DATABASE RESET LOCAL CLUSTER MEMBER

X

X

O

O

O

ALTER SYSTEM IRRECOVERABLE CLUSTER MEMBER

X

X

X

O

O

ALTER SYSTEM JOIN DATABASE

X

X

O

O

O

Cluster location

object

CREATE CLUSTER LOCATION

X

X

O

O

O

DROP CLUSTER LOCATION

X

X

O

O

O

ALTER CLUSTER LOCATION

X

X

O

O

O

Cluster table and shard object

ALTER TABLE name REBALANCE

X

X

O

O

O

ALTER TABLE name MERGE SHARDS

X

X

X

X

O

ALTER TABLE name MOVE SHARD

X

X

O

O

O

ALTER TABLE name SPLIT SHARD

X

X

O

O

O

ALTER TABLE name RENAME SHARD

X

X

X

O

O

Global secondary index

object

ALTER TABLE name ADD GLOBAL SECONDARY INDEX

X

X

O

O

O

ALTER TABLE name DROP GLOBAL SECONDARY INDEX

X

X

O

O

O

ALTER TABLE name ALTER GLOBAL SECONDARY INDEX

X

X

O

O

O

ALTER TABLE name REBUILD GLOBAL SECONDARY INDEX

X

X

X

X

O

SQL Language

DML

The following is a feature matrix for DML which manipulates data.

Feature matrix for DML

Feature

1.x

2.x

3.1

3.2

20c.1

INSERT INTO ..

O

O

O

O

O

INSERT INTO .. RETURNING query

X

O

O

O

O

INSERT INTO .. RETURNING .. INTO ..

X

O

O

O

O

DELETE FROM ..

O

O

O

O

O

DELETE FROM .. RETURNING query

X

O

O

O

O

DELETE FROM .. RETURNING .. INTO ..

X

O

O

O

O

DELETE FROM .. WHERE CURRENT OF cursor

X

O

O

O

O

UPDATE ..

O

O

O

O

O

UPDATE .. RETURNING query

X

O

O

O

O

UPDATE .. RETURNING .. INTO ..

X

O

O

O

O

UPDATE .. WHERE CURRENT OF cursor

X

O

O

O

O

CALL proc_name

X

X

O

O

O

Query

The following is a feature matrix for SELECT statement which enquires data.

Feature matrix for SELECT

Feature

1.x

2.x

3.1

3.2

20c.1

<query expression>

O

O

O

O

O

<query specification>

O

O

O

O

O

<select list>

O

O

O

O

O

<from clause>

O

O

O

O

O

<joined table>

X

O

O

O

O

<where clause>

O

O

O

O

O

<group by clause>

X

O

O

O

O

<order by clause>

X

O

O

O

O

<offset limit clause>

O

O

O

O

O

<set operator>

X

O

O

O

O

<subquery>

X

O

O

O

O

<hint clause>

X

O

O

O

O

Control Language

The following is a feature matrix for control statement.

Feature matrix for control statement

Control statement

Feature

1.x

2.x

3.1

3.2

20c.1

Transaction

COMMIT

O

O

O

O

O

ROLLBACK

O

O

O

O

O

SAVEPOINT

X

O

O

O

O

RELEASE SAVEPOINT

X

O

O

O

O

LOCK TABLE

X

O

O

O

O

SET CONSTRAINTS

X

O

O

O

O

SET TRANSACTION

X

O

O

O

O

Session

SET SESSION CHARACTERISTICS AS

X

O

O

O

O

SET SESSION AUTHORIZATION

X

O

O

O

O

SET TIME ZONE

X

O

O

O

O

ALTER SESSION SET property

O

O

O

O

O

System

ALTER SYSTEM {OPEN|MOUNT} DATABASE

X

O

O

O

O

ALTER SYSTEM CHECKPOINT

O

O

O

O

O

ALTER SYSTEM KILL SESSION

X

O

O

O

O

ALTER SYSTEM RECONNECT GLOBAL CONNECTION

X

X

X

O

O

ALTER SYSTEM SWITCH LOGFILE

X

O

O

O

O

ALTER SYSTEM SET property

X

O

O

O

O

ALTER SYSTEM RESET property

X

O

O

O

O

PSM Language

The following is a feature matrix for Persistent Stored Module (PSM) language element.

Feature matrix for Persistent Stored Module (PSM) language element

Feature

1.x

2.x

3.1

3.2

20c.1

Assignment Statement

X

X

O

O

O

Basic LOOP Statement

X

X

O

O

O

Block (BEGIN .. END)

X

X

O

O

O

CASE Statement

X

X

O

O

O

CLOSE Statement

X

X

O

O

O

Collection Method Invocation

X

X

O

O

O

Collection Variable Declaration

X

X

O

O

O

CONTINUE Statement

X

X

O

O

O

Cursor FOR LOOP Statement

X

X

O

O

O

Cursor Variable Declaration

X

X

O

O

O

DELETE Statement Extension

X

X

O

O

O

EXCEPTION_INIT Pragma

X

X

O

O

O

Exception Declaration

X

X

O

O

O

Exception Handler

X

X

O

O

O

EXECUTE IMMEDIATE Statement

X

X

O

O

O

EXIT Statement

X

X

O

O

O

Explicit Cursor Declaration and Definition

X

X

O

O

O

FETCH Statement

X

X

O

O

O

FOR LOOP Statement

X

X

O

O

O

GOTO Statement

X

X

O

O

O

IF Statement

X

X

O

O

O

Implicit Cursor Attribute

X

X

O

O

O

INSERT Statement Extension

X

X

O

O

O

Named Cursor Attribute

X

X

O

O

O

NULL Statement

X

X

O

O

O

OPEN Statement

X

X

O

O

O

OPEN FOR Statement

X

X

O

O

O

Procedure Call

X

X

O

O

O

Procedure Declaration and Definition

X

X

O

O

O

RAISE Statement

X

X

O

O

O

Record Variable Declaration

X

X

O

O

O

RETURN Statement

X

X

O

O

O

RETURNING INTO clause

X

X

O

O

O

%ROWTYPE Attribute

X

X

O

O

O

Scalar Variable Declaration

X

X

O

O

O

SELECT INTO Statement

X

X

O

O

O

SQLCODE Function

X

X

O

O

O

SQLERRM Function

X

X

O

O

O

%TYPE Attribute

X

X

O

O

O

UPDATE Statement Extension

X

X

O

O

O

WHILE LOOP Statement

X

X

O

O

O

The following is a feature matrix for the Built-In Package.

Feature matrix for Built-in Package

Package

Sub Routine

1.x

2.x

3.1

3.2

20c.1

DBMS_LOCK

SLEEP()

X

X

X

X

O

DBMS_OUTPUT

DISABLE()

X

X

X

O

O

ENABLE()

X

X

X

O

O

GET_LINE()

X

X

X

O

O

NEW_LINE()

X

X

X

X

X

PUT()

X

X

X

X

X

PUT_LINE()

X

X

O

O

O

SET_LOG()

X

X

X

O

O

DBMS_SQL

RETURN_RESULT()

X

X

X

X

X

DBMS_STANDARD

RAISE_APPLICATION_ERROR()

X

X

O

O

O

API

ODBC

The following is a feature matrix for the ODBC standard API.

Feature matrix for the ODBC standard API

Feature

1.x

2.x

3.1

3.2

20c.1

SQLAllocHandle()

O

O

O

O

O

SQLBindCol()

O

O

O

O

O

SQLBindParameter()

O

O

O

O

O

SQLCloseCursor()

O

O

O

O

O

SQLColAttribute()

X

O

O

O

O

SQLColumnPrivileges()

X

O

O

O

O

SQLColumns()

X

O

O

O

O

SQLConnect()

O

O

O

O

O

SQLDescribeCol()

O

O

O

O

O

SQLDescribeParam()

O

O

O

O

O

SQLDisconnect()

O

O

O

O

O

SQLDriverConnect()

X

O

O

O

O

SQLEndTran()

O

O

O

O

O

SQLExecDirect()

O

O

O

O

O

SQLExecute()

O

O

O

O

O

SQLExtendedFetch()

X

O

O

O

O

SQLFetch()

O

O

O

O

O

SQLFetchScroll()

X

O

O

O

O

SQLForeignKeys()

X

O

O

O

O

SQLFreeHandle()

O

O

O

O

O

SQLFreeStmt()

O

O

O

O

O

SQLGetConnectAttr()

O

O

O

O

O

SQLGetCursorName()

X

O

O

O

O

SQLGetData()

X

O

O

O

O

SQLGetDescField()

O

O

O

O

O

SQLGetDescRec()

O

O

O

O

O

SQLGetDiagField()

O

O

O

O

O

SQLGetDiagRec()

O

O

O

O

O

SQLGetEnvAttr()

O

O

O

O

O

SQLGetFunctions()

O

O

O

O

O

SQLGetInfo()

X

O

O

O

O

SQLGetStmtAttr()

O

O

O

O

O

SQLGetTypeInfo()

X

O

O

O

O

SQLMoreResults()

X

O

O

O

O

SQLNumParams()

O

O

O

O

O

SQLNumResultCols()

O

O

O

O

O

SQLParamData()

X

O

O

O

O

SQLPrepare()

O

O

O

O

O

SQLPrimaryKeys()

X

O

O

O

O

SQLProcedureColumns()

X

O

O

O

O

SQLProcedures()

X

O

O

O

O

SQLPutData()

X

O

O

O

O

SQLRowCount()

O

O

O

O

O

SQLSetConnectAttr()

O

O

O

O

O

SQLSetCursorName()

X

O

O

O

O

SQLSetDescField()

O

O

O

O

O

SQLSetDescRec()

O

O

O

O

O

SQLSetEnvAttr()

O

O

O

O

O

SQLSetPos()

X

O

O

O

O

SQLSetStmtAttr()

O

O

O

O

O

SQLSpecialColumns()

X

O

O

O

O

SQLStatistics()

X

O

O

O

O

SQLTablePrivileges()

X

O

O

O

O

SQLTables()

X

O

O

O

O

The following is a feature matrix for API other than the ODBC standard API.

Feature matrix for API other than the ODBC standard

Feature

1.x

2.x

3.1

3.2

20c.1

xa_open

X

O

O

O

O

xa_close

X

O

O

O

O

xa_start

X

O

O

O

O

xa_end

X

O

O

O

O

xa_rollback

X

O

O

O

O

xa_prepare

X

O

O

O

O

xa_commit

X

O

O

O

O

xa_recover

X

O

O

O

O

xa_forget

X

O

O

O

O

SQLGetXaSwitch

X

O

O

O

O

SQLGetXaConnectionHandle

X

O

O

O

O

SQLGetGroupCount

X

X

X

O

O

SQLGetGroupIDs

X

X

X

O

O

SQLGetGroupName

X

X

X

O

O

SQLGetSuitableGroupID

X

X

X

O

O

JDBC

The following is a class feature matrix for JDBC.

Class feature matrix for JDBC

Feature

1.x

2.x

3.1

3.2

20c.1

CallableStatement

X

X

O

O

O

CommonDataSource

X

O

O

O

O

Connection

X

O

O

O

O

ConnectionPoolDataSource

X

O

O

O

O

DatabaseMetaData

X

O

O

O

O

DataSource

X

O

O

O

O

Driver

X

O

O

O

O

ParameterMetaData

X

O

O

O

O

PooledConnection

X

O

O

O

O

PreparedStatement

X

O

O

O

O

ResultSet

X

O

O

O

O

ResultSetMetaData

X

O

O

O

O

RowId

X

O

O

O

O

Savepoint

X

O

O

O

O

Statement

X

O

O

O

O

XAConnection

X

O

O

O

O

XADataSource

X

O

O

O

O

XAResource

X

O

O

O

O

GoldilocksInterval

X

O

O

O

O

GoldilocksTypes

X

O

O

O

O

Embedded SQL

Precompiler Option

The following is a feature matrix for precompiler option.

Feature matrix for precompiler option

Feature

1.x

2.x

3.1

3.2

20c.1

--help

X

O

O

O

O

--include-path

X

O

O

O

O

--no-prompt

X

O

O

O

O

--output

X

O

O

O

O

--unsafe-null

X

O

O

O

O

--version

X

O

O

O

O

--no-lineinfo

X

X

X

O

O

--char_map

X

X

X

O

O

--cumulative

X

X

X

X

O

--parse

X

X

X

X

O

Embedded SQL-only Syntax

The following is a feature matrix of embedded SQL-only syntax.

Feature matrix for embedded SQL-only syntax

Feature

1.x

2.x

3.1

3.2

20c.1

EXEC SQL AT

X

O

O

O

O

EXEC SQL ATOMIC INSERT

X

O

O

O

O

EXEC SQL AUTOCOMMIT

X

O

O

O

O

EXEC SQL BEGIN DECLARE SECTION

X

O

O

O

O

EXEC SQL COMMIT RELEASE

X

O

O

O

O

EXEC SQL CONNECT

X

O

O

O

O

EXEC SQL CONTEXT ALLOCATE

X

O

O

O

O

EXEC SQL CONTEXT FREE

X

O

O

O

O

EXEC SQL CONTEXT USE

X

O

O

O

O

EXEC SQL DISCONNECT

X

O

O

O

O

EXEC SQL END DECLARE SECTION

X

O

O

O

O

EXEC SQL FOR

X

O

O

O

O

EXEC SQL GET GROUPID

X

X

X

O

O

EXEC SQL INCLUDE

X

O

O

O

O

EXEC SQL INCLUDE SQLCA

X

O

O

O

O

EXEC SQL OPTION

X

O

O

O

O

EXEC SQL ROLLBACK RELEASE

X

O

O

O

O

EXEC SQL WHENEVER

X

O

O

O

O

Host Variable Data Type

The following is a feature matrix for embedded SQL data type which can be used for HOST variables.

Feature matrix for host variable data type

Feature

1.x

2.x

3.1

3.2

20c.1

C native type

X

O

O

O

O

struct, union

X

O

O

O

O

typedef

X

O

O

O

O

VARCHAR

X

O

O

O

O

LONG VARCHAR

X

O

O

O

O

BINARY

X

O

O

O

O

LONG VARBINARY

X

O

O

O

O

BOOLEAN

X

O

O

O

O

NUMBER

X

O

O

O

O

DATE

X

O

O

O

O

TIME

X

O

O

O

O

TIME WITH TIMEZONE

X

O

O

O

O

TIMESTAMP

X

O

O

O

O

TIMESTAMP WITH TIMEZONE

X

O

O

O

O

INTERVAL YEAR

X

O

O

O

O

INTERVAL MONTH

X

O

O

O

O

INTERVAL DAY

X

O

O

O

O

INTERVAL HOUR

X

O

O

O

O

INTERVAL MINUTE

X

O

O

O

O

INTERVAL SECOND

X

O

O

O

O

INTERVAL YEAR TO MONTH

X

O

O

O

O

INTERVAL DAY TO HOUR

X

O

O

O

O

INTERVAL DAY TO MINUTE

X

O

O

O

O

INTERVAL DAY TO SECOND

X

O

O

O

O

INTERVAL HOUR TO MINUTE

X

O

O

O

O

INTERVAL HOUR TO SECOND

X

O

O

O

O

INTERVAL MINUTE TO SECOND

X

O

O

O

O

Dynamic SQL

The following is a feature matrix for dynamic SQL.

Feature matrix for dynamic SQL

Feature

1.x

2.x

3.1

3.2

20c.1

SELECT .. INTO

X

O

O

O

O

EXECUTE IMMEDIATE sql

X

O

O

O

O

PREPARE stmt

X

O

O

O

O

EXECUTE stmt

X

O

O

O

O

DECLARE cursor FOR sql

X

O

O

O

O

DECLARE cursor FOR stmt

X

O

O

O

O

OPEN cursor

X

O

O

O

O

OPEN cursor USING

X

O

O

O

O

FETCH cursor INTO

X

O

O

O

O

CLOSE cursor

X

O

O

O

O

DELETE .. WHERE CURRENT OF cursor

X

O

O

O

O

UPDATE .. WHERE CURRENT OF cursor

X

O

O

O

O

PyDBC

Module

The following is a method feature matrix for pygoldilocks provided by PyDBC.

Feature matrix for pygoldilock method

Feature

1.x

2.x

3.1

3.2

20c.1

connect

X

X

X

O

O

Date

X

X

X

O

O

Time

X

X

X

O

O

Timestamp

X

X

X

O

O

DateFromTicks

X

X

X

O

O

TimeFromTicks

X

X

X

O

O

TimestampFromTicks

X

X

X

O

O

Binary

X

X

X

O

O

STRING

X

X

X

O

O

BINARY

X

X

X

O

O

NUMBER

X

X

X

O

O

DATETIME

X

X

X

O

O

ROWID

X

X

X

O

O

getDecimalSeparator

X

X

X

O

O

setDecimalSeparator

X

X

X

O

O

The following is an attribute feature matrix for pygoldilocks module.

Feature matrix for pygoldilock attribute

Feature

1.x

2.x

3.1

3.2

20c.1

apilevel

X

X

X

O

O

threadsafety

X

X

X

O

O

paramstyle

X

X

X

O

O

version

X

X

X

O

O

lowercase

X

X

X

O

O

Connection

The following is a method feature matrix for connection object.

Feature matrix for connection method

Feature

1.x

2.x

3.1

3.2

20c.1

cursor

X

X

X

O

O

commit

X

X

X

O

O

rollback

X

X

X

O

O

close

X

X

X

O

O

getinfo

X

X

X

O

O

execute

X

X

X

O

O

set_attr

X

X

X

O

O

The following is an attribute feature matrix for connection object.

Feature matrix for connection attribute

Feature

1.x

2.x

3.1

3.2

20c.1

autocommit

X

X

X

O

O

searchescape

X

X

X

O

O

timeout

X

X

X

O

O

Cursor

The following is a method feature matrix for cursor object.

Feature matrix for cursor method

Feature

1.x

2.x

3.1

3.2

20c.1

excute

X

X

X

O

O

executemany

X

X

X

O

O

fetchone

X

X

X

O

O

fetchall

X

X

X

O

O

fetchmany

X

X

X

O

O

commit

X

X

X

O

O

rollback

X

X

X

O

O

skip

X

X

X

O

O

nextset

X

X

X

O

O

close

X

X

X

O

O

setinputsizes

X

X

X

O

O

setoutputsize

X

X

X

O

O

callproc

X

X

X

O

O

callfunc

X

X

X

O

O

tables

X

X

X

O

O

columns

X

X

X

O

O

statistics

X

X

X

O

O

rowIdColumns

X

X

X

O

O

rowVerColumns

X

X

X

O

O

primaryKeys

X

X

X

O

O

foreignKeys

X

X

X

O

O

procedures

X

X

X

O

O

getTypeInfo

X

X

X

O

O

The following is an attribute feature matrix for cursor object.

Feature matrix for cursor attribute

Feature

1.x

2.x

3.1

3.2

20c.1

Description

X

X

X

O

O

rowcount

X

X

X

O

O

arraysize

X

X

X

O

O

connection

X

X

X

O

O

fast_executemany

X

X

X

O

O

Row

The following is an attribute feature matrix for row object.

Feature matrix for row attribute

Feature

1.x

2.x

3.1

3.2

20c.1

cursor_description

X

X

X

O

O

Utility

gcreatedb

Command Usage

The following is a feature matrix for command usage of gcreatedb.

Feature matrix for command usage of gcreatedb

Feature

1.x

2.x

3.1

3.2

20c.1

--character_set

O

O

O

O

O

--char_length_units

X

O

O

O

O

--cluster

X

X

O

O

O

--db_comment

O

O

O

O

O

--help

O

O

O

O

O

--host

X

X

O

O

O

--member

X

X

O

O

O

--port

X

X

O

O

O

--silent

O

O

O

O

O

--timezone

X

O

O

O

O

glsnr

Command Usage

The following is a feature matrix for command usage of glsnr.

Feature matrix for command usage of glsnr

Feature

1.x

2.x

3.1

3.2

20c.1

--help

X

O

O

O

O

--home

X

X

O

O

O

--silent

X

O

O

O

O

--start

X

O

O

O

O

--status

X

O

O

O

O

--stop

X

O

O

O

O

Configuration File

The following is a feature matrix for configuration of glsnr.

Feature matrix for configuration of glsnr

Feature

1.x

2.x

3.1

3.2

20c.1

BACKLOG

X

O

O

O

O

DEFAULT_CS_MODE

X

O

O

O

O

LISTENER_LOG_DIR

X

X

O

O

O

LISTEN_PORT

X

O

O

O

O

TCP_EXCLUDED

X

O

O

O

O

TCP_INVITED

X

O

O

O

O

TCP_HOST

X

O

O

O

O

TCP_VALIDNODE_CHECKING

X

O

O

O

O

TIMEOUT

X

O

O

O

O

USR_DIR

X

X

O

O

O

gsql/ gsqlnet

Command Usage

The following is a feature matrix for command usage of gsql.

Feature matrix for command usage of gsql

Feature

1.x

2.x

3.1

3.2

20c.1

username password

O

O

O

O

O

--as {SYSDBA|ADMIN}

X

O

O

O

O

--conn-string

X

O

O

O

O

--dsn

X

O

O

O

O

--enable-color

O

O

O

O

O

--help

O

O

O

O

O

--import

O

O

O

O

O

--no-prompt

O

O

O

O

O

--prompt

O

O

O

O

O

--silent

O

O

O

O

O

--version

O

O

O

O

O

Interactive gsql Command

The following is a feature matrix for interactive gsql command which is used in gsql prompt state.

Feature matrix for interactive gsql command

Feature

1.x

2.x

3.1

3.2

20c.1

\\

O

O

O

O

O

\connect userid password [as sysdba]

X

O

O

O

O

\cshutdown

X

X

O

O

O

\cstartup

X

X

O

O

O

\ddl_cluster

X

X

O

O

O

\ddl_db

X

O

O

O

O

\ddl_tablespace

X

O

O

O

O

\ddl_profile

X

O

O

O

O

\ddl_audit_policy

X

X

X

O

O

\ddl_auth

X

O

O

O

O

\ddl_schema

X

O

O

O

O

\ddl_public_synonym

X

O

O

O

O

\ddl_table

X

O

O

O

O

\ddl_constraint

X

O

O

O

O

\ddl_index

X

O

O

O

O

\ddl_view

X

O

O

O

O

\ddl_sequence

X

O

O

O

O

\ddl_synonym

X

O

O

O

O

\ddl_procedure

X

X

O

O

O

\ddl_package

X

X

X

O

O

\desc

O

O

O

O

O

\dynamic sql :var

X

O

O

O

O

\exec

O

O

O

O

O

\exec :var := :value

O

O

O

O

O

\exec sql

O

O

O

O

O

\explain plan [on|only]

O

O

O

O

O

\help

O

O

O

O

O

\history

O

O

O

O

O

\host {os_command}

X

X

O

O

O

\import

O

O

O

O

O

\idesc

O

O

O

O

O

\{n}

O

O

O

O

O

\prepare sql

O

O

O

O

O

\print

O

O

O

O

O

\quit

O

O

O

O

O

\set autocommit

O

O

O

O

O

\set color

O

O

O

O

O

\set colsize

X

O

O

O

O

\set ddlsize

X

O

O

O

O

\set error

O

O

O

O

O

\set history

O

O

O

O

O

\set linesize

O

O

O

O

O

\set numsize

X

O

O

O

O

\set pagesize

O

O

O

O

O

\set timing

O

O

O

O

O

\set vertical

O

O

O

O

O

\shutdown {abort|immediate|transactional|normal}

X

O

O

O

O

\startup {nomount|mount|open}

X

O

O

O

O

\var

O

O

O

O

O

gloader/ gloadernet

Command Usage

The following is a feature matrix for command usage of gloader.

Feature matrix for command usage of gloader

Feature

1.x

2.x

3.1

3.2

20c.1

username password

O

O

O

O

O

--array

O

O

O

O

O

--atomic

O

O

O

O

O

--bad

O

O

O

O

O

--buffered

X

O

O

O

O

--commit

O

O

O

O

O

--control

O

O

O

O

O

--data

O

O

O

O

O

--dsn

X

O

O

O

O

--errors

X

O

O

O

O

--export

O

O

O

O

O

--fieldterm

X

X

O

O

O

--filesize

X

O

O

O

O

--format

X

O

O

O

O

--help

O

O

O

O

O

--import

O

O

O

O

O

--lineterm

X

X

O

O

O

--log

O

O

O

O

O

--no-prompt

O

O

O

O

O

--parallel

O

O

O

O

O

--propagation

X

O

O

O

O

--qualifier

X

X

O

O

O

--silent

O

O

O

O

O

--AsTIMESTAMP

X

O

O

O

O

--where

X

X

X

O

O

--group-id

X

X

X

O

O

--directio-size

X

X

X

O

O

Control File Syntax

The following is a feature matrix for control file syntax of gloader.

Feature matrix for control file syntax of gloader

Feature

1.x

2.x

3.1

3.2

20c.1

CHARACTERSET

X

O

O

O

O

FIELDS TERMINATED BY

O

O

O

O

O

OPTIONALLY ENCLOSED BY

O

O

O

O

O

TABLE table_name

O

O

O

O

O

TABLE schema_name.table_name

X

O

O

O

O

LTRIM

X

X

O

O

O

RTRIM

X

X

O

O

O

LINES TERMINATED BY

X

X

O

O

O

WHERE

X

X

X

O

O

gdump

Command Usage

The following is a feature matrix for command usage of gdump.

Feature matrix for command usage of gdump

Item

Feature

1.x

2.x

3.1

3.2

20c.1

Common arguments

--silent

X

O

O

O

O

File type

BACKUP

X

O

O

O

O

COMMIT_LOG

X

X

O

O

O

CONTROL

X

O

O

O

O

DATA

X

O

O

O

O

LOG

X

O

O

O

O

LOG_BUFFER

X

X

O

O

O

PEND_BUFFER

X

X

O

O

O

PROPERTY

X

O

O

O

O

BACKUP file arguments

--body

X

O

O

O

O

--tbs

X

O

O

O

O

--number

X

O

O

O

O

--fetch

X

O

O

O

O

CONTROL file arguments

--section

X

O

O

O

O

DATA file arguments

--header

X

O

O

O

O

--number

X

O

O

O

O

--fetch

X

O

O

O

O

LOG file arguments

--all

X

X

O

O

O

--fetch

X

O

O

O

O

--header

X

X

O

O

O

--number

X

O

O

O

O

--offset

X

O

O

O

O

tablediff

Configuration File

The following is a feature matrix for configuration file of tablediff.

Feature matrix for configuration file of tablediff

Item

Feature

1.x

2.x

3.1

3.2

20c.1

Source table

SOURCE_PASSWORD

X

O

O

O

O

SOURCE_SCHEMA

X

O

O

O

O

SOURCE_TABLE

X

O

O

O

O

SOURCE_URL

X

O

O

O

O

SOURCE_USER

X

O

O

O

O

Target table

TARGET_PASSWORD

X

O

O

O

O

TARGET_SCHEMA

X

O

O

O

O

TARGET_TABLE

X

O

O

O

O

TARGET_URL

X

O

O

O

O

TARGET_USER

X

O

O

O

O

Sync operation

TARGET_INSERT

X

O

O

O

O

TARGET_UPDATE

X

O

O

O

O

TARGET_DELETE

X

O

O

O

O

SOURCE_INSERT

X

O

O

O

O

Operation options

DIFF_BIN_FILE

X

O

O

O

O

DIFF_OUT_FILE

X

O

O

O

O

DISPLAY_CALL_STACK

X

O

O

O

O

DISPLAY_ROW_UNIT

X

O

O

O

O

EXCLUDE_COLUMNS

X

O

O

O

O

LOGGING_ON_DIFF

X

O

O

O

O

LOGGING_ON_SUCCESS

X

O

O

O

O

JOB_QUEUE_SIZE

X

O

O

O

O

JOB_THREAD

X

O

O

O

O

JOB_UNIT_SIZE

X

O

O

O

O

PARTITION_RANGE

X

O

O

O

O

SYNC_OUT_FILE

X

O

O

O

O

WHERE_CLAUSE

X

O

O

O

O

gsyncher

Command Usage

The following is a feature matrix for command usage of gsyncher.

Feature matrix for command usage of gsyncher

Feature

1.x

2.x

3.1

3.2

20c.1

--log

X

O

O

O

O

--silent

X

O

O

O

O

--home

X

X

O

O

O

--copy-right

X

O

O

O

O

--backup-path

X

O

O

O

O

--help

X

O

O

O

O

gmon

Command Usage

The following is a feature matrix for command usage of gmon.

Feature matrix for command usage of gmon

Feature

1.x

2.x

3.1

3.2

20c.1

--start

X

X

O

O

O

--stop

X

X

O

O

O

--status

X

X

O

O

O

--home

X

X

O

O

O

--uds_dir

X

X

X

X

O

--silent

X

X

O

O

O

--no-copyright

X

X

O

O

O

--help

X

X

O

O

O

gtrclogger

Command Usage

The following is a feature matrix for command usage of gtrclogger.

Feature matrix for command usage of gtrclogger

Feature

1.x

2.x

3.1

3.2

20c.1

--dir

X

X

O

O

O

--help

X

X

O

O

O

--port

X

X

O

O

O

--start

X

X

O

O

O

--stop

X

X

O

O

O

glocator

Command Usage

The following is a feature matrix for command usage of glocator.

Feature matrix for command usage of glocator

Feature

1.x

2.x

3.1

3.2

20c.1

--create

X

X

O

O

O

--start

X

X

O

O

O

--stop

X

X

O

O

O

--conf

X

X

O

O

O

--status

X

X

O

O

O

--sync

X

X

X

O

O

--silent

X

X

O

O

O

--no-copyright

X

X

O

O

O

--help

X

X

O

O

O

Configuration File

The following is a feature matrix for configuration file of glocator.

Feature matrix for configuration file of glocator

Feature

1.x

2.x

3.1

3.2

20c.1

PORT

X

X

O

O

O

WORKER_COUNT

X

X

O

O

O

SESSION_QUEUE_SIZE

X

X

O

O

O

SESSION_ALLOCATOR_SIZE

X

X

O

O

O

PACKET_ALLOCATOR_SIZE

X

X

O

O

O

SYSTEM_LOGGER_DIR

X

X

O

O

O

SYSTEM_UDS_DIR

X

X

O

O

O

LOCATION_FILE_DIR

X

X

O

O

O

LOCATION_FILE_SIZE

X

X

O

O

O

LOCATION_FILE_MAX_SIZE

X

X

O

O

O

SESSION_TIMEOUT

X

X

O

O

O

FAILOVER_TIMEOUT

X

X

O

O

O

ALTERNATE_LOCATORS

X

X

X

O

O

SYNC_RETRY_COUNT

X

X

X

O

O

SYNC_RESPONSE_TIMEOUT

X

X

X

O

O

gagent

Command Usage

The following is a feature matrix for command usage of gagent.

Feature matrix for command usage of gagent

Feature

1.x

2.x

3.1

3.2

20c.1

--start

X

X

O

O

O

--stop

X

X

O

O

O

--conf

X

X

O

O

O

--status

X

X

O

O

O

--home

X

X

O

O

O

--silent

X

X

O

O

O

--no-copyright

X

X

O

O

O

--help

X

X

O

O

O

Configuration File

The following is a feature matrix for configuration file of gagent.

Feature matrix for configuration file of gagent

Feature

1.x

2.x

3.1

3.2

20c.1

PORT

X

X

O

O

O

LOCATOR_HOST

X

X

O

O

O

LOCATOR_PORT

X

X

O

O

O

COMMAND_QUEUE_SIZE

X

X

O

O

O

COMMAND_ALLOCATOR_SIZE

X

X

O

O

O

PACKET_ALLOCATOR_SIZE

X

X

O

O

O

SYSTEM_LOGGER_DIR

X

X

O

O

O

SESSION_TIMEOUT

X

X

O

O

O

UPDATE_LOCATION_TIME

X

X

O

O

O

ALTERNATE_LOCATORS

X

X

X

O

O

gloctl

Command Usage

The following is a feature matrix for command usage of gloctl.

Feature matrix for command usage of gloctl

Feature

1.x

2.x

3.1

3.2

20c.1

--dsn

X

X

O

X

X

--conf

X

X

X

O

O

--ip

X

X

O

O

O

--port

X

X

O

O

O

--import

X

X

O

O

O

--silent

X

X

O

O

O

--no-copyright

X

X

O

O

O

--help

X

X

O

O

O

Configuration File

The following is a feature matrix for configuration file of gloctl.

Feature matrix for configuration file of gloctl

Feature

1.x

2.x

3.1

3.2

20c.1

PORT

X

X

X

O

O

LOCATOR_HOST

X

X

X

O

O

LOCATOR_PORT

X

X

X

O

O

Replication

cyclone

Command Usage

The following is a feature matrix for command usage of cyclone.

Feature matrix for command usage of cyclone

Feature

1.x

2.x

3.1

3.2

20c.1

--conf

X

O

O

O

O

--encrypt

X

X

O

O

O

--group

X

O

O

O

O

--help

X

O

O

O

O

--key

X

X

O

O

O

--master

X

O

O

O

O

--reset

X

O

O

O

O

--silent

X

O

O

O

O

--slave

X

O

O

O

O

--start

X

O

O

O

O

--status

X

O

O

O

O

--stop

X

O

O

O

O

--sync

X

O

O

O

O

--stand-alone

X

X

X

O

O

--recovery

X

X

X

O

O

--local

X

X

X

O

O

--info

X

O

O

O

O

Configuration File

The following is a feature matrix for configuration file of cyclone.

Feature matrix for configuration file of cyclone

Configuration

Feature

1.x

2.x

3.1

3.2

20c.1

Common configuration

COMM_CHUNK_COUNT

X

O

O

O

O

DSN

X

O

O

O

O

USER_ENCRYPT_PW

X

X

O

O

O

GROUP_NAME

X

O

O

O

O

HOST_IP

X

O

O

O

O

HOST_EXTERNAL_IP

X

X

O

O

O

HOST_PORT

X

O

O

O

O

PORT

X

O

O

O

O

PROTOCOL

X

X

O

O

O

USER_ID

X

O

O

O

O

USER_PW

X

O

O

O

O

HEARTBEAT_TIMEOUT

X

X

X

X

O

MASTER configuration

CAPTURE_TABLE

X

O

O

O

O

LOG_PATH

X

O

O

O

O

READ_LOG_BLOCK_COUNT

X

O

O

O

O

TRANS_SORT_AREA_SIZE

X

O

O

O

O

TRANS_FILE_PATH

X

O

O

O

O

SYNCHER_COUNT

X

O

O

O

O

SYNC_ARRAY_SIZE

X

O

O

O

O

GIVEUP_INTERVAL

X

O

O

O

O

SKIP_COMMENT

X

X

X

X

O

LOG_CAPTURE_INTERVAL_1

X

X

O

O

O

LOG_CAPTURE_INTERVAL_2

X

X

O

O

O

SLAVE configuration

APPLIER_COUNT

X

O

O

O

O

APPLY_ARRAY_SIZE

X

O

X

X

X

APPLY_COMMIT_SIZE

X

O

O

O

O

APPLY_TABLE

X

O

O

O

O

MASTER_IP

X

O

O

O

O

PROPAGATE_MODE

X

O

O

O

O

CLUSTER

X

X

X

O

O

ORACLE_DRIVER

X

X

X

O

O

logmirror

Command Usage

The following is a feature matrix for command usage of logmirror.

Feature matrix for command usage of logmirror

Feature

1.x

2.x

3.1

3.2

20c.1

--conf

X

O

O

O

O

--help

X

O

O

O

O

--infiniband

X

O

O

O

O

--master

X

O

O

O

O

--silent

X

O

O

O

O

--slave

X

O

O

O

O

--start

X

O

O

O

O

--stop

X

O

O

O

O

Configuration File

The following is a feature matrix for configuration file of logmirror.

Feature matrix for configuration file of logmirror

Configuration

Feature

1.x

2.x

3.1

3.2

20c.1

Common configuration

PORT

X

O

O

O

O

MASTER configuration

DSN

X

O

O

O

O

HOST_IP

X

O

O

O

O

HOST_PORT

X

O

O

O

O

PROTOCOL

X

X

O

O

O

USER_ID

X

O

O

O

O

USER_PW

X

O

O

O

O

SLAVE configuration

LOG_PATH

X

O

O

O

O

MASTER_IP

X

O

O

O

O

cymon

Command Usage

The following is a feature matrix for command usage of cymon.

Feature matrix for command usage of cymon

Feature

1.x

2.x

3.1

3.2

20c.1

--conf

X

O

O

O

O

--help

X

O

O

O

O

--cycle

X

O

O

O

O

--key

X

X

O

O

O

--start

X

O

O

O

O

--stop

X

O

O

O

O

--status

X

O

O

O

O

cyfile

Command Usage

The following is a feature matrix for command usage of cyfile.

Feature matrix for command usage of cyfile

Feature

2.x

3.1

3.2

20c.1

Trunk

--conf

X

X

X

O

O

--help

X

X

X

O

O

--reset

X

X

X

O

O

--key

X

X

X

O

O

--silent

X

X

X

O

O

--info

X

X

X

O

O

--start

X

X

X

O

O

--stop

X

X

X

O

O

--group

X

X

X

O

O

--encrypt

X

X

X

O

O

--status

X

X

X

O

O

Configuration File

The following is a feature matrix for configuration file of cyfile.

Feature matrix for configuration file of cyfile

Feature

2.x

3.1

3.2

20c.1

Trunk

DSN

X

X

X

O

O

HOST_IP

X

X

X

O

O

HOST_PORT

X

X

X

O

O

PROTOCOL

X

X

X

O

O

USER_ID

X

X

X

O

O

USER_PW

X

X

X

O

O

GROUP_NAME

X

X

X

O

O

USER_ENCRYPT_PW

X

X

X

O

O

CAPTURE_TABLE

X

X

X

O

O

READ_LOG_BLOCK_COUNT

X

X

X

O

O

TRANS_SORT_AREA_SIZE

X

X

X

O

O

TRANS_FILE_PATH

X

X

X

O

O

LOG_CAPTURE_INTERVAL_1

X

X

X

O

O

LOG_CAPTURE_INTERVAL_2

X

X

X

O

O

DATA_FILE_PATH

X

X

X

O

O

DATA_FILE_PREFIX

X

X

X

O

O

DATA_FILE_SIZE

X

X

X

O

O

UPDATE_BEFORE_VALUE

X

X

X

O

O

What's New in GOLDILOCKS 20c.1

This chapter briefly describes the features added to GOLDILOCKS 20c.1.

Architecture

System Architecture

The available platform has been changed.

Storage Internal

Tables and indexes can be stored in the disk tablespace. Pages in the disk tablespace should be read by using s separate memory space, so the buffer cache feature also has been added for that.

Also, the incremental backup for the disk tablespace is determined after scanning the entire data file looking for updated pages after the previous backup. Therefore, if the data file size is big, then the backup speed is slow even when the number of updated pages is small. Therefore, change tracking feature has been added to fix the problem of the incremental backup for the disk tablespace.

Transaction Control

It has not been changed.

Backup & Recovery

It has not been changed.

Database Information

DICTIONARY_SCHEMA

The following views have been added to retrieve the recyclebin object information.

The following views have been added to retrieve the PSM package object information.

INFORMATION_SCHEMA

The following views have been added to retrieve the PSM package object information.

PERFORMANCE_VIEW_SCHEMA

The following views have been added to retrieve the statistics information about the buffer cache and to retrieve all page frames of the buffer cache for caching the disk tablespace pages.

V$DB_CHANGE_TRACKING has been added to retrieve the change tracking information which is used for the disk tablespace incremental backup.

Server Property

The property for the recyclebin

RECYCLEBIN property has been added to activate the recyclebin feature.

CLUSTER_SESSION_HASH_BUCKETS

CLUSTER_SESSION_HASH_BUCKETS property has been added to control the number of hash buckets of the cluster session.

DEADLOCK_PRIORITY

DEADLOCK_PRIORITY property has been added to select a specific transaction as a victim for resolving the deadlock which occurred while simultaneously processing multiple transactions.

USE_LARGE_PAGES

USE_LARGE_PAGES property has been added to use HugePage.

BUFFER_CACHE_SIZE

BUFFER_CACHE_SIZE property has been added to set the size of the buffer cache which cashes the disk tablespace.

BUFFER_CHECKPOINT_LIST_COUNT

BUFFER_CHECKPOINT_LIST_COUNT property has been added to set the number of checkpoint lists to link for flushing the updated pages in the buffer cache to the disk when performing the checkpoint.

BUFFER_FLUSH_THREADS

BUFFER_FLUSH_THREADS property has been added to set the number of threads which flushes the database system buffers.

BUFFER_FLUSHING_INTERVAL

BUFFER_FLUSHING_INTERVAL property has been added to set the idle time of when the buffer flush thread does not have any task to process.

BUFFER_FREE_LIST_COUNT

BUFFER_FREE_LIST_COUNT property has been added to set the number of lists linking bch which is instantly available in the buffer cache.

BUFFER_HASH_BUCKETS

BUFFER_HASH_BUCKETS property has been added to set the number of hash buckets to lookup the pages cached in the buffer cache.

BUFFER_HOT_REGION_CRITERIA

BUFFER_HOT_REGION_CRITERIA property has been added to set touch count to transfer pages to the hot region in buffer lru list.

BUFFER_HOT_REGION_PERCENT

BUFFER_HOT_REGION_PERCENT property has been added to set the proportion (percentage) of pages to leave in hot region to the entire page in the buffer lru list.

BUFFER_LRU_LIST_COUNT

BUFFER_LRU_LIST_COUNT property has been added to set the number of buffer lru lists to be used in the database system.

BUFFER_MULTIPAGE_READ_COUNT

BUFFER_MULTIPAGE_READ_COUNT property has been added to set the maximum number of pages to be used for one time disk IO when full scanning the disk table.

CHANGE_TRACKING

CHANGE_TRACKING property has been added to set whether to track the updated pages to perform the incremental backup of disk tablespace.

CHANGE_TRACKING_EXTENT_SIZE

CHANGE_TRACKING_EXTENT_SIZE property has been added to set the number of pages to be included in one extent when performing change tracking.

CHANGE_TRACKING_FILE

CHANGE_TRACKING_FILE property has been added to set the file directory which stores the change tracking, and the file name.

INCREMENTAL_BACKUP_SCAN_BUFFER_SIZE

INCREMENTAL_BACKUP_SCAN_BUFFER_SIZE property has been added to set the maximum number of pages to be read by one time disk IO when performing the incremental backup of disk tablespace.

REDO_LOG_COMPRESSION_THRESHOLD

REDO_LOG_COMPRESSION_THRESHOLD property has been added to set the threshold size when compressing the log.

SYSTEM_DISK_DATA_TABLESPACE_SIZE

SYSTEM_DISK_DATA_TABLESPACE_SIZE property has been added to set DISK_DATA_TBS tablespace size when creating the database.

USER_DATA_TABLESPACE_MEDIA_TYPE

USER_DATA_TABLESPACE_MEDIA_TYPE property has been added to set the default media type to use if the tablespace media type is omitted when creating the user data tablespace.

USER_DATA_TABLESPACE_SIZE

USER_DATA_TABLESPACE_SIZE property has been added to set the default size to use if the data file size is omitted when creating the user data tablespace or adding the data file.

USER_DISK_DATA_TABLESPACE_NEXTSIZE

USER_DISK_DATA_TABLESPACE_NEXTSIZE property has been added to set the default size to use if the size to be extended is not set when it is required to extend the data file of the user disk data tablespace.

USER_TEMP_TABLESPACE_SIZE

USER_TEMP_TABLESPACE_SIZE property has been added to set the default size to use if the data file size is omitted when creating the user temp tablespace or adding the data file.

IN_KEY_RANGE_ARRAY_COUNT

IN_KEY_RANGE_ARRAY_COUNT property has been added to set the array size of the in key range scan based on array.

BROADCAST_INDEX_REBUILD_PROTOCOL

BROADCAST_INDEX_REBUILD_PROTOCOL property has been added to set whether to simultaneously rebuild the indexes on all members when rebuilding the index in cluster environment.

SQL

Improved Cluster Query Performance

The performance of processing the complex query in cluster has been improved.

The performance is changed as follows according to the increase of cluster groups per each query in TPC-H(scale factor 10) test.

The following is a graph of version 20c.1. 
The response time of most queries are decreased when cluster groups increase.

The response time per each query when cluster groups of TPC-H SF10 increase in version 20c.1

The response time per each query when cluster groups of TPC-H SF10 increase in version 20c.1

For more information about query processing in cluster environment, refer to the followings.

SQL Element

Data Type

It has not been changed.

Function

The following formatting functions have been added.

PHYSICAL_LENGTH function has been added.

LNNVL function has been added.

Pseudo Column

CLUSTER_SHARD_ID Pseudo Column has been added.

Object

Package Object

The PSM package object has been added.

SQL Language

Table DDL

The recyclebin feature has been added to the table.

ALTER TABLE name MERGE SHARDS has been added to merge shards.

REBUILD GLOBAL SECONDARY INDEX has been added to rebuild the global secondary index.

Index DDL

ALTER INDEX name REBUILD has been added to rebuild the index.

Immutable Table

The feature which prevents the record stored in the table from being altered or deleted and prevents the table from being dropped has been added.

Assigning position When Performing ADD MEMBER

The statement assigning the member position when adding the cluster member has been added.

PSM Package-related DDL

DDLs to create or drop PSM package have been added.

Performance Measuring

ALTER SYSTEM CLEANUP BUFFER_CACHE has been added to clear buffer pages in the disk buffer cache.

API

ODBC

DOT_NET_FOR_ODBC has been added to Keywords in the data source specification section.

Data Source Configuration

trace, tracefile and include_synonyms have been added to data source configuration.

JDBC

Statement Pooling feature has been added.

The getNetworkTimeout() and setNetworkTimeout() methods of the Connection class are supported.

Connection Property

tcp_nodelay, login_timeout and include_synonyms have been added to connection property.

Embedded SQL

Precompiler(gpec)

--cumulative option has been added.

The --parse option has been added to gpec.

PDO

It has not been changed.

PyDBC

It has not been changed.

Ruby

It has not been changed.

Hibernate

It has not been changed.

Utility

gcreatedb

It has not been changed.

glsnr

It has not been changed.

gsql/gsqlnet

\ddl_package feature has been added to export DDL statement of the package objects.

gloader/gloadernet

It has not been changed.

gdump

It has not been changed.

tablediff

It has not been changed.

gsyncher

It has not been changed.

gmon

It has not been changed.

gtrclogger

It has not been changed.

glocator

The method to communicate with gagent is changed to TCP.

FAILOVER_TIMEOUT is deleted from configure file.

MAX_NODE_COUNT has been added to configure file.

KEEPALIVE_IDLE_TIME, KEEPALIVE_COUNT, KEEPALIVE_INTERVAL have been added to configure file.

gagent

The method to communicate with glocator is changed to TCP.

COMMAND_QUEUE_SIZE is deleted from configure file.

COMMAND_ALLOCATOR_SIZE is deleted from configure file.

PACKET_ALLOCATOR_SIZE is deleted from configure file.

UPDATE_LOCATION_TIME is deleted from configure file.

SESSION_TIMEOUT is deleted from configure file.

SYSTEM_UDS_DIR has been added to configure file.

PORT is deleted, and REQUEST_PORT, RESPONSE_PORT have been added to configure file.

KEEPALIVE_IDLE_TIME, KEEPALIVE_COUNT, KEEPALIVE_INTERVAL have been added to configure file.

gloctl

It has not been changed.

Replication

cyclone

It has not been changed.

logmirror

It has not been changed.

cymon

It has not been changed.

cyfile

A tool which uses CDC method to store/ record the transaction of the original database in CSV format file has been added.

Patch Notes

20c.1.30 Patch Notes

ISSUE-4478 The setNetworkTimeout behavior of the JDBC connection class has been changed from asynchronous to synchronous.

Description

The internal setNetworkTimeout() behavior of of the Connection class has been changed from asynchronous to synchronous.

Symptom

In the previous asynchronous implementation, requests to configure the network timeout returned immediately, while the actual timeout configuration was performed in a separate thread.
As a result, SQL statements executed immediately after calling setNetworkTimeout() could run before the new timeout value was applied. Consequently, the timeout might not behave as expected, and the timing of the timeout configuration could be inconsistent.

Workaround

Wait for a certain period of time after calling setNetworkTimeout(), or execute SQL statements only after the timeout setting is expected to be applied.

ISSUE-8272 During view projection pruning, aggregations referenced by other targets were incorrectly removed when unused columns were pruned from a view, and this issue has been fixed.

Description

During view projection pruning, aggregations referenced by other targets were incorrectly removed when unused columns were pruned from a view.

Symptom

Executing the following query causes an abnormal termination.
DROP VIEW IF EXISTS v1;

CREATE VIEW v1( sum1, sum2 )
AS
SELECT
  SUM(c2),
  SUM(c2) - SUM(c2)
FROM ( SELECT 1, 2 FROM dual 
       UNION ALL 
       SELECT 1, 2 FROM dual ) as v2( c1, c2 )
GROUP BY c1
ORDER BY c1;
COMMIT;

--# Query that causes an abnormal termination
SELECT sum2 FROM v1;
After the fix, the above query executes successfully and returns the following result.
DROP VIEW IF EXISTS v1;

CREATE VIEW v1( sum1, sum2 )
AS
SELECT
  SUM(c2),
  SUM(c2) - SUM(c2)
FROM ( SELECT 1, 2 FROM dual 
       UNION ALL 
       SELECT 1, 2 FROM dual ) as v2( c1, c2 )
GROUP BY c1
ORDER BY c1;
COMMIT;

SELECT sum2 FROM v1;

SUM2
----
   0

1 row selected.

Workaround

The patch is required.

20c.1.29 Patch Notes

ISSUE-4478 The getNetworkTimeout and setNetworkTimeout methods of the JDBC connection class are supported.

Description

The getNetworkTimeout and setNetworkTimeout methods of the connection class are supported.

Symptom

N/A

Workaround

The patch is required.

ISSUE-8058 The pthread_yield compatibility issue in glibc 2.34 has been fixed.

Description

In the glibc 2.34 environment, referencing pthread_yield() caused a compatibility issue that could lead to a link failure of the GOLDILOCKS shared library. To address this, the thread yield implementation has been modified to preferentially use the standard sched_yield() API, ensuring build compatibility with glibc 2.34-based systems.

Symptom

When building an application in a glibc 2.34 environment, the final linking stage could fail because the GOLDILOCKS shared library was unable to resolve the pthread_yield symbol. A representative error message is shown below:
• undefined reference to 'pthread_yield'

Workaround

Use an environment with a glibc version earlier than 2.34.

ISSUE-7805 The issue where memory allocated during the handling of the ODBC LONG VARCHAR and LONG VARBINARY types was not properly released has been fixed.

Description

A memory leak occurred for LONG VARCHAR and LONG VARBINARY columns during metadata reconstruction when the table schema was altered during a FETCH and another FETCH was performed on the same table.

Symptom

In a client-server (CS) environment, when querying data through ODBC, altering the table schema via an ALTER statement during a FETCH operation triggers metadata reconstruction. If the table contains LONG VARCHAR or LONG VARBINARY columns, memory dynamically allocated for those column types was not released properly, resulting in a memory leak.

Workaround

Before this issue was fixed, the safest approach was to avoid altering the table schema during a FETCH operation. If altering the schema was unavoidable, the affected SQLHSTMT handle had to be reallocated by calling SQLFreeHandle followed by SQLAllocHandle.

ISSUE-7782 A parse option has been added to gpec.

Description

The parse option has been added to gpec to control source parsing. The option can be set to none or partial, and if not specified, the default value is partial.

Symptom

N/A

Workaround

The patch is required.

ISSUE-7782 The code handling behavior of the gpec preprocessor has been modified.

Description

The gpec preprocessor has been updated to change how it handles code in branches that evaluate to false (#if, #elif, #else, #ifdef, #ifndef).
Before this update, code in false branches was removed from the output. It now remains intact and is included in the output.

Symptom

In some cases, the gpec preprocessor was unable to recognize macros defined in certain header files. In such cases, gpec evaluated the relevant preprocessor conditions as false and deleted the associated code blocks. As a result, code that was valid in the actual compilation environment could be missing in the gpec output.
In other words, discrepancies could arise between the gpec output and the actual build due to differences in preprocessor evaluation.
For example, when a gc file includes a header using the EXEC SQL INCLUDE statement, if that header references a macro defined in another header, gpec cannot interpret the macro and evaluates the condition as false.
As a result, code that should not be removed may be deleted.

The following is an example of a header file not referenced by gpec:

#ifndef SYS_FLAG_H
#define SYS_FLAG_H
#define SYS_FEATURE_FLAG 1
#endif /* SYS_FLAG_H */

The following is an example of a header file successfully referenced by gpec:

#ifndef SYS_CONFIG_H
#define SYS_CONFIG_H

/* References a macro defined in another header */
#define ENABLE_FEATURE SYS_FEATURE_FLAG

#endif /* SYS_CONFIG_H */

The following is an example gc file:

EXEC SQL INCLUDE sys_config.h;
int main(void)
{
#if ENABLE_FEATURE
/* In the actual compilation environment, SYS_FEATURE_FLAG == 1,
so this code should be included. */
feature_func();
#endif
return 0;
}

Although sys_config.h refers to a macro defined in another header, gpec cannot interpret that macro. As a result, the ENABLE_FEATURE condition is evaluated as false, and code that is valid in the actual compilation environment may be removed from the gpec output.

Workaround

Preprocessor conditions and macros used in gc files should be defined within header files included using EXEC SQL INCLUDE.

ISSUE-7743 An issue that occurred while processing nested #if / #endif directives in the gpec preprocessor has been fixed.

Description

When processing #if preprocessor directives, the gpec preprocessor removes (replaces with empty strings) all statements up to the corresponding #endif directive if the condition is evaluated as false.
However, when #if / #endif directives were used in a nested structure, some statements within the inner preprocessor blocks were not removed correctly. This issue has been identified and fixed.
This fix applies not only to #if directives but also to all conditional preprocessor directives, including #elif, #else, #ifdef, and #ifndef.

Symptom

The following is a portion of a gc file that contains nested #if / #endif directives.

#if 0
    #if 0
        printf("error 1");
    #else
        printf("error 2");
    #endif
    printf("error 3");
#endif

The following is a portion of the generated c file produced by converting the above code using the gpec preprocessor:

printf("error 3");

Due to the nested #if 0 conditions, all three printf statements should have been removed. However, the converted c file incorrectly retained the printf("error 3"); statement.

Workaround

Avoid using nested #if / #endif directives. Alternatively, statements should not be placed after an inner #endif directive, as shown below.

#if 0
    #if 0
        printf("error 1");
    #else
        printf("error 2");
    #endif                 // Statements below this directive are not processed correctly.
    printf("error 3");
#endif

ISSUE-7353 Fixed missing data issue when changing array size during ODBC fetch

Description

An issue was identified in the ODBC client-server environment where changing the array size dynamically during data fetch caused data retrieval to fail. This issue has been resolved.

Symptom

When retrieving data using ODBC in a client-server (CS) environment, an issue occurred where data could not be fetched correctly if the array size was changed during the fetch operation. This problem commonly appeared when using the SQLExtendedFetch, SQLFetch, and SQLFetchScroll functions, and was particularly noticeable when the fetch started with a small array size (e.g., 1 row) and was later changed to a larger array size (e.g., 100 rows).

As a specific symptom, after changing the SQL_ROWSET_SIZE or SQL_ATTR_ROW_ARRAY_SIZE attribute, SQL_NO_DATA was returned prematurely, resulting in only a subset of the data being retrieved even though more data was actually available.

Workaround

Prior to applying the patch for this issue, the most reliable approach was to keep the array size fixed rather than changing it. If changing the array size was unavoidable, the recommended method was to close the current cursor using the SQLCloseCursor function and then re-execute the query so that the fetch would begin with the new array size. When stability was more important than performance, the array size could be set to 1 to fetch data one row at a time.

ISSUE-6575 An error occurs when only the fields of a record type variable are specified in the INTO clause of a FETCH statement.

Description

An error occurs if fields of a record type variable are specified, even when the number of targets of the cursor in the FETCH statement matches the number of targets in the INTO clause.

Symptom

An error occurs even when the number of targets in the cursor's SELECT statement matches the number of targets in the FETCH INTO clause.

gSQL>
DECLARE
  TYPE rec1 IS RECORD( c1 INTEGER , c2 INTEGER );
  v_rec rec1;
  
  CURSOR cur1 IS SELECT 100 FROM dual;
BEGIN
  OPEN cur1;
  FETCH cur1 INTO v_rec.c2;
  CLOSE cur1;
END;
/

ERR-2F000(17032): PSM compilation error : 
(1) at (8:3): ERR-2F000(17040): fetch target count mismatch

It has now been modified to operate correctly.

gSQL>
DECLARE
  TYPE rec1 IS RECORD( c1 INTEGER , c2 INTEGER );
  v_rec rec1;
  
  CURSOR cur1 IS SELECT 100 FROM dual;
BEGIN
  OPEN cur1;
  FETCH cur1 INTO v_rec.c2;
  CLOSE cur1;
END;
/

Anonymous PL block executed.

Workaround

Use a scalar type variable.

gSQL>
DECLARE
  TYPE rec1 IS RECORD( c1 INTEGER , c2 INTEGER );
  v_rec rec1;
  
  var1 INTEGER;
  
  CURSOR cur1 IS SELECT 100 FROM dual;
BEGIN
  OPEN cur1;
  FETCH cur1 INTO var1;
  v_rec.c2 := var1;
  CLOSE cur1;
END;
/

Anonymous PL block executed.

ISSUE-6574 The boundary of the member info array may be violated during the GSI REBUILD process.

Description

If rebuilding the GSI after dropping a cluster member, the system may terminate abnormally.

Symptom

Clearing the cluster member and rebuilding the GSI after dropping one or more cluster nodes as follows below may cause the system to terminate abnormally.

ALTER DATABASE DROP INACTIVE CLUSTER MEMBERS;
Database altered.

ALTER TABLE T1 REBALANCE;
Table altered.

ALTER TABLE T1 REBUILD GLOBAL SECONDARY INDEX;

Workaround

The patch is required.

ISSUE-6557 When using an outer join, if functions such as DECODE, stored functions, or CONCAT that include columns from the right table are in the WHERE clause, it can lead to incorrect results.

Description

When functions such as DECODE, stored functions, or CONCAT that include columns from the right table exist in the WHERE clause, the following outer join operation elimination should not be applied; however, it was actually applied, resulting in an error.

Symptom

In cases where outer join operation elimination occurs as follows, the inclusion of DECODE, stored functions, etc., in the WHERE clause can lead to incorrect results.

Before the modification, the following incorrect results were output.

CREATE TABLE t1 ( c1 INTEGER, c2 INTEGER );
INSERT INTO t1 VALUES(1,1);
INSERT INTO t1 VALUES(2,2);
CREATE TABLE t2 ( c1 INTEGER, c2 INTEGER );
INSERT INTO t2 VALUES(1,1);
COMMIT;


gSQL> \EXPLAIN PLAN 
SELECT t1.c1, t2.c1
  FROM t1 LEFT OUTER JOIN t2
    ON t1.c1 = t2.c1
 WHERE DECODE( t2.c2, NULL, 'A', 'B' ) = 'A'
; 

no rows selected.

>>>  start print plan

< Execution Plan >
========================================================================
|  IDX  |  NODE DESCRIPTION                                            |
------------------------------------------------------------------------
|    0  |  SELECT STATEMENT                                            |
|    1  |    QUERY BLOCK ("$QB_IDX_2")                                 |
|    2  |      HASH JOIN (INNER JOIN)                                  |
|    3  |        TABLE ACCESS ("T1")                                   |
|    4  |        HASH JOIN INSTANT                                     |
|    5  |          TABLE ACCESS ("T2")                                 |
========================================================================

     1  -  TARGET : T1.C1, T2.C1
     2  -  JOINED COLUMN : T1.C1, T2.C1
     3  -  READ COLUMN : T1.C1
     4  -  HASH KEY : T2.C1
           READ KEY COLUMN : T2.C1
             HASH FILTER : T2.C1 = T1.C1
     5  -  READ COLUMN : T2.C1, T2.C2
             LOGICAL FILTER : DECODE(T2.C2,NULL,'A','B') = 'A'

<<<  end print plan

After the modification, the correct plan and results are as follows.

\EXPLAIN PLAN 
SELECT t1.c1, t2.c1
  FROM t1 LEFT OUTER JOIN t2
    ON t1.c1 = t2.c1
 WHERE DECODE( t2.c2, NULL, 'A', 'B' ) = 'A'
;

C1   C1
-- ----
 2 null

1 row selected.

>>>  start print plan

< Execution Plan >
========================================================================
|  IDX  |  NODE DESCRIPTION                                            |
------------------------------------------------------------------------
|    0  |  SELECT STATEMENT                                            |
|    1  |    QUERY BLOCK ("$QB_IDX_2")                                 |
|    2  |      HASH JOIN (LEFT OUTER JOIN)                             |
|    3  |        TABLE ACCESS ("T1")                                   |
|    4  |        HASH JOIN INSTANT                                     |
|    5  |          TABLE ACCESS ("T2")                                 |
========================================================================

     1  -  TARGET : T1.C1, T2.C1
     2  -  JOINED COLUMN : T2.C2, T1.C1, T2.C1
             WHERE FILTER : DECODE(T2.C2,NULL,'A','B') = 'A'
     3  -  READ COLUMN : T1.C1
     4  -  HASH KEY : T2.C1
           RECORD COLUMN : T2.C2
           READ KEY COLUMN : T2.C1, T2.C2
             HASH FILTER : T2.C1 = T1.C1
     5  -  READ COLUMN : T2.C1, T2.C2

<<<  end print plan

Workaround

Use the NO_QUERY_TRANSFORMATION hint as follows.

\EXPLAIN PLAN 
SELECT /*+ NO_QUERY_TRANSFORMATION */
       t1.c1, t2.c1
  FROM t1 LEFT OUTER JOIN t2
    ON t1.c1 = t2.c1
 WHERE DECODE( t2.c2, NULL, 'A', 'B' ) = 'A'
;

C1   C1
-- ----
 2 null

1 row selected.

>>>  start print plan

< Execution Plan >
========================================================================
|  IDX  |  NODE DESCRIPTION                                            |
------------------------------------------------------------------------
|    0  |  SELECT STATEMENT                                            |
|    1  |    QUERY BLOCK ("$QB_IDX_2")                                 |
|    2  |      HASH JOIN (LEFT OUTER JOIN)                             |
|    3  |        TABLE ACCESS ("T1")                                   |
|    4  |        HASH JOIN INSTANT                                     |
|    5  |          TABLE ACCESS ("T2")                                 |
========================================================================

     1  -  TARGET : T1.C1, T2.C1
     2  -  JOINED COLUMN : T2.C2, T1.C1, T2.C1
             WHERE FILTER : DECODE(T2.C2,NULL,'A','B') = 'A'
     3  -  READ COLUMN : T1.C1
     4  -  HASH KEY : T2.C1
           RECORD COLUMN : T2.C2
           READ KEY COLUMN : T2.C1, T2.C2
             HASH FILTER : T2.C1 = T1.C1
     5  -  READ COLUMN : T2.C1, T2.C2

<<<  end print plan

ISSUE-4334 It fails to join the node due to the SCN difference when ascending to Global Open.

Description

It fails to join a cluster because the scn of a specific member is smaller than a maximum scn of the cluster, and this error has been fixed.

Symptom

It can not ascend to Global Open with the following error.

gSQL> ALTER SYSTEM OPEN GLOBAL DATABASE;

ERR-42000(16410): Startup driver node must have the latest data - a suitable startup driver node is 'G1N1' member

Workaround

The patch is required.

ISSUE-6129 When executing prepare/execute on the global connection, a valid plan cache may be dropped.

Description

It has been occurred from version 20c.1.12.

When executing prepare/execute on the global connection, a valid plan cache is dropped at the first execute and the new plan cache is created, and this error has been fixed.

Symptom

Execute prepare/execute with multiple gsqlnet in the global connection environment as follows.
gSQL> \var v1 INTEGER
gSQL> \exec :v1 := 1111

gSQL> \prepare sql SELECT * FROM t1 WHERE sk = :v1;

SQL prepared.

gSQL> \exec

  SK
----
1111

1 row selected.

Then, enquire the status of the plan cache to find the dropped plan cache as follows.

SELECT COUNT(*) FROM x$sql_cache WHERE dropped IS TRUE;

COUNT(*)
--------
       2

1 row selected.

Workaround

The patch is required.

ISSUE-4575 The identical SQL statement is redundantly cached in the embedded SQL.

Description

The embedded SQL reuses the identical SQL by caching DML and the query statement when using the identical SQL. If char pointer is used as a host variable, then the identical SQL statement is redundantly cached.

Symptom

If a char pointer is used as a host variable and the string length of this char pointer changes as follows, then a new SQL statement is created.
void func(char * data)
{
    EXEC SQL BEGIN DECLARE SECTION;
    char * strPtr;
    EXEC SQL END DECLARE SECTION;
    strPtr = data;
    EXEC SQL DELETE FROM TEST WHERE C1 = :strPtr;
    if(sqlca.sqlcode == 0 )
    ....
}

Workaround

Use a char array instead of using the char pointer as a host variable.

20c.1.28 Patch Notes

ISSUE-5828 The join query including ROWNUM should not be sent to the remote node, but sometimes it is sent.

Description

The join query including ROWNUM should not be sent to the remote node. If each node stores data in a different order then the result may be wrong even though it is a clone table.

Symptom

\explain plan
SELECT COUNT(*)
  FROM ( SELECT c1
           FROM t_clone
          WHERE ROWNUM <= 1000
       ) X
     , t_shard Y
 WHERE X.c1 = Y.c1
; 

COUNT(*)
--------
    1005

1 row selected.

>>>  start print plan

< Execution Plan >
============================================================================
|IDX| NODE DESCRIPTION                                                     |
----------------------------------------------------------------------------
|  0|  SELECT STATEMENT                                                    |
|  1|    QUERY BLOCK ("$QB_IDX_2")                                         |
|  2|      SINGLE CLUSTER                                                  |
|  3|        CLUSTER PUSHER ("_$NI_6")                                     |
|  4|          INLINE_VIEW ("X")                                           |
|  5|            QUERY BLOCK ("$QB_IDX_6")                                 |
|  6|              COUNT                                                   |
|  7|                TABLE ACCESS ("T_CLONE")                              |
|  8|        AGGREGATION BY HASH                                           |
|  9|          NESTED JOIN (INNER JOIN)                                    |
| 10|            PUSHER TABLE ACCESS ("_$NI_6")                            |
| 11|            INDEX ACCESS ("T_SHARD" AS Y, "T_SHARD_PRIMARY_KEY_INDEX")|
============================================================================

     1  -  TARGET : COUNT(*)
     2  -  SQL : SELECT /*+ KEEP_JOINED_TABLE USE_HASH_IN( _A1, 7801 ) NO_MERGE( _A2 ) INDEX( _A1, "PUBLIC"."T_SHARD_PRIMARY_KEY_INDEX" ) */ COUNT(*) FROM ( ( SELECT /*+ FULL( _A3 ) */ "_A3"."C1" FROM "PUBLIC"."T_CLONE"@LOCAL AS "_A3" WHERE ROWNUM <= :_V0 ) AS "_A2"("C1") INNER JOIN "PUBLIC"."T_SHARD"@LOCAL AS "_A1" ON "_A1"."C1" = "_A2"."C1") ALIAS "_A4"
           TARGET DOMAIN : G1(G1N1) 1 rows, G2(G2N1) 1 rows, G3(G3N1) 1 rows
           RE-AGGREGATION
             AGGREGATION : SUM( COUNT(*) )
     4  -  TARGET : COUNT(*)
     5  -  AGGREGATION : COUNT(*)
     6  -  JOINED COLUMN : NOTHING
     7  -  COLUMN : _A3.C1 AS C1
     8  -  TARGET : _A3.C1
     9  -  STOP KEY FILTER : ROWNUM <= :_V0
    10  -  CLONED 
           READ COLUMN : _A3.C1
    11  -  HASH KEY : _A1.C1
           READ KEY COLUMN : _A1.C1
             HASH FILTER : _A1.C1 = _A2.C1
           FETCH ONE ROW
    12  -  HASH SHARD ( # 3 ) 
           READ INDEX COLUMN : _A1.C1

<<<  end print plan

The join query including ROWNUM should not be sent to the remote node, but ROWNUM filter is sent to the remote query node in the query above.

Workaround

Use /*+ LOCAL_JOIN(Y) */ hint.

ISSUE-5665 If the join including three or more tables is performed by using the instant nested loop join method, then the result may be wrong.

Description

If the join including three or more tables is performed by using the instant nested loop join method, then the result may be wrong.

Symptom

--# result : 27
\EXPLAIN PLAN
SELECT COUNT(t2.col1)
  FROM t2, t3, t4, t1
 WHERE t2.col1 + t1.col1 = t4.col1
   AND t3.col1 + t1.col1 = t4.col1;

COUNT(T2.COL1)
--------------
             0

1 row selected.

>>>  start print plan

< Execution Plan >
========================================================================
|  IDX  |  NODE DESCRIPTION                                            |
------------------------------------------------------------------------
|    0  |  SELECT STATEMENT                                            |
|    1  |    QUERY BLOCK ("$QB_IDX_2")                                 |
|    2  |      AGGREGATION BY HASH                                     |
|    3  |        NESTED JOIN (INNER JOIN)                              |
|    4  |          TABLE ACCESS ("T1")                                 |
|    5  |          SORT JOIN INSTANT                                   |
|    6  |            NESTED JOIN (INNER JOIN)                          |
|    7  |              NESTED JOIN (INNER JOIN)                        |
|    8  |                INDEX ACCESS ("T2", "T2_COL1")                |
|    9  |                INDEX ACCESS ("T3", "T3_COL1")                |
|   10  |              INDEX ACCESS ("T4", "T4_COL1")                  |
========================================================================

     1  -  TARGET : COUNT( T2.COL1 )
     2  -  AGGREGATION : COUNT( T2.COL1 )
     3  -  JOINED COLUMN : T2.COL1
     4  -  READ COLUMN : T1.COL1
     5  -  SORT KEY : "T4.COL1 ASC NULLS LAST"
           RECORD COLUMN : T2.COL1
           READ KEY COLUMN : T4.COL1
           READ RECORD COLUMN : T2.COL1
             MIN RANGE : T4.COL1 = T2.COL1 + {T1.COL1} AND T4.COL1 = T3.COL1 + {T1.COL1}
             MAX RANGE : T4.COL1 = T2.COL1 + {T1.COL1} AND T4.COL1 = T3.COL1 + {T1.COL1}
     6  -  JOINED COLUMN : T4.COL1, T2.COL1, T3.COL1
     7  -  JOINED COLUMN : T2.COL1, T3.COL1
     8  -  READ INDEX COLUMN : T2.COL1
     9  -  READ INDEX COLUMN : T3.COL1
    10  -  READ INDEX COLUMN : T4.COL1

<<<  end print plan

The result from the query above should be '27', but actually '0' is output.

The WHERE clause condition 'T4.COL1 = T2.COL1 + T1.COL1 AND T4.COL1 = T3.COL1 + T1.COL1' can not be used as an index range condition, but actually it is used.

However, if the query is modified, then the correct result is output as follows.

\EXPLAIN PLAN
SELECT COUNT(t2.col1)
  FROM t2, t3, t4, t1
 WHERE t2.col1 + t1.col1 = t4.col1
   AND t3.col1 + t1.col1 = t4.col1;

COUNT(T2.COL1)
--------------
            27

1 row selected.

>>>  start print plan

< Execution Plan >
========================================================================
|  IDX  |  NODE DESCRIPTION                                            |
------------------------------------------------------------------------
|    0  |  SELECT STATEMENT                                            |
|    1  |    QUERY BLOCK ("$QB_IDX_2")                                 |
|    2  |      AGGREGATION BY HASH                                     |
|    3  |        NESTED JOIN (INNER JOIN)                              |
|    4  |          NESTED JOIN (INNER JOIN)                            |
|    5  |            NESTED JOIN (INNER JOIN)                          |
|    6  |              INDEX ACCESS ("T2", "T2_COL1")                  |
|    7  |              INDEX ACCESS ("T3", "T3_COL1")                  |
|    8  |            INDEX ACCESS ("T4", "T4_COL1")                    |
|    9  |          FLAT JOIN INSTANT                                   | 
|   10  |            TABLE ACCESS ("T1")                               |
========================================================================

     1  -  TARGET : COUNT( T2.COL1 )
     2  -  AGGREGATION : COUNT( T2.COL1 )
     3  -  JOINED COLUMN : T3.COL1, T1.COL1, T4.COL1, T2.COL1
             ON FILTER : ( T3.COL1 + T1.COL1 ) = T4.COL1 AND ( T2.COL1 + T1.COL1 ) = T4.COL1
     4  -  JOINED COLUMN : T3.COL1, T4.COL1, T2.COL1
     5  -  JOINED COLUMN : T3.COL1, T2.COL1
     6  -  READ INDEX COLUMN : T2.COL1
     7  -  READ INDEX COLUMN : T3.COL1
     8  -  READ INDEX COLUMN : T4.COL1
     9  -  RECORD COLUMN : T1.COL1
           READ COLUMN : T1.COL1
    10  -  READ COLUMN : T1.COL1

<<<  end print plan

Workaround

Use a hint other than USE_INL(t1). For example, use USE_NL(t1), USE_HASH(t1) or USE_MERGE(t1).

ISSUE-4863 The lock is not switched to the optimistic mode after REBALANCE.

Description

The lock which is switched to the pessimistic mode during ALTER TABLE REBALANCE, is not switched to the optimistic mode, and it may downgrade the performance.

Symptom

If performing ALTER TABLE REBALANCE ONLINE when DML occurs, then it may downgrade the performance.

Workaround

The patch is required.

20c.1.27 Patch Notes

ISSUE-4334 It fails to join the node due to the SCN difference when ascending to Global Open.

Description

It fails to join a cluster because the scn of a specific member is smaller than a maximum scn of the cluster, and this error has been fixed.

Symptom

It can not ascend to Global Open with the following error.

gSQL> ALTER SYSTEM OPEN GLOBAL DATABASE;

ERR-42000(16410): Startup driver node must have the latest data - a suitable startup driver node is 'G1N1' member

Workaround

The patch is required.

ISSUE-5505 If the access method for leftmost table in the join is the unique index access, and only part of key columns in the group by belong to the unique index, then the result may be wrong.

Description

If the access method for leftmost table in the join is the unique index access, and only part of key columns in the group by belong to the unique index, then the result may be wrong.

Symptom

DROP TABLE IF EXISTS r;
DROP TABLE IF EXISTS s;
DROP TABLE IF EXISTS t;

CREATE TABLE r( c1 INTEGER, c2 INTEGER, c3 INTEGER, c4 INTEGER, c5 INTEGER );

INSERT INTO r VALUES(1, 1, 1, 1, 1);
INSERT INTO r VALUES(1, 2, 1, 1, 1);
INSERT INTO r VALUES(1, 2, 1, 1, 1);
INSERT INTO r VALUES(2, 1, 2, 1, 1);
INSERT INTO r VALUES(2, 1, 2, 2, 1);
INSERT INTO r VALUES(3, 1, 2, 2, 1);
INSERT INTO r VALUES(3, 2, 3, 2, 1);
INSERT INTO r VALUES(4, 1, 3, 3, 1);
INSERT INTO r VALUES(5, 1, 3, 3, 1);
INSERT INTO r VALUES(1, 3, 2, 1, 1);
INSERT INTO r VALUES(1, 1, 1, 1, 1);

COMMIT;

CREATE TABLE s( c1 INTEGER PRIMARY KEY, c2 INTEGER, c3 INTEGER, c4 INTEGER, c5 INTEGER );

INSERT INTO s VALUES(1, 1, 1, 1, 1);
INSERT INTO s VALUES(2, 3, 1, 1, 1);
INSERT INTO s VALUES(3, 3, 1, 1, 1);
INSERT INTO s VALUES(4, 2, 2, 1, 1);
INSERT INTO s VALUES(5, 2, 2, 2, 1);
INSERT INTO s VALUES(6, 1, 2, 2, 1);
INSERT INTO s VALUES(7, 1, 3, 2, 1);
INSERT INTO s VALUES(8, 3, 3, 3, 1);
INSERT INTO s VALUES(9, 3, 3, 3, 1);

COMMIT;


CREATE TABLE t( c1 INTEGER, c2 INTEGER, c3 INTEGER, c4 INTEGER, c5 INTEGER );

INSERT INTO t VALUES(1, 1, 1, 1, 1);
INSERT INTO t VALUES(1, 3, 3, 1, 1);
INSERT INTO t VALUES(1, 3, 3, 1, 1);
INSERT INTO t VALUES(1, 2, 2, 1, 1);
INSERT INTO t VALUES(1, 2, 2, 1, 1);
INSERT INTO t VALUES(2, 3, 1, 1, 1);
INSERT INTO t VALUES(3, 3, 1, 1, 1);
INSERT INTO t VALUES(4, 2, 2, 1, 1);
INSERT INTO t VALUES(5, 2, 2, 2, 1);

COMMIT;

--# result : 6 rows
\EXPLAIN PLAN
SELECT s.c1, s.c2, t.c3
  FROM s, r, t
 WHERE s.c1 > 0 AND s.c1 < 5
   AND s.c1 = r.c1
   AND r.c1 = t.c1
 GROUP BY s.c1, s.c2, t.c3;


C1 C2 C3
-- -- --
 1  1  2
 1  1  3
 1  1  1
 1  1  2
 1  1  3
 1  1  1
 1  1  2
...
18 rows selected

< Execution Plan >
========================================================================
|  IDX  |  NODE DESCRIPTION                                            |
------------------------------------------------------------------------
|    0  |  SELECT STATEMENT                                            |
|    1  |    QUERY BLOCK ("$QB_IDX_2")                                 |
|    2  |      GROUP                                                   |
|    3  |        HASH JOIN (INNER JOIN)                                |
|    4  |          MERGE JOIN (INNER JOIN)                             |
|    5  |            INDEX ACCESS ("S", "S_PRIMARY_KEY_INDEX")         |
|    6  |            INDEX ACCESS ("R", "R_IDX")                       |
|    7  |          HASH JOIN INSTANT                                   |
|    8  |            TABLE ACCESS ("T")                                |
========================================================================

The result from the query above should be 6 rows, but actually 18 rows are output. The leftmost table s uses 'S_PRIMARY_KEY_INDEX', so the join result is sorted for s.c1. In the plan above, group by performs the grouping by using the sorted result of the join. However, the sorted records are not sorted for all group key columns, so it may lead to the wrong result.

Workaround

Use /*+ USE_GROUP_HASH */ hint.

ISSUE-5353 When connecting and disconnecting by using the window ODBC, then the number of program handles increase and this error has been fixed.

Description

When repeatedly connecting and disconnecting by using the window ODBC, then the number of entire program handles increase and this error has been fixed.

Symptom

When repeatedly connecting and disconnecting by using the window ODBC, then the number of entire program handles increase.

Workaround

The patch is required.

ISSUE-5367 Statement pooling feature has been added in JDBC.

Description

It supports the statement pooling feature.

Symptom

N/A

Workaround

The patch is required.

ISSUE-5344 When performing view projection pruning it deletes the column used in the upper block.

Description

If the following conditions are satisfied, the server may be abnormally terminated due to improperly performed view projection pruning.

Symptom

The following is a sample query which can cause an error.

SELECT sum_col1
  FROM ( SELECT sum(col1) as sum_col1
              , DECODE( sum(col1), NULL, 0 ) as decode_sum_col1
           FROM t1
          GROUP BY col2 
       ) v1;

decode_sum_col1 is not used in the upper block in v1, so it is pruned. Moreover, sum(col1) which is an argument of DECODE is also pruned. However, sum(col1) is already specified in select list and it is used in the view's upper block, so it should not be deleted.

Workaround

The patch is required.

ISSUE-4234 When performing PSM DDL after ADD MEMBER, then a dictionary integrity constraint violation occurs for the ROUTINE primary key.

Description

When performing PSM DDL after ADD MEMBER, then a dictionary integrity constraint violation occurs for the ROUTINE primary key, and this error has been fixed.

Symptom

When creating a routine and adding a cluster member then creating a routine again, an error occurs as follows.

gSQL> 
CREATE OR REPLACE FUNCTION u1.func1 ()
RETURN INTEGER
AS
BEGIN
    RETURN 0;
END;
/

Function created.

gSQL> 
CREATE OR REPLACE FUNCTION u1.func2 ()
RETURN INTEGER
AS
BEGIN
    RETURN 0;
END;
/

Function created.

gSQL> 
CREATE OR REPLACE FUNCTION u1.func3 ()
RETURN INTEGER
AS
BEGIN
    RETURN 0;
END;
/

Function created.

gSQL> 
CREATE OR REPLACE FUNCTION u1.func4 ()
RETURN INTEGER
AS
BEGIN
    RETURN 0;
END;
/

Function created.
\connect as sysdba

gSQL> ALTER CLUSTER GROUP G3 ADD CLUSTER MEMBER G3N3 HOST '127.0.0.1' PORT 13350;
gSQL>
CREATE OR REPLACE FUNCTION u1.func5 ()
RETURN INTEGER
AS
BEGIN
    RETURN 0;
END;
/

ERR-23000(15006): MEMBER(G3N3): "ROUTINES_PRIMARY_KEY": dictionary integrity constraint violation by concurrent DDL execution

Workaround

The patch is required.

ISSUE-5162 Even when SQL_ATTR_CONNECTION_TIMEOUT is set in ODBC, it may wait longer than the settings, and this error has been fixed.

Description

Even when SQL_ATTR_CONNECTION_TIMEOUT is set in ODBC to detect the network disconnection, it may wait longer than the given timeout setting, and this error has been fixed.

Symptom

Even when SQL_ATTR_CONNECTION_TIMEOUT is set in ODBC, it can not detect the network disconnection in a specific situation, so it keeps waiting for the server's response in ODBC.

Workaround

Add the following attributes to odbc.ini, so that it can quickly detect the network disconnection.

Or, alter the following kernel attributes, so that it can quickly detect the network disconnection.

ISSUE-5124 If it fails to allocating dynamic memory, then it may kill the server due to the simultaneity issue.

Description

If it fails to allocating dynamic memory, then it may kill the server due to the simultaneity issue.

Symptom

If it fails while multiple threads allocate a single dynamic memory, then it may kill the server due to the simultaneity issue.

Workaround

The patch is required.

20c.1.26 Patch Notes

ISSUE-4933 If the server becomes unavailable while using JDBC XA, then it should transfer XA error to the client.

Description

If the server becomes unavailable while using JDBC XA, then it should transfer XA error to the client.

Symptom

If the server becomes unavailable while using JDBC XA, then it should transfer XA error to the client. However, in reality, it does not transfer XA error and it is operated as if it succeeds.

Workaround

The patch is required.

ISSUE-4873 It supports XA rollback feature for XA transaction which is not dissociated from the session.

Description

XA transaction is associated with the session until performing xa end, and to commit or rollback the XA transaction, it should be dissociated from the session. However, other DBMS support the rollback feature even when the transaction is not dissociated from the session. Therefore, it has been improved to support the same feature.

Symptom

If performing xa rollback without performing xa end for the XA transaction in progress in the session, then an error occurs. However, it is normally operated if performing xa rollback after performing xa end.

gSQL> XA START 10

XA transaction started

gSQL> INSERT INTO T1 VALUES ( 1 );

1 row created.

gSQL> XA ROLLBACK 10   

ERR-HY000(40035): resource manager unavailable

gSQL> XA END 10 SUCCESS

XA transaction ended

gSQL> XA ROLLBACK 10  

Rollback completed

Workaround

The patch is required.

ISSUE-4753 When enquiring USER_TABLES, the global temporary table is not viewed.

Description

When enquiring the dictionary view such as USER_TABLES, ALL_TABLES and DBA_TABLES, the global temporary table is not viewed.

Symptom

Even though enquiring the global temporary table through USER_TABLES after the global temporary table has been created as follows, but the global temporary table is not viewed.

gSQL> CREATE GLOBAL TEMPORARY TABLE gt1 ( c1 INTEGER ) ON COMMIT DELETE ROWS;

Table created.

gSQL> CREATE GLOBAL TEMPORARY TABLE gt2 ( c1 INTEGER ) ON COMMIT PRESERVE ROWS;

Table created.

gSQL> COMMIT;

Commit complete.

gSQL> 
SELECT table_schema
     , table_name
     , temporary
     , duration
  FROM USER_TABLES
 WHERE table_name IN ( 'GT1', 'GT2' )
 ORDER BY 2
; 

no rows selected.

The correct result is viewed as follows after patching.

gSQL>
SELECT table_schema
     , table_name
     , table_type
     , commit_action
  FROM TABLES
 WHERE table_name IN ( 'GT1', 'GT2' )
 ORDER BY 2
; 

TABLE_SCHEMA TABLE_NAME TABLE_TYPE       COMMIT_ACTION
------------ ---------- ---------------- -------------
PUBLIC       GT1        GLOBAL TEMPORARY DELETE       
PUBLIC       GT2        GLOBAL TEMPORARY PRESERVE     

2 rows selected.

Execute DictionarySchema.sql to apply the patch as follows.

% gsql sys gliese --as sysdba --import $GOLDILOCKS_HOME/admin/standalone/DictionarySchema.sql
% gsql sys gliese --as sysdba --import $GOLDILOCKS_HOME/admin/cluster/DictionarySchema.sql

Workaround

Enquire the SQL standard INFORMATION_SCHEMA.TABLES.

gSQL>
SELECT table_schema
     , table_name
     , table_type
     , commit_action
  FROM TABLES
 WHERE table_name IN ( 'GT1', 'GT2' )
 ORDER BY 2
; 

TABLE_SCHEMA TABLE_NAME TABLE_TYPE       COMMIT_ACTION
------------ ---------- ---------------- -------------
PUBLIC       GT1        GLOBAL TEMPORARY DELETE       
PUBLIC       GT2        GLOBAL TEMPORARY PRESERVE     

2 rows selected.

ISSUE-4709 Query execution for the local node may fail on local open phase.

Description

If enquiring the table by connecting to the node on local open phase in cluster environment, then an error occurs.

Symptom

If the connected node is on local open phase, then it can not access the remote node but it can access the local node. However, if it determines that the node on local open phase can not access the local node, then the query fails.

The following is an example of an error occurred when executing the query on G1N1 on local open phase.

gSQL> SELECT * FROM v$datafile;

ERR-HY000(16354): connection of member 'G1N1' is broken

It determines whether the current node can access a specific node based on the connection information. However, if it can not refer to the connection information in case when it is on local open phase, then it may determine that it can not access the current node either.

It is modified to determine that it can access the current node even when it can not refer to the connection information.

Workaround

The patch is required.

ISSUE-4696 View columns have been added to view the update master information of the cluster table.

Description

The update master in the cluster table is a member node where DML is first performed when DML occurs in the table.

The followings affect determining the update master of each cluster table.

IS_UPDATE_MASTER column has been added to the following dictionary views to easily view the update master information which is subject to change during the operation.

Symptom

View it as follows.

SELECT group_name, member_name, is_update_master 
  FROM user_tab_place 
 WHERE table_name = 'R';

GROUP_NAME MEMBER_NAME IS_UPDATE_MASTER
---------- ----------- ----------------
G1         G1N1        TRUE            
G1         G1N2        FALSE           
G2         G2N1        TRUE            
G2         G2N2        FALSE           
G3         G3N1        TRUE            
G3         G3N2        FALSE           

6 rows selected.

Cluster table R is located in groups G1, G2, G3, and the member corresponding to update master in each group is G1N1, G2N1 and G3N1.

Workaround

The patch is required.

ISSUE-4609 When using two or more subquery expressions including a join combine, then a segment fault occurs.

Description

When referring to the information of the subquery expression in the statement in which two or more subquery expressions including a join combine are used, then a segment fault occurs.

The error occurred in the following clauses.

Symptom

When building the information to refer to the subquery expression in the clause including the subquery expression, then it can not find the related expression, so it never stops searching for the expression. Therefore, the segment fault occurs.
CREATE TABLE T1(
       C1   NUMBER,
       C2   NUMBER,
       C3   NUMBER,
       C4   NUMBER );

CREATE TABLE T2(
       C1   NUMBER,   
       C2   NUMBER,
       C3   NUMBER,
       C4   NUMBER );

--# Segment Fault
SELECT 
     (
      SELECT t1.c1 
        FROM T1
             INNER 
             JOIN
             T2
             ON ( t1.c3 = t2.c2 OR t1.c3 = t2.c3 ) 
     )
   , (  
      SELECT t1.c1 
        FROM T1
             INNER 
             JOIN
             T2
             ON ( t1.c3 = t2.c2 OR t1.c3 = t2.c3 ) 
     ) AS DS2
  FROM dual;

Workaround

The patch is required.

ISSUE-4589 Complex view merging was executed even though SELECT FOR UPDATE, UPDATE, DELETE does not support the complex view merging.

Description

Complex view merging was executed even though SELECT FOR UPDATE, UPDATE, DELETE does not support the complex view merging.

Symptom

The complex view merging should not be executed for the following query. However, the complex view merging is executed after the subquery unnesting, so the server is abnormally terminated.

DROP TABLE IF EXISTS t1;

CREATE TABLE t1
(
    c1 INTEGER
  , c2 INTEGER
  , c3 INTEGER
  , c4 INTEGER
);

COMMIT;

UPDATE t1
   SET c1 = 1
 WHERE ( c1, c2, c3, c4 )
    IN ( SELECT c1, c2, c3, c4
           FROM t1
          GROUP BY c1, c2, c3, c4
       );

Workaround

The patch is required.

ISSUE-4566 It can not process the overflow even when the number of digits increased after the rounding off while converting the numeric type to NUMBER type.

Description

It can not process the overflow even when the number of digits increased after the rounding off while converting the numeric type to NUMBER type.

Symptom

The following query was supposed to cause an overflow error.

gSQL> SELECT CAST( 9999999999.9 AS NUMBER(10,0)) FROM dual;

CAST( 9999999999.9 AS NUMBER(10,0))
-----------------------------------
                        10000000000

1 row selected.

Workaround

Convert it to NUMBER type after convert it to the character type.

gSQL> SELECT CAST( TO_CHAR( 9999999999.9 ) AS NUMBER(10,0) ) FROM dual;

ERR-22003(12060): data is outside the range of the data type to which the number is being converted : 
SELECT CAST( TO_CHAR( 9999999999.9 ) AS NUMBER(10,0) ) FROM dual
       *
ERROR at line 1:

ISSUE-4559 The trace log is output as TRACE_LONG_RUN_CURSOR even when the cursor does not exist in SELECT INTO statement.

Description

TRACE_LONG_RUN_CURSOR property records the long run cursor which exceeds the specified time on the trace log. However, the trace log is output as TRACE_LONG_RUN_CURSOR even though SELECT INTO statement does not require the cursor, and this error has been fixed.

Symptom

If SELECT INTO statement fails as follows, it is determined as TRACE_LONG_RUN_CURSOR so it records the trace log.

gSQL> CREATE TABLE r ( c1 INTEGER );

Table created.

gSQL> INSERT INTO r VALUES ( 1 );

1 row created.


--# It is the long run cursor trace which takes more than 1 second
gSQL> ALTER SYSTEM SET TRACE_LONG_RUN_CURSOR = 1000;

System altered.


gSQL> \var v1 INTEGER
gSQL> \prepare sql SELECT c1 INTO :v1 FROM r WHERE c1 = 1 FOR UPDATE;

SQL prepared.

--# It is not recorded as TRACE_LONG_RUN_CURSOR on the trace log.
gSQL> \exec

V1
--
 1

1 row selected.


gSQL> INSERT INTO r VALUES ( 1 );

1 row created.


--# Execute after 2 seconds.
--# It is recorded as TRACE_LONG_RUN_CURSOR on the trace log.
gSQL> \exec

ERR-42000(16289): into clause can have only one row

Workaround

The patch is required.

ISSUE-4537 When performing ADD MEMBER after the incorrect DROP TABLESPACE statement succeeds, then the new member is abnormally terminated.

Description

If performing ADD MEMBER when DROP TABLESPACE statement succeeds though it was supposed to fail, then the newly added cluster member is abnormally terminated, so ADD MEMBER fails.

It is modified to cause an error when the DROP TABLESPACE's target tablespace was set as the user's default tablespace.

gSQL> CREATE USER u1 IDENTIFIED BY u1
         TEMPORARY TABLESPACE temp_tbs;

User created.

gSQL> DROP TABLESPACE temp_tbs CASCADE;

ERR-42000(16133): cannot drop tablespace: "TEMP_TBS" is default tablespace of user "U1"

To drop the tablespace, modify the user's default tablespace as follows first then drop it.

gSQL> ALTER USER u1 TEMPORARY TABLESPACE mem_temp_tbs;

User altered.

gSQL> DROP TABLESPACE temp_tbs CASCADE;

Tablespace dropped.

Symptom

DROP TABLESPACE succeeds as follows though the user's default tablespace was unable to drop.

gSQL> CREATE USER u1 IDENTIFIED BY u1
         TEMPORARY TABLESPACE temp_tbs;

User created.

gSQL> DROP TABLESPACE temp_tbs CASCADE;

Tablespace dropped.

Then, if a new cluster member is added as follows, then the new member(g2n3) is abnormally terminated, so ADD MEMBER fails.

gSQL> ALTER CLUSTER GROUP g2 ADD CLUSTER MEMBER g2n3 HOST '127.0.0.1' PORT 12350;

Workaround

Before performing ADD MEMBER, it is required to find the user violating DROP TABLESPACE integrity and modify the user's default tablespace as follows.

If the result of the following query exists, then it is required to modify the user's default tablespace.

SELECT auth.authorization_name
  FROM definition_schema.authorizations@local AS auth
     , definition_schema.users@local AS usr
 WHERE auth.auth_id = usr.auth_id
   AND NOT EXISTS ( SELECT *
                      FROM definition_schema.tablespaces@local AS tbs
                     WHERE tbs.tablespace_id = usr.default_data_tablespace_id );

If the result of the following query exists, then it is required to modify the user's temporary tablespace.

SELECT auth.authorization_name
  FROM definition_schema.authorizations@local AS auth
     , definition_schema.users@local AS usr
 WHERE auth.auth_id = usr.auth_id
   AND NOT EXISTS ( SELECT *
                      FROM definition_schema.tablespaces@local AS tbs
                     WHERE tbs.tablespace_id = usr.default_temp_tablespace_id );

If the result of the following query exists, then it is required to modify the user's index tablespace.

SELECT auth.authorization_name
  FROM definition_schema.authorizations@local AS auth
     , definition_schema.users@local AS usr
 WHERE auth.auth_id = usr.auth_id
   AND NOT EXISTS ( SELECT *
                      FROM definition_schema.tablespaces@local AS tbs
                     WHERE tbs.tablespace_id = usr.default_index_tablespace_id )
;

ISSUE-4500 If performing the index scan by using another OR condition when the join condition includes OR condition, then the query waits infinitely.

Description

When the join combine method is selected by the join condition including OR condition, and the column included in the join combine is referenced in the relation to which another join belongs, then it waits infinitely.

Symptom

When referring to the column included in the join which consists of join combine as follows, then it can not find the column information, so it waits infinitely.

gSQL> CREATE TABLE T1( C1 INT, C2 INT );

Table created.

gSQL> CREATE INDEX IDX_T1_C1 ON T1( C1 );

Index created.

gSQL> CREATE INDEX IDX_T1_C2 ON T1( C2 );

Index created.

gSQL> INSERT INTO T1 VALUES ( 1, 1 );

1 row created.

--# Infinite waiting
gSQL> SELECT *
  FROM T1 A, T1 B
 WHERE ( A.C1 = B.C1 OR A.C1 = B.C2 )
   AND EXISTS( SELECT 1
                 FROM T1 C
                WHERE ( C.C1 = A.C1 OR C.C2 = A.C1 ) );

Workaround

Use NO_USE_JOIN_COMBINE hint as follows so that JOIN COMBINE would not be configured.

gSQL> SELECT /*+ NO_USE_JOIN_COMBINE( A ) */ *
  FROM T1 A, T1 B
 WHERE ( A.C1 = B.C1 OR A.C1 = B.C2 )
   AND EXISTS( SELECT 1
                 FROM T1 C
                WHERE ( C.C1 = A.C1 OR C.C2 = A.C1 ) );

C1 C2 C1 C2
-- -- -- --
 1  1  1  1

1 rows selected.

ISSUE-4480 When defining %TYPE which refers to the column whose reserved word is the column name, then an error occurs.

Description

When defining %TYPE which refers to the column whose reserved word is the column name, then an error occurs.

Symptom

An error occurs because it can not find the column information though OFFSET column exists in the table as follows.

gSQL> CREATE TABLE t1( "OFFSET" INTEGER, LENGTH INTEGER );

Table created.

gSQL> COMMIT;

Commit complete.

gSQL> CREATE OR REPLACE PROCEDURE proc1( p1 public.t1."OFFSET"%TYPE )
      AS
      BEGIN
        NULL;
      END;
      /

ERR-2F000(17012): unknown type name : 
CREATE OR REPLACE PROCEDURE proc1( p1 public.t1."OFFSET"%TYPE )

Workaround

The patch is required.

ISSUE-4472 When outputting DDL_DB, the schema privilege DDL is not output.

Description

If outputting DDL_DB when two or more schema are created, then only part of them are output and other are not output.

Symptom

Three schema privilege DDLs should have been created in the example below, but actually only one DDL is created.

gSQL> CREATE SCHEMA s1;

Schema created.

gSQL> CREATE SCHEMA s2;

Schema created.

gSQL> CREATE SCHEMA s3;

Schema created.

gSQL> COMMIT;

Commit complete.

gSQL> CREATE USER u1 IDENTIFIED BY u1 WITHOUT SCHEMA;

User created.

gSQL> CREATE USER u2 IDENTIFIED BY u2 WITHOUT SCHEMA;

User created.

gSQL> CREATE USER u3 IDENTIFIED BY u3 WITHOUT SCHEMA;

User created.

gSQL> COMMIT;

Commit complete.

gSQL> GRANT CREATE TABLE ON SCHEMA s1 TO u1;

Grant succeeded.

gSQL> GRANT CREATE VIEW  ON SCHEMA s2 TO u2, u3;

Grant succeeded.

gSQL> COMMIT;

Commit complete.

gSQL> \ddl_db


--##################################################### 
--# Database DDL 
--##################################################### 


SET SESSION AUTHORIZATION "SYS"; 
COMMENT 
    ON DATABASE 
    IS 'goldilocks database' 
;
COMMIT;

...Ellipsis...

--##################################################### 
--# Schema Privilege DDL 
--##################################################### 


SET SESSION AUTHORIZATION "SYS"; 
GRANT 
    CREATE TABLE ON SCHEMA "S1" 
    TO "U1" 
;
COMMIT;

--##################################################### 
--# Public Synonym DDL 
--##################################################### 

...Ellipsis...

Three schema privilege DDLs are created after solving the problem.

gSQL> CREATE SCHEMA s1;

Schema created.

gSQL> CREATE SCHEMA s2;

Schema created.

gSQL> CREATE SCHEMA s3;

Schema created.

gSQL> COMMIT;

Commit complete.

gSQL> CREATE USER u1 IDENTIFIED BY u1 WITHOUT SCHEMA;

User created.

gSQL> CREATE USER u2 IDENTIFIED BY u2 WITHOUT SCHEMA;

User created.

gSQL> CREATE USER u3 IDENTIFIED BY u3 WITHOUT SCHEMA;

User created.

gSQL> COMMIT;

Commit complete.

gSQL> GRANT CREATE TABLE ON SCHEMA s1 TO u1;

Grant succeeded.

gSQL> GRANT CREATE VIEW  ON SCHEMA s2 TO u2, u3;

Grant succeeded.

gSQL> COMMIT;

Commit complete.

gSQL> \ddl_db


--##################################################### 
--# Database DDL 
--##################################################### 


SET SESSION AUTHORIZATION "SYS"; 
COMMENT 
    ON DATABASE 
    IS 'goldilocks database' 
;
COMMIT;

...Ellipsis...

--##################################################### 
--# Schema Privilege DDL 
--##################################################### 


SET SESSION AUTHORIZATION "SYS"; 
GRANT 
    CREATE TABLE ON SCHEMA "S1" 
    TO "U1" 
;
COMMIT;

SET SESSION AUTHORIZATION "SYS"; 
GRANT 
    CREATE VIEW ON SCHEMA "S2" 
    TO "U2" 
;
COMMIT;

SET SESSION AUTHORIZATION "SYS"; 
GRANT 
    CREATE VIEW ON SCHEMA "S2" 
    TO "U3" 
;
COMMIT;

--##################################################### 
--# Public Synonym DDL 
--##################################################### 

...Ellipsis...

Workaround

Output GRANT information per each schema.

gSQL> \ddl_schema s1 GRANT


SET SESSION AUTHORIZATION "SYS"; 
GRANT 
    CREATE TABLE ON SCHEMA "S1" 
    TO "U1" 
;
COMMIT;

gSQL> \ddl_schema s2 GRANT


SET SESSION AUTHORIZATION "SYS"; 
GRANT 
    CREATE VIEW ON SCHEMA "S2" 
    TO "U2" 
;
COMMIT;

SET SESSION AUTHORIZATION "SYS"; 
GRANT 
    CREATE VIEW ON SCHEMA "S2" 
    TO "U3" 
;
COMMIT;

ISSUE-4471 When creating TABLESPACE with DISK TABLESPACE statement which was output with DDL_DB command, then a syntax error occurs.

Description

When creating TABLESPACE with CREATE DISK TABLESPACE statement which was output with DDL_DB command, then a syntax error occurs.

Symptom

  1. Create the tablespace.

gSQL> CREATE DISK DATA TABLESPACE disk_test_01 DATAFILE 'DISK_TEST_01.dbf' SIZE 100M;
COMMIT;
  1. Input \ddl_db.

gSQL> \ddl_db

--##################################################### 
--# Database DDL 
--##################################################### 


SET SESSION AUTHORIZATION "SYS"; 
COMMENT 
    ON DATABASE 
    IS 'goldilocks database' 
;
COMMIT;

--##################################################### 
--# Tablespace DDL 
--##################################################### 

SET SESSION AUTHORIZATION "SYS"; 
CREATE DISK DATA TABLESPACE "DISK_TEST_01" 
    DATAFILE 
        '/home/product/Gliese/home/g1n1_home/db/DISK_TEST_01.dbf' 
        SIZE 104857600 REUSE 
        AT "G1N1" 
        AUTOEXTEND OFF 
      , 
        '/home/product/Gliese/home/g2n1_home/db/DISK_TEST_01.dbf' 
        SIZE 104857600 REUSE 
        AT "G2N1" 
        AUTOEXTEND OFF 
    ONLINE 
    EXTSIZE 262144 
;
COMMIT;

... Ellipsis ...
  1. Input tablespace DDL statement which was output by executing \ddl_db command in step 2.

gSQL> CREATE DISK DATA TABLESPACE "DISK_TEST_01" 
    DATAFILE 
        '/home/product/Gliese/home/g1n1_home/db/DISK_TEST_01.dbf' 
        SIZE 104857600 REUSE 
        AT "G1N1" 
        AUTOEXTEND OFF 
      , 
        '/home/product/Gliese/home/g2n1_home/db/DISK_TEST_01.dbf' 
        SIZE 104857600 REUSE 
        AT "G2N1" 
        AUTOEXTEND OFF 
    ONLINE 
    EXTSIZE 262144 
;

ERR-42000(40000): syntax error: 
        AUTOEXTEND OFF 
        ^        ^
Error at line 6

Workaround

Modify the location of AUTOEXTEND OFF and AT <domain_name> in CREATE TABLESPACE statement which was output with \ddl_db, then execute it.

gSQL> CREATE DISK DATA TABLESPACE "DISK_TEST_01" 
    DATAFILE 
        '/home/product/Gliese/home/g1n1_home/db/DISK_TEST_01.dbf' 
        SIZE 104857600 REUSE 
        AUTOEXTEND OFF 
        AT "G1N1" 
      , 
        '/home/product/Gliese/home/g2n1_home/db/DISK_TEST_01.dbf' 
        SIZE 104857600 REUSE 
        AUTOEXTEND OFF 
        AT "G2N1" 
    ONLINE 
    EXTSIZE 262144 
;

Tablespace created.

ISSUE-4454 When TRACE_LOG_ID = xxxxx1 is set, the performance time of the query per section is not output on the trace log.

Description

When TRACE_LOG_ID = xxxxx1 is set, the performance time of the query per section is not output on the trace log. The ones place in TRACE_LOG_ID is the flag which determines whether to output the performance time per section, and it outputs the time when the value is 1.

Symptom

When TRACE_LOG_ID = xxxxx1 is set, the performance time of the query per section is not output on the trace log.

[S][0.000000] SELECT * FROM dual

... Ellipsis ...

< Time Info >
======================================================
| Module    | Time             | Rate     | Call     |
------------------------------------------------------
| Parse     |   0:00:00.000000 |   0.00 % |        1 |
| Validate  |   0:00:00.000000 |   0.00 % |        1 |
| Cost Opt  |   0:00:00.000000 |   0.00 % |        1 |
| Code Opt  |   0:00:00.000000 |   0.00 % |        1 |
| Data Opt  |   0:00:00.000000 |   0.00 % |        1 |
| Execute   |   0:00:00.000000 |   0.00 % |        1 |
| Fetch     |   0:00:00.000000 |   0.00 % |        1 |
| Total     |   0:00:00.000000 | 100.00 % |          |
======================================================

Workaround

The patch is required.

ISSUE-4317 It supports SQL_ATTR_CONNECTION_TIMEOUT property.

Description

If the network is unstable, then the client can not receive the response and stays in blocking status, after sending a query to the server. Therefore, it supports SQL_ATTR_CONNECTION_TIMEOUT property of SQLSetConnectAttr() to solve this problem.

If SQL_ATTR_CONNECTION_TIMEOUT value is set, then the client sends a query to the server and waits for the response as long as the set time. If it can not get the response for the set time, then the client cuts the connection to the server and returns HYT01 Connection timeout expired error.

Symptom

If the network is unstable, then the client waits for the set time after requesting the response to the server.

Workaround

Alter the kernel property value as follows, so that it can quickly detects whether the connection between the client and the server has an error.

net.ipv4.tcp_keepalive_time = 3
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 3
net.ipv4.tcp_retries2 = 5

ISSUE-4031 The column name of the table is not properly displayed in .Net Framework.

Description

When querying the column name in SQLColAttribute() and SQLGetDescField(), SQL_DESC_LABEL property, SQL_DESC_NAME property or SQL_DESC_BASE_COLUMN_NAME property is used. SQL_DESC_LABEL returns the label, when the column has a label. SQL_DESC_NAME returns an alias when the column has an alias. And, SQL_DESC_BASE_COLUMN_NAME returns the column name.

.Net Framework, data provider for ODBC, uses SQL_DESC_NAME when querying the column name, and the column name is unintentionally retrieved when the label is given to the column. Therefore, DOT_NET_FOR_ODBC, the connection property, has been added for Net Framework to solve this problem.

Symptom

If executing the following query in gsql, then the column name is retrieved as follows.

gSQL> SELECT I1, I1 + I1, I1 AS C1 FROM TEST;

I1 I1 + I1 C1
-- ------- --
 1       2  1

If executing the query above in .Net Framework, data provider for ODBC, then the query result is as follows.

SELECT I1, I1 + I1, I1 AS C1 FROM TEST;
I1 NULL C1
-- ---- --
 1    2  1

Workaround

The patch is required.

ISSUE-4254 When executing a subquery containing DISTINCT in the cluster system, then a syntax error occurs in the remote server.

Description

If configuring a cluster query by using the query and executing it when the subquery containing DISTINCT is described and the subquery target which is not referenced exists in the cluster system, then a syntax error occurs in the remote server.
It is because the number of target expressions in the created cluster query and that of view column names do not match.

Symptom

gSQL> CREATE TABLE t1 ( i1 INTEGER, i2 INTEGER ) SHARDING BY HASH( i1 );

Table created.

gSQL> commit;

Commit complete.

gSQL> SELECT v1.i1 FROM ( SELECT DISTINCT i1, i2 FROM t1) v1;

ERR-42000(16241): MEMBER(G2N1): invalid number of column names specified : 
SELECT /*+ NO_MERGE( _A1 ) */ * FROM ( SELECT /*+ USE_DISTINCT_HASH(50) FULL( _A2 ) */ DISTINCT "_A2"."I1", "_A2"."I2" FROM "PUBLIC"."T1"@LOCAL AS "_A2" ) AS "_A1"("I1")
                                                                                                                                                              *
ERROR at line 1:

Workaround

Convert DISTINCT statement into GROUP BY statement.

If GROUP BY is not described within the query in which DISTINCT is described, then define all DISTINCT targets by using GROUP BY and omit DISTINCT.

gSQL> SELECT v1.i1 FROM ( SELECT i1, i2 FROM t1 GROUP BY i1, i2 ) v1;

no rows selected.

20c.1.25 Patch Notes

ISSUE-4246 When using AT clause in EXEC SQL AUTOCOMMIT statement, then an error occurs.

Description

AT clause is not recognizable in EXEC SQL AT :db_name AUTOCOMMIT statement, so INVALID HANDLE error occurs.

Symptom

An error occurs in the following syntax.
EXEC SQL BEGIN DECLARE SECTION;
char         sConnName[10]="con";
EXEC SQL END DECLARE SECTION;

EXEC SQL AT :sConnName AUTOCOMMIT ON;
[ERROR] SQL ERROR -
SQLCODE : -2
SQLSTATE : HY000
ERROR MSG : Invalid handle
FAILURE

Workaround

The patch is required.

ISSUE-4215 If the variable of using clause in EXECUTE IMMEDIATE is IN OUT type, then an error occurs.

Description

If the variable bind type of using clause in EXECUTE IMMEDIATE is IN OUT type, then an error occurs.

Symptom

An error occurs as follows.
CREATE OR REPLACE PROCEDURE proc_inout( p1 IN OUT INTEGER ) AS
  var1 INTEGER := 0;
BEGIN
  DBMS_OUTPUT.PUT_LINE( 'p1 : ' || p1 );

  var1 := p1;
  p1 := var1 + 10;
END;
/
COMMIT;

DECLARE
  var1 INTEGER;
BEGIN
  var1 := 30;

  EXECUTE IMMEDIATE 'BEGIN proc_inout( ? ); END;' USING IN OUT var1;

  DBMS_OUTPUT.PUT_LINE( 'var1 : ' || var1 );
END;
/


ERR-07006(16098): bind type mismatch of parameter number (1) : 
BEGIN proc_inout( ? ); END;
*
ERROR at line 1:
ERR-2F000(17041): execution fail : 
  EXECUTE IMMEDIATE 'BEGIN proc_inout( ? ); END;' USING IN OUT var1;
  *
ERROR at line 6:

Workaround

The patch is required.

ISSUE-4189 If creating the procedure whose parameter is consisted in an order of ref cursor, DB type, and executing it, then an error occurs.

Description

If creating the procedure whose parameter is consisted in an order of ref cursor, DB type, and executing it, then an error occurs.

Symptom

If a user calls the parameter as follows, then an error occurs.
CREATE OR REPLACE PROCEDURE p_test( p1 IN OUT SYS_REFCURSOR,
                                    p2 IN INTEGER ) AS
BEGIN
  IF p2 = 1 THEN
    OPEN p1 FOR SELECT * FROM t1;
  ELSIF p2 = 2 THEN
    OPEN p1 FOR SELECT * FROM t2;
  END IF;
END;
/

Procedure created.



DECLARE
  refcur1 SYS_REFCURSOR;
BEGIN
  p_test( refcur1 , 1 );
END;
/

ERR-2F000(17032): PSM compilation error : 
(1) at (4:21): ERR-2F000(17068): wrong number or types of arguments

Workaround

Change the order of defining the parameter when declaring the procedure.

CREATE OR REPLACE PROCEDURE p_test( p2 IN INTEGER,
                                    p1 IN OUT SYS_REFCURSOR) AS
BEGIN
  IF p2 = 1 THEN
    OPEN p1 FOR SELECT * FROM t1;
  ELSIF p2 = 2 THEN
    OPEN p1 FOR SELECT * FROM t2;
  END IF;
END;
/

Procedure created.



DECLARE
  refcur1 SYS_REFCURSOR;
BEGIN
  p_test( 1, refcur1 );
END;
/

Anonymous PL block executed.

20c.1.24 Patch Notes

ISSUE-4178 DBMS_OUTPUT.PUT_LINE() is output twice.

Description

When DBMS_OUTPUT.PUT_LINE() calls a function including an actual parameter, DBMS_OUTPUT.PUT_LINE(), then the contents of the function are output twice.

Symptom

The function which is an actual parameter is executed twice when executing DBMS_OUTPUT.PUT_LINE, so DBMS_OUTPUT.PUT_LINE() within the function is also executed twice.
DECLARE
  FUNCTION sub( p1 INTEGER ) RETURN INTEGER AS
  BEGIN 
    DBMS_OUTPUT.PUT_LINE( 'p1 = ' || p1 );
    RETURN p1;
  END;
BEGIN
  DBMS_OUTPUT.PUT_LINE( 'sub(x) = ' || sub(10) );
END;
/

p1 = 10
p1 = 10
sub(x) = 10
Anonymous PL block executed.

Workaround

The patch is required.

ISSUE-4135 When a socket error occurs in cluster environment, then the system hangs.

Description

When a socket error occurs on a sender thread in cluster environment, then it can not send the message to the remote member, so the entire system hangs. It has been modified to failover the remote member when a socket error occurs on a sender/ receiver thread to solve this problem.

Symptom

When a network error occurs in cluster, then it checks the heartbeat and failover occurs. In this case, if an error occurs only in a specific socket which is not a heartbeat among threads sending and receiving message with the remote member, then it can not receive the response, so the entire system hangs.

Workaround

The patch is required.

ISSUE-4174 The performance of when the local caches of the global sequence are run out has been improved.

Description

The performance was severely downgraded when the local cache of the global sequence were run out, and this problem has been solved.

Symptom

All servers using sequences proceed the operations to secure local caches from the global cache when the local caches are run out. In this case, they try to competitively secure the remote cserver, so it may downgrade the performance severely.

Workaround

The patch is required.

ISSUE-4182 When restarting cyfile, the recovery may not be operated normally.

Description

If stopping and restarting cyfile while multiple transactions are simultaneously being processed, then the recovery may not be operated normally, and this problem has been solved.

Symptom

If stopping and restarting cyfile while transactions are being processed in multiple sessions, then it causes a trouble because the previously stored transaction is stored again in the data file.

Workaround

The patch is required.

20c.1.23 Patch Notes

ISSUE-4088 If the user explicitly performs OUT binding the bind parameter in the function including an out parameter in ODBC or JDBC, then an error occurs.

Description

If the user explicitly performs OUT binding the bind parameter in the function including an out parameter in ODBC or JDBC, then an error occurs.

Symptom

Though the function parameter is an out type and the user explicitly performed OUT binding the bind parameter according to the parameter type in ODBC program, but an error occurs.
CREATE OR REPLACE FUNCTION func1( a1 OUT INTEGER )
RETURN INTEGER
IS
BEGIN
  a1 := 110;
  RETURN 10;
END;
/
sRet = SQLPrepare( sStmt1,
                   (SQLCHAR*)"CALL FUNC1(?) INTO ?",
                   SQL_NTS );  
        
sRet = SQLBindParameter( sStmt1,
                         1,  
                         SQL_PARAM_OUTPUT,
                         SQL_C_SLONG,
                         SQL_INTEGER,
                         0,  
                         0,  
                         &sV1,
                         0,  
                         &sV1Ind );

sRet = SQLBindParameter( sStmt1,
                         2,  
                         SQL_PARAM_OUTPUT,
                         SQL_C_SLONG,
                         SQL_INTEGER,
                         0,
                         0,
                         &sV2,
                         0,
                         &sV2Ind ) );

sRet = SQLExecute( sStmt1 );

Workaround

The patch is required.

ISSUE-4078 If the type with the default value is defined in the package field and another PSM object refers to it, then an error occurs.

Description

If TYPE with the field including the default value is defined in the package and another PSM object refers to it, then an error occurs.

Symptom

The following is an example of defining the type with the field including the default value in the package. If a procedure refers to it, then the syntax error occurs.
CREATE OR REPLACE PACKAGE pkg1 AS
  TYPE rec IS RECORD( f1 VARCHAR(10) := 'abcde' );
  v_rec rec;
  v_int INTEGER;
END;
/ 
Package created.

CREATE OR REPLACE PROCEDURE proc1( p1 IN pkg1.rec ) AS
BEGIN
  DBMS_OUTPUT.PUT_LINE( 'p1 : ' || p1.f1 );
END;
/

ERR-42000(16062): syntax error : 
RETURN RETURN 'abcde' 
       ^    ^
Error at line 1

Workaround

The patch is required.

ISSUE-4081 TRACE_LONG_RUN_TIMER property has been added.

Description

TRACE_LONG_RUN_TIMER property has been added, and it controls the precision of the execution when using the following properties.

Symptom

N/A

Workaround

The patch is required.

ISSUE-4045 BROADCAST_INDEX_REBUILD_PROTOCOL property has been added.

Description

BROADCAST_INDEX_REBUILD_PROTOCOL property has been added, and it sets whether to simultaneously rebuild the indexes on all members when rebuilding the index in cluster environment.

Symptom

N/A

Workaround

The patch is required.

20c.1.22 Patch Notes

ISSUE-4062 If an actual parameter does not exist when the formal parameter is %TYPE and has the default value, then an error occurs.

Description

If the actual parameter is not specified when executing PSM object whose formal parameter datatype is %TYPE and which has the default value, then an error occurs.

Symptom

When omitting the actual parameter as follows, then wrong number of parameters error occurs.

CREATE TABLE t1( c1 INTEGER, c2 INTEGER );

Table created.

CREATE OR REPLACE FUNCTION func1( p1 IN t1.c1%type default 100,
                                  p2 IN t1.c2%type default 200 )
RETURN INTEGER AS
BEGIN
  RETURN p1 + p2;
END;
/

Function created.

SELECT func1( 10 ) FROM DUAL;

Workaround

The patch is required.

20c.1.21 Patch Notes

ISSUE-4049 When an error occurs over the entire CYCLONE slave group in cluster environment, then the data error occurs.

Description

The data error occurs when two or more groups exist in cluster environment. If manipulating the data in the group whose sharding table is terminated while the partial service is available because all members in the specific group are terminated, then the query fails while CYCLONE is normally operated.

Symptom

If ERR-42000(16357) : must be accessible to at least one member of group 'GX' error occurs on slave side, then CYCLONE is normally operated instead of being terminated, so the data error may occur.

Workaround

The patch is required.

20c.1.20 Patch Notes

ISSUE-4039 It rounds up the result of the operation which uses PSM variable in Cursor For Loop, then returns it.

Description

It rounds up the result of the operation which uses PSM variable in SELECT statement of Cursor For Loop, then returns it.

Symptom

It rounds up the result of the operation which uses PSM variable in SELECT statement of Cursor For Loop, then returns it as follows.

DECLARE
  v1 NUMBER;
  v2 NUMBER;
BEGIN
  v1 := 5.02;
  v2 := 5.01;

  FOR tmp IN ( SELECT v1 + v2 res FROM DUAL ) LOOP
    DBMS_OUTPUT.PUT_LINE( tmp.res );
  END LOOP;
END;
/

10
Anonymous PL block executed.

Workaround

Specify DATA TYPE by using CAST function in PSM variable.

DECLARE
  v1 NUMBER;
  v2 NUMBER;
BEGIN
  v1 := 5.02;
  v2 := 5.01;

  FOR tmp IN ( SELECT CASE(v1 as NUMBER) + v2 res FROM DUAL ) LOOP
    DBMS_OUTPUT.PUT_LINE( tmp.res );
  END LOOP;
END;
/

10.03
Anonymous PL block executed.

ISSUE-4042 If performing commit statement while performing Cursor For Loop statement, then an error occurs.

Description

If performing commit statement while performing Cursor For Loop statement, then cursor not open error occurs.

Symptom

It closes the open cursor to perform commit, then commits it. Then, if closing the used cursor when terminating cursor for loop statement, cursor is not open error occurs because the cursor already has been closed beforehand.

BEGIN
  FOR cur1 IN ( SELECT r_c1 FROM r FOR UPDATE ) LOOP
    IF ( cur1.r_c1 = 2 ) THEN
      COMMIT;
      RETURN;
    END IF;
  END LOOP;
END;
/

Workaround

Specify commit after cursor for loop statement is completed.

BEGIN
  FOR cur1 IN ( SELECT r_c1 FROM r FOR UPDATE ) LOOP
    IF ( cur1.r_c1 = 2 ) THEN
      RETURN;
    END IF;
  END LOOP;

  COMMIT;
END;
/

ISSUE-4040 When using sequence after performing ALTER SEQUENCE in PSM, then the SELECT statement waits infinitely.

Description

When using sequence after performing ALTER SEQUENCE in PSM in cluster environment, then the SELECT statement which uses the sequence waits infinitely.

Symptom

When using sequence after performing ALTER SEQUENCE by using EXECUTE IMMEDIATE statement in PSM in cluster environment as follows, then the SELECT statement which uses the sequence waits infinitely.

DECLARE
    curr_val INTEGER;
BEGIN
    EXECUTE IMMEDIATE 'ALTER SEQUENCE seq CACHE 100';
    EXECUTE IMMEDIATE 'SELECT seq.nextval FROM DUAL' INTO curr_val; 
END;
/

Workaround

Specify COMMIT as follows after performing ALTER SEQUENCE statement.

DECLARE
    curr_val INTEGER;
BEGIN
    EXECUTE IMMEDIATE 'ALTER SEQUENCE seq CACHE 100';
    COMMIT;
    EXECUTE IMMEDIATE 'SELECT seq.nextval FROM DUAL' INTO curr_val; 
END;
/

20c.1.19 Patch Notes

ISSUE-4024 Savepoint hang may occur when an error occurs at the remote member in cluster.

Description

The savepoint statement may hang in a specific situation of cluster.

Symptom

If the savepoint statement is performed after a specific member accessed by a transaction is abnormally terminated, then a hang may occur.

Workaround

The patch is required.

20c.1.18 Patch Notes

ISSUE-4021 The program is abnormally terminated during the fetch cursor in the embedded SQL.

Description

If the array size becomes bigger in FETCH CURSOR when reusing STANDING CURSOR in the embedded SQL, then the client program is abnormally terminated.

Symptom

If the array size becomes bigger during fetching the cursor when reusing the cursor as the following sample code, then the program is abnormally terminated.

int OpenCursor()
{
    printf( "DECLARE CRS_ ... \n");
    EXEC SQL DECLARE CRS_ CURSOR FOR
        SELECT ename FROM emp;
    if( sqlca.sqlcode != 0 )
        goto FINISH_LABEL;

    printf( "OPEN CRS_ ... \n");
    EXEC SQL OPEN CRS_;
    if( sqlca.sqlcode != 0 )
        goto FINISH_LABEL;

    return 0;

    FINISH_LABEL:

    return -1;
}

int FetchCursor()
{
    EXEC SQL BEGIN DECLARE SECTION;
    char  name[100];
    EXEC SQL END DECLARE SECTION;
    int  count = 0;

    printf( "ARRAY SIZE: 1\n" );
    printf( "FETCH CRS_ ... \n");

    while( 1 )
    {
        EXEC SQL FETCH CRS_ INTO :name;
        if( sqlca.sqlcode == 100 )
        {
            break;
        }

        if( sqlca.sqlcode != 0 )
            goto FINISH_LABEL;
        count++;
    }

    printf( "%d fetched.\n", count );
    
    printf( "CLOSE CRS_ ... \n\n");
    EXEC SQL CLOSE CRS_;
    if( sqlca.sqlcode != 0 )
        goto FINISH_LABEL;
    
    return 0;

    FINISH_LABEL:

    return -1;
}


int FetchCursorArray()
{
    EXEC SQL BEGIN DECLARE SECTION;
    char  name[20][100];
    EXEC SQL END DECLARE SECTION;
    int  count = 0;

    printf( "ARRAY SIZE: 20\n" );
    printf( "FETCH CRS_ ... \n");

    while( 1 )
    {
        EXEC SQL FETCH CRS_ INTO :name;
        if( sqlca.sqlcode == 100 )
        {
            break;
        }

        if( sqlca.sqlcode != 0 )
            goto FINISH_LABEL;
        count += sqlca.sqlerrd[2];
    }

    printf( "%d fetched.\n", count );
    
    printf( "CLOSE CRS_ ... \n\n");
    EXEC SQL CLOSE CRS_;
    if( sqlca.sqlcode != 0 )
        goto FINISH_LABEL;
    
    return 0;

    FINISH_LABEL:

    return -1;
}

int DoJob()
{
    if( OpenCursor() == -1 ) goto FINISH_LABEL;
    if( FetchCursor() == -1 ) goto FINISH_LABEL;

    if( OpenCursor() == -1 ) goto FINISH_LABEL;
    if( FetchCursorArray() == -1 ) goto FINISH_LABEL;
    return 0;
    FINISH_LABEL:
    return -1;
}

Workaround

Set the size of the host variable used in FETCH CURSOR same when reusing the standing cursor.

ISSUE-4017 Idle timeout feature for XA transaction has been added.

Description

XA_TRANSACTION_IDLE_TIMEOUT property has been added. It is the maximum idle time after the transaction is processed in XA, and the default value is 60 seconds.

Symptom

If the session is terminated when XA transaction has not been committed nor is rolled back, then it may infinitely waits because it is unable to return the resources in the transaction.

Workaround

The patch is required.

20c.1.17 Patch Notes

ISSUE-3994 The options for sqlca.sqlerrd[2] value in an embedded SQL are added.

Description

The number of rows which were executed just before are stored as sqlca.sqlerrd[2] value in the embedded SQL. However, the value can be selected between the accumulated total of rows or the number of fetched rows in FETCH CURSOR statement. For more information, refer to --cumulative of the precompiler gpec option.

Symptom

N/A

Workaround

The patch is required.

ISSUE-3981 include_synonyms property has been added in ODBC and JDBC.

Description

include_synonyms property has been added, and this property sets whether to include the synonym object in SQLColumns() of ODBC and DatabaseMetaData.getColumns() of JDBC.

Symptom

The synonym object information is not included in SQLColumns() of ODBC neither is included in DatabaseMetaData.getColumns() of JDBC.

Workaround

The patch is required.

ISSUE-3900 The uniqueness has been deleted from the cursor name in gpec.

Description

When using gpec, there is a constraint that the cursor name in a single gc file should be unique. gpec processes the gc file as an error with "The cursor name is already declared" message if the gc file declared multiple cursors with the same name. This creates useless codes and reduces the productivity, so the uniqueness has been deleted from the cursor name.

Symptom

When trying to declare a cursor selectively by using the conditional statement as follows, then gpec processes it as an error.

if( isTrue == 1 )
{
    EXEC SQL DECLARE CURSOR CUR1 FOR 
SELECT I1 FROM T1;
}
else
{
    EXEC SQL DECLARE CURSOR CUR1 FOR
SELECT C1 FROM T2;
}

When trying to select a cursor by using the conditional statement like as the example, then the cursor name should be declared different and the additional conditional statement should be added to the subordinate code.

if( isTrue == 1 )
{
    EXEC SQL DECLARE CURSOR CUR1 FOR 
SELECT I1 FROM T1;
}
else
{
    EXEC SQL DECLARE CURSOR CUR2 FOR
SELECT C1 FROM T2;
}

if( isTrue == 1 )
{
    EXEC SQL OPEN CUR1;
}
else
{
    EXEC SQL OPEN CUR2;
}

Workaround

The patch is required.

ISSUE-3679 ODBC API trace feature has been added.

Description

The feature to trace ODBC API has been added, so TRACE and TRACEFILE are also added to the connection property.

Symptom

N/A

Workaround

The patch is required.

20c.1.16 Patch Notes

ISSUE-3958 SYNONYM information is not found in SQLTables() of ODBC nor in DatabaseMetaData.getTables() of JDBC.

Description

The information about TABLE, VIEW and SYNONYM should be found in both SQLTables() of ODBC and in DatabaseMetaData.getTables() of JDBC, but currently the SYNONYM information is not found. The SYNONYM information can be found through each function.

Symptom

When calling SQLTables() of ODBC or DatabaseMetaData.getTables() of JDBC, the information about TABLE and VIEW are found, but the SYNONYM information is not found.

Workaround

Use the following SQL statement to find the SYNONYM information.

gSQL> SELECT * FROM DICTIONARY_SCHEMA.ALL_SYNONYMS;

ISSUE-3954 When using SELECT INTO ARRAY clause in an embedded SQL, the result is wrong.

Description

The result value varies upon the number of FETCHED ROW when using SELECT INTO ARRAY clause.

Symptom

The following is a code which uses SELECT INTO ARRAY clause with the array size 3.

EXEC SQL BEGIN DECLARE SECTION;
int  sI1[3];
char sI2[3][10];
EXEC SQL END DECLARE SECTION;

SELECT I1, I2 INTO :sI1, :sI2 FROM TEST;
printf( "Fetched Count: %d\n", sqlca.sqlerrd[2] );
if( sqlca.sqlcode != 0 )
{
    printf( "SQLCODE: %d\n SQLSTATE: %s\n ERROR MSG: %s\n\n",
             sqlca.sqlcode, SQLSTATE, sqlca.sqlerrm.sqlerrmc );
}

If the total number of the entire ROW is one, then sqlca.sqlcode value should have been 0, but the actual sqlca.sqlcode value is -23034, and "SELECT INTO returns too many rows" error occurs.

Workaround

The patch is required.

ISSUE-3950 If performing an unsupported PSM query to the user by using JDBC/ ODBC, then the server is abnormally terminated.

Description

If performing a PSM query which is registered in the plan cache though but is not supported through JDBC/ ODBC to the user, then an error occurs, and this error has been fixed so that those queries are not performed.

Symptom

If performing the query registered in the plan cache through ODBC as follows, then the server is abnormally terminated.

sRet = SQLExecDirect( sStmt,
                     (SQLCHAR*)"PROCEDURE \"PUBLIC\".\"PROC1\"  AS BEGIN NULL; END;",
                     SQL_NTS ) 
       == STL_SUCCESS );

If performing the query registered in the plan cache through JDBC as follows, then the server is abnormally terminated.

Statement sStmt = aCon.createStatement();
sStmt.execute("PROCEDURE \"PUBLIC\".\"PROC1\"  AS BEGIN NULL; END;);

Workaround

Perform the correct query through ODBC as follows.

sRet = SQLExecDirect( sStmt,
                     (SQLCHAR*)"CALL PROC1;",
                     SQL_NTS ) 
       == STL_SUCCESS );

Perform the correct query through JDBC as follows.

Statement sStmt = aCon.createStatement();
sStmt.execute("CALL PROC1");

ISSUE-3959 An access to the deleted handle occurs while synchronizing the global sequence.

Description

An access to the deleted statement handle occurs while it waits for the response from the protocol of the previously used executors as a preliminary work before synchronizing the global sequence.

Symptom

The server is abnormally terminated while trying to access the deleted statement handle.

Workaround

The patch is required.

20c.1.15 Patch Notes

ISSUE-3923 The server is abnormally terminated when using the stored function in group by clause in SELECT statement.

Description

An error occurs when using the stored function in group by clause in SELECT statement, and this error has been fixed.

Symptom

The server is abnormally terminated when using the stored function in group by clause in SELECT statement as follows.

gSQL> 
SELECT func1( r_c1, r_c2 )
     , SUM( r_c1 )
  FROM r
 GROUP BY func1( r_c1, r_c2 );

Workaround

The patch is required.

20c.1.14 Patch Notes

ISSUE-3909 Features which correspond to the national strategic item are not supported.

Description

The following functions are not supported due to the restriction according to the policy for the national strategic item.

Symptom

N/A

Workaround

The patch is required.

ISSUE-3917 An error occurs when executing a procedure in XA environment.

Description

A procedure or an anonymous block is not executable in XA environment, and this error has been fixed.

Symptom

The following error occurs when executing a procedure in XA environment.

gSQL> CALL proc1();

ERR-42000(18009): The command cannot be executed when global transaction is in the ACTIVE state

Workaround

The patch is required.

ISSUE-3913 An option which can specify the permission in DBMS_OUTPUT.SET_LOG() procedure has been added.

Description

It is enabled to specify the permission in DBMS_OUTPUT.SET_LOG() procedure.
gSQL> CALL DBMS_OUTPUT.SET_LOG('a.txt', 640);

Procedure Call complete.

Symptom

N/A

Workaround

The patch is required.

20c.1.13 Patch Notes

ISSUE-3884 When repeatedly executing connect in a process while using JDBC, then fd keeps increasing.

Description

When repeatedly executing connect in a process while using JDBC, then pipe and eventpoll fd keep increasing so "can not open files"  error occurs.

Symptom

fd is increased when repeatedly executing connect as follows, and it can be seen through lsof.

while (true)
{
    Connection con = DriverManager.getConnection("jdbc:goldilocks://127.0.0.1:11100/test", "TEST", "test");

    ...

    con.close();
    con = null;
}
% lsof -p 359414 | awk '{print $9}' | sort | uniq -c | sort -rn
    192 pipe
     96 [eventpoll]
     65 type=STREAM
     ...
% lsof -p 359414 | awk '{print $9}' | sort | uniq -c | sort -rn
    224 pipe
    112 [eventpoll]
     81 type=STREAM
     ...

Workaround

The patch is required.

ISSUE-3869 The result of row status is wrong when executing array fetch in ODBC.

Description

When executing array fetch in ODBC, the status value of the row can be seen after calling SQLFetch function. If the returned value of SQLFetch is not SQL_SUCCESS, then it is required to check the row status or the diagnostic. 
However, even when the returned value of SQLFetch is SQL_SUCCESS_WITH_INFO, the diagnostic message is seen but all row statuses are SQL_ROW_SUCCESS, which are wrong.

Symptom

The following is the string data which can not be converted to number.

CREATE TABLE T1 ( I1 VARCHAR(10) );
INSERT INTO T1 VALUES ( '1' );
INSERT INTO T1 VALUES ( '2A' );
INSERT INTO T1 VALUES ( '3' );
INSERT INTO T1 VALUES ( 'AB' );
COMMIT;

The following is a part of an example of executing array fetch after converting the data above to the numeric type.

sRet = SQLPrepare( sStmt,
                   (SQLCHAR*)"SELECT I1 FROM T1 ORDER BY I1",
                   SQL_NTS );

sRet = SQLBindCol( sStmt,
                   1,
                   SQL_C_LONG,
                   sI1,
                   sizeof(SQLINTEGER),
                   sI1Ind );

sRet = SQLSetStmtAttr( sStmt,
                       SQL_ATTR_ROW_BIND_TYPE,
                       (SQLPOINTER)SQL_BIND_BY_COLUMN,
                       0 );

sRet = SQLSetStmtAttr( sStmt,
                       SQL_ATTR_ROW_STATUS_PTR,
                       sRowStatus,
                       0 );

sRet = SQLExecute( sStmt );

sRet = SQLFetch( sStmt );

switch( sRet )
{
    case SQL_SUCCESS_WITH_INFO:
        for( i = 0; i < sFetched; i++ )
            printf( "row status: %d\n", sRowStatus[i]);
        break;
    default
        break;
}

The data can not be converted to number is included, but all row statuses are SQL_ROW_SUCCESS.

row status: 0
row status: 0
row status: 0
row status: 0

Workaround

The patch is required.

20c.1.12 Patch Notes

ISSUE-3859 If the size of an array is smaller than the number of records when using an array in an embedded SQL, SELECT INTO clause, then it should be processed as an error.

Description

Currently, if the size of an array is smaller than the number of fetched records when using an array in SELECT INTO statement of an embedded SQL, no further action is taken. In this case, if the size of an array is smaller than the number of records, then the application can not recognize whether additional records exist. Therefore, if the size of an array is smaller than the number of fetched records, it should be processed as an error.

Symptom

gSQL> SELECT COUNT(*) FROM TEST;

COUNT(*)
--------
      20

1 row selected.
EXEC SQL BEGIN DECLARE SECTION;
int c1[10];
EXEC SQL END DECLARE SECTION;

EXEC SQL SELECT C1 INTO :c1 FROM TEST;
printf( "SQLCODE: %d\n", sqlca.sqlcode );

When the size of an array is smaller than the number of fetched records as above, then sqlca.sqlcode is normally processed, which is 0.

Workaround

The patch is required.

ISSUE-3846 Core occurs if the property values between members are different in cluster environment when restarting.

Description

Some property values should be same between all members in the cluster environment. If those property values are different between members when restarting, then cserver dies.

Symptom

It compares the property values which are supposed to be same between all members when restarting members in the cluster environment, and if there is a member with the different property value, then cserver dies.

The properties to have same values in the cluster environment are as follows.

gSQL> SELECT PROPERTY_NAME FROM X$PROPERTY@LOCAL WHERE CLUSTER_SCOPE = 'GLOBAL';

PROPERTY_NAME                          
---------------------------------------
TRANSACTION_TABLE_SIZE                 
NLS_DATE_FORMAT                        
NLS_TIME_FORMAT                        
NLS_TIME_WITH_TIME_ZONE_FORMAT         
NLS_TIMESTAMP_FORMAT                   
NLS_TIMESTAMP_WITH_TIME_ZONE_FORMAT    
DISABLE_DDL_CDC_GIVEUP                 
DISABLE_UPDATE_PK_CDC_GIVEUP           
DATABASE_ACCESS_MODE                   
IN_DOUBT_DECISION                      
DATABASE_TEST_OPTION                   
DDL_AUTOCOMMIT                         
SHARED_REQUEST_QUEUE_COUNT             
CLUSTER_CONNECTION                     
CDISPATCHER_THREADS                    
MAX_NODE_COUNT                         
MAX_GROUP_COUNT                        
CLUSTER_COMMIT_STREAM_ISOLATION        
DEFAULT_GLOBAL_SECONDARY_INDEX_CREATION
TRACE_LOG_MSGBUF_SIZE                  

PROPERTY_NAME                           
----------------------------------------
DEFAULT_SHARDING                        
LOCATOR_QUERY_TIMEOUT                   
DISALLOWED_PROTOCOL_TARGETTYPE          
DISALLOWED_PROTOCOL_TARGETTYPE_WITH_NAME
DISALLOWED_PROTOCOL_TARGETTYPE_WITH_ALL 
FAILOVER_DRIVER_MEMBER                  
CDISPATCHER_SYNC_THREADS                
CLUSTER_SPLIT_BRAIN_RETRY_COUNT         
CLUSTER_TEST_SBR_POLICY                 
COORDINATOR_COMMIT_WRITE_MODE           
OFFLINE_MEMBER_AFTER_FAILOVER           
RECYCLEBIN                              
CDISPATCHER_LOCKLESS_THREADS            

33 rows selected.

Workaround

Modify property values of members to be same, then restart it.

ISSUE-3842 gpec omits EXEC SQL WHENEVER NOT FOUND statement in a specific DML statement.

Description

Processing WHENEVER EXCEPTION should be applied to all DML statements when gpec converts the embedded SQL code to C code. However, actually it is applied only to SELECT INTO clause and FETCH clause.

Symptom

gc file before transcoding

EXEC SQL WHENEVER SQLERROR DO callErrorLog( param->param, 0, sqlca.sqlcode, sqlca.sqlerrd[2] );

EXEC SQL WHENEVER NOT FOUND DO callLog( param->param, 0, sqlca.sqlcode, sqlca.sqlerrd[2] );

EXEC SQL DELETE FROM TEST
    WHERE ENUMBER = :in.enumber
        AND ENAME = :in.ename;

c file after transcoding

DBESQL_Execute(NULL, &sqlargs);

if(sqlca.sqlcode < 0) callErrorLog(param->param, 0, sqlca.sqlcode, sqlca.sqlerrd[2]);

The code is created without an action code for NOT FOUND.

Workaround

Directly write NOT FOUND processing in gc file as follows.

EXEC SQL DELETE FROM TEST
    WHERE ENUMBER = :in.enumber
        AND ENAME = :in.ename;
if(sqlca.sqlcode == 0) callLog( ... );

ISSUE-3830 XA connection is not available as a default context in embedded SQL.

Description

Use the default context or create the named context to use XA in the embedded SQL.

If executing xa open without the connection name while any connection is not created in the default context when using XA with the default context, then XA connection is supposed to be connected to the default context. However, in practice, it is not connected to the default context.

Symptom

If creating xa connection without the connection name while any connection does not exist in the default context as follows, then XA connection is supposed to be connected to the default context. Also, it should be able to execute SQL statement with the default context.

int main( int argc, char** argv)
{
    xa_switch_t * sXaSwitch;

    sXaSwitch = SQLGetXaSwitch();

    if( (sXaSwitch->xa_open_entry)( "DSN=GOLDILOCKS;UID=test;PWD=test", 0, TMNOFLAGS ) != XA_OK )
    {
        GOLDILOCKS_SQL_THROW( GOLDILOCKS_FINISH_LABEL );
    }
    EXEC SQL DROP TABLE IF EXISTS DEPOSIT;

    ... /* Ellipsis */

}

When executing the program created with the code above, then invalid handle error occurs.

[ERROR] SQL ERROR -
SQLCODE : -2
SQLSTATE : HY000
ERROR MSG : Invalid handle

Workaround

Create the named context, and use it.

20c.1.11 Patch Notes

ISSUE-3371 Xa transaction is supported in cluster environment.

Description

It supports Xa transaction in cluster environment.

Symptom

N/A

Workaround

The patch is required.

ISSUE-3821 If it fails to use the large page when allocating the shared segment, then the feature to use the normal page is required.

Description

USE_LARGE_PAGES property supports 0 and 1. When it is set to 0, it does not use the large page, and when it is set to 1, then it uses the large page. If it fails to allocate the shared memory when it is set to 1, then an error occurs.

Therefore, the feature to use the normal page when it fails to allocate the shared memory in the large page has been added.

Symptom

When USE_LARGE_PAGE is set to 2, then it tries to allocate the shared memory in the large page first, and if it fails, then it allocates the shared memory in the normal page.

gSQL> alter tablespace mem_data_tbs add datafile 'test1.dbf' size 5G;

ERR-HY000(11042): Not enough memory : sthCreate() returned errno(12)

gSQL> alter system set use_large_pages = 2;

System altered.

gSQL> alter tablespace mem_data_tbs add datafile 'test1.dbf' size 5G;

Tablespace altered.

Workaround

The patch is required.

ISSUE-3798 When performing DML with protocol method by using synonym in cluster, the system is abnormally terminated or the query processing is infinitely repeated.

Description

If processing DML by a using synonym when the synonym is defined in a schema which is different from the target object in cluster, then the system is abnormally terminated or the query processing is infinitely repeated.

Symptom

When performing insert through a synonym after defining the table and the synonym as follows, then the query processing is infinitely repeated.

gSQL> CREATE USER u1 IDENTIFIED BY u1;

User created.

gSQL> GRANT ALL PRIVILEGES TO u1;

Grant succeeded.

gSQL> CREATE USER u2 IDENTIFIED BY u2;

User created.

gSQL> GRANT ALL PRIVILEGES TO u2;

Grant succeeded.

gSQL> \CONNECT u2 u2
gSQL> CREATE TABLE u1.t_cloned ( c1 NUMBER ) CLONED;

Table created.

gSQL> CREATE SYNONYM u2.syn FOR u1.t_cloned;

Synonym created.


--# hang
gSQL> INSERT INTO u2.syn VALUES( 1 );

Workaround

Do not use a synonym when performing DML.

INSERT INTO u1.t_cloned VALUES( 2 );

Or, execute DML based on a query complying with the following constraints in case for delete, update and select for update except for insert.

20c.1.10 Patch Notes

ISSUE-3768 Executing IN function during prepare/ execution, then the system is intermittently and abnormally terminated.

Description

When executing the query two or more times after preparing during preparing/ executing the query whose number of the value part of IN function is 10 or more, then the system is intermittently and abnormally terminated.

Symptom

When executing the query two or more times after preparing it when the table was created as follows, then the system is intermittently and abnormally terminated.

gSQL> CREATE TABLE t1 ( c1 INTEGER, c2 VARCHAR(1) );

Table created.

gSQL> INSERT INTO t1 VALUES ( 1, 'A' );

1 row created.

gSQL> INSERT INTO t1 VALUES ( 2, 'B' );

1 row created.

gSQL> CREATE INDEX idx_t1 ON t1 ( c1 );

Index created.

gSQL> \var v1 INTEGER
gSQL> \prepare sql
SELECT *
  FROM t1
 WHERE c1 = :v1
   AND c2 IN ( 'P','T','X','C','W','B','L','M','H','J','Z','G','D' );
    2     3     4     5 
SQL prepared.

gSQL> \exec

no rows selected.

gSQL> SELECT COUNT(*) FROM t1;

COUNT(*)
--------
       2

1 row selected.

gSQL> \exec

no rows selected.

gSQL> \exec :v1 := 2
gSQL> \exec

C1 C2
-- --
 2 B 

1 row selected.

gSQL> SELECT COUNT(*) FROM t1;

COUNT(*)
--------
       2

1 row selected.
gSQL> \exec

C1 C2
-- --
 2 B 

1 row selected.

Workaround

Configure the number of values in value part of IN function less than 10 to prevent IN_HASH from applying.

\prepare sql
SELECT *
  FROM t1
 WHERE c1 = :v1
   AND c2 IN ( 'P','T','X','C','W','B','L','M','H','J','Z','G','D' );

When number of values in value part of IN function is more than 10 as above, then divide IN functions and bind it with OR.

\prepare sql
SELECT *
  FROM t1
 WHERE c1 = :v1
   AND ( 
         c2 IN ( 'P','T','X','C','W','B' ) 
         OR
         c2 IN ( 'L','M','H','J','Z','G','D' ) 
       );

ISSUE-3766 When checking the availability of the remote method of ROWNUM, then checking for the subquery filter is omitted.

Description

The query result may have an error because the subquery filter is dropped in the following query.

SELECT r_sk
     , r_nk
  FROM r
 WHERE r_sk = 202
   AND r_nk = ( SELECT r_nk + 999 FROM dual )
   AND ROWNUM < 5

When all of the following conditions exist as in the query above, then the subquery filter disappears.

Symptom

The query result is supposed not to exist after building the table as follows, but actually the query result is created because the subquery filter was dropped.

CREATE TABLE r
(
    r_sk INTEGER,
    r_nk INTEGER
) SHARDING BY RANGE(r_sk)
  SHARD s1 VALUES LESS THAN ( 200      ) AT CLUSTER GROUP g1,
  SHARD s2 VALUES LESS THAN ( 300      ) AT CLUSTER GROUP g2,
  SHARD s3 VALUES LESS THAN ( MAXVALUE ) AT CLUSTER GROUP g3
;

INSERT INTO r VALUES ( 101, 101 );
INSERT INTO r VALUES ( 202, 202 );
INSERT INTO r VALUES ( 303, 303 );
COMMIT;
\explain plan
SELECT r_sk
     , r_nk
  FROM r
 WHERE r_sk = 202
   AND r_nk = ( SELECT r_nk + 999 FROM dual )
   AND ROWNUM < 5
;   

R_SK R_NK
---- ----
 202  202

1 row selected.

>>>  start print plan

< Execution Plan >
==================================================================================================
|  IDX  |  NODE DESCRIPTION                                            |                    ROWS |
--------------------------------------------------------------------------------------------------
|    0  |  SELECT STATEMENT                                            |                       1 |
|    1  |    QUERY BLOCK ("$QB_IDX_2")                                 |                       1 |
|    2  |      PLAN BASED CLUSTER                                      | REMOTE ONLY           1 |
|    3  |        COUNT                                                 |                       0 |
|    4  |          TABLE ACCESS ("R")                                  |                       0 |
==================================================================================================

     1  -  TARGET : R.R_SK, R.R_NK
     2  -  SQL : SELECT /*+ FULL( _A1 ) */ "_A1"."R_SK", "_A1"."R_NK" FROM "PUBLIC"."R"@LOCAL AS "_A1" WHERE "_A1"."R_SK" = :_V0 AND ROWNUM < :_V1
           TARGET DOMAIN : G2(G2N1,G2N2) 1 rows
     3  -  STOP KEY FILTER : ROWNUM < 5
     4  -  RANGE SHARD ( # 3 ) 
           READ COLUMN : R.R_SK, R.R_NK
             PHYSICAL FILTER : R.R_SK = 202

<<<  end print plan

Workaround

Change ROWNUM condition to LIMIT condition as follows.

\explain plan
SELECT r_sk
     , r_nk
  FROM r
 WHERE r_sk = 202
   AND r_nk = ( SELECT r_nk + 999 FROM dual )
 LIMIT 4
;   

no rows selected.

>>>  start print plan

< Execution Plan >
==================================================================================================
|  IDX  |  NODE DESCRIPTION                                            |                    ROWS |
--------------------------------------------------------------------------------------------------
|    0  |  SELECT STATEMENT                                            |                       0 |
|    1  |    QUERY BLOCK ("$QB_IDX_2")                                 |                       0 |
|    2  |      PLAN BASED CLUSTER                                      | REMOTE ONLY           0 |
|    3  |        TABLE ACCESS ("R")                                    |                       0 |
|    4  |      SUB QUERY LIST                                          |                         |
|    5  |        INLINE_VIEW ("$V5")                                   |                       1 |
|    6  |          QUERY BLOCK ("$QB_IDX_6")                           |                       1 |
|    7  |            FAST DUAL ACCESS ("DUAL")                         |                       1 |
==================================================================================================

     1  -  TARGET : R.R_SK, R.R_NK
     2  -  SQL : SELECT /*+ FULL( _A1 ) */ "_A1"."R_SK", "_A1"."R_NK" FROM "PUBLIC"."R"@LOCAL AS "_A1" WHERE "_A1"."R_SK" = :_V0
           TARGET DOMAIN : G2(G2N1,G2N2) 1 rows
             POST FILTER : R.R_NK = $V5.$C0
     3  -  RANGE SHARD ( # 3 ) 
           READ COLUMN : R.R_SK, R.R_NK
             PHYSICAL FILTER : R.R_SK = 202
     5  -  COLUMN : {R.R_NK} + 999 AS $C0
     6  -  TARGET : {R.R_NK} + 999
     7  -  READ COLUMN : NOTHING

<<<  end print plan

ISSUE-3751 When prepare/ execution, the accumulated information about rows of plans under the cluster puller is output.

Description

When prepare/ execute the query including the cluster puller plan, then the number of result rows for the cluster puller and its subordinate nodes are accumulated whenever it is executed, and output.

It is the matter related to counting result rows, and it does not affect the query execution.

Symptom

When executing the query two times or more after creating the following table and preparing the query, then the wrong result is output.

gSQL> CREATE TABLE T1 ( SK INT, C1 INT ) SHARDING BY HASH ( SK );

Table created.

gSQL> INSERT INTO T1 VALUES ( 1, 10 );

1 row created.

gSQL> \SET AUTOTRACE ON
gSQL> \PREPARE SQL SELECT SUM( SK ) FROM T1 GROUP BY C1;

SQL prepared.

gSQL> \EXEC

SUM( SK )
---------
        1

1 row selected.

>>>  start print plan

< Execution Plan >
=========================================================================
|  IDX  |  NODE DESCRIPTION                          |             ROWS |
-------------------------------------------------------------------------
|    0  |  SELECT STATEMENT                          |                1 |
|    1  |    QUERY BLOCK ("$QB_IDX_2")               |                1 |
|    2  |      SINGLE CLUSTER                        | LOCAL/REMOTE   1 |
|    3  |        SELECT STATEMENT                    |                1 |
|    4  |          QUERY BLOCK ("$QB_IDX_2")         |                1 |
|    5  |            GROUP HASH INSTANT              |                1 |
|    6  |              TABLE ACCESS ("T1" AS _A1)    |                1 |
=========================================================================

     1  -  TARGET : SUM( T1.SK )
     2  -  SQL : SELECT /*+ USE_GROUP_HASH(10) FULL( _A1 ) */ "_A1"."C1", SUM( "_A1"."SK" ) FROM "PUBLIC"."T1"@LOCAL AS "_A1" GROUP BY "_A1"."C1"
           TARGET DOMAIN : G1(G1N1) 1 rows, G2(G2N1) 0 rows, G3(G3N1) 0 rows
           RE-GROUPING
             GROUP KEY : T1.C1
             AGGREGATION : SUM( SUM( T1.SK ) )
     4  -  TARGET : _A1.C1, SUM( _A1.SK )
     5  -  GROUP KEY : _A1.C1
           RECORD COLUMN : SUM( _A1.SK )
           READ KEY COLUMN : _A1.C1
           READ RECORD COLUMN : SUM( _A1.SK )
     6  -  HASH SHARD ( # 3 ) 
           READ COLUMN : _A1.SK, _A1.C1

<<<  end print plan


gSQL> \EXEC

SUM( SK )
---------
        1

1 row selected.

>>>  start print plan

< Execution Plan >
=========================================================================
|  IDX  |  NODE DESCRIPTION                          |             ROWS |
-------------------------------------------------------------------------
|    0  |  SELECT STATEMENT                          |                1 |
|    1  |    QUERY BLOCK ("$QB_IDX_2")               |                1 |
|    2  |      SINGLE CLUSTER                        | LOCAL/REMOTE   1 |
|    3  |        SELECT STATEMENT                    |                2 |
|    4  |          QUERY BLOCK ("$QB_IDX_2")         |                2 |
|    5  |            GROUP HASH INSTANT              |                2 |
|    6  |              TABLE ACCESS ("T1" AS _A1)    |                2 |
=========================================================================

     1  -  TARGET : SUM( T1.SK )
     2  -  SQL : SELECT /*+ USE_GROUP_HASH(10) FULL( _A1 ) */ "_A1"."C1", SUM( "_A1"."SK" ) FROM "PUBLIC"."T1"@LOCAL AS "_A1" GROUP BY "_A1"."C1"
           TARGET DOMAIN : G1(G1N1) 1 rows, G2(G2N1) 0 rows, G3(G3N1) 0 rows
           RE-GROUPING
             GROUP KEY : T1.C1
             AGGREGATION : SUM( SUM( T1.SK ) )
     4  -  TARGET : _A1.C1, SUM( _A1.SK )
     5  -  GROUP KEY : _A1.C1
           RECORD COLUMN : SUM( _A1.SK )
           READ KEY COLUMN : _A1.C1
           READ RECORD COLUMN : SUM( _A1.SK )
     6  -  HASH SHARD ( # 3 ) 
           READ COLUMN : _A1.SK, _A1.C1

<<<  end print plan

Workaround

The patch is required.

20c.1.9 Patch Notes

ISSUE-3752 If the targets of the query are not all groups but are some groups when using the global connection, then the client may be abnormally terminated.

Description

When using the global connection, the shard information only about groups used in the query are transferred but not about all groups. Therefore, it may refer to the wrong memory when only part of information about the group is transferred. In this case, the client may be abnormally terminated.

When this patch is applied, then the client should be rebuilt.

Symptom

When performing the query in the global connection environment after creating the following table, then the client is abnormally terminated.

gSQL> create table t1 ( i1 integer ) sharding by (i1);

Table created.

gSQL> insert into t1 values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),(16),(17),(18),(19),(20),(21),(22),(23),(24);

24 rows created.

gSQL> commit;

Commit complete.

gSQL> select * from t1@g2;

I1
--
12
13
14
15
16
17
18
19

8 rows selected.

gSQL> select * from t1@g3;

I1
--
 8
 9
10
11
20
21
22
23

8 rows selected.
gSQL> \var v1 integer;
gSQL> \exec :v1 := 8
gSQL> \prepare sql select * from t1 where i1 = :v1 and i1 in (8,12);

SQL prepared.
gSQL> \exec

Workaround

Do not use the global connection.

20c.1.8 Patch Notes

ISSUE-3726 When repeatedly calling Statement.getUpdateCount() in JDBC, the update count should be initialized.

Description

Statement.getUpdateCount() in JDBC can be called only once per a result as quoted below.

  1. Retrieves the current result as an update count; if the result is a ResultSet object or there are no more results, -1 is returned. This method should be called only once per result.

When repeatedly calling Statement.getUpdateCount(), then it returns -1.

Symptom

When repeatedly calling Statement.getUpdateCount(), then it keeps returning the same values.

Workaround

The patch is required.

20c.1.7 Patch Notes

ISSUE-3716 Performing view merging when a sequence exists in the superordinate query and order by exists within a view leads to the wrong result.

Description

view merging should not be performed when a sequence exists in the superordinate query, but view merging is performed in reality, and it leads to the wrong result.

Symptom

Performing the following query leads to the wrong result.

CREATE SEQUENCE seq1;
CREATE TABLE t1 ( col1 INTEGER, col2 INTEGER );
INSERT INTO t1 VALUES(1,1);
INSERT INTO t1 VALUES(2,2);
INSERT INTO t1 VALUES(3,3);


\EXPLAIN PLAN
SELECT seq1.nextval
  FROM ( SELECT * 
           FROM t1 
         ORDER BY col1 )v1;

NEXTVAL
-------
   NULL
   NULL
   NULL

3 rows selected.

Workaround

Add NO_MERGE( view_name) hint.

\EXPLAIN PLAN
SELECT /*+ NO_MERGE(v1) */
       seq1.nextval
  FROM ( SELECT * 
           FROM t1 )v1;

NEXTVAL
-------
      1
      2
      3

3 rows selected.

< Execution Plan >
========================================================================
|  IDX  |  NODE DESCRIPTION                                            |
------------------------------------------------------------------------
|    0  |  SELECT STATEMENT                                            |
|    1  |    QUERY BLOCK ("$QB_IDX_2")                                 |
|    2  |      INLINE_VIEW ("V1")                                      |
|    3  |        QUERY BLOCK ("$QB_IDX_5")                             |
|    4  |          SORT INSTANT                                        |
|    5  |            TABLE ACCESS ("T1")                               |
========================================================================

     1  -  TARGET : NEXTVAL(SEQ1)
     2  -  COLUMN : V1.DUMMY_COL AS DUMMY_COL
     3  -  TARGET : NOTHING
     4  -  SORT KEY : "T1.COL1 ASC NULLS LAST"
     5  -  READ COLUMN : T1.COL1

<<<  end print plan

ISSUE-3707 The process is abnormally terminated when a target view of the simple view merging is on the right side of the left outer join, and only one constant exists in the select list of that view.

Description

The process is abnormally terminated when the following conditions are satisfied.

Symptom

The process is abnormally terminated when processing the following query.

\EXPLAIN PLAN 
SELECT COUNT(*)
  FROM ( SELECT t1.col1
           FROM t1 LEFT OUTER JOIN ( SELECT 1 as col1 FROM dual ) v1
                ON v1.col1 = t1.col1
      ) AAA;

Workaround

Add NO_MERGE( view_name) hint.

\EXPLAIN PLAN 
SELECT COUNT(*)
  FROM ( SELECT /*+ NO_MERGE(v1) */ t1.col1
           FROM t1 LEFT OUTER JOIN ( SELECT 1 as col1 FROM dual ) v1
                ON v1.col1 = t1.col1
      ) AAA;

ISSUE-3699 Recovery fails due to the lack of the space when restarting the database.

Description

The information about transactions of the record and the key is stored in RTS space in table data pages and the index leaf pages. If multiple transactions simultaneously update a single page, then RTS can be expanded. The page compaction is performed to reuse the space of dropped records, and RTS is reduced at this moment when it is possible.

The error occurs when the space is not expanded because it does not satisfy the condition to reduce RTS at the recovery though the space was made by reducing RTS when compacting pages during the service.

Symptom

The recovery fails due to the lack of the page space when restarting the database.

Workaround

The patch is required.

ISSUE-3705 Wrong transitive predicate is created.

Description

When LIKE, NOT LIKE predicate appears after the transitive predicate was created, then the wrong transitive predicate is created.

Symptom

The following is an example of SQL which causes an error.

\EXPLAIN PLAN
SELECT r_c1, s_c1
  FROM r, s
 WHERE r_c1 = 'A'     1 The filter creating the transitive predicate is                     
                          described beforehand. 
   AND s_c2 LIKE '99%'  2 LIKE or NOT LIKE function exists
   AND r_c1 = s_c1      3 A equi join condition exists. 
;

no rows selected.

>>>  start print plan

< Execution Plan >
========================================================================
|  IDX  |  NODE DESCRIPTION                                            |
------------------------------------------------------------------------
|    0  |  SELECT STATEMENT                                            |
|    1  |    QUERY BLOCK ("$QB_IDX_2")                                 |
|    2  |      NESTED JOIN (INNER JOIN)                                |
|    3  |        INDEX ACCESS ("S", "S_PRIMARY_KEY_INDEX")             |
|    4  |        INDEX ACCESS ("R", "IDX_R_C1")                        |
========================================================================

     1  -  TARGET : R.R_C1, S.S_C1
     2  -  JOINED COLUMN : R.R_C1, S.S_C1
     3  -  READ INDEX COLUMN : S.S_C1
           READ TABLE COLUMN : S.S_C2
             MIN RANGE : S.S_C1 = 'A' AND S.S_C1 LIKE '99%'
             MAX RANGE : S.S_C1 = 'A' AND S.S_C1 LIKE '99%'
             LOGICAL KEY FILTER : S.S_C1 LIKE '99%'
             LOGICAL TABLE FILTER : S.S_C2 LIKE '99%'
           FETCH ONE ROW
     4  -  READ INDEX COLUMN : R.R_C1
             MIN RANGE : R.R_C1 = {S.S_C1} AND R.R_C1 = 'A'
             MAX RANGE : R.R_C1 = {S.S_C1} AND R.R_C1 = 'A'

<<<  end print plan

Workaround

Describe the predicate which includes LIKE, NOT LIKE functions beforehand as follows.

\EXPLAIN PLAN
SELECT r_c1, s_c1
  FROM r, s
 WHERE s_c2 LIKE '99%' 
   AND r_c1 = 'A'    
   AND r_c1 = s_c1    
;


R_C1 S_C1
---- ----
A    A

1 row selected.

ISSUE-3697 Type qualifier is not output in gpec.

Description

When gpec converts gc file which uses the storage class or the type qualifier in front of the embedded SQL pseudo type into c file, then the storage class and the type qualifier are omitted.

Symptom

The following is a part of gc file.

EXEC SQL BEGIN DECLARE SECTION;
static VARCHAR gUid[10];
static char    gPwd[10];
EXEC SQL END DECLARE SECTION;

The following is a part of c file which was converted by gpec from gc file created above.

/* EXEC SQL BEGIN DECLARE SECTION; */
#line 16 "test.gc"

/* static VARCHAR gUid[10]; */
struct { int len; char arr[10]; } gUid;
#line 17 "test.gc"

static char    gPwd[10];
/* EXEC SQL END DECLARE SECTION; */
#line 19 "test.gc"

The static operator is dropped because static Varchar gUid[10] code is converted into C code.

Workaround

The patch is required.

ISSUE-3698 getUpdateCount of JDBC statement class returns an abnormal value.

Description

When executing INSERT INTO statement which used QUERY, then it returns 0 as the result value of getUpdateCount().

Symptom

Statement stmt = conn.createStatement();
stmt.executeUpdate( "CREATE TABLE TEST ( I1 INTEGER )" );
stmt.executeUpdate( "INSERT INTO TEST VALUES ( 1 ) );
stmt.executeUpdate( "INSERT INTO TEST SELECT I1 FROM TEST" );

int count = stmt.getUpdateCount();

It returns 0 as getUpdateCount() value.

Workaround

The patch is required.

20c.1.6 Patch Notes

ISSUE-3690 When the file path is entered in JDBC URL in Windows, the file is unreadable.

Description

Even when the correct file path is entered in URL by using / delimiter in Windows, but the file is unreadable in JDBC.

Symptom

Unreadable File error occurs.

Workaround

The patch is required.

ISSUE-3687 When executing transaction retransmission, it stores the transaction whose size exceeds the sorting block size in a block.

Description

While configuring a sorting block for the transaction retransmission when the coordinator failover occurred, it stores the transaction whose size exceeds the block size, then sorts it, so it invades the unallocated memory area.

Symptom

It is abnormally terminated as SEGV while the coordinator server executes the coordinator failover.

Workaround

The patch is required.

20c.1.5 Patch Notes

ISSUE-3678 JDBC connection property login_timeout is added.

Description

Previously, login timeout can be set by setLoginTimeout method of DriverManager/DataSource class. However, setLoginTimeout method may not be called in a certain situation such as WAS. Therefore, the connection property login_timeout has been added.

Symptom

When connecting to the server in JDBC with the wrong IP or the wrong PORT, it indefinitely waits instead of causing an error.

Workaround

The patch is required.

20c.1.4 Patch Notes

ISSUE-3669 When failover occurs by the heartbeat, the aging information is not reset.

Description

While processing the failover, the aging information of dead nodes managed by active nodes are supposed to be reset, but it is not reset in fact.

Symptom

If active nodes do not reset the aging information of dead nodes, UNDO tablespace may be insufficient.

Workaround

The patch is required.

20c.1.3 Patch Notes

ISSUE-3655 Rebalance protocols are simultaneously performed on multiple members.

Description

When performing table rebalancing, if sequentially transferring protocols to remote members and receiving responses, then the delay occurs. Therefore, BROADCAST_REBALANCE_PROTOCOL property which broadcasts protocols to remote members and simultaneously processes them is added when the protocols can be processes at the same time, so the delay is reduced.

Symptom

When performing table rebalancing, the processing time is delayed as much as the number of target members while locking, or sequentially transferring rebalancing starting protocols to remote members, and receiving responses.

Workaround

The patch is required.

ISSUE-3649 Cluster server which is exclusive for lockless protocols is required

Description

A query which does not need a lock such as SELECT waits because it can not reserve the cluster server.

Symptom

The cluster server using shared connection method may wait in the lock status while the server is reserved when lock wait frequently occurs. Even a query which does not need a lock such as SELECT waits because it can not reserve the cluster server.

Workaround

The patch is required.

ISSUE-3663 If cluster deadlock timeout occurs when performing DML, then the query is performed again.

Description

The cluster deadlock timeout which occurred when performing DML is not a deadlock due to the competition between transactions. so it does not need to be terminated as a query failure. Therefore, it performs the query again after rollback.

Symptom

The cluster deadlock may occur due to the lack of lockable cluster servers. The deadlock is not resolved even after the waiting for the time set in CLUSTER_DEADLOCK_TIMEOUT, then CLUSTER_DEADLOCK_TIMEOUT error occurs.

However, if is DML query, then the query is performed again after the rollback when CLUSTER DEADLOCK TIMEOUT occurs.

Workaround

The patch is required.

20c.1.2 Patch Notes

ISSUE-3648 Incorrect result packet of transaction retransmission when failover

Description

It is supposed to ignore the committed transactions when performing the transaction retransmission during the failover, but it actually configures incorrect response packet and transfers it to the client.

Symptom

The server is abnormally terminated when it accesses to the result packet, and it occurs for the case of triplication or over.

Workaround

The patch is required.

20c.1.1 Patch Notes

ISSUE-3621 MERGE_DISTINCT hint is added.

Description

MERGE_DISTINCT hint has been added.

This hint is available when performing distinct clause in the cluster environment, and it is available when it satisfies the following conditions.

Symptom

The following is an example of using MERGE_DISTINCT hint.

\EXPLAIN PLAN
SELECT /*+ MERGE_DISTINCT */
       DISTINCT o_custkey
  FROM orders
 WHERE o_custkey > 0
ORDER BY o_custkey;

O_CUSTKEY
---------
        1
        2
        4
      ...

99996 rows selected.

>>>  start print plan

< Execution Plan >
==========================================================================
|IDX|  NODE DESCRIPTION                                                  |
--------------------------------------------------------------------------
| 0 |  SELECT STATEMENT                                                  |
| 1 |    QUERY BLOCK ("$QB_IDX_2")                                       |
| 2 |      MULTIPLE CLUSTER                                              |
| 3 |        SELECT STATEMENT                                            |
| 4 |          QUERY BLOCK ("$QB_IDX_2")                                 |
| 5 |            GROUP                                                   |
| 6 |              INDEX ACCESS ("ORDERS" AS _A1, "ORDERS_CUSTKEY_FK")   |
==========================================================================

     1  -  TARGET : ORDERS.O_CUSTKEY
     2  -  SQL : SELECT /*+ INDEX( _A1, "PUBLIC"."ORDERS_CUSTKEY_FK" ) */
                        DISTINCT "_A1"."O_CUSTKEY" 
                   FROM "PUBLIC"."ORDERS"@LOCAL AS "_A1" 
                  WHERE "_A1"."O_CUSTKEY" > :_V0 
               ORDER BY "_A1"."O_CUSTKEY" ASC NULLS LAST
           TARGET DOMAIN : G1(G1N1,G1N2) 98218 rows, 
                           G2(G2N1,G2N2) 98174 rows,
                           G3(G3N1,G3N2) 98138 rows
           MERGE GROUPING
             SORT KEY : ORDERS.O_CUSTKEY
             GROUP KEY : ORDERS.O_CUSTKEY
     4  -  TARGET : _A1.O_CUSTKEY
     5  -  GROUP KEY : _A1.O_CUSTKEY
     6  -  HASH SHARD ( # 3 ) 
           READ INDEX COLUMN : _A1.O_CUSTKEY
             MIN RANGE : _A1.O_CUSTKEY > :_V0
             MAX RANGE : _A1.O_CUSTKEY IS NOT NULL

<<<  end print plan

In the execution plan above, MULTIPLE CLUSTER(IDX:2) keeps the order for o_custkey. Therefore, SORT node for ORDER BY is useless, so it is dropped.

Workaround

The patch is required.

ISSUE-3619 Performance of Sampling ANALYZE is improved.

Description

Performance of Sampling ANALYZE for an indexed column in the cluster environment is improved.

Symptom

Sampling ANALYZE for an indexed column is processed in proportion to the entire number of row as follows.

ANALYZE TABLE large_shard_table ESTIMATE STATISTICS 
        SAMPLE 1000000 ROWS FOR COLUMNS indexed_column;

It is modified to process the query above to be processes in proportion to the user-defined SAMPLE n ROWS so that the performance is improved.

Workaround

The patch is required.