Feature Matrix
본 장에서는 각 major version 별로 추가된 주요 기능들에 대해 간략히 설명한다.
Architecture
System Architecture
System architecture에 대한 feature matrix는 다음과 같다.
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
Storage internal에 대한 feature matrix는 다음과 같다.
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
Transaction control에 대한 feature matrix는 다음과 같다.
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
Backup & recovery에 대한 feature matrix는 다음과 같다.
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 스키마
DICTIONARY_SCHEMA 스키마에 대한 feature matrix는 다음과 같다.
계열 | Feature | 1.x | 2.x | 3.1 | 3.2 | 20c.1 |
|---|---|---|---|---|---|---|
ALL_ 계열 view | 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 | |
DBA_ 계열 view | 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 | |
USER_ 계열 view | 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 | |
기타 view | 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 스키마
INFORMATION_SCHEMA 스키마에 대한 feature matrix는 다음과 같다.
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 스키마
PERFORMANCE_VIEW_SCHEMA 스키마에 대한 feature matrix는 다음과 같다.
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
Server property에 대한 feature matrix는 다음과 같다.
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
데이터 타입에 대한 feature matrix는 다음과 같다.
Type | Feature | 1.x | 2.x | 3.1 | 3.2 | 20c.1 |
|---|---|---|---|---|---|---|
문자 스트링 타입 | CHAR | O | O | O | O | O |
VARCHAR | O | O | O | O | O | |
LONG VARCHAR | X | O | O | O | O | |
이진 스트링 타입 | BINARY | O | O | O | O | O |
VARBINARY | O | O | O | O | O | |
LONG VARBINARY | X | O | O | O | O | |
십진 숫자 타입 | 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 | |
이진 숫자 타입 | 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 타입 | BOOLEAN | O | O | O | O | O |
날짜/시간 타입 | 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 타입 | 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 타입 | ROWID | X | O | O | O | O |
Function
함수 및 연산자에 대한 feature matrix는 다음과 같다.
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 |
NUMTOYMINTERVAL( 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_BIGINT( 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
SQL 객체를 생성/ 제거/ 변경하는 DDL에 대한 feature matrix는 다음과 같다.
객체 | Feature | 1.x | 2.x | 3.1 | 3.2 | 20c.1 |
|---|---|---|---|---|---|---|
Database 객체 | 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 객체 | CREATE PROFILE | X | O | O | O | O |
DROP PROFILE | X | O | O | O | O | |
ALTER PROFILE | X | O | O | O | O | |
Audit policy 객체 | 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 객체 | 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 객체 | CREATE SCHEMA | X | O | O | O | O |
DROP SCHEMA | X | O | O | O | O | |
Tablespace 객체 | 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 객체 | 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 객체 | CREATE VIEW | X | O | O | O | O |
DROP VIEW | X | O | O | O | O | |
ALTER VIEW | X | O | O | O | O | |
Index 객체 | 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 객체 | CREATE SEQUENCE | O | O | O | O | O |
DROP SEQUENCE | O | O | O | O | O | |
ALTER SEQUENCE | X | O | O | O | O | |
Synonym 객체 | 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 객체 | CREATE PROCEDURE | X | X | O | O | O |
DROP PROCEDURE | X | X | O | O | O | |
ALTER PROCEDURE | X | X | O | O | O | |
Stored function 객체 | CREATE FUNCTION | X | X | O | O | O |
DROP FUNCTION | X | X | O | O | O | |
ALTER FUNCTION | X | X | O | O | O | |
Package 객체 | 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
Cluster 객체를 생성/ 제거/ 변경하는 DDL에 대한 feature matrix는 다음과 같다.
객체 | Feature | 1.x | 2.x | 3.1 | 3.2 | 20c.1 |
|---|---|---|---|---|---|---|
Cluster system 객체 | ALTER DATABASE REBALANCE | X | X | O | O | O |
ALTER DATABASE DROP INACTIVE CLUSTER MEMBERS | X | X | O | O | O | |
Cluster group 객체 | CREATE CLUSTER GROUP | X | X | O | O | O |
DROP CLUSTER GROUP | X | X | O | O | O | |
Cluster member 객체 | 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 객체 | 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과 shard 객체 | 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 객체 | 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
데이터를 조작하는 DML 구문의 feature matrix는 다음과 같다.
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
데이터를 조회하는 SELECT 구문의 feature matrix는 다음과 같다.
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
제어 구문의 feature matrix는 다음과 같다.
구분 | 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
Persistent Stored Module (PSM) language element의 feature matrix는 다음과 같다.
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 |
Built-in Package 의 feature matrix는 다음과 같다.
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
ODBC 표준 API에 대한 feature matrix는 다음과 같다.
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 |
ODBC 표준 이외의 부가적으로 지원하는 API에 대한 feature matrix는 다음과 같다.
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
JDBC에 대한 class feature matrix는 다음과 같다.
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
Precompiler의 option에 대한 feature matrix는 다음과 같다.
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 전용 구문
Embedded SQL에서만 사용 가능한 SQL 구문에 대한 feature matrix는 다음과 같다.
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
Host 변수에 사용할 수 있는 embbeded SQL data type의 feature matrix는 다음과 같다.
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
Dynamic SQL에 대한 feature matrix는 다음과 같다.
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
PyDBC가 제공하는 pygoldilocks의 method feature matrix는 다음과 같다.
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 |
pygoldilocks module의 attribute feature matrix는 다음과 같다.
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
Connection 객체의 method feature matrix는 다음과 같다.
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 |
Connection 객체의 attribute feature matrix는 다음과 같다.
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
Cursor 객체의 method feature matrix는 다음과 같다.
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 |
Cursor 객체의 attribute feature matrix는 다음과 같다.
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
Row 객체의 attribute feature matrix는 다음과 같다.
Feature | 1.x | 2.x | 3.1 | 3.2 | 20c.1 |
|---|---|---|---|---|---|
cursor_description | X | X | X | O | O |
Utility
gcreatedb
Command Usage
gcreatedb의 command usage에 대한 feature matrix는 다음과 같다.
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
glsnr의 command usage에 대한 feature matrix는 다음과 같다.
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
glsnr의 configuration에 대한 feature matrix는 다음과 같다.
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
gsql의 command usage에 대한 feature matrix는 다음과 같다.
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
gsql 프롬프트 상태에서 사용하는 interactive gsql command에 대한 feature matrix는 다음과 같다.
Feature | 1.x | 2.x | 3.1 | 3.2 | 20c.1 |
|---|---|---|---|---|---|
| O | O | O | O | O |
| X | O | O | O | O |
| X | X | O | O | O |
| X | X | O | O | O |
| X | X | O | O | O |
| X | O | O | O | O |
| X | O | O | O | O |
| X | O | O | O | O |
| X | X | X | O | O |
| X | O | O | O | O |
| X | O | O | O | O |
| X | O | O | O | O |
| X | O | O | O | O |
| X | O | O | O | O |
| X | O | O | O | O |
| X | O | O | O | O |
| X | O | O | O | O |
| X | O | O | O | O |
| X | X | O | O | O |
| X | X | X | X | O |
| O | O | O | O | O |
| X | O | O | O | O |
| O | O | O | O | O |
| O | O | O | O | O |
| O | O | O | O | O |
| O | O | O | O | O |
| O | O | O | O | O |
| O | O | O | O | O |
| X | X | O | O | O |
| O | O | O | O | O |
| O | O | O | O | O |
| O | O | O | O | O |
| O | O | O | O | O |
| O | O | O | O | O |
| O | O | O | O | O |
| O | O | O | O | O |
| O | O | O | O | O |
| X | O | O | O | O |
| X | O | O | O | O |
| O | O | O | O | O |
| O | O | O | O | O |
| O | O | O | O | O |
| X | O | O | O | O |
| O | O | O | O | O |
| O | O | O | O | O |
| O | O | O | O | O |
| X | O | O | O | O |
| X | O | O | O | O |
| O | O | O | O | O |
gloader/gloadernet
Command Usage
gloader의 command usage에 대한 feature matrix는 다음과 같다.
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
gloader의 control file syntax에 대한 feature matrix는 다음과 같다.
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
gdump의 command usage에 대한 feature matrix는 다음과 같다.
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
tablediff의 configuration file에 대한 feature matrix는 다음과 같다.
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
gsyncher의 command usage에 대한 feature matrix는 다음과 같다.
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
gmon의 command usage에 대한 feature matrix는 다음과 같다.
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
gtrclogger의 command usage에 대한 feature matrix는 다음과 같다.
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
glocator의 command usage에 대한 feature matrix는 다음과 같다.
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
glocator의 configuration file에 대한 feature matrix는 다음과 같다.
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
gagent의 command usage에 대한 feature matrix는 다음과 같다.
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
gagent의 configuration file에 대한 feature matrix는 다음과 같다.
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
gloctl의 command usage에 대한 feature matrix는 다음과 같다.
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
gloctl의 configuration file에 대한 feature matrix는 다음과 같다.
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
cyclone의 command usage에 대한 feature matrix는 다음과 같다.
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
cyclone의 configuration file에 대한 feature matrix는 다음과 같다.
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
logmirror의 command usage에 대한 feature matrix는 다음과 같다.
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
logmirror의 configuration file에 대한 feature matrix는 다음과 같다.
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
cymon의 command usage에 대한 feature matrix는 다음과 같다.
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
cyfile의 command usage에 대한 feature matrix는 다음과 같다.
Feature | 1.x | 2.x | 3.1 | 3.2 | 20c.1 |
|---|---|---|---|---|---|
--conf | X | X | X | X | O |
--help | X | X | X | X | O |
--reset | X | X | X | X | O |
--key | X | X | X | X | O |
--silent | X | X | X | X | O |
--info | X | X | X | X | O |
--start | X | X | X | X | O |
--stop | X | X | X | X | O |
--group | X | X | X | X | O |
--encrypt | X | X | X | X | O |
--status | X | X | X | X | O |
Configuration File
cyfile의 configuration file에 대한 feature matrix는 다음과 같다.
Feature | 1.x | 2.x | 3.1 | 3.2 | 20c.1 |
|---|---|---|---|---|---|
DSN | X | X | X | X | O |
HOST_IP | X | X | X | X | O |
HOST_PORT | X | X | X | X | O |
PROTOCOL | X | X | X | X | O |
USER_ID | X | X | X | X | O |
USER_PW | X | X | X | X | O |
GROUP_NAME | X | X | X | X | O |
USER_ENCRYPT_PW | X | X | X | X | O |
CAPTURE_TABLE | X | X | X | X | O |
READ_LOG_BLOCK_COUNT | X | X | X | X | O |
TRANS_SORT_AREA_SIZE | X | X | X | X | O |
TRANS_FILE_PATH | X | X | X | X | O |
LOG_CAPTURE_INTERVAL_1 | X | X | X | X | O |
LOG_CAPTURE_INTERVAL_2 | X | X | X | X | O |
DATA_FILE_PATH | X | X | X | X | O |
DATA_FILE_PREFIX | X | X | X | X | O |
DATA_FILE_SIZE | X | X | X | X | O |
UPDATE_BEFORE_VALUE | X | X | X | X | O |
What's New in GOLDILOCKS 20c.1
본 장은 GOLDILOCKS 20c.1에 새로 추가된 기능들에 대해 간략히 설명한다.
Architecture
System Architecture
지원 가능한 플랫폼이 변경되었다.
Storage Internal
디스크 테이블스페이스에 테이블, 인덱스를 저장할 수 있게 되었다. 디스크 테이블스페이스의 페이지는 별도의 메모리 공간을 이용하여 디스크의 데이터파일에서 읽어야 하는데, 이를 위한 버퍼 캐쉬 기능도 함께 추가되었다.
또한, 디스크 테이블스페이스에 대한 증분 백업은 이전 백업 후 변경된 페이지를 찾기 위해 전체 데이터파일을 검사한 후 백업 여부를 판단하므로 데이터파일의 크기가 큰 경우 변경된 페이지 수가 적더라도 백업 속도가 느리다는 문제가 있었다. 디스크 테이블스페이스 증분 백업의 문제점을 해결하기 위해 변경된 페이지들의 정보를 유지하는 체인지 트래킹 기능이 추가되었다.
Transaction Control
변동 사항 없음
Backup & Recovery
변동 사항 없음
Database Information
DICTIONARY_SCHEMA
Recyclebins 객체 정보를 조회하기 위해 다음 view가 추가되었다.
PSM package 객체 정보를 조회하기 위해 다음 view가 추가되었다.
INFORMATION_SCHEMA
PSM package 객체 정보를 조회하기 위해 다음 view가 추가되었다.
PERFORMANCE_VIEW_SCHEMA
디스크 테이블스페이스의 페이지들을 캐싱하기 위한 버퍼 캐쉬의 모든 페이지 프레임과 버퍼 캐쉬의 통계치 등을 조회하기 위해 다음 view들이 추가되었다.
디스크 테이블스페이스를 증분 백업할 때 사용되는 체인지 트래킹 정보를 조회하기 위해 .V$DB_CHANGE_TRACKING이 추가되었다
Server Property
휴지통 기능에 대한 프로퍼티 추가
휴지통 기능을 활성화 하기 위해 RECYCLEBIN 프로퍼티가 추가되었다.
CLUSTER_SESSION_HASH_BUCKETS 추가
Cluster session의 hash bucket 개수를 제어하기 위해 CLUSTER_SESSION_HASH_BUCKETS 프로퍼티가 추가되었다.
DEADLOCK_PRIORITY 추가
다수의 트랜잭션을 동시에 수행하다가 deadlock이 발생할 경우, 이를 해결하기 위해 특정 트랜잭션을 victim으로 설정하는 DEADLOCK_PRIORITY 프로퍼티가 추가되었다.
USE_LARGE_PAGES 추가
HugePage를 사용하기 위해 USE_LARGE_PAGES 프로퍼티가 추가되었다.
BUFFER_CACHE_SIZE 추가
디스크 테이블스페이스를 캐싱하기 위한 버퍼 캐쉬 크기를 설정하는 BUFFER_CACHE_SIZE 프로퍼티가 추가되었다.
BUFFER_CHECKPOINT_LIST_COUNT 추가
버퍼 캐쉬에서 갱신된 페이지를 체크포인트 할 때 디스크로 flush 하기 위해 연결하는 checkpoint list의 개수를 설정하는 BUFFER_CHECKPOINT_LIST_COUNT 프로퍼티가 추가되었다.
BUFFER_FLUSH_THREADS 추가
데이터베이스 시스템의 버퍼를 flush 하는 thread 개수를 설정하는 BUFFER_FLUSH_THREADS 프로퍼티가 추가되었다.
BUFFER_FLUSHING_INTERVAL 추가
버퍼 flush thread가 처리할 작업이 없을 때의 유휴 시간을 설정하는 BUFFER_FLUSHING_INTERVAL 프로퍼티가 추가되었다.
BUFFER_FREE_LIST_COUNT 추가
버퍼 캐쉬에서 즉시 사용 가능한 bch를 연결하는 list의 개수를 설정하는 BUFFER_FREE_LIST_COUNT 프로퍼티가 추가되었다.
BUFFER_HASH_BUCKETS 추가
버퍼 캐쉬에 caching 된 페이지를 lookup 하기 위한 hash bucket 개수를 설정하는 BUFFER_HASH_BUCKETS 프로퍼티가 추가되었다.
BUFFER_HOT_REGION_CRITERIA 추가
페이지를 버퍼 lru list의 hot region으로 옮기기 위한 touch count를 설정하는 BUFFER_HOT_REGION_CRITERIA 프로퍼티가 추가되었다.
BUFFER_HOT_REGION_PERCENT 추가
버퍼 lru list의 전체 페이지 중 hot region에 남겨둘 페이지의 비율 (백분율)을 설정하는 BUFFER_HOT_REGION_PERCENT 프로퍼티가 추가되었다.
BUFFER_LRU_LIST_COUNT 추가
데이터베이스 시스템에서 사용할 버퍼 lru list의 개수를 설정하는 BUFFER_LRU_LIST_COUNT 프로퍼티가 추가되었다.
BUFFER_MULTIPAGE_READ_COUNT 추가
디스크 테이블을 full scan 할 때 한 번의 디스크 IO에 사용할 최대 페이지 수를 설정하는 BUFFER_MULTIPAGE_READ_COUNT 프로퍼티가 추가되었다.
CHANGE_TRACKING 추가
디스크 테이블스페이스를 incremental backup 하기 위해 변경된 페이지들을 tracking 할지 여부를 설정하는 CHANGE_TRACKING 프로퍼티가 추가되었다.
CHANGE_TRACKING_EXTENT_SIZE 추가
Change tracking을 수행할 때 하나의 extent에 포함될 페이지 수를 설정하는 CHANGE_TRACKING_EXTENT_SIZE 프로퍼티가 추가되었다.
CHANGE_TRACKING_FILE 추가
Change tracking 파일을 저장할 디렉토리와 파일 이름을 설정하는 CHANGE_TRACKING_FILE 프로퍼티가 추가되었다.
INCREMENTAL_BACKUP_SCAN_BUFFER_SIZE 추가
디스크 테이블스페이스를 incremental backup 할 때 한 번의 디스크 IO로 읽어들일 최대 페이지 수를 설정하는 INCREMENTAL_BACKUP_SCAN_BUFFER_SIZE 프로퍼티가 추가되었다.
REDO_LOG_COMPRESSION_THRESHOLD 추가
로그를 압축할 때 threshold 크기를 설정하는 REDO_LOG_COMPRESSION_THRESHOLD 프로퍼티가 추가되었다.
SYSTEM_DISK_DATA_TABLESPACE_SIZE 추가
데이터베이스를 생성할 때 DISK_DATA_TBS 테이블스페이스 크기를 설정하는 SYSTEM_DISK_DATA_TABLESPACE_SIZE 프로퍼티가 추가되었다.
USER_DATA_TABLESPACE_MEDIA_TYPE 추가
사용자 데이터 테이블스페이스를 생성할 때 테이블스페이스의 media 타입이 생략될 경우 사용할 default media 타입을 설정하는 USER_DATA_TABLESPACE_MEDIA_TYPE 프로퍼티가 추가되었다.
USER_DATA_TABLESPACE_SIZE 추가
사용자 데이터 테이블스페이스를 생성하거나 데이터 파일을 추가할 때 데이터 파일의 크기가 생략될 경우 사용할 default 크기를 설정하는 USER_DATA_TABLESPACE_SIZE 프로퍼티가 추가되었다.
USER_DISK_DATA_TABLESPACE_NEXTSIZE 추가
사용자 디스크 데이터 테이블스페이스의 데이터 파일이 확장되어야 할 때 확장할 크기가 설정되지 않은 경우 사용할 default 크기를 설정하는 USER_DISK_DATA_TABLESPACE_NEXTSIZE 프로퍼티가 추가되었다.
USER_TEMP_TABLESPACE_SIZE 추가
사용자 temp 테이블스페이스를 생성하거나 데이터 파일을 추가할 때 데이터 파일의 크기가 생략된 경우 사용할 default 크기를 설정하는 USER_TEMP_TABLESPACE_SIZE 프로퍼티가 추가되었다.
IN_KEY_RANGE_ARRAY_COUNT 추가
Array 기반 in key range scan에 대한 array 크기를 설정하는 IN_KEY_RANGE_ARRAY_COUNT 프로퍼티가 추가되었다
BROADCAST_INDEX_REBUILD_PROTOCOL 추가
클러스터 환경에서 인덱스를 재구축할 때 모든 멤버에 동시에 재구축할지 여부를 설정하는 BROADCAST_INDEX_REBUILD_PROTOCOL 프로퍼티가 추가되었다.
SQL
Cluster Query 성능 개선
Cluster 환경에서 복잡한 query를 처리하는 성능이 향상되었다.
TPC-H(scale factor 10) 테스트에서 각 query 별 cluster group이 증가함에 따라 다음과 같이 성능이 변화된다.
다음 그림은 20c.1 버전의 그래프이다. Cluster group이 증가함에 따라 대부분 query의 응답시간이 감소한다.
20c.1 버전에서 TPC-H SF10의 cluster group 증가에 따른 각 query 별 응답시간
Cluster 환경에서의 질의 처리에 대한 자세한 내용은 다음을 참조한다.
SQL Element
Data Type
변동 사항 없음
Function
다음과 같은 formatting 함수가 추가되었다.
PHYSICAL_LENGTH 함수가 추가되었다.
LNNVL 함수가 추가되었다.
Pseudo Column
CLUSTER_SHARD_ID Pseudo Column이 추가되었다.
Object
Package 객체
PSM package 객체가 추가되었다.
SQL Language
Table DDL
테이블에 휴지통 기능이 추가되었다.
휴지통에 보관된 객체 복구
휴지통에 보관된 객체 제거
Shard들을 병합하는 기능인 ALTER TABLE name MERGE SHARDS가 추가되었다.
Global secondary index를 재구축하는 기능인 REBUILD GLOBAL SECONDARY INDEX가 추가되었다.
Index DDL
인덱스를 재구축하는 기능인 ALTER INDEX name REBUILD가 추가되었다.
Immutable Table
테이블을 삭제하거나 저장된 레코드를 삭제 또는 변경할 수 없는 테이블 기능이 추가되었다.
ADD MEMBER 수행 시 position 지정
Cluster member를 추가할 때 member position을 지정할 수 있는 구문이 추가되었다.
ALTER CLUSTER GROUP name ADD MEMBER의 <member position>
CREATE CLUSTER GROUP의 <member position>
PSM Package 관련 DDL
PSM package를 생성하거나 삭제할 때 사용되는 DDL이 추가되었다.
성능 측정 관련
Disk buffer cache의 buffer page들을 비우는 구문인 ALTER SYSTEM CLEANUP BUFFER_CACHE가 추가되었다.
API
ODBC
데이터 원본 스펙 섹션의 키워드에 DOT_NET_FOR_ODBC가 추가되었다.
데이터 원본 구성
데이터 원본 구성에 trace와 tracefile, include_synonyms가 추가되었다.
JDBC
Statement Pooling 기능이 추가되었다.
Connection 클래스의 getNetworkTimeout 및 setNetworkTimeout method를 지원한다.
연결 프로퍼티
연결 프로퍼티에 tcp_nodelay와 login_timeout, include_synonyms가 추가되었다.
Embedded SQL
Precompiler(gpec)
--cumulative 옵션이 추가되었다.
gpec에 --parse 옵션이 추가되었다.
PDO
변동 사항 없음
PyDBC
변동 사항 없음
Ruby
변동 사항 없음
Hibernate
변동 사항 없음
Utility
gcreatedb
변동 사항 없음
glsnr
변동 사항 없음
gsql/gsqlnet
Package 객체들의 DDL 구문을 export 하기 위해 \ddl_package 기능이 추가되었다.
gloader/gloadernet
변동 사항 없음
gdump
변동 사항 없음
tablediff
변동 사항 없음
gsyncher
변동 사항 없음
gmon
변동 사항 없음
gtrclogger
변동 사항 없음
glocator
gagent와 통신하는 방법이 TCP로 변경되었다.
Configure 파일에서 FAILOVER_TIMEOUT이 삭제되었다.
Configure 파일에 MAX_NODE_COUNT가 추가되었다.
Configure 파일에 KEEPALIVE_IDLE_TIME, KEEPALIVE_COUNT, KEEPALIVE_INTERVAL이 추가되었다.
gagent
glocator와 통신하는 방법이 TCP로 변경되었다.
Configure 파일에서 COMMAND_QUEUE_SIZE가 삭제되었다.
Configure 파일에서 COMMAND_ALLOCATOR_SIZE가 삭제되었다.
Configure 파일에서 PACKET_ALLOCATOR_SIZE가 삭제되었다.
Configure 파일에서 UPDATE_LOCATION_TIME이 삭제되었다.
Configure 파일에서 SESSION_TIMEOUT이 삭제되었다.
Configure 파일에 SYSTEM_UDS_DIR이 추가되었다.
Configure 파일에서 PORT가 삭제되고 REQUEST_PORT, RESPONSE_PORT가 추가되었다.
Configure 파일에 KEEPALIVE_IDLE_TIME, KEEPALIVE_COUNT, KEEPALIVE_INTERVAL이 추가되었다.
gloctl
변동 사항 없음
Replication
cyclone
변동 사항 없음
logmirror
변동 사항 없음
cymon
변동 사항 없음
cyfile
CDC 방식을 사용하여 원본 데이터베이스의 transaction을 CSV 형식의 파일로 저장/ 기록하는 툴이 추가되었다.
Patch Notes
20c.1.30 Patch Notes
ISSUE-4478 JDBC connection 클래스의 setNetworkTimeout 동작을 비동기 방식에서 동기 방식으로 변경하였다.
개요
Connection 클래스의 setNetworkTimeout() 의 내부 동작을 비동기 방식에서 동기 방식으로 변경하였다.
현상 및 증상
기존 비동기 방식에서는 네트워크 타임아웃 설정 요청이 즉시 반환되고, 실제 설정 적용은 별도의 스레드에서 수행되었다. 이로 인해 setNetworkTimeout() 호출 직후 실행되는 SQL이 새로운 타임아웃 값이 적용되기 전에 수행될 수 있었다. 따라서 타임아웃이 의도한 대로 동작하지 않거나, 설정 적용 시점이 일정하지 않은 문제가 발생할 수 있었다.
수정 전 대처
setNetworkTimeout() 호출 후 일정 시간 대기하거나, 타임아웃 설정이 완료된 것으로 예상되는 시점 이후에 SQL을 수행하는 등의 우회 방법이 필요하다.
ISSUE-8272 View projection pruning 과정에서 view 상위에서 사용되지 않는 column을 제거할 때 다른 target에서 사용하는 aggregation까지 함께 삭제되는 문제가 발생하여 이를 수정하였다.
개요
View projection pruning 과정에서 view 상위에서 사용되지 않는 column을 제거할 때 다른 target에서 사용하는 aggregation까지 함께 삭제되는 문제가 발생하였다.
현상 및 증상
아래 질의를 수행하면 비정상 종료가 발생한다.
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;수정 후에는 위 질의가 정상적으로 수행되며, 다음과 같은 결과를 반환한다.
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.수정 전 대처
없음
20c.1.29 Patch Notes
ISSUE-4478 JDBC connection 클래스의 getNetworkTimeout 및 setNetworkTimeout method를 지원한다.
개요
Connection 클래스의 getNetworkTimeout 및 setNetworkTimeout method를 지원한다.
현상 및 증상
없음
수정 전 대처
없음
ISSUE-8058 glibc 2.34 환경에서 pthread_yield의 호환성 문제를 수정하였다.
개요
glibc 2.34 환경에서 pthread_yield() 를 참조할 때 호환성 문제가 발생하여, GOLDILOCKS 공유 라이브러리의 링크 실패를 유발할 수 있었다. 이에 따라 thread yield 를 구현할 때 표준 sched_yield() 를 우선 사용하도록 변경하여, glibc 2.34 계열 환경에서의 빌드 호환성을 확보하였다.
현상 및 증상
glibc 2.34 환경에서 애플리케이션을 빌드할 때 최종 링크 단계에서 GOLDILOCKS 공유 라이브러리가 pthread_yield 심볼을 해석하지 못해 빌드에 실패하였다. 대표 오류 메시지는 다음과 같다.
• undefined reference to 'pthread_yield'수정 전 대처
glibc 2.34 미만 환경을 사용한다.
ISSUE-7805 ODBC의 LONG VARCHAR, LONG VARBINARY 타입 처리 과정에서 할당된 메모리가 정상적으로 해제되지 않는 문제가 있어 이를 수정하였다.
개요
FETCH 작업 중인 테이블의 스키마 구조가 변경된 뒤 동일 테이블에 대해 다시 FETCH 작업을 수행할 경우, 메타데이터 재구축 과정에서 LONG VARCHAR, LONG VARBINARY 타입 column에 대해 메모리 누수가 발생하였다.
현상 및 증상
클라이언트-서버 (CS) 환경에서 ODBC를 사용해 데이터를 조회하는 과정에서, FETCH 작업 도중 해당 테이블에 대해 ALTER 구문으로 테이블 구조가 변경되면 메타데이터를 재구축한다. 이 때 테이블에 LONG VARCHAR, LONG VARBINARY 타입 column이 존재하면 해당 column 타입에 대해 동적으로 할당된 메모리가 해제되지 않아 메모리 누수가 발생하였다.
수정 전 대처
이 문제가 수정되기 전까지는 fetch 작업 중 테이블 구조를 변경하지 않는 것이 가장 안정적인 방법이다. 부득이하게 테이블 구조가 변경되는 경우에는 해당 SQLHSTMT 핸들에 대해 SQLFreeHandle을 호출한 뒤, SQLAllocHandle 을 다시 수행하여 핸들을 재할당해야 한다.
ISSUE-7782 gpec에 parse 옵션을 추가하였다.
개요
gpec에 소스 파싱 동작을 제어하기 위한 parse 옵션을 추가하였다. 해당 옵션값으로 none 또는 partial을 지정할 수 있으며, 별도로 지정하지 않을 경우 기본값은 partial이다.
현상 및 증상
없음
수정 전 대처
없음
ISSUE-7782 gpec 전처리기의 코드 처리 방식을 수정하였다.
개요
gpec 전처리기에서 조건이 false로 평가되는 전처리기 분기 (#if, #elif, #else, #ifdef, #ifndef)에 포함된 코드의 처리 방식이 변경되었다. 기존에는 false 조건에 해당하는 코드를 출력 결과에서 제거하였으나, 패치 이후에는 해당 코드를 삭제하지 않고 그대로 출력하도록 수정하였다.
현상 및 증상
일부 헤더 파일에서 정의된 매크로를 gpec 전처리기가 인식하지 못하는 경우가 있었다. 이 경우 gpec은 전처리기 조건을 false 로 간주하여 관련 코드 전체를 삭제하였다. 그 결과 실제 컴파일 환경에서는 유효한 코드임에도 불구하고 gpec 처리 결과에서는 누락되는 문제가 발생하였다. 즉, 전처리기 차이에 의해 gpec 결과물이 실제 빌드 결과와 불일치하는 상황이 발생할 수 있었다.
예를 들어, 다음과 같이 gc 파일에서 EXEC SQL INCLUDE 문으로 헤더 파일을 포함하는 경우, 해당 헤더가 다른 헤더에 정의된 매크로를 참조하면 gpec은 해당 매크로를 해석할 수 없으므로 조건을 false로 판단한다. 그 결과 삭제되어서는 안되는 코드가 제거되는 문제가 발생한다.
다음은 gpec에서 참조되지 않은 헤더 파일 예시이다.
#ifndef SYS_FLAG_H #define SYS_FLAG_H #define SYS_FEATURE_FLAG 1 #endif /* SYS_FLAG_H */
다음은 gpec에서 정상적으로 참조된 헤더 파일 예시이다.
#ifndef SYS_CONFIG_H #define SYS_CONFIG_H /* 다른 헤더에 정의된 매크로를 참조 */ #define ENABLE_FEATURE SYS_FEATURE_FLAG #endif /* SYS_CONFIG_H */
다음은 gc 파일이다.
EXEC SQL INCLUDE sys_config.h;
int main(void)
{
#if ENABLE_FEATURE
/* 실제 컴파일 환경에서는 SYS_FEATURE_FLAG == 1 이므로
이 코드가 포함되어야 한다. */
feature_func();
#endif
return 0;
}sys_config.h는 다른 헤더에 정의된 매크로를 참조하고 있으나, gpec은 해당 매크로를 해석하지 못한다. 그 결과 ENABLE_FEATURE 조건이 false로 평가되고, 실제 컴파일 환경에서는 유효한 코드임에도 gpec 처리 결과에서는 삭제된다.
수정 전 대처
gc 파일에서 사용하는 전처리 조건과 매크로는 EXEC SQL INCLUDE로 포함되는 헤더 파일 내에서 정의되도록 구성한다.
ISSUE-7743 gpec 전처리기에서 중첩된 #if / #endif 구문을 처리하는 과정에서 발생하던 오류를 수정하였다.
개요
gpec 전처리기는 #if 전처리기 구문을 처리할 때, 조건이 false 로 평가되면 해당 #endif 구문까지의 모든 문장을 제거 (빈 문자열로 치환)한다. 그러나 #if / #endif 구문이 중첩되어 사용되는 경우, 내부 전처리기 블록에 포함된 일부 문장이 정상적으로 제거되지 않는 오류가 확인되어 이를 수정하였다. 본 수정 사항은 #if 구문뿐만 아니라 #elif, #else, #ifdef, #ifndef 등 모든 조건부 전처리기 구문에 동일하게 적용된다.
현상 및 증상
다음은 중첩된 #if / #endif 구문을 포함한 gc 파일의 일부이다.
#if 0
#if 0
printf("error 1");
#else
printf("error 2");
#endif
printf("error 3");
#endif위 코드를 gpec 전처리기를 통해 변환하여 생성된 c 파일의 일부는 다음과 같다.
printf("error 3");중첩된 #if 0 조건에 따라 세 개의 printf 문장은 모두 제거되어야 하나, 변환 결과물에는 printf("error 3"); 문장이 남아 있는 문제가 발생하였다.
수정 전 대처
중첩된 #if, #endif 구문의 사용을 피하거나, 다음과 같이 #endif 구문 이후에 실행 문장을 작성하지 않아야 한다.
#if 0
#if 0
printf("error 1");
#else
printf("error 2");
#endif // 이 구문 이하는 정상적으로 처리 되지 않음.
printf("error 3");
#endifISSUE-7353 ODBC fetch 중 배열 크기 변경 시 데이터가 누락되는 문제가 있어 이를 수정하였다.
개요
ODBC 클라이언트-서버 환경에서 데이터 fetch 도중 배열 크기(array size) 를 동적으로 변경할 때 발생하는 데이터 조회 실패 문제를 수정하였다.
현상 및 증상
클라이언트-서버(CS) 환경에서 ODBC를 사용하여 데이터를 조회할 때, fetch 작업 도중 배열 크기를 변경하면 데이터를 정상적으로 가져오지 못하는 문제가 발생했다. 이 문제는 SQLExtendedFetch, SQLFetch, SQLFetchScroll 함수를 사용할 때 공통적으로 나타났으며, 특히 작은 배열 크기(예: 1건) 로 fetch를 시작한 후 큰 배열 크기(예: 100건) 로 변경하는 경우에 발생했다.
구체적인 증상으로는 SQL_ROWSET_SIZE 또는 SQL_ATTR_ROW_ARRAY_SIZE 속성을 변경한 후, 실제로는 더 많은 데이터가 존재함에도 불구하고 SQL_NO_DATA가 조기에 반환되어 일부 데이터만 조회되는 현상이 있었다.
수정 전 대처
이 문제가 수정되기 전까지는 fetch 작업 중 배열 크기를 변경하지 않고 고정된 크기로 유지하는 것이 가장 안정적인 방법이다. 만약 배열 크기를 반드시 변경해야 하는 경우라면, SQLCloseCursor 함수를 사용하여 현재 커서를 닫은 후에 쿼리를 다시 실행하여 새로운 배열 크기로 처음부터 fetch를 수행해야 한다. 성능보다 안정성이 중요한 경우에는 배열 크기를 1로 고정하여 단일 행 씩 fetch 하는 방법을 사용할 수 있다.
ISSUE-6575 Fetch statement의 INTO 절에 record type variable의 field만 명시하면 에러가 발생한다.
개요
Fetch statement에 fetch 하려는 cursor의 target 수와 INTO 절의 target 수가 동일함에도 record type variable의 field를 명시하면 에러가 발생한다.
현상 및 증상
Cursor의 SELECT statement의 target 수와 fetch into 절의 target 수가 동일함에도 에러가 발생한다.
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
현재는 정상 동작하도록 수정되었다.
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.
수정 전 대처
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 GSI REBUILD 과정에서 member info array의 경계를 침범하는 경우가 있다.
개요
클러스터 멤버를 DROP 한 뒤에 GSI를 REBUILD하면 시스템이 비정상적으로 종료될 수 있다.
현상 및 증상
하나 이상의 클러스터 노드가 DROP 된 뒤에 다음과 같이 클러스터 멤버를 정리하고 GSI를 REBUILD하면 시스템이 비정상적으로 종료된다.
ALTER DATABASE DROP INACTIVE CLUSTER MEMBERS; Database altered. ALTER TABLE T1 REBALANCE; Table altered. ALTER TABLE T1 REBUILD GLOBAL SECONDARY INDEX;
수정 전 대처
없음
ISSUE-6557 Outer join을 사용할 때, where 절에 right table의 column이 포함된 DECODE, stored function, concat과 같은 함수가 존재하면 잘못된 결과가 도출될 수 있다.
개요
Where 절에 right table의 column이 포함된 DECODE, stored function, concat과 같은 함수가 존재할 경우, 아래와 같은 outer join operation elimination이 적용되어서는 안 되지만 실제로는 적용되는 문제가 발생했다.
Left outer join이 inner join으로 transform 되었다.
Full outer join이 left outer join으로 transform 되었다.
현상 및 증상
다음과 같이 outer join operation elimination이 발생하는 경우, where 절에 DECODE, stored function 등이 포함되면 잘못된 결과가 도출된다.
수정 전에는 다음과 같이 잘못된 결과가 도출되었다.
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수정 후, 올바른 plan과 결과는 다음과 같다.
\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수정 전 대처
다음과 같이 NO_QUERY_TRANSFORMATION hint를 사용한다.
\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 planISSUE-4334 Global Open 으로 상승할 때 SCN 차이로 인해 노드 JOIN에 실패한다.
개요
특정 멤버의 scn이 cluster의 최대 scn 보다 작아서 cluster에 조인하지 못하는 현상이 있어 이를 수정하였다.
현상 및 증상
다음과 같은 에러와 함께 Global Open 으로 올라오지 못하는 현상이 발생한다.
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
수정 전 대처
없음
ISSUE-6129 Global Connection 에서 prepare/execute 시 유효한 plan cache 를 drop 하는 경우가 있다.
개요
20c.1.12 버전부터 존재하는 현상이다.
Global connection 에서 prepare/execute 시 최초 execute 에서 유효한 plan cache 임에도 이를 drop 하고 새로운 plan cache 를 생성하는 현상이 있어 이를 수정하였다.
현상 및 증상
Global connection 환경에서 여러 gsqlnet 으로 다음과 같이 prepare/execute 를 수행한다.
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.
이후 plan cache 의 상태를 조회해 보면 아래와 같이 drop 된 plan cache 가 존재한다.
SELECT COUNT(*) FROM x$sql_cache WHERE dropped IS TRUE;
COUNT(*)
--------
2
1 row selected.수정 전 대처
없음
ISSUE-4575 Embedded SQL에서 동일한 SQL 문이 중복 캐시된다.
개요
Embedded SQL은 DML과 query 구문을 캐시하여 동일한 SQL을 사용할 때 재활용 한다. char 포인터가 호스트 변수로 사용되는 경우에는 동일한 SQL 문이 중복 캐시된다.
현상 및 증상
다음과 같이 char 포인터가 호스트 변수로 사용되고 이 char 포인터의 문자열 길이가 달라지면 SQL 구문이 새로 생성된다.
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 )
....
}수정 전 대처
호스트 변수로 char 포인터를 사용하는 대신에 char array를 사용한다.
20c.1.28 Patch Notes
ISSUE-5828 ROWNUM을 포함한 join 질의는 원격 노드로 보낼 수 없는데 보내는 경우가 있다.
개요
ROWNUM을 포함한 join 질의는 원격 노드로 보낼 수 없다. Clone 테이블이라 하더라도 각 노드마다 data의 저장 순서가 다를 경우, 잘못된 결과가 도출될 수 있다.
현상 및 증상
\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 planROWNUM을 포함한 join 질의는 원격 노드로 보낼 수 없는데, 위 질의를 보면 ROWNUM filter를 원격 질의 노드로 보내고 있다.
수정 전 대처
/*+ LOCAL_JOIN(Y) */ hint를 사용한다.
ISSUE-5665 세 개 이상의 테이블이 포함된 join이 instant nested loop join method 방식으로 수행되면 잘못된 결과가 도출될 수 있다.
개요
세 개 이상의 테이블이 포함된 join이 instant nested loop join method 방식으로 수행되면 잘못된 결과가 도출될 수 있다.
현상 및 증상
--# 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위 질의의 결과는 '27' 이어야 하지만 실제 결과는 '0' 이 도출된다.
WHERE 절 조건 'T4.COL1 = T2.COL1 + T1.COL1 AND T4.COL1 = T3.COL1 + T1.COL1'은 index range 조건으로 사용될 수 없는데 실제로는 사용되고 있다.
문제를 수정하면 다음과 같이 결과가 정상적으로 도출된다.
\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수정 전 대처
USE_INL(t1) 외의 다른 hint를 사용한다. 예를 들면 USE_NL(t1), USE_HASH(t1), USE_MERGE(t1) 등을 사용한다.
ISSUE-4863 REBALANCE 후에 lock이 optimistic mode로 전환되지 않는다.
개요
ALTER TABLE REBALANCE 하는 도중에 pessimistic mode로 전환된 lock이 optimistic mode로 전환되지 않아 성능이 저하될 수 있다.
현상 및 증상
DML이 발생한 상황에서 ALTER TABLE REBALANCE ONLINE을 수행하면 성능이 저하될 수 있다.
수정 전 대처
없음
20c.1.27 Patch Notes
ISSUE-5505 Join의 가장 왼쪽 테이블에 대한 access method가 unique index access 이고, group by의 key column 중 일부만 그 unique index에 속하는 경우, 잘못된 결과가 도출될 수 있다.
개요
Join의 가장 왼쪽 테이블에 대한 access method가 unique index access 이고, group by의 key column 중 일부만 그 unique index에 속하는 경우, 잘못된 결과가 도출될 수 있다.
현상 및 증상
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") |
========================================================================위 질의 수행 결과는 6 rows 이어야 하는데, 18 rows가 출력되고 있다. 가장 왼쪽 테이블 s가 'S_PRIMARY_KEY_INDEX'를 이용하기 때문에 join의 결과는 s.c1에 대하여 정렬되어 올라온다. 위 plan을 보면 group by가 join의 정렬된 결과를 이용하여 grouping을 수행한다. 그러나 그 정렬된 record들은 모든 group key 칼럼에 대하여 정렬된 것이 아니기 때문에 틀린 결과가 도출될 수 있다.
수정 전 대처
/*+ USE_GROUP_HASH */ hint를 사용한다.
ISSUE-5353 윈도우 ODBC 연결 및 해제 시 프로그램 handle 개수가 증가하는 문제가 있어 이를 수정하였다.
개요
윈도우 ODBC를 사용해 연결과 해제를 반복할 경우 프로그램의 전체 handle 개수가 증가되는 문제가 있어 수정하였다.
현상 및 증상
윈도우 ODBC를 사용해 연결과 해제를 반복할 경우 프로그램의 전체 handle 수가 증가한다.
수정 전 대처
없음
ISSUE-5367 JDBC에 Statement Pooling 기능을 추가하였다.
개요
Statement Pooling 기능을 지원한다.
현상 및 증상
없음
수정 전 대처
없음
ISSUE-5344 View projection pruning을 수행할 때, 상위 block에서 사용하는 column까지 삭제하는 문제가 있다.
개요
다음 조건을 만족하는 경우, 잘못 수행된 view projection pruning으로 인해 서버가 비정상 종료할 수 있다.
View 내부에 group by 또는 order by가 있다.
View의 select list에서 삭제하려는 expr이 다른 function expression의 argument 이다.
현상 및 증상
다음은 문제가 발생할 수 있는 질의의 예이다.
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;v1에서 decode_sum_col1은 상위 block에서 쓰이지 않기 때문에 pruning 된다. 그런데 이 때 DECODE의 argument인 sum(col1)도 pruning 하는 문제가 있다. 하지만 sum(col1)은 select list에 이미 명시되어 있고 view 상위 block에서 쓰고 있으므로 삭제하면 안된다.
수정 전 대처
없음
ISSUE-4234 ADD MEMBER 후 PSM DDL을 수행하면 ROUTINE primary key에 대한 dictionary integrity constraint violation 에러가 발생할 수 있다.
개요
ADD MEMBER 후 PSM DDL을 수행하면 ROUTINE primary key에 대한 dictionary integrity constraint violation 에러가 발생하는 문제가 있어 이를 수정하였다.
현상 및 증상
다음과 같이 routine을 생성한 후에 cluster member를 추가하고 나서 routine을 생성하면 에러가 발생한다.
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수정 전 대처
없음
ISSUE-5162 ODBC의 SQL_ATTR_CONNECTION_TIMEOUT을 설정했어도 오랜 시간 동안 대기하는 문제를 수정하였다.
개요
네트워크 단절을 인지하기 위해 ODBC의 SQL_ATTR_CONNECTION_TIMEOUT을 설정했는데도 주어진 TIMEOUT 보다 더 오래 대기하는 문제를 수정하였다.
현상 및 증상
ODBC의 SQL_ATTR_CONNECTION_TIMEOUT을 설정하였지만 특정 상황에서 네트워크 단절을 인지하지 못해 ODBC에서 서버 응답을 계속 기다리는 문제가 있다.
수정 전 대처
odbc.ini에 다음 속성을 추가하여 네트워크 단절을 빨리 인지할 수 있도록 한다.
KEEPALIVE_IDLE_TIME
KEEPALIVE_INTERVAL
KEEPALIVE_COUNT
또는 다음 커널 속성을 변경하여 네트워크 단절을 빨리 인지할 수 있도록 한다.
net.ipv4.tcp_keepalive_intvl
net.ipv4.tcp_keepalive_probes
net.ipv4.tcp_keepalive_time
net.ipv4.tcp_retries2
ISSUE-5124 Dynamic memory를 할당하다 실패하면 동시성 문제로 서버가 죽을 수 있다.
개요
Dynamic memory를 할당하다 실패할 경우 동시성 문제로 서버가 죽을 수 있다.
현상 및 증상
한 개의 dynamic memory를 여러 thread에서 할당하다 실패하면 동시성 문제로 서버가 죽을 수 있다.
수정 전 대처
없음
20c.1.26 Patch Notes
ISSUE-4933 JDBC XA 사용 도중 서버가 내려가면 클라이언트에게 XA 에러를 전달해야 한다.
개요
JDBC XA를 사용하는 도중에 서버가 내려가면 클라이언트에게 XA 에러를 전달해야 한다.
현상 및 증상
JDBC XA를 사용하는 도중에 서버가 내려가면 클라이언트에게 XA 에러를 전달해야 하지만 실제로는 그렇게 하지 못해 XA 동작이 성공한 것처럼 동작한다.
수정 전 대처
없음
ISSUE-4873 세션에서 dissociate 되지 않은 XA 트랜잭션에 대한 XA rollback 기능을 지원한다.
개요
XA 트랜잭션은 xa end가 수행되기 전까지 세션에 associate 되어 있는데 이 XA 트랜잭션을 commit 하거나 rollback 하려면 세션과 dissociate 해야만 한다. 그런데 타 DBMS의 경우, 세션에서 dissociate하지 않은 상태에서도 rollback 할 수 있는 기능을 지원하고 있어 이에 맞춰 동일한 기능을 지원하도록 개선하였다.
현상 및 증상
세션에서 수행 중인 XA 트랜잭션을 xa end 하지 않고 xa rollback 하면 에러가 발생하고, xa end 후에 xa rollback을 하면 정상적으로 동작한다.
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
수정 전 대처
없음
ISSUE-4753 USER_TABLES를 조회할 때 global temporary table이 조회되지 않는다.
개요
USER_TABLES, ALL_TABLES, DBA_TABLES와 같은 dictionary view를 조회할 때 global temporary table이 조회되지 않는다.
현상 및 증상
다음과 같이 global temporary table을 생성한 후에 USER_TABLES을 통해 조회해도 조회되지 않는다.
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.패치하면 다음과 같이 올바른 결과가 조회된다.
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.해당 패치를 적용하려면 다음과 같이 DictionarySchema.sql을 실행해야 한다.
Standalone의 경우
% gsql sys gliese --as sysdba --import $GOLDILOCKS_HOME/admin/standalone/DictionarySchema.sql
Cluster의 경우
% gsql sys gliese --as sysdba --import $GOLDILOCKS_HOME/admin/cluster/DictionarySchema.sql
수정 전 대처
SQL 표준인 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 Local open 단계에서 local 노드에 대한 질의 수행이 실패하는 경우가 있다.
개요
Cluster 환경에서 local open 상태인 노드에 접속하여 테이블을 조회할 때 에러가 발생한다.
현상 및 증상
접속한 노드가 local open 상태일 경우 remote 노드에는 접근할 수 없지만 local 노드에는 접근할 수 있다. 하지만 local open 상태의 노드에서 local 노드로 접속할 수 없다고 판단하여 질의가 실패하는 경우가 있다.
다음은 local open 상태인 G1N1에서 질의를 수행했을 때 에러가 발생하는 예이다.
gSQL> SELECT * FROM v$datafile; ERR-HY000(16354): connection of member 'G1N1' is broken
현재 노드에서 특정 노드로 접근할 수 있는지 여부는 connection 정보를 기준으로 판단한다. 그런데 local open 단계와 같이 connection 정보를 참조할 수 없는 경우에는 현재 노드에도 접근할 수 없다고 판단하는 경우가 있다.
Connection 정보를 참조할 수 없는 경우에도 현재 노드로의 접근은 가능하다고 판단할 수 있게 수정하였다.
수정 전 대처
없음
ISSUE-4696 Cluster table의 update master 정보를 조회하기 위한 view column을 추가하였다.
개요
Cluster table의 update master는 table에 DML이 발생할 경우 가장 먼저 DML이 수행되는 member node 이다.
각 cluster table의 update master를 결정하는데 영향을 주는 요소는 다음과 같다.
Cluster table 배치
Cluster group 내 member들의 position
Online/ offline 여부
Rebalance 수행 여부
운영 중에 변경될 수 있는 update master 정보를 쉽게 조회할 수 있도록 아래 dictionary view에 IS_UPDATE_MASTER column을 추가하였다.
현상 및 증상
다음과 같이 조회할 수 있다.
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은 G1, G2, G3 그룹에 배치되어 있는데 각 그룹에서 update master에 해당하는 멤버는 G1N1, G2N1, G3N1 이다.
수정 전 대처
없음
ISSUE-4609 Join combine이 포함된 subquery expression을 둘 이상 사용할 경우 segment fault가 발생한다.
개요
Join combine이 포함된 subquery expression이 둘 이상 사용된 구문에서 subquery expression의 정보를 참조할 때 segment fault가 발생한다.
다음과 같은 절에서 문제가 발생하였다.
TARGET 절
WHERE 절
HAVING 절
ORDER BY 절
현상 및 증상
Subquery expression이 포함된 clause에서 subquery expression를 참조하기 위한 정보를 구축할 때 관련된 expression을 찾지 못하여 expression 검색을 무한정 시도한다. 이로 인해 segment fault가 발생하였다.
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;수정 전 대처
없음
ISSUE-4589 SELECT FOR UPDATE, UPDATE, DELETE는 complex view merging을 지원하지 않고 있는데도 complex view merging으로 처리되는 것을 막지 못하였다.
개요
SELECT FOR UPDATE, UPDATE, DELETE 구문은 complex view merging을 지원하지 않고 있는데도complex view merging으로 처리한다.
현상 및 증상
다음 질의는 complex view merging 하지 말아야 한다. 그러나 subquery unnesting 후에 complex view merging 처리하여 서버가 비정상적으로 종료되었다.
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
);수정 전 대처
없음
ISSUE-4566 숫자 타입을 NUMBER 타입으로 변환할 때 반올림 후 자리수가 늘어났는데 overflow 처리를 하지 못하는 경우가 있다.
개요
숫자 타입을 NUMBER 타입으로 변환할 때 반올림 후 자리수가 늘어났는데 overflow 처리를 하지 못하는 경우가 있다.
현상 및 증상
다음 질의는 원래 overflow 오류가 발생해야 하는 경우이다.
gSQL> SELECT CAST( 9999999999.9 AS NUMBER(10,0)) FROM dual;
CAST( 9999999999.9 AS NUMBER(10,0))
-----------------------------------
10000000000
1 row selected.수정 전 대처
문자 타입으로 변환한 후에 NUMBER 타입으로 변환한다.
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 SELECT INTO 구문에 cursor가 없는데도 TRACE_LONG_RUN_CURSOR로 trace log가 출력되는 경우가 있다.
개요
TRACE_LONG_RUN_CURSOR property는 지정된 시간 이상의 long run cursor들을 trace log에 기록한다. SELECT INTO 구문에는 cursor가 필요없는데도 long run cursor로 분류되어 trace log에 남겨지는 경우가 있어 이를 수정하였다.
현상 및 증상
다음 예와 같이 SELECT INTO 구문이 실패할 경우 TRACE_LONG_RUN_CURSOR로 판단되어 trace log가 남는다.
gSQL> CREATE TABLE r ( c1 INTEGER ); Table created. gSQL> INSERT INTO r VALUES ( 1 ); 1 row created. --# 1 초 이상 걸리는 long run cursor trace 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. --# Trace log에 TRACE_LONG_RUN_CURSOR로 기록되지 않음 gSQL> \exec V1 -- 1 1 row selected. gSQL> INSERT INTO r VALUES ( 1 ); 1 row created. --# 2 초후 수행 --# Trace log에 TRACE_LONG_RUN_CURSOR로 기록됨 gSQL> \exec ERR-42000(16289): into clause can have only one row
수정 전 대처
없음
ISSUE-4537 잘못된 DROP TABLESPACE 구문이 성공한 후에 ADD MEMBER를 수행하면 새로운 member가 비정상 종료된다.
개요
Cluster 환경에서 실패해야 할 DROP TABLESPACE 구문이 성공한 경우, ADD MEMBER를 수행하면 새로 추가할 cluster member가 비정상적으로 종료되어 ADD MEMBER가 실패한다.
DROP TABLESPACE 대상이 되는 tablespace가 사용자의 기본 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"해당 tablespace를 제거하려면 다음과 같이 사용자의 기본 tablespace를 먼저 변경한 후에 제거해야 한다.
gSQL> ALTER USER u1 TEMPORARY TABLESPACE mem_temp_tbs; User altered. gSQL> DROP TABLESPACE temp_tbs CASCADE; Tablespace dropped.
현상 및 증상
다음과 같이 사용자의 기본 tablespace는 제거할 수 없음에도 불구하고 DROP TABLESPACE가 성공하였다.
gSQL> CREATE USER u1 IDENTIFIED BY u1
TEMPORARY TABLESPACE temp_tbs;
User created.
gSQL> DROP TABLESPACE temp_tbs CASCADE;
Tablespace dropped.이후 다음과 같이 새로운 cluster member를 추가하면 새로운 member(g2n3)가 비정상적으로 종료되어 ADD MEMBER가 실패한다.
gSQL> ALTER CLUSTER GROUP g2 ADD CLUSTER MEMBER g2n3 HOST '127.0.0.1' PORT 12350;
수정 전 대처
ADD MEMBER를 수행하기 전에 다음과 같이 DROP TABLESPACE 무결성을 위반한 사용자를 찾아 사용자의 기본 tablespace를 변경해야 한다.
다음 질의 결과가 존재하는 경우, 해당 user의 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 );다음 질의 결과가 존재하는 경우, 해당 user의 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 );다음 질의 결과가 존재하는 경우, 해당 user의 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 Join condition이 OR 조건을 포함할 때 또다른 OR 조건을 이용하여 index scan을 수행하면 질의가 무한 대기한다.
개요
OR 조건을 포함하는 join condition에 의해 join combine 기법이 선택되고, 또 다른 join에 속한 relation에서 join combine에 포함된 column을 참조하면 무한 대기가 발생한다.
현상 및 증상
다음 예와 같이 join combine으로 구성된 join에 포함된 column을 참조하면 column 정보를 찾지 못하여 무한 대기가 발생한다.
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.
--# 무한 대기
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 ) );수정 전 대처
다음과 같이 JOIN COMBINE이 구성되지 않도록 NO_USE_JOIN_COMBINE hint를 부여한다.
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 Reserved word가 column name인 column을 참조하는 %TYPE을 정의하면 에러가 발생한다.
개요
Reserved word가 column name인 column을 참조하는 %TYPE을 정의하면 에러가 발생한다.
현상 및 증상
다음 예와 같이 table에 OFFSET이라는 column이 있음에도 불구하고 column 정보를 찾지 못하고 에러가 발생한다.
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 )수정 전 대처
없음
ISSUE-4472 DDL_DB 출력 시 schema privilege DDL이 출력되지 않는다.
개요
Schema가 두 개 이상 생성되어 있을 때, DDL_DB를 출력하면 일부만 출력되고 일부는 출력되지 않는 문제가 발생한다.
현상 및 증상
다음 예에서는 schema privilege DDL가 세 개 생겨야 하는데 실제로는 하나만 발생했다.
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;
...중략...
--#####################################################
--# Schema Privilege DDL
--#####################################################
SET SESSION AUTHORIZATION "SYS";
GRANT
CREATE TABLE ON SCHEMA "S1"
TO "U1"
;
COMMIT;
--#####################################################
--# Public Synonym DDL
--#####################################################
...생략...문제를 수정한 후에 schema privilege DDL이 세 개 모두 정상적으로 발생한 것을 확인할 수 있다.
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;
...중략...
--#####################################################
--# 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
--#####################################################
...생략...수정 전 대처
Schema 별로 GRANT 정보를 출력한다.
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 DDL_DB 명령어로 출력된 DISK TABLESPACE 구문으로 TABLESPACE를 생성할 때 syntax error가 발생한다.
개요
DDL_DB 명령어로 출력된 CREATE DISK TABLESPACE 구문으로 TABLESPACE를 생성할 때 syntax error가 발생한다.
현상 및 증상
Tablespace를 생성한다.
gSQL> CREATE DISK DATA TABLESPACE disk_test_01 DATAFILE 'DISK_TEST_01.dbf' SIZE 100M; COMMIT;
\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;
... 생략 ...2 단계에서 \ddl_db 명령어를 수행하여 출력된 tablespace DDL 구문을 입력한다.
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수정 전 대처
ddl_db로 출력된 CREATE TABLESPACE 구문에서 AUTOEXTEND OFF와 AT <domain_name> 위치를 수정하여 실행한다.
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 TRACE_LOG_ID = xxxxx1로 설정한 환경에서 수행한 질의의 구간별 수행 시간이 trace log에 출력되지 않는다.
개요
Property TRACE_LOG_ID = xxxxx1로 설정한 환경에서 수행한 질의의 구간별 수행 시간이 trace log에 출력되지 않는 문제가 있다. TRACE_LOG_ID에서 1의 자리는 구간별 수행시간 출력 여부를 판단하는 flag로써 이 값이 1이면 수행한 질의의 구간별 수행시간을 출력한다.
현상 및 증상
TRACE_LOG_ID = xxxxx1로 설정한 환경에서 수행한 질의의 구간별 수행 시간이 trace log에 출력되지 않는다.
[S][0.000000] SELECT * FROM dual ... 중략 ... < 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 % | | ======================================================
수정 전 대처
없음
ISSUE-4317 SQL_ATTR_CONNECTION_TIMEOUT 속성을 지원한다.
개요
네트워크가 불안정할 경우, 클라이언트가 서버에 질의한 후에 응답을 받지 못하고 계속 blocking 상태에 머물 수 있다. 이런 문제를 해결하기 위해 SQLSetConnectAttr()의 SQL_ATTR_CONNECTION_TIMEOUT 속성을 지원한다.
SQL_ATTR_CONNECTION_TIMEOUT 값을 설정하면 클라이언트는 서버에 질의한 후에 해당 시간만큼 응답을 기다린다. 만일 주어진 시간 동안 응답이 없을 경우 클라이언트는 서버와의 연결을 끊고, HYT01 Connection timeout expired 에러를 반환한다.
현상 및 증상
네트워크가 불안정할 경우 클라이언트는 서버에 응답을 요청한 후 일정 시간 동안 대기한다.
수정 전 대처
다음과 같이 kernel 속성값을 변경하면 클라이언트와 서버의 연결에 이상이 있는지 여부를 빨리 감지할 수 있다.
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 .Net Framework에서 테이블의 column 이름이 정상적으로 표시되지 않는다.
개요
SQLColAttribute()와 SQLGetDescField()에서 column 이름을 조회할 때 사용되는 속성은 SQL_DESC_LABEL, SQL_DESC_NAME 또는 SQL_DESC_BASE_COLUMN_NAME 이다. SQL_DESC_LABEL은 column의 label이 있는 경우 label을 반환한다. SQL_DESC_NAME은 column의 alias가 있을 경우 alias를 반환한다. SQL_DESC_BASE_COLUMN_NAME은 column name을 반환한다.
Data provider for ODBC인 .Net Framework는 column 이름을 조회할 때 SQL_DESC_NAME을 사용하는데 column 이름에 label을 부여할 경우 의도치 않은 column 이름이 조회된다. 따라서 .Net Framework를 위한 연결 속성 DOT_NET_FOR_ODBC를 추가하여 이를 개선하였다.
현상 및 증상
gsql에서 다음과 같은 query를 실행하면 column 이름은 다음과 같이 조회된다.
gSQL> SELECT I1, I1 + I1, I1 AS C1 FROM TEST; I1 I1 + I1 C1 -- ------- -- 1 2 1
Data provider for ODBC인 .Net Framework에서 위의 query를 실행하면 다음과 같이 조회된다.
SELECT I1, I1 + I1, I1 AS C1 FROM TEST; I1 NULL C1 -- ---- -- 1 2 1
수정 전 대처
없음
ISSUE-4254 Cluster에서 DISTINCT가 포함된 subquery를 수행하면 remote server에서 구문 에러가 발생한다.
개요
Cluster system에 DISTINCT가 포함된 subquery가 기술되어 있고, 참조되지 않은 subquery의 target이 존재할 경우 해당 질의로 cluster query를 구성하여 수행하면 remote server에서 구문 에러가 발생한다. 생성된 cluster query의 target expression 개수와 view column name 개수가 불일치하여 발생하는 문제이다.
현상 및 증상
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:수정 전 대처
DISTINCT 구문을 GROUP BY 구문으로 변환한다.
DISTINCT를 기술한 query 내에 GROUP BY가 기술되지 않은 경우, DISTINCT 대상들을 모두 GROUP BY로 정의하고 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 EXEC SQL AUTOCOMMIT 구문에서 AT 절을 사용하면 에러가 발생한다.
개요
EXEC SQL AT :db_name AUTOCOMMIT 구문에서 AT 절을 인식하지 못하여 INVALID HANDLE 에러가 발생한다.
현상 및 증상
다음 구문에서 에러가 발생한다.
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
수정 전 대처
없음
ISSUE-4215 EXECUTE IMMEDIATE의 using 절 변수가 IN OUT type이면 에러가 발생한다.
개요
EXECUTE IMMEDIATE의 using 절 변수의 bind type이 IN OUT type이면 에러가 발생한다.
현상 및 증상
다음과 같이 에러가 발생한다.
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:
수정 전 대처
없음
ISSUE-4189 Parameter가 ref cursor, DB type 순으로 되어 있는 procedure를 생성했을 때 이를 실행하면 에러가 발생한다.
개요
Parameter가 ref cursor, DB type 순으로 되어 있는 procedure를 생성했을 때 이를 실행하면 에러가 발생한다.
현상 및 증상
다음과 같이 사용자가 procedure를 호출하면 에러가 발생한다.
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수정 전 대처
Procedure를 선언할 때 parameter를 정의하는 순서를 변경한다.
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()을 두 번 출력한다.
개요
DBMS_OUTPUT.PUT_LINE()가 actual parameter인 DBMS_OUTPUT.PUT_LINE()을 포함하는 function을 호출하면 function 내용이 두 번 출력된다.
현상 및 증상
DBMS_OUTPUT.PUT_LINE을 수행할 때 actual parameter인 function이 두 번 수행되어 function 안에 있는 DBMS_OUTPUT.PUT_LINE()도 두 번 수행된다.
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.수정 전 대처
없음
ISSUE-4135 Cluster 환경에서 socket 에러가 발생하면 시스템에 hang이 걸린다.
개요
Cluster 환경에서 sender thread에 socket 에러가 발생했을 때 원격 멤버로 메시지를 전송하지 못하여 전체 시스템이 멈추는 현상이 발생하였다. 이 문제를 해결하기 위해 송수신 thread에서 socket 에러가 발생하면 원격 멤버를 failover 하도록 수정하였다.
현상 및 증상
Cluster에서 네트워크 장애가 발생하면 heartbeat를 체크하여 failover가 발생한다. 이 때 원격 멤버와 메시지를 주고받는 thread들 중에 heartbeat가 아닌 특정 socket에서만 에러가 발생하면 응답을 받지 못하여 시스템 전체가 멈추는 현상이 발생한다.
수정 전 대처
없음
ISSUE-4174 Global sequence의 local cache가 고갈되었을 때의 성능을 개선하였다.
개요
Global sequence의 local cache가 고갈될 경우 성능이 급격하게 저하되는 문제가 있어 이를 수정하였다.
현상 및 증상
Sequence를 사용하는 모든 서버들은 local cache가 고갈될 경우 global cache로부터 local cache를 확보하기 위한 작업을 진행한다. 이 과정에서 원격 cserver를 경쟁적으로 확보하려 하기 때문에 성능이 급격하게 저하될 수 있다.
수정 전 대처
없음
ISSUE-4182 Cyfile을 restart 할 때 recovery가 정상적으로 동작하지 않을 수 있다.
개요
여러 transaction이 동시에 수행되고 있는 도중에 cyfile을 stop 한 후 restart 하면 recovery가 정상적으로 동작하지 않는 문제가 있어 이를 수정하였다.
현상 및 증상
여러 session에서 transaction을 수행하는 도중에 cyfile을 stop 한 후 restart 하면 이미 저장된 transaction이 다시 한 번 데이터 파일에 저장되어 문제가 발생한다.
수정 전 대처
없음
20c.1.23 Patch Notes
ISSUE-4088 ODBC나 JDBC에서 out parameter가 있는 function에 사용자가 명시적으로 bind parameter를 OUT binding 하면 에러가 발생한다.
개요
ODBC나 JDBC에서 out parameter가 있는 function에 사용자가 명시적으로 bind parameter를 OUT binding 하면 에러가 발생한다.
현상 및 증상
Function parameter가 out type이고 ODBC 프로그램에서 사용자가 parameter type에 맞춰 bind parameter에 명시적으로 OUT binding 하였음에도 execute 할 때 에러가 발생한다.
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 );수정 전 대처
없음
ISSUE-4078 Package의 field에 default value가 있는 type을 정의하고, 이를 다른 PSM 객체에서 참조하면 에러가 발생한다.
개요
Package에 default value가 있는 field를 가진 TYPE을 정의하고, 이를 다른 PSM 객체에서 참조하면 에러가 발생한다.
현상 및 증상
다음 예와 같이 package에 default value를 가지는 field가 있는 type을 정의한다. 그리고 나서 procedure에서 이를 참조하면 syntax error가 발생한다.
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수정 전 대처
없음
ISSUE-4081 TRACE_LONG_RUN_TIMER 프로퍼티 추가
개요
다음 두 프로퍼티를 사용할 때 실행시간의 정밀도를 제어할 수 있는 TRACE_LONG_RUN_TIMER 프로퍼티가 추가되었다.
TRACE_LONG_RUN_CURSOR
TRACE_LONG_RUN_SQL
현상 및 증상
없음
수정 전 대처
없음
ISSUE-4045 BROADCAST_INDEX_REBUILD_PROTOCOL 프로퍼티 추가
개요
클러스터 환경에서 인덱스를 재구축할 때 모든 멤버에 동시에 재구축할지 여부를 설정하는 BROADCAST_INDEX_REBUILD_PROTOCOL 프로퍼티가 추가되었다.
현상 및 증상
없음
수정 전 대처
없음
20c.1.22 Patch Notes
ISSUE-4062 Formal parameter가 %TYPE이고 default value를 가질 때 actual parameter가 없으면 에러가 발생한다.
개요
Formal parameter의 datatype이 %TYPE이고 default value가 있는 PSM 객체를 실행할 때 actual parameter를 명시하지 않으면 에러가 발생한다.
현상 및 증상
다음과 같이 actual parameter를 생략하면 wrong number of parameters 에러가 발생한다.
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;수정 전 대처
없음
20c.1.21 Patch Notes
ISSUE-4049 Cluster 환경에서 CYCLONE slave group 전체 장애시 데이터에 문제가 생긴다.
개요
Cluster 환경에 두 개 이상의 group이 있을 때 데이터에 문제가 생긴다. 특정 group의 member 전체가 종료되어 부분적인 서비스가 가능한 상태에서 sharding table이 종료된 group에 있는 데이터를 조작해야 할 경우, 해당 query는 실패하고 CYCLONE은 정상적으로 운영된다.
현상 및 증상
Slave 측에서 ERR-42000(16357) : must be accessible to at least one member of group 'GX' 에러가 발생할 경우, CYCLONE이 종료되지 않고 정상적으로 운영되면서 데이터에 문제가 생길 수 있다.
수정 전 대처
없음
20c.1.20 Patch Notes
ISSUE-4039 Cursor For Loop에서 PSM 변수를 할용한 연산 결과를 반올림하여 반환한다.
개요
Cursor For Loop의 SELECT문에서 PSM 변수를 활용하여 연산한 결과를 반올림하여 반환한다.
현상 및 증상
다음과 같이 Cursor For Loop의 SELECT문에서 PSM 변수를 활용하여 연산한 결과를 반올림하여 반환한다.
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.수정 전 대처
PSM 변수에 CAST 함수를 사용하여 DATA TYPE을 명시한다.
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 Cursor For Loop 구문 수행 중에 commit 구문을 수행하면 에러가 발생한다.
개요
Cursor For Loop 구문 수행 중에 commit 구문을 수행하면 cursor not open 에러가 발생한다.
현상 및 증상
Commit을 수행할 때 open되어 있는 cursor를 close 하고 commit을 수행한다. 이후 cursor for loop 구문종료할 때 사용했던 cursor를 close하면 앞서 commit을 수행하면서 cursor가 이미 close 된 상태이기 때문에 cursor is not open 에러가 발생한다.
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;
/수정 전 대처
Cursor for loop 구문 수행이 모두 완료된 후에 commit을 명시한다.
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 PSM 내에서 ALTER SEQUENCE 수행 후 sequence를 사용하면 SELECT 구문이 무한 대기한다.
개요
Cluster 환경에서 PSM 내에서 ALTER SEQUENCE 구문을 수행한 후에 sequence를 사용하면 해당 sequence를 사용하는 SELECT 구문이 무한 대기한다.
현상 및 증상
다음과 같이 cluster 환경에서 PSM의 EXECUTE IMMEDIATE 구문을 이용하여 ALTER SEQUENCE 구문을 수행한 후에 sequence를 사용하면 해당 sequence를 사용하는 SELECT 구문이 무한 대기한다.
DECLARE
curr_val INTEGER;
BEGIN
EXECUTE IMMEDIATE 'ALTER SEQUENCE seq CACHE 100';
EXECUTE IMMEDIATE 'SELECT seq.nextval FROM DUAL' INTO curr_val;
END;
/수정 전 대처
다음과 같이 ALTER SEQUENCE 구문을 수행한 후에 COMMIT를 명시한다.
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 Cluster에서 원격 멤버 장애 시 savepoint hang이 발생한다.
개요
Cluster의 특정 상황에서 savepoint 구문에 hang이 걸리는 경우가 있다.
현상 및 증상
트랜잭션이 접근했던 특정 멤버가 비정상적으로 종료되고 이후 savepoint 구문이 수행될 경우에 hang이 발생할 수 있다.
수정 전 대처
없음
20c.1.18 Patch Notes
ISSUE-4021 Embedded SQL에서 fetch cursor 중에 프로그램이 비정상 종료된다.
개요
Embedded SQL에서 STANDING CURSOR를 재사용할 때 FETCH CURSOR에서 배열 크기가 커지면 클라이언트 프로그램이 비정상 종료된다.
현상 및 증상
다음 예제 코드와 같이 cursor를 재사용할 때 cursor fetch 과정에서 배열의 크기가 커지면 프로그램이 비정상 종료된다.
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;
}수정 전 대처
Standing cursor를 재사용할 경우 FETCH CURSOR에 사용되는 호스트 변수의 크기를 동일하게 한다.
ISSUE-4017 XA transaction의 idle timeout 기능이 추가되었다.
개요
XA_TRANSACTION_IDLE_TIMEOUT 속성이 추가되었다. XA에서 transaction을 처리한 후에 idle 상태로 있을 수 있는 최대 시간을 의미하며, 기본값은 60 초이다.
현상 및 증상
XA transaction이 commit 또는 rollback 되지 못한 상태에서 session이 종료된 경우, 해당 transaction의 자원들을 반환할 수 없어 무한 대기하는 문제가 발생할 수 있다.
수정 전 대처
없음
20c.1.17 Patch Notes
ISSUE-3994 Embedded SQL에서 sqlca.sqlerrd[2] 값을 선택할 수 있도록 하였다.
개요
Embedded SQL에서 sqlca.sqlerrd[2] 값으로는 직전에 실행한 row 개수가 저장된다. 하지만 FETCH CURSOR 구문에서는 row의 누적 합계 또는 직전에 가져온 row의 수 중에 선택하여 사용할 수 있도록 변경하였다. 자세한 내용은 precompiler gpec의 옵션 --cumulative를 참조한다.
현상 및 증상
없음
수정 전 대처
없음
ISSUE-3981 ODBC와 JDBC에 include_synonyms 속성이 추가되었다.
개요
ODBC의 SQLColumns()와 JDBC의 DatabaseMetaData.getColumns()에서 synonym 객체를 포함할지 여부를 설정할 수 있는 include_synonyms 속성을 추가하였다.
현상 및 증상
ODBC의 SQLColumns()와 JDBC의 DatabaseMetaData.getColumns()에 synonym 객체 정보가 포함되지 않았다.
수정 전 대처
없음
ISSUE-3900 gpec에서 cursor 이름의 고유성을 제거하였다.
개요
gpec을 사용할 때 하나의 gc 파일 내에 있는 cursor 이름은 고유해야 한다는 제약이 있다. 동일한 이름을 갖는 cursor를 다중으로 선언한 gc 파일에 대해 gpec은 "이미 Cursor 이름이 선언되었다"라는 메시지와 함께 이를 에러로 처리한다. 이는 불필요한 코드를 양산하고 생산성을 떨어뜨리므로 cursor 이름의 고유성을 제거하였다.
현상 및 증상
다음과 같이 조건문을 사용하여 선택적으로 cursor를 선언하고 싶은 경우 gpec이 이를 에러로 처리하고 있다.
if( isTrue == 1 )
{
EXEC SQL DECLARE CURSOR CUR1 FOR
SELECT I1 FROM T1;
}
else
{
EXEC SQL DECLARE CURSOR CUR1 FOR
SELECT C1 FROM T2;
}예제와 같은 조건문을 사용하여 cursor를 선택하려고 할 경우 cursor 이름을 다르게 선언한 후 하위 코드에도 조건문을 추가하여 작성해야 했다.
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;
}수정 전 대처
없음
ISSUE-3679 ODBC API trace 기능을 추가하였다.
개요
ODBC API를 trace 할 수 있는 기능이 추가됨에 따라 연결 속성에도 TRACE와 TRACEFILE을 추가하였다.
현상 및 증상
없음
수정 전 대처
없음
20c.1.16 Patch Notes
ISSUE-3958 ODBC의 SQLTables()와 JDBC의 DatabaseMetaData.getTables()에서 SYNONYM 정보를 확인할 수 없다.
개요
ODBC의 SQLTables()와 JDBC의 DatabaseMetaData.getTables()에서 TABLE, VIEW, SYNONYM 정보를 확인할 수 있어야 하지만 현재는 SYNONYM 정보를 확인할 수 없다. 각 함수를 통해 SYNONYM 정보를 확인해야 한다.
현상 및 증상
ODBC의 SQLTables()나 JDBC의 DatabaseMetaData.getTables()를 호출할 때 TABLE, VIEW 정보는 확인할 수 있지만 SYNONYM 정보는 확인할 수 없다.
수정 전 대처
다음 SQL 문을 사용하여 SYNONYM 정보를 확인한다.
gSQL> SELECT * FROM DICTIONARY_SCHEMA.ALL_SYNONYMS;
ISSUE-3954 Embedded SQL에서 SELECT INTO ARRAY 절을 사용하면 결과값이 올바르지 못하다.
개요
SELECT INTO ARRAY 절을 사용할 때 FETCHED ROW 개수에 따라 결과값이 다르게 나온다.
현상 및 증상
다음은 배열 크기 3으로 SELECT INTO ARRAY 절을 사용하는 코드이다.
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 );
}전체 ROW 개수가 한 개일 때 sqlca.sqlcode의 값은 0 이었어야 하지만 sqlca.sqlcode 값은 -23034 이고 "SELECT INTO returns too many rows" 에러가 발생한다.
수정 전 대처
없음
ISSUE-3950 JDBC/ ODBC를 사용하여 사용자에게 지원하지 않는 PSM 질의를 수행하면 서버가 비정상적으로 종료된다.
개요
Plan cache에는 등록되어 있지만 JDBC/ ODBC를 통해 사용자에게 지원되지 않는 PSM 질의를 수행하면 오류가 발생하는데 이 같은 질의가 수행되지 않도록 수정하였다.
현상 및 증상
다음과 같이 plan cache에 등록되어 있는 쿼리를 그대로 가지고 와서 ODBC를 통해 수행하면 서버가 비정상적으로 종료된다.
sRet = SQLExecDirect( sStmt,
(SQLCHAR*)"PROCEDURE \"PUBLIC\".\"PROC1\" AS BEGIN NULL; END;",
SQL_NTS )
== STL_SUCCESS );다음과 같이 plan cache에 등록되어 있는 쿼리를 그대로 가지고 와서 JDBC를 통해 수행하면 서버가 비정상적으로 종료된다.
Statement sStmt = aCon.createStatement();
sStmt.execute("PROCEDURE \"PUBLIC\".\"PROC1\" AS BEGIN NULL; END;);수정 전 대처
다음과 같이 ODBC를 통해 올바른 질의를 수행한다.
sRet = SQLExecDirect( sStmt,
(SQLCHAR*)"CALL PROC1;",
SQL_NTS )
== STL_SUCCESS );다음과 같이 JDBC를 통해 올바른 질의를 수행한다.
Statement sStmt = aCon.createStatement();
sStmt.execute("CALL PROC1");ISSUE-3959 Global sequence 동기화 과정 중에 지워진 statement handle에 접근하는 경우가 있다.
개요
Global sequence를 동기화하기 전에 사전 작업으로써 이전에 사용한 executor들의 프로토콜 응답을 기다리는 단계에서 지워진 statement handle에 접근하는 경우가 있었다.
현상 및 증상
지워진 statement handle에 접근하려다가 서버가 비정상적으로 종료된다.
수정 전 대처
없음
20c.1.15 Patch Notes
ISSUE-3923 SELECT 문에서 group by 절에 stored function을 사용하면 서버가 비정상적으로 종료된다.
개요
SELECT 문에서 group by 절에 stored function을 사용할 경우 오류가 발생하여 이를 수정하였다.
현상 및 증상
다음과 같이 SELECT 문에서 group by 절에 stored function을 사용하면 서버가 비정상적으로 종료된다.
gSQL>
SELECT func1( r_c1, r_c2 )
, SUM( r_c1 )
FROM r
GROUP BY func1( r_c1, r_c2 );수정 전 대처
없음
20c.1.14 Patch Notes
ISSUE-3909 국가 전략물자에 해당하는 기능은 지원하지 않는다.
개요
국가 전략물자 정책에 따른 제약으로 다음 함수들을 지원하지 않는다.
ENCRYPT_STR()
DECRYPT_STR()
현상 및 증상
없음
수정 전 대처
없음
ISSUE-3917 XA 환경에서 procedure 실행 시 에러가 발생한다.
개요
XA 환경에서 procedure나 anonymous block을 수행할 수 없는 문제가 있어서 이를 수정하였다.
현상 및 증상
XA 환경에서 procedure를 실행하면 다음과 같은 에러가 발생한다.
gSQL> CALL proc1(); ERR-42000(18009): The command cannot be executed when global transaction is in the ACTIVE state
수정 전 대처
없음
ISSUE-3913 DBMS_OUTPUT.SET_LOG() procedure에 permission을 지정할 수 있는 option을 추가하였다.
개요
DBMS_OUTPUT.SET_LOG() procedure에서 permission을 지정할 수 있도록 하였다.
gSQL> CALL DBMS_OUTPUT.SET_LOG('a.txt', 640);
Procedure Call complete.현상 및 증상
없음
수정 전 대처
없음
20c.1.13 Patch Notes
ISSUE-3884 JDBC를 사용할 때 한 프로세스에서 connect를 반복할 경우 fd가 계속 늘어난다.
개요
JDBC를 사용할 때 한 프로세스에서 connect를 반복할 경우 pipe, eventpoll fd가 계속 늘어나서 "can not open files" 에러가 발생한다.
현상 및 증상
다음과 같이 connect를 반복해서 수행할 경우 fd가 늘어난 것을 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
...수정 전 대처
없음
ISSUE-3869 ODBC에서 array fetch 할 때 row status의 결과가 잘못되었다.
개요
ODBC에서 array fetch 할 때 SQLFetch 함수를 호출한 후에 row의 status 값을 확인할 수 있다. 만일 SQLFetch의 반환값이 SQL_SUCCESS가 아닐 경우에는 row status나 diagnostic을 확인해야 한다. 하지만 SQLFetch의 반환값이 SQL_SUCCESS_WITH_INFO인 상황에서 diagnostic 메시지는 조회할 수 있지만 row의 status는 모두 SQL_ROW_SUCCESS라고 잘못 나온다.
현상 및 증상
다음은 숫자로 변환하지 못하는 문자열 데이터이다.
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;
다음은 위 데이터를 숫자 타입으로 변환해서 array fetch하는 예제의 일부이다.
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;
}숫자로 변환하지 못하는 데이터가 포함되어 있지만 row status가 모두 SQL_ROW_SUCCESS라고 나온다.
row status: 0 row status: 0 row status: 0 row status: 0
수정 전 대처
없음
20c.1.12 Patch Notes
ISSUE-3859 Embedded SQL, SELECT INTO 절에서 array 사용시 array 크기가 record 수보다 작은 경우에는 에러로 처리해야 한다.
개요
Embedded SQL에서 SELECT INTO 구문에 array를 사용할 때 array 크기가 fetch 되는 레코드 수 보다 작은 경우 현재로서는 어떠한 처리도 하지 않고 있다. 이 경우 array 크기가 레코드 수보다 작으면 응용 프로그램은 추가 레코드가 있는지 여부를 알 수 없다. 따라서 array 크기가 fetch 되는 레코드 수 보다 작을 경우 에러로 처리해야 한다.
현상 및 증상
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 );
위의 예와 같이 array 크기가 fetch 되는 레코드 수 보다 작은 경우, sqlca.sqlcode가 0으로 정상 처리되고 있다.
수정 전 대처
없음
ISSUE-3846 Cluster 환경에서 멤버간 프로퍼티 값이 다를 경우 재기동할 때 core가 발생한다.
개요
클러스터 환경의 모든 멤버들에서 값이 동일해야 하는 프로퍼티들이 있다. 재기동할 때 이 프로퍼티 값이 다른 멤버가 있을 경우 cserver가 죽는 문제가 발생한다.
현상 및 증상
클러스터 환경에서 멤버를 재기동할 때 모든 멤버들에서 동일한 값을 가져야 하는 프로퍼티들의 값을 비교하는데 이 때 다른 값을 가지는 멤버가 있을 때 cserver가 죽는 문제가 발생한다.
클러스터 환경에서 동일한 값을 가져야 하는 프로퍼티는 다음과 같다.
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.
수정 전 대처
멤버들의 프로퍼티 값을 동일하게 수정한 후 재기동한다.
ISSUE-3842 gpec이 특정 DML 구문에서 EXEC SQL WHENEVER NOT FOUND 구문을 생략한다.
개요
gpec이 embedded SQL 코드를 C 코드로 변환할 때 WHENEVER EXCEPTION 처리가 모든 DML 구문에 적용되어야 한다. 하지만 SELECT INTO 절과 FETCH 절에만 적용되고 있었다.
현상 및 증상
코드 변환 전 gc 파일
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 파일
DBESQL_Execute(NULL, &sqlargs); if(sqlca.sqlcode < 0) callErrorLog(param->param, 0, sqlca.sqlcode, sqlca.sqlerrd[2]);
NOT FOUND에 대한 action 코드가 생략된 채 코드가 생성되었다.
수정 전 대처
다음과 같이 gc 파일에 NOT FOUND에 대한 처리를 직접 작성한다.
EXEC SQL DELETE FROM TEST
WHERE ENUMBER = :in.enumber
AND ENAME = :in.ename;
if(sqlca.sqlcode == 0) callLog( ... );ISSUE-3830 Embedded SQL에서 XA connection을 default context로 사용할 수 없다.
개요
Embedded SQL에서는 XA를 사용하기 위해 default context를 사용하거나 named context를 생성할 수 있다.
Default context로 XA를 사용할 때 default context에 어떠한 connection도 생성되지 않은 상태에서 connection name 없이 xa open 하면 XA connection이 default context에 연결되어야 한다. 그렇지만 실제로는 default context에 연결되지 않는다.
현상 및 증상
다음과 같이 default context에 어떠한 connection도 없는 상태에서 connection name이 없는 XA connection을 생성하면 default context에 연결되어야 한다. 또한 default context로 SQL 구문을 실행할 수 있어야 한다.
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;
... /* 생략 */
}위 코드로 생성한 프로그램을 실행하면 invalid handle 에러가 발생한다.
[ERROR] SQL ERROR - SQLCODE : -2 SQLSTATE : HY000 ERROR MSG : Invalid handle
수정 전 대처
Named context를 생성하여 사용한다.
20c.1.11 Patch Notes
ISSUE-3371 클러스터 환경에서 Xa 트랜잭션을 지원한다.
개요
클러스터 환경에서 Xa 트랜잭션 기능을 지원한다.
현상 및 증상
없음
수정 전 대처
없음
ISSUE-3821 Shared segment 할당 시 large page 사용에 실패할 경우 normal page를 사용할 수 있는 기능이 필요하다.
개요
기존 USE_LARGE_PAGES 프로퍼티는 0과 1을 지원한다. 0으로 설정하면 large page를 사용하지 않고 1로 설정하면 large page를 사용한다. 1로 설정된 상태에서 공유 메모리 할당에 실패하면 에러로 처리된다.
이에 large page에서 공유 메모리 할당을 시도하다가 실패할 경우에 normal page를 사용할 수 있는 기능을 추가하였다.
현상 및 증상
USE_LARGE_PAGE를 2로 설정할 경우 우선적으로 large page에서 공유 메모리 할당을 시도하는데 만약 실패할 경우에는 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.
수정 전 대처
없음
ISSUE-3798 Cluster에서 synonym을 이용한 protocol 방식의 DML을 수행할 때 시스템이 비정상 종료되거나 질의 처리가 무한 반복될 수 있다.
개요
Cluster 환경에서 synonym을 대상 객체와 다른 스키마에 정의한 상황에서 synonym을 이용하여 DML을 처리하면 시스템이 비정상적으로 종료되거나 질의 처리가 무한 반복되는 경우가 있다.
현상 및 증상
다음과 같이 table과 synonym을 정의한 후에 synonym을 통해 insert를 수행하면 질의 처리가 무한 반복된다.
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 );
수정 전 대처
DML을 수행할 때 synonym을 사용하지 않는다.
INSERT INTO u1.t_cloned VALUES( 2 );
또는 insert를 제외한 delete, update, select for update의 경우 다음과 같은 제약에 맞춰 query 기반의 DML을 수행한다.
Subquery expression, non-deterministic expression을 포함하지 않는다.
OFFSET/ LIMIT 구문을 사용하지 않는다.
ROWNUM을 사용하지 않는다.
Sharding key에 대한 UPDATE를 제한한다.
20c.1.10 Patch Notes
ISSUE-3768 prepare/ execution 시 IN 함수를 수행하면 시스템이 간헐적으로 비정상 종료된다.
개요
IN 함수의 value part 값들의 개수가 10 개 이상인 질의를 prepare/ execution 하면서 prepare 한 후 두 번 이상 execute 하면 시스템이 비정상적으로 종료되는 경우가 있다.
현상 및 증상
다음과 같이 테이블을 구축한 후에 질의를 prepare 한 후 두 번 이상 execute 하면 시스템이 비정상적으로 종료될 수 있다.
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.exec을 반복적으로 수행하면 시스템이 비정상적으로 종료된다.
문제가 발생하는 exec 위치는 일정하지 않다.
gSQL> \exec C1 C2 -- -- 2 B 1 row selected.
수정 전 대처
IN 함수의 value part 값들을 10개 미만으로 구성하여 IN_HASH가 적용되지 않도록 한다.
\prepare sql SELECT * FROM t1 WHERE c1 = :v1 AND c2 IN ( 'P','T','X','C','W','B','L','M','H','J','Z','G','D' );
위와 같이 IN 함수의 value part 값들이 10개 이상인 경우 IN 함수를 여러 개로 나누어 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 ROWNUM의 remote method 가능 여부를 검사할 때 subquery filter에 대한 검사가 누락된다.
개요
다음 query와 같은 상황에서 subquery filter가 제거되어 질의 결과에 오류가 발생할 수 있다.
SELECT r_sk
, r_nk
FROM r
WHERE r_sk = 202
AND r_nk = ( SELECT r_nk + 999 FROM dual )
AND ROWNUM < 5위의 query에서처럼 다음 세 가지 조건이 모두 존재할 때, subquery filter가 사라진다.
r_sk = 202
하나의 원격 서버를 결정할 수 있는 sharding key 조건
r_nk = ( SELECT r_nk + 999 FROM dual )
unnest 할 수 없는 subquery 조건
ROWNUM < 5
개수를 제한하는 ROWNUM 조건
현상 및 증상
다음과 같이 테이블을 구축한 후에는 질의 결과가 없어야 함에도 subquery filter가 제거되어 질의 결과가 생성된다.
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수정 전 대처
다음과 같이 ROWNUM 조건을 LIMIT 조건으로 변경한다.
\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 planISSUE-3751 prepare/ execution 시 cluster puller 이하 plan 들의 rows 정보가 누적되어 출력된다.
개요
Cluster puller plan을 포함하는 질의를 prepare/ execute 할 경우, execute 할 때마다 cluster puller와 하위 노드들에 대한 결과 row 개수가 누적되어 출력된다.
결과 row 개수를 집계하는 것과 관련된 문제이며, 질의 수행에는 영향을 주지 않는다.
현상 및 증상
다음과 같이 테이블을 구축한 후에 질의를 prepare 한 후 두 번 이상 execute 하면 잘못된 수행 결과를 출력한다.
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수정 전 대처
없음
20c.1.9 Patch Notes
ISSUE-3752 Global connection 사용 시 질의 대상이 전체가 아닌 일부 그룹일 경우 클라이언트가 비정상적으로 종료될 수 있다.
개요
Global connection을 사용할 때 모든 그룹의 shard 정보를 전달하는게 아니라 질의에 사용되는 그룹의 shard 정보만 전달한다. 이로 인해 그룹 정보 중 일부만 전달될 경우 잘못된 메모리를 참조하는 문제가 있다. 이 경우, 클라이언트가 비정상적으로 종료될 수 있다.
이 패치를 적용할 경우, 클라이언트를 다시 build 해야 한다.
현상 및 증상
다음과 같이 테이블을 구축한 후에 global connection 환경에서 질의를 수행할 경우, 클라이언트가 비정상적으로 종료된다.
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
수정 전 대처
Global connection을 사용하지 않는다.
20c.1.8 Patch Notes
ISSUE-3726 JDBC의 Statement.getUpdateCount()를 반복해서 호출할 경우 update count를 초기화해야 한다.
개요
JDBC의 Statement.getUpdateCount()는 아래 인용된 바와 같이 result당 한 번만 호출될 수 있다.
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.
Statement.getUpdateCount()를 반복해서 호출할 경우 -1을 반환한다.
현상 및 증상
Statement.getUpdateCount()를 반복해서 호출할 경우 계속 같은 값을 반환한다.
수정 전 대처
없음
20c.1.7 Patch Notes
ISSUE-3716 상위 query에 sequence가 있고 view 내부에 order by가 있는 상황에서 view merging을 하면 잘못된 결과가 도출된다.
개요
상위 query에 sequence가 있을 경우 view merging을 하지 않아야 함에도 불구하고 실제로는 view merging을 실행하여 잘못된 결과가 도출되었다.
현상 및 증상
다음과 같은 질의를 수행하면 잘못된 결과가 도출된다.
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.수정 전 대처
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 planISSUE-3707 Simple view merging 대상 view가 left outer join의 오른쪽에 위치하고, view의 select list에 constant가 하나만 올 경우 비정상 종료된다.
개요
다음의 조건을 만족할 경우 프로세스가 비정상적으로 종료될 수 있다.
View 안에 left outer join이 존재한다.
Left outer join의 오른쪽이 또 view 이고, 그 view의 select list에 constant가 하나만 존재한다.
현상 및 증상
다음과 같은 질의를 수행하면 프로세스가 비정상적으로 종료된다.
\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;수정 전 대처
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 데이터베이스 재시작 시 페이지 공간이 부족하여 복구에 실패한다.
개요
테이블 데이터 페이지와 인덱스 리프 페이지에서 레코드와 키의 트랜잭션 정보는 RTS 공간에 저장되는데 동시에 많은 트랜잭션들이 하나의 페이지를 갱신할 경우 RTS는 확장될 수 있다. 삭제된 레코드들의 공간을 재사용하기 위해 페이지 컴팩션을 수행하는데 이 때 가능한 경우 RTS를 축소한다.
서비스 도중 페이지를 컴팩션할 때 RTS가 축소되어 공간이 확보되었는데도 불구하고 복구할 때는 RTS가 축소될 수 있는 조건이 되지 않아서 공간을 늘리지 못하는 바람에 문제가 발생하였다.
현상 및 증상
데이터베이스를 재시작할 때 페이지 공간이 부족하여 복구에 실패한다.
수정 전 대처
없음
ISSUE-3705 Transitive predicate을 잘못 생성한다.
개요
Transitive predicate을 생성한 후에 LIKE, NOT LIKE predicate이 오면 잘못된 transitive predicate을 생성한다.
현상 및 증상
다음은 문제가 발생하는 SQL의 예이다.
\EXPLAIN PLAN SELECT r_c1, s_c1 FROM r, s WHERE r_c1 = 'A' 1 Transitive predicate을 생성할 수 있는 filter가 먼저 기술됨 AND s_c2 LIKE '99%' 2 LIKE 또는 NOT LIKE 함수가 존재 AND r_c1 = s_c1 3 Equi join condition이 존재 ; 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
수정 전 대처
다음과 같이 LIKE, NOT LIKE 함수가 존재하는 predicate을 먼저 기술한다.
\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 gpec에서 타입 한정자를 출력하지 않는다.
개요
gpec이 embedded SQL pseudo type 앞에 storage class 또는 type qualifier를 사용하는 gc 파일을 c 파일로 변환하면 storage class와 type qualifier가 누락된다.
현상 및 증상
다음은 gc 파일의 일부이다.
EXEC SQL BEGIN DECLARE SECTION; static VARCHAR gUid[10]; static char gPwd[10]; EXEC SQL END DECLARE SECTION;
다음은 gpec이 위에서 생성한 gc 파일을 c 파일로 변환한 일부이다.
/* 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"static Varchar gUid[10] 코드가 C 코드로 변환되면서 static 연산자가 제거되었다.
수정 전 대처
없음
ISSUE-3698 JDBC statement 클래스의 getUpdateCount가 비정상적인 값을 반환한다.
개요
QUERY를 사용한 INSERT INTO 구문을 실행하면 getUpdateCount()의 결과값이 0으로 나온다.
현상 및 증상
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();
getUpdateCount() 값으로 0이 반환된다.
수정 전 대처
없음
20c.1.6 Patch Notes
ISSUE-3690 윈도우 환경에서 JDBC URL에 파일 경로를 입력하였을 경우 해당 파일을 읽지 못한다.
개요
윈도우 환경에서 URL에 / 구분자를 사용하여 올바른 파일 경로를 입력했지만 JDBC에서 해당 파일을 읽지 못하는 문제가 있다.
현상 및 증상
해당 파일을 읽을 수 없다는 에러가 발생한다.
수정 전 대처
없음
ISSUE-3687 Transaction retransmission 시 sorting block의 크기를 초과한 transaction을 block에 저장한다.
개요
Coordinator failover가 발생했을 때 transaction retransmission을 위해 sorting block 구성하는 도중에 block의 크기를 초과하여 transaction들을 저장하고 이를 정렬함으로써 할당되지 않은 메모리 영역을 침범하는 문제가 발생하였다.
현상 및 증상
Coordinator 서버가 coordinator failover를 실행하는 도중에 SEGV로 비정상 종료된다.
수정 전 대처
없음
20c.1.5 Patch Notes
ISSUE-3678 JDBC 연결 프로퍼티 login_timeout을 추가하였다.
개요
기존에는 DriverManager/DataSource 클래스의 setLoginTimeout 메소드로 login timeout을 설정할 수 있었다. 하지만 WAS와 같이 특정 상황에서는 setLoginTimeout 메소드를 호출하지 못할 수 있다. 따라서 연결 프로퍼티 login_timeout을 추가하였다.
현상 및 증상
JDBC에서 잘못된 IP나 PORT로 서버에 연결할 때 에러가 발생하지 않고 무한대기한다.
수정 전 대처
없음
20c.1.4 Patch Notes
ISSUE-3669 Heartbeat에 의해 failover가 발생하는 경우 aging 정보가 reset 되지 않는다.
개요
Failover를 처리하는 동안 active 노드들에서 관리하는 죽은 노드의 aging 정보를 reset 해야 함에도 이를 처리하지 않고 있었음.
현상 및 증상
Active 노드가 죽은 노드의 aging 정보를 reset 하지 않을 경우, UNDO 테이블스페이스가 부족해질 수 있다.
수정 전 대처
없음
20c.1.3 Patch Notes
ISSUE-3655 Rebalance protocol을 여러 멤버에서 동시에 수행한다.
개요
테이블 리밸런스를 수행할 때 프로토콜을 원격 멤버들에 차례로 전송하고 응답을 받는 방식으로 수행하면 지연이 발생한다. 이에 프로토콜을 동시에 처리할 수 있는 경우에는 원격 멤버들에 broadcast 하고 동시에 처리할 수 있는 프로퍼티 (BROADCAST_REBALANCE_PROTOCOL)를 추가하여 지연시간을 단축할 수 있도록 개선하였다.
현상 및 증상
테이블 리밸런스를 수행할 때 lock을 잡거나 리밸런스를 시작하기 위한 프로토콜들을 원격 멤버들에 차례로 전송하고 응답을 받는 과정에서 타겟 멤버들의 수만큼 처리 시간이 지연된다.
수정 전 대처
없음
ISSUE-3649 Lockless protocol들을 전담할 수 있는 cluster server가 필요하다.
개요
Lock이 필요없는 SELECT와 같은 질의가 cluster server를 확보하지 못하여 대기한다.
현상 및 증상
Shared 연결 방식을 사용하는 cluster server는 lock 대기가 빈번하게 발생하는 경우 server를 확보한 상태에서 lock 대기 상태로 기다리는 경우가 많이 생길 수 있다. 이 경우, SELECT와 같이 lock이 필요없는 질의들도 cluster server를 확보하지 못하여 대기하는 현상이 발생한다.
수정 전 대처
없음
ISSUE-3663 DML 수행 중 cluster deadlock timeout이 발생하면 질의를 재수행한다.
개요
DML 수행 중에 발생한 cluster deadlock timeout은 transaction 간의 경합으로 인한 deadlock이 아니므로 질의 실패로 종료할 필요가 없다. 따라서 rollback 후에 질의를 다시 수행한다.
현상 및 증상
Lockable cluster server 부족 등과 같은 이유로 cluster deadlock이 발생할 수 있다. Cluster deadlock이 해결되길 기다리며 CLUSTER_DEADLOCK_TIMEOUT에 설정된 시간만큼 대기했지만 deadlock이 해결되지 않은 경우에는 CLUSTER_DEADLOCK_TIMEOUT 에러가 발생한다.
단, DML 질의는 CLUSTER DEADLOCK TIMEOUT이 발생하면 rollback 한 후에 질의를 다시 수행한다.
수정 전 대처
없음
20c.1.2 Patch Notes
ISSUE-3648 Failover 시 transaction retransmission의 결과 패킷이 잘못되었다.
개요
Failover 과정 중에 transaction retransmission을 수행하면 이미 commit이 완료된 트랜잭션들은 무시해야 함에도 불구하고 잘못된 응답 패킷을 구성하여 client로 전달한다.
현상 및 증상
결과 패킷에 접근할 때 서버가 비정상적으로 종료되며 삼중화 이상에서만 발생한다.
수정 전 대처
없음
20c.1.1 Patch Notes
ISSUE-3621 MERGE_DISTINCT hint를 추가하였다.
개요
MERGE_DISTINCT hint를 추가하였다.
Cluster 환경에서 distinct 절을 수행할 때 사용할 수 있는 hint로써 다음 조건을 만족할 때 사용할 수 있다.
Distinct 절이 존재한다.
Remote distinct로 수행할 수 있다.
Distinct 노드의 하위 노드에서 중간 결과가 distinct key column에 대한 order가 보장된 상태로 올라온다.
현상 및 증상
다음은 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위 execution plan을 보면 MULTIPLE CLUSTER(IDX:2)가 o_custkey에 대한 order를 유지시켜주고 있는 것을 확인할 수 있다. 이로 인해 ORDER BY를 위한 SORT 노드도 필요하지 않아 제거되었다.
수정 전 대처
없음
ISSUE-3619 Sampling ANALYZE 성능을 개선하였다.
개요
Cluster 환경에서 indexed column에 대한 sampling ANALYZE 성능을 개선하였다.
현상 및 증상
다음과 같이 indexed column에 대한 sampling ANALYZE는 전체 row의 건수에 비례하여 처리되었다.
ANALYZE TABLE large_shard_table ESTIMATE STATISTICS
SAMPLE 1000000 ROWS FOR COLUMNS indexed_column;위 query가 사용자가 정의한 SAMPLE n ROWS에 비례하여 처리되도록 성능을 개선하였다.
수정 전 대처
없음